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.
38 #include "pixeltransfer.h"
44 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
45 * we later convert the float to a packed integer value (such as for
46 * GL_RGB5_A1) because we'll wind up with a non-zero value.
48 * We redefine the macros here so zero is handled correctly.
51 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
54 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
58 /** Compute ceiling of integer quotient of A divided by B. */
59 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
63 * Flip the 8 bits in each byte of the given array.
66 * \param n number of bytes.
68 * \todo try this trick to flip bytes someday:
70 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
71 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
72 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
76 flip_bytes( GLubyte
*p
, GLuint n
)
79 for (i
= 0; i
< n
; i
++) {
80 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
81 a
= ((b
& 0x01) << 7) |
96 * Unpack a 32x32 pixel polygon stipple from user memory using the
97 * current pixel unpack settings.
100 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
101 const struct gl_pixelstore_attrib
*unpacking
)
103 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
105 /* Convert pattern from GLubytes to GLuints and handle big/little
110 for (i
= 0; i
< 32; i
++) {
111 dest
[i
] = (p
[0] << 24)
123 * Pack polygon stipple into user memory given current pixel packing
127 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
128 const struct gl_pixelstore_attrib
*packing
)
130 /* Convert pattern from GLuints to GLubytes to handle big/little
131 * endian differences.
135 for (i
= 0; i
< 32; i
++) {
136 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
137 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
138 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
139 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
142 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
147 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
148 * order with row alignment = 1 byte.
151 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
152 const struct gl_pixelstore_attrib
*packing
)
154 GLint bytes
, row
, width_in_bytes
;
155 GLubyte
*buffer
, *dst
;
160 /* Alloc dest storage */
161 bytes
= ((width
+ 7) / 8 * height
);
162 buffer
= (GLubyte
*) malloc( bytes
);
166 width_in_bytes
= CEILING( width
, 8 );
168 for (row
= 0; row
< height
; row
++) {
169 const GLubyte
*src
= (const GLubyte
*)
170 _mesa_image_address2d(packing
, pixels
, width
, height
,
171 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
177 if ((packing
->SkipPixels
& 7) == 0) {
178 memcpy( dst
, src
, width_in_bytes
);
179 if (packing
->LsbFirst
) {
180 flip_bytes( dst
, width_in_bytes
);
184 /* handling SkipPixels is a bit tricky (no pun intended!) */
186 if (packing
->LsbFirst
) {
187 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
188 GLubyte dstMask
= 128;
189 const GLubyte
*s
= src
;
192 for (i
= 0; i
< width
; i
++) {
196 if (srcMask
== 128) {
201 srcMask
= srcMask
<< 1;
209 dstMask
= dstMask
>> 1;
214 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
215 GLubyte dstMask
= 128;
216 const GLubyte
*s
= src
;
219 for (i
= 0; i
< width
; i
++) {
228 srcMask
= srcMask
>> 1;
236 dstMask
= dstMask
>> 1;
241 dst
+= width_in_bytes
;
252 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
253 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
255 GLint row
, width_in_bytes
;
261 width_in_bytes
= CEILING( width
, 8 );
263 for (row
= 0; row
< height
; row
++) {
264 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
265 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
269 if ((packing
->SkipPixels
& 7) == 0) {
270 memcpy( dst
, src
, width_in_bytes
);
271 if (packing
->LsbFirst
) {
272 flip_bytes( dst
, width_in_bytes
);
276 /* handling SkipPixels is a bit tricky (no pun intended!) */
278 if (packing
->LsbFirst
) {
279 GLubyte srcMask
= 128;
280 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
281 const GLubyte
*s
= src
;
284 for (i
= 0; i
< width
; i
++) {
293 srcMask
= srcMask
>> 1;
295 if (dstMask
== 128) {
301 dstMask
= dstMask
<< 1;
306 GLubyte srcMask
= 128;
307 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
308 const GLubyte
*s
= src
;
311 for (i
= 0; i
< width
; i
++) {
320 srcMask
= srcMask
>> 1;
328 dstMask
= dstMask
>> 1;
333 src
+= width_in_bytes
;
340 * For small integer types, return the min and max possible values.
341 * Used for clamping floats to unscaled integer types.
342 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
345 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
352 case GL_UNSIGNED_BYTE
:
360 case GL_UNSIGNED_SHORT
:
372 * Used to pack an array [][4] of RGBA float colors as specified
373 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
374 * Historically, the RGBA values were in [0,1] and rescaled to fit
375 * into GLubytes, etc. But with new integer formats, the RGBA values
376 * may have any value and we don't always rescale when converting to
379 * Note: the rgba values will be modified by this function when any pixel
380 * transfer ops are enabled.
383 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
384 GLenum dstFormat
, GLenum dstType
,
386 const struct gl_pixelstore_attrib
*dstPacking
,
387 GLbitfield transferOps
)
389 GLfloat luminance
[MAX_WIDTH
];
390 const GLint comps
= _mesa_components_in_format(dstFormat
);
391 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
395 * This test should probably go away. Have the caller set/clear the
396 * IMAGE_CLAMP_BIT as needed.
398 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
400 /* need to clamp to [0, 1] */
401 transferOps
|= IMAGE_CLAMP_BIT
;
406 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
410 * Component clamping (besides clamping to [0,1] in
411 * _mesa_apply_rgba_transfer_ops()).
414 /* clamping to dest type's min/max values */
416 if (get_type_min_max(dstType
, &min
, &max
)) {
417 for (i
= 0; i
< n
; i
++) {
418 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
419 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
420 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
421 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
425 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
426 /* compute luminance values */
427 if (transferOps
& IMAGE_CLAMP_BIT
) {
428 for (i
= 0; i
< n
; i
++) {
429 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
430 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
434 for (i
= 0; i
< n
; i
++) {
435 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
441 * Pack/store the pixels. Ugh! Lots of cases!!!
444 case GL_UNSIGNED_BYTE
:
446 GLubyte
*dst
= (GLubyte
*) dstAddr
;
450 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
454 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
458 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
462 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
466 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
468 case GL_LUMINANCE_ALPHA
:
470 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
471 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
476 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
477 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
482 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
483 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
484 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
489 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
490 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
491 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
492 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
497 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
498 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
499 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
504 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
505 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
506 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
507 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
512 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
513 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
514 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
515 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
518 case GL_RED_INTEGER_EXT
:
520 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
523 case GL_GREEN_INTEGER_EXT
:
525 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
528 case GL_BLUE_INTEGER_EXT
:
530 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
533 case GL_ALPHA_INTEGER_EXT
:
535 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
538 case GL_RGB_INTEGER_EXT
:
540 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
541 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
542 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
545 case GL_RGBA_INTEGER_EXT
:
547 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
548 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
549 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
550 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
553 case GL_BGR_INTEGER_EXT
:
555 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
556 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
557 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
560 case GL_BGRA_INTEGER_EXT
:
562 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
563 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
564 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
565 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
568 case GL_LUMINANCE_INTEGER_EXT
:
570 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
573 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
576 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
578 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
586 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
587 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
591 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
597 GLbyte
*dst
= (GLbyte
*) dstAddr
;
601 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
605 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
609 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
613 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
617 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
619 case GL_LUMINANCE_ALPHA
:
621 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
622 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
627 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
628 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
633 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
634 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
635 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
640 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
641 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
642 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
643 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
648 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
649 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
650 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
655 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
656 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
657 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
658 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
663 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
664 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
665 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
666 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
669 case GL_RED_INTEGER_EXT
:
671 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
674 case GL_GREEN_INTEGER_EXT
:
676 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
679 case GL_BLUE_INTEGER_EXT
:
681 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
684 case GL_ALPHA_INTEGER_EXT
:
686 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
689 case GL_RGB_INTEGER_EXT
:
691 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
692 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
693 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
696 case GL_RGBA_INTEGER_EXT
:
698 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
699 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
700 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
701 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
704 case GL_BGR_INTEGER_EXT
:
706 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
707 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
708 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
711 case GL_BGRA_INTEGER_EXT
:
713 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
714 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
715 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
716 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
719 case GL_LUMINANCE_INTEGER_EXT
:
721 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
724 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
727 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
729 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
737 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
738 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
742 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
746 case GL_UNSIGNED_SHORT
:
748 GLushort
*dst
= (GLushort
*) dstAddr
;
752 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
756 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
760 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
764 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
768 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
770 case GL_LUMINANCE_ALPHA
:
772 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
773 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
778 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
779 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
784 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
785 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
786 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
791 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
792 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
793 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
794 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
799 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
800 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
801 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
806 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
807 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
808 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
809 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
814 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
815 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
816 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
817 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
820 case GL_RED_INTEGER_EXT
:
822 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
825 case GL_GREEN_INTEGER_EXT
:
827 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
830 case GL_BLUE_INTEGER_EXT
:
832 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
835 case GL_ALPHA_INTEGER_EXT
:
837 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
840 case GL_RGB_INTEGER_EXT
:
842 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
843 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
844 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
847 case GL_RGBA_INTEGER_EXT
:
849 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
850 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
851 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
852 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
855 case GL_BGR_INTEGER_EXT
:
857 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
858 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
859 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
862 case GL_BGRA_INTEGER_EXT
:
864 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
865 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
866 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
867 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
870 case GL_LUMINANCE_INTEGER_EXT
:
872 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
875 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
878 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
880 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
888 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
889 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
893 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
899 GLshort
*dst
= (GLshort
*) dstAddr
;
903 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
907 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
911 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
915 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
919 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
921 case GL_LUMINANCE_ALPHA
:
923 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
924 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
929 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
930 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
935 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
936 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
937 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
942 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
943 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
944 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
945 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
950 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
951 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
952 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
957 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
958 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
959 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
960 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
965 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
966 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
967 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
968 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
971 case GL_RED_INTEGER_EXT
:
973 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
976 case GL_GREEN_INTEGER_EXT
:
978 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
981 case GL_BLUE_INTEGER_EXT
:
983 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
986 case GL_ALPHA_INTEGER_EXT
:
988 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
991 case GL_RGB_INTEGER_EXT
:
993 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
994 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
995 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
998 case GL_RGBA_INTEGER_EXT
:
1000 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1001 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1002 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1003 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1006 case GL_BGR_INTEGER_EXT
:
1008 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1009 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1010 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1013 case GL_BGRA_INTEGER_EXT
:
1015 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1016 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1017 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1018 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1021 case GL_LUMINANCE_INTEGER_EXT
:
1023 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1026 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1029 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1031 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1039 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1040 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1044 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1048 case GL_UNSIGNED_INT
:
1050 GLuint
*dst
= (GLuint
*) dstAddr
;
1051 switch (dstFormat
) {
1054 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1058 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1062 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1066 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1070 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1072 case GL_LUMINANCE_ALPHA
:
1074 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1075 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1080 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1081 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1086 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1087 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1088 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1093 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1094 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1095 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1096 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1101 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1102 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1103 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1108 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1109 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1110 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1111 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1116 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1117 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1118 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1119 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1122 case GL_RED_INTEGER_EXT
:
1124 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1127 case GL_GREEN_INTEGER_EXT
:
1129 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1132 case GL_BLUE_INTEGER_EXT
:
1134 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1137 case GL_ALPHA_INTEGER_EXT
:
1139 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1142 case GL_RGB_INTEGER_EXT
:
1144 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1145 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1146 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1149 case GL_RGBA_INTEGER_EXT
:
1151 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1152 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1153 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1154 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1157 case GL_BGR_INTEGER_EXT
:
1159 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1160 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1161 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1164 case GL_BGRA_INTEGER_EXT
:
1166 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1167 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1168 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1169 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1172 case GL_LUMINANCE_INTEGER_EXT
:
1174 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1177 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1180 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1182 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1190 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1191 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1195 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1201 GLint
*dst
= (GLint
*) dstAddr
;
1202 switch (dstFormat
) {
1205 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1209 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1213 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1217 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1221 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1223 case GL_LUMINANCE_ALPHA
:
1225 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1226 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1231 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1232 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1237 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1238 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1239 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1244 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1245 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1246 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1247 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1252 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1253 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1254 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1259 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1260 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1261 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1262 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1267 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1268 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1269 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1270 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1276 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1277 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1280 case GL_RED_INTEGER_EXT
:
1282 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1285 case GL_GREEN_INTEGER_EXT
:
1287 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1290 case GL_BLUE_INTEGER_EXT
:
1292 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1295 case GL_ALPHA_INTEGER_EXT
:
1297 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1300 case GL_RGB_INTEGER_EXT
:
1302 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1303 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1304 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1307 case GL_RGBA_INTEGER_EXT
:
1309 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1310 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1311 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1312 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1315 case GL_BGR_INTEGER_EXT
:
1317 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1318 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1319 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1322 case GL_BGRA_INTEGER_EXT
:
1324 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1325 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1326 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1327 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1330 case GL_LUMINANCE_INTEGER_EXT
:
1332 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1335 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1338 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1340 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1346 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1352 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1353 switch (dstFormat
) {
1356 dst
[i
] = rgba
[i
][RCOMP
];
1360 dst
[i
] = rgba
[i
][GCOMP
];
1364 dst
[i
] = rgba
[i
][BCOMP
];
1368 dst
[i
] = rgba
[i
][ACOMP
];
1372 dst
[i
] = luminance
[i
];
1374 case GL_LUMINANCE_ALPHA
:
1376 dst
[i
*2+0] = luminance
[i
];
1377 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1382 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1383 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1388 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1389 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1390 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1395 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1396 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1397 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1398 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1403 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1404 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1405 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1410 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1411 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1412 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1413 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1418 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1419 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1420 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1421 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1427 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1428 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1432 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1436 case GL_HALF_FLOAT_ARB
:
1438 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1439 switch (dstFormat
) {
1442 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1446 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1450 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1454 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1458 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1460 case GL_LUMINANCE_ALPHA
:
1462 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1463 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1468 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1469 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1474 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1475 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1476 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1481 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1482 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1483 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1484 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1489 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1490 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1491 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1496 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1497 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1498 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1499 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1504 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1505 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1506 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1507 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1513 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1514 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1518 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1522 case GL_UNSIGNED_BYTE_3_3_2
:
1523 if (dstFormat
== GL_RGB
) {
1524 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1526 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1527 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1528 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1532 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1533 if (dstFormat
== GL_RGB
) {
1534 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1536 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1537 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1538 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1542 case GL_UNSIGNED_SHORT_5_6_5
:
1543 if (dstFormat
== GL_RGB
) {
1544 GLushort
*dst
= (GLushort
*) dstAddr
;
1546 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1547 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1548 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1552 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1553 if (dstFormat
== GL_RGB
) {
1554 GLushort
*dst
= (GLushort
*) dstAddr
;
1556 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1557 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1558 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1562 case GL_UNSIGNED_SHORT_4_4_4_4
:
1563 if (dstFormat
== GL_RGBA
) {
1564 GLushort
*dst
= (GLushort
*) dstAddr
;
1566 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1567 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1568 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1569 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1572 else if (dstFormat
== GL_BGRA
) {
1573 GLushort
*dst
= (GLushort
*) dstAddr
;
1575 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1576 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1577 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1578 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1581 else if (dstFormat
== GL_ABGR_EXT
) {
1582 GLushort
*dst
= (GLushort
*) dstAddr
;
1584 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1585 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1586 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1587 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1591 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1592 if (dstFormat
== GL_RGBA
) {
1593 GLushort
*dst
= (GLushort
*) dstAddr
;
1595 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1596 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1597 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1598 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1601 else if (dstFormat
== GL_BGRA
) {
1602 GLushort
*dst
= (GLushort
*) dstAddr
;
1604 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1605 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1606 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1607 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1610 else if (dstFormat
== GL_ABGR_EXT
) {
1611 GLushort
*dst
= (GLushort
*) dstAddr
;
1613 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1614 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1615 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1616 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1620 case GL_UNSIGNED_SHORT_5_5_5_1
:
1621 if (dstFormat
== GL_RGBA
) {
1622 GLushort
*dst
= (GLushort
*) dstAddr
;
1624 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1625 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1626 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1627 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1630 else if (dstFormat
== GL_BGRA
) {
1631 GLushort
*dst
= (GLushort
*) dstAddr
;
1633 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1634 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1635 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1636 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1639 else if (dstFormat
== GL_ABGR_EXT
) {
1640 GLushort
*dst
= (GLushort
*) dstAddr
;
1642 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1643 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1644 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1645 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1649 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1650 if (dstFormat
== GL_RGBA
) {
1651 GLushort
*dst
= (GLushort
*) dstAddr
;
1653 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1654 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1655 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1656 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1659 else if (dstFormat
== GL_BGRA
) {
1660 GLushort
*dst
= (GLushort
*) dstAddr
;
1662 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1663 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1664 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1665 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1668 else if (dstFormat
== GL_ABGR_EXT
) {
1669 GLushort
*dst
= (GLushort
*) dstAddr
;
1671 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1672 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1673 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1674 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1678 case GL_UNSIGNED_INT_8_8_8_8
:
1679 if (dstFormat
== GL_RGBA
) {
1680 GLuint
*dst
= (GLuint
*) dstAddr
;
1682 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1683 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1684 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1685 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1688 else if (dstFormat
== GL_BGRA
) {
1689 GLuint
*dst
= (GLuint
*) dstAddr
;
1691 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1692 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1693 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1694 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1697 else if (dstFormat
== GL_ABGR_EXT
) {
1698 GLuint
*dst
= (GLuint
*) dstAddr
;
1700 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1701 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1702 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1703 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1707 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1708 if (dstFormat
== GL_RGBA
) {
1709 GLuint
*dst
= (GLuint
*) dstAddr
;
1711 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1712 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1713 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1714 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1717 else if (dstFormat
== GL_BGRA
) {
1718 GLuint
*dst
= (GLuint
*) dstAddr
;
1720 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1721 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1722 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1723 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1726 else if (dstFormat
== GL_ABGR_EXT
) {
1727 GLuint
*dst
= (GLuint
*) dstAddr
;
1729 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1730 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1731 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1732 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1736 case GL_UNSIGNED_INT_10_10_10_2
:
1737 if (dstFormat
== GL_RGBA
) {
1738 GLuint
*dst
= (GLuint
*) dstAddr
;
1740 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1741 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1742 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1743 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1746 else if (dstFormat
== GL_BGRA
) {
1747 GLuint
*dst
= (GLuint
*) dstAddr
;
1749 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1750 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1751 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1752 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1755 else if (dstFormat
== GL_ABGR_EXT
) {
1756 GLuint
*dst
= (GLuint
*) dstAddr
;
1758 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1759 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1760 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1761 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1765 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1766 if (dstFormat
== GL_RGBA
) {
1767 GLuint
*dst
= (GLuint
*) dstAddr
;
1769 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1770 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1771 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1772 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1775 else if (dstFormat
== GL_BGRA
) {
1776 GLuint
*dst
= (GLuint
*) dstAddr
;
1778 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1779 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1780 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1781 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1784 else if (dstFormat
== GL_ABGR_EXT
) {
1785 GLuint
*dst
= (GLuint
*) dstAddr
;
1787 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1788 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1789 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1790 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1795 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1799 if (dstPacking
->SwapBytes
) {
1800 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1801 if (swapSize
== 2) {
1802 if (dstPacking
->SwapBytes
) {
1803 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1806 else if (swapSize
== 4) {
1807 if (dstPacking
->SwapBytes
) {
1808 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1816 #define SWAP2BYTE(VALUE) \
1818 GLubyte *bytes = (GLubyte *) &(VALUE); \
1819 GLubyte tmp = bytes[0]; \
1820 bytes[0] = bytes[1]; \
1824 #define SWAP4BYTE(VALUE) \
1826 GLubyte *bytes = (GLubyte *) &(VALUE); \
1827 GLubyte tmp = bytes[0]; \
1828 bytes[0] = bytes[3]; \
1831 bytes[1] = bytes[2]; \
1837 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1838 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1839 const struct gl_pixelstore_attrib
*unpack
)
1841 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1843 ASSERT(srcType
== GL_BITMAP
||
1844 srcType
== GL_UNSIGNED_BYTE
||
1845 srcType
== GL_BYTE
||
1846 srcType
== GL_UNSIGNED_SHORT
||
1847 srcType
== GL_SHORT
||
1848 srcType
== GL_UNSIGNED_INT
||
1849 srcType
== GL_INT
||
1850 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1851 srcType
== GL_HALF_FLOAT_ARB
||
1852 srcType
== GL_FLOAT
);
1857 GLubyte
*ubsrc
= (GLubyte
*) src
;
1858 if (unpack
->LsbFirst
) {
1859 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1861 for (i
= 0; i
< n
; i
++) {
1862 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1873 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1875 for (i
= 0; i
< n
; i
++) {
1876 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1888 case GL_UNSIGNED_BYTE
:
1891 const GLubyte
*s
= (const GLubyte
*) src
;
1892 for (i
= 0; i
< n
; i
++)
1899 const GLbyte
*s
= (const GLbyte
*) src
;
1900 for (i
= 0; i
< n
; i
++)
1904 case GL_UNSIGNED_SHORT
:
1907 const GLushort
*s
= (const GLushort
*) src
;
1908 if (unpack
->SwapBytes
) {
1909 for (i
= 0; i
< n
; i
++) {
1910 GLushort value
= s
[i
];
1916 for (i
= 0; i
< n
; i
++)
1924 const GLshort
*s
= (const GLshort
*) src
;
1925 if (unpack
->SwapBytes
) {
1926 for (i
= 0; i
< n
; i
++) {
1927 GLshort value
= s
[i
];
1933 for (i
= 0; i
< n
; i
++)
1938 case GL_UNSIGNED_INT
:
1941 const GLuint
*s
= (const GLuint
*) src
;
1942 if (unpack
->SwapBytes
) {
1943 for (i
= 0; i
< n
; i
++) {
1944 GLuint value
= s
[i
];
1950 for (i
= 0; i
< n
; i
++)
1958 const GLint
*s
= (const GLint
*) src
;
1959 if (unpack
->SwapBytes
) {
1960 for (i
= 0; i
< n
; i
++) {
1967 for (i
= 0; i
< n
; i
++)
1975 const GLfloat
*s
= (const GLfloat
*) src
;
1976 if (unpack
->SwapBytes
) {
1977 for (i
= 0; i
< n
; i
++) {
1978 GLfloat value
= s
[i
];
1980 indexes
[i
] = (GLuint
) value
;
1984 for (i
= 0; i
< n
; i
++)
1985 indexes
[i
] = (GLuint
) s
[i
];
1989 case GL_HALF_FLOAT_ARB
:
1992 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
1993 if (unpack
->SwapBytes
) {
1994 for (i
= 0; i
< n
; i
++) {
1995 GLhalfARB value
= s
[i
];
1997 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2001 for (i
= 0; i
< n
; i
++)
2002 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2006 case GL_UNSIGNED_INT_24_8_EXT
:
2009 const GLuint
*s
= (const GLuint
*) src
;
2010 if (unpack
->SwapBytes
) {
2011 for (i
= 0; i
< n
; i
++) {
2012 GLuint value
= s
[i
];
2014 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2018 for (i
= 0; i
< n
; i
++)
2019 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2025 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2032 * This function extracts floating point RGBA values from arbitrary
2033 * image data. srcFormat and srcType are the format and type parameters
2034 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2036 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2037 * implements the "Conversion to floating point", "Conversion to RGB",
2038 * and "Final Expansion to RGBA" operations.
2040 * Args: n - number of pixels
2041 * rgba - output colors
2042 * srcFormat - format of incoming data
2043 * srcType - data type of incoming data
2044 * src - source data pointer
2045 * swapBytes - perform byteswapping of incoming data?
2048 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2049 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2050 GLboolean swapBytes
)
2052 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
2054 GLint rComp
, bComp
, gComp
, aComp
;
2055 GLboolean intFormat
;
2056 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2058 ASSERT(srcFormat
== GL_RED
||
2059 srcFormat
== GL_GREEN
||
2060 srcFormat
== GL_BLUE
||
2061 srcFormat
== GL_ALPHA
||
2062 srcFormat
== GL_LUMINANCE
||
2063 srcFormat
== GL_LUMINANCE_ALPHA
||
2064 srcFormat
== GL_INTENSITY
||
2065 srcFormat
== GL_RG
||
2066 srcFormat
== GL_RGB
||
2067 srcFormat
== GL_BGR
||
2068 srcFormat
== GL_RGBA
||
2069 srcFormat
== GL_BGRA
||
2070 srcFormat
== GL_ABGR_EXT
||
2071 srcFormat
== GL_DU8DV8_ATI
||
2072 srcFormat
== GL_DUDV_ATI
||
2073 srcFormat
== GL_RED_INTEGER_EXT
||
2074 srcFormat
== GL_GREEN_INTEGER_EXT
||
2075 srcFormat
== GL_BLUE_INTEGER_EXT
||
2076 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2077 srcFormat
== GL_RGB_INTEGER_EXT
||
2078 srcFormat
== GL_RGBA_INTEGER_EXT
||
2079 srcFormat
== GL_BGR_INTEGER_EXT
||
2080 srcFormat
== GL_BGRA_INTEGER_EXT
||
2081 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2082 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2084 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2085 srcType
== GL_BYTE
||
2086 srcType
== GL_UNSIGNED_SHORT
||
2087 srcType
== GL_SHORT
||
2088 srcType
== GL_UNSIGNED_INT
||
2089 srcType
== GL_INT
||
2090 srcType
== GL_HALF_FLOAT_ARB
||
2091 srcType
== GL_FLOAT
||
2092 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2093 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2094 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2095 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2096 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2097 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2098 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2099 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2100 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2101 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2102 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2103 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2105 rComp
= gComp
= bComp
= aComp
= -1;
2107 switch (srcFormat
) {
2109 case GL_RED_INTEGER_EXT
:
2111 greenIndex
= blueIndex
= alphaIndex
= -1;
2115 case GL_GREEN_INTEGER_EXT
:
2117 redIndex
= blueIndex
= alphaIndex
= -1;
2121 case GL_BLUE_INTEGER_EXT
:
2123 redIndex
= greenIndex
= alphaIndex
= -1;
2127 case GL_ALPHA_INTEGER_EXT
:
2128 redIndex
= greenIndex
= blueIndex
= -1;
2133 case GL_LUMINANCE_INTEGER_EXT
:
2134 redIndex
= greenIndex
= blueIndex
= 0;
2138 case GL_LUMINANCE_ALPHA
:
2139 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2140 redIndex
= greenIndex
= blueIndex
= 0;
2145 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
2161 case GL_RGB_INTEGER
:
2184 case GL_RGBA_INTEGER
:
2226 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
2227 _mesa_lookup_enum_by_nr(srcFormat
));
2231 intFormat
= _mesa_is_integer_format(srcFormat
);
2233 #define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
2234 if ((INDEX) < 0) { \
2237 for (i = 0; i < n; i++) { \
2238 rgba[i][CHANNEL] = DEFAULT_INT; \
2242 for (i = 0; i < n; i++) { \
2243 rgba[i][CHANNEL] = DEFAULT; \
2247 else if (swapBytes) { \
2248 const TYPE *s = (const TYPE *) src; \
2250 for (i = 0; i < n; i++) { \
2251 TYPE value = s[INDEX]; \
2252 if (sizeof(TYPE) == 2) { \
2255 else if (sizeof(TYPE) == 4) { \
2259 rgba[i][CHANNEL] = (GLfloat) value; \
2261 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2266 const TYPE *s = (const TYPE *) src; \
2269 for (i = 0; i < n; i++) { \
2270 rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
2275 for (i = 0; i < n; i++) { \
2276 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2283 case GL_UNSIGNED_BYTE
:
2284 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2285 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2286 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2287 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2290 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2291 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2292 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2293 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2295 case GL_UNSIGNED_SHORT
:
2296 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2297 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2298 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2299 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2302 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2303 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2304 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2305 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2307 case GL_UNSIGNED_INT
:
2308 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2309 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2310 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2311 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2314 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2315 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2316 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2317 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2320 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2321 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2322 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2323 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2325 case GL_HALF_FLOAT_ARB
:
2326 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2327 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2328 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2329 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2331 case GL_UNSIGNED_BYTE_3_3_2
:
2333 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2340 for (i
= 0; i
< n
; i
++) {
2341 GLubyte p
= ubsrc
[i
];
2342 rgba
[i
][rComp
] = ((p
>> 5) ) * rs
;
2343 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * gs
;
2344 rgba
[i
][bComp
] = ((p
) & 0x3) * bs
;
2345 rgba
[i
][aComp
] = 1.0F
;
2349 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2351 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2358 for (i
= 0; i
< n
; i
++) {
2359 GLubyte p
= ubsrc
[i
];
2360 rgba
[i
][rComp
] = ((p
) & 0x7) * rs
;
2361 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * gs
;
2362 rgba
[i
][bComp
] = ((p
>> 6) ) * bs
;
2363 rgba
[i
][aComp
] = 1.0F
;
2367 case GL_UNSIGNED_SHORT_5_6_5
:
2374 const GLushort
*ussrc
= (const GLushort
*) src
;
2376 for (i
= 0; i
< n
; i
++) {
2377 GLushort p
= ussrc
[i
];
2379 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2380 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2381 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
2382 rgba
[i
][aComp
] = 1.0F
;
2386 const GLushort
*ussrc
= (const GLushort
*) src
;
2388 for (i
= 0; i
< n
; i
++) {
2389 GLushort p
= ussrc
[i
];
2390 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2391 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2392 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
2393 rgba
[i
][aComp
] = 1.0F
;
2397 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2404 const GLushort
*ussrc
= (const GLushort
*) src
;
2406 for (i
= 0; i
< n
; i
++) {
2407 GLushort p
= ussrc
[i
];
2409 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2410 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2411 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
2412 rgba
[i
][aComp
] = 1.0F
;
2416 const GLushort
*ussrc
= (const GLushort
*) src
;
2418 for (i
= 0; i
< n
; i
++) {
2419 GLushort p
= ussrc
[i
];
2420 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2421 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2422 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
2423 rgba
[i
][aComp
] = 1.0F
;
2427 case GL_UNSIGNED_SHORT_4_4_4_4
:
2429 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2432 const GLushort
*ussrc
= (const GLushort
*) src
;
2434 for (i
= 0; i
< n
; i
++) {
2435 GLushort p
= ussrc
[i
];
2437 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
2438 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
2439 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
2440 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
2444 const GLushort
*ussrc
= (const GLushort
*) src
;
2446 for (i
= 0; i
< n
; i
++) {
2447 GLushort p
= ussrc
[i
];
2448 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
2449 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
2450 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
2451 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
2455 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2457 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2460 const GLushort
*ussrc
= (const GLushort
*) src
;
2462 for (i
= 0; i
< n
; i
++) {
2463 GLushort p
= ussrc
[i
];
2465 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
2466 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
2467 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
2468 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
2472 const GLushort
*ussrc
= (const GLushort
*) src
;
2474 for (i
= 0; i
< n
; i
++) {
2475 GLushort p
= ussrc
[i
];
2476 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
2477 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
2478 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
2479 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
2483 case GL_UNSIGNED_SHORT_5_5_5_1
:
2485 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2488 const GLushort
*ussrc
= (const GLushort
*) src
;
2490 for (i
= 0; i
< n
; i
++) {
2491 GLushort p
= ussrc
[i
];
2493 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2494 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
2495 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
2496 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
2500 const GLushort
*ussrc
= (const GLushort
*) src
;
2502 for (i
= 0; i
< n
; i
++) {
2503 GLushort p
= ussrc
[i
];
2504 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2505 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
2506 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
2507 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
2511 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2513 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2516 const GLushort
*ussrc
= (const GLushort
*) src
;
2518 for (i
= 0; i
< n
; i
++) {
2519 GLushort p
= ussrc
[i
];
2521 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2522 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
2523 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
2524 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
2528 const GLushort
*ussrc
= (const GLushort
*) src
;
2530 for (i
= 0; i
< n
; i
++) {
2531 GLushort p
= ussrc
[i
];
2532 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2533 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
2534 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
2535 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
2539 case GL_UNSIGNED_INT_8_8_8_8
:
2541 const GLuint
*uisrc
= (const GLuint
*) src
;
2544 for (i
= 0; i
< n
; i
++) {
2545 GLuint p
= uisrc
[i
];
2546 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
2547 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2548 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2549 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
2553 for (i
= 0; i
< n
; i
++) {
2554 GLuint p
= uisrc
[i
];
2555 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2556 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2557 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2558 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2563 const GLuint
*uisrc
= (const GLuint
*) src
;
2566 for (i
= 0; i
< n
; i
++) {
2567 GLuint p
= uisrc
[i
];
2568 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
2569 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2570 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2571 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
2575 for (i
= 0; i
< n
; i
++) {
2576 GLuint p
= uisrc
[i
];
2577 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2578 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2579 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2580 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2585 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2587 const GLuint
*uisrc
= (const GLuint
*) src
;
2590 for (i
= 0; i
< n
; i
++) {
2591 GLuint p
= uisrc
[i
];
2592 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
2593 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2594 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2595 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
2599 for (i
= 0; i
< n
; i
++) {
2600 GLuint p
= uisrc
[i
];
2601 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2602 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2603 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2604 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2609 const GLuint
*uisrc
= (const GLuint
*) src
;
2612 for (i
= 0; i
< n
; i
++) {
2613 GLuint p
= uisrc
[i
];
2614 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
2615 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2616 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2617 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
2621 for (i
= 0; i
< n
; i
++) {
2622 GLuint p
= uisrc
[i
];
2623 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2624 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2625 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2626 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2631 case GL_UNSIGNED_INT_10_10_10_2
:
2633 rs
= 1.0F
/ 1023.0F
;
2634 gs
= 1.0F
/ 1023.0F
;
2635 bs
= 1.0F
/ 1023.0F
;
2639 const GLuint
*uisrc
= (const GLuint
*) src
;
2641 for (i
= 0; i
< n
; i
++) {
2642 GLuint p
= uisrc
[i
];
2644 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
2645 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
2646 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
2647 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
2651 const GLuint
*uisrc
= (const GLuint
*) src
;
2653 for (i
= 0; i
< n
; i
++) {
2654 GLuint p
= uisrc
[i
];
2655 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
2656 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
2657 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
2658 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
2662 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2664 rs
= 1.0F
/ 1023.0F
;
2665 gs
= 1.0F
/ 1023.0F
;
2666 bs
= 1.0F
/ 1023.0F
;
2670 const GLuint
*uisrc
= (const GLuint
*) src
;
2672 for (i
= 0; i
< n
; i
++) {
2673 GLuint p
= uisrc
[i
];
2675 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
2676 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
2677 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
2678 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
2682 const GLuint
*uisrc
= (const GLuint
*) src
;
2684 for (i
= 0; i
< n
; i
++) {
2685 GLuint p
= uisrc
[i
];
2686 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
2687 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
2688 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
2689 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
2694 _mesa_problem(NULL
, "bad srcType in extract float data");
2701 static INLINE GLuint
2702 clamp_byte_to_uint(GLbyte b
)
2704 return b
< 0 ? 0 : b
;
2708 static INLINE GLuint
2709 clamp_short_to_uint(GLshort s
)
2711 return s
< 0 ? 0 : s
;
2715 static INLINE GLuint
2716 clamp_int_to_uint(GLint i
)
2718 return i
< 0 ? 0 : i
;
2722 static INLINE GLuint
2723 clamp_float_to_uint(GLfloat f
)
2725 return f
< 0.0F
? 0 : IROUND(f
);
2729 static INLINE GLuint
2730 clamp_half_to_uint(GLhalfARB h
)
2732 GLfloat f
= _mesa_half_to_float(h
);
2733 return f
< 0.0F
? 0 : IROUND(f
);
2738 * \sa extract_float_rgba()
2741 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2742 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2743 GLboolean swapBytes
)
2745 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
2747 GLint rComp
, bComp
, gComp
, aComp
;
2748 GLboolean intFormat
;
2750 ASSERT(srcFormat
== GL_RED
||
2751 srcFormat
== GL_GREEN
||
2752 srcFormat
== GL_BLUE
||
2753 srcFormat
== GL_ALPHA
||
2754 srcFormat
== GL_LUMINANCE
||
2755 srcFormat
== GL_LUMINANCE_ALPHA
||
2756 srcFormat
== GL_INTENSITY
||
2757 srcFormat
== GL_RG
||
2758 srcFormat
== GL_RGB
||
2759 srcFormat
== GL_BGR
||
2760 srcFormat
== GL_RGBA
||
2761 srcFormat
== GL_BGRA
||
2762 srcFormat
== GL_ABGR_EXT
||
2763 srcFormat
== GL_DU8DV8_ATI
||
2764 srcFormat
== GL_DUDV_ATI
||
2765 srcFormat
== GL_RED_INTEGER_EXT
||
2766 srcFormat
== GL_GREEN_INTEGER_EXT
||
2767 srcFormat
== GL_BLUE_INTEGER_EXT
||
2768 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2769 srcFormat
== GL_RGB_INTEGER_EXT
||
2770 srcFormat
== GL_RGBA_INTEGER_EXT
||
2771 srcFormat
== GL_BGR_INTEGER_EXT
||
2772 srcFormat
== GL_BGRA_INTEGER_EXT
||
2773 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2774 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2776 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2777 srcType
== GL_BYTE
||
2778 srcType
== GL_UNSIGNED_SHORT
||
2779 srcType
== GL_SHORT
||
2780 srcType
== GL_UNSIGNED_INT
||
2781 srcType
== GL_INT
||
2782 srcType
== GL_HALF_FLOAT_ARB
||
2783 srcType
== GL_FLOAT
||
2784 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2785 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2786 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2787 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2788 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2789 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2790 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2791 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2792 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2793 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2794 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2795 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2797 rComp
= gComp
= bComp
= aComp
= -1;
2799 switch (srcFormat
) {
2801 case GL_RED_INTEGER_EXT
:
2803 greenIndex
= blueIndex
= alphaIndex
= -1;
2807 case GL_GREEN_INTEGER_EXT
:
2809 redIndex
= blueIndex
= alphaIndex
= -1;
2813 case GL_BLUE_INTEGER_EXT
:
2815 redIndex
= greenIndex
= alphaIndex
= -1;
2819 case GL_ALPHA_INTEGER_EXT
:
2820 redIndex
= greenIndex
= blueIndex
= -1;
2825 case GL_LUMINANCE_INTEGER_EXT
:
2826 redIndex
= greenIndex
= blueIndex
= 0;
2830 case GL_LUMINANCE_ALPHA
:
2831 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2832 redIndex
= greenIndex
= blueIndex
= 0;
2837 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
2853 case GL_RGB_INTEGER
:
2876 case GL_RGBA_INTEGER
:
2910 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
2911 _mesa_lookup_enum_by_nr(srcFormat
));
2915 intFormat
= _mesa_is_integer_format(srcFormat
);
2917 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
2918 if ((INDEX) < 0) { \
2920 for (i = 0; i < n; i++) { \
2921 rgba[i][CHANNEL] = DEFAULT; \
2924 else if (swapBytes) { \
2925 const TYPE *s = (const TYPE *) src; \
2927 for (i = 0; i < n; i++) { \
2928 TYPE value = s[INDEX]; \
2929 if (sizeof(TYPE) == 2) { \
2932 else if (sizeof(TYPE) == 4) { \
2935 rgba[i][CHANNEL] = CONVERSION(value); \
2940 const TYPE *s = (const TYPE *) src; \
2942 for (i = 0; i < n; i++) { \
2943 rgba[i][CHANNEL] = CONVERSION(s[INDEX]); \
2949 case GL_UNSIGNED_BYTE
:
2950 PROCESS(redIndex
, RCOMP
, 0, GLubyte
, (GLuint
));
2951 PROCESS(greenIndex
, GCOMP
, 0, GLubyte
, (GLuint
));
2952 PROCESS(blueIndex
, BCOMP
, 0, GLubyte
, (GLuint
));
2953 PROCESS(alphaIndex
, ACOMP
, 1, GLubyte
, (GLuint
));
2956 PROCESS(redIndex
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2957 PROCESS(greenIndex
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2958 PROCESS(blueIndex
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2959 PROCESS(alphaIndex
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2961 case GL_UNSIGNED_SHORT
:
2962 PROCESS(redIndex
, RCOMP
, 0, GLushort
, (GLuint
));
2963 PROCESS(greenIndex
, GCOMP
, 0, GLushort
, (GLuint
));
2964 PROCESS(blueIndex
, BCOMP
, 0, GLushort
, (GLuint
));
2965 PROCESS(alphaIndex
, ACOMP
, 1, GLushort
, (GLuint
));
2968 PROCESS(redIndex
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
2969 PROCESS(greenIndex
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
2970 PROCESS(blueIndex
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
2971 PROCESS(alphaIndex
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
2973 case GL_UNSIGNED_INT
:
2974 PROCESS(redIndex
, RCOMP
, 0, GLuint
, (GLuint
));
2975 PROCESS(greenIndex
, GCOMP
, 0, GLuint
, (GLuint
));
2976 PROCESS(blueIndex
, BCOMP
, 0, GLuint
, (GLuint
));
2977 PROCESS(alphaIndex
, ACOMP
, 1, GLuint
, (GLuint
));
2980 PROCESS(redIndex
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
2981 PROCESS(greenIndex
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
2982 PROCESS(blueIndex
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
2983 PROCESS(alphaIndex
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
2986 PROCESS(redIndex
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2987 PROCESS(greenIndex
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2988 PROCESS(blueIndex
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2989 PROCESS(alphaIndex
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
2991 case GL_HALF_FLOAT_ARB
:
2992 PROCESS(redIndex
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2993 PROCESS(greenIndex
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2994 PROCESS(blueIndex
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2995 PROCESS(alphaIndex
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
2997 case GL_UNSIGNED_BYTE_3_3_2
:
2999 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3001 for (i
= 0; i
< n
; i
++) {
3002 GLubyte p
= ubsrc
[i
];
3003 rgba
[i
][rComp
] = ((p
>> 5) );
3004 rgba
[i
][gComp
] = ((p
>> 2) & 0x7);
3005 rgba
[i
][bComp
] = ((p
) & 0x3);
3010 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3012 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3014 for (i
= 0; i
< n
; i
++) {
3015 GLubyte p
= ubsrc
[i
];
3016 rgba
[i
][rComp
] = ((p
) & 0x7);
3017 rgba
[i
][gComp
] = ((p
>> 3) & 0x7);
3018 rgba
[i
][bComp
] = ((p
>> 6) );
3023 case GL_UNSIGNED_SHORT_5_6_5
:
3025 const GLushort
*ussrc
= (const GLushort
*) src
;
3027 for (i
= 0; i
< n
; i
++) {
3028 GLushort p
= ussrc
[i
];
3030 rgba
[i
][rComp
] = ((p
>> 11) );
3031 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f);
3032 rgba
[i
][bComp
] = ((p
) & 0x1f);
3037 const GLushort
*ussrc
= (const GLushort
*) src
;
3039 for (i
= 0; i
< n
; i
++) {
3040 GLushort p
= ussrc
[i
];
3041 rgba
[i
][rComp
] = ((p
>> 11) );
3042 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f);
3043 rgba
[i
][bComp
] = ((p
) & 0x1f);
3048 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3050 const GLushort
*ussrc
= (const GLushort
*) src
;
3052 for (i
= 0; i
< n
; i
++) {
3053 GLushort p
= ussrc
[i
];
3055 rgba
[i
][rComp
] = ((p
) & 0x1f);
3056 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f);
3057 rgba
[i
][bComp
] = ((p
>> 11) );
3062 const GLushort
*ussrc
= (const GLushort
*) src
;
3064 for (i
= 0; i
< n
; i
++) {
3065 GLushort p
= ussrc
[i
];
3066 rgba
[i
][rComp
] = ((p
) & 0x1f);
3067 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f);
3068 rgba
[i
][bComp
] = ((p
>> 11) );
3073 case GL_UNSIGNED_SHORT_4_4_4_4
:
3075 const GLushort
*ussrc
= (const GLushort
*) src
;
3077 for (i
= 0; i
< n
; i
++) {
3078 GLushort p
= ussrc
[i
];
3080 rgba
[i
][rComp
] = ((p
>> 12) );
3081 rgba
[i
][gComp
] = ((p
>> 8) & 0xf);
3082 rgba
[i
][bComp
] = ((p
>> 4) & 0xf);
3083 rgba
[i
][aComp
] = ((p
) & 0xf);
3087 const GLushort
*ussrc
= (const GLushort
*) src
;
3089 for (i
= 0; i
< n
; i
++) {
3090 GLushort p
= ussrc
[i
];
3091 rgba
[i
][rComp
] = ((p
>> 12) );
3092 rgba
[i
][gComp
] = ((p
>> 8) & 0xf);
3093 rgba
[i
][bComp
] = ((p
>> 4) & 0xf);
3094 rgba
[i
][aComp
] = ((p
) & 0xf);
3098 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3100 const GLushort
*ussrc
= (const GLushort
*) src
;
3102 for (i
= 0; i
< n
; i
++) {
3103 GLushort p
= ussrc
[i
];
3105 rgba
[i
][rComp
] = ((p
) & 0xf);
3106 rgba
[i
][gComp
] = ((p
>> 4) & 0xf);
3107 rgba
[i
][bComp
] = ((p
>> 8) & 0xf);
3108 rgba
[i
][aComp
] = ((p
>> 12) );
3112 const GLushort
*ussrc
= (const GLushort
*) src
;
3114 for (i
= 0; i
< n
; i
++) {
3115 GLushort p
= ussrc
[i
];
3116 rgba
[i
][rComp
] = ((p
) & 0xf);
3117 rgba
[i
][gComp
] = ((p
>> 4) & 0xf);
3118 rgba
[i
][bComp
] = ((p
>> 8) & 0xf);
3119 rgba
[i
][aComp
] = ((p
>> 12) );
3123 case GL_UNSIGNED_SHORT_5_5_5_1
:
3125 const GLushort
*ussrc
= (const GLushort
*) src
;
3127 for (i
= 0; i
< n
; i
++) {
3128 GLushort p
= ussrc
[i
];
3130 rgba
[i
][rComp
] = ((p
>> 11) );
3131 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f);
3132 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f);
3133 rgba
[i
][aComp
] = ((p
) & 0x1 );
3137 const GLushort
*ussrc
= (const GLushort
*) src
;
3139 for (i
= 0; i
< n
; i
++) {
3140 GLushort p
= ussrc
[i
];
3141 rgba
[i
][rComp
] = ((p
>> 11) );
3142 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f);
3143 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f);
3144 rgba
[i
][aComp
] = ((p
) & 0x1 );
3148 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3150 const GLushort
*ussrc
= (const GLushort
*) src
;
3152 for (i
= 0; i
< n
; i
++) {
3153 GLushort p
= ussrc
[i
];
3155 rgba
[i
][rComp
] = ((p
) & 0x1f);
3156 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f);
3157 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f);
3158 rgba
[i
][aComp
] = ((p
>> 15) );
3162 const GLushort
*ussrc
= (const GLushort
*) src
;
3164 for (i
= 0; i
< n
; i
++) {
3165 GLushort p
= ussrc
[i
];
3166 rgba
[i
][rComp
] = ((p
) & 0x1f);
3167 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f);
3168 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f);
3169 rgba
[i
][aComp
] = ((p
>> 15) );
3173 case GL_UNSIGNED_INT_8_8_8_8
:
3175 const GLuint
*uisrc
= (const GLuint
*) src
;
3177 for (i
= 0; i
< n
; i
++) {
3178 GLuint p
= uisrc
[i
];
3179 rgba
[i
][rComp
] = ((p
) & 0xff);
3180 rgba
[i
][gComp
] = ((p
>> 8) & 0xff);
3181 rgba
[i
][bComp
] = ((p
>> 16) & 0xff);
3182 rgba
[i
][aComp
] = ((p
>> 24) );
3186 const GLuint
*uisrc
= (const GLuint
*) src
;
3188 for (i
= 0; i
< n
; i
++) {
3189 GLuint p
= uisrc
[i
];
3190 rgba
[i
][rComp
] = ((p
>> 24) );
3191 rgba
[i
][gComp
] = ((p
>> 16) & 0xff);
3192 rgba
[i
][bComp
] = ((p
>> 8) & 0xff);
3193 rgba
[i
][aComp
] = ((p
) & 0xff);
3197 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3199 const GLuint
*uisrc
= (const GLuint
*) src
;
3201 for (i
= 0; i
< n
; i
++) {
3202 GLuint p
= uisrc
[i
];
3203 rgba
[i
][rComp
] = ((p
>> 24) );
3204 rgba
[i
][gComp
] = ((p
>> 16) & 0xff);
3205 rgba
[i
][bComp
] = ((p
>> 8) & 0xff);
3206 rgba
[i
][aComp
] = ((p
) & 0xff);
3210 const GLuint
*uisrc
= (const GLuint
*) src
;
3212 for (i
= 0; i
< n
; i
++) {
3213 GLuint p
= uisrc
[i
];
3214 rgba
[i
][rComp
] = ((p
) & 0xff);
3215 rgba
[i
][gComp
] = ((p
>> 8) & 0xff);
3216 rgba
[i
][bComp
] = ((p
>> 16) & 0xff);
3217 rgba
[i
][aComp
] = ((p
>> 24) );
3221 case GL_UNSIGNED_INT_10_10_10_2
:
3223 const GLuint
*uisrc
= (const GLuint
*) src
;
3225 for (i
= 0; i
< n
; i
++) {
3226 GLuint p
= uisrc
[i
];
3228 rgba
[i
][rComp
] = ((p
>> 22) );
3229 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff);
3230 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff);
3231 rgba
[i
][aComp
] = ((p
) & 0x3 );
3235 const GLuint
*uisrc
= (const GLuint
*) src
;
3237 for (i
= 0; i
< n
; i
++) {
3238 GLuint p
= uisrc
[i
];
3239 rgba
[i
][rComp
] = ((p
>> 22) );
3240 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff);
3241 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff);
3242 rgba
[i
][aComp
] = ((p
) & 0x3 );
3246 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3248 const GLuint
*uisrc
= (const GLuint
*) src
;
3250 for (i
= 0; i
< n
; i
++) {
3251 GLuint p
= uisrc
[i
];
3253 rgba
[i
][rComp
] = ((p
) & 0x3ff);
3254 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff);
3255 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff);
3256 rgba
[i
][aComp
] = ((p
>> 30) );
3260 const GLuint
*uisrc
= (const GLuint
*) src
;
3262 for (i
= 0; i
< n
; i
++) {
3263 GLuint p
= uisrc
[i
];
3264 rgba
[i
][rComp
] = ((p
) & 0x3ff);
3265 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff);
3266 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff);
3267 rgba
[i
][aComp
] = ((p
>> 30) );
3272 _mesa_problem(NULL
, "bad srcType in extract uint data");
3281 * Unpack a row of color image data from a client buffer according to
3282 * the pixel unpacking parameters.
3283 * Return GLchan values in the specified dest image format.
3284 * This is used by glDrawPixels and glTexImage?D().
3285 * \param ctx - the context
3286 * n - number of pixels in the span
3287 * dstFormat - format of destination color array
3288 * dest - the destination color array
3289 * srcFormat - source image format
3290 * srcType - source image data type
3291 * source - source image pointer
3292 * srcPacking - pixel unpacking parameters
3293 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3295 * XXX perhaps expand this to process whole images someday.
3298 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3299 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3300 GLenum srcFormat
, GLenum srcType
,
3301 const GLvoid
*source
,
3302 const struct gl_pixelstore_attrib
*srcPacking
,
3303 GLbitfield transferOps
)
3305 ASSERT(dstFormat
== GL_ALPHA
||
3306 dstFormat
== GL_LUMINANCE
||
3307 dstFormat
== GL_LUMINANCE_ALPHA
||
3308 dstFormat
== GL_INTENSITY
||
3309 dstFormat
== GL_RED
||
3310 dstFormat
== GL_RG
||
3311 dstFormat
== GL_RGB
||
3312 dstFormat
== GL_RGBA
||
3313 dstFormat
== GL_COLOR_INDEX
);
3315 ASSERT(srcFormat
== GL_RED
||
3316 srcFormat
== GL_GREEN
||
3317 srcFormat
== GL_BLUE
||
3318 srcFormat
== GL_ALPHA
||
3319 srcFormat
== GL_LUMINANCE
||
3320 srcFormat
== GL_LUMINANCE_ALPHA
||
3321 srcFormat
== GL_INTENSITY
||
3322 srcFormat
== GL_RG
||
3323 srcFormat
== GL_RGB
||
3324 srcFormat
== GL_BGR
||
3325 srcFormat
== GL_RGBA
||
3326 srcFormat
== GL_BGRA
||
3327 srcFormat
== GL_ABGR_EXT
||
3328 srcFormat
== GL_COLOR_INDEX
);
3330 ASSERT(srcType
== GL_BITMAP
||
3331 srcType
== GL_UNSIGNED_BYTE
||
3332 srcType
== GL_BYTE
||
3333 srcType
== GL_UNSIGNED_SHORT
||
3334 srcType
== GL_SHORT
||
3335 srcType
== GL_UNSIGNED_INT
||
3336 srcType
== GL_INT
||
3337 srcType
== GL_HALF_FLOAT_ARB
||
3338 srcType
== GL_FLOAT
||
3339 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3340 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3341 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3342 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3343 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3344 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3345 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3346 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3347 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3348 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3349 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3350 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3352 /* Try simple cases first */
3353 if (transferOps
== 0) {
3354 if (srcType
== CHAN_TYPE
) {
3355 if (dstFormat
== GL_RGBA
) {
3356 if (srcFormat
== GL_RGBA
) {
3357 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3360 else if (srcFormat
== GL_RGB
) {
3362 const GLchan
*src
= (const GLchan
*) source
;
3364 for (i
= 0; i
< n
; i
++) {
3375 else if (dstFormat
== GL_RGB
) {
3376 if (srcFormat
== GL_RGB
) {
3377 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3380 else if (srcFormat
== GL_RGBA
) {
3382 const GLchan
*src
= (const GLchan
*) source
;
3384 for (i
= 0; i
< n
; i
++) {
3394 else if (dstFormat
== srcFormat
) {
3395 GLint comps
= _mesa_components_in_format(srcFormat
);
3397 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3402 * Common situation, loading 8bit RGBA/RGB source images
3403 * into 16/32 bit destination. (OSMesa16/32)
3405 else if (srcType
== GL_UNSIGNED_BYTE
) {
3406 if (dstFormat
== GL_RGBA
) {
3407 if (srcFormat
== GL_RGB
) {
3409 const GLubyte
*src
= (const GLubyte
*) source
;
3411 for (i
= 0; i
< n
; i
++) {
3412 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3413 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3414 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3421 else if (srcFormat
== GL_RGBA
) {
3423 const GLubyte
*src
= (const GLubyte
*) source
;
3425 for (i
= 0; i
< n
; i
++) {
3426 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3427 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3428 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3429 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3436 else if (dstFormat
== GL_RGB
) {
3437 if (srcFormat
== GL_RGB
) {
3439 const GLubyte
*src
= (const GLubyte
*) source
;
3441 for (i
= 0; i
< n
; i
++) {
3442 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3443 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3444 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3450 else if (srcFormat
== GL_RGBA
) {
3452 const GLubyte
*src
= (const GLubyte
*) source
;
3454 for (i
= 0; i
< n
; i
++) {
3455 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3456 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3457 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3468 /* general solution begins here */
3470 GLint dstComponents
;
3471 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3472 GLint dstLuminanceIndex
, dstIntensityIndex
;
3473 GLfloat rgba
[MAX_WIDTH
][4];
3475 dstComponents
= _mesa_components_in_format( dstFormat
);
3476 /* source & dest image formats should have been error checked by now */
3477 assert(dstComponents
> 0);
3480 * Extract image data and convert to RGBA floats
3482 assert(n
<= MAX_WIDTH
);
3483 if (srcFormat
== GL_COLOR_INDEX
) {
3484 GLuint indexes
[MAX_WIDTH
];
3485 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3488 if (dstFormat
== GL_COLOR_INDEX
) {
3490 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3491 /* convert to GLchan and return */
3492 for (i
= 0; i
< n
; i
++) {
3493 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3498 /* Convert indexes to RGBA */
3499 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3500 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3502 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3505 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3506 * with color indexes.
3508 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3511 /* non-color index data */
3512 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3513 srcPacking
->SwapBytes
);
3516 /* Need to clamp if returning GLubytes or GLushorts */
3517 #if CHAN_TYPE != GL_FLOAT
3518 transferOps
|= IMAGE_CLAMP_BIT
;
3522 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3525 /* Now determine which color channels we need to produce.
3526 * And determine the dest index (offset) within each color tuple.
3528 switch (dstFormat
) {
3531 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3532 dstLuminanceIndex
= dstIntensityIndex
= -1;
3535 dstLuminanceIndex
= 0;
3536 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3537 dstIntensityIndex
= -1;
3539 case GL_LUMINANCE_ALPHA
:
3540 dstLuminanceIndex
= 0;
3542 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3543 dstIntensityIndex
= -1;
3546 dstIntensityIndex
= 0;
3547 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3548 dstLuminanceIndex
= -1;
3552 dstGreenIndex
= dstBlueIndex
= -1;
3553 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3559 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3565 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3572 dstLuminanceIndex
= dstIntensityIndex
= -1;
3575 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
3580 /* Now return the GLchan data in the requested dstFormat */
3582 if (dstRedIndex
>= 0) {
3585 for (i
= 0; i
< n
; i
++) {
3586 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
3587 dst
+= dstComponents
;
3591 if (dstGreenIndex
>= 0) {
3594 for (i
= 0; i
< n
; i
++) {
3595 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
3596 dst
+= dstComponents
;
3600 if (dstBlueIndex
>= 0) {
3603 for (i
= 0; i
< n
; i
++) {
3604 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
3605 dst
+= dstComponents
;
3609 if (dstAlphaIndex
>= 0) {
3612 for (i
= 0; i
< n
; i
++) {
3613 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
3614 dst
+= dstComponents
;
3618 if (dstIntensityIndex
>= 0) {
3621 assert(dstIntensityIndex
== 0);
3622 assert(dstComponents
== 1);
3623 for (i
= 0; i
< n
; i
++) {
3624 /* Intensity comes from red channel */
3625 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3629 if (dstLuminanceIndex
>= 0) {
3632 assert(dstLuminanceIndex
== 0);
3633 for (i
= 0; i
< n
; i
++) {
3634 /* Luminance comes from red channel */
3635 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3636 dst
+= dstComponents
;
3644 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3645 * instead of GLchan.
3648 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3649 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3650 GLenum srcFormat
, GLenum srcType
,
3651 const GLvoid
*source
,
3652 const struct gl_pixelstore_attrib
*srcPacking
,
3653 GLbitfield transferOps
)
3655 ASSERT(dstFormat
== GL_ALPHA
||
3656 dstFormat
== GL_LUMINANCE
||
3657 dstFormat
== GL_LUMINANCE_ALPHA
||
3658 dstFormat
== GL_INTENSITY
||
3659 dstFormat
== GL_RED
||
3660 dstFormat
== GL_RG
||
3661 dstFormat
== GL_RGB
||
3662 dstFormat
== GL_RGBA
||
3663 dstFormat
== GL_COLOR_INDEX
);
3665 ASSERT(srcFormat
== GL_RED
||
3666 srcFormat
== GL_GREEN
||
3667 srcFormat
== GL_BLUE
||
3668 srcFormat
== GL_ALPHA
||
3669 srcFormat
== GL_LUMINANCE
||
3670 srcFormat
== GL_LUMINANCE_ALPHA
||
3671 srcFormat
== GL_INTENSITY
||
3672 srcFormat
== GL_RG
||
3673 srcFormat
== GL_RGB
||
3674 srcFormat
== GL_BGR
||
3675 srcFormat
== GL_RGBA
||
3676 srcFormat
== GL_BGRA
||
3677 srcFormat
== GL_ABGR_EXT
||
3678 srcFormat
== GL_RED_INTEGER_EXT
||
3679 srcFormat
== GL_GREEN_INTEGER_EXT
||
3680 srcFormat
== GL_BLUE_INTEGER_EXT
||
3681 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3682 srcFormat
== GL_RGB_INTEGER_EXT
||
3683 srcFormat
== GL_RGBA_INTEGER_EXT
||
3684 srcFormat
== GL_BGR_INTEGER_EXT
||
3685 srcFormat
== GL_BGRA_INTEGER_EXT
||
3686 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3687 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3688 srcFormat
== GL_COLOR_INDEX
);
3690 ASSERT(srcType
== GL_BITMAP
||
3691 srcType
== GL_UNSIGNED_BYTE
||
3692 srcType
== GL_BYTE
||
3693 srcType
== GL_UNSIGNED_SHORT
||
3694 srcType
== GL_SHORT
||
3695 srcType
== GL_UNSIGNED_INT
||
3696 srcType
== GL_INT
||
3697 srcType
== GL_HALF_FLOAT_ARB
||
3698 srcType
== GL_FLOAT
||
3699 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3700 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3701 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3702 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3703 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3704 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3705 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3706 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3707 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3708 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3709 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3710 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3712 /* general solution, no special cases, yet */
3714 GLint dstComponents
;
3715 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3716 GLint dstLuminanceIndex
, dstIntensityIndex
;
3717 GLfloat rgba
[MAX_WIDTH
][4];
3719 dstComponents
= _mesa_components_in_format( dstFormat
);
3720 /* source & dest image formats should have been error checked by now */
3721 assert(dstComponents
> 0);
3724 * Extract image data and convert to RGBA floats
3726 assert(n
<= MAX_WIDTH
);
3727 if (srcFormat
== GL_COLOR_INDEX
) {
3728 GLuint indexes
[MAX_WIDTH
];
3729 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3732 if (dstFormat
== GL_COLOR_INDEX
) {
3734 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3735 /* convert to GLchan and return */
3736 for (i
= 0; i
< n
; i
++) {
3737 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3742 /* Convert indexes to RGBA */
3743 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3744 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3746 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3749 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3750 * with color indexes.
3752 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3755 /* non-color index data */
3756 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3757 srcPacking
->SwapBytes
);
3761 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3764 /* Now determine which color channels we need to produce.
3765 * And determine the dest index (offset) within each color tuple.
3767 switch (dstFormat
) {
3770 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3771 dstLuminanceIndex
= dstIntensityIndex
= -1;
3774 dstLuminanceIndex
= 0;
3775 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3776 dstIntensityIndex
= -1;
3778 case GL_LUMINANCE_ALPHA
:
3779 dstLuminanceIndex
= 0;
3781 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3782 dstIntensityIndex
= -1;
3785 dstIntensityIndex
= 0;
3786 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3787 dstLuminanceIndex
= -1;
3791 dstGreenIndex
= dstBlueIndex
= -1;
3792 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3798 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3804 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3811 dstLuminanceIndex
= dstIntensityIndex
= -1;
3814 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
3818 /* Now pack results in the requested dstFormat */
3819 if (dstRedIndex
>= 0) {
3820 GLfloat
*dst
= dest
;
3822 for (i
= 0; i
< n
; i
++) {
3823 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
3824 dst
+= dstComponents
;
3828 if (dstGreenIndex
>= 0) {
3829 GLfloat
*dst
= dest
;
3831 for (i
= 0; i
< n
; i
++) {
3832 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
3833 dst
+= dstComponents
;
3837 if (dstBlueIndex
>= 0) {
3838 GLfloat
*dst
= dest
;
3840 for (i
= 0; i
< n
; i
++) {
3841 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
3842 dst
+= dstComponents
;
3846 if (dstAlphaIndex
>= 0) {
3847 GLfloat
*dst
= dest
;
3849 for (i
= 0; i
< n
; i
++) {
3850 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
3851 dst
+= dstComponents
;
3855 if (dstIntensityIndex
>= 0) {
3856 GLfloat
*dst
= dest
;
3858 assert(dstIntensityIndex
== 0);
3859 assert(dstComponents
== 1);
3860 for (i
= 0; i
< n
; i
++) {
3861 /* Intensity comes from red channel */
3862 dst
[i
] = rgba
[i
][RCOMP
];
3866 if (dstLuminanceIndex
>= 0) {
3867 GLfloat
*dst
= dest
;
3869 assert(dstLuminanceIndex
== 0);
3870 for (i
= 0; i
< n
; i
++) {
3871 /* Luminance comes from red channel */
3872 dst
[0] = rgba
[i
][RCOMP
];
3873 dst
+= dstComponents
;
3884 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3885 * instead of GLchan.
3886 * No pixel transfer ops are applied.
3889 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3890 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3891 GLenum srcFormat
, GLenum srcType
,
3892 const GLvoid
*source
,
3893 const struct gl_pixelstore_attrib
*srcPacking
)
3895 GLuint rgba
[MAX_WIDTH
][4];
3897 ASSERT(n
<= MAX_WIDTH
);
3899 ASSERT(dstFormat
== GL_ALPHA
||
3900 dstFormat
== GL_LUMINANCE
||
3901 dstFormat
== GL_LUMINANCE_ALPHA
||
3902 dstFormat
== GL_INTENSITY
||
3903 dstFormat
== GL_RED
||
3904 dstFormat
== GL_RG
||
3905 dstFormat
== GL_RGB
||
3906 dstFormat
== GL_RGBA
);
3908 ASSERT(srcFormat
== GL_RED
||
3909 srcFormat
== GL_GREEN
||
3910 srcFormat
== GL_BLUE
||
3911 srcFormat
== GL_ALPHA
||
3912 srcFormat
== GL_LUMINANCE
||
3913 srcFormat
== GL_LUMINANCE_ALPHA
||
3914 srcFormat
== GL_INTENSITY
||
3915 srcFormat
== GL_RG
||
3916 srcFormat
== GL_RGB
||
3917 srcFormat
== GL_BGR
||
3918 srcFormat
== GL_RGBA
||
3919 srcFormat
== GL_BGRA
||
3920 srcFormat
== GL_ABGR_EXT
||
3921 srcFormat
== GL_RED_INTEGER_EXT
||
3922 srcFormat
== GL_GREEN_INTEGER_EXT
||
3923 srcFormat
== GL_BLUE_INTEGER_EXT
||
3924 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3925 srcFormat
== GL_RGB_INTEGER_EXT
||
3926 srcFormat
== GL_RGBA_INTEGER_EXT
||
3927 srcFormat
== GL_BGR_INTEGER_EXT
||
3928 srcFormat
== GL_BGRA_INTEGER_EXT
||
3929 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3930 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3932 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3933 srcType
== GL_BYTE
||
3934 srcType
== GL_UNSIGNED_SHORT
||
3935 srcType
== GL_SHORT
||
3936 srcType
== GL_UNSIGNED_INT
||
3937 srcType
== GL_INT
||
3938 srcType
== GL_HALF_FLOAT_ARB
||
3939 srcType
== GL_FLOAT
||
3940 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3941 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3942 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3943 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3944 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3945 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3946 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3947 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3948 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3949 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3950 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3951 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3954 /* Extract image data as uint[4] pixels */
3955 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3956 srcPacking
->SwapBytes
);
3958 if (dstFormat
== GL_RGBA
) {
3960 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3964 GLint dstRedIndex
= -1;
3965 GLint dstGreenIndex
= -1;
3966 GLint dstBlueIndex
= -1;
3967 GLint dstAlphaIndex
= -1;
3968 GLint dstLuminanceIndex
= -1;
3969 GLint dstIntensityIndex
= -1;
3970 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3972 assert(dstComponents
> 0);
3974 /* Now determine which color channels we need to produce.
3975 * And determine the dest index (offset) within each color tuple.
3977 switch (dstFormat
) {
3982 dstLuminanceIndex
= 0;
3984 case GL_LUMINANCE_ALPHA
:
3985 dstLuminanceIndex
= 0;
3989 dstIntensityIndex
= 0;
4011 "bad dstFormat in _mesa_unpack_color_span_uint()");
4015 /* Now pack values in the requested dest format */
4016 if (dstRedIndex
>= 0) {
4019 for (i
= 0; i
< n
; i
++) {
4020 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
4021 dst
+= dstComponents
;
4025 if (dstGreenIndex
>= 0) {
4028 for (i
= 0; i
< n
; i
++) {
4029 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
4030 dst
+= dstComponents
;
4034 if (dstBlueIndex
>= 0) {
4037 for (i
= 0; i
< n
; i
++) {
4038 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
4039 dst
+= dstComponents
;
4043 if (dstAlphaIndex
>= 0) {
4046 for (i
= 0; i
< n
; i
++) {
4047 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
4048 dst
+= dstComponents
;
4052 if (dstIntensityIndex
>= 0) {
4055 assert(dstIntensityIndex
== 0);
4056 assert(dstComponents
== 1);
4057 for (i
= 0; i
< n
; i
++) {
4058 /* Intensity comes from red channel */
4059 dst
[i
] = rgba
[i
][RCOMP
];
4063 if (dstLuminanceIndex
>= 0) {
4066 assert(dstLuminanceIndex
== 0);
4067 for (i
= 0; i
< n
; i
++) {
4068 /* Luminance comes from red channel */
4069 dst
[0] = rgba
[i
][RCOMP
];
4070 dst
+= dstComponents
;
4079 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4080 * directly return GLbyte data, no transfer ops apply.
4083 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4084 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4085 GLenum srcFormat
, GLenum srcType
,
4086 const GLvoid
*source
,
4087 const struct gl_pixelstore_attrib
*srcPacking
,
4088 GLbitfield transferOps
)
4090 ASSERT(dstFormat
== GL_DUDV_ATI
);
4091 ASSERT(srcFormat
== GL_DUDV_ATI
);
4093 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4094 srcType
== GL_BYTE
||
4095 srcType
== GL_UNSIGNED_SHORT
||
4096 srcType
== GL_SHORT
||
4097 srcType
== GL_UNSIGNED_INT
||
4098 srcType
== GL_INT
||
4099 srcType
== GL_HALF_FLOAT_ARB
||
4100 srcType
== GL_FLOAT
);
4102 /* general solution */
4104 GLint dstComponents
;
4105 GLfloat rgba
[MAX_WIDTH
][4];
4109 dstComponents
= _mesa_components_in_format( dstFormat
);
4110 /* source & dest image formats should have been error checked by now */
4111 assert(dstComponents
> 0);
4114 * Extract image data and convert to RGBA floats
4116 assert(n
<= MAX_WIDTH
);
4117 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4118 srcPacking
->SwapBytes
);
4121 /* Now determine which color channels we need to produce.
4122 * And determine the dest index (offset) within each color tuple.
4125 /* Now pack results in the requested dstFormat */
4126 for (i
= 0; i
< n
; i
++) {
4127 /* not sure - need clamp[-1,1] here? */
4128 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4129 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4130 dst
+= dstComponents
;
4136 * Unpack a row of color index data from a client buffer according to
4137 * the pixel unpacking parameters.
4138 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4140 * Args: ctx - the context
4141 * n - number of pixels
4142 * dstType - destination data type
4143 * dest - destination array
4144 * srcType - source pixel type
4145 * source - source data pointer
4146 * srcPacking - pixel unpacking parameters
4147 * transferOps - the pixel transfer operations to apply
4150 _mesa_unpack_index_span( const struct gl_context
*ctx
, GLuint n
,
4151 GLenum dstType
, GLvoid
*dest
,
4152 GLenum srcType
, const GLvoid
*source
,
4153 const struct gl_pixelstore_attrib
*srcPacking
,
4154 GLbitfield transferOps
)
4156 ASSERT(srcType
== GL_BITMAP
||
4157 srcType
== GL_UNSIGNED_BYTE
||
4158 srcType
== GL_BYTE
||
4159 srcType
== GL_UNSIGNED_SHORT
||
4160 srcType
== GL_SHORT
||
4161 srcType
== GL_UNSIGNED_INT
||
4162 srcType
== GL_INT
||
4163 srcType
== GL_HALF_FLOAT_ARB
||
4164 srcType
== GL_FLOAT
);
4166 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4167 dstType
== GL_UNSIGNED_SHORT
||
4168 dstType
== GL_UNSIGNED_INT
);
4171 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4174 * Try simple cases first
4176 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4177 && dstType
== GL_UNSIGNED_BYTE
) {
4178 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4180 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4181 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4182 memcpy(dest
, source
, n
* sizeof(GLuint
));
4188 GLuint indexes
[MAX_WIDTH
];
4189 assert(n
<= MAX_WIDTH
);
4191 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4195 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4197 /* convert to dest type */
4199 case GL_UNSIGNED_BYTE
:
4201 GLubyte
*dst
= (GLubyte
*) dest
;
4203 for (i
= 0; i
< n
; i
++) {
4204 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4208 case GL_UNSIGNED_SHORT
:
4210 GLuint
*dst
= (GLuint
*) dest
;
4212 for (i
= 0; i
< n
; i
++) {
4213 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4217 case GL_UNSIGNED_INT
:
4218 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4221 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4228 _mesa_pack_index_span( const struct gl_context
*ctx
, GLuint n
,
4229 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4230 const struct gl_pixelstore_attrib
*dstPacking
,
4231 GLbitfield transferOps
)
4233 GLuint indexes
[MAX_WIDTH
];
4235 ASSERT(n
<= MAX_WIDTH
);
4237 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4239 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4240 /* make a copy of input */
4241 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4242 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4247 case GL_UNSIGNED_BYTE
:
4249 GLubyte
*dst
= (GLubyte
*) dest
;
4251 for (i
= 0; i
< n
; i
++) {
4252 *dst
++ = (GLubyte
) source
[i
];
4258 GLbyte
*dst
= (GLbyte
*) dest
;
4260 for (i
= 0; i
< n
; i
++) {
4261 dst
[i
] = (GLbyte
) source
[i
];
4265 case GL_UNSIGNED_SHORT
:
4267 GLushort
*dst
= (GLushort
*) dest
;
4269 for (i
= 0; i
< n
; i
++) {
4270 dst
[i
] = (GLushort
) source
[i
];
4272 if (dstPacking
->SwapBytes
) {
4273 _mesa_swap2( (GLushort
*) dst
, n
);
4279 GLshort
*dst
= (GLshort
*) dest
;
4281 for (i
= 0; i
< n
; i
++) {
4282 dst
[i
] = (GLshort
) source
[i
];
4284 if (dstPacking
->SwapBytes
) {
4285 _mesa_swap2( (GLushort
*) dst
, n
);
4289 case GL_UNSIGNED_INT
:
4291 GLuint
*dst
= (GLuint
*) dest
;
4293 for (i
= 0; i
< n
; i
++) {
4294 dst
[i
] = (GLuint
) source
[i
];
4296 if (dstPacking
->SwapBytes
) {
4297 _mesa_swap4( (GLuint
*) dst
, n
);
4303 GLint
*dst
= (GLint
*) dest
;
4305 for (i
= 0; i
< n
; i
++) {
4306 dst
[i
] = (GLint
) source
[i
];
4308 if (dstPacking
->SwapBytes
) {
4309 _mesa_swap4( (GLuint
*) dst
, n
);
4315 GLfloat
*dst
= (GLfloat
*) dest
;
4317 for (i
= 0; i
< n
; i
++) {
4318 dst
[i
] = (GLfloat
) source
[i
];
4320 if (dstPacking
->SwapBytes
) {
4321 _mesa_swap4( (GLuint
*) dst
, n
);
4325 case GL_HALF_FLOAT_ARB
:
4327 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4329 for (i
= 0; i
< n
; i
++) {
4330 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4332 if (dstPacking
->SwapBytes
) {
4333 _mesa_swap2( (GLushort
*) dst
, n
);
4338 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4344 * Unpack a row of stencil data from a client buffer according to
4345 * the pixel unpacking parameters.
4346 * This is (or will be) used by glDrawPixels
4348 * Args: ctx - the context
4349 * n - number of pixels
4350 * dstType - destination data type
4351 * dest - destination array
4352 * srcType - source pixel type
4353 * source - source data pointer
4354 * srcPacking - pixel unpacking parameters
4355 * transferOps - apply offset/bias/lookup ops?
4358 _mesa_unpack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4359 GLenum dstType
, GLvoid
*dest
,
4360 GLenum srcType
, const GLvoid
*source
,
4361 const struct gl_pixelstore_attrib
*srcPacking
,
4362 GLbitfield transferOps
)
4364 ASSERT(srcType
== GL_BITMAP
||
4365 srcType
== GL_UNSIGNED_BYTE
||
4366 srcType
== GL_BYTE
||
4367 srcType
== GL_UNSIGNED_SHORT
||
4368 srcType
== GL_SHORT
||
4369 srcType
== GL_UNSIGNED_INT
||
4370 srcType
== GL_INT
||
4371 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4372 srcType
== GL_HALF_FLOAT_ARB
||
4373 srcType
== GL_FLOAT
);
4375 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4376 dstType
== GL_UNSIGNED_SHORT
||
4377 dstType
== GL_UNSIGNED_INT
);
4379 /* only shift and offset apply to stencil */
4380 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4383 * Try simple cases first
4385 if (transferOps
== 0 &&
4386 !ctx
->Pixel
.MapStencilFlag
&&
4387 srcType
== GL_UNSIGNED_BYTE
&&
4388 dstType
== GL_UNSIGNED_BYTE
) {
4389 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4391 else if (transferOps
== 0 &&
4392 !ctx
->Pixel
.MapStencilFlag
&&
4393 srcType
== GL_UNSIGNED_INT
&&
4394 dstType
== GL_UNSIGNED_INT
&&
4395 !srcPacking
->SwapBytes
) {
4396 memcpy(dest
, source
, n
* sizeof(GLuint
));
4402 GLuint indexes
[MAX_WIDTH
];
4403 assert(n
<= MAX_WIDTH
);
4405 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4408 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4409 /* shift and offset indexes */
4410 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4413 if (ctx
->Pixel
.MapStencilFlag
) {
4414 /* Apply stencil lookup table */
4415 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4417 for (i
= 0; i
< n
; i
++) {
4418 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4422 /* convert to dest type */
4424 case GL_UNSIGNED_BYTE
:
4426 GLubyte
*dst
= (GLubyte
*) dest
;
4428 for (i
= 0; i
< n
; i
++) {
4429 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4433 case GL_UNSIGNED_SHORT
:
4435 GLuint
*dst
= (GLuint
*) dest
;
4437 for (i
= 0; i
< n
; i
++) {
4438 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4442 case GL_UNSIGNED_INT
:
4443 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4446 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4453 _mesa_pack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4454 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4455 const struct gl_pixelstore_attrib
*dstPacking
)
4457 GLstencil stencil
[MAX_WIDTH
];
4459 ASSERT(n
<= MAX_WIDTH
);
4461 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4462 ctx
->Pixel
.MapStencilFlag
) {
4463 /* make a copy of input */
4464 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4465 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4470 case GL_UNSIGNED_BYTE
:
4471 if (sizeof(GLstencil
) == 1) {
4472 memcpy( dest
, source
, n
);
4475 GLubyte
*dst
= (GLubyte
*) dest
;
4478 dst
[i
] = (GLubyte
) source
[i
];
4484 GLbyte
*dst
= (GLbyte
*) dest
;
4487 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4491 case GL_UNSIGNED_SHORT
:
4493 GLushort
*dst
= (GLushort
*) dest
;
4496 dst
[i
] = (GLushort
) source
[i
];
4498 if (dstPacking
->SwapBytes
) {
4499 _mesa_swap2( (GLushort
*) dst
, n
);
4505 GLshort
*dst
= (GLshort
*) dest
;
4508 dst
[i
] = (GLshort
) source
[i
];
4510 if (dstPacking
->SwapBytes
) {
4511 _mesa_swap2( (GLushort
*) dst
, n
);
4515 case GL_UNSIGNED_INT
:
4517 GLuint
*dst
= (GLuint
*) dest
;
4520 dst
[i
] = (GLuint
) source
[i
];
4522 if (dstPacking
->SwapBytes
) {
4523 _mesa_swap4( (GLuint
*) dst
, n
);
4529 GLint
*dst
= (GLint
*) dest
;
4532 dst
[i
] = (GLint
) source
[i
];
4534 if (dstPacking
->SwapBytes
) {
4535 _mesa_swap4( (GLuint
*) dst
, n
);
4541 GLfloat
*dst
= (GLfloat
*) dest
;
4544 dst
[i
] = (GLfloat
) source
[i
];
4546 if (dstPacking
->SwapBytes
) {
4547 _mesa_swap4( (GLuint
*) dst
, n
);
4551 case GL_HALF_FLOAT_ARB
:
4553 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4556 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4558 if (dstPacking
->SwapBytes
) {
4559 _mesa_swap2( (GLushort
*) dst
, n
);
4564 if (dstPacking
->LsbFirst
) {
4565 GLubyte
*dst
= (GLubyte
*) dest
;
4568 for (i
= 0; i
< n
; i
++) {
4571 *dst
|= ((source
[i
] != 0) << shift
);
4580 GLubyte
*dst
= (GLubyte
*) dest
;
4583 for (i
= 0; i
< n
; i
++) {
4586 *dst
|= ((source
[i
] != 0) << shift
);
4596 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4600 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4603 const GLTYPE *src = (const GLTYPE *)source; \
4604 for (i = 0; i < n; i++) { \
4605 GLTYPE value = src[i]; \
4606 if (srcPacking->SwapBytes) { \
4607 if (sizeof(GLTYPE) == 2) { \
4609 } else if (sizeof(GLTYPE) == 4) { \
4613 depthValues[i] = GLTYPE2FLOAT(value); \
4619 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4620 * or GLfloat values.
4621 * The glPixelTransfer (scale/bias) params will be applied.
4623 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4624 * \param depthMax max value for returned GLushort or GLuint values
4625 * (ignored for GLfloat).
4628 _mesa_unpack_depth_span( const struct gl_context
*ctx
, GLuint n
,
4629 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4630 GLenum srcType
, const GLvoid
*source
,
4631 const struct gl_pixelstore_attrib
*srcPacking
)
4633 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
4634 GLboolean needClamp
= GL_FALSE
;
4636 /* Look for special cases first.
4637 * Not only are these faster, they're less prone to numeric conversion
4638 * problems. Otherwise, converting from an int type to a float then
4639 * back to an int type can introduce errors that will show up as
4640 * artifacts in things like depth peeling which uses glCopyTexImage.
4642 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4643 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4644 const GLuint
*src
= (const GLuint
*) source
;
4645 GLushort
*dst
= (GLushort
*) dest
;
4647 for (i
= 0; i
< n
; i
++) {
4648 dst
[i
] = src
[i
] >> 16;
4652 if (srcType
== GL_UNSIGNED_SHORT
4653 && dstType
== GL_UNSIGNED_INT
4654 && depthMax
== 0xffffffff) {
4655 const GLushort
*src
= (const GLushort
*) source
;
4656 GLuint
*dst
= (GLuint
*) dest
;
4658 for (i
= 0; i
< n
; i
++) {
4659 dst
[i
] = src
[i
] | (src
[i
] << 16);
4663 if (srcType
== GL_UNSIGNED_INT_24_8
4664 && dstType
== GL_UNSIGNED_INT
4665 && depthMax
== 0xffffff) {
4666 const GLuint
*src
= (const GLuint
*) source
;
4667 GLuint
*dst
= (GLuint
*) dest
;
4669 for (i
= 0; i
< n
; i
++) {
4670 dst
[i
] = src
[i
] >> 8;
4674 /* XXX may want to add additional cases here someday */
4677 /* general case path follows */
4679 if (dstType
== GL_FLOAT
) {
4680 depthValues
= (GLfloat
*) dest
;
4683 depthValues
= depthTemp
;
4686 /* Convert incoming values to GLfloat. Some conversions will require
4691 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4692 needClamp
= GL_TRUE
;
4694 case GL_UNSIGNED_BYTE
:
4695 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4698 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4699 needClamp
= GL_TRUE
;
4701 case GL_UNSIGNED_SHORT
:
4702 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4705 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4706 needClamp
= GL_TRUE
;
4708 case GL_UNSIGNED_INT
:
4709 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4711 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4712 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4713 depthMax
== 0xffffff &&
4714 ctx
->Pixel
.DepthScale
== 1.0 &&
4715 ctx
->Pixel
.DepthBias
== 0.0) {
4716 const GLuint
*src
= (const GLuint
*) source
;
4717 GLuint
*zValues
= (GLuint
*) dest
;
4719 for (i
= 0; i
< n
; i
++) {
4720 GLuint value
= src
[i
];
4721 if (srcPacking
->SwapBytes
) {
4724 zValues
[i
] = value
& 0xffffff00;
4729 const GLuint
*src
= (const GLuint
*) source
;
4730 const GLfloat scale
= 1.0f
/ 0xffffff;
4732 for (i
= 0; i
< n
; i
++) {
4733 GLuint value
= src
[i
];
4734 if (srcPacking
->SwapBytes
) {
4737 depthValues
[i
] = (value
>> 8) * scale
;
4742 DEPTH_VALUES(GLfloat
, 1*);
4743 needClamp
= GL_TRUE
;
4745 case GL_HALF_FLOAT_ARB
:
4748 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4749 for (i
= 0; i
< n
; i
++) {
4750 GLhalfARB value
= src
[i
];
4751 if (srcPacking
->SwapBytes
) {
4754 depthValues
[i
] = _mesa_half_to_float(value
);
4756 needClamp
= GL_TRUE
;
4760 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4764 /* apply depth scale and bias */
4766 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4767 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4768 if (scale
!= 1.0 || bias
!= 0.0) {
4770 for (i
= 0; i
< n
; i
++) {
4771 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4773 needClamp
= GL_TRUE
;
4777 /* clamp to [0, 1] */
4780 for (i
= 0; i
< n
; i
++) {
4781 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4786 * Convert values to dstType
4788 if (dstType
== GL_UNSIGNED_INT
) {
4789 GLuint
*zValues
= (GLuint
*) dest
;
4791 if (depthMax
<= 0xffffff) {
4792 /* no overflow worries */
4793 for (i
= 0; i
< n
; i
++) {
4794 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4798 /* need to use double precision to prevent overflow problems */
4799 for (i
= 0; i
< n
; i
++) {
4800 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4801 if (z
>= (GLdouble
) 0xffffffff)
4802 zValues
[i
] = 0xffffffff;
4804 zValues
[i
] = (GLuint
) z
;
4808 else if (dstType
== GL_UNSIGNED_SHORT
) {
4809 GLushort
*zValues
= (GLushort
*) dest
;
4811 ASSERT(depthMax
<= 0xffff);
4812 for (i
= 0; i
< n
; i
++) {
4813 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4817 ASSERT(dstType
== GL_FLOAT
);
4818 /*ASSERT(depthMax == 1.0F);*/
4824 * Pack an array of depth values. The values are floats in [0,1].
4827 _mesa_pack_depth_span( const struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4828 GLenum dstType
, const GLfloat
*depthSpan
,
4829 const struct gl_pixelstore_attrib
*dstPacking
)
4831 GLfloat depthCopy
[MAX_WIDTH
];
4833 ASSERT(n
<= MAX_WIDTH
);
4835 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4836 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4837 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4838 depthSpan
= depthCopy
;
4842 case GL_UNSIGNED_BYTE
:
4844 GLubyte
*dst
= (GLubyte
*) dest
;
4846 for (i
= 0; i
< n
; i
++) {
4847 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4853 GLbyte
*dst
= (GLbyte
*) dest
;
4855 for (i
= 0; i
< n
; i
++) {
4856 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4860 case GL_UNSIGNED_SHORT
:
4862 GLushort
*dst
= (GLushort
*) dest
;
4864 for (i
= 0; i
< n
; i
++) {
4865 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4867 if (dstPacking
->SwapBytes
) {
4868 _mesa_swap2( (GLushort
*) dst
, n
);
4874 GLshort
*dst
= (GLshort
*) dest
;
4876 for (i
= 0; i
< n
; i
++) {
4877 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4879 if (dstPacking
->SwapBytes
) {
4880 _mesa_swap2( (GLushort
*) dst
, n
);
4884 case GL_UNSIGNED_INT
:
4886 GLuint
*dst
= (GLuint
*) dest
;
4888 for (i
= 0; i
< n
; i
++) {
4889 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4891 if (dstPacking
->SwapBytes
) {
4892 _mesa_swap4( (GLuint
*) dst
, n
);
4898 GLint
*dst
= (GLint
*) dest
;
4900 for (i
= 0; i
< n
; i
++) {
4901 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4903 if (dstPacking
->SwapBytes
) {
4904 _mesa_swap4( (GLuint
*) dst
, n
);
4910 GLfloat
*dst
= (GLfloat
*) dest
;
4912 for (i
= 0; i
< n
; i
++) {
4913 dst
[i
] = depthSpan
[i
];
4915 if (dstPacking
->SwapBytes
) {
4916 _mesa_swap4( (GLuint
*) dst
, n
);
4920 case GL_HALF_FLOAT_ARB
:
4922 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4924 for (i
= 0; i
< n
; i
++) {
4925 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4927 if (dstPacking
->SwapBytes
) {
4928 _mesa_swap2( (GLushort
*) dst
, n
);
4933 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4940 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4943 _mesa_pack_depth_stencil_span(const struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4944 const GLfloat
*depthVals
,
4945 const GLstencil
*stencilVals
,
4946 const struct gl_pixelstore_attrib
*dstPacking
)
4948 GLfloat depthCopy
[MAX_WIDTH
];
4949 GLstencil stencilCopy
[MAX_WIDTH
];
4952 ASSERT(n
<= MAX_WIDTH
);
4954 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4955 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4956 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4957 depthVals
= depthCopy
;
4960 if (ctx
->Pixel
.IndexShift
||
4961 ctx
->Pixel
.IndexOffset
||
4962 ctx
->Pixel
.MapStencilFlag
) {
4963 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4964 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4965 stencilVals
= stencilCopy
;
4968 for (i
= 0; i
< n
; i
++) {
4969 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4970 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4973 if (dstPacking
->SwapBytes
) {
4974 _mesa_swap4(dest
, n
);
4982 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4983 * Return all image data in a contiguous block. This is used when we
4984 * compile glDrawPixels, glTexImage, etc into a display list. We
4985 * need a copy of the data in a standard format.
4988 _mesa_unpack_image( GLuint dimensions
,
4989 GLsizei width
, GLsizei height
, GLsizei depth
,
4990 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4991 const struct gl_pixelstore_attrib
*unpack
)
4993 GLint bytesPerRow
, compsPerRow
;
4994 GLboolean flipBytes
, swap2
, swap4
;
4997 return NULL
; /* not necessarily an error */
4999 if (width
<= 0 || height
<= 0 || depth
<= 0)
5000 return NULL
; /* generate error later */
5002 if (type
== GL_BITMAP
) {
5003 bytesPerRow
= (width
+ 7) >> 3;
5004 flipBytes
= unpack
->LsbFirst
;
5005 swap2
= swap4
= GL_FALSE
;
5009 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5010 GLint components
= _mesa_components_in_format(format
);
5013 if (_mesa_type_is_packed(type
))
5016 if (bytesPerPixel
<= 0 || components
<= 0)
5017 return NULL
; /* bad format or type. generate error later */
5018 bytesPerRow
= bytesPerPixel
* width
;
5019 bytesPerComp
= bytesPerPixel
/ components
;
5020 flipBytes
= GL_FALSE
;
5021 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5022 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5023 compsPerRow
= components
* width
;
5024 assert(compsPerRow
>= width
);
5029 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5033 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5036 for (img
= 0; img
< depth
; img
++) {
5037 for (row
= 0; row
< height
; row
++) {
5038 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5039 width
, height
, format
, type
, img
, row
, 0);
5041 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5043 flipBytes
= GL_FALSE
;
5044 if (unpack
->LsbFirst
) {
5045 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5046 GLubyte dstMask
= 128;
5047 const GLubyte
*s
= src
;
5050 for (i
= 0; i
< width
; i
++) {
5054 if (srcMask
== 128) {
5059 srcMask
= srcMask
<< 1;
5067 dstMask
= dstMask
>> 1;
5072 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5073 GLubyte dstMask
= 128;
5074 const GLubyte
*s
= src
;
5077 for (i
= 0; i
< width
; i
++) {
5086 srcMask
= srcMask
>> 1;
5094 dstMask
= dstMask
>> 1;
5100 memcpy(dst
, src
, bytesPerRow
);
5103 /* byte flipping/swapping */
5105 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5108 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5111 _mesa_swap4((GLuint
*) dst
, compsPerRow
);