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
];
695 case GL_RGB_INTEGER_EXT
:
697 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
698 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
699 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
702 case GL_RGBA_INTEGER_EXT
:
704 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
705 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
706 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
707 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
710 case GL_BGR_INTEGER_EXT
:
712 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
713 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
714 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
717 case GL_BGRA_INTEGER_EXT
:
719 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
720 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
721 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
722 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
725 case GL_LUMINANCE_INTEGER_EXT
:
727 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
730 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
733 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
735 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
743 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
744 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
748 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
754 GLbyte
*dst
= (GLbyte
*) dstAddr
;
758 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
762 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
766 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
770 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
774 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
776 case GL_LUMINANCE_ALPHA
:
778 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
779 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
784 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
785 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
790 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
791 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
792 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
797 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
798 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
799 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
800 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
805 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
806 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
807 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
812 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
813 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
814 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
815 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
820 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
821 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
822 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
823 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
826 case GL_RED_INTEGER_EXT
:
828 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
831 case GL_GREEN_INTEGER_EXT
:
833 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
836 case GL_BLUE_INTEGER_EXT
:
838 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
841 case GL_ALPHA_INTEGER_EXT
:
843 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
846 case GL_RGB_INTEGER_EXT
:
848 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
849 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
850 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
853 case GL_RGBA_INTEGER_EXT
:
855 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
856 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
857 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
858 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
861 case GL_BGR_INTEGER_EXT
:
863 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
864 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
865 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
868 case GL_BGRA_INTEGER_EXT
:
870 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
871 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
872 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
873 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
876 case GL_LUMINANCE_INTEGER_EXT
:
878 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
881 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
884 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
886 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
894 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
895 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
899 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
903 case GL_UNSIGNED_SHORT
:
905 GLushort
*dst
= (GLushort
*) dstAddr
;
909 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
913 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
917 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
921 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
925 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
927 case GL_LUMINANCE_ALPHA
:
929 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
930 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
935 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
936 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
941 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
942 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
943 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
948 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
949 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
950 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
951 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
956 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
957 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
958 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
963 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
964 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
965 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
966 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
971 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
972 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
973 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
974 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
977 case GL_RED_INTEGER_EXT
:
979 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
982 case GL_GREEN_INTEGER_EXT
:
984 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
987 case GL_BLUE_INTEGER_EXT
:
989 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
992 case GL_ALPHA_INTEGER_EXT
:
994 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
997 case GL_RGB_INTEGER_EXT
:
999 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1000 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1001 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1004 case GL_RGBA_INTEGER_EXT
:
1006 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1007 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1008 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1009 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1012 case GL_BGR_INTEGER_EXT
:
1014 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1015 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1016 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1019 case GL_BGRA_INTEGER_EXT
:
1021 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1022 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1023 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1024 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1027 case GL_LUMINANCE_INTEGER_EXT
:
1029 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1032 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1035 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1037 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1045 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1046 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1050 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1056 GLshort
*dst
= (GLshort
*) dstAddr
;
1057 switch (dstFormat
) {
1060 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1064 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1068 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1072 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1076 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1078 case GL_LUMINANCE_ALPHA
:
1080 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1081 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1086 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1087 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1092 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1093 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1094 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1099 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1100 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1101 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1102 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1107 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1108 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1109 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1114 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1115 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1116 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1117 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1122 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1123 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1124 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1125 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1128 case GL_RED_INTEGER_EXT
:
1130 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1133 case GL_GREEN_INTEGER_EXT
:
1135 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1138 case GL_BLUE_INTEGER_EXT
:
1140 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1143 case GL_ALPHA_INTEGER_EXT
:
1145 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1148 case GL_RGB_INTEGER_EXT
:
1150 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1151 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1152 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1155 case GL_RGBA_INTEGER_EXT
:
1157 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1158 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1159 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1160 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1163 case GL_BGR_INTEGER_EXT
:
1165 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1166 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1167 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1170 case GL_BGRA_INTEGER_EXT
:
1172 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1173 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1174 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1175 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1178 case GL_LUMINANCE_INTEGER_EXT
:
1180 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1183 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1186 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1188 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1196 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1197 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1201 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1205 case GL_UNSIGNED_INT
:
1207 GLuint
*dst
= (GLuint
*) dstAddr
;
1208 switch (dstFormat
) {
1211 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1215 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1219 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1223 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1227 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1229 case GL_LUMINANCE_ALPHA
:
1231 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1232 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1237 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1238 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1243 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1244 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1245 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1250 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1251 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1252 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1253 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1258 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1259 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1260 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1265 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1266 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1267 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1268 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1273 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1274 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1275 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1276 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1279 case GL_RED_INTEGER_EXT
:
1281 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1284 case GL_GREEN_INTEGER_EXT
:
1286 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1289 case GL_BLUE_INTEGER_EXT
:
1291 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1294 case GL_ALPHA_INTEGER_EXT
:
1296 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1299 case GL_RGB_INTEGER_EXT
:
1301 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1302 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1303 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1306 case GL_RGBA_INTEGER_EXT
:
1308 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1309 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1310 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1311 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1314 case GL_BGR_INTEGER_EXT
:
1316 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1317 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1318 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1321 case GL_BGRA_INTEGER_EXT
:
1323 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1324 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1325 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1326 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1329 case GL_LUMINANCE_INTEGER_EXT
:
1331 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1334 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1337 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1339 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1347 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1348 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1352 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1358 GLint
*dst
= (GLint
*) dstAddr
;
1359 switch (dstFormat
) {
1362 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1366 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1370 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1374 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1378 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1380 case GL_LUMINANCE_ALPHA
:
1382 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1383 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1388 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1389 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1394 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1395 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1396 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1401 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1402 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1403 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1404 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1409 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1410 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1411 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1416 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1417 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1418 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1419 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1424 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1425 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1426 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1427 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1433 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1434 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1437 case GL_RED_INTEGER_EXT
:
1439 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1442 case GL_GREEN_INTEGER_EXT
:
1444 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1447 case GL_BLUE_INTEGER_EXT
:
1449 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1452 case GL_ALPHA_INTEGER_EXT
:
1454 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1457 case GL_RGB_INTEGER_EXT
:
1459 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1460 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1461 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1464 case GL_RGBA_INTEGER_EXT
:
1466 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1467 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1468 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1469 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1472 case GL_BGR_INTEGER_EXT
:
1474 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1475 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1476 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1479 case GL_BGRA_INTEGER_EXT
:
1481 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1482 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1483 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1484 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1487 case GL_LUMINANCE_INTEGER_EXT
:
1489 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1492 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1495 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1497 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1503 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1509 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1510 switch (dstFormat
) {
1513 dst
[i
] = rgba
[i
][RCOMP
];
1517 dst
[i
] = rgba
[i
][GCOMP
];
1521 dst
[i
] = rgba
[i
][BCOMP
];
1525 dst
[i
] = rgba
[i
][ACOMP
];
1529 dst
[i
] = luminance
[i
];
1531 case GL_LUMINANCE_ALPHA
:
1533 dst
[i
*2+0] = luminance
[i
];
1534 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1539 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1540 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1545 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1546 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1547 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1552 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1553 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1554 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1555 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1560 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1561 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1562 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1567 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1568 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1569 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1570 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1575 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1576 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1577 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1578 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1584 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1585 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1589 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1593 case GL_HALF_FLOAT_ARB
:
1595 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1596 switch (dstFormat
) {
1599 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1603 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1607 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1611 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1615 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1617 case GL_LUMINANCE_ALPHA
:
1619 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1620 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1625 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1626 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1631 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1632 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1633 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1638 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1639 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1640 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1641 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1646 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1647 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1648 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1653 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1654 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1655 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1656 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1661 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1662 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1663 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1664 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1670 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1671 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1675 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1679 case GL_UNSIGNED_BYTE_3_3_2
:
1680 if (dstFormat
== GL_RGB
) {
1681 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1683 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1684 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1685 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1689 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1690 if (dstFormat
== GL_RGB
) {
1691 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1693 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1694 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1695 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1699 case GL_UNSIGNED_SHORT_5_6_5
:
1700 if (dstFormat
== GL_RGB
) {
1701 GLushort
*dst
= (GLushort
*) dstAddr
;
1703 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1704 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1705 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1709 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1710 if (dstFormat
== GL_RGB
) {
1711 GLushort
*dst
= (GLushort
*) dstAddr
;
1713 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1714 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1715 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1719 case GL_UNSIGNED_SHORT_4_4_4_4
:
1720 if (dstFormat
== GL_RGBA
) {
1721 GLushort
*dst
= (GLushort
*) dstAddr
;
1723 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1724 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1725 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1726 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1729 else if (dstFormat
== GL_BGRA
) {
1730 GLushort
*dst
= (GLushort
*) dstAddr
;
1732 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1733 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1734 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1735 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1738 else if (dstFormat
== GL_ABGR_EXT
) {
1739 GLushort
*dst
= (GLushort
*) dstAddr
;
1741 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1742 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1743 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1744 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1748 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1749 if (dstFormat
== GL_RGBA
) {
1750 GLushort
*dst
= (GLushort
*) dstAddr
;
1752 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1753 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1754 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1755 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1758 else if (dstFormat
== GL_BGRA
) {
1759 GLushort
*dst
= (GLushort
*) dstAddr
;
1761 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1762 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1763 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1764 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1767 else if (dstFormat
== GL_ABGR_EXT
) {
1768 GLushort
*dst
= (GLushort
*) dstAddr
;
1770 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1771 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1772 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1773 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1777 case GL_UNSIGNED_SHORT_5_5_5_1
:
1778 if (dstFormat
== GL_RGBA
) {
1779 GLushort
*dst
= (GLushort
*) dstAddr
;
1781 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1782 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1783 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1784 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1787 else if (dstFormat
== GL_BGRA
) {
1788 GLushort
*dst
= (GLushort
*) dstAddr
;
1790 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1791 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1792 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1793 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1796 else if (dstFormat
== GL_ABGR_EXT
) {
1797 GLushort
*dst
= (GLushort
*) dstAddr
;
1799 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1800 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1801 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1802 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1806 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1807 if (dstFormat
== GL_RGBA
) {
1808 GLushort
*dst
= (GLushort
*) dstAddr
;
1810 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1811 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1812 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1813 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1816 else if (dstFormat
== GL_BGRA
) {
1817 GLushort
*dst
= (GLushort
*) dstAddr
;
1819 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1820 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1821 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1822 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1825 else if (dstFormat
== GL_ABGR_EXT
) {
1826 GLushort
*dst
= (GLushort
*) dstAddr
;
1828 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1829 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1830 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1831 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1835 case GL_UNSIGNED_INT_8_8_8_8
:
1836 if (dstFormat
== GL_RGBA
) {
1837 GLuint
*dst
= (GLuint
*) dstAddr
;
1839 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1840 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1841 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1842 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1845 else if (dstFormat
== GL_BGRA
) {
1846 GLuint
*dst
= (GLuint
*) dstAddr
;
1848 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1849 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1850 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1851 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1854 else if (dstFormat
== GL_ABGR_EXT
) {
1855 GLuint
*dst
= (GLuint
*) dstAddr
;
1857 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1858 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1859 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1860 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1864 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1865 if (dstFormat
== GL_RGBA
) {
1866 GLuint
*dst
= (GLuint
*) dstAddr
;
1868 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1869 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1870 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1871 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1874 else if (dstFormat
== GL_BGRA
) {
1875 GLuint
*dst
= (GLuint
*) dstAddr
;
1877 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1878 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1879 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1880 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1883 else if (dstFormat
== GL_ABGR_EXT
) {
1884 GLuint
*dst
= (GLuint
*) dstAddr
;
1886 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1887 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1888 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1889 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1893 case GL_UNSIGNED_INT_10_10_10_2
:
1894 if (dstFormat
== GL_RGBA
) {
1895 GLuint
*dst
= (GLuint
*) dstAddr
;
1897 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1898 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1899 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1900 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1903 else if (dstFormat
== GL_BGRA
) {
1904 GLuint
*dst
= (GLuint
*) dstAddr
;
1906 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1907 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1908 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1909 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1912 else if (dstFormat
== GL_ABGR_EXT
) {
1913 GLuint
*dst
= (GLuint
*) dstAddr
;
1915 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1916 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1917 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1918 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1922 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1923 if (dstFormat
== GL_RGBA
) {
1924 GLuint
*dst
= (GLuint
*) dstAddr
;
1926 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1927 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1928 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1929 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1932 else if (dstFormat
== GL_BGRA
) {
1933 GLuint
*dst
= (GLuint
*) dstAddr
;
1935 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1936 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1937 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1938 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1941 else if (dstFormat
== GL_ABGR_EXT
) {
1942 GLuint
*dst
= (GLuint
*) dstAddr
;
1944 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1945 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1946 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1947 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1951 case GL_UNSIGNED_INT_5_9_9_9_REV
:
1953 GLuint
*dst
= (GLuint
*) dstAddr
;
1954 for (i
= 0; i
< n
; i
++) {
1955 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
1959 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
1961 GLuint
*dst
= (GLuint
*) dstAddr
;
1962 for (i
= 0; i
< n
; i
++) {
1963 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
1968 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1973 if (dstPacking
->SwapBytes
) {
1974 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1975 if (swapSize
== 2) {
1976 if (dstPacking
->SwapBytes
) {
1977 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1980 else if (swapSize
== 4) {
1981 if (dstPacking
->SwapBytes
) {
1982 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1992 #define SWAP2BYTE(VALUE) \
1994 GLubyte *bytes = (GLubyte *) &(VALUE); \
1995 GLubyte tmp = bytes[0]; \
1996 bytes[0] = bytes[1]; \
2000 #define SWAP4BYTE(VALUE) \
2002 GLubyte *bytes = (GLubyte *) &(VALUE); \
2003 GLubyte tmp = bytes[0]; \
2004 bytes[0] = bytes[3]; \
2007 bytes[1] = bytes[2]; \
2013 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2014 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2015 const struct gl_pixelstore_attrib
*unpack
)
2017 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2019 ASSERT(srcType
== GL_BITMAP
||
2020 srcType
== GL_UNSIGNED_BYTE
||
2021 srcType
== GL_BYTE
||
2022 srcType
== GL_UNSIGNED_SHORT
||
2023 srcType
== GL_SHORT
||
2024 srcType
== GL_UNSIGNED_INT
||
2025 srcType
== GL_INT
||
2026 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2027 srcType
== GL_HALF_FLOAT_ARB
||
2028 srcType
== GL_FLOAT
||
2029 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2034 GLubyte
*ubsrc
= (GLubyte
*) src
;
2035 if (unpack
->LsbFirst
) {
2036 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2038 for (i
= 0; i
< n
; i
++) {
2039 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2050 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2052 for (i
= 0; i
< n
; i
++) {
2053 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2065 case GL_UNSIGNED_BYTE
:
2068 const GLubyte
*s
= (const GLubyte
*) src
;
2069 for (i
= 0; i
< n
; i
++)
2076 const GLbyte
*s
= (const GLbyte
*) src
;
2077 for (i
= 0; i
< n
; i
++)
2081 case GL_UNSIGNED_SHORT
:
2084 const GLushort
*s
= (const GLushort
*) src
;
2085 if (unpack
->SwapBytes
) {
2086 for (i
= 0; i
< n
; i
++) {
2087 GLushort value
= s
[i
];
2093 for (i
= 0; i
< n
; i
++)
2101 const GLshort
*s
= (const GLshort
*) src
;
2102 if (unpack
->SwapBytes
) {
2103 for (i
= 0; i
< n
; i
++) {
2104 GLshort value
= s
[i
];
2110 for (i
= 0; i
< n
; i
++)
2115 case GL_UNSIGNED_INT
:
2118 const GLuint
*s
= (const GLuint
*) src
;
2119 if (unpack
->SwapBytes
) {
2120 for (i
= 0; i
< n
; i
++) {
2121 GLuint value
= s
[i
];
2127 for (i
= 0; i
< n
; i
++)
2135 const GLint
*s
= (const GLint
*) src
;
2136 if (unpack
->SwapBytes
) {
2137 for (i
= 0; i
< n
; i
++) {
2144 for (i
= 0; i
< n
; i
++)
2152 const GLfloat
*s
= (const GLfloat
*) src
;
2153 if (unpack
->SwapBytes
) {
2154 for (i
= 0; i
< n
; i
++) {
2155 GLfloat value
= s
[i
];
2157 indexes
[i
] = (GLuint
) value
;
2161 for (i
= 0; i
< n
; i
++)
2162 indexes
[i
] = (GLuint
) s
[i
];
2166 case GL_HALF_FLOAT_ARB
:
2169 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2170 if (unpack
->SwapBytes
) {
2171 for (i
= 0; i
< n
; i
++) {
2172 GLhalfARB value
= s
[i
];
2174 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2178 for (i
= 0; i
< n
; i
++)
2179 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2183 case GL_UNSIGNED_INT_24_8_EXT
:
2186 const GLuint
*s
= (const GLuint
*) src
;
2187 if (unpack
->SwapBytes
) {
2188 for (i
= 0; i
< n
; i
++) {
2189 GLuint value
= s
[i
];
2191 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2195 for (i
= 0; i
< n
; i
++)
2196 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2200 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2203 const GLuint
*s
= (const GLuint
*) src
;
2204 if (unpack
->SwapBytes
) {
2205 for (i
= 0; i
< n
; i
++) {
2206 GLuint value
= s
[i
*2+1];
2208 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2212 for (i
= 0; i
< n
; i
++)
2213 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2219 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2226 * Return source/dest RGBA indexes for unpacking pixels.
2229 get_component_mapping(GLenum format
,
2241 case GL_RED_INTEGER_EXT
:
2243 *gSrc
= *bSrc
= *aSrc
= -1;
2246 case GL_GREEN_INTEGER_EXT
:
2248 *rSrc
= *bSrc
= *aSrc
= -1;
2251 case GL_BLUE_INTEGER_EXT
:
2253 *rSrc
= *gSrc
= *aSrc
= -1;
2256 case GL_ALPHA_INTEGER_EXT
:
2257 *rSrc
= *gSrc
= *bSrc
= -1;
2261 case GL_LUMINANCE_INTEGER_EXT
:
2262 *rSrc
= *gSrc
= *bSrc
= 0;
2265 case GL_LUMINANCE_ALPHA
:
2266 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2267 *rSrc
= *gSrc
= *bSrc
= 0;
2271 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2285 case GL_RGB_INTEGER
:
2296 case GL_BGR_INTEGER
:
2307 case GL_RGBA_INTEGER
:
2318 case GL_BGRA_INTEGER
:
2346 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2347 _mesa_lookup_enum_by_nr(format
));
2355 * This function extracts floating point RGBA values from arbitrary
2356 * image data. srcFormat and srcType are the format and type parameters
2357 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2359 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2360 * implements the "Conversion to floating point", "Conversion to RGB",
2361 * and "Final Expansion to RGBA" operations.
2363 * Args: n - number of pixels
2364 * rgba - output colors
2365 * srcFormat - format of incoming data
2366 * srcType - data type of incoming data
2367 * src - source data pointer
2368 * swapBytes - perform byteswapping of incoming data?
2371 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2372 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2373 GLboolean swapBytes
)
2375 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2377 GLint rDst
, bDst
, gDst
, aDst
;
2378 GLboolean intFormat
;
2379 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2381 ASSERT(srcFormat
== GL_RED
||
2382 srcFormat
== GL_GREEN
||
2383 srcFormat
== GL_BLUE
||
2384 srcFormat
== GL_ALPHA
||
2385 srcFormat
== GL_LUMINANCE
||
2386 srcFormat
== GL_LUMINANCE_ALPHA
||
2387 srcFormat
== GL_INTENSITY
||
2388 srcFormat
== GL_RG
||
2389 srcFormat
== GL_RGB
||
2390 srcFormat
== GL_BGR
||
2391 srcFormat
== GL_RGBA
||
2392 srcFormat
== GL_BGRA
||
2393 srcFormat
== GL_ABGR_EXT
||
2394 srcFormat
== GL_DU8DV8_ATI
||
2395 srcFormat
== GL_DUDV_ATI
||
2396 srcFormat
== GL_RED_INTEGER_EXT
||
2397 srcFormat
== GL_GREEN_INTEGER_EXT
||
2398 srcFormat
== GL_BLUE_INTEGER_EXT
||
2399 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2400 srcFormat
== GL_RGB_INTEGER_EXT
||
2401 srcFormat
== GL_RGBA_INTEGER_EXT
||
2402 srcFormat
== GL_BGR_INTEGER_EXT
||
2403 srcFormat
== GL_BGRA_INTEGER_EXT
||
2404 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2405 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2407 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2408 srcType
== GL_BYTE
||
2409 srcType
== GL_UNSIGNED_SHORT
||
2410 srcType
== GL_SHORT
||
2411 srcType
== GL_UNSIGNED_INT
||
2412 srcType
== GL_INT
||
2413 srcType
== GL_HALF_FLOAT_ARB
||
2414 srcType
== GL_FLOAT
||
2415 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2416 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2417 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2418 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2419 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2420 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2421 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2422 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2423 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2424 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2425 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2426 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2427 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2428 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2430 get_component_mapping(srcFormat
,
2431 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2432 &rDst
, &gDst
, &bDst
, &aDst
);
2434 stride
= _mesa_components_in_format(srcFormat
);
2436 intFormat
= _mesa_is_integer_format(srcFormat
);
2438 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2439 if ((SRC_INDEX) < 0) { \
2442 for (i = 0; i < n; i++) { \
2443 rgba[i][DST_INDEX] = DEFAULT_INT; \
2447 for (i = 0; i < n; i++) { \
2448 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2452 else if (swapBytes) { \
2453 const TYPE *s = (const TYPE *) src; \
2455 for (i = 0; i < n; i++) { \
2456 TYPE value = s[SRC_INDEX]; \
2457 if (sizeof(TYPE) == 2) { \
2460 else if (sizeof(TYPE) == 4) { \
2464 rgba[i][DST_INDEX] = (GLfloat) value; \
2466 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2471 const TYPE *s = (const TYPE *) src; \
2474 for (i = 0; i < n; i++) { \
2475 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2480 for (i = 0; i < n; i++) { \
2481 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2488 case GL_UNSIGNED_BYTE
:
2489 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2490 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2491 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2492 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2495 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2496 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2497 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2498 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2500 case GL_UNSIGNED_SHORT
:
2501 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2502 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2503 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2504 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2507 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2508 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2509 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2510 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2512 case GL_UNSIGNED_INT
:
2513 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2514 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2515 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2516 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2519 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2520 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2521 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2522 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2525 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2526 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2527 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2528 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2530 case GL_HALF_FLOAT_ARB
:
2531 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2532 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2533 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2534 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2536 case GL_UNSIGNED_BYTE_3_3_2
:
2538 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2545 for (i
= 0; i
< n
; i
++) {
2546 GLubyte p
= ubsrc
[i
];
2547 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2548 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2549 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2550 rgba
[i
][aDst
] = 1.0F
;
2554 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2556 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2563 for (i
= 0; i
< n
; i
++) {
2564 GLubyte p
= ubsrc
[i
];
2565 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2566 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2567 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2568 rgba
[i
][aDst
] = 1.0F
;
2572 case GL_UNSIGNED_SHORT_5_6_5
:
2579 const GLushort
*ussrc
= (const GLushort
*) src
;
2581 for (i
= 0; i
< n
; i
++) {
2582 GLushort p
= ussrc
[i
];
2584 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2585 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2586 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2587 rgba
[i
][aDst
] = 1.0F
;
2591 const GLushort
*ussrc
= (const GLushort
*) src
;
2593 for (i
= 0; i
< n
; i
++) {
2594 GLushort p
= ussrc
[i
];
2595 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2596 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2597 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2598 rgba
[i
][aDst
] = 1.0F
;
2602 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2609 const GLushort
*ussrc
= (const GLushort
*) src
;
2611 for (i
= 0; i
< n
; i
++) {
2612 GLushort p
= ussrc
[i
];
2614 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2615 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2616 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2617 rgba
[i
][aDst
] = 1.0F
;
2621 const GLushort
*ussrc
= (const GLushort
*) src
;
2623 for (i
= 0; i
< n
; i
++) {
2624 GLushort p
= ussrc
[i
];
2625 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2626 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2627 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2628 rgba
[i
][aDst
] = 1.0F
;
2632 case GL_UNSIGNED_SHORT_4_4_4_4
:
2634 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2637 const GLushort
*ussrc
= (const GLushort
*) src
;
2639 for (i
= 0; i
< n
; i
++) {
2640 GLushort p
= ussrc
[i
];
2642 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2643 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2644 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2645 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2649 const GLushort
*ussrc
= (const GLushort
*) src
;
2651 for (i
= 0; i
< n
; i
++) {
2652 GLushort p
= ussrc
[i
];
2653 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2654 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2655 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2656 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2660 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2662 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2665 const GLushort
*ussrc
= (const GLushort
*) src
;
2667 for (i
= 0; i
< n
; i
++) {
2668 GLushort p
= ussrc
[i
];
2670 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2671 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2672 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2673 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2677 const GLushort
*ussrc
= (const GLushort
*) src
;
2679 for (i
= 0; i
< n
; i
++) {
2680 GLushort p
= ussrc
[i
];
2681 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2682 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2683 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2684 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2688 case GL_UNSIGNED_SHORT_5_5_5_1
:
2690 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2693 const GLushort
*ussrc
= (const GLushort
*) src
;
2695 for (i
= 0; i
< n
; i
++) {
2696 GLushort p
= ussrc
[i
];
2698 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2699 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2700 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2701 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2705 const GLushort
*ussrc
= (const GLushort
*) src
;
2707 for (i
= 0; i
< n
; i
++) {
2708 GLushort p
= ussrc
[i
];
2709 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2710 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2711 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2712 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2716 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2718 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2721 const GLushort
*ussrc
= (const GLushort
*) src
;
2723 for (i
= 0; i
< n
; i
++) {
2724 GLushort p
= ussrc
[i
];
2726 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2727 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2728 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2729 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2733 const GLushort
*ussrc
= (const GLushort
*) src
;
2735 for (i
= 0; i
< n
; i
++) {
2736 GLushort p
= ussrc
[i
];
2737 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2738 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2739 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2740 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2744 case GL_UNSIGNED_INT_8_8_8_8
:
2746 const GLuint
*uisrc
= (const GLuint
*) src
;
2749 for (i
= 0; i
< n
; i
++) {
2750 GLuint p
= uisrc
[i
];
2751 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2752 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2753 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2754 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2758 for (i
= 0; i
< n
; i
++) {
2759 GLuint p
= uisrc
[i
];
2760 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2761 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2762 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2763 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2768 const GLuint
*uisrc
= (const GLuint
*) src
;
2771 for (i
= 0; i
< n
; i
++) {
2772 GLuint p
= uisrc
[i
];
2773 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2774 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2775 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2776 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2780 for (i
= 0; i
< n
; i
++) {
2781 GLuint p
= uisrc
[i
];
2782 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2783 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2784 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2785 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2790 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2792 const GLuint
*uisrc
= (const GLuint
*) src
;
2795 for (i
= 0; i
< n
; i
++) {
2796 GLuint p
= uisrc
[i
];
2797 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2798 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2799 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2800 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2804 for (i
= 0; i
< n
; i
++) {
2805 GLuint p
= uisrc
[i
];
2806 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2807 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2808 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2809 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2814 const GLuint
*uisrc
= (const GLuint
*) src
;
2817 for (i
= 0; i
< n
; i
++) {
2818 GLuint p
= uisrc
[i
];
2819 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2820 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2821 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2822 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2826 for (i
= 0; i
< n
; i
++) {
2827 GLuint p
= uisrc
[i
];
2828 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2829 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2830 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2831 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2836 case GL_UNSIGNED_INT_10_10_10_2
:
2838 rs
= 1.0F
/ 1023.0F
;
2839 gs
= 1.0F
/ 1023.0F
;
2840 bs
= 1.0F
/ 1023.0F
;
2844 const GLuint
*uisrc
= (const GLuint
*) src
;
2846 for (i
= 0; i
< n
; i
++) {
2847 GLuint p
= uisrc
[i
];
2849 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2850 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2851 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2852 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2856 const GLuint
*uisrc
= (const GLuint
*) src
;
2858 for (i
= 0; i
< n
; i
++) {
2859 GLuint p
= uisrc
[i
];
2860 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2861 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2862 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2863 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2867 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2869 rs
= 1.0F
/ 1023.0F
;
2870 gs
= 1.0F
/ 1023.0F
;
2871 bs
= 1.0F
/ 1023.0F
;
2875 const GLuint
*uisrc
= (const GLuint
*) src
;
2877 for (i
= 0; i
< n
; i
++) {
2878 GLuint p
= uisrc
[i
];
2880 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2881 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2882 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2883 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2887 const GLuint
*uisrc
= (const GLuint
*) src
;
2889 for (i
= 0; i
< n
; i
++) {
2890 GLuint p
= uisrc
[i
];
2891 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2892 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2893 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2894 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2898 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2900 const GLuint
*uisrc
= (const GLuint
*) src
;
2903 for (i
= 0; i
< n
; i
++) {
2904 GLuint p
= uisrc
[i
];
2906 rgb9e5_to_float3(p
, f
);
2907 rgba
[i
][rDst
] = f
[0];
2908 rgba
[i
][gDst
] = f
[1];
2909 rgba
[i
][bDst
] = f
[2];
2910 rgba
[i
][aDst
] = 1.0F
;
2914 const GLuint
*uisrc
= (const GLuint
*) src
;
2917 for (i
= 0; i
< n
; i
++) {
2918 rgb9e5_to_float3(uisrc
[i
], f
);
2919 rgba
[i
][rDst
] = f
[0];
2920 rgba
[i
][gDst
] = f
[1];
2921 rgba
[i
][bDst
] = f
[2];
2922 rgba
[i
][aDst
] = 1.0F
;
2926 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2928 const GLuint
*uisrc
= (const GLuint
*) src
;
2931 for (i
= 0; i
< n
; i
++) {
2932 GLuint p
= uisrc
[i
];
2934 r11g11b10f_to_float3(p
, f
);
2935 rgba
[i
][rDst
] = f
[0];
2936 rgba
[i
][gDst
] = f
[1];
2937 rgba
[i
][bDst
] = f
[2];
2938 rgba
[i
][aDst
] = 1.0F
;
2942 const GLuint
*uisrc
= (const GLuint
*) src
;
2945 for (i
= 0; i
< n
; i
++) {
2946 r11g11b10f_to_float3(uisrc
[i
], f
);
2947 rgba
[i
][rDst
] = f
[0];
2948 rgba
[i
][gDst
] = f
[1];
2949 rgba
[i
][bDst
] = f
[2];
2950 rgba
[i
][aDst
] = 1.0F
;
2955 _mesa_problem(NULL
, "bad srcType in extract float data");
2962 static inline GLuint
2963 clamp_byte_to_uint(GLbyte b
)
2965 return b
< 0 ? 0 : b
;
2969 static inline GLuint
2970 clamp_short_to_uint(GLshort s
)
2972 return s
< 0 ? 0 : s
;
2976 static inline GLuint
2977 clamp_int_to_uint(GLint i
)
2979 return i
< 0 ? 0 : i
;
2983 static inline GLuint
2984 clamp_float_to_uint(GLfloat f
)
2986 return f
< 0.0F
? 0 : IROUND(f
);
2990 static inline GLuint
2991 clamp_half_to_uint(GLhalfARB h
)
2993 GLfloat f
= _mesa_half_to_float(h
);
2994 return f
< 0.0F
? 0 : IROUND(f
);
2999 * \sa extract_float_rgba()
3002 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3003 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3004 GLboolean swapBytes
)
3006 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3008 GLint rDst
, bDst
, gDst
, aDst
;
3010 ASSERT(srcFormat
== GL_RED
||
3011 srcFormat
== GL_GREEN
||
3012 srcFormat
== GL_BLUE
||
3013 srcFormat
== GL_ALPHA
||
3014 srcFormat
== GL_LUMINANCE
||
3015 srcFormat
== GL_LUMINANCE_ALPHA
||
3016 srcFormat
== GL_INTENSITY
||
3017 srcFormat
== GL_RG
||
3018 srcFormat
== GL_RGB
||
3019 srcFormat
== GL_BGR
||
3020 srcFormat
== GL_RGBA
||
3021 srcFormat
== GL_BGRA
||
3022 srcFormat
== GL_ABGR_EXT
||
3023 srcFormat
== GL_DU8DV8_ATI
||
3024 srcFormat
== GL_DUDV_ATI
||
3025 srcFormat
== GL_RED_INTEGER_EXT
||
3026 srcFormat
== GL_RG_INTEGER
||
3027 srcFormat
== GL_GREEN_INTEGER_EXT
||
3028 srcFormat
== GL_BLUE_INTEGER_EXT
||
3029 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3030 srcFormat
== GL_RGB_INTEGER_EXT
||
3031 srcFormat
== GL_RGBA_INTEGER_EXT
||
3032 srcFormat
== GL_BGR_INTEGER_EXT
||
3033 srcFormat
== GL_BGRA_INTEGER_EXT
||
3034 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3035 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3037 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3038 srcType
== GL_BYTE
||
3039 srcType
== GL_UNSIGNED_SHORT
||
3040 srcType
== GL_SHORT
||
3041 srcType
== GL_UNSIGNED_INT
||
3042 srcType
== GL_INT
||
3043 srcType
== GL_HALF_FLOAT_ARB
||
3044 srcType
== GL_FLOAT
||
3045 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3046 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3047 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3048 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3049 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3050 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3051 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3052 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3053 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3054 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3055 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3056 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3057 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3058 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3060 get_component_mapping(srcFormat
,
3061 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3062 &rDst
, &gDst
, &bDst
, &aDst
);
3064 stride
= _mesa_components_in_format(srcFormat
);
3066 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3067 if ((SRC_INDEX) < 0) { \
3069 for (i = 0; i < n; i++) { \
3070 rgba[i][DST_INDEX] = DEFAULT; \
3073 else if (swapBytes) { \
3074 const TYPE *s = (const TYPE *) src; \
3076 for (i = 0; i < n; i++) { \
3077 TYPE value = s[SRC_INDEX]; \
3078 if (sizeof(TYPE) == 2) { \
3081 else if (sizeof(TYPE) == 4) { \
3084 rgba[i][DST_INDEX] = CONVERSION(value); \
3089 const TYPE *s = (const TYPE *) src; \
3091 for (i = 0; i < n; i++) { \
3092 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3098 case GL_UNSIGNED_BYTE
:
3099 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3100 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3101 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3102 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3105 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3106 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3107 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3108 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
3110 case GL_UNSIGNED_SHORT
:
3111 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3112 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3113 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3114 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3117 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3118 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3119 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3120 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3122 case GL_UNSIGNED_INT
:
3123 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3124 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3125 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3126 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3129 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3130 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3131 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3132 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3135 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3136 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3137 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3138 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3140 case GL_HALF_FLOAT_ARB
:
3141 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3142 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3143 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3144 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3146 case GL_UNSIGNED_BYTE_3_3_2
:
3148 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3150 for (i
= 0; i
< n
; i
++) {
3151 GLubyte p
= ubsrc
[i
];
3152 rgba
[i
][rDst
] = ((p
>> 5) );
3153 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3154 rgba
[i
][bDst
] = ((p
) & 0x3);
3159 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3161 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3163 for (i
= 0; i
< n
; i
++) {
3164 GLubyte p
= ubsrc
[i
];
3165 rgba
[i
][rDst
] = ((p
) & 0x7);
3166 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3167 rgba
[i
][bDst
] = ((p
>> 6) );
3172 case GL_UNSIGNED_SHORT_5_6_5
:
3174 const GLushort
*ussrc
= (const GLushort
*) src
;
3176 for (i
= 0; i
< n
; i
++) {
3177 GLushort p
= ussrc
[i
];
3179 rgba
[i
][rDst
] = ((p
>> 11) );
3180 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3181 rgba
[i
][bDst
] = ((p
) & 0x1f);
3186 const GLushort
*ussrc
= (const GLushort
*) src
;
3188 for (i
= 0; i
< n
; i
++) {
3189 GLushort p
= ussrc
[i
];
3190 rgba
[i
][rDst
] = ((p
>> 11) );
3191 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3192 rgba
[i
][bDst
] = ((p
) & 0x1f);
3197 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3199 const GLushort
*ussrc
= (const GLushort
*) src
;
3201 for (i
= 0; i
< n
; i
++) {
3202 GLushort p
= ussrc
[i
];
3204 rgba
[i
][rDst
] = ((p
) & 0x1f);
3205 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3206 rgba
[i
][bDst
] = ((p
>> 11) );
3211 const GLushort
*ussrc
= (const GLushort
*) src
;
3213 for (i
= 0; i
< n
; i
++) {
3214 GLushort p
= ussrc
[i
];
3215 rgba
[i
][rDst
] = ((p
) & 0x1f);
3216 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3217 rgba
[i
][bDst
] = ((p
>> 11) );
3222 case GL_UNSIGNED_SHORT_4_4_4_4
:
3224 const GLushort
*ussrc
= (const GLushort
*) src
;
3226 for (i
= 0; i
< n
; i
++) {
3227 GLushort p
= ussrc
[i
];
3229 rgba
[i
][rDst
] = ((p
>> 12) );
3230 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3231 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3232 rgba
[i
][aDst
] = ((p
) & 0xf);
3236 const GLushort
*ussrc
= (const GLushort
*) src
;
3238 for (i
= 0; i
< n
; i
++) {
3239 GLushort p
= ussrc
[i
];
3240 rgba
[i
][rDst
] = ((p
>> 12) );
3241 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3242 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3243 rgba
[i
][aDst
] = ((p
) & 0xf);
3247 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3249 const GLushort
*ussrc
= (const GLushort
*) src
;
3251 for (i
= 0; i
< n
; i
++) {
3252 GLushort p
= ussrc
[i
];
3254 rgba
[i
][rDst
] = ((p
) & 0xf);
3255 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3256 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3257 rgba
[i
][aDst
] = ((p
>> 12) );
3261 const GLushort
*ussrc
= (const GLushort
*) src
;
3263 for (i
= 0; i
< n
; i
++) {
3264 GLushort p
= ussrc
[i
];
3265 rgba
[i
][rDst
] = ((p
) & 0xf);
3266 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3267 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3268 rgba
[i
][aDst
] = ((p
>> 12) );
3272 case GL_UNSIGNED_SHORT_5_5_5_1
:
3274 const GLushort
*ussrc
= (const GLushort
*) src
;
3276 for (i
= 0; i
< n
; i
++) {
3277 GLushort p
= ussrc
[i
];
3279 rgba
[i
][rDst
] = ((p
>> 11) );
3280 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3281 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3282 rgba
[i
][aDst
] = ((p
) & 0x1 );
3286 const GLushort
*ussrc
= (const GLushort
*) src
;
3288 for (i
= 0; i
< n
; i
++) {
3289 GLushort p
= ussrc
[i
];
3290 rgba
[i
][rDst
] = ((p
>> 11) );
3291 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3292 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3293 rgba
[i
][aDst
] = ((p
) & 0x1 );
3297 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3299 const GLushort
*ussrc
= (const GLushort
*) src
;
3301 for (i
= 0; i
< n
; i
++) {
3302 GLushort p
= ussrc
[i
];
3304 rgba
[i
][rDst
] = ((p
) & 0x1f);
3305 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3306 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3307 rgba
[i
][aDst
] = ((p
>> 15) );
3311 const GLushort
*ussrc
= (const GLushort
*) src
;
3313 for (i
= 0; i
< n
; i
++) {
3314 GLushort p
= ussrc
[i
];
3315 rgba
[i
][rDst
] = ((p
) & 0x1f);
3316 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3317 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3318 rgba
[i
][aDst
] = ((p
>> 15) );
3322 case GL_UNSIGNED_INT_8_8_8_8
:
3324 const GLuint
*uisrc
= (const GLuint
*) src
;
3326 for (i
= 0; i
< n
; i
++) {
3327 GLuint p
= uisrc
[i
];
3328 rgba
[i
][rDst
] = ((p
) & 0xff);
3329 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3330 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3331 rgba
[i
][aDst
] = ((p
>> 24) );
3335 const GLuint
*uisrc
= (const GLuint
*) src
;
3337 for (i
= 0; i
< n
; i
++) {
3338 GLuint p
= uisrc
[i
];
3339 rgba
[i
][rDst
] = ((p
>> 24) );
3340 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3341 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3342 rgba
[i
][aDst
] = ((p
) & 0xff);
3346 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3348 const GLuint
*uisrc
= (const GLuint
*) src
;
3350 for (i
= 0; i
< n
; i
++) {
3351 GLuint p
= uisrc
[i
];
3352 rgba
[i
][rDst
] = ((p
>> 24) );
3353 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3354 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3355 rgba
[i
][aDst
] = ((p
) & 0xff);
3359 const GLuint
*uisrc
= (const GLuint
*) src
;
3361 for (i
= 0; i
< n
; i
++) {
3362 GLuint p
= uisrc
[i
];
3363 rgba
[i
][rDst
] = ((p
) & 0xff);
3364 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3365 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3366 rgba
[i
][aDst
] = ((p
>> 24) );
3370 case GL_UNSIGNED_INT_10_10_10_2
:
3372 const GLuint
*uisrc
= (const GLuint
*) src
;
3374 for (i
= 0; i
< n
; i
++) {
3375 GLuint p
= uisrc
[i
];
3377 rgba
[i
][rDst
] = ((p
>> 22) );
3378 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3379 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3380 rgba
[i
][aDst
] = ((p
) & 0x3 );
3384 const GLuint
*uisrc
= (const GLuint
*) src
;
3386 for (i
= 0; i
< n
; i
++) {
3387 GLuint p
= uisrc
[i
];
3388 rgba
[i
][rDst
] = ((p
>> 22) );
3389 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3390 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3391 rgba
[i
][aDst
] = ((p
) & 0x3 );
3395 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3397 const GLuint
*uisrc
= (const GLuint
*) src
;
3399 for (i
= 0; i
< n
; i
++) {
3400 GLuint p
= uisrc
[i
];
3402 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3403 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3404 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3405 rgba
[i
][aDst
] = ((p
>> 30) );
3409 const GLuint
*uisrc
= (const GLuint
*) src
;
3411 for (i
= 0; i
< n
; i
++) {
3412 GLuint p
= uisrc
[i
];
3413 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3414 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3415 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3416 rgba
[i
][aDst
] = ((p
>> 30) );
3420 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3422 const GLuint
*uisrc
= (const GLuint
*) src
;
3425 for (i
= 0; i
< n
; i
++) {
3426 GLuint p
= uisrc
[i
];
3428 rgb9e5_to_float3(p
, f
);
3429 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3430 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3431 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3436 const GLuint
*uisrc
= (const GLuint
*) src
;
3439 for (i
= 0; i
< n
; i
++) {
3440 GLuint p
= uisrc
[i
];
3441 rgb9e5_to_float3(p
, f
);
3442 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3443 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3444 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3449 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3451 const GLuint
*uisrc
= (const GLuint
*) src
;
3454 for (i
= 0; i
< n
; i
++) {
3455 GLuint p
= uisrc
[i
];
3457 r11g11b10f_to_float3(p
, f
);
3458 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3459 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3460 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3465 const GLuint
*uisrc
= (const GLuint
*) src
;
3468 for (i
= 0; i
< n
; i
++) {
3469 GLuint p
= uisrc
[i
];
3470 r11g11b10f_to_float3(p
, f
);
3471 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3472 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3473 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3479 _mesa_problem(NULL
, "bad srcType in extract uint data");
3488 * Unpack a row of color image data from a client buffer according to
3489 * the pixel unpacking parameters.
3490 * Return GLubyte values in the specified dest image format.
3491 * This is used by glDrawPixels and glTexImage?D().
3492 * \param ctx - the context
3493 * n - number of pixels in the span
3494 * dstFormat - format of destination color array
3495 * dest - the destination color array
3496 * srcFormat - source image format
3497 * srcType - source image data type
3498 * source - source image pointer
3499 * srcPacking - pixel unpacking parameters
3500 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3502 * XXX perhaps expand this to process whole images someday.
3505 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3506 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3507 GLenum srcFormat
, GLenum srcType
,
3508 const GLvoid
*source
,
3509 const struct gl_pixelstore_attrib
*srcPacking
,
3510 GLbitfield transferOps
)
3512 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3513 ASSERT(dstFormat
== GL_ALPHA
||
3514 dstFormat
== GL_LUMINANCE
||
3515 dstFormat
== GL_LUMINANCE_ALPHA
||
3516 dstFormat
== GL_INTENSITY
||
3517 dstFormat
== GL_RED
||
3518 dstFormat
== GL_RG
||
3519 dstFormat
== GL_RGB
||
3520 dstFormat
== GL_RGBA
);
3522 ASSERT(srcFormat
== GL_RED
||
3523 srcFormat
== GL_GREEN
||
3524 srcFormat
== GL_BLUE
||
3525 srcFormat
== GL_ALPHA
||
3526 srcFormat
== GL_LUMINANCE
||
3527 srcFormat
== GL_LUMINANCE_ALPHA
||
3528 srcFormat
== GL_INTENSITY
||
3529 srcFormat
== GL_RG
||
3530 srcFormat
== GL_RGB
||
3531 srcFormat
== GL_BGR
||
3532 srcFormat
== GL_RGBA
||
3533 srcFormat
== GL_BGRA
||
3534 srcFormat
== GL_ABGR_EXT
||
3535 srcFormat
== GL_COLOR_INDEX
);
3537 ASSERT(srcType
== GL_BITMAP
||
3538 srcType
== GL_UNSIGNED_BYTE
||
3539 srcType
== GL_BYTE
||
3540 srcType
== GL_UNSIGNED_SHORT
||
3541 srcType
== GL_SHORT
||
3542 srcType
== GL_UNSIGNED_INT
||
3543 srcType
== GL_INT
||
3544 srcType
== GL_HALF_FLOAT_ARB
||
3545 srcType
== GL_FLOAT
||
3546 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3547 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3548 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3549 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3550 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3551 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3552 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3553 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3554 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3555 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3556 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3557 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3558 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3559 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3561 /* EXT_texture_integer specifies no transfer ops on integer
3562 * types in the resolved issues section. Just set them to 0
3563 * for integer surfaces.
3568 /* Try simple cases first */
3569 if (transferOps
== 0) {
3570 if (srcType
== GL_UNSIGNED_BYTE
) {
3571 if (dstFormat
== GL_RGBA
) {
3572 if (srcFormat
== GL_RGBA
) {
3573 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3576 else if (srcFormat
== GL_RGB
) {
3578 const GLubyte
*src
= (const GLubyte
*) source
;
3579 GLubyte
*dst
= dest
;
3580 for (i
= 0; i
< n
; i
++) {
3591 else if (dstFormat
== GL_RGB
) {
3592 if (srcFormat
== GL_RGB
) {
3593 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3596 else if (srcFormat
== GL_RGBA
) {
3598 const GLubyte
*src
= (const GLubyte
*) source
;
3599 GLubyte
*dst
= dest
;
3600 for (i
= 0; i
< n
; i
++) {
3610 else if (dstFormat
== srcFormat
) {
3611 GLint comps
= _mesa_components_in_format(srcFormat
);
3613 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3620 /* general solution begins here */
3622 GLint dstComponents
;
3623 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3624 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3627 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3631 dstComponents
= _mesa_components_in_format( dstFormat
);
3632 /* source & dest image formats should have been error checked by now */
3633 assert(dstComponents
> 0);
3636 * Extract image data and convert to RGBA floats
3638 if (srcFormat
== GL_COLOR_INDEX
) {
3639 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3642 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3647 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3650 /* Convert indexes to RGBA */
3651 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3652 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3654 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3656 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3657 * with color indexes.
3659 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3664 /* non-color index data */
3665 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3666 srcPacking
->SwapBytes
);
3669 /* Need to clamp if returning GLubytes */
3670 transferOps
|= IMAGE_CLAMP_BIT
;
3673 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3676 get_component_indexes(dstFormat
,
3677 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3679 /* Now return the GLubyte data in the requested dstFormat */
3681 GLubyte
*dst
= dest
;
3683 for (i
= 0; i
< n
; i
++) {
3684 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3685 dst
+= dstComponents
;
3690 GLubyte
*dst
= dest
;
3692 for (i
= 0; i
< n
; i
++) {
3693 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3694 dst
+= dstComponents
;
3699 GLubyte
*dst
= dest
;
3701 for (i
= 0; i
< n
; i
++) {
3702 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3703 dst
+= dstComponents
;
3708 GLubyte
*dst
= dest
;
3710 for (i
= 0; i
< n
; i
++) {
3711 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3712 dst
+= dstComponents
;
3717 GLubyte
*dst
= dest
;
3720 assert(dstComponents
== 1);
3721 for (i
= 0; i
< n
; i
++) {
3722 /* Intensity comes from red channel */
3723 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3728 GLubyte
*dst
= dest
;
3731 for (i
= 0; i
< n
; i
++) {
3732 /* Luminance comes from red channel */
3733 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3734 dst
+= dstComponents
;
3744 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3745 * instead of GLubyte.
3748 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3749 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3750 GLenum srcFormat
, GLenum srcType
,
3751 const GLvoid
*source
,
3752 const struct gl_pixelstore_attrib
*srcPacking
,
3753 GLbitfield transferOps
)
3755 ASSERT(dstFormat
== GL_ALPHA
||
3756 dstFormat
== GL_LUMINANCE
||
3757 dstFormat
== GL_LUMINANCE_ALPHA
||
3758 dstFormat
== GL_INTENSITY
||
3759 dstFormat
== GL_RED
||
3760 dstFormat
== GL_RG
||
3761 dstFormat
== GL_RGB
||
3762 dstFormat
== GL_RGBA
);
3764 ASSERT(srcFormat
== GL_RED
||
3765 srcFormat
== GL_GREEN
||
3766 srcFormat
== GL_BLUE
||
3767 srcFormat
== GL_ALPHA
||
3768 srcFormat
== GL_LUMINANCE
||
3769 srcFormat
== GL_LUMINANCE_ALPHA
||
3770 srcFormat
== GL_INTENSITY
||
3771 srcFormat
== GL_RG
||
3772 srcFormat
== GL_RGB
||
3773 srcFormat
== GL_BGR
||
3774 srcFormat
== GL_RGBA
||
3775 srcFormat
== GL_BGRA
||
3776 srcFormat
== GL_ABGR_EXT
||
3777 srcFormat
== GL_RED_INTEGER_EXT
||
3778 srcFormat
== GL_GREEN_INTEGER_EXT
||
3779 srcFormat
== GL_BLUE_INTEGER_EXT
||
3780 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3781 srcFormat
== GL_RGB_INTEGER_EXT
||
3782 srcFormat
== GL_RGBA_INTEGER_EXT
||
3783 srcFormat
== GL_BGR_INTEGER_EXT
||
3784 srcFormat
== GL_BGRA_INTEGER_EXT
||
3785 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3786 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3787 srcFormat
== GL_COLOR_INDEX
);
3789 ASSERT(srcType
== GL_BITMAP
||
3790 srcType
== GL_UNSIGNED_BYTE
||
3791 srcType
== GL_BYTE
||
3792 srcType
== GL_UNSIGNED_SHORT
||
3793 srcType
== GL_SHORT
||
3794 srcType
== GL_UNSIGNED_INT
||
3795 srcType
== GL_INT
||
3796 srcType
== GL_HALF_FLOAT_ARB
||
3797 srcType
== GL_FLOAT
||
3798 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3799 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3800 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3801 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3802 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3803 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3804 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3805 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3806 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3807 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3808 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3809 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3810 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3811 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3813 /* general solution, no special cases, yet */
3815 GLint dstComponents
;
3816 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3817 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3818 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3821 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3825 dstComponents
= _mesa_components_in_format( dstFormat
);
3826 /* source & dest image formats should have been error checked by now */
3827 assert(dstComponents
> 0);
3829 /* EXT_texture_integer specifies no transfer ops on integer
3830 * types in the resolved issues section. Just set them to 0
3831 * for integer surfaces.
3837 * Extract image data and convert to RGBA floats
3839 if (srcFormat
== GL_COLOR_INDEX
) {
3840 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3843 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3848 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3851 /* Convert indexes to RGBA */
3852 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3853 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3855 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3857 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3858 * with color indexes.
3860 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3865 /* non-color index data */
3866 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3867 srcPacking
->SwapBytes
);
3871 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3874 get_component_indexes(dstFormat
,
3875 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3877 /* Now pack results in the requested dstFormat */
3879 GLfloat
*dst
= dest
;
3881 for (i
= 0; i
< n
; i
++) {
3882 dst
[rDst
] = rgba
[i
][RCOMP
];
3883 dst
+= dstComponents
;
3888 GLfloat
*dst
= dest
;
3890 for (i
= 0; i
< n
; i
++) {
3891 dst
[gDst
] = rgba
[i
][GCOMP
];
3892 dst
+= dstComponents
;
3897 GLfloat
*dst
= dest
;
3899 for (i
= 0; i
< n
; i
++) {
3900 dst
[bDst
] = rgba
[i
][BCOMP
];
3901 dst
+= dstComponents
;
3906 GLfloat
*dst
= dest
;
3908 for (i
= 0; i
< n
; i
++) {
3909 dst
[aDst
] = rgba
[i
][ACOMP
];
3910 dst
+= dstComponents
;
3915 GLfloat
*dst
= dest
;
3918 assert(dstComponents
== 1);
3919 for (i
= 0; i
< n
; i
++) {
3920 /* Intensity comes from red channel */
3921 dst
[i
] = rgba
[i
][RCOMP
];
3926 GLfloat
*dst
= dest
;
3929 for (i
= 0; i
< n
; i
++) {
3930 /* Luminance comes from red channel */
3931 dst
[0] = rgba
[i
][RCOMP
];
3932 dst
+= dstComponents
;
3942 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3943 * instead of GLubyte.
3944 * No pixel transfer ops are applied.
3947 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3948 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3949 GLenum srcFormat
, GLenum srcType
,
3950 const GLvoid
*source
,
3951 const struct gl_pixelstore_attrib
*srcPacking
)
3953 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3956 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3960 ASSERT(dstFormat
== GL_ALPHA
||
3961 dstFormat
== GL_LUMINANCE
||
3962 dstFormat
== GL_LUMINANCE_ALPHA
||
3963 dstFormat
== GL_INTENSITY
||
3964 dstFormat
== GL_RED
||
3965 dstFormat
== GL_RG
||
3966 dstFormat
== GL_RGB
||
3967 dstFormat
== GL_RGBA
);
3969 ASSERT(srcFormat
== GL_RED
||
3970 srcFormat
== GL_GREEN
||
3971 srcFormat
== GL_BLUE
||
3972 srcFormat
== GL_ALPHA
||
3973 srcFormat
== GL_LUMINANCE
||
3974 srcFormat
== GL_LUMINANCE_ALPHA
||
3975 srcFormat
== GL_INTENSITY
||
3976 srcFormat
== GL_RG
||
3977 srcFormat
== GL_RGB
||
3978 srcFormat
== GL_BGR
||
3979 srcFormat
== GL_RGBA
||
3980 srcFormat
== GL_BGRA
||
3981 srcFormat
== GL_ABGR_EXT
||
3982 srcFormat
== GL_RED_INTEGER_EXT
||
3983 srcFormat
== GL_GREEN_INTEGER_EXT
||
3984 srcFormat
== GL_BLUE_INTEGER_EXT
||
3985 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3986 srcFormat
== GL_RG_INTEGER
||
3987 srcFormat
== GL_RGB_INTEGER_EXT
||
3988 srcFormat
== GL_RGBA_INTEGER_EXT
||
3989 srcFormat
== GL_BGR_INTEGER_EXT
||
3990 srcFormat
== GL_BGRA_INTEGER_EXT
||
3991 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3992 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3994 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3995 srcType
== GL_BYTE
||
3996 srcType
== GL_UNSIGNED_SHORT
||
3997 srcType
== GL_SHORT
||
3998 srcType
== GL_UNSIGNED_INT
||
3999 srcType
== GL_INT
||
4000 srcType
== GL_HALF_FLOAT_ARB
||
4001 srcType
== GL_FLOAT
||
4002 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4003 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4004 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4005 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4006 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4007 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4008 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4009 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4010 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4011 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4012 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4013 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4014 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4015 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4018 /* Extract image data as uint[4] pixels */
4019 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4020 srcPacking
->SwapBytes
);
4022 if (dstFormat
== GL_RGBA
) {
4024 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4028 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4029 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4031 assert(dstComponents
> 0);
4033 get_component_indexes(dstFormat
,
4034 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4036 /* Now pack values in the requested dest format */
4040 for (i
= 0; i
< n
; i
++) {
4041 dst
[rDst
] = rgba
[i
][RCOMP
];
4042 dst
+= dstComponents
;
4049 for (i
= 0; i
< n
; i
++) {
4050 dst
[gDst
] = rgba
[i
][GCOMP
];
4051 dst
+= dstComponents
;
4058 for (i
= 0; i
< n
; i
++) {
4059 dst
[bDst
] = rgba
[i
][BCOMP
];
4060 dst
+= dstComponents
;
4067 for (i
= 0; i
< n
; i
++) {
4068 dst
[aDst
] = rgba
[i
][ACOMP
];
4069 dst
+= dstComponents
;
4077 assert(dstComponents
== 1);
4078 for (i
= 0; i
< n
; i
++) {
4079 /* Intensity comes from red channel */
4080 dst
[i
] = rgba
[i
][RCOMP
];
4088 for (i
= 0; i
< n
; i
++) {
4089 /* Luminance comes from red channel */
4090 dst
[0] = rgba
[i
][RCOMP
];
4091 dst
+= dstComponents
;
4102 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4103 * directly return GLbyte data, no transfer ops apply.
4106 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4107 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4108 GLenum srcFormat
, GLenum srcType
,
4109 const GLvoid
*source
,
4110 const struct gl_pixelstore_attrib
*srcPacking
,
4111 GLbitfield transferOps
)
4113 ASSERT(dstFormat
== GL_DUDV_ATI
);
4114 ASSERT(srcFormat
== GL_DUDV_ATI
||
4115 srcFormat
== GL_DU8DV8_ATI
);
4117 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4118 srcType
== GL_BYTE
||
4119 srcType
== GL_UNSIGNED_SHORT
||
4120 srcType
== GL_SHORT
||
4121 srcType
== GL_UNSIGNED_INT
||
4122 srcType
== GL_INT
||
4123 srcType
== GL_HALF_FLOAT_ARB
||
4124 srcType
== GL_FLOAT
);
4126 /* general solution */
4128 GLint dstComponents
;
4131 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4134 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4138 dstComponents
= _mesa_components_in_format( dstFormat
);
4139 /* source & dest image formats should have been error checked by now */
4140 assert(dstComponents
> 0);
4143 * Extract image data and convert to RGBA floats
4145 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4146 srcPacking
->SwapBytes
);
4149 /* Now determine which color channels we need to produce.
4150 * And determine the dest index (offset) within each color tuple.
4153 /* Now pack results in the requested dstFormat */
4154 for (i
= 0; i
< n
; i
++) {
4155 /* not sure - need clamp[-1,1] here? */
4156 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4157 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4158 dst
+= dstComponents
;
4166 * Unpack a row of color index data from a client buffer according to
4167 * the pixel unpacking parameters.
4168 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4170 * Args: ctx - the context
4171 * n - number of pixels
4172 * dstType - destination data type
4173 * dest - destination array
4174 * srcType - source pixel type
4175 * source - source data pointer
4176 * srcPacking - pixel unpacking parameters
4177 * transferOps - the pixel transfer operations to apply
4180 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4181 GLenum dstType
, GLvoid
*dest
,
4182 GLenum srcType
, const GLvoid
*source
,
4183 const struct gl_pixelstore_attrib
*srcPacking
,
4184 GLbitfield transferOps
)
4186 ASSERT(srcType
== GL_BITMAP
||
4187 srcType
== GL_UNSIGNED_BYTE
||
4188 srcType
== GL_BYTE
||
4189 srcType
== GL_UNSIGNED_SHORT
||
4190 srcType
== GL_SHORT
||
4191 srcType
== GL_UNSIGNED_INT
||
4192 srcType
== GL_INT
||
4193 srcType
== GL_HALF_FLOAT_ARB
||
4194 srcType
== GL_FLOAT
);
4196 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4197 dstType
== GL_UNSIGNED_SHORT
||
4198 dstType
== GL_UNSIGNED_INT
);
4201 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4204 * Try simple cases first
4206 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4207 && dstType
== GL_UNSIGNED_BYTE
) {
4208 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4210 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4211 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4212 memcpy(dest
, source
, n
* sizeof(GLuint
));
4218 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4221 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4225 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4229 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4231 /* convert to dest type */
4233 case GL_UNSIGNED_BYTE
:
4235 GLubyte
*dst
= (GLubyte
*) dest
;
4237 for (i
= 0; i
< n
; i
++) {
4238 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4242 case GL_UNSIGNED_SHORT
:
4244 GLuint
*dst
= (GLuint
*) dest
;
4246 for (i
= 0; i
< n
; i
++) {
4247 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4251 case GL_UNSIGNED_INT
:
4252 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4255 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4264 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4265 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4266 const struct gl_pixelstore_attrib
*dstPacking
,
4267 GLbitfield transferOps
)
4269 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4272 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4276 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4278 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4279 /* make a copy of input */
4280 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4281 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4286 case GL_UNSIGNED_BYTE
:
4288 GLubyte
*dst
= (GLubyte
*) dest
;
4290 for (i
= 0; i
< n
; i
++) {
4291 *dst
++ = (GLubyte
) source
[i
];
4297 GLbyte
*dst
= (GLbyte
*) dest
;
4299 for (i
= 0; i
< n
; i
++) {
4300 dst
[i
] = (GLbyte
) source
[i
];
4304 case GL_UNSIGNED_SHORT
:
4306 GLushort
*dst
= (GLushort
*) dest
;
4308 for (i
= 0; i
< n
; i
++) {
4309 dst
[i
] = (GLushort
) source
[i
];
4311 if (dstPacking
->SwapBytes
) {
4312 _mesa_swap2( (GLushort
*) dst
, n
);
4318 GLshort
*dst
= (GLshort
*) dest
;
4320 for (i
= 0; i
< n
; i
++) {
4321 dst
[i
] = (GLshort
) source
[i
];
4323 if (dstPacking
->SwapBytes
) {
4324 _mesa_swap2( (GLushort
*) dst
, n
);
4328 case GL_UNSIGNED_INT
:
4330 GLuint
*dst
= (GLuint
*) dest
;
4332 for (i
= 0; i
< n
; i
++) {
4333 dst
[i
] = (GLuint
) source
[i
];
4335 if (dstPacking
->SwapBytes
) {
4336 _mesa_swap4( (GLuint
*) dst
, n
);
4342 GLint
*dst
= (GLint
*) dest
;
4344 for (i
= 0; i
< n
; i
++) {
4345 dst
[i
] = (GLint
) source
[i
];
4347 if (dstPacking
->SwapBytes
) {
4348 _mesa_swap4( (GLuint
*) dst
, n
);
4354 GLfloat
*dst
= (GLfloat
*) dest
;
4356 for (i
= 0; i
< n
; i
++) {
4357 dst
[i
] = (GLfloat
) source
[i
];
4359 if (dstPacking
->SwapBytes
) {
4360 _mesa_swap4( (GLuint
*) dst
, n
);
4364 case GL_HALF_FLOAT_ARB
:
4366 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4368 for (i
= 0; i
< n
; i
++) {
4369 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4371 if (dstPacking
->SwapBytes
) {
4372 _mesa_swap2( (GLushort
*) dst
, n
);
4377 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4385 * Unpack a row of stencil data from a client buffer according to
4386 * the pixel unpacking parameters.
4387 * This is (or will be) used by glDrawPixels
4389 * Args: ctx - the context
4390 * n - number of pixels
4391 * dstType - destination data type
4392 * dest - destination array
4393 * srcType - source pixel type
4394 * source - source data pointer
4395 * srcPacking - pixel unpacking parameters
4396 * transferOps - apply offset/bias/lookup ops?
4399 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4400 GLenum dstType
, GLvoid
*dest
,
4401 GLenum srcType
, const GLvoid
*source
,
4402 const struct gl_pixelstore_attrib
*srcPacking
,
4403 GLbitfield transferOps
)
4405 ASSERT(srcType
== GL_BITMAP
||
4406 srcType
== GL_UNSIGNED_BYTE
||
4407 srcType
== GL_BYTE
||
4408 srcType
== GL_UNSIGNED_SHORT
||
4409 srcType
== GL_SHORT
||
4410 srcType
== GL_UNSIGNED_INT
||
4411 srcType
== GL_INT
||
4412 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4413 srcType
== GL_HALF_FLOAT_ARB
||
4414 srcType
== GL_FLOAT
||
4415 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4417 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4418 dstType
== GL_UNSIGNED_SHORT
||
4419 dstType
== GL_UNSIGNED_INT
||
4420 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4422 /* only shift and offset apply to stencil */
4423 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4426 * Try simple cases first
4428 if (transferOps
== 0 &&
4429 !ctx
->Pixel
.MapStencilFlag
&&
4430 srcType
== GL_UNSIGNED_BYTE
&&
4431 dstType
== GL_UNSIGNED_BYTE
) {
4432 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4434 else if (transferOps
== 0 &&
4435 !ctx
->Pixel
.MapStencilFlag
&&
4436 srcType
== GL_UNSIGNED_INT
&&
4437 dstType
== GL_UNSIGNED_INT
&&
4438 !srcPacking
->SwapBytes
) {
4439 memcpy(dest
, source
, n
* sizeof(GLuint
));
4445 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4448 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4452 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4455 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4456 /* shift and offset indexes */
4457 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4460 if (ctx
->Pixel
.MapStencilFlag
) {
4461 /* Apply stencil lookup table */
4462 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4464 for (i
= 0; i
< n
; i
++) {
4465 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4469 /* convert to dest type */
4471 case GL_UNSIGNED_BYTE
:
4473 GLubyte
*dst
= (GLubyte
*) dest
;
4475 for (i
= 0; i
< n
; i
++) {
4476 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4480 case GL_UNSIGNED_SHORT
:
4482 GLuint
*dst
= (GLuint
*) dest
;
4484 for (i
= 0; i
< n
; i
++) {
4485 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4489 case GL_UNSIGNED_INT
:
4490 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4492 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4494 GLuint
*dst
= (GLuint
*) dest
;
4496 for (i
= 0; i
< n
; i
++) {
4497 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4502 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4511 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4512 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4513 const struct gl_pixelstore_attrib
*dstPacking
)
4515 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4518 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4522 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4523 ctx
->Pixel
.MapStencilFlag
) {
4524 /* make a copy of input */
4525 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4526 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4531 case GL_UNSIGNED_BYTE
:
4532 memcpy(dest
, source
, n
);
4536 GLbyte
*dst
= (GLbyte
*) dest
;
4539 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4543 case GL_UNSIGNED_SHORT
:
4545 GLushort
*dst
= (GLushort
*) dest
;
4548 dst
[i
] = (GLushort
) source
[i
];
4550 if (dstPacking
->SwapBytes
) {
4551 _mesa_swap2( (GLushort
*) dst
, n
);
4557 GLshort
*dst
= (GLshort
*) dest
;
4560 dst
[i
] = (GLshort
) source
[i
];
4562 if (dstPacking
->SwapBytes
) {
4563 _mesa_swap2( (GLushort
*) dst
, n
);
4567 case GL_UNSIGNED_INT
:
4569 GLuint
*dst
= (GLuint
*) dest
;
4572 dst
[i
] = (GLuint
) source
[i
];
4574 if (dstPacking
->SwapBytes
) {
4575 _mesa_swap4( (GLuint
*) dst
, n
);
4581 GLint
*dst
= (GLint
*) dest
;
4584 dst
[i
] = (GLint
) source
[i
];
4586 if (dstPacking
->SwapBytes
) {
4587 _mesa_swap4( (GLuint
*) dst
, n
);
4593 GLfloat
*dst
= (GLfloat
*) dest
;
4596 dst
[i
] = (GLfloat
) source
[i
];
4598 if (dstPacking
->SwapBytes
) {
4599 _mesa_swap4( (GLuint
*) dst
, n
);
4603 case GL_HALF_FLOAT_ARB
:
4605 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4608 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4610 if (dstPacking
->SwapBytes
) {
4611 _mesa_swap2( (GLushort
*) dst
, n
);
4616 if (dstPacking
->LsbFirst
) {
4617 GLubyte
*dst
= (GLubyte
*) dest
;
4620 for (i
= 0; i
< n
; i
++) {
4623 *dst
|= ((source
[i
] != 0) << shift
);
4632 GLubyte
*dst
= (GLubyte
*) dest
;
4635 for (i
= 0; i
< n
; i
++) {
4638 *dst
|= ((source
[i
] != 0) << shift
);
4648 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4654 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4657 const GLTYPE *src = (const GLTYPE *)source; \
4658 for (i = 0; i < n; i++) { \
4659 GLTYPE value = src[i]; \
4660 if (srcPacking->SwapBytes) { \
4661 if (sizeof(GLTYPE) == 2) { \
4663 } else if (sizeof(GLTYPE) == 4) { \
4667 depthValues[i] = GLTYPE2FLOAT(value); \
4673 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4674 * or GLfloat values.
4675 * The glPixelTransfer (scale/bias) params will be applied.
4677 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4678 * \param depthMax max value for returned GLushort or GLuint values
4679 * (ignored for GLfloat).
4682 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4683 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4684 GLenum srcType
, const GLvoid
*source
,
4685 const struct gl_pixelstore_attrib
*srcPacking
)
4687 GLfloat
*depthTemp
= NULL
, *depthValues
;
4688 GLboolean needClamp
= GL_FALSE
;
4690 /* Look for special cases first.
4691 * Not only are these faster, they're less prone to numeric conversion
4692 * problems. Otherwise, converting from an int type to a float then
4693 * back to an int type can introduce errors that will show up as
4694 * artifacts in things like depth peeling which uses glCopyTexImage.
4696 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4697 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4698 const GLuint
*src
= (const GLuint
*) source
;
4699 GLushort
*dst
= (GLushort
*) dest
;
4701 for (i
= 0; i
< n
; i
++) {
4702 dst
[i
] = src
[i
] >> 16;
4706 if (srcType
== GL_UNSIGNED_SHORT
4707 && dstType
== GL_UNSIGNED_INT
4708 && depthMax
== 0xffffffff) {
4709 const GLushort
*src
= (const GLushort
*) source
;
4710 GLuint
*dst
= (GLuint
*) dest
;
4712 for (i
= 0; i
< n
; i
++) {
4713 dst
[i
] = src
[i
] | (src
[i
] << 16);
4717 if (srcType
== GL_UNSIGNED_INT_24_8
4718 && dstType
== GL_UNSIGNED_INT
4719 && depthMax
== 0xffffff) {
4720 const GLuint
*src
= (const GLuint
*) source
;
4721 GLuint
*dst
= (GLuint
*) dest
;
4723 for (i
= 0; i
< n
; i
++) {
4724 dst
[i
] = src
[i
] >> 8;
4728 /* XXX may want to add additional cases here someday */
4731 /* general case path follows */
4733 if (dstType
== GL_FLOAT
) {
4734 depthValues
= (GLfloat
*) dest
;
4737 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4739 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4743 depthValues
= depthTemp
;
4746 /* Convert incoming values to GLfloat. Some conversions will require
4751 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4752 needClamp
= GL_TRUE
;
4754 case GL_UNSIGNED_BYTE
:
4755 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4758 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4759 needClamp
= GL_TRUE
;
4761 case GL_UNSIGNED_SHORT
:
4762 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4765 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4766 needClamp
= GL_TRUE
;
4768 case GL_UNSIGNED_INT
:
4769 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4771 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4772 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4773 depthMax
== 0xffffff &&
4774 ctx
->Pixel
.DepthScale
== 1.0 &&
4775 ctx
->Pixel
.DepthBias
== 0.0) {
4776 const GLuint
*src
= (const GLuint
*) source
;
4777 GLuint
*zValues
= (GLuint
*) dest
;
4779 for (i
= 0; i
< n
; i
++) {
4780 GLuint value
= src
[i
];
4781 if (srcPacking
->SwapBytes
) {
4784 zValues
[i
] = value
& 0xffffff00;
4790 const GLuint
*src
= (const GLuint
*) source
;
4791 const GLfloat scale
= 1.0f
/ 0xffffff;
4793 for (i
= 0; i
< n
; i
++) {
4794 GLuint value
= src
[i
];
4795 if (srcPacking
->SwapBytes
) {
4798 depthValues
[i
] = (value
>> 8) * scale
;
4802 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4805 const GLfloat
*src
= (const GLfloat
*)source
;
4806 for (i
= 0; i
< n
; i
++) {
4807 GLfloat value
= src
[i
* 2];
4808 if (srcPacking
->SwapBytes
) {
4811 depthValues
[i
] = value
;
4813 needClamp
= GL_TRUE
;
4817 DEPTH_VALUES(GLfloat
, 1*);
4818 needClamp
= GL_TRUE
;
4820 case GL_HALF_FLOAT_ARB
:
4823 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4824 for (i
= 0; i
< n
; i
++) {
4825 GLhalfARB value
= src
[i
];
4826 if (srcPacking
->SwapBytes
) {
4829 depthValues
[i
] = _mesa_half_to_float(value
);
4831 needClamp
= GL_TRUE
;
4835 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4840 /* apply depth scale and bias */
4842 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4843 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4844 if (scale
!= 1.0 || bias
!= 0.0) {
4846 for (i
= 0; i
< n
; i
++) {
4847 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4849 needClamp
= GL_TRUE
;
4853 /* clamp to [0, 1] */
4856 for (i
= 0; i
< n
; i
++) {
4857 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4862 * Convert values to dstType
4864 if (dstType
== GL_UNSIGNED_INT
) {
4865 GLuint
*zValues
= (GLuint
*) dest
;
4867 if (depthMax
<= 0xffffff) {
4868 /* no overflow worries */
4869 for (i
= 0; i
< n
; i
++) {
4870 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4874 /* need to use double precision to prevent overflow problems */
4875 for (i
= 0; i
< n
; i
++) {
4876 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4877 if (z
>= (GLdouble
) 0xffffffff)
4878 zValues
[i
] = 0xffffffff;
4880 zValues
[i
] = (GLuint
) z
;
4884 else if (dstType
== GL_UNSIGNED_SHORT
) {
4885 GLushort
*zValues
= (GLushort
*) dest
;
4887 ASSERT(depthMax
<= 0xffff);
4888 for (i
= 0; i
< n
; i
++) {
4889 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4892 else if (dstType
== GL_FLOAT
) {
4893 /* Nothing to do. depthValues is pointing to dest. */
4895 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4896 GLfloat
*zValues
= (GLfloat
*) dest
;
4898 for (i
= 0; i
< n
; i
++) {
4899 zValues
[i
*2] = depthValues
[i
];
4911 * Pack an array of depth values. The values are floats in [0,1].
4914 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4915 GLenum dstType
, const GLfloat
*depthSpan
,
4916 const struct gl_pixelstore_attrib
*dstPacking
)
4918 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4920 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4924 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4925 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4926 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4927 depthSpan
= depthCopy
;
4931 case GL_UNSIGNED_BYTE
:
4933 GLubyte
*dst
= (GLubyte
*) dest
;
4935 for (i
= 0; i
< n
; i
++) {
4936 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4942 GLbyte
*dst
= (GLbyte
*) dest
;
4944 for (i
= 0; i
< n
; i
++) {
4945 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4949 case GL_UNSIGNED_SHORT
:
4951 GLushort
*dst
= (GLushort
*) dest
;
4953 for (i
= 0; i
< n
; i
++) {
4954 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4956 if (dstPacking
->SwapBytes
) {
4957 _mesa_swap2( (GLushort
*) dst
, n
);
4963 GLshort
*dst
= (GLshort
*) dest
;
4965 for (i
= 0; i
< n
; i
++) {
4966 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4968 if (dstPacking
->SwapBytes
) {
4969 _mesa_swap2( (GLushort
*) dst
, n
);
4973 case GL_UNSIGNED_INT
:
4975 GLuint
*dst
= (GLuint
*) dest
;
4977 for (i
= 0; i
< n
; i
++) {
4978 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4980 if (dstPacking
->SwapBytes
) {
4981 _mesa_swap4( (GLuint
*) dst
, n
);
4987 GLint
*dst
= (GLint
*) dest
;
4989 for (i
= 0; i
< n
; i
++) {
4990 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4992 if (dstPacking
->SwapBytes
) {
4993 _mesa_swap4( (GLuint
*) dst
, n
);
4999 GLfloat
*dst
= (GLfloat
*) dest
;
5001 for (i
= 0; i
< n
; i
++) {
5002 dst
[i
] = depthSpan
[i
];
5004 if (dstPacking
->SwapBytes
) {
5005 _mesa_swap4( (GLuint
*) dst
, n
);
5009 case GL_HALF_FLOAT_ARB
:
5011 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5013 for (i
= 0; i
< n
; i
++) {
5014 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5016 if (dstPacking
->SwapBytes
) {
5017 _mesa_swap2( (GLushort
*) dst
, n
);
5022 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5031 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5034 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5035 GLenum dstType
, GLuint
*dest
,
5036 const GLfloat
*depthVals
,
5037 const GLubyte
*stencilVals
,
5038 const struct gl_pixelstore_attrib
*dstPacking
)
5040 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5041 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5044 if (!depthCopy
|| !stencilCopy
) {
5045 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5051 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5052 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5053 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5054 depthVals
= depthCopy
;
5057 if (ctx
->Pixel
.IndexShift
||
5058 ctx
->Pixel
.IndexOffset
||
5059 ctx
->Pixel
.MapStencilFlag
) {
5060 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5061 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5062 stencilVals
= stencilCopy
;
5066 case GL_UNSIGNED_INT_24_8
:
5067 for (i
= 0; i
< n
; i
++) {
5068 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5069 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5072 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5073 for (i
= 0; i
< n
; i
++) {
5074 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5075 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5080 if (dstPacking
->SwapBytes
) {
5081 _mesa_swap4(dest
, n
);
5092 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5093 * Return all image data in a contiguous block. This is used when we
5094 * compile glDrawPixels, glTexImage, etc into a display list. We
5095 * need a copy of the data in a standard format.
5098 _mesa_unpack_image( GLuint dimensions
,
5099 GLsizei width
, GLsizei height
, GLsizei depth
,
5100 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5101 const struct gl_pixelstore_attrib
*unpack
)
5103 GLint bytesPerRow
, compsPerRow
;
5104 GLboolean flipBytes
, swap2
, swap4
;
5107 return NULL
; /* not necessarily an error */
5109 if (width
<= 0 || height
<= 0 || depth
<= 0)
5110 return NULL
; /* generate error later */
5112 if (type
== GL_BITMAP
) {
5113 bytesPerRow
= (width
+ 7) >> 3;
5114 flipBytes
= unpack
->LsbFirst
;
5115 swap2
= swap4
= GL_FALSE
;
5119 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5120 GLint components
= _mesa_components_in_format(format
);
5123 if (_mesa_type_is_packed(type
))
5126 if (bytesPerPixel
<= 0 || components
<= 0)
5127 return NULL
; /* bad format or type. generate error later */
5128 bytesPerRow
= bytesPerPixel
* width
;
5129 bytesPerComp
= bytesPerPixel
/ components
;
5130 flipBytes
= GL_FALSE
;
5131 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5132 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5133 compsPerRow
= components
* width
;
5134 assert(compsPerRow
>= width
);
5139 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5143 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5146 for (img
= 0; img
< depth
; img
++) {
5147 for (row
= 0; row
< height
; row
++) {
5148 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5149 width
, height
, format
, type
, img
, row
, 0);
5151 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5153 flipBytes
= GL_FALSE
;
5154 if (unpack
->LsbFirst
) {
5155 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5156 GLubyte dstMask
= 128;
5157 const GLubyte
*s
= src
;
5160 for (i
= 0; i
< width
; i
++) {
5164 if (srcMask
== 128) {
5169 srcMask
= srcMask
<< 1;
5177 dstMask
= dstMask
>> 1;
5182 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5183 GLubyte dstMask
= 128;
5184 const GLubyte
*s
= src
;
5187 for (i
= 0; i
< width
; i
++) {
5196 srcMask
= srcMask
>> 1;
5204 dstMask
= dstMask
>> 1;
5210 memcpy(dst
, src
, bytesPerRow
);
5213 /* byte flipping/swapping */
5215 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5218 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5221 _mesa_swap4((GLuint
*) dst
, compsPerRow
);