2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Image and pixel span packing and unpacking.
39 #include "pixeltransfer.h"
41 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
46 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
47 * we later convert the float to a packed integer value (such as for
48 * GL_RGB5_A1) because we'll wind up with a non-zero value.
50 * We redefine the macros here so zero is handled correctly.
53 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
56 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
60 /** Compute ceiling of integer quotient of A divided by B. */
61 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
65 * Flip the 8 bits in each byte of the given array.
68 * \param n number of bytes.
70 * \todo try this trick to flip bytes someday:
72 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
73 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
74 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
78 flip_bytes( GLubyte
*p
, GLuint n
)
81 for (i
= 0; i
< n
; i
++) {
82 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
83 a
= ((b
& 0x01) << 7) |
98 * Unpack a 32x32 pixel polygon stipple from user memory using the
99 * current pixel unpack settings.
102 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
103 const struct gl_pixelstore_attrib
*unpacking
)
105 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
107 /* Convert pattern from GLubytes to GLuints and handle big/little
112 for (i
= 0; i
< 32; i
++) {
113 dest
[i
] = (p
[0] << 24)
125 * Pack polygon stipple into user memory given current pixel packing
129 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
130 const struct gl_pixelstore_attrib
*packing
)
132 /* Convert pattern from GLuints to GLubytes to handle big/little
133 * endian differences.
137 for (i
= 0; i
< 32; i
++) {
138 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
139 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
140 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
141 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
144 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
149 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
150 * order with row alignment = 1 byte.
153 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
154 const struct gl_pixelstore_attrib
*packing
)
156 GLint bytes
, row
, width_in_bytes
;
157 GLubyte
*buffer
, *dst
;
162 /* Alloc dest storage */
163 bytes
= ((width
+ 7) / 8 * height
);
164 buffer
= (GLubyte
*) malloc( bytes
);
168 width_in_bytes
= CEILING( width
, 8 );
170 for (row
= 0; row
< height
; row
++) {
171 const GLubyte
*src
= (const GLubyte
*)
172 _mesa_image_address2d(packing
, pixels
, width
, height
,
173 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
179 if ((packing
->SkipPixels
& 7) == 0) {
180 memcpy( dst
, src
, width_in_bytes
);
181 if (packing
->LsbFirst
) {
182 flip_bytes( dst
, width_in_bytes
);
186 /* handling SkipPixels is a bit tricky (no pun intended!) */
188 if (packing
->LsbFirst
) {
189 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
190 GLubyte dstMask
= 128;
191 const GLubyte
*s
= src
;
194 for (i
= 0; i
< width
; i
++) {
198 if (srcMask
== 128) {
203 srcMask
= srcMask
<< 1;
211 dstMask
= dstMask
>> 1;
216 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
217 GLubyte dstMask
= 128;
218 const GLubyte
*s
= src
;
221 for (i
= 0; i
< width
; i
++) {
230 srcMask
= srcMask
>> 1;
238 dstMask
= dstMask
>> 1;
243 dst
+= width_in_bytes
;
254 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
255 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
257 GLint row
, width_in_bytes
;
263 width_in_bytes
= CEILING( width
, 8 );
265 for (row
= 0; row
< height
; row
++) {
266 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
267 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
271 if ((packing
->SkipPixels
& 7) == 0) {
272 memcpy( dst
, src
, width_in_bytes
);
273 if (packing
->LsbFirst
) {
274 flip_bytes( dst
, width_in_bytes
);
278 /* handling SkipPixels is a bit tricky (no pun intended!) */
280 if (packing
->LsbFirst
) {
281 GLubyte srcMask
= 128;
282 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
283 const GLubyte
*s
= src
;
286 for (i
= 0; i
< width
; i
++) {
295 srcMask
= srcMask
>> 1;
297 if (dstMask
== 128) {
303 dstMask
= dstMask
<< 1;
308 GLubyte srcMask
= 128;
309 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
310 const GLubyte
*s
= src
;
313 for (i
= 0; i
< width
; i
++) {
322 srcMask
= srcMask
>> 1;
330 dstMask
= dstMask
>> 1;
335 src
+= width_in_bytes
;
341 * Get indexes of color components for a basic color format, such as
342 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
346 get_component_indexes(GLenum format
,
351 GLint
*luminanceIndex
,
352 GLint
*intensityIndex
)
358 *luminanceIndex
= -1;
359 *intensityIndex
= -1;
363 case GL_LUMINANCE_INTEGER_EXT
:
366 case GL_LUMINANCE_ALPHA
:
367 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
375 case GL_RED_INTEGER_EXT
:
379 case GL_GREEN_INTEGER_EXT
:
383 case GL_BLUE_INTEGER_EXT
:
387 case GL_ALPHA_INTEGER_EXT
:
396 case GL_RGB_INTEGER_EXT
:
402 case GL_BGR_INTEGER_EXT
:
408 case GL_RGBA_INTEGER_EXT
:
415 case GL_BGRA_INTEGER
:
433 assert(0 && "bad format in get_component_indexes()");
440 * For small integer types, return the min and max possible values.
441 * Used for clamping floats to unscaled integer types.
442 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
445 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
452 case GL_UNSIGNED_BYTE
:
460 case GL_UNSIGNED_SHORT
:
472 * Used to pack an array [][4] of RGBA float colors as specified
473 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
474 * Historically, the RGBA values were in [0,1] and rescaled to fit
475 * into GLubytes, etc. But with new integer formats, the RGBA values
476 * may have any value and we don't always rescale when converting to
479 * Note: the rgba values will be modified by this function when any pixel
480 * transfer ops are enabled.
483 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
484 GLenum dstFormat
, GLenum dstType
,
486 const struct gl_pixelstore_attrib
*dstPacking
,
487 GLbitfield transferOps
)
490 const GLint comps
= _mesa_components_in_format(dstFormat
);
491 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
494 if (dstFormat
== GL_LUMINANCE
||
495 dstFormat
== GL_LUMINANCE_ALPHA
||
496 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
497 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
498 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
500 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
509 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
513 * Component clamping (besides clamping to [0,1] in
514 * _mesa_apply_rgba_transfer_ops()).
517 /* clamping to dest type's min/max values */
519 if (get_type_min_max(dstType
, &min
, &max
)) {
520 for (i
= 0; i
< n
; i
++) {
521 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
522 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
523 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
524 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
528 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
529 /* compute luminance values */
530 if (transferOps
& IMAGE_CLAMP_BIT
) {
531 for (i
= 0; i
< n
; i
++) {
532 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
533 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
537 for (i
= 0; i
< n
; i
++) {
538 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
544 * Pack/store the pixels. Ugh! Lots of cases!!!
547 case GL_UNSIGNED_BYTE
:
549 GLubyte
*dst
= (GLubyte
*) dstAddr
;
553 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
557 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
561 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
565 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
569 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
571 case GL_LUMINANCE_ALPHA
:
573 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
574 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
579 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
580 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
585 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
586 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
587 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
592 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
593 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
594 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
595 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
600 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
601 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
602 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
607 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
608 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
609 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
610 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
615 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
616 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
617 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
618 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
621 case GL_RED_INTEGER_EXT
:
623 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
626 case GL_GREEN_INTEGER_EXT
:
628 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
631 case GL_BLUE_INTEGER_EXT
:
633 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
636 case GL_ALPHA_INTEGER_EXT
:
638 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
641 case GL_RGB_INTEGER_EXT
:
643 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
644 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
645 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
648 case GL_RGBA_INTEGER_EXT
:
650 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
651 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
652 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
653 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
656 case GL_BGR_INTEGER_EXT
:
658 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
659 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
660 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
663 case GL_BGRA_INTEGER_EXT
:
665 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
666 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
667 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
668 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
671 case GL_LUMINANCE_INTEGER_EXT
:
673 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
676 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
679 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
681 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
689 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
690 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
694 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
700 GLbyte
*dst
= (GLbyte
*) dstAddr
;
704 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
708 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
712 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
716 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
720 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
722 case GL_LUMINANCE_ALPHA
:
724 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
725 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
730 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
731 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
736 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
737 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
738 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
743 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
744 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
745 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
746 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
751 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
752 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
753 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
758 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
759 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
760 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
761 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
766 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
767 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
768 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
769 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
772 case GL_RED_INTEGER_EXT
:
774 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
777 case GL_GREEN_INTEGER_EXT
:
779 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
782 case GL_BLUE_INTEGER_EXT
:
784 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
787 case GL_ALPHA_INTEGER_EXT
:
789 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
792 case GL_RGB_INTEGER_EXT
:
794 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
795 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
796 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
799 case GL_RGBA_INTEGER_EXT
:
801 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
802 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
803 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
804 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
807 case GL_BGR_INTEGER_EXT
:
809 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
810 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
811 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
814 case GL_BGRA_INTEGER_EXT
:
816 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
817 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
818 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
819 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
822 case GL_LUMINANCE_INTEGER_EXT
:
824 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
827 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
830 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
832 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
840 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
841 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
845 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
849 case GL_UNSIGNED_SHORT
:
851 GLushort
*dst
= (GLushort
*) dstAddr
;
855 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
859 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
863 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
867 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
871 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
873 case GL_LUMINANCE_ALPHA
:
875 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
876 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
881 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
882 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
887 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
888 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
889 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
894 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
895 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
896 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
897 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
902 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
903 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
904 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
909 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
910 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
911 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
912 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
917 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
918 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
919 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
920 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
923 case GL_RED_INTEGER_EXT
:
925 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
928 case GL_GREEN_INTEGER_EXT
:
930 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
933 case GL_BLUE_INTEGER_EXT
:
935 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
938 case GL_ALPHA_INTEGER_EXT
:
940 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
943 case GL_RGB_INTEGER_EXT
:
945 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
946 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
947 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
950 case GL_RGBA_INTEGER_EXT
:
952 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
953 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
954 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
955 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
958 case GL_BGR_INTEGER_EXT
:
960 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
961 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
962 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
965 case GL_BGRA_INTEGER_EXT
:
967 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
968 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
969 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
970 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
973 case GL_LUMINANCE_INTEGER_EXT
:
975 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
978 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
981 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
983 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
991 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
992 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
996 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1002 GLshort
*dst
= (GLshort
*) dstAddr
;
1003 switch (dstFormat
) {
1006 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1010 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1014 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1018 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1022 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1024 case GL_LUMINANCE_ALPHA
:
1026 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1027 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1032 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1033 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1038 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1039 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1040 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1045 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1046 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1047 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1048 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1053 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1054 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1055 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1060 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1061 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1062 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1063 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1068 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1069 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1070 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1071 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1074 case GL_RED_INTEGER_EXT
:
1076 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1079 case GL_GREEN_INTEGER_EXT
:
1081 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1084 case GL_BLUE_INTEGER_EXT
:
1086 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1089 case GL_ALPHA_INTEGER_EXT
:
1091 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1094 case GL_RGB_INTEGER_EXT
:
1096 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1097 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1098 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1101 case GL_RGBA_INTEGER_EXT
:
1103 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1104 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1105 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1106 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1109 case GL_BGR_INTEGER_EXT
:
1111 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1112 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1113 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1116 case GL_BGRA_INTEGER_EXT
:
1118 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1119 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1120 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1121 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1124 case GL_LUMINANCE_INTEGER_EXT
:
1126 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1129 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1132 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1134 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1142 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1143 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1147 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1151 case GL_UNSIGNED_INT
:
1153 GLuint
*dst
= (GLuint
*) dstAddr
;
1154 switch (dstFormat
) {
1157 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1161 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1165 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1169 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1173 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1175 case GL_LUMINANCE_ALPHA
:
1177 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1178 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1183 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1184 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1189 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1190 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1191 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1196 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1197 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1198 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1199 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1204 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1205 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1206 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1211 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1212 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1213 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1214 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1219 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1220 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1221 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1222 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1225 case GL_RED_INTEGER_EXT
:
1227 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1230 case GL_GREEN_INTEGER_EXT
:
1232 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1235 case GL_BLUE_INTEGER_EXT
:
1237 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1240 case GL_ALPHA_INTEGER_EXT
:
1242 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1245 case GL_RGB_INTEGER_EXT
:
1247 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1248 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1249 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1252 case GL_RGBA_INTEGER_EXT
:
1254 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1255 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1256 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1257 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1260 case GL_BGR_INTEGER_EXT
:
1262 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1263 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1264 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1267 case GL_BGRA_INTEGER_EXT
:
1269 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1270 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1271 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1272 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1275 case GL_LUMINANCE_INTEGER_EXT
:
1277 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1280 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1283 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1285 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1293 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1294 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1298 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1304 GLint
*dst
= (GLint
*) dstAddr
;
1305 switch (dstFormat
) {
1308 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1312 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1316 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1320 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1324 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1326 case GL_LUMINANCE_ALPHA
:
1328 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1329 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1334 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1335 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1340 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1341 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1342 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1347 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1348 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1349 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1350 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1355 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1356 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1357 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1362 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1363 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1364 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1365 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1370 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1371 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1372 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1373 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1379 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1380 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1383 case GL_RED_INTEGER_EXT
:
1385 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1388 case GL_GREEN_INTEGER_EXT
:
1390 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1393 case GL_BLUE_INTEGER_EXT
:
1395 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1398 case GL_ALPHA_INTEGER_EXT
:
1400 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1403 case GL_RGB_INTEGER_EXT
:
1405 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1406 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1407 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1410 case GL_RGBA_INTEGER_EXT
:
1412 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1413 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1414 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1415 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1418 case GL_BGR_INTEGER_EXT
:
1420 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1421 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1422 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1425 case GL_BGRA_INTEGER_EXT
:
1427 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1428 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1429 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1430 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1433 case GL_LUMINANCE_INTEGER_EXT
:
1435 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1438 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1441 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1443 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1449 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1455 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1456 switch (dstFormat
) {
1459 dst
[i
] = rgba
[i
][RCOMP
];
1463 dst
[i
] = rgba
[i
][GCOMP
];
1467 dst
[i
] = rgba
[i
][BCOMP
];
1471 dst
[i
] = rgba
[i
][ACOMP
];
1475 dst
[i
] = luminance
[i
];
1477 case GL_LUMINANCE_ALPHA
:
1479 dst
[i
*2+0] = luminance
[i
];
1480 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1485 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1486 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1491 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1492 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1493 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1498 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1499 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1500 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1501 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1506 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1507 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1508 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1513 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1514 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1515 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1516 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1521 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1522 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1523 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1524 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1530 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1531 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1535 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1539 case GL_HALF_FLOAT_ARB
:
1541 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1542 switch (dstFormat
) {
1545 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1549 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1553 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1557 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1561 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1563 case GL_LUMINANCE_ALPHA
:
1565 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1566 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1571 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1572 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1577 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1578 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1579 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1584 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1585 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1586 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1587 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1592 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1593 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1594 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1599 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1600 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1601 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1602 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1607 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1608 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1609 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1610 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1616 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1617 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1621 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1625 case GL_UNSIGNED_BYTE_3_3_2
:
1626 if (dstFormat
== GL_RGB
) {
1627 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1629 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1630 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1631 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1635 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1636 if (dstFormat
== GL_RGB
) {
1637 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1639 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1640 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1641 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1645 case GL_UNSIGNED_SHORT_5_6_5
:
1646 if (dstFormat
== GL_RGB
) {
1647 GLushort
*dst
= (GLushort
*) dstAddr
;
1649 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1650 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1651 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1655 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1656 if (dstFormat
== GL_RGB
) {
1657 GLushort
*dst
= (GLushort
*) dstAddr
;
1659 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1660 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1661 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1665 case GL_UNSIGNED_SHORT_4_4_4_4
:
1666 if (dstFormat
== GL_RGBA
) {
1667 GLushort
*dst
= (GLushort
*) dstAddr
;
1669 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1670 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1671 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1672 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1675 else if (dstFormat
== GL_BGRA
) {
1676 GLushort
*dst
= (GLushort
*) dstAddr
;
1678 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1679 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1680 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1681 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1684 else if (dstFormat
== GL_ABGR_EXT
) {
1685 GLushort
*dst
= (GLushort
*) dstAddr
;
1687 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1688 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1689 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1690 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1694 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1695 if (dstFormat
== GL_RGBA
) {
1696 GLushort
*dst
= (GLushort
*) dstAddr
;
1698 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1699 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1700 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1701 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1704 else if (dstFormat
== GL_BGRA
) {
1705 GLushort
*dst
= (GLushort
*) dstAddr
;
1707 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1708 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1709 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1710 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1713 else if (dstFormat
== GL_ABGR_EXT
) {
1714 GLushort
*dst
= (GLushort
*) dstAddr
;
1716 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1717 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1718 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1719 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1723 case GL_UNSIGNED_SHORT_5_5_5_1
:
1724 if (dstFormat
== GL_RGBA
) {
1725 GLushort
*dst
= (GLushort
*) dstAddr
;
1727 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1728 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1729 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1730 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1733 else if (dstFormat
== GL_BGRA
) {
1734 GLushort
*dst
= (GLushort
*) dstAddr
;
1736 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1737 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1738 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1739 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1742 else if (dstFormat
== GL_ABGR_EXT
) {
1743 GLushort
*dst
= (GLushort
*) dstAddr
;
1745 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1746 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1747 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1748 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1752 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1753 if (dstFormat
== GL_RGBA
) {
1754 GLushort
*dst
= (GLushort
*) dstAddr
;
1756 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1757 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1758 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1759 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1762 else if (dstFormat
== GL_BGRA
) {
1763 GLushort
*dst
= (GLushort
*) dstAddr
;
1765 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1766 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1767 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1768 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1771 else if (dstFormat
== GL_ABGR_EXT
) {
1772 GLushort
*dst
= (GLushort
*) dstAddr
;
1774 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1775 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1776 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1777 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1781 case GL_UNSIGNED_INT_8_8_8_8
:
1782 if (dstFormat
== GL_RGBA
) {
1783 GLuint
*dst
= (GLuint
*) dstAddr
;
1785 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1786 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1787 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1788 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1791 else if (dstFormat
== GL_BGRA
) {
1792 GLuint
*dst
= (GLuint
*) dstAddr
;
1794 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1795 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1796 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1797 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1800 else if (dstFormat
== GL_ABGR_EXT
) {
1801 GLuint
*dst
= (GLuint
*) dstAddr
;
1803 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1804 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1805 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1806 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1810 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1811 if (dstFormat
== GL_RGBA
) {
1812 GLuint
*dst
= (GLuint
*) dstAddr
;
1814 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1815 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1816 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1817 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1820 else if (dstFormat
== GL_BGRA
) {
1821 GLuint
*dst
= (GLuint
*) dstAddr
;
1823 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1824 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1825 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1826 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1829 else if (dstFormat
== GL_ABGR_EXT
) {
1830 GLuint
*dst
= (GLuint
*) dstAddr
;
1832 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1833 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1834 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1835 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1839 case GL_UNSIGNED_INT_10_10_10_2
:
1840 if (dstFormat
== GL_RGBA
) {
1841 GLuint
*dst
= (GLuint
*) dstAddr
;
1843 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1844 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1845 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1846 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1849 else if (dstFormat
== GL_BGRA
) {
1850 GLuint
*dst
= (GLuint
*) dstAddr
;
1852 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1853 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1854 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1855 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1858 else if (dstFormat
== GL_ABGR_EXT
) {
1859 GLuint
*dst
= (GLuint
*) dstAddr
;
1861 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1862 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1863 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1864 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1868 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1869 if (dstFormat
== GL_RGBA
) {
1870 GLuint
*dst
= (GLuint
*) dstAddr
;
1872 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1873 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1874 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1875 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1878 else if (dstFormat
== GL_BGRA
) {
1879 GLuint
*dst
= (GLuint
*) dstAddr
;
1881 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1882 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1883 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1884 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1887 else if (dstFormat
== GL_ABGR_EXT
) {
1888 GLuint
*dst
= (GLuint
*) dstAddr
;
1890 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1891 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1892 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1893 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1897 case GL_UNSIGNED_INT_5_9_9_9_REV
:
1899 GLuint
*dst
= (GLuint
*) dstAddr
;
1900 for (i
= 0; i
< n
; i
++) {
1901 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
1906 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1910 if (dstPacking
->SwapBytes
) {
1911 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1912 if (swapSize
== 2) {
1913 if (dstPacking
->SwapBytes
) {
1914 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1917 else if (swapSize
== 4) {
1918 if (dstPacking
->SwapBytes
) {
1919 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1929 #define SWAP2BYTE(VALUE) \
1931 GLubyte *bytes = (GLubyte *) &(VALUE); \
1932 GLubyte tmp = bytes[0]; \
1933 bytes[0] = bytes[1]; \
1937 #define SWAP4BYTE(VALUE) \
1939 GLubyte *bytes = (GLubyte *) &(VALUE); \
1940 GLubyte tmp = bytes[0]; \
1941 bytes[0] = bytes[3]; \
1944 bytes[1] = bytes[2]; \
1950 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1951 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1952 const struct gl_pixelstore_attrib
*unpack
)
1954 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1956 ASSERT(srcType
== GL_BITMAP
||
1957 srcType
== GL_UNSIGNED_BYTE
||
1958 srcType
== GL_BYTE
||
1959 srcType
== GL_UNSIGNED_SHORT
||
1960 srcType
== GL_SHORT
||
1961 srcType
== GL_UNSIGNED_INT
||
1962 srcType
== GL_INT
||
1963 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1964 srcType
== GL_HALF_FLOAT_ARB
||
1965 srcType
== GL_FLOAT
);
1970 GLubyte
*ubsrc
= (GLubyte
*) src
;
1971 if (unpack
->LsbFirst
) {
1972 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1974 for (i
= 0; i
< n
; i
++) {
1975 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1986 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1988 for (i
= 0; i
< n
; i
++) {
1989 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2001 case GL_UNSIGNED_BYTE
:
2004 const GLubyte
*s
= (const GLubyte
*) src
;
2005 for (i
= 0; i
< n
; i
++)
2012 const GLbyte
*s
= (const GLbyte
*) src
;
2013 for (i
= 0; i
< n
; i
++)
2017 case GL_UNSIGNED_SHORT
:
2020 const GLushort
*s
= (const GLushort
*) src
;
2021 if (unpack
->SwapBytes
) {
2022 for (i
= 0; i
< n
; i
++) {
2023 GLushort value
= s
[i
];
2029 for (i
= 0; i
< n
; i
++)
2037 const GLshort
*s
= (const GLshort
*) src
;
2038 if (unpack
->SwapBytes
) {
2039 for (i
= 0; i
< n
; i
++) {
2040 GLshort value
= s
[i
];
2046 for (i
= 0; i
< n
; i
++)
2051 case GL_UNSIGNED_INT
:
2054 const GLuint
*s
= (const GLuint
*) src
;
2055 if (unpack
->SwapBytes
) {
2056 for (i
= 0; i
< n
; i
++) {
2057 GLuint value
= s
[i
];
2063 for (i
= 0; i
< n
; i
++)
2071 const GLint
*s
= (const GLint
*) src
;
2072 if (unpack
->SwapBytes
) {
2073 for (i
= 0; i
< n
; i
++) {
2080 for (i
= 0; i
< n
; i
++)
2088 const GLfloat
*s
= (const GLfloat
*) src
;
2089 if (unpack
->SwapBytes
) {
2090 for (i
= 0; i
< n
; i
++) {
2091 GLfloat value
= s
[i
];
2093 indexes
[i
] = (GLuint
) value
;
2097 for (i
= 0; i
< n
; i
++)
2098 indexes
[i
] = (GLuint
) s
[i
];
2102 case GL_HALF_FLOAT_ARB
:
2105 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2106 if (unpack
->SwapBytes
) {
2107 for (i
= 0; i
< n
; i
++) {
2108 GLhalfARB value
= s
[i
];
2110 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2114 for (i
= 0; i
< n
; i
++)
2115 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2119 case GL_UNSIGNED_INT_24_8_EXT
:
2122 const GLuint
*s
= (const GLuint
*) src
;
2123 if (unpack
->SwapBytes
) {
2124 for (i
= 0; i
< n
; i
++) {
2125 GLuint value
= s
[i
];
2127 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2131 for (i
= 0; i
< n
; i
++)
2132 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2138 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2145 * Return source/dest RGBA indexes for unpacking pixels.
2148 get_component_mapping(GLenum format
,
2160 case GL_RED_INTEGER_EXT
:
2162 *gSrc
= *bSrc
= *aSrc
= -1;
2165 case GL_GREEN_INTEGER_EXT
:
2167 *rSrc
= *bSrc
= *aSrc
= -1;
2170 case GL_BLUE_INTEGER_EXT
:
2172 *rSrc
= *gSrc
= *aSrc
= -1;
2175 case GL_ALPHA_INTEGER_EXT
:
2176 *rSrc
= *gSrc
= *bSrc
= -1;
2180 case GL_LUMINANCE_INTEGER_EXT
:
2181 *rSrc
= *gSrc
= *bSrc
= 0;
2184 case GL_LUMINANCE_ALPHA
:
2185 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2186 *rSrc
= *gSrc
= *bSrc
= 0;
2190 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2204 case GL_RGB_INTEGER
:
2225 case GL_RGBA_INTEGER
:
2263 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2264 _mesa_lookup_enum_by_nr(format
));
2272 * This function extracts floating point RGBA values from arbitrary
2273 * image data. srcFormat and srcType are the format and type parameters
2274 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2276 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2277 * implements the "Conversion to floating point", "Conversion to RGB",
2278 * and "Final Expansion to RGBA" operations.
2280 * Args: n - number of pixels
2281 * rgba - output colors
2282 * srcFormat - format of incoming data
2283 * srcType - data type of incoming data
2284 * src - source data pointer
2285 * swapBytes - perform byteswapping of incoming data?
2288 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2289 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2290 GLboolean swapBytes
)
2292 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2294 GLint rDst
, bDst
, gDst
, aDst
;
2295 GLboolean intFormat
;
2296 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2298 ASSERT(srcFormat
== GL_RED
||
2299 srcFormat
== GL_GREEN
||
2300 srcFormat
== GL_BLUE
||
2301 srcFormat
== GL_ALPHA
||
2302 srcFormat
== GL_LUMINANCE
||
2303 srcFormat
== GL_LUMINANCE_ALPHA
||
2304 srcFormat
== GL_INTENSITY
||
2305 srcFormat
== GL_RG
||
2306 srcFormat
== GL_RGB
||
2307 srcFormat
== GL_BGR
||
2308 srcFormat
== GL_RGBA
||
2309 srcFormat
== GL_BGRA
||
2310 srcFormat
== GL_ABGR_EXT
||
2311 srcFormat
== GL_DU8DV8_ATI
||
2312 srcFormat
== GL_DUDV_ATI
||
2313 srcFormat
== GL_RED_INTEGER_EXT
||
2314 srcFormat
== GL_GREEN_INTEGER_EXT
||
2315 srcFormat
== GL_BLUE_INTEGER_EXT
||
2316 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2317 srcFormat
== GL_RGB_INTEGER_EXT
||
2318 srcFormat
== GL_RGBA_INTEGER_EXT
||
2319 srcFormat
== GL_BGR_INTEGER_EXT
||
2320 srcFormat
== GL_BGRA_INTEGER_EXT
||
2321 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2322 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2324 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2325 srcType
== GL_BYTE
||
2326 srcType
== GL_UNSIGNED_SHORT
||
2327 srcType
== GL_SHORT
||
2328 srcType
== GL_UNSIGNED_INT
||
2329 srcType
== GL_INT
||
2330 srcType
== GL_HALF_FLOAT_ARB
||
2331 srcType
== GL_FLOAT
||
2332 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2333 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2334 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2335 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2336 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2337 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2338 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2339 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2340 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2341 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2342 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2343 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2344 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
);
2346 get_component_mapping(srcFormat
,
2347 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2348 &rDst
, &gDst
, &bDst
, &aDst
);
2350 stride
= _mesa_components_in_format(srcFormat
);
2352 intFormat
= _mesa_is_integer_format(srcFormat
);
2354 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2355 if ((SRC_INDEX) < 0) { \
2358 for (i = 0; i < n; i++) { \
2359 rgba[i][DST_INDEX] = DEFAULT_INT; \
2363 for (i = 0; i < n; i++) { \
2364 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2368 else if (swapBytes) { \
2369 const TYPE *s = (const TYPE *) src; \
2371 for (i = 0; i < n; i++) { \
2372 TYPE value = s[SRC_INDEX]; \
2373 if (sizeof(TYPE) == 2) { \
2376 else if (sizeof(TYPE) == 4) { \
2380 rgba[i][DST_INDEX] = (GLfloat) value; \
2382 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2387 const TYPE *s = (const TYPE *) src; \
2390 for (i = 0; i < n; i++) { \
2391 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2396 for (i = 0; i < n; i++) { \
2397 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2404 case GL_UNSIGNED_BYTE
:
2405 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2406 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2407 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2408 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2411 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2412 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2413 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2414 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2416 case GL_UNSIGNED_SHORT
:
2417 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2418 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2419 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2420 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2423 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2424 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2425 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2426 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2428 case GL_UNSIGNED_INT
:
2429 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2430 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2431 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2432 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2435 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2436 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2437 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2438 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2441 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2442 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2443 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2444 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2446 case GL_HALF_FLOAT_ARB
:
2447 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2448 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2449 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2450 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2452 case GL_UNSIGNED_BYTE_3_3_2
:
2454 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2461 for (i
= 0; i
< n
; i
++) {
2462 GLubyte p
= ubsrc
[i
];
2463 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2464 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2465 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2466 rgba
[i
][aDst
] = 1.0F
;
2470 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2472 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2479 for (i
= 0; i
< n
; i
++) {
2480 GLubyte p
= ubsrc
[i
];
2481 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2482 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2483 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2484 rgba
[i
][aDst
] = 1.0F
;
2488 case GL_UNSIGNED_SHORT_5_6_5
:
2495 const GLushort
*ussrc
= (const GLushort
*) src
;
2497 for (i
= 0; i
< n
; i
++) {
2498 GLushort p
= ussrc
[i
];
2500 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2501 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2502 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2503 rgba
[i
][aDst
] = 1.0F
;
2507 const GLushort
*ussrc
= (const GLushort
*) src
;
2509 for (i
= 0; i
< n
; i
++) {
2510 GLushort p
= ussrc
[i
];
2511 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2512 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2513 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2514 rgba
[i
][aDst
] = 1.0F
;
2518 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2525 const GLushort
*ussrc
= (const GLushort
*) src
;
2527 for (i
= 0; i
< n
; i
++) {
2528 GLushort p
= ussrc
[i
];
2530 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2531 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2532 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2533 rgba
[i
][aDst
] = 1.0F
;
2537 const GLushort
*ussrc
= (const GLushort
*) src
;
2539 for (i
= 0; i
< n
; i
++) {
2540 GLushort p
= ussrc
[i
];
2541 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2542 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2543 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2544 rgba
[i
][aDst
] = 1.0F
;
2548 case GL_UNSIGNED_SHORT_4_4_4_4
:
2550 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2553 const GLushort
*ussrc
= (const GLushort
*) src
;
2555 for (i
= 0; i
< n
; i
++) {
2556 GLushort p
= ussrc
[i
];
2558 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2559 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2560 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2561 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2565 const GLushort
*ussrc
= (const GLushort
*) src
;
2567 for (i
= 0; i
< n
; i
++) {
2568 GLushort p
= ussrc
[i
];
2569 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2570 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2571 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2572 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2576 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2578 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2581 const GLushort
*ussrc
= (const GLushort
*) src
;
2583 for (i
= 0; i
< n
; i
++) {
2584 GLushort p
= ussrc
[i
];
2586 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2587 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2588 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2589 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2593 const GLushort
*ussrc
= (const GLushort
*) src
;
2595 for (i
= 0; i
< n
; i
++) {
2596 GLushort p
= ussrc
[i
];
2597 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2598 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2599 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2600 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2604 case GL_UNSIGNED_SHORT_5_5_5_1
:
2606 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2609 const GLushort
*ussrc
= (const GLushort
*) src
;
2611 for (i
= 0; i
< n
; i
++) {
2612 GLushort p
= ussrc
[i
];
2614 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2615 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2616 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2617 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2621 const GLushort
*ussrc
= (const GLushort
*) src
;
2623 for (i
= 0; i
< n
; i
++) {
2624 GLushort p
= ussrc
[i
];
2625 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2626 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2627 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2628 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2632 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2634 rs
= gs
= bs
= 1.0F
/ 31.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
) & 0x1f) * rs
;
2643 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2644 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2645 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2649 const GLushort
*ussrc
= (const GLushort
*) src
;
2651 for (i
= 0; i
< n
; i
++) {
2652 GLushort p
= ussrc
[i
];
2653 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2654 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2655 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2656 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2660 case GL_UNSIGNED_INT_8_8_8_8
:
2662 const GLuint
*uisrc
= (const GLuint
*) src
;
2665 for (i
= 0; i
< n
; i
++) {
2666 GLuint p
= uisrc
[i
];
2667 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2668 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2669 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2670 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2674 for (i
= 0; i
< n
; i
++) {
2675 GLuint p
= uisrc
[i
];
2676 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2677 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2678 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2679 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2684 const GLuint
*uisrc
= (const GLuint
*) src
;
2687 for (i
= 0; i
< n
; i
++) {
2688 GLuint p
= uisrc
[i
];
2689 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2690 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2691 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2692 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2696 for (i
= 0; i
< n
; i
++) {
2697 GLuint p
= uisrc
[i
];
2698 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2699 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2700 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2701 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2706 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2708 const GLuint
*uisrc
= (const GLuint
*) src
;
2711 for (i
= 0; i
< n
; i
++) {
2712 GLuint p
= uisrc
[i
];
2713 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2714 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2715 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2716 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2720 for (i
= 0; i
< n
; i
++) {
2721 GLuint p
= uisrc
[i
];
2722 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2723 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2724 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2725 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2730 const GLuint
*uisrc
= (const GLuint
*) src
;
2733 for (i
= 0; i
< n
; i
++) {
2734 GLuint p
= uisrc
[i
];
2735 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2736 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2737 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2738 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2742 for (i
= 0; i
< n
; i
++) {
2743 GLuint p
= uisrc
[i
];
2744 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2745 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2746 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2747 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2752 case GL_UNSIGNED_INT_10_10_10_2
:
2754 rs
= 1.0F
/ 1023.0F
;
2755 gs
= 1.0F
/ 1023.0F
;
2756 bs
= 1.0F
/ 1023.0F
;
2760 const GLuint
*uisrc
= (const GLuint
*) src
;
2762 for (i
= 0; i
< n
; i
++) {
2763 GLuint p
= uisrc
[i
];
2765 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2766 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2767 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2768 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2772 const GLuint
*uisrc
= (const GLuint
*) src
;
2774 for (i
= 0; i
< n
; i
++) {
2775 GLuint p
= uisrc
[i
];
2776 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2777 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2778 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2779 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2783 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2785 rs
= 1.0F
/ 1023.0F
;
2786 gs
= 1.0F
/ 1023.0F
;
2787 bs
= 1.0F
/ 1023.0F
;
2791 const GLuint
*uisrc
= (const GLuint
*) src
;
2793 for (i
= 0; i
< n
; i
++) {
2794 GLuint p
= uisrc
[i
];
2796 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2797 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2798 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2799 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2803 const GLuint
*uisrc
= (const GLuint
*) src
;
2805 for (i
= 0; i
< n
; i
++) {
2806 GLuint p
= uisrc
[i
];
2807 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2808 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2809 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2810 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2814 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2816 const GLuint
*uisrc
= (const GLuint
*) src
;
2819 for (i
= 0; i
< n
; i
++) {
2820 GLuint p
= uisrc
[i
];
2822 rgb9e5_to_float3(p
, f
);
2823 rgba
[i
][rDst
] = f
[0];
2824 rgba
[i
][gDst
] = f
[1];
2825 rgba
[i
][bDst
] = f
[2];
2826 rgba
[i
][aDst
] = 1.0F
;
2830 const GLuint
*uisrc
= (const GLuint
*) src
;
2833 for (i
= 0; i
< n
; i
++) {
2834 rgb9e5_to_float3(uisrc
[i
], f
);
2835 rgba
[i
][rDst
] = f
[0];
2836 rgba
[i
][gDst
] = f
[1];
2837 rgba
[i
][bDst
] = f
[2];
2838 rgba
[i
][aDst
] = 1.0F
;
2843 _mesa_problem(NULL
, "bad srcType in extract float data");
2850 static INLINE GLuint
2851 clamp_byte_to_uint(GLbyte b
)
2853 return b
< 0 ? 0 : b
;
2857 static INLINE GLuint
2858 clamp_short_to_uint(GLshort s
)
2860 return s
< 0 ? 0 : s
;
2864 static INLINE GLuint
2865 clamp_int_to_uint(GLint i
)
2867 return i
< 0 ? 0 : i
;
2871 static INLINE GLuint
2872 clamp_float_to_uint(GLfloat f
)
2874 return f
< 0.0F
? 0 : IROUND(f
);
2878 static INLINE GLuint
2879 clamp_half_to_uint(GLhalfARB h
)
2881 GLfloat f
= _mesa_half_to_float(h
);
2882 return f
< 0.0F
? 0 : IROUND(f
);
2887 * \sa extract_float_rgba()
2890 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2891 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2892 GLboolean swapBytes
)
2894 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2896 GLint rDst
, bDst
, gDst
, aDst
;
2897 GLboolean intFormat
;
2899 ASSERT(srcFormat
== GL_RED
||
2900 srcFormat
== GL_GREEN
||
2901 srcFormat
== GL_BLUE
||
2902 srcFormat
== GL_ALPHA
||
2903 srcFormat
== GL_LUMINANCE
||
2904 srcFormat
== GL_LUMINANCE_ALPHA
||
2905 srcFormat
== GL_INTENSITY
||
2906 srcFormat
== GL_RG
||
2907 srcFormat
== GL_RGB
||
2908 srcFormat
== GL_BGR
||
2909 srcFormat
== GL_RGBA
||
2910 srcFormat
== GL_BGRA
||
2911 srcFormat
== GL_ABGR_EXT
||
2912 srcFormat
== GL_DU8DV8_ATI
||
2913 srcFormat
== GL_DUDV_ATI
||
2914 srcFormat
== GL_RED_INTEGER_EXT
||
2915 srcFormat
== GL_GREEN_INTEGER_EXT
||
2916 srcFormat
== GL_BLUE_INTEGER_EXT
||
2917 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2918 srcFormat
== GL_RGB_INTEGER_EXT
||
2919 srcFormat
== GL_RGBA_INTEGER_EXT
||
2920 srcFormat
== GL_BGR_INTEGER_EXT
||
2921 srcFormat
== GL_BGRA_INTEGER_EXT
||
2922 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2923 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2925 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2926 srcType
== GL_BYTE
||
2927 srcType
== GL_UNSIGNED_SHORT
||
2928 srcType
== GL_SHORT
||
2929 srcType
== GL_UNSIGNED_INT
||
2930 srcType
== GL_INT
||
2931 srcType
== GL_HALF_FLOAT_ARB
||
2932 srcType
== GL_FLOAT
||
2933 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2934 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2935 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2936 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2937 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2938 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2939 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2940 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2941 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2942 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2943 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2944 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2945 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
);
2947 get_component_mapping(srcFormat
,
2948 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2949 &rDst
, &gDst
, &bDst
, &aDst
);
2951 stride
= _mesa_components_in_format(srcFormat
);
2953 intFormat
= _mesa_is_integer_format(srcFormat
);
2955 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2956 if ((SRC_INDEX) < 0) { \
2958 for (i = 0; i < n; i++) { \
2959 rgba[i][DST_INDEX] = DEFAULT; \
2962 else if (swapBytes) { \
2963 const TYPE *s = (const TYPE *) src; \
2965 for (i = 0; i < n; i++) { \
2966 TYPE value = s[SRC_INDEX]; \
2967 if (sizeof(TYPE) == 2) { \
2970 else if (sizeof(TYPE) == 4) { \
2973 rgba[i][DST_INDEX] = CONVERSION(value); \
2978 const TYPE *s = (const TYPE *) src; \
2980 for (i = 0; i < n; i++) { \
2981 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2987 case GL_UNSIGNED_BYTE
:
2988 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2989 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2990 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2991 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2994 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2995 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2996 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2997 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2999 case GL_UNSIGNED_SHORT
:
3000 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3001 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3002 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3003 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3006 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3007 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3008 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3009 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3011 case GL_UNSIGNED_INT
:
3012 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3013 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3014 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3015 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3018 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3019 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3020 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3021 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3024 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3025 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3026 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3027 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3029 case GL_HALF_FLOAT_ARB
:
3030 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3031 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3032 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3033 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3035 case GL_UNSIGNED_BYTE_3_3_2
:
3037 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3039 for (i
= 0; i
< n
; i
++) {
3040 GLubyte p
= ubsrc
[i
];
3041 rgba
[i
][rDst
] = ((p
>> 5) );
3042 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3043 rgba
[i
][bDst
] = ((p
) & 0x3);
3048 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3050 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3052 for (i
= 0; i
< n
; i
++) {
3053 GLubyte p
= ubsrc
[i
];
3054 rgba
[i
][rDst
] = ((p
) & 0x7);
3055 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3056 rgba
[i
][bDst
] = ((p
>> 6) );
3061 case GL_UNSIGNED_SHORT_5_6_5
:
3063 const GLushort
*ussrc
= (const GLushort
*) src
;
3065 for (i
= 0; i
< n
; i
++) {
3066 GLushort p
= ussrc
[i
];
3068 rgba
[i
][rDst
] = ((p
>> 11) );
3069 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3070 rgba
[i
][bDst
] = ((p
) & 0x1f);
3075 const GLushort
*ussrc
= (const GLushort
*) src
;
3077 for (i
= 0; i
< n
; i
++) {
3078 GLushort p
= ussrc
[i
];
3079 rgba
[i
][rDst
] = ((p
>> 11) );
3080 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3081 rgba
[i
][bDst
] = ((p
) & 0x1f);
3086 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3088 const GLushort
*ussrc
= (const GLushort
*) src
;
3090 for (i
= 0; i
< n
; i
++) {
3091 GLushort p
= ussrc
[i
];
3093 rgba
[i
][rDst
] = ((p
) & 0x1f);
3094 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3095 rgba
[i
][bDst
] = ((p
>> 11) );
3100 const GLushort
*ussrc
= (const GLushort
*) src
;
3102 for (i
= 0; i
< n
; i
++) {
3103 GLushort p
= ussrc
[i
];
3104 rgba
[i
][rDst
] = ((p
) & 0x1f);
3105 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3106 rgba
[i
][bDst
] = ((p
>> 11) );
3111 case GL_UNSIGNED_SHORT_4_4_4_4
:
3113 const GLushort
*ussrc
= (const GLushort
*) src
;
3115 for (i
= 0; i
< n
; i
++) {
3116 GLushort p
= ussrc
[i
];
3118 rgba
[i
][rDst
] = ((p
>> 12) );
3119 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3120 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3121 rgba
[i
][aDst
] = ((p
) & 0xf);
3125 const GLushort
*ussrc
= (const GLushort
*) src
;
3127 for (i
= 0; i
< n
; i
++) {
3128 GLushort p
= ussrc
[i
];
3129 rgba
[i
][rDst
] = ((p
>> 12) );
3130 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3131 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3132 rgba
[i
][aDst
] = ((p
) & 0xf);
3136 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3138 const GLushort
*ussrc
= (const GLushort
*) src
;
3140 for (i
= 0; i
< n
; i
++) {
3141 GLushort p
= ussrc
[i
];
3143 rgba
[i
][rDst
] = ((p
) & 0xf);
3144 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3145 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3146 rgba
[i
][aDst
] = ((p
>> 12) );
3150 const GLushort
*ussrc
= (const GLushort
*) src
;
3152 for (i
= 0; i
< n
; i
++) {
3153 GLushort p
= ussrc
[i
];
3154 rgba
[i
][rDst
] = ((p
) & 0xf);
3155 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3156 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3157 rgba
[i
][aDst
] = ((p
>> 12) );
3161 case GL_UNSIGNED_SHORT_5_5_5_1
:
3163 const GLushort
*ussrc
= (const GLushort
*) src
;
3165 for (i
= 0; i
< n
; i
++) {
3166 GLushort p
= ussrc
[i
];
3168 rgba
[i
][rDst
] = ((p
>> 11) );
3169 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3170 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3171 rgba
[i
][aDst
] = ((p
) & 0x1 );
3175 const GLushort
*ussrc
= (const GLushort
*) src
;
3177 for (i
= 0; i
< n
; i
++) {
3178 GLushort p
= ussrc
[i
];
3179 rgba
[i
][rDst
] = ((p
>> 11) );
3180 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3181 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3182 rgba
[i
][aDst
] = ((p
) & 0x1 );
3186 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3188 const GLushort
*ussrc
= (const GLushort
*) src
;
3190 for (i
= 0; i
< n
; i
++) {
3191 GLushort p
= ussrc
[i
];
3193 rgba
[i
][rDst
] = ((p
) & 0x1f);
3194 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3195 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3196 rgba
[i
][aDst
] = ((p
>> 15) );
3200 const GLushort
*ussrc
= (const GLushort
*) src
;
3202 for (i
= 0; i
< n
; i
++) {
3203 GLushort p
= ussrc
[i
];
3204 rgba
[i
][rDst
] = ((p
) & 0x1f);
3205 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3206 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3207 rgba
[i
][aDst
] = ((p
>> 15) );
3211 case GL_UNSIGNED_INT_8_8_8_8
:
3213 const GLuint
*uisrc
= (const GLuint
*) src
;
3215 for (i
= 0; i
< n
; i
++) {
3216 GLuint p
= uisrc
[i
];
3217 rgba
[i
][rDst
] = ((p
) & 0xff);
3218 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3219 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3220 rgba
[i
][aDst
] = ((p
>> 24) );
3224 const GLuint
*uisrc
= (const GLuint
*) src
;
3226 for (i
= 0; i
< n
; i
++) {
3227 GLuint p
= uisrc
[i
];
3228 rgba
[i
][rDst
] = ((p
>> 24) );
3229 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3230 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3231 rgba
[i
][aDst
] = ((p
) & 0xff);
3235 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3237 const GLuint
*uisrc
= (const GLuint
*) src
;
3239 for (i
= 0; i
< n
; i
++) {
3240 GLuint p
= uisrc
[i
];
3241 rgba
[i
][rDst
] = ((p
>> 24) );
3242 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3243 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3244 rgba
[i
][aDst
] = ((p
) & 0xff);
3248 const GLuint
*uisrc
= (const GLuint
*) src
;
3250 for (i
= 0; i
< n
; i
++) {
3251 GLuint p
= uisrc
[i
];
3252 rgba
[i
][rDst
] = ((p
) & 0xff);
3253 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3254 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3255 rgba
[i
][aDst
] = ((p
>> 24) );
3259 case GL_UNSIGNED_INT_10_10_10_2
:
3261 const GLuint
*uisrc
= (const GLuint
*) src
;
3263 for (i
= 0; i
< n
; i
++) {
3264 GLuint p
= uisrc
[i
];
3266 rgba
[i
][rDst
] = ((p
>> 22) );
3267 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3268 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3269 rgba
[i
][aDst
] = ((p
) & 0x3 );
3273 const GLuint
*uisrc
= (const GLuint
*) src
;
3275 for (i
= 0; i
< n
; i
++) {
3276 GLuint p
= uisrc
[i
];
3277 rgba
[i
][rDst
] = ((p
>> 22) );
3278 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3279 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3280 rgba
[i
][aDst
] = ((p
) & 0x3 );
3284 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3286 const GLuint
*uisrc
= (const GLuint
*) src
;
3288 for (i
= 0; i
< n
; i
++) {
3289 GLuint p
= uisrc
[i
];
3291 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3292 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3293 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3294 rgba
[i
][aDst
] = ((p
>> 30) );
3298 const GLuint
*uisrc
= (const GLuint
*) src
;
3300 for (i
= 0; i
< n
; i
++) {
3301 GLuint p
= uisrc
[i
];
3302 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3303 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3304 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3305 rgba
[i
][aDst
] = ((p
>> 30) );
3309 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3311 const GLuint
*uisrc
= (const GLuint
*) src
;
3314 for (i
= 0; i
< n
; i
++) {
3315 GLuint p
= uisrc
[i
];
3317 rgb9e5_to_float3(p
, f
);
3318 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3319 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3320 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3325 const GLuint
*uisrc
= (const GLuint
*) src
;
3328 for (i
= 0; i
< n
; i
++) {
3329 GLuint p
= uisrc
[i
];
3330 rgb9e5_to_float3(p
, f
);
3331 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3332 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3333 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3339 _mesa_problem(NULL
, "bad srcType in extract uint data");
3348 * Unpack a row of color image data from a client buffer according to
3349 * the pixel unpacking parameters.
3350 * Return GLchan values in the specified dest image format.
3351 * This is used by glDrawPixels and glTexImage?D().
3352 * \param ctx - the context
3353 * n - number of pixels in the span
3354 * dstFormat - format of destination color array
3355 * dest - the destination color array
3356 * srcFormat - source image format
3357 * srcType - source image data type
3358 * source - source image pointer
3359 * srcPacking - pixel unpacking parameters
3360 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3362 * XXX perhaps expand this to process whole images someday.
3365 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3366 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3367 GLenum srcFormat
, GLenum srcType
,
3368 const GLvoid
*source
,
3369 const struct gl_pixelstore_attrib
*srcPacking
,
3370 GLbitfield transferOps
)
3372 ASSERT(dstFormat
== GL_ALPHA
||
3373 dstFormat
== GL_LUMINANCE
||
3374 dstFormat
== GL_LUMINANCE_ALPHA
||
3375 dstFormat
== GL_INTENSITY
||
3376 dstFormat
== GL_RED
||
3377 dstFormat
== GL_RG
||
3378 dstFormat
== GL_RGB
||
3379 dstFormat
== GL_RGBA
||
3380 dstFormat
== GL_COLOR_INDEX
);
3382 ASSERT(srcFormat
== GL_RED
||
3383 srcFormat
== GL_GREEN
||
3384 srcFormat
== GL_BLUE
||
3385 srcFormat
== GL_ALPHA
||
3386 srcFormat
== GL_LUMINANCE
||
3387 srcFormat
== GL_LUMINANCE_ALPHA
||
3388 srcFormat
== GL_INTENSITY
||
3389 srcFormat
== GL_RG
||
3390 srcFormat
== GL_RGB
||
3391 srcFormat
== GL_BGR
||
3392 srcFormat
== GL_RGBA
||
3393 srcFormat
== GL_BGRA
||
3394 srcFormat
== GL_ABGR_EXT
||
3395 srcFormat
== GL_COLOR_INDEX
);
3397 ASSERT(srcType
== GL_BITMAP
||
3398 srcType
== GL_UNSIGNED_BYTE
||
3399 srcType
== GL_BYTE
||
3400 srcType
== GL_UNSIGNED_SHORT
||
3401 srcType
== GL_SHORT
||
3402 srcType
== GL_UNSIGNED_INT
||
3403 srcType
== GL_INT
||
3404 srcType
== GL_HALF_FLOAT_ARB
||
3405 srcType
== GL_FLOAT
||
3406 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3407 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3408 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3409 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3410 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3411 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3412 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3413 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3414 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3415 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3416 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3417 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3418 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
);
3420 /* Try simple cases first */
3421 if (transferOps
== 0) {
3422 if (srcType
== CHAN_TYPE
) {
3423 if (dstFormat
== GL_RGBA
) {
3424 if (srcFormat
== GL_RGBA
) {
3425 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3428 else if (srcFormat
== GL_RGB
) {
3430 const GLchan
*src
= (const GLchan
*) source
;
3432 for (i
= 0; i
< n
; i
++) {
3443 else if (dstFormat
== GL_RGB
) {
3444 if (srcFormat
== GL_RGB
) {
3445 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3448 else if (srcFormat
== GL_RGBA
) {
3450 const GLchan
*src
= (const GLchan
*) source
;
3452 for (i
= 0; i
< n
; i
++) {
3462 else if (dstFormat
== srcFormat
) {
3463 GLint comps
= _mesa_components_in_format(srcFormat
);
3465 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3470 * Common situation, loading 8bit RGBA/RGB source images
3471 * into 16/32 bit destination. (OSMesa16/32)
3473 else if (srcType
== GL_UNSIGNED_BYTE
) {
3474 if (dstFormat
== GL_RGBA
) {
3475 if (srcFormat
== GL_RGB
) {
3477 const GLubyte
*src
= (const GLubyte
*) source
;
3479 for (i
= 0; i
< n
; i
++) {
3480 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3481 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3482 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3489 else if (srcFormat
== GL_RGBA
) {
3491 const GLubyte
*src
= (const GLubyte
*) source
;
3493 for (i
= 0; i
< n
; i
++) {
3494 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3495 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3496 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3497 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3504 else if (dstFormat
== GL_RGB
) {
3505 if (srcFormat
== GL_RGB
) {
3507 const GLubyte
*src
= (const GLubyte
*) source
;
3509 for (i
= 0; i
< n
; i
++) {
3510 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3511 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3512 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3518 else if (srcFormat
== GL_RGBA
) {
3520 const GLubyte
*src
= (const GLubyte
*) source
;
3522 for (i
= 0; i
< n
; i
++) {
3523 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3524 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3525 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3536 /* general solution begins here */
3538 GLint dstComponents
;
3539 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3540 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3543 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3547 dstComponents
= _mesa_components_in_format( dstFormat
);
3548 /* source & dest image formats should have been error checked by now */
3549 assert(dstComponents
> 0);
3552 * Extract image data and convert to RGBA floats
3554 if (srcFormat
== GL_COLOR_INDEX
) {
3555 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3558 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3562 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3565 if (dstFormat
== GL_COLOR_INDEX
) {
3567 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3568 /* convert to GLchan and return */
3569 for (i
= 0; i
< n
; i
++) {
3570 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3577 /* Convert indexes to RGBA */
3578 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3579 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3581 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3584 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3585 * with color indexes.
3587 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3592 /* non-color index data */
3593 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3594 srcPacking
->SwapBytes
);
3597 /* Need to clamp if returning GLubytes or GLushorts */
3598 #if CHAN_TYPE != GL_FLOAT
3599 transferOps
|= IMAGE_CLAMP_BIT
;
3603 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3606 get_component_indexes(dstFormat
,
3607 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3609 /* Now return the GLchan data in the requested dstFormat */
3613 for (i
= 0; i
< n
; i
++) {
3614 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3615 dst
+= dstComponents
;
3622 for (i
= 0; i
< n
; i
++) {
3623 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3624 dst
+= dstComponents
;
3631 for (i
= 0; i
< n
; i
++) {
3632 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3633 dst
+= dstComponents
;
3640 for (i
= 0; i
< n
; i
++) {
3641 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3642 dst
+= dstComponents
;
3650 assert(dstComponents
== 1);
3651 for (i
= 0; i
< n
; i
++) {
3652 /* Intensity comes from red channel */
3653 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3661 for (i
= 0; i
< n
; i
++) {
3662 /* Luminance comes from red channel */
3663 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3664 dst
+= dstComponents
;
3674 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3675 * instead of GLchan.
3678 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3679 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3680 GLenum srcFormat
, GLenum srcType
,
3681 const GLvoid
*source
,
3682 const struct gl_pixelstore_attrib
*srcPacking
,
3683 GLbitfield transferOps
)
3685 ASSERT(dstFormat
== GL_ALPHA
||
3686 dstFormat
== GL_LUMINANCE
||
3687 dstFormat
== GL_LUMINANCE_ALPHA
||
3688 dstFormat
== GL_INTENSITY
||
3689 dstFormat
== GL_RED
||
3690 dstFormat
== GL_RG
||
3691 dstFormat
== GL_RGB
||
3692 dstFormat
== GL_RGBA
||
3693 dstFormat
== GL_COLOR_INDEX
);
3695 ASSERT(srcFormat
== GL_RED
||
3696 srcFormat
== GL_GREEN
||
3697 srcFormat
== GL_BLUE
||
3698 srcFormat
== GL_ALPHA
||
3699 srcFormat
== GL_LUMINANCE
||
3700 srcFormat
== GL_LUMINANCE_ALPHA
||
3701 srcFormat
== GL_INTENSITY
||
3702 srcFormat
== GL_RG
||
3703 srcFormat
== GL_RGB
||
3704 srcFormat
== GL_BGR
||
3705 srcFormat
== GL_RGBA
||
3706 srcFormat
== GL_BGRA
||
3707 srcFormat
== GL_ABGR_EXT
||
3708 srcFormat
== GL_RED_INTEGER_EXT
||
3709 srcFormat
== GL_GREEN_INTEGER_EXT
||
3710 srcFormat
== GL_BLUE_INTEGER_EXT
||
3711 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3712 srcFormat
== GL_RGB_INTEGER_EXT
||
3713 srcFormat
== GL_RGBA_INTEGER_EXT
||
3714 srcFormat
== GL_BGR_INTEGER_EXT
||
3715 srcFormat
== GL_BGRA_INTEGER_EXT
||
3716 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3717 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3718 srcFormat
== GL_COLOR_INDEX
);
3720 ASSERT(srcType
== GL_BITMAP
||
3721 srcType
== GL_UNSIGNED_BYTE
||
3722 srcType
== GL_BYTE
||
3723 srcType
== GL_UNSIGNED_SHORT
||
3724 srcType
== GL_SHORT
||
3725 srcType
== GL_UNSIGNED_INT
||
3726 srcType
== GL_INT
||
3727 srcType
== GL_HALF_FLOAT_ARB
||
3728 srcType
== GL_FLOAT
||
3729 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3730 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3731 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3732 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3733 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3734 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3735 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3736 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3737 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3738 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3739 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3740 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3741 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
);
3743 /* general solution, no special cases, yet */
3745 GLint dstComponents
;
3746 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3747 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3750 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3754 dstComponents
= _mesa_components_in_format( dstFormat
);
3755 /* source & dest image formats should have been error checked by now */
3756 assert(dstComponents
> 0);
3759 * Extract image data and convert to RGBA floats
3761 if (srcFormat
== GL_COLOR_INDEX
) {
3762 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3765 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3770 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3773 if (dstFormat
== GL_COLOR_INDEX
) {
3775 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3776 /* convert to GLchan and return */
3777 for (i
= 0; i
< n
; i
++) {
3778 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3785 /* Convert indexes to RGBA */
3786 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3787 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3789 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3792 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3793 * with color indexes.
3795 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3800 /* non-color index data */
3801 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3802 srcPacking
->SwapBytes
);
3806 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3809 get_component_indexes(dstFormat
,
3810 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3812 /* Now pack results in the requested dstFormat */
3814 GLfloat
*dst
= dest
;
3816 for (i
= 0; i
< n
; i
++) {
3817 dst
[rDst
] = rgba
[i
][RCOMP
];
3818 dst
+= dstComponents
;
3823 GLfloat
*dst
= dest
;
3825 for (i
= 0; i
< n
; i
++) {
3826 dst
[gDst
] = rgba
[i
][GCOMP
];
3827 dst
+= dstComponents
;
3832 GLfloat
*dst
= dest
;
3834 for (i
= 0; i
< n
; i
++) {
3835 dst
[bDst
] = rgba
[i
][BCOMP
];
3836 dst
+= dstComponents
;
3841 GLfloat
*dst
= dest
;
3843 for (i
= 0; i
< n
; i
++) {
3844 dst
[aDst
] = rgba
[i
][ACOMP
];
3845 dst
+= dstComponents
;
3850 GLfloat
*dst
= dest
;
3853 assert(dstComponents
== 1);
3854 for (i
= 0; i
< n
; i
++) {
3855 /* Intensity comes from red channel */
3856 dst
[i
] = rgba
[i
][RCOMP
];
3861 GLfloat
*dst
= dest
;
3864 for (i
= 0; i
< n
; i
++) {
3865 /* Luminance comes from red channel */
3866 dst
[0] = rgba
[i
][RCOMP
];
3867 dst
+= dstComponents
;
3877 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3878 * instead of GLchan.
3879 * No pixel transfer ops are applied.
3882 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3883 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3884 GLenum srcFormat
, GLenum srcType
,
3885 const GLvoid
*source
,
3886 const struct gl_pixelstore_attrib
*srcPacking
)
3888 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3891 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3895 ASSERT(dstFormat
== GL_ALPHA
||
3896 dstFormat
== GL_LUMINANCE
||
3897 dstFormat
== GL_LUMINANCE_ALPHA
||
3898 dstFormat
== GL_INTENSITY
||
3899 dstFormat
== GL_RED
||
3900 dstFormat
== GL_RG
||
3901 dstFormat
== GL_RGB
||
3902 dstFormat
== GL_RGBA
);
3904 ASSERT(srcFormat
== GL_RED
||
3905 srcFormat
== GL_GREEN
||
3906 srcFormat
== GL_BLUE
||
3907 srcFormat
== GL_ALPHA
||
3908 srcFormat
== GL_LUMINANCE
||
3909 srcFormat
== GL_LUMINANCE_ALPHA
||
3910 srcFormat
== GL_INTENSITY
||
3911 srcFormat
== GL_RG
||
3912 srcFormat
== GL_RGB
||
3913 srcFormat
== GL_BGR
||
3914 srcFormat
== GL_RGBA
||
3915 srcFormat
== GL_BGRA
||
3916 srcFormat
== GL_ABGR_EXT
||
3917 srcFormat
== GL_RED_INTEGER_EXT
||
3918 srcFormat
== GL_GREEN_INTEGER_EXT
||
3919 srcFormat
== GL_BLUE_INTEGER_EXT
||
3920 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3921 srcFormat
== GL_RGB_INTEGER_EXT
||
3922 srcFormat
== GL_RGBA_INTEGER_EXT
||
3923 srcFormat
== GL_BGR_INTEGER_EXT
||
3924 srcFormat
== GL_BGRA_INTEGER_EXT
||
3925 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3926 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3928 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3929 srcType
== GL_BYTE
||
3930 srcType
== GL_UNSIGNED_SHORT
||
3931 srcType
== GL_SHORT
||
3932 srcType
== GL_UNSIGNED_INT
||
3933 srcType
== GL_INT
||
3934 srcType
== GL_HALF_FLOAT_ARB
||
3935 srcType
== GL_FLOAT
||
3936 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3937 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3938 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3939 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3940 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3941 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3942 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3943 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3944 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3945 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3946 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3947 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3948 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
);
3951 /* Extract image data as uint[4] pixels */
3952 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3953 srcPacking
->SwapBytes
);
3955 if (dstFormat
== GL_RGBA
) {
3957 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3961 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3962 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3964 assert(dstComponents
> 0);
3966 get_component_indexes(dstFormat
,
3967 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3969 /* Now pack values in the requested dest format */
3973 for (i
= 0; i
< n
; i
++) {
3974 dst
[rDst
] = rgba
[i
][RCOMP
];
3975 dst
+= dstComponents
;
3982 for (i
= 0; i
< n
; i
++) {
3983 dst
[gDst
] = rgba
[i
][GCOMP
];
3984 dst
+= dstComponents
;
3991 for (i
= 0; i
< n
; i
++) {
3992 dst
[bDst
] = rgba
[i
][BCOMP
];
3993 dst
+= dstComponents
;
4000 for (i
= 0; i
< n
; i
++) {
4001 dst
[aDst
] = rgba
[i
][ACOMP
];
4002 dst
+= dstComponents
;
4010 assert(dstComponents
== 1);
4011 for (i
= 0; i
< n
; i
++) {
4012 /* Intensity comes from red channel */
4013 dst
[i
] = rgba
[i
][RCOMP
];
4021 for (i
= 0; i
< n
; i
++) {
4022 /* Luminance comes from red channel */
4023 dst
[0] = rgba
[i
][RCOMP
];
4024 dst
+= dstComponents
;
4035 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4036 * directly return GLbyte data, no transfer ops apply.
4039 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4040 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4041 GLenum srcFormat
, GLenum srcType
,
4042 const GLvoid
*source
,
4043 const struct gl_pixelstore_attrib
*srcPacking
,
4044 GLbitfield transferOps
)
4046 ASSERT(dstFormat
== GL_DUDV_ATI
);
4047 ASSERT(srcFormat
== GL_DUDV_ATI
||
4048 srcFormat
== GL_DU8DV8_ATI
);
4050 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4051 srcType
== GL_BYTE
||
4052 srcType
== GL_UNSIGNED_SHORT
||
4053 srcType
== GL_SHORT
||
4054 srcType
== GL_UNSIGNED_INT
||
4055 srcType
== GL_INT
||
4056 srcType
== GL_HALF_FLOAT_ARB
||
4057 srcType
== GL_FLOAT
);
4059 /* general solution */
4061 GLint dstComponents
;
4064 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4067 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4071 dstComponents
= _mesa_components_in_format( dstFormat
);
4072 /* source & dest image formats should have been error checked by now */
4073 assert(dstComponents
> 0);
4076 * Extract image data and convert to RGBA floats
4078 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4079 srcPacking
->SwapBytes
);
4082 /* Now determine which color channels we need to produce.
4083 * And determine the dest index (offset) within each color tuple.
4086 /* Now pack results in the requested dstFormat */
4087 for (i
= 0; i
< n
; i
++) {
4088 /* not sure - need clamp[-1,1] here? */
4089 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4090 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4091 dst
+= dstComponents
;
4099 * Unpack a row of color index data from a client buffer according to
4100 * the pixel unpacking parameters.
4101 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4103 * Args: ctx - the context
4104 * n - number of pixels
4105 * dstType - destination data type
4106 * dest - destination array
4107 * srcType - source pixel type
4108 * source - source data pointer
4109 * srcPacking - pixel unpacking parameters
4110 * transferOps - the pixel transfer operations to apply
4113 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4114 GLenum dstType
, GLvoid
*dest
,
4115 GLenum srcType
, const GLvoid
*source
,
4116 const struct gl_pixelstore_attrib
*srcPacking
,
4117 GLbitfield transferOps
)
4119 ASSERT(srcType
== GL_BITMAP
||
4120 srcType
== GL_UNSIGNED_BYTE
||
4121 srcType
== GL_BYTE
||
4122 srcType
== GL_UNSIGNED_SHORT
||
4123 srcType
== GL_SHORT
||
4124 srcType
== GL_UNSIGNED_INT
||
4125 srcType
== GL_INT
||
4126 srcType
== GL_HALF_FLOAT_ARB
||
4127 srcType
== GL_FLOAT
);
4129 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4130 dstType
== GL_UNSIGNED_SHORT
||
4131 dstType
== GL_UNSIGNED_INT
);
4134 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4137 * Try simple cases first
4139 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4140 && dstType
== GL_UNSIGNED_BYTE
) {
4141 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4143 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4144 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4145 memcpy(dest
, source
, n
* sizeof(GLuint
));
4151 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4154 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4158 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4162 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4164 /* convert to dest type */
4166 case GL_UNSIGNED_BYTE
:
4168 GLubyte
*dst
= (GLubyte
*) dest
;
4170 for (i
= 0; i
< n
; i
++) {
4171 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4175 case GL_UNSIGNED_SHORT
:
4177 GLuint
*dst
= (GLuint
*) dest
;
4179 for (i
= 0; i
< n
; i
++) {
4180 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4184 case GL_UNSIGNED_INT
:
4185 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4188 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4197 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4198 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4199 const struct gl_pixelstore_attrib
*dstPacking
,
4200 GLbitfield transferOps
)
4202 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4205 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4209 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4211 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4212 /* make a copy of input */
4213 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4214 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4219 case GL_UNSIGNED_BYTE
:
4221 GLubyte
*dst
= (GLubyte
*) dest
;
4223 for (i
= 0; i
< n
; i
++) {
4224 *dst
++ = (GLubyte
) source
[i
];
4230 GLbyte
*dst
= (GLbyte
*) dest
;
4232 for (i
= 0; i
< n
; i
++) {
4233 dst
[i
] = (GLbyte
) source
[i
];
4237 case GL_UNSIGNED_SHORT
:
4239 GLushort
*dst
= (GLushort
*) dest
;
4241 for (i
= 0; i
< n
; i
++) {
4242 dst
[i
] = (GLushort
) source
[i
];
4244 if (dstPacking
->SwapBytes
) {
4245 _mesa_swap2( (GLushort
*) dst
, n
);
4251 GLshort
*dst
= (GLshort
*) dest
;
4253 for (i
= 0; i
< n
; i
++) {
4254 dst
[i
] = (GLshort
) source
[i
];
4256 if (dstPacking
->SwapBytes
) {
4257 _mesa_swap2( (GLushort
*) dst
, n
);
4261 case GL_UNSIGNED_INT
:
4263 GLuint
*dst
= (GLuint
*) dest
;
4265 for (i
= 0; i
< n
; i
++) {
4266 dst
[i
] = (GLuint
) source
[i
];
4268 if (dstPacking
->SwapBytes
) {
4269 _mesa_swap4( (GLuint
*) dst
, n
);
4275 GLint
*dst
= (GLint
*) dest
;
4277 for (i
= 0; i
< n
; i
++) {
4278 dst
[i
] = (GLint
) source
[i
];
4280 if (dstPacking
->SwapBytes
) {
4281 _mesa_swap4( (GLuint
*) dst
, n
);
4287 GLfloat
*dst
= (GLfloat
*) dest
;
4289 for (i
= 0; i
< n
; i
++) {
4290 dst
[i
] = (GLfloat
) source
[i
];
4292 if (dstPacking
->SwapBytes
) {
4293 _mesa_swap4( (GLuint
*) dst
, n
);
4297 case GL_HALF_FLOAT_ARB
:
4299 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4301 for (i
= 0; i
< n
; i
++) {
4302 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4304 if (dstPacking
->SwapBytes
) {
4305 _mesa_swap2( (GLushort
*) dst
, n
);
4310 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4318 * Unpack a row of stencil data from a client buffer according to
4319 * the pixel unpacking parameters.
4320 * This is (or will be) used by glDrawPixels
4322 * Args: ctx - the context
4323 * n - number of pixels
4324 * dstType - destination data type
4325 * dest - destination array
4326 * srcType - source pixel type
4327 * source - source data pointer
4328 * srcPacking - pixel unpacking parameters
4329 * transferOps - apply offset/bias/lookup ops?
4332 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4333 GLenum dstType
, GLvoid
*dest
,
4334 GLenum srcType
, const GLvoid
*source
,
4335 const struct gl_pixelstore_attrib
*srcPacking
,
4336 GLbitfield transferOps
)
4338 ASSERT(srcType
== GL_BITMAP
||
4339 srcType
== GL_UNSIGNED_BYTE
||
4340 srcType
== GL_BYTE
||
4341 srcType
== GL_UNSIGNED_SHORT
||
4342 srcType
== GL_SHORT
||
4343 srcType
== GL_UNSIGNED_INT
||
4344 srcType
== GL_INT
||
4345 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4346 srcType
== GL_HALF_FLOAT_ARB
||
4347 srcType
== GL_FLOAT
);
4349 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4350 dstType
== GL_UNSIGNED_SHORT
||
4351 dstType
== GL_UNSIGNED_INT
);
4353 /* only shift and offset apply to stencil */
4354 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4357 * Try simple cases first
4359 if (transferOps
== 0 &&
4360 !ctx
->Pixel
.MapStencilFlag
&&
4361 srcType
== GL_UNSIGNED_BYTE
&&
4362 dstType
== GL_UNSIGNED_BYTE
) {
4363 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4365 else if (transferOps
== 0 &&
4366 !ctx
->Pixel
.MapStencilFlag
&&
4367 srcType
== GL_UNSIGNED_INT
&&
4368 dstType
== GL_UNSIGNED_INT
&&
4369 !srcPacking
->SwapBytes
) {
4370 memcpy(dest
, source
, n
* sizeof(GLuint
));
4376 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4379 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4383 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4386 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4387 /* shift and offset indexes */
4388 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4391 if (ctx
->Pixel
.MapStencilFlag
) {
4392 /* Apply stencil lookup table */
4393 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4395 for (i
= 0; i
< n
; i
++) {
4396 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4400 /* convert to dest type */
4402 case GL_UNSIGNED_BYTE
:
4404 GLubyte
*dst
= (GLubyte
*) dest
;
4406 for (i
= 0; i
< n
; i
++) {
4407 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4411 case GL_UNSIGNED_SHORT
:
4413 GLuint
*dst
= (GLuint
*) dest
;
4415 for (i
= 0; i
< n
; i
++) {
4416 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4420 case GL_UNSIGNED_INT
:
4421 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4424 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4433 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4434 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4435 const struct gl_pixelstore_attrib
*dstPacking
)
4437 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4440 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4444 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4445 ctx
->Pixel
.MapStencilFlag
) {
4446 /* make a copy of input */
4447 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4448 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4453 case GL_UNSIGNED_BYTE
:
4454 if (sizeof(GLstencil
) == 1) {
4455 memcpy( dest
, source
, n
);
4458 GLubyte
*dst
= (GLubyte
*) dest
;
4461 dst
[i
] = (GLubyte
) source
[i
];
4467 GLbyte
*dst
= (GLbyte
*) dest
;
4470 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4474 case GL_UNSIGNED_SHORT
:
4476 GLushort
*dst
= (GLushort
*) dest
;
4479 dst
[i
] = (GLushort
) source
[i
];
4481 if (dstPacking
->SwapBytes
) {
4482 _mesa_swap2( (GLushort
*) dst
, n
);
4488 GLshort
*dst
= (GLshort
*) dest
;
4491 dst
[i
] = (GLshort
) source
[i
];
4493 if (dstPacking
->SwapBytes
) {
4494 _mesa_swap2( (GLushort
*) dst
, n
);
4498 case GL_UNSIGNED_INT
:
4500 GLuint
*dst
= (GLuint
*) dest
;
4503 dst
[i
] = (GLuint
) source
[i
];
4505 if (dstPacking
->SwapBytes
) {
4506 _mesa_swap4( (GLuint
*) dst
, n
);
4512 GLint
*dst
= (GLint
*) dest
;
4515 dst
[i
] = (GLint
) source
[i
];
4517 if (dstPacking
->SwapBytes
) {
4518 _mesa_swap4( (GLuint
*) dst
, n
);
4524 GLfloat
*dst
= (GLfloat
*) dest
;
4527 dst
[i
] = (GLfloat
) source
[i
];
4529 if (dstPacking
->SwapBytes
) {
4530 _mesa_swap4( (GLuint
*) dst
, n
);
4534 case GL_HALF_FLOAT_ARB
:
4536 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4539 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4541 if (dstPacking
->SwapBytes
) {
4542 _mesa_swap2( (GLushort
*) dst
, n
);
4547 if (dstPacking
->LsbFirst
) {
4548 GLubyte
*dst
= (GLubyte
*) dest
;
4551 for (i
= 0; i
< n
; i
++) {
4554 *dst
|= ((source
[i
] != 0) << shift
);
4563 GLubyte
*dst
= (GLubyte
*) dest
;
4566 for (i
= 0; i
< n
; i
++) {
4569 *dst
|= ((source
[i
] != 0) << shift
);
4579 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4585 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4588 const GLTYPE *src = (const GLTYPE *)source; \
4589 for (i = 0; i < n; i++) { \
4590 GLTYPE value = src[i]; \
4591 if (srcPacking->SwapBytes) { \
4592 if (sizeof(GLTYPE) == 2) { \
4594 } else if (sizeof(GLTYPE) == 4) { \
4598 depthValues[i] = GLTYPE2FLOAT(value); \
4604 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4605 * or GLfloat values.
4606 * The glPixelTransfer (scale/bias) params will be applied.
4608 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4609 * \param depthMax max value for returned GLushort or GLuint values
4610 * (ignored for GLfloat).
4613 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4614 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4615 GLenum srcType
, const GLvoid
*source
,
4616 const struct gl_pixelstore_attrib
*srcPacking
)
4618 GLfloat
*depthTemp
, *depthValues
;
4619 GLboolean needClamp
= GL_FALSE
;
4621 /* Look for special cases first.
4622 * Not only are these faster, they're less prone to numeric conversion
4623 * problems. Otherwise, converting from an int type to a float then
4624 * back to an int type can introduce errors that will show up as
4625 * artifacts in things like depth peeling which uses glCopyTexImage.
4627 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4628 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4629 const GLuint
*src
= (const GLuint
*) source
;
4630 GLushort
*dst
= (GLushort
*) dest
;
4632 for (i
= 0; i
< n
; i
++) {
4633 dst
[i
] = src
[i
] >> 16;
4637 if (srcType
== GL_UNSIGNED_SHORT
4638 && dstType
== GL_UNSIGNED_INT
4639 && depthMax
== 0xffffffff) {
4640 const GLushort
*src
= (const GLushort
*) source
;
4641 GLuint
*dst
= (GLuint
*) dest
;
4643 for (i
= 0; i
< n
; i
++) {
4644 dst
[i
] = src
[i
] | (src
[i
] << 16);
4648 if (srcType
== GL_UNSIGNED_INT_24_8
4649 && dstType
== GL_UNSIGNED_INT
4650 && depthMax
== 0xffffff) {
4651 const GLuint
*src
= (const GLuint
*) source
;
4652 GLuint
*dst
= (GLuint
*) dest
;
4654 for (i
= 0; i
< n
; i
++) {
4655 dst
[i
] = src
[i
] >> 8;
4659 /* XXX may want to add additional cases here someday */
4662 /* general case path follows */
4664 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4666 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4670 if (dstType
== GL_FLOAT
) {
4671 depthValues
= (GLfloat
*) dest
;
4674 depthValues
= depthTemp
;
4677 /* Convert incoming values to GLfloat. Some conversions will require
4682 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4683 needClamp
= GL_TRUE
;
4685 case GL_UNSIGNED_BYTE
:
4686 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4689 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4690 needClamp
= GL_TRUE
;
4692 case GL_UNSIGNED_SHORT
:
4693 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4696 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4697 needClamp
= GL_TRUE
;
4699 case GL_UNSIGNED_INT
:
4700 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4702 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4703 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4704 depthMax
== 0xffffff &&
4705 ctx
->Pixel
.DepthScale
== 1.0 &&
4706 ctx
->Pixel
.DepthBias
== 0.0) {
4707 const GLuint
*src
= (const GLuint
*) source
;
4708 GLuint
*zValues
= (GLuint
*) dest
;
4710 for (i
= 0; i
< n
; i
++) {
4711 GLuint value
= src
[i
];
4712 if (srcPacking
->SwapBytes
) {
4715 zValues
[i
] = value
& 0xffffff00;
4720 const GLuint
*src
= (const GLuint
*) source
;
4721 const GLfloat scale
= 1.0f
/ 0xffffff;
4723 for (i
= 0; i
< n
; i
++) {
4724 GLuint value
= src
[i
];
4725 if (srcPacking
->SwapBytes
) {
4728 depthValues
[i
] = (value
>> 8) * scale
;
4733 DEPTH_VALUES(GLfloat
, 1*);
4734 needClamp
= GL_TRUE
;
4736 case GL_HALF_FLOAT_ARB
:
4739 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4740 for (i
= 0; i
< n
; i
++) {
4741 GLhalfARB value
= src
[i
];
4742 if (srcPacking
->SwapBytes
) {
4745 depthValues
[i
] = _mesa_half_to_float(value
);
4747 needClamp
= GL_TRUE
;
4751 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4756 /* apply depth scale and bias */
4758 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4759 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4760 if (scale
!= 1.0 || bias
!= 0.0) {
4762 for (i
= 0; i
< n
; i
++) {
4763 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4765 needClamp
= GL_TRUE
;
4769 /* clamp to [0, 1] */
4772 for (i
= 0; i
< n
; i
++) {
4773 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4778 * Convert values to dstType
4780 if (dstType
== GL_UNSIGNED_INT
) {
4781 GLuint
*zValues
= (GLuint
*) dest
;
4783 if (depthMax
<= 0xffffff) {
4784 /* no overflow worries */
4785 for (i
= 0; i
< n
; i
++) {
4786 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4790 /* need to use double precision to prevent overflow problems */
4791 for (i
= 0; i
< n
; i
++) {
4792 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4793 if (z
>= (GLdouble
) 0xffffffff)
4794 zValues
[i
] = 0xffffffff;
4796 zValues
[i
] = (GLuint
) z
;
4800 else if (dstType
== GL_UNSIGNED_SHORT
) {
4801 GLushort
*zValues
= (GLushort
*) dest
;
4803 ASSERT(depthMax
<= 0xffff);
4804 for (i
= 0; i
< n
; i
++) {
4805 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4809 ASSERT(dstType
== GL_FLOAT
);
4810 /*ASSERT(depthMax == 1.0F);*/
4818 * Pack an array of depth values. The values are floats in [0,1].
4821 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4822 GLenum dstType
, const GLfloat
*depthSpan
,
4823 const struct gl_pixelstore_attrib
*dstPacking
)
4825 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4827 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4831 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4832 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4833 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4834 depthSpan
= depthCopy
;
4838 case GL_UNSIGNED_BYTE
:
4840 GLubyte
*dst
= (GLubyte
*) dest
;
4842 for (i
= 0; i
< n
; i
++) {
4843 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4849 GLbyte
*dst
= (GLbyte
*) dest
;
4851 for (i
= 0; i
< n
; i
++) {
4852 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4856 case GL_UNSIGNED_SHORT
:
4858 GLushort
*dst
= (GLushort
*) dest
;
4860 for (i
= 0; i
< n
; i
++) {
4861 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4863 if (dstPacking
->SwapBytes
) {
4864 _mesa_swap2( (GLushort
*) dst
, n
);
4870 GLshort
*dst
= (GLshort
*) dest
;
4872 for (i
= 0; i
< n
; i
++) {
4873 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4875 if (dstPacking
->SwapBytes
) {
4876 _mesa_swap2( (GLushort
*) dst
, n
);
4880 case GL_UNSIGNED_INT
:
4882 GLuint
*dst
= (GLuint
*) dest
;
4884 for (i
= 0; i
< n
; i
++) {
4885 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4887 if (dstPacking
->SwapBytes
) {
4888 _mesa_swap4( (GLuint
*) dst
, n
);
4894 GLint
*dst
= (GLint
*) dest
;
4896 for (i
= 0; i
< n
; i
++) {
4897 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4899 if (dstPacking
->SwapBytes
) {
4900 _mesa_swap4( (GLuint
*) dst
, n
);
4906 GLfloat
*dst
= (GLfloat
*) dest
;
4908 for (i
= 0; i
< n
; i
++) {
4909 dst
[i
] = depthSpan
[i
];
4911 if (dstPacking
->SwapBytes
) {
4912 _mesa_swap4( (GLuint
*) dst
, n
);
4916 case GL_HALF_FLOAT_ARB
:
4918 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4920 for (i
= 0; i
< n
; i
++) {
4921 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4923 if (dstPacking
->SwapBytes
) {
4924 _mesa_swap2( (GLushort
*) dst
, n
);
4929 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4938 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4941 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4942 const GLfloat
*depthVals
,
4943 const GLstencil
*stencilVals
,
4944 const struct gl_pixelstore_attrib
*dstPacking
)
4946 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4947 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4950 if (!depthCopy
|| !stencilCopy
) {
4951 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4957 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4958 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4959 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4960 depthVals
= depthCopy
;
4963 if (ctx
->Pixel
.IndexShift
||
4964 ctx
->Pixel
.IndexOffset
||
4965 ctx
->Pixel
.MapStencilFlag
) {
4966 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4967 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4968 stencilVals
= stencilCopy
;
4971 for (i
= 0; i
< n
; i
++) {
4972 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4973 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4976 if (dstPacking
->SwapBytes
) {
4977 _mesa_swap4(dest
, n
);
4988 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4989 * Return all image data in a contiguous block. This is used when we
4990 * compile glDrawPixels, glTexImage, etc into a display list. We
4991 * need a copy of the data in a standard format.
4994 _mesa_unpack_image( GLuint dimensions
,
4995 GLsizei width
, GLsizei height
, GLsizei depth
,
4996 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4997 const struct gl_pixelstore_attrib
*unpack
)
4999 GLint bytesPerRow
, compsPerRow
;
5000 GLboolean flipBytes
, swap2
, swap4
;
5003 return NULL
; /* not necessarily an error */
5005 if (width
<= 0 || height
<= 0 || depth
<= 0)
5006 return NULL
; /* generate error later */
5008 if (type
== GL_BITMAP
) {
5009 bytesPerRow
= (width
+ 7) >> 3;
5010 flipBytes
= unpack
->LsbFirst
;
5011 swap2
= swap4
= GL_FALSE
;
5015 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5016 GLint components
= _mesa_components_in_format(format
);
5019 if (_mesa_type_is_packed(type
))
5022 if (bytesPerPixel
<= 0 || components
<= 0)
5023 return NULL
; /* bad format or type. generate error later */
5024 bytesPerRow
= bytesPerPixel
* width
;
5025 bytesPerComp
= bytesPerPixel
/ components
;
5026 flipBytes
= GL_FALSE
;
5027 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5028 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5029 compsPerRow
= components
* width
;
5030 assert(compsPerRow
>= width
);
5035 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5039 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5042 for (img
= 0; img
< depth
; img
++) {
5043 for (row
= 0; row
< height
; row
++) {
5044 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5045 width
, height
, format
, type
, img
, row
, 0);
5047 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5049 flipBytes
= GL_FALSE
;
5050 if (unpack
->LsbFirst
) {
5051 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5052 GLubyte dstMask
= 128;
5053 const GLubyte
*s
= src
;
5056 for (i
= 0; i
< width
; i
++) {
5060 if (srcMask
== 128) {
5065 srcMask
= srcMask
<< 1;
5073 dstMask
= dstMask
>> 1;
5078 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5079 GLubyte dstMask
= 128;
5080 const GLubyte
*s
= src
;
5083 for (i
= 0; i
< width
; i
++) {
5092 srcMask
= srcMask
>> 1;
5100 dstMask
= dstMask
>> 1;
5106 memcpy(dst
, src
, bytesPerRow
);
5109 /* byte flipping/swapping */
5111 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5114 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5117 _mesa_swap4((GLuint
*) dst
, compsPerRow
);