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.
40 #include "pixeltransfer.h"
42 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
43 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
47 * Flip the 8 bits in each byte of the given array.
50 * \param n number of bytes.
52 * \todo try this trick to flip bytes someday:
54 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
55 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
56 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
60 flip_bytes( GLubyte
*p
, GLuint n
)
63 for (i
= 0; i
< n
; i
++) {
64 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
65 a
= ((b
& 0x01) << 7) |
80 * Unpack a 32x32 pixel polygon stipple from user memory using the
81 * current pixel unpack settings.
84 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
85 const struct gl_pixelstore_attrib
*unpacking
)
87 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
89 /* Convert pattern from GLubytes to GLuints and handle big/little
94 for (i
= 0; i
< 32; i
++) {
95 dest
[i
] = (p
[0] << 24)
107 * Pack polygon stipple into user memory given current pixel packing
111 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
112 const struct gl_pixelstore_attrib
*packing
)
114 /* Convert pattern from GLuints to GLubytes to handle big/little
115 * endian differences.
119 for (i
= 0; i
< 32; i
++) {
120 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
121 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
122 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
123 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
126 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
131 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
132 * order with row alignment = 1 byte.
135 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
136 const struct gl_pixelstore_attrib
*packing
)
138 GLint bytes
, row
, width_in_bytes
;
139 GLubyte
*buffer
, *dst
;
144 /* Alloc dest storage */
145 bytes
= ((width
+ 7) / 8 * height
);
146 buffer
= (GLubyte
*) malloc( bytes
);
150 width_in_bytes
= CEILING( width
, 8 );
152 for (row
= 0; row
< height
; row
++) {
153 const GLubyte
*src
= (const GLubyte
*)
154 _mesa_image_address2d(packing
, pixels
, width
, height
,
155 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
161 if ((packing
->SkipPixels
& 7) == 0) {
162 memcpy( dst
, src
, width_in_bytes
);
163 if (packing
->LsbFirst
) {
164 flip_bytes( dst
, width_in_bytes
);
168 /* handling SkipPixels is a bit tricky (no pun intended!) */
170 if (packing
->LsbFirst
) {
171 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
172 GLubyte dstMask
= 128;
173 const GLubyte
*s
= src
;
176 for (i
= 0; i
< width
; i
++) {
180 if (srcMask
== 128) {
185 srcMask
= srcMask
<< 1;
193 dstMask
= dstMask
>> 1;
198 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
199 GLubyte dstMask
= 128;
200 const GLubyte
*s
= src
;
203 for (i
= 0; i
< width
; i
++) {
212 srcMask
= srcMask
>> 1;
220 dstMask
= dstMask
>> 1;
225 dst
+= width_in_bytes
;
236 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
237 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
239 GLint row
, width_in_bytes
;
245 width_in_bytes
= CEILING( width
, 8 );
247 for (row
= 0; row
< height
; row
++) {
248 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
249 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
253 if ((packing
->SkipPixels
& 7) == 0) {
254 memcpy( dst
, src
, width_in_bytes
);
255 if (packing
->LsbFirst
) {
256 flip_bytes( dst
, width_in_bytes
);
260 /* handling SkipPixels is a bit tricky (no pun intended!) */
262 if (packing
->LsbFirst
) {
263 GLubyte srcMask
= 128;
264 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
265 const GLubyte
*s
= src
;
268 for (i
= 0; i
< width
; i
++) {
277 srcMask
= srcMask
>> 1;
279 if (dstMask
== 128) {
285 dstMask
= dstMask
<< 1;
290 GLubyte srcMask
= 128;
291 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
292 const GLubyte
*s
= src
;
295 for (i
= 0; i
< width
; i
++) {
304 srcMask
= srcMask
>> 1;
312 dstMask
= dstMask
>> 1;
317 src
+= width_in_bytes
;
323 * Get indexes of color components for a basic color format, such as
324 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
328 get_component_indexes(GLenum format
,
333 GLint
*luminanceIndex
,
334 GLint
*intensityIndex
)
340 *luminanceIndex
= -1;
341 *intensityIndex
= -1;
345 case GL_LUMINANCE_INTEGER_EXT
:
348 case GL_LUMINANCE_ALPHA
:
349 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
357 case GL_RED_INTEGER_EXT
:
361 case GL_GREEN_INTEGER_EXT
:
365 case GL_BLUE_INTEGER_EXT
:
369 case GL_ALPHA_INTEGER_EXT
:
378 case GL_RGB_INTEGER_EXT
:
384 case GL_BGR_INTEGER_EXT
:
390 case GL_RGBA_INTEGER_EXT
:
397 case GL_BGRA_INTEGER
:
415 assert(0 && "bad format in get_component_indexes()");
422 * For small integer types, return the min and max possible values.
423 * Used for clamping floats to unscaled integer types.
424 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
427 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
434 case GL_UNSIGNED_BYTE
:
442 case GL_UNSIGNED_SHORT
:
452 * integer packing , no transfer operations only packs
453 * to dst of GL_UNSIGNED_INT or GL_INT
456 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
457 GLenum dstFormat
, GLenum dstType
,
463 case GL_UNSIGNED_INT
: {
464 GLuint
*dst
= (GLuint
*) dstAddr
;
466 case GL_RED_INTEGER_EXT
:
467 case GL_GREEN_INTEGER_EXT
:
468 case GL_BLUE_INTEGER_EXT
:
469 case GL_ALPHA_INTEGER_EXT
:
471 case GL_RGB_INTEGER_EXT
:
472 case GL_RGBA_INTEGER_EXT
:
473 case GL_BGR_INTEGER_EXT
:
474 case GL_BGRA_INTEGER_EXT
:
475 case GL_LUMINANCE_INTEGER_EXT
:
476 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
478 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
479 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
480 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
481 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
488 GLint
*dst
= (GLint
*) dstAddr
;
490 case GL_RED_INTEGER_EXT
:
491 case GL_GREEN_INTEGER_EXT
:
492 case GL_BLUE_INTEGER_EXT
:
493 case GL_ALPHA_INTEGER_EXT
:
495 case GL_RGB_INTEGER_EXT
:
496 case GL_RGBA_INTEGER_EXT
:
497 case GL_BGR_INTEGER_EXT
:
498 case GL_BGRA_INTEGER_EXT
:
499 case GL_LUMINANCE_INTEGER_EXT
:
500 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
502 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
503 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
504 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
505 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
519 * Used to pack an array [][4] of RGBA float colors as specified
520 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
521 * Historically, the RGBA values were in [0,1] and rescaled to fit
522 * into GLubytes, etc. But with new integer formats, the RGBA values
523 * may have any value and we don't always rescale when converting to
526 * Note: the rgba values will be modified by this function when any pixel
527 * transfer ops are enabled.
530 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
531 GLenum dstFormat
, GLenum dstType
,
533 const struct gl_pixelstore_attrib
*dstPacking
,
534 GLbitfield transferOps
)
537 const GLint comps
= _mesa_components_in_format(dstFormat
);
538 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
541 if (dstFormat
== GL_LUMINANCE
||
542 dstFormat
== GL_LUMINANCE_ALPHA
||
543 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
544 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
545 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
547 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
555 /* EXT_texture_integer specifies no transfer ops on integer
556 * types in the resolved issues section. Just set them to 0
557 * for integer surfaces.
563 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
567 * Component clamping (besides clamping to [0,1] in
568 * _mesa_apply_rgba_transfer_ops()).
571 /* clamping to dest type's min/max values */
573 if (get_type_min_max(dstType
, &min
, &max
)) {
574 for (i
= 0; i
< n
; i
++) {
575 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
576 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
577 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
578 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
582 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
583 /* compute luminance values */
584 if (transferOps
& IMAGE_CLAMP_BIT
) {
585 for (i
= 0; i
< n
; i
++) {
586 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
587 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
591 for (i
= 0; i
< n
; i
++) {
592 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
598 * Pack/store the pixels. Ugh! Lots of cases!!!
601 case GL_UNSIGNED_BYTE
:
603 GLubyte
*dst
= (GLubyte
*) dstAddr
;
607 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
611 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
615 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
619 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
623 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
625 case GL_LUMINANCE_ALPHA
:
627 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
628 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
633 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
634 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
639 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
640 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
641 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
646 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
647 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
648 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
649 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
654 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
655 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
656 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
661 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
662 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
663 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
664 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
669 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
670 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
671 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
672 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
675 case GL_RED_INTEGER_EXT
:
677 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
680 case GL_GREEN_INTEGER_EXT
:
682 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
685 case GL_BLUE_INTEGER_EXT
:
687 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
690 case GL_ALPHA_INTEGER_EXT
:
692 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
697 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
698 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
701 case GL_RGB_INTEGER_EXT
:
703 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
704 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
705 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
708 case GL_RGBA_INTEGER_EXT
:
710 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
711 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
712 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
713 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
716 case GL_BGR_INTEGER_EXT
:
718 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
719 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
720 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
723 case GL_BGRA_INTEGER_EXT
:
725 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
726 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
727 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
728 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
731 case GL_LUMINANCE_INTEGER_EXT
:
733 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
736 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
739 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
741 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
749 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
750 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
754 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
760 GLbyte
*dst
= (GLbyte
*) dstAddr
;
764 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
768 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
772 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
776 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
780 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
782 case GL_LUMINANCE_ALPHA
:
784 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
785 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
790 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
791 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
796 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
797 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
798 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
803 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
804 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
805 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
806 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
811 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
812 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
813 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
818 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
819 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
820 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
821 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
826 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
827 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
828 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
829 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
832 case GL_RED_INTEGER_EXT
:
834 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
837 case GL_GREEN_INTEGER_EXT
:
839 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
842 case GL_BLUE_INTEGER_EXT
:
844 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
847 case GL_ALPHA_INTEGER_EXT
:
849 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
854 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
855 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
858 case GL_RGB_INTEGER_EXT
:
860 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
861 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
862 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
865 case GL_RGBA_INTEGER_EXT
:
867 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
868 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
869 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
870 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
873 case GL_BGR_INTEGER_EXT
:
875 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
876 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
877 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
880 case GL_BGRA_INTEGER_EXT
:
882 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
883 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
884 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
885 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
888 case GL_LUMINANCE_INTEGER_EXT
:
890 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
893 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
896 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
898 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
906 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
907 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
911 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
915 case GL_UNSIGNED_SHORT
:
917 GLushort
*dst
= (GLushort
*) dstAddr
;
921 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
925 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
929 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
933 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
937 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
939 case GL_LUMINANCE_ALPHA
:
941 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
942 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
947 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
948 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
953 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
954 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
955 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
960 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
961 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
962 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
963 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
968 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
969 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
970 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
975 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
976 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
977 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
978 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
983 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
984 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
985 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
986 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
989 case GL_RED_INTEGER_EXT
:
991 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
994 case GL_GREEN_INTEGER_EXT
:
996 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
999 case GL_BLUE_INTEGER_EXT
:
1001 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1004 case GL_ALPHA_INTEGER_EXT
:
1006 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1011 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1012 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1015 case GL_RGB_INTEGER_EXT
:
1017 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1018 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1019 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1022 case GL_RGBA_INTEGER_EXT
:
1024 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1025 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1026 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1027 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1030 case GL_BGR_INTEGER_EXT
:
1032 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1033 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1034 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1037 case GL_BGRA_INTEGER_EXT
:
1039 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1040 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1041 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1042 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1045 case GL_LUMINANCE_INTEGER_EXT
:
1047 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1050 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1053 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1055 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1063 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1064 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1068 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1074 GLshort
*dst
= (GLshort
*) dstAddr
;
1075 switch (dstFormat
) {
1078 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1082 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1086 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1090 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1094 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1096 case GL_LUMINANCE_ALPHA
:
1098 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1099 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1104 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1105 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1110 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1111 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1112 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1117 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1118 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1119 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1120 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1125 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1126 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1127 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1132 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1133 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1134 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1135 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1140 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1141 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1142 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1143 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1146 case GL_RED_INTEGER_EXT
:
1148 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1151 case GL_GREEN_INTEGER_EXT
:
1153 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1156 case GL_BLUE_INTEGER_EXT
:
1158 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1161 case GL_ALPHA_INTEGER_EXT
:
1163 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1168 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1169 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1170 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1173 case GL_RGB_INTEGER_EXT
:
1175 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1176 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1177 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1180 case GL_RGBA_INTEGER_EXT
:
1182 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1183 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1184 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1185 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1188 case GL_BGR_INTEGER_EXT
:
1190 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1191 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1192 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1195 case GL_BGRA_INTEGER_EXT
:
1197 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1198 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1199 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1200 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1203 case GL_LUMINANCE_INTEGER_EXT
:
1205 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1208 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1211 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1213 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1221 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1222 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1226 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1230 case GL_UNSIGNED_INT
:
1232 GLuint
*dst
= (GLuint
*) dstAddr
;
1233 switch (dstFormat
) {
1236 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1240 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1244 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1248 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1252 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1254 case GL_LUMINANCE_ALPHA
:
1256 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1257 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1262 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1263 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1268 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1269 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1270 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1275 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1276 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1277 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1278 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1283 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1284 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1285 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1290 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1291 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1292 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1293 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1298 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1299 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1300 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1301 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1304 case GL_RED_INTEGER_EXT
:
1306 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1309 case GL_GREEN_INTEGER_EXT
:
1311 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1314 case GL_BLUE_INTEGER_EXT
:
1316 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1319 case GL_ALPHA_INTEGER_EXT
:
1321 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1326 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1327 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1330 case GL_RGB_INTEGER_EXT
:
1332 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1333 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1334 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1337 case GL_RGBA_INTEGER_EXT
:
1339 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1340 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1341 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1342 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1345 case GL_BGR_INTEGER_EXT
:
1347 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1348 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1349 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1352 case GL_BGRA_INTEGER_EXT
:
1354 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1355 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1356 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1357 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1360 case GL_LUMINANCE_INTEGER_EXT
:
1362 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1365 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1368 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1370 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1378 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1379 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1383 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1389 GLint
*dst
= (GLint
*) dstAddr
;
1390 switch (dstFormat
) {
1393 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1397 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1401 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1405 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1409 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1411 case GL_LUMINANCE_ALPHA
:
1413 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1414 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1419 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1420 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1425 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1426 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1427 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1432 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1433 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1434 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1435 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1440 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1441 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1442 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1447 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1448 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1449 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1450 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1455 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1456 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1457 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1458 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1464 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1465 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1468 case GL_RED_INTEGER_EXT
:
1470 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1473 case GL_GREEN_INTEGER_EXT
:
1475 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1478 case GL_BLUE_INTEGER_EXT
:
1480 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1483 case GL_ALPHA_INTEGER_EXT
:
1485 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1490 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1491 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1494 case GL_RGB_INTEGER_EXT
:
1496 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1497 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1498 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1501 case GL_RGBA_INTEGER_EXT
:
1503 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1504 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1505 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1506 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1509 case GL_BGR_INTEGER_EXT
:
1511 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1512 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1513 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1516 case GL_BGRA_INTEGER_EXT
:
1518 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1519 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1520 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1521 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1524 case GL_LUMINANCE_INTEGER_EXT
:
1526 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1529 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1532 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1534 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1540 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1546 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1547 switch (dstFormat
) {
1550 dst
[i
] = rgba
[i
][RCOMP
];
1554 dst
[i
] = rgba
[i
][GCOMP
];
1558 dst
[i
] = rgba
[i
][BCOMP
];
1562 dst
[i
] = rgba
[i
][ACOMP
];
1566 dst
[i
] = luminance
[i
];
1568 case GL_LUMINANCE_ALPHA
:
1570 dst
[i
*2+0] = luminance
[i
];
1571 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1576 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1577 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1582 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1583 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1584 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1589 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1590 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1591 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1592 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1597 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1598 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1599 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1604 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1605 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1606 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1607 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1612 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1613 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1614 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1615 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1621 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1622 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1626 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1630 case GL_HALF_FLOAT_ARB
:
1632 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1633 switch (dstFormat
) {
1636 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1640 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1644 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1648 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1652 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1654 case GL_LUMINANCE_ALPHA
:
1656 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1657 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1662 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1663 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1668 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1669 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1670 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1675 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1676 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1677 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1678 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1683 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1684 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1685 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1690 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1691 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1692 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1693 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1698 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1699 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1700 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1701 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1707 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1708 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1712 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1716 case GL_UNSIGNED_BYTE_3_3_2
:
1717 if (dstFormat
== GL_RGB
) {
1718 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1720 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1721 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1722 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1726 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1727 if (dstFormat
== GL_RGB
) {
1728 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1730 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1731 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1732 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1736 case GL_UNSIGNED_SHORT_5_6_5
:
1737 if (dstFormat
== GL_RGB
) {
1738 GLushort
*dst
= (GLushort
*) dstAddr
;
1740 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1741 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1742 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1746 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1747 if (dstFormat
== GL_RGB
) {
1748 GLushort
*dst
= (GLushort
*) dstAddr
;
1750 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1751 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1752 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1756 case GL_UNSIGNED_SHORT_4_4_4_4
:
1757 if (dstFormat
== GL_RGBA
) {
1758 GLushort
*dst
= (GLushort
*) dstAddr
;
1760 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1761 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1762 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1763 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1766 else if (dstFormat
== GL_BGRA
) {
1767 GLushort
*dst
= (GLushort
*) dstAddr
;
1769 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1770 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1771 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1772 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1775 else if (dstFormat
== GL_ABGR_EXT
) {
1776 GLushort
*dst
= (GLushort
*) dstAddr
;
1778 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1779 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1780 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1781 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1785 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1786 if (dstFormat
== GL_RGBA
) {
1787 GLushort
*dst
= (GLushort
*) dstAddr
;
1789 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1790 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1791 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1792 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1795 else if (dstFormat
== GL_BGRA
) {
1796 GLushort
*dst
= (GLushort
*) dstAddr
;
1798 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1799 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1800 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1801 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1804 else if (dstFormat
== GL_ABGR_EXT
) {
1805 GLushort
*dst
= (GLushort
*) dstAddr
;
1807 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1808 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1809 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1810 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1814 case GL_UNSIGNED_SHORT_5_5_5_1
:
1815 if (dstFormat
== GL_RGBA
) {
1816 GLushort
*dst
= (GLushort
*) dstAddr
;
1818 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1819 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1820 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1821 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1824 else if (dstFormat
== GL_BGRA
) {
1825 GLushort
*dst
= (GLushort
*) dstAddr
;
1827 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1828 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1829 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1830 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1833 else if (dstFormat
== GL_ABGR_EXT
) {
1834 GLushort
*dst
= (GLushort
*) dstAddr
;
1836 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1837 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1838 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1839 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1843 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1844 if (dstFormat
== GL_RGBA
) {
1845 GLushort
*dst
= (GLushort
*) dstAddr
;
1847 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1848 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1849 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1850 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1853 else if (dstFormat
== GL_BGRA
) {
1854 GLushort
*dst
= (GLushort
*) dstAddr
;
1856 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1857 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1858 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1859 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1862 else if (dstFormat
== GL_ABGR_EXT
) {
1863 GLushort
*dst
= (GLushort
*) dstAddr
;
1865 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1866 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1867 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1868 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1872 case GL_UNSIGNED_INT_8_8_8_8
:
1873 if (dstFormat
== GL_RGBA
) {
1874 GLuint
*dst
= (GLuint
*) dstAddr
;
1876 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1877 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1878 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1879 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1882 else if (dstFormat
== GL_BGRA
) {
1883 GLuint
*dst
= (GLuint
*) dstAddr
;
1885 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1886 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1887 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1888 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1891 else if (dstFormat
== GL_ABGR_EXT
) {
1892 GLuint
*dst
= (GLuint
*) dstAddr
;
1894 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1895 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1896 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1897 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1901 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1902 if (dstFormat
== GL_RGBA
) {
1903 GLuint
*dst
= (GLuint
*) dstAddr
;
1905 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1906 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1907 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1908 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1911 else if (dstFormat
== GL_BGRA
) {
1912 GLuint
*dst
= (GLuint
*) dstAddr
;
1914 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1915 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1916 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1917 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1920 else if (dstFormat
== GL_ABGR_EXT
) {
1921 GLuint
*dst
= (GLuint
*) dstAddr
;
1923 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1924 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1925 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1926 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1930 case GL_UNSIGNED_INT_10_10_10_2
:
1931 if (dstFormat
== GL_RGBA
) {
1932 GLuint
*dst
= (GLuint
*) dstAddr
;
1934 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1935 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1936 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1937 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1940 else if (dstFormat
== GL_BGRA
) {
1941 GLuint
*dst
= (GLuint
*) dstAddr
;
1943 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1944 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1945 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1946 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1949 else if (dstFormat
== GL_ABGR_EXT
) {
1950 GLuint
*dst
= (GLuint
*) dstAddr
;
1952 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1953 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1954 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1955 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1959 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1960 if (dstFormat
== GL_RGBA
) {
1961 GLuint
*dst
= (GLuint
*) dstAddr
;
1963 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1964 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1965 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1966 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1969 else if (dstFormat
== GL_BGRA
) {
1970 GLuint
*dst
= (GLuint
*) dstAddr
;
1972 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1973 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1974 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1975 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1978 else if (dstFormat
== GL_ABGR_EXT
) {
1979 GLuint
*dst
= (GLuint
*) dstAddr
;
1981 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1982 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1983 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1984 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1988 case GL_UNSIGNED_INT_5_9_9_9_REV
:
1990 GLuint
*dst
= (GLuint
*) dstAddr
;
1991 for (i
= 0; i
< n
; i
++) {
1992 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
1996 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
1998 GLuint
*dst
= (GLuint
*) dstAddr
;
1999 for (i
= 0; i
< n
; i
++) {
2000 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2005 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2010 if (dstPacking
->SwapBytes
) {
2011 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2012 if (swapSize
== 2) {
2013 if (dstPacking
->SwapBytes
) {
2014 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2017 else if (swapSize
== 4) {
2018 if (dstPacking
->SwapBytes
) {
2019 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2029 #define SWAP2BYTE(VALUE) \
2031 GLubyte *bytes = (GLubyte *) &(VALUE); \
2032 GLubyte tmp = bytes[0]; \
2033 bytes[0] = bytes[1]; \
2037 #define SWAP4BYTE(VALUE) \
2039 GLubyte *bytes = (GLubyte *) &(VALUE); \
2040 GLubyte tmp = bytes[0]; \
2041 bytes[0] = bytes[3]; \
2044 bytes[1] = bytes[2]; \
2050 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2051 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2052 const struct gl_pixelstore_attrib
*unpack
)
2054 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2056 ASSERT(srcType
== GL_BITMAP
||
2057 srcType
== GL_UNSIGNED_BYTE
||
2058 srcType
== GL_BYTE
||
2059 srcType
== GL_UNSIGNED_SHORT
||
2060 srcType
== GL_SHORT
||
2061 srcType
== GL_UNSIGNED_INT
||
2062 srcType
== GL_INT
||
2063 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2064 srcType
== GL_HALF_FLOAT_ARB
||
2065 srcType
== GL_FLOAT
||
2066 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2071 GLubyte
*ubsrc
= (GLubyte
*) src
;
2072 if (unpack
->LsbFirst
) {
2073 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2075 for (i
= 0; i
< n
; i
++) {
2076 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2087 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2089 for (i
= 0; i
< n
; i
++) {
2090 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2102 case GL_UNSIGNED_BYTE
:
2105 const GLubyte
*s
= (const GLubyte
*) src
;
2106 for (i
= 0; i
< n
; i
++)
2113 const GLbyte
*s
= (const GLbyte
*) src
;
2114 for (i
= 0; i
< n
; i
++)
2118 case GL_UNSIGNED_SHORT
:
2121 const GLushort
*s
= (const GLushort
*) src
;
2122 if (unpack
->SwapBytes
) {
2123 for (i
= 0; i
< n
; i
++) {
2124 GLushort value
= s
[i
];
2130 for (i
= 0; i
< n
; i
++)
2138 const GLshort
*s
= (const GLshort
*) src
;
2139 if (unpack
->SwapBytes
) {
2140 for (i
= 0; i
< n
; i
++) {
2141 GLshort value
= s
[i
];
2147 for (i
= 0; i
< n
; i
++)
2152 case GL_UNSIGNED_INT
:
2155 const GLuint
*s
= (const GLuint
*) src
;
2156 if (unpack
->SwapBytes
) {
2157 for (i
= 0; i
< n
; i
++) {
2158 GLuint value
= s
[i
];
2164 for (i
= 0; i
< n
; i
++)
2172 const GLint
*s
= (const GLint
*) src
;
2173 if (unpack
->SwapBytes
) {
2174 for (i
= 0; i
< n
; i
++) {
2181 for (i
= 0; i
< n
; i
++)
2189 const GLfloat
*s
= (const GLfloat
*) src
;
2190 if (unpack
->SwapBytes
) {
2191 for (i
= 0; i
< n
; i
++) {
2192 GLfloat value
= s
[i
];
2194 indexes
[i
] = (GLuint
) value
;
2198 for (i
= 0; i
< n
; i
++)
2199 indexes
[i
] = (GLuint
) s
[i
];
2203 case GL_HALF_FLOAT_ARB
:
2206 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2207 if (unpack
->SwapBytes
) {
2208 for (i
= 0; i
< n
; i
++) {
2209 GLhalfARB value
= s
[i
];
2211 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2215 for (i
= 0; i
< n
; i
++)
2216 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2220 case GL_UNSIGNED_INT_24_8_EXT
:
2223 const GLuint
*s
= (const GLuint
*) src
;
2224 if (unpack
->SwapBytes
) {
2225 for (i
= 0; i
< n
; i
++) {
2226 GLuint value
= s
[i
];
2228 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2232 for (i
= 0; i
< n
; i
++)
2233 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2237 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2240 const GLuint
*s
= (const GLuint
*) src
;
2241 if (unpack
->SwapBytes
) {
2242 for (i
= 0; i
< n
; i
++) {
2243 GLuint value
= s
[i
*2+1];
2245 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2249 for (i
= 0; i
< n
; i
++)
2250 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2256 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2263 * Return source/dest RGBA indexes for unpacking pixels.
2266 get_component_mapping(GLenum format
,
2278 case GL_RED_INTEGER_EXT
:
2280 *gSrc
= *bSrc
= *aSrc
= -1;
2283 case GL_GREEN_INTEGER_EXT
:
2285 *rSrc
= *bSrc
= *aSrc
= -1;
2288 case GL_BLUE_INTEGER_EXT
:
2290 *rSrc
= *gSrc
= *aSrc
= -1;
2293 case GL_ALPHA_INTEGER_EXT
:
2294 *rSrc
= *gSrc
= *bSrc
= -1;
2298 case GL_LUMINANCE_INTEGER_EXT
:
2299 *rSrc
= *gSrc
= *bSrc
= 0;
2302 case GL_LUMINANCE_ALPHA
:
2303 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2304 *rSrc
= *gSrc
= *bSrc
= 0;
2308 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2322 case GL_RGB_INTEGER
:
2333 case GL_BGR_INTEGER
:
2344 case GL_RGBA_INTEGER
:
2355 case GL_BGRA_INTEGER
:
2383 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2384 _mesa_lookup_enum_by_nr(format
));
2392 * This function extracts floating point RGBA values from arbitrary
2393 * image data. srcFormat and srcType are the format and type parameters
2394 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2396 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2397 * implements the "Conversion to floating point", "Conversion to RGB",
2398 * and "Final Expansion to RGBA" operations.
2400 * Args: n - number of pixels
2401 * rgba - output colors
2402 * srcFormat - format of incoming data
2403 * srcType - data type of incoming data
2404 * src - source data pointer
2405 * swapBytes - perform byteswapping of incoming data?
2408 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2409 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2410 GLboolean swapBytes
)
2412 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2414 GLint rDst
, bDst
, gDst
, aDst
;
2415 GLboolean intFormat
;
2416 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2418 ASSERT(srcFormat
== GL_RED
||
2419 srcFormat
== GL_GREEN
||
2420 srcFormat
== GL_BLUE
||
2421 srcFormat
== GL_ALPHA
||
2422 srcFormat
== GL_LUMINANCE
||
2423 srcFormat
== GL_LUMINANCE_ALPHA
||
2424 srcFormat
== GL_INTENSITY
||
2425 srcFormat
== GL_RG
||
2426 srcFormat
== GL_RGB
||
2427 srcFormat
== GL_BGR
||
2428 srcFormat
== GL_RGBA
||
2429 srcFormat
== GL_BGRA
||
2430 srcFormat
== GL_ABGR_EXT
||
2431 srcFormat
== GL_DU8DV8_ATI
||
2432 srcFormat
== GL_DUDV_ATI
||
2433 srcFormat
== GL_RED_INTEGER_EXT
||
2434 srcFormat
== GL_GREEN_INTEGER_EXT
||
2435 srcFormat
== GL_BLUE_INTEGER_EXT
||
2436 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2437 srcFormat
== GL_RG_INTEGER
||
2438 srcFormat
== GL_RGB_INTEGER_EXT
||
2439 srcFormat
== GL_RGBA_INTEGER_EXT
||
2440 srcFormat
== GL_BGR_INTEGER_EXT
||
2441 srcFormat
== GL_BGRA_INTEGER_EXT
||
2442 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2443 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2445 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2446 srcType
== GL_BYTE
||
2447 srcType
== GL_UNSIGNED_SHORT
||
2448 srcType
== GL_SHORT
||
2449 srcType
== GL_UNSIGNED_INT
||
2450 srcType
== GL_INT
||
2451 srcType
== GL_HALF_FLOAT_ARB
||
2452 srcType
== GL_FLOAT
||
2453 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2454 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2455 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2456 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2457 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2458 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2459 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2460 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2461 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2462 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2463 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2464 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2465 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2466 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2468 get_component_mapping(srcFormat
,
2469 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2470 &rDst
, &gDst
, &bDst
, &aDst
);
2472 stride
= _mesa_components_in_format(srcFormat
);
2474 intFormat
= _mesa_is_integer_format(srcFormat
);
2476 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2477 if ((SRC_INDEX) < 0) { \
2480 for (i = 0; i < n; i++) { \
2481 rgba[i][DST_INDEX] = DEFAULT_INT; \
2485 for (i = 0; i < n; i++) { \
2486 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2490 else if (swapBytes) { \
2491 const TYPE *s = (const TYPE *) src; \
2493 for (i = 0; i < n; i++) { \
2494 TYPE value = s[SRC_INDEX]; \
2495 if (sizeof(TYPE) == 2) { \
2498 else if (sizeof(TYPE) == 4) { \
2502 rgba[i][DST_INDEX] = (GLfloat) value; \
2504 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2509 const TYPE *s = (const TYPE *) src; \
2512 for (i = 0; i < n; i++) { \
2513 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2518 for (i = 0; i < n; i++) { \
2519 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2526 case GL_UNSIGNED_BYTE
:
2527 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2528 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2529 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2530 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2533 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2534 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2535 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2536 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2538 case GL_UNSIGNED_SHORT
:
2539 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2540 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2541 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2542 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2545 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2546 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2547 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2548 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2550 case GL_UNSIGNED_INT
:
2551 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2552 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2553 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2554 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2557 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2558 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2559 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2560 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2563 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2564 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2565 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2566 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2568 case GL_HALF_FLOAT_ARB
:
2569 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2570 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2571 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2572 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2574 case GL_UNSIGNED_BYTE_3_3_2
:
2576 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2583 for (i
= 0; i
< n
; i
++) {
2584 GLubyte p
= ubsrc
[i
];
2585 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2586 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2587 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2588 rgba
[i
][aDst
] = 1.0F
;
2592 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2594 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2601 for (i
= 0; i
< n
; i
++) {
2602 GLubyte p
= ubsrc
[i
];
2603 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2604 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2605 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2606 rgba
[i
][aDst
] = 1.0F
;
2610 case GL_UNSIGNED_SHORT_5_6_5
:
2617 const GLushort
*ussrc
= (const GLushort
*) src
;
2619 for (i
= 0; i
< n
; i
++) {
2620 GLushort p
= ussrc
[i
];
2622 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2623 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2624 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2625 rgba
[i
][aDst
] = 1.0F
;
2629 const GLushort
*ussrc
= (const GLushort
*) src
;
2631 for (i
= 0; i
< n
; i
++) {
2632 GLushort p
= ussrc
[i
];
2633 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2634 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2635 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2636 rgba
[i
][aDst
] = 1.0F
;
2640 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2647 const GLushort
*ussrc
= (const GLushort
*) src
;
2649 for (i
= 0; i
< n
; i
++) {
2650 GLushort p
= ussrc
[i
];
2652 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2653 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2654 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2655 rgba
[i
][aDst
] = 1.0F
;
2659 const GLushort
*ussrc
= (const GLushort
*) src
;
2661 for (i
= 0; i
< n
; i
++) {
2662 GLushort p
= ussrc
[i
];
2663 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2664 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2665 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2666 rgba
[i
][aDst
] = 1.0F
;
2670 case GL_UNSIGNED_SHORT_4_4_4_4
:
2672 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2675 const GLushort
*ussrc
= (const GLushort
*) src
;
2677 for (i
= 0; i
< n
; i
++) {
2678 GLushort p
= ussrc
[i
];
2680 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2681 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2682 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2683 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2687 const GLushort
*ussrc
= (const GLushort
*) src
;
2689 for (i
= 0; i
< n
; i
++) {
2690 GLushort p
= ussrc
[i
];
2691 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2692 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2693 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2694 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2698 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2700 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2703 const GLushort
*ussrc
= (const GLushort
*) src
;
2705 for (i
= 0; i
< n
; i
++) {
2706 GLushort p
= ussrc
[i
];
2708 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2709 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2710 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2711 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2715 const GLushort
*ussrc
= (const GLushort
*) src
;
2717 for (i
= 0; i
< n
; i
++) {
2718 GLushort p
= ussrc
[i
];
2719 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2720 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2721 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2722 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2726 case GL_UNSIGNED_SHORT_5_5_5_1
:
2728 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2731 const GLushort
*ussrc
= (const GLushort
*) src
;
2733 for (i
= 0; i
< n
; i
++) {
2734 GLushort p
= ussrc
[i
];
2736 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2737 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2738 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2739 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2743 const GLushort
*ussrc
= (const GLushort
*) src
;
2745 for (i
= 0; i
< n
; i
++) {
2746 GLushort p
= ussrc
[i
];
2747 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2748 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2749 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2750 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2754 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2756 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2759 const GLushort
*ussrc
= (const GLushort
*) src
;
2761 for (i
= 0; i
< n
; i
++) {
2762 GLushort p
= ussrc
[i
];
2764 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2765 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2766 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2767 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2771 const GLushort
*ussrc
= (const GLushort
*) src
;
2773 for (i
= 0; i
< n
; i
++) {
2774 GLushort p
= ussrc
[i
];
2775 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2776 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2777 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2778 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2782 case GL_UNSIGNED_INT_8_8_8_8
:
2784 const GLuint
*uisrc
= (const GLuint
*) src
;
2787 for (i
= 0; i
< n
; i
++) {
2788 GLuint p
= uisrc
[i
];
2789 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2790 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2791 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2792 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2796 for (i
= 0; i
< n
; i
++) {
2797 GLuint p
= uisrc
[i
];
2798 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2799 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2800 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2801 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2806 const GLuint
*uisrc
= (const GLuint
*) src
;
2809 for (i
= 0; i
< n
; i
++) {
2810 GLuint p
= uisrc
[i
];
2811 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2812 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2813 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2814 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2818 for (i
= 0; i
< n
; i
++) {
2819 GLuint p
= uisrc
[i
];
2820 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2821 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2822 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2823 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2828 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2830 const GLuint
*uisrc
= (const GLuint
*) src
;
2833 for (i
= 0; i
< n
; i
++) {
2834 GLuint p
= uisrc
[i
];
2835 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2836 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2837 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2838 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2842 for (i
= 0; i
< n
; i
++) {
2843 GLuint p
= uisrc
[i
];
2844 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2845 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2846 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2847 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2852 const GLuint
*uisrc
= (const GLuint
*) src
;
2855 for (i
= 0; i
< n
; i
++) {
2856 GLuint p
= uisrc
[i
];
2857 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2858 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2859 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2860 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2864 for (i
= 0; i
< n
; i
++) {
2865 GLuint p
= uisrc
[i
];
2866 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2867 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2868 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2869 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2874 case GL_UNSIGNED_INT_10_10_10_2
:
2876 rs
= 1.0F
/ 1023.0F
;
2877 gs
= 1.0F
/ 1023.0F
;
2878 bs
= 1.0F
/ 1023.0F
;
2882 const GLuint
*uisrc
= (const GLuint
*) src
;
2884 for (i
= 0; i
< n
; i
++) {
2885 GLuint p
= uisrc
[i
];
2887 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2888 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2889 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2890 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2894 const GLuint
*uisrc
= (const GLuint
*) src
;
2896 for (i
= 0; i
< n
; i
++) {
2897 GLuint p
= uisrc
[i
];
2898 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2899 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2900 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2901 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2905 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2907 rs
= 1.0F
/ 1023.0F
;
2908 gs
= 1.0F
/ 1023.0F
;
2909 bs
= 1.0F
/ 1023.0F
;
2913 const GLuint
*uisrc
= (const GLuint
*) src
;
2915 for (i
= 0; i
< n
; i
++) {
2916 GLuint p
= uisrc
[i
];
2918 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2919 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2920 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2921 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2925 const GLuint
*uisrc
= (const GLuint
*) src
;
2927 for (i
= 0; i
< n
; i
++) {
2928 GLuint p
= uisrc
[i
];
2929 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2930 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2931 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2932 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2936 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2938 const GLuint
*uisrc
= (const GLuint
*) src
;
2941 for (i
= 0; i
< n
; i
++) {
2942 GLuint p
= uisrc
[i
];
2944 rgb9e5_to_float3(p
, f
);
2945 rgba
[i
][rDst
] = f
[0];
2946 rgba
[i
][gDst
] = f
[1];
2947 rgba
[i
][bDst
] = f
[2];
2948 rgba
[i
][aDst
] = 1.0F
;
2952 const GLuint
*uisrc
= (const GLuint
*) src
;
2955 for (i
= 0; i
< n
; i
++) {
2956 rgb9e5_to_float3(uisrc
[i
], f
);
2957 rgba
[i
][rDst
] = f
[0];
2958 rgba
[i
][gDst
] = f
[1];
2959 rgba
[i
][bDst
] = f
[2];
2960 rgba
[i
][aDst
] = 1.0F
;
2964 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2966 const GLuint
*uisrc
= (const GLuint
*) src
;
2969 for (i
= 0; i
< n
; i
++) {
2970 GLuint p
= uisrc
[i
];
2972 r11g11b10f_to_float3(p
, f
);
2973 rgba
[i
][rDst
] = f
[0];
2974 rgba
[i
][gDst
] = f
[1];
2975 rgba
[i
][bDst
] = f
[2];
2976 rgba
[i
][aDst
] = 1.0F
;
2980 const GLuint
*uisrc
= (const GLuint
*) src
;
2983 for (i
= 0; i
< n
; i
++) {
2984 r11g11b10f_to_float3(uisrc
[i
], f
);
2985 rgba
[i
][rDst
] = f
[0];
2986 rgba
[i
][gDst
] = f
[1];
2987 rgba
[i
][bDst
] = f
[2];
2988 rgba
[i
][aDst
] = 1.0F
;
2993 _mesa_problem(NULL
, "bad srcType in extract float data");
3000 static inline GLuint
3001 clamp_byte_to_uint(GLbyte b
)
3003 return b
< 0 ? 0 : b
;
3007 static inline GLuint
3008 clamp_short_to_uint(GLshort s
)
3010 return s
< 0 ? 0 : s
;
3014 static inline GLuint
3015 clamp_int_to_uint(GLint i
)
3017 return i
< 0 ? 0 : i
;
3021 static inline GLuint
3022 clamp_float_to_uint(GLfloat f
)
3024 return f
< 0.0F
? 0 : IROUND(f
);
3028 static inline GLuint
3029 clamp_half_to_uint(GLhalfARB h
)
3031 GLfloat f
= _mesa_half_to_float(h
);
3032 return f
< 0.0F
? 0 : IROUND(f
);
3037 * \sa extract_float_rgba()
3040 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3041 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3042 GLboolean swapBytes
)
3044 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3046 GLint rDst
, bDst
, gDst
, aDst
;
3048 ASSERT(srcFormat
== GL_RED
||
3049 srcFormat
== GL_GREEN
||
3050 srcFormat
== GL_BLUE
||
3051 srcFormat
== GL_ALPHA
||
3052 srcFormat
== GL_LUMINANCE
||
3053 srcFormat
== GL_LUMINANCE_ALPHA
||
3054 srcFormat
== GL_INTENSITY
||
3055 srcFormat
== GL_RG
||
3056 srcFormat
== GL_RGB
||
3057 srcFormat
== GL_BGR
||
3058 srcFormat
== GL_RGBA
||
3059 srcFormat
== GL_BGRA
||
3060 srcFormat
== GL_ABGR_EXT
||
3061 srcFormat
== GL_DU8DV8_ATI
||
3062 srcFormat
== GL_DUDV_ATI
||
3063 srcFormat
== GL_RED_INTEGER_EXT
||
3064 srcFormat
== GL_RG_INTEGER
||
3065 srcFormat
== GL_GREEN_INTEGER_EXT
||
3066 srcFormat
== GL_BLUE_INTEGER_EXT
||
3067 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3068 srcFormat
== GL_RGB_INTEGER_EXT
||
3069 srcFormat
== GL_RGBA_INTEGER_EXT
||
3070 srcFormat
== GL_BGR_INTEGER_EXT
||
3071 srcFormat
== GL_BGRA_INTEGER_EXT
||
3072 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3073 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3075 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3076 srcType
== GL_BYTE
||
3077 srcType
== GL_UNSIGNED_SHORT
||
3078 srcType
== GL_SHORT
||
3079 srcType
== GL_UNSIGNED_INT
||
3080 srcType
== GL_INT
||
3081 srcType
== GL_HALF_FLOAT_ARB
||
3082 srcType
== GL_FLOAT
||
3083 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3084 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3085 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3086 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3087 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3088 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3089 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3090 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3091 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3092 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3093 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3094 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3095 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3096 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3098 get_component_mapping(srcFormat
,
3099 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3100 &rDst
, &gDst
, &bDst
, &aDst
);
3102 stride
= _mesa_components_in_format(srcFormat
);
3104 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3105 if ((SRC_INDEX) < 0) { \
3107 for (i = 0; i < n; i++) { \
3108 rgba[i][DST_INDEX] = DEFAULT; \
3111 else if (swapBytes) { \
3112 const TYPE *s = (const TYPE *) src; \
3114 for (i = 0; i < n; i++) { \
3115 TYPE value = s[SRC_INDEX]; \
3116 if (sizeof(TYPE) == 2) { \
3119 else if (sizeof(TYPE) == 4) { \
3122 rgba[i][DST_INDEX] = CONVERSION(value); \
3127 const TYPE *s = (const TYPE *) src; \
3129 for (i = 0; i < n; i++) { \
3130 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3136 case GL_UNSIGNED_BYTE
:
3137 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3138 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3139 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3140 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3143 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3144 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3145 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3146 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
3148 case GL_UNSIGNED_SHORT
:
3149 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3150 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3151 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3152 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3155 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3156 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3157 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3158 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3160 case GL_UNSIGNED_INT
:
3161 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3162 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3163 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3164 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3167 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3168 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3169 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3170 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3173 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3174 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3175 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3176 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3178 case GL_HALF_FLOAT_ARB
:
3179 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3180 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3181 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3182 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3184 case GL_UNSIGNED_BYTE_3_3_2
:
3186 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3188 for (i
= 0; i
< n
; i
++) {
3189 GLubyte p
= ubsrc
[i
];
3190 rgba
[i
][rDst
] = ((p
>> 5) );
3191 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3192 rgba
[i
][bDst
] = ((p
) & 0x3);
3197 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3199 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3201 for (i
= 0; i
< n
; i
++) {
3202 GLubyte p
= ubsrc
[i
];
3203 rgba
[i
][rDst
] = ((p
) & 0x7);
3204 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3205 rgba
[i
][bDst
] = ((p
>> 6) );
3210 case GL_UNSIGNED_SHORT_5_6_5
:
3212 const GLushort
*ussrc
= (const GLushort
*) src
;
3214 for (i
= 0; i
< n
; i
++) {
3215 GLushort p
= ussrc
[i
];
3217 rgba
[i
][rDst
] = ((p
>> 11) );
3218 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3219 rgba
[i
][bDst
] = ((p
) & 0x1f);
3224 const GLushort
*ussrc
= (const GLushort
*) src
;
3226 for (i
= 0; i
< n
; i
++) {
3227 GLushort p
= ussrc
[i
];
3228 rgba
[i
][rDst
] = ((p
>> 11) );
3229 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3230 rgba
[i
][bDst
] = ((p
) & 0x1f);
3235 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3237 const GLushort
*ussrc
= (const GLushort
*) src
;
3239 for (i
= 0; i
< n
; i
++) {
3240 GLushort p
= ussrc
[i
];
3242 rgba
[i
][rDst
] = ((p
) & 0x1f);
3243 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3244 rgba
[i
][bDst
] = ((p
>> 11) );
3249 const GLushort
*ussrc
= (const GLushort
*) src
;
3251 for (i
= 0; i
< n
; i
++) {
3252 GLushort p
= ussrc
[i
];
3253 rgba
[i
][rDst
] = ((p
) & 0x1f);
3254 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3255 rgba
[i
][bDst
] = ((p
>> 11) );
3260 case GL_UNSIGNED_SHORT_4_4_4_4
:
3262 const GLushort
*ussrc
= (const GLushort
*) src
;
3264 for (i
= 0; i
< n
; i
++) {
3265 GLushort p
= ussrc
[i
];
3267 rgba
[i
][rDst
] = ((p
>> 12) );
3268 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3269 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3270 rgba
[i
][aDst
] = ((p
) & 0xf);
3274 const GLushort
*ussrc
= (const GLushort
*) src
;
3276 for (i
= 0; i
< n
; i
++) {
3277 GLushort p
= ussrc
[i
];
3278 rgba
[i
][rDst
] = ((p
>> 12) );
3279 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3280 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3281 rgba
[i
][aDst
] = ((p
) & 0xf);
3285 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3287 const GLushort
*ussrc
= (const GLushort
*) src
;
3289 for (i
= 0; i
< n
; i
++) {
3290 GLushort p
= ussrc
[i
];
3292 rgba
[i
][rDst
] = ((p
) & 0xf);
3293 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3294 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3295 rgba
[i
][aDst
] = ((p
>> 12) );
3299 const GLushort
*ussrc
= (const GLushort
*) src
;
3301 for (i
= 0; i
< n
; i
++) {
3302 GLushort p
= ussrc
[i
];
3303 rgba
[i
][rDst
] = ((p
) & 0xf);
3304 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3305 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3306 rgba
[i
][aDst
] = ((p
>> 12) );
3310 case GL_UNSIGNED_SHORT_5_5_5_1
:
3312 const GLushort
*ussrc
= (const GLushort
*) src
;
3314 for (i
= 0; i
< n
; i
++) {
3315 GLushort p
= ussrc
[i
];
3317 rgba
[i
][rDst
] = ((p
>> 11) );
3318 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3319 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3320 rgba
[i
][aDst
] = ((p
) & 0x1 );
3324 const GLushort
*ussrc
= (const GLushort
*) src
;
3326 for (i
= 0; i
< n
; i
++) {
3327 GLushort p
= ussrc
[i
];
3328 rgba
[i
][rDst
] = ((p
>> 11) );
3329 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3330 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3331 rgba
[i
][aDst
] = ((p
) & 0x1 );
3335 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3337 const GLushort
*ussrc
= (const GLushort
*) src
;
3339 for (i
= 0; i
< n
; i
++) {
3340 GLushort p
= ussrc
[i
];
3342 rgba
[i
][rDst
] = ((p
) & 0x1f);
3343 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3344 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3345 rgba
[i
][aDst
] = ((p
>> 15) );
3349 const GLushort
*ussrc
= (const GLushort
*) src
;
3351 for (i
= 0; i
< n
; i
++) {
3352 GLushort p
= ussrc
[i
];
3353 rgba
[i
][rDst
] = ((p
) & 0x1f);
3354 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3355 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3356 rgba
[i
][aDst
] = ((p
>> 15) );
3360 case GL_UNSIGNED_INT_8_8_8_8
:
3362 const GLuint
*uisrc
= (const GLuint
*) src
;
3364 for (i
= 0; i
< n
; i
++) {
3365 GLuint p
= uisrc
[i
];
3366 rgba
[i
][rDst
] = ((p
) & 0xff);
3367 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3368 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3369 rgba
[i
][aDst
] = ((p
>> 24) );
3373 const GLuint
*uisrc
= (const GLuint
*) src
;
3375 for (i
= 0; i
< n
; i
++) {
3376 GLuint p
= uisrc
[i
];
3377 rgba
[i
][rDst
] = ((p
>> 24) );
3378 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3379 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3380 rgba
[i
][aDst
] = ((p
) & 0xff);
3384 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3386 const GLuint
*uisrc
= (const GLuint
*) src
;
3388 for (i
= 0; i
< n
; i
++) {
3389 GLuint p
= uisrc
[i
];
3390 rgba
[i
][rDst
] = ((p
>> 24) );
3391 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3392 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3393 rgba
[i
][aDst
] = ((p
) & 0xff);
3397 const GLuint
*uisrc
= (const GLuint
*) src
;
3399 for (i
= 0; i
< n
; i
++) {
3400 GLuint p
= uisrc
[i
];
3401 rgba
[i
][rDst
] = ((p
) & 0xff);
3402 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3403 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3404 rgba
[i
][aDst
] = ((p
>> 24) );
3408 case GL_UNSIGNED_INT_10_10_10_2
:
3410 const GLuint
*uisrc
= (const GLuint
*) src
;
3412 for (i
= 0; i
< n
; i
++) {
3413 GLuint p
= uisrc
[i
];
3415 rgba
[i
][rDst
] = ((p
>> 22) );
3416 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3417 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3418 rgba
[i
][aDst
] = ((p
) & 0x3 );
3422 const GLuint
*uisrc
= (const GLuint
*) src
;
3424 for (i
= 0; i
< n
; i
++) {
3425 GLuint p
= uisrc
[i
];
3426 rgba
[i
][rDst
] = ((p
>> 22) );
3427 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3428 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3429 rgba
[i
][aDst
] = ((p
) & 0x3 );
3433 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3435 const GLuint
*uisrc
= (const GLuint
*) src
;
3437 for (i
= 0; i
< n
; i
++) {
3438 GLuint p
= uisrc
[i
];
3440 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3441 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3442 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3443 rgba
[i
][aDst
] = ((p
>> 30) );
3447 const GLuint
*uisrc
= (const GLuint
*) src
;
3449 for (i
= 0; i
< n
; i
++) {
3450 GLuint p
= uisrc
[i
];
3451 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3452 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3453 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3454 rgba
[i
][aDst
] = ((p
>> 30) );
3458 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3460 const GLuint
*uisrc
= (const GLuint
*) src
;
3463 for (i
= 0; i
< n
; i
++) {
3464 GLuint p
= uisrc
[i
];
3466 rgb9e5_to_float3(p
, f
);
3467 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3468 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3469 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3474 const GLuint
*uisrc
= (const GLuint
*) src
;
3477 for (i
= 0; i
< n
; i
++) {
3478 GLuint p
= uisrc
[i
];
3479 rgb9e5_to_float3(p
, f
);
3480 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3481 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3482 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3487 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3489 const GLuint
*uisrc
= (const GLuint
*) src
;
3492 for (i
= 0; i
< n
; i
++) {
3493 GLuint p
= uisrc
[i
];
3495 r11g11b10f_to_float3(p
, f
);
3496 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3497 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3498 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3503 const GLuint
*uisrc
= (const GLuint
*) src
;
3506 for (i
= 0; i
< n
; i
++) {
3507 GLuint p
= uisrc
[i
];
3508 r11g11b10f_to_float3(p
, f
);
3509 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3510 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3511 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3517 _mesa_problem(NULL
, "bad srcType in extract uint data");
3526 * Unpack a row of color image data from a client buffer according to
3527 * the pixel unpacking parameters.
3528 * Return GLubyte values in the specified dest image format.
3529 * This is used by glDrawPixels and glTexImage?D().
3530 * \param ctx - the context
3531 * n - number of pixels in the span
3532 * dstFormat - format of destination color array
3533 * dest - the destination color array
3534 * srcFormat - source image format
3535 * srcType - source image data type
3536 * source - source image pointer
3537 * srcPacking - pixel unpacking parameters
3538 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3540 * XXX perhaps expand this to process whole images someday.
3543 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3544 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3545 GLenum srcFormat
, GLenum srcType
,
3546 const GLvoid
*source
,
3547 const struct gl_pixelstore_attrib
*srcPacking
,
3548 GLbitfield transferOps
)
3550 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3551 ASSERT(dstFormat
== GL_ALPHA
||
3552 dstFormat
== GL_LUMINANCE
||
3553 dstFormat
== GL_LUMINANCE_ALPHA
||
3554 dstFormat
== GL_INTENSITY
||
3555 dstFormat
== GL_RED
||
3556 dstFormat
== GL_RG
||
3557 dstFormat
== GL_RGB
||
3558 dstFormat
== GL_RGBA
);
3560 ASSERT(srcFormat
== GL_RED
||
3561 srcFormat
== GL_GREEN
||
3562 srcFormat
== GL_BLUE
||
3563 srcFormat
== GL_ALPHA
||
3564 srcFormat
== GL_LUMINANCE
||
3565 srcFormat
== GL_LUMINANCE_ALPHA
||
3566 srcFormat
== GL_INTENSITY
||
3567 srcFormat
== GL_RG
||
3568 srcFormat
== GL_RGB
||
3569 srcFormat
== GL_BGR
||
3570 srcFormat
== GL_RGBA
||
3571 srcFormat
== GL_BGRA
||
3572 srcFormat
== GL_ABGR_EXT
||
3573 srcFormat
== GL_COLOR_INDEX
);
3575 ASSERT(srcType
== GL_BITMAP
||
3576 srcType
== GL_UNSIGNED_BYTE
||
3577 srcType
== GL_BYTE
||
3578 srcType
== GL_UNSIGNED_SHORT
||
3579 srcType
== GL_SHORT
||
3580 srcType
== GL_UNSIGNED_INT
||
3581 srcType
== GL_INT
||
3582 srcType
== GL_HALF_FLOAT_ARB
||
3583 srcType
== GL_FLOAT
||
3584 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3585 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3586 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3587 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3588 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3589 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3590 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3591 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3592 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3593 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3594 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3595 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3596 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3597 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3599 /* EXT_texture_integer specifies no transfer ops on integer
3600 * types in the resolved issues section. Just set them to 0
3601 * for integer surfaces.
3606 /* Try simple cases first */
3607 if (transferOps
== 0) {
3608 if (srcType
== GL_UNSIGNED_BYTE
) {
3609 if (dstFormat
== GL_RGBA
) {
3610 if (srcFormat
== GL_RGBA
) {
3611 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3614 else if (srcFormat
== GL_RGB
) {
3616 const GLubyte
*src
= (const GLubyte
*) source
;
3617 GLubyte
*dst
= dest
;
3618 for (i
= 0; i
< n
; i
++) {
3629 else if (dstFormat
== GL_RGB
) {
3630 if (srcFormat
== GL_RGB
) {
3631 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3634 else if (srcFormat
== GL_RGBA
) {
3636 const GLubyte
*src
= (const GLubyte
*) source
;
3637 GLubyte
*dst
= dest
;
3638 for (i
= 0; i
< n
; i
++) {
3648 else if (dstFormat
== srcFormat
) {
3649 GLint comps
= _mesa_components_in_format(srcFormat
);
3651 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3658 /* general solution begins here */
3660 GLint dstComponents
;
3661 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3662 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3665 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3669 dstComponents
= _mesa_components_in_format( dstFormat
);
3670 /* source & dest image formats should have been error checked by now */
3671 assert(dstComponents
> 0);
3674 * Extract image data and convert to RGBA floats
3676 if (srcFormat
== GL_COLOR_INDEX
) {
3677 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3680 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3685 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3688 /* Convert indexes to RGBA */
3689 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3690 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3692 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3694 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3695 * with color indexes.
3697 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3702 /* non-color index data */
3703 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3704 srcPacking
->SwapBytes
);
3707 /* Need to clamp if returning GLubytes */
3708 transferOps
|= IMAGE_CLAMP_BIT
;
3711 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3714 get_component_indexes(dstFormat
,
3715 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3717 /* Now return the GLubyte data in the requested dstFormat */
3719 GLubyte
*dst
= dest
;
3721 for (i
= 0; i
< n
; i
++) {
3722 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3723 dst
+= dstComponents
;
3728 GLubyte
*dst
= dest
;
3730 for (i
= 0; i
< n
; i
++) {
3731 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3732 dst
+= dstComponents
;
3737 GLubyte
*dst
= dest
;
3739 for (i
= 0; i
< n
; i
++) {
3740 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3741 dst
+= dstComponents
;
3746 GLubyte
*dst
= dest
;
3748 for (i
= 0; i
< n
; i
++) {
3749 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3750 dst
+= dstComponents
;
3755 GLubyte
*dst
= dest
;
3758 assert(dstComponents
== 1);
3759 for (i
= 0; i
< n
; i
++) {
3760 /* Intensity comes from red channel */
3761 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3766 GLubyte
*dst
= dest
;
3769 for (i
= 0; i
< n
; i
++) {
3770 /* Luminance comes from red channel */
3771 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3772 dst
+= dstComponents
;
3782 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3783 * instead of GLubyte.
3786 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3787 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3788 GLenum srcFormat
, GLenum srcType
,
3789 const GLvoid
*source
,
3790 const struct gl_pixelstore_attrib
*srcPacking
,
3791 GLbitfield transferOps
)
3793 ASSERT(dstFormat
== GL_ALPHA
||
3794 dstFormat
== GL_LUMINANCE
||
3795 dstFormat
== GL_LUMINANCE_ALPHA
||
3796 dstFormat
== GL_INTENSITY
||
3797 dstFormat
== GL_RED
||
3798 dstFormat
== GL_RG
||
3799 dstFormat
== GL_RGB
||
3800 dstFormat
== GL_RGBA
);
3802 ASSERT(srcFormat
== GL_RED
||
3803 srcFormat
== GL_GREEN
||
3804 srcFormat
== GL_BLUE
||
3805 srcFormat
== GL_ALPHA
||
3806 srcFormat
== GL_LUMINANCE
||
3807 srcFormat
== GL_LUMINANCE_ALPHA
||
3808 srcFormat
== GL_INTENSITY
||
3809 srcFormat
== GL_RG
||
3810 srcFormat
== GL_RGB
||
3811 srcFormat
== GL_BGR
||
3812 srcFormat
== GL_RGBA
||
3813 srcFormat
== GL_BGRA
||
3814 srcFormat
== GL_ABGR_EXT
||
3815 srcFormat
== GL_RED_INTEGER_EXT
||
3816 srcFormat
== GL_GREEN_INTEGER_EXT
||
3817 srcFormat
== GL_BLUE_INTEGER_EXT
||
3818 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3819 srcFormat
== GL_RG_INTEGER
||
3820 srcFormat
== GL_RGB_INTEGER_EXT
||
3821 srcFormat
== GL_RGBA_INTEGER_EXT
||
3822 srcFormat
== GL_BGR_INTEGER_EXT
||
3823 srcFormat
== GL_BGRA_INTEGER_EXT
||
3824 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3825 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3826 srcFormat
== GL_COLOR_INDEX
);
3828 ASSERT(srcType
== GL_BITMAP
||
3829 srcType
== GL_UNSIGNED_BYTE
||
3830 srcType
== GL_BYTE
||
3831 srcType
== GL_UNSIGNED_SHORT
||
3832 srcType
== GL_SHORT
||
3833 srcType
== GL_UNSIGNED_INT
||
3834 srcType
== GL_INT
||
3835 srcType
== GL_HALF_FLOAT_ARB
||
3836 srcType
== GL_FLOAT
||
3837 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3838 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3839 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3840 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3841 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3842 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3843 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3844 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3845 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3846 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3847 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3848 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3849 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3850 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3852 /* general solution, no special cases, yet */
3854 GLint dstComponents
;
3855 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3856 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3857 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3860 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3864 dstComponents
= _mesa_components_in_format( dstFormat
);
3865 /* source & dest image formats should have been error checked by now */
3866 assert(dstComponents
> 0);
3868 /* EXT_texture_integer specifies no transfer ops on integer
3869 * types in the resolved issues section. Just set them to 0
3870 * for integer surfaces.
3876 * Extract image data and convert to RGBA floats
3878 if (srcFormat
== GL_COLOR_INDEX
) {
3879 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3882 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3887 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3890 /* Convert indexes to RGBA */
3891 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3892 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3894 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3896 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3897 * with color indexes.
3899 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3904 /* non-color index data */
3905 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3906 srcPacking
->SwapBytes
);
3910 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3913 get_component_indexes(dstFormat
,
3914 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3916 /* Now pack results in the requested dstFormat */
3918 GLfloat
*dst
= dest
;
3920 for (i
= 0; i
< n
; i
++) {
3921 dst
[rDst
] = rgba
[i
][RCOMP
];
3922 dst
+= dstComponents
;
3927 GLfloat
*dst
= dest
;
3929 for (i
= 0; i
< n
; i
++) {
3930 dst
[gDst
] = rgba
[i
][GCOMP
];
3931 dst
+= dstComponents
;
3936 GLfloat
*dst
= dest
;
3938 for (i
= 0; i
< n
; i
++) {
3939 dst
[bDst
] = rgba
[i
][BCOMP
];
3940 dst
+= dstComponents
;
3945 GLfloat
*dst
= dest
;
3947 for (i
= 0; i
< n
; i
++) {
3948 dst
[aDst
] = rgba
[i
][ACOMP
];
3949 dst
+= dstComponents
;
3954 GLfloat
*dst
= dest
;
3957 assert(dstComponents
== 1);
3958 for (i
= 0; i
< n
; i
++) {
3959 /* Intensity comes from red channel */
3960 dst
[i
] = rgba
[i
][RCOMP
];
3965 GLfloat
*dst
= dest
;
3968 for (i
= 0; i
< n
; i
++) {
3969 /* Luminance comes from red channel */
3970 dst
[0] = rgba
[i
][RCOMP
];
3971 dst
+= dstComponents
;
3981 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3982 * instead of GLubyte.
3983 * No pixel transfer ops are applied.
3986 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3987 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3988 GLenum srcFormat
, GLenum srcType
,
3989 const GLvoid
*source
,
3990 const struct gl_pixelstore_attrib
*srcPacking
)
3992 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3995 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3999 ASSERT(dstFormat
== GL_ALPHA
||
4000 dstFormat
== GL_LUMINANCE
||
4001 dstFormat
== GL_LUMINANCE_ALPHA
||
4002 dstFormat
== GL_INTENSITY
||
4003 dstFormat
== GL_RED
||
4004 dstFormat
== GL_RG
||
4005 dstFormat
== GL_RGB
||
4006 dstFormat
== GL_RGBA
);
4008 ASSERT(srcFormat
== GL_RED
||
4009 srcFormat
== GL_GREEN
||
4010 srcFormat
== GL_BLUE
||
4011 srcFormat
== GL_ALPHA
||
4012 srcFormat
== GL_LUMINANCE
||
4013 srcFormat
== GL_LUMINANCE_ALPHA
||
4014 srcFormat
== GL_INTENSITY
||
4015 srcFormat
== GL_RG
||
4016 srcFormat
== GL_RGB
||
4017 srcFormat
== GL_BGR
||
4018 srcFormat
== GL_RGBA
||
4019 srcFormat
== GL_BGRA
||
4020 srcFormat
== GL_ABGR_EXT
||
4021 srcFormat
== GL_RED_INTEGER_EXT
||
4022 srcFormat
== GL_GREEN_INTEGER_EXT
||
4023 srcFormat
== GL_BLUE_INTEGER_EXT
||
4024 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4025 srcFormat
== GL_RG_INTEGER
||
4026 srcFormat
== GL_RGB_INTEGER_EXT
||
4027 srcFormat
== GL_RGBA_INTEGER_EXT
||
4028 srcFormat
== GL_BGR_INTEGER_EXT
||
4029 srcFormat
== GL_BGRA_INTEGER_EXT
||
4030 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4031 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4033 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4034 srcType
== GL_BYTE
||
4035 srcType
== GL_UNSIGNED_SHORT
||
4036 srcType
== GL_SHORT
||
4037 srcType
== GL_UNSIGNED_INT
||
4038 srcType
== GL_INT
||
4039 srcType
== GL_HALF_FLOAT_ARB
||
4040 srcType
== GL_FLOAT
||
4041 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4042 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4043 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4044 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4045 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4046 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4047 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4048 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4049 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4050 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4051 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4052 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4053 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4054 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4057 /* Extract image data as uint[4] pixels */
4058 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4059 srcPacking
->SwapBytes
);
4061 if (dstFormat
== GL_RGBA
) {
4063 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4067 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4068 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4070 assert(dstComponents
> 0);
4072 get_component_indexes(dstFormat
,
4073 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4075 /* Now pack values in the requested dest format */
4079 for (i
= 0; i
< n
; i
++) {
4080 dst
[rDst
] = rgba
[i
][RCOMP
];
4081 dst
+= dstComponents
;
4088 for (i
= 0; i
< n
; i
++) {
4089 dst
[gDst
] = rgba
[i
][GCOMP
];
4090 dst
+= dstComponents
;
4097 for (i
= 0; i
< n
; i
++) {
4098 dst
[bDst
] = rgba
[i
][BCOMP
];
4099 dst
+= dstComponents
;
4106 for (i
= 0; i
< n
; i
++) {
4107 dst
[aDst
] = rgba
[i
][ACOMP
];
4108 dst
+= dstComponents
;
4116 assert(dstComponents
== 1);
4117 for (i
= 0; i
< n
; i
++) {
4118 /* Intensity comes from red channel */
4119 dst
[i
] = rgba
[i
][RCOMP
];
4127 for (i
= 0; i
< n
; i
++) {
4128 /* Luminance comes from red channel */
4129 dst
[0] = rgba
[i
][RCOMP
];
4130 dst
+= dstComponents
;
4141 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4142 * directly return GLbyte data, no transfer ops apply.
4145 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4146 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4147 GLenum srcFormat
, GLenum srcType
,
4148 const GLvoid
*source
,
4149 const struct gl_pixelstore_attrib
*srcPacking
,
4150 GLbitfield transferOps
)
4152 ASSERT(dstFormat
== GL_DUDV_ATI
);
4153 ASSERT(srcFormat
== GL_DUDV_ATI
||
4154 srcFormat
== GL_DU8DV8_ATI
);
4156 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4157 srcType
== GL_BYTE
||
4158 srcType
== GL_UNSIGNED_SHORT
||
4159 srcType
== GL_SHORT
||
4160 srcType
== GL_UNSIGNED_INT
||
4161 srcType
== GL_INT
||
4162 srcType
== GL_HALF_FLOAT_ARB
||
4163 srcType
== GL_FLOAT
);
4165 /* general solution */
4167 GLint dstComponents
;
4170 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4173 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4177 dstComponents
= _mesa_components_in_format( dstFormat
);
4178 /* source & dest image formats should have been error checked by now */
4179 assert(dstComponents
> 0);
4182 * Extract image data and convert to RGBA floats
4184 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4185 srcPacking
->SwapBytes
);
4188 /* Now determine which color channels we need to produce.
4189 * And determine the dest index (offset) within each color tuple.
4192 /* Now pack results in the requested dstFormat */
4193 for (i
= 0; i
< n
; i
++) {
4194 /* not sure - need clamp[-1,1] here? */
4195 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4196 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4197 dst
+= dstComponents
;
4205 * Unpack a row of color index data from a client buffer according to
4206 * the pixel unpacking parameters.
4207 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4209 * Args: ctx - the context
4210 * n - number of pixels
4211 * dstType - destination data type
4212 * dest - destination array
4213 * srcType - source pixel type
4214 * source - source data pointer
4215 * srcPacking - pixel unpacking parameters
4216 * transferOps - the pixel transfer operations to apply
4219 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4220 GLenum dstType
, GLvoid
*dest
,
4221 GLenum srcType
, const GLvoid
*source
,
4222 const struct gl_pixelstore_attrib
*srcPacking
,
4223 GLbitfield transferOps
)
4225 ASSERT(srcType
== GL_BITMAP
||
4226 srcType
== GL_UNSIGNED_BYTE
||
4227 srcType
== GL_BYTE
||
4228 srcType
== GL_UNSIGNED_SHORT
||
4229 srcType
== GL_SHORT
||
4230 srcType
== GL_UNSIGNED_INT
||
4231 srcType
== GL_INT
||
4232 srcType
== GL_HALF_FLOAT_ARB
||
4233 srcType
== GL_FLOAT
);
4235 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4236 dstType
== GL_UNSIGNED_SHORT
||
4237 dstType
== GL_UNSIGNED_INT
);
4240 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4243 * Try simple cases first
4245 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4246 && dstType
== GL_UNSIGNED_BYTE
) {
4247 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4249 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4250 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4251 memcpy(dest
, source
, n
* sizeof(GLuint
));
4257 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4260 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4264 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4268 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4270 /* convert to dest type */
4272 case GL_UNSIGNED_BYTE
:
4274 GLubyte
*dst
= (GLubyte
*) dest
;
4276 for (i
= 0; i
< n
; i
++) {
4277 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4281 case GL_UNSIGNED_SHORT
:
4283 GLuint
*dst
= (GLuint
*) dest
;
4285 for (i
= 0; i
< n
; i
++) {
4286 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4290 case GL_UNSIGNED_INT
:
4291 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4294 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4303 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4304 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4305 const struct gl_pixelstore_attrib
*dstPacking
,
4306 GLbitfield transferOps
)
4308 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4311 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4315 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4317 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4318 /* make a copy of input */
4319 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4320 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4325 case GL_UNSIGNED_BYTE
:
4327 GLubyte
*dst
= (GLubyte
*) dest
;
4329 for (i
= 0; i
< n
; i
++) {
4330 *dst
++ = (GLubyte
) source
[i
];
4336 GLbyte
*dst
= (GLbyte
*) dest
;
4338 for (i
= 0; i
< n
; i
++) {
4339 dst
[i
] = (GLbyte
) source
[i
];
4343 case GL_UNSIGNED_SHORT
:
4345 GLushort
*dst
= (GLushort
*) dest
;
4347 for (i
= 0; i
< n
; i
++) {
4348 dst
[i
] = (GLushort
) source
[i
];
4350 if (dstPacking
->SwapBytes
) {
4351 _mesa_swap2( (GLushort
*) dst
, n
);
4357 GLshort
*dst
= (GLshort
*) dest
;
4359 for (i
= 0; i
< n
; i
++) {
4360 dst
[i
] = (GLshort
) source
[i
];
4362 if (dstPacking
->SwapBytes
) {
4363 _mesa_swap2( (GLushort
*) dst
, n
);
4367 case GL_UNSIGNED_INT
:
4369 GLuint
*dst
= (GLuint
*) dest
;
4371 for (i
= 0; i
< n
; i
++) {
4372 dst
[i
] = (GLuint
) source
[i
];
4374 if (dstPacking
->SwapBytes
) {
4375 _mesa_swap4( (GLuint
*) dst
, n
);
4381 GLint
*dst
= (GLint
*) dest
;
4383 for (i
= 0; i
< n
; i
++) {
4384 dst
[i
] = (GLint
) source
[i
];
4386 if (dstPacking
->SwapBytes
) {
4387 _mesa_swap4( (GLuint
*) dst
, n
);
4393 GLfloat
*dst
= (GLfloat
*) dest
;
4395 for (i
= 0; i
< n
; i
++) {
4396 dst
[i
] = (GLfloat
) source
[i
];
4398 if (dstPacking
->SwapBytes
) {
4399 _mesa_swap4( (GLuint
*) dst
, n
);
4403 case GL_HALF_FLOAT_ARB
:
4405 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4407 for (i
= 0; i
< n
; i
++) {
4408 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4410 if (dstPacking
->SwapBytes
) {
4411 _mesa_swap2( (GLushort
*) dst
, n
);
4416 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4424 * Unpack a row of stencil data from a client buffer according to
4425 * the pixel unpacking parameters.
4426 * This is (or will be) used by glDrawPixels
4428 * Args: ctx - the context
4429 * n - number of pixels
4430 * dstType - destination data type
4431 * dest - destination array
4432 * srcType - source pixel type
4433 * source - source data pointer
4434 * srcPacking - pixel unpacking parameters
4435 * transferOps - apply offset/bias/lookup ops?
4438 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4439 GLenum dstType
, GLvoid
*dest
,
4440 GLenum srcType
, const GLvoid
*source
,
4441 const struct gl_pixelstore_attrib
*srcPacking
,
4442 GLbitfield transferOps
)
4444 ASSERT(srcType
== GL_BITMAP
||
4445 srcType
== GL_UNSIGNED_BYTE
||
4446 srcType
== GL_BYTE
||
4447 srcType
== GL_UNSIGNED_SHORT
||
4448 srcType
== GL_SHORT
||
4449 srcType
== GL_UNSIGNED_INT
||
4450 srcType
== GL_INT
||
4451 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4452 srcType
== GL_HALF_FLOAT_ARB
||
4453 srcType
== GL_FLOAT
||
4454 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4456 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4457 dstType
== GL_UNSIGNED_SHORT
||
4458 dstType
== GL_UNSIGNED_INT
||
4459 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4461 /* only shift and offset apply to stencil */
4462 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4465 * Try simple cases first
4467 if (transferOps
== 0 &&
4468 !ctx
->Pixel
.MapStencilFlag
&&
4469 srcType
== GL_UNSIGNED_BYTE
&&
4470 dstType
== GL_UNSIGNED_BYTE
) {
4471 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4473 else if (transferOps
== 0 &&
4474 !ctx
->Pixel
.MapStencilFlag
&&
4475 srcType
== GL_UNSIGNED_INT
&&
4476 dstType
== GL_UNSIGNED_INT
&&
4477 !srcPacking
->SwapBytes
) {
4478 memcpy(dest
, source
, n
* sizeof(GLuint
));
4484 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4487 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4491 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4494 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4495 /* shift and offset indexes */
4496 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4499 if (ctx
->Pixel
.MapStencilFlag
) {
4500 /* Apply stencil lookup table */
4501 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4503 for (i
= 0; i
< n
; i
++) {
4504 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4508 /* convert to dest type */
4510 case GL_UNSIGNED_BYTE
:
4512 GLubyte
*dst
= (GLubyte
*) dest
;
4514 for (i
= 0; i
< n
; i
++) {
4515 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4519 case GL_UNSIGNED_SHORT
:
4521 GLuint
*dst
= (GLuint
*) dest
;
4523 for (i
= 0; i
< n
; i
++) {
4524 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4528 case GL_UNSIGNED_INT
:
4529 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4531 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4533 GLuint
*dst
= (GLuint
*) dest
;
4535 for (i
= 0; i
< n
; i
++) {
4536 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4541 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4550 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4551 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4552 const struct gl_pixelstore_attrib
*dstPacking
)
4554 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4557 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4561 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4562 ctx
->Pixel
.MapStencilFlag
) {
4563 /* make a copy of input */
4564 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4565 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4570 case GL_UNSIGNED_BYTE
:
4571 memcpy(dest
, source
, n
);
4575 GLbyte
*dst
= (GLbyte
*) dest
;
4578 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4582 case GL_UNSIGNED_SHORT
:
4584 GLushort
*dst
= (GLushort
*) dest
;
4587 dst
[i
] = (GLushort
) source
[i
];
4589 if (dstPacking
->SwapBytes
) {
4590 _mesa_swap2( (GLushort
*) dst
, n
);
4596 GLshort
*dst
= (GLshort
*) dest
;
4599 dst
[i
] = (GLshort
) source
[i
];
4601 if (dstPacking
->SwapBytes
) {
4602 _mesa_swap2( (GLushort
*) dst
, n
);
4606 case GL_UNSIGNED_INT
:
4608 GLuint
*dst
= (GLuint
*) dest
;
4611 dst
[i
] = (GLuint
) source
[i
];
4613 if (dstPacking
->SwapBytes
) {
4614 _mesa_swap4( (GLuint
*) dst
, n
);
4620 GLint
*dst
= (GLint
*) dest
;
4623 dst
[i
] = (GLint
) source
[i
];
4625 if (dstPacking
->SwapBytes
) {
4626 _mesa_swap4( (GLuint
*) dst
, n
);
4632 GLfloat
*dst
= (GLfloat
*) dest
;
4635 dst
[i
] = (GLfloat
) source
[i
];
4637 if (dstPacking
->SwapBytes
) {
4638 _mesa_swap4( (GLuint
*) dst
, n
);
4642 case GL_HALF_FLOAT_ARB
:
4644 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4647 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4649 if (dstPacking
->SwapBytes
) {
4650 _mesa_swap2( (GLushort
*) dst
, n
);
4655 if (dstPacking
->LsbFirst
) {
4656 GLubyte
*dst
= (GLubyte
*) dest
;
4659 for (i
= 0; i
< n
; i
++) {
4662 *dst
|= ((source
[i
] != 0) << shift
);
4671 GLubyte
*dst
= (GLubyte
*) dest
;
4674 for (i
= 0; i
< n
; i
++) {
4677 *dst
|= ((source
[i
] != 0) << shift
);
4687 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4693 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4696 const GLTYPE *src = (const GLTYPE *)source; \
4697 for (i = 0; i < n; i++) { \
4698 GLTYPE value = src[i]; \
4699 if (srcPacking->SwapBytes) { \
4700 if (sizeof(GLTYPE) == 2) { \
4702 } else if (sizeof(GLTYPE) == 4) { \
4706 depthValues[i] = GLTYPE2FLOAT(value); \
4712 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4713 * or GLfloat values.
4714 * The glPixelTransfer (scale/bias) params will be applied.
4716 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4717 * \param depthMax max value for returned GLushort or GLuint values
4718 * (ignored for GLfloat).
4721 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4722 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4723 GLenum srcType
, const GLvoid
*source
,
4724 const struct gl_pixelstore_attrib
*srcPacking
)
4726 GLfloat
*depthTemp
= NULL
, *depthValues
;
4727 GLboolean needClamp
= GL_FALSE
;
4729 /* Look for special cases first.
4730 * Not only are these faster, they're less prone to numeric conversion
4731 * problems. Otherwise, converting from an int type to a float then
4732 * back to an int type can introduce errors that will show up as
4733 * artifacts in things like depth peeling which uses glCopyTexImage.
4735 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4736 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4737 const GLuint
*src
= (const GLuint
*) source
;
4738 GLushort
*dst
= (GLushort
*) dest
;
4740 for (i
= 0; i
< n
; i
++) {
4741 dst
[i
] = src
[i
] >> 16;
4745 if (srcType
== GL_UNSIGNED_SHORT
4746 && dstType
== GL_UNSIGNED_INT
4747 && depthMax
== 0xffffffff) {
4748 const GLushort
*src
= (const GLushort
*) source
;
4749 GLuint
*dst
= (GLuint
*) dest
;
4751 for (i
= 0; i
< n
; i
++) {
4752 dst
[i
] = src
[i
] | (src
[i
] << 16);
4756 if (srcType
== GL_UNSIGNED_INT_24_8
4757 && dstType
== GL_UNSIGNED_INT
4758 && depthMax
== 0xffffff) {
4759 const GLuint
*src
= (const GLuint
*) source
;
4760 GLuint
*dst
= (GLuint
*) dest
;
4762 for (i
= 0; i
< n
; i
++) {
4763 dst
[i
] = src
[i
] >> 8;
4767 /* XXX may want to add additional cases here someday */
4770 /* general case path follows */
4772 if (dstType
== GL_FLOAT
) {
4773 depthValues
= (GLfloat
*) dest
;
4776 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4778 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4782 depthValues
= depthTemp
;
4785 /* Convert incoming values to GLfloat. Some conversions will require
4790 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4791 needClamp
= GL_TRUE
;
4793 case GL_UNSIGNED_BYTE
:
4794 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4797 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4798 needClamp
= GL_TRUE
;
4800 case GL_UNSIGNED_SHORT
:
4801 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4804 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4805 needClamp
= GL_TRUE
;
4807 case GL_UNSIGNED_INT
:
4808 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4810 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4811 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4812 depthMax
== 0xffffff &&
4813 ctx
->Pixel
.DepthScale
== 1.0 &&
4814 ctx
->Pixel
.DepthBias
== 0.0) {
4815 const GLuint
*src
= (const GLuint
*) source
;
4816 GLuint
*zValues
= (GLuint
*) dest
;
4818 for (i
= 0; i
< n
; i
++) {
4819 GLuint value
= src
[i
];
4820 if (srcPacking
->SwapBytes
) {
4823 zValues
[i
] = value
& 0xffffff00;
4829 const GLuint
*src
= (const GLuint
*) source
;
4830 const GLfloat scale
= 1.0f
/ 0xffffff;
4832 for (i
= 0; i
< n
; i
++) {
4833 GLuint value
= src
[i
];
4834 if (srcPacking
->SwapBytes
) {
4837 depthValues
[i
] = (value
>> 8) * scale
;
4841 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4844 const GLfloat
*src
= (const GLfloat
*)source
;
4845 for (i
= 0; i
< n
; i
++) {
4846 GLfloat value
= src
[i
* 2];
4847 if (srcPacking
->SwapBytes
) {
4850 depthValues
[i
] = value
;
4852 needClamp
= GL_TRUE
;
4856 DEPTH_VALUES(GLfloat
, 1*);
4857 needClamp
= GL_TRUE
;
4859 case GL_HALF_FLOAT_ARB
:
4862 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4863 for (i
= 0; i
< n
; i
++) {
4864 GLhalfARB value
= src
[i
];
4865 if (srcPacking
->SwapBytes
) {
4868 depthValues
[i
] = _mesa_half_to_float(value
);
4870 needClamp
= GL_TRUE
;
4874 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4879 /* apply depth scale and bias */
4881 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4882 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4883 if (scale
!= 1.0 || bias
!= 0.0) {
4885 for (i
= 0; i
< n
; i
++) {
4886 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4888 needClamp
= GL_TRUE
;
4892 /* clamp to [0, 1] */
4895 for (i
= 0; i
< n
; i
++) {
4896 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4901 * Convert values to dstType
4903 if (dstType
== GL_UNSIGNED_INT
) {
4904 GLuint
*zValues
= (GLuint
*) dest
;
4906 if (depthMax
<= 0xffffff) {
4907 /* no overflow worries */
4908 for (i
= 0; i
< n
; i
++) {
4909 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4913 /* need to use double precision to prevent overflow problems */
4914 for (i
= 0; i
< n
; i
++) {
4915 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4916 if (z
>= (GLdouble
) 0xffffffff)
4917 zValues
[i
] = 0xffffffff;
4919 zValues
[i
] = (GLuint
) z
;
4923 else if (dstType
== GL_UNSIGNED_SHORT
) {
4924 GLushort
*zValues
= (GLushort
*) dest
;
4926 ASSERT(depthMax
<= 0xffff);
4927 for (i
= 0; i
< n
; i
++) {
4928 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4931 else if (dstType
== GL_FLOAT
) {
4932 /* Nothing to do. depthValues is pointing to dest. */
4934 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4935 GLfloat
*zValues
= (GLfloat
*) dest
;
4937 for (i
= 0; i
< n
; i
++) {
4938 zValues
[i
*2] = depthValues
[i
];
4950 * Pack an array of depth values. The values are floats in [0,1].
4953 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4954 GLenum dstType
, const GLfloat
*depthSpan
,
4955 const struct gl_pixelstore_attrib
*dstPacking
)
4957 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4959 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4963 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4964 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4965 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4966 depthSpan
= depthCopy
;
4970 case GL_UNSIGNED_BYTE
:
4972 GLubyte
*dst
= (GLubyte
*) dest
;
4974 for (i
= 0; i
< n
; i
++) {
4975 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4981 GLbyte
*dst
= (GLbyte
*) dest
;
4983 for (i
= 0; i
< n
; i
++) {
4984 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4988 case GL_UNSIGNED_SHORT
:
4990 GLushort
*dst
= (GLushort
*) dest
;
4992 for (i
= 0; i
< n
; i
++) {
4993 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4995 if (dstPacking
->SwapBytes
) {
4996 _mesa_swap2( (GLushort
*) dst
, n
);
5002 GLshort
*dst
= (GLshort
*) dest
;
5004 for (i
= 0; i
< n
; i
++) {
5005 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5007 if (dstPacking
->SwapBytes
) {
5008 _mesa_swap2( (GLushort
*) dst
, n
);
5012 case GL_UNSIGNED_INT
:
5014 GLuint
*dst
= (GLuint
*) dest
;
5016 for (i
= 0; i
< n
; i
++) {
5017 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5019 if (dstPacking
->SwapBytes
) {
5020 _mesa_swap4( (GLuint
*) dst
, n
);
5026 GLint
*dst
= (GLint
*) dest
;
5028 for (i
= 0; i
< n
; i
++) {
5029 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5031 if (dstPacking
->SwapBytes
) {
5032 _mesa_swap4( (GLuint
*) dst
, n
);
5038 GLfloat
*dst
= (GLfloat
*) dest
;
5040 for (i
= 0; i
< n
; i
++) {
5041 dst
[i
] = depthSpan
[i
];
5043 if (dstPacking
->SwapBytes
) {
5044 _mesa_swap4( (GLuint
*) dst
, n
);
5048 case GL_HALF_FLOAT_ARB
:
5050 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5052 for (i
= 0; i
< n
; i
++) {
5053 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5055 if (dstPacking
->SwapBytes
) {
5056 _mesa_swap2( (GLushort
*) dst
, n
);
5061 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5070 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5073 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5074 GLenum dstType
, GLuint
*dest
,
5075 const GLfloat
*depthVals
,
5076 const GLubyte
*stencilVals
,
5077 const struct gl_pixelstore_attrib
*dstPacking
)
5079 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5080 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5083 if (!depthCopy
|| !stencilCopy
) {
5084 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5090 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5091 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5092 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5093 depthVals
= depthCopy
;
5096 if (ctx
->Pixel
.IndexShift
||
5097 ctx
->Pixel
.IndexOffset
||
5098 ctx
->Pixel
.MapStencilFlag
) {
5099 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5100 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5101 stencilVals
= stencilCopy
;
5105 case GL_UNSIGNED_INT_24_8
:
5106 for (i
= 0; i
< n
; i
++) {
5107 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5108 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5111 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5112 for (i
= 0; i
< n
; i
++) {
5113 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5114 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5119 if (dstPacking
->SwapBytes
) {
5120 _mesa_swap4(dest
, n
);
5131 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5132 * Return all image data in a contiguous block. This is used when we
5133 * compile glDrawPixels, glTexImage, etc into a display list. We
5134 * need a copy of the data in a standard format.
5137 _mesa_unpack_image( GLuint dimensions
,
5138 GLsizei width
, GLsizei height
, GLsizei depth
,
5139 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5140 const struct gl_pixelstore_attrib
*unpack
)
5142 GLint bytesPerRow
, compsPerRow
;
5143 GLboolean flipBytes
, swap2
, swap4
;
5146 return NULL
; /* not necessarily an error */
5148 if (width
<= 0 || height
<= 0 || depth
<= 0)
5149 return NULL
; /* generate error later */
5151 if (type
== GL_BITMAP
) {
5152 bytesPerRow
= (width
+ 7) >> 3;
5153 flipBytes
= unpack
->LsbFirst
;
5154 swap2
= swap4
= GL_FALSE
;
5158 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5159 GLint components
= _mesa_components_in_format(format
);
5162 if (_mesa_type_is_packed(type
))
5165 if (bytesPerPixel
<= 0 || components
<= 0)
5166 return NULL
; /* bad format or type. generate error later */
5167 bytesPerRow
= bytesPerPixel
* width
;
5168 bytesPerComp
= bytesPerPixel
/ components
;
5169 flipBytes
= GL_FALSE
;
5170 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5171 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5172 compsPerRow
= components
* width
;
5173 assert(compsPerRow
>= width
);
5178 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5182 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5185 for (img
= 0; img
< depth
; img
++) {
5186 for (row
= 0; row
< height
; row
++) {
5187 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5188 width
, height
, format
, type
, img
, row
, 0);
5190 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5192 flipBytes
= GL_FALSE
;
5193 if (unpack
->LsbFirst
) {
5194 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5195 GLubyte dstMask
= 128;
5196 const GLubyte
*s
= src
;
5199 for (i
= 0; i
< width
; i
++) {
5203 if (srcMask
== 128) {
5208 srcMask
= srcMask
<< 1;
5216 dstMask
= dstMask
>> 1;
5221 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5222 GLubyte dstMask
= 128;
5223 const GLubyte
*s
= src
;
5226 for (i
= 0; i
< width
; i
++) {
5235 srcMask
= srcMask
>> 1;
5243 dstMask
= dstMask
>> 1;
5249 memcpy(dst
, src
, bytesPerRow
);
5252 /* byte flipping/swapping */
5254 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5257 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5260 _mesa_swap4((GLuint
*) dst
, compsPerRow
);