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.
37 #include "pixeltransfer.h"
43 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
44 * we later convert the float to a packed integer value (such as for
45 * GL_RGB5_A1) because we'll wind up with a non-zero value.
47 * We redefine the macros here so zero is handled correctly.
50 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
53 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
57 /** Compute ceiling of integer quotient of A divided by B. */
58 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
62 * Flip the 8 bits in each byte of the given array.
65 * \param n number of bytes.
67 * \todo try this trick to flip bytes someday:
69 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
70 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
71 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
75 flip_bytes( GLubyte
*p
, GLuint n
)
78 for (i
= 0; i
< n
; i
++) {
79 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
80 a
= ((b
& 0x01) << 7) |
95 * Unpack a 32x32 pixel polygon stipple from user memory using the
96 * current pixel unpack settings.
99 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
100 const struct gl_pixelstore_attrib
*unpacking
)
102 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
104 /* Convert pattern from GLubytes to GLuints and handle big/little
109 for (i
= 0; i
< 32; i
++) {
110 dest
[i
] = (p
[0] << 24)
122 * Pack polygon stipple into user memory given current pixel packing
126 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
127 const struct gl_pixelstore_attrib
*packing
)
129 /* Convert pattern from GLuints to GLubytes to handle big/little
130 * endian differences.
134 for (i
= 0; i
< 32; i
++) {
135 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
136 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
137 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
138 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
141 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
146 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
147 * order with row alignment = 1 byte.
150 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
151 const struct gl_pixelstore_attrib
*packing
)
153 GLint bytes
, row
, width_in_bytes
;
154 GLubyte
*buffer
, *dst
;
159 /* Alloc dest storage */
160 bytes
= ((width
+ 7) / 8 * height
);
161 buffer
= (GLubyte
*) malloc( bytes
);
165 width_in_bytes
= CEILING( width
, 8 );
167 for (row
= 0; row
< height
; row
++) {
168 const GLubyte
*src
= (const GLubyte
*)
169 _mesa_image_address2d(packing
, pixels
, width
, height
,
170 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
176 if ((packing
->SkipPixels
& 7) == 0) {
177 memcpy( dst
, src
, width_in_bytes
);
178 if (packing
->LsbFirst
) {
179 flip_bytes( dst
, width_in_bytes
);
183 /* handling SkipPixels is a bit tricky (no pun intended!) */
185 if (packing
->LsbFirst
) {
186 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
187 GLubyte dstMask
= 128;
188 const GLubyte
*s
= src
;
191 for (i
= 0; i
< width
; i
++) {
195 if (srcMask
== 128) {
200 srcMask
= srcMask
<< 1;
208 dstMask
= dstMask
>> 1;
213 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
214 GLubyte dstMask
= 128;
215 const GLubyte
*s
= src
;
218 for (i
= 0; i
< width
; i
++) {
227 srcMask
= srcMask
>> 1;
235 dstMask
= dstMask
>> 1;
240 dst
+= width_in_bytes
;
251 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
252 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
254 GLint row
, width_in_bytes
;
260 width_in_bytes
= CEILING( width
, 8 );
262 for (row
= 0; row
< height
; row
++) {
263 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
264 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
268 if ((packing
->SkipPixels
& 7) == 0) {
269 memcpy( dst
, src
, width_in_bytes
);
270 if (packing
->LsbFirst
) {
271 flip_bytes( dst
, width_in_bytes
);
275 /* handling SkipPixels is a bit tricky (no pun intended!) */
277 if (packing
->LsbFirst
) {
278 GLubyte srcMask
= 128;
279 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
280 const GLubyte
*s
= src
;
283 for (i
= 0; i
< width
; i
++) {
292 srcMask
= srcMask
>> 1;
294 if (dstMask
== 128) {
300 dstMask
= dstMask
<< 1;
305 GLubyte srcMask
= 128;
306 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
307 const GLubyte
*s
= src
;
310 for (i
= 0; i
< width
; i
++) {
319 srcMask
= srcMask
>> 1;
327 dstMask
= dstMask
>> 1;
332 src
+= width_in_bytes
;
339 * For small integer types, return the min and max possible values.
340 * Used for clamping floats to unscaled integer types.
341 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
344 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
351 case GL_UNSIGNED_BYTE
:
359 case GL_UNSIGNED_SHORT
:
371 * Used to pack an array [][4] of RGBA float colors as specified
372 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
373 * Historically, the RGBA values were in [0,1] and rescaled to fit
374 * into GLubytes, etc. But with new integer formats, the RGBA values
375 * may have any value and we don't always rescale when converting to
378 * Note: the rgba values will be modified by this function when any pixel
379 * transfer ops are enabled.
382 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
383 GLenum dstFormat
, GLenum dstType
,
385 const struct gl_pixelstore_attrib
*dstPacking
,
386 GLbitfield transferOps
)
388 GLfloat luminance
[MAX_WIDTH
];
389 const GLint comps
= _mesa_components_in_format(dstFormat
);
390 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
394 * This test should probably go away. Have the caller set/clear the
395 * IMAGE_CLAMP_BIT as needed.
397 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
399 /* need to clamp to [0, 1] */
400 transferOps
|= IMAGE_CLAMP_BIT
;
405 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
409 * Component clamping (besides clamping to [0,1] in
410 * _mesa_apply_rgba_transfer_ops()).
413 /* clamping to dest type's min/max values */
415 if (get_type_min_max(dstType
, &min
, &max
)) {
416 for (i
= 0; i
< n
; i
++) {
417 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
418 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
419 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
420 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
424 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
425 /* compute luminance values */
426 if (transferOps
& IMAGE_CLAMP_BIT
) {
427 for (i
= 0; i
< n
; i
++) {
428 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
429 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
433 for (i
= 0; i
< n
; i
++) {
434 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
440 * Pack/store the pixels. Ugh! Lots of cases!!!
443 case GL_UNSIGNED_BYTE
:
445 GLubyte
*dst
= (GLubyte
*) dstAddr
;
449 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
453 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
457 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
461 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
465 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
467 case GL_LUMINANCE_ALPHA
:
469 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
470 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
475 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
476 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
481 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
482 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
483 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
488 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
489 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
490 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
491 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
496 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
497 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
498 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
503 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
504 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
505 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
506 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
511 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
512 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
513 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
514 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
517 case GL_RED_INTEGER_EXT
:
519 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
522 case GL_GREEN_INTEGER_EXT
:
524 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
527 case GL_BLUE_INTEGER_EXT
:
529 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
532 case GL_ALPHA_INTEGER_EXT
:
534 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
537 case GL_RGB_INTEGER_EXT
:
539 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
540 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
541 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
544 case GL_RGBA_INTEGER_EXT
:
546 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
547 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
548 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
549 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
552 case GL_BGR_INTEGER_EXT
:
554 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
555 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
556 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
559 case GL_BGRA_INTEGER_EXT
:
561 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
562 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
563 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
564 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
567 case GL_LUMINANCE_INTEGER_EXT
:
569 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
572 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
575 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
577 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
585 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
586 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
590 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
596 GLbyte
*dst
= (GLbyte
*) dstAddr
;
600 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
604 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
608 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
612 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
616 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
618 case GL_LUMINANCE_ALPHA
:
620 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
621 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
626 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
627 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
632 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
633 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
634 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
639 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
640 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
641 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
642 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
647 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
648 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
649 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
654 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
655 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
656 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
657 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
662 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
663 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
664 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
665 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
668 case GL_RED_INTEGER_EXT
:
670 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
673 case GL_GREEN_INTEGER_EXT
:
675 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
678 case GL_BLUE_INTEGER_EXT
:
680 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
683 case GL_ALPHA_INTEGER_EXT
:
685 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
688 case GL_RGB_INTEGER_EXT
:
690 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
691 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
692 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
695 case GL_RGBA_INTEGER_EXT
:
697 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
698 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
699 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
700 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
703 case GL_BGR_INTEGER_EXT
:
705 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
706 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
707 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
710 case GL_BGRA_INTEGER_EXT
:
712 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
713 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
714 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
715 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
718 case GL_LUMINANCE_INTEGER_EXT
:
720 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
723 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
726 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
728 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
736 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
737 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
741 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
745 case GL_UNSIGNED_SHORT
:
747 GLushort
*dst
= (GLushort
*) dstAddr
;
751 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
755 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
759 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
763 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
767 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
769 case GL_LUMINANCE_ALPHA
:
771 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
772 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
777 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
778 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
783 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
784 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
785 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
790 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
791 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
792 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
793 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
798 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
799 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
800 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
805 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
806 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
807 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
808 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
813 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
814 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
815 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
816 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
819 case GL_RED_INTEGER_EXT
:
821 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
824 case GL_GREEN_INTEGER_EXT
:
826 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
829 case GL_BLUE_INTEGER_EXT
:
831 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
834 case GL_ALPHA_INTEGER_EXT
:
836 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
839 case GL_RGB_INTEGER_EXT
:
841 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
842 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
843 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
846 case GL_RGBA_INTEGER_EXT
:
848 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
849 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
850 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
851 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
854 case GL_BGR_INTEGER_EXT
:
856 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
857 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
858 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
861 case GL_BGRA_INTEGER_EXT
:
863 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
864 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
865 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
866 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
869 case GL_LUMINANCE_INTEGER_EXT
:
871 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
874 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
877 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
879 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
887 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
888 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
892 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
898 GLshort
*dst
= (GLshort
*) dstAddr
;
902 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
906 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
910 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
914 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
918 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
920 case GL_LUMINANCE_ALPHA
:
922 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
923 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
928 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
929 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
934 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
935 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
936 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
941 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
942 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
943 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
944 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
949 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
950 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
951 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
956 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
957 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
958 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
959 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
964 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
965 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
966 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
967 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
970 case GL_RED_INTEGER_EXT
:
972 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
975 case GL_GREEN_INTEGER_EXT
:
977 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
980 case GL_BLUE_INTEGER_EXT
:
982 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
985 case GL_ALPHA_INTEGER_EXT
:
987 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
990 case GL_RGB_INTEGER_EXT
:
992 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
993 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
994 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
997 case GL_RGBA_INTEGER_EXT
:
999 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1000 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1001 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1002 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1005 case GL_BGR_INTEGER_EXT
:
1007 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1008 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1009 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1012 case GL_BGRA_INTEGER_EXT
:
1014 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1015 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1016 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1017 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1020 case GL_LUMINANCE_INTEGER_EXT
:
1022 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1025 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1028 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1030 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1038 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1039 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1043 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1047 case GL_UNSIGNED_INT
:
1049 GLuint
*dst
= (GLuint
*) dstAddr
;
1050 switch (dstFormat
) {
1053 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1057 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1061 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1065 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1069 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1071 case GL_LUMINANCE_ALPHA
:
1073 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1074 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1079 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1080 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1085 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1086 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1087 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1092 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1093 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1094 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1095 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1100 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1101 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1102 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1107 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1108 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1109 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1110 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1115 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1116 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1117 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1118 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1121 case GL_RED_INTEGER_EXT
:
1123 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1126 case GL_GREEN_INTEGER_EXT
:
1128 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1131 case GL_BLUE_INTEGER_EXT
:
1133 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1136 case GL_ALPHA_INTEGER_EXT
:
1138 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1141 case GL_RGB_INTEGER_EXT
:
1143 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1144 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1145 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1148 case GL_RGBA_INTEGER_EXT
:
1150 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1151 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1152 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1153 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1156 case GL_BGR_INTEGER_EXT
:
1158 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1159 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1160 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1163 case GL_BGRA_INTEGER_EXT
:
1165 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1166 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1167 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1168 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1171 case GL_LUMINANCE_INTEGER_EXT
:
1173 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1176 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1179 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1181 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1189 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1190 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1194 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1200 GLint
*dst
= (GLint
*) dstAddr
;
1201 switch (dstFormat
) {
1204 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1208 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1212 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1216 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1220 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1222 case GL_LUMINANCE_ALPHA
:
1224 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1225 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1230 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1231 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1236 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1237 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1238 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1243 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1244 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1245 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1246 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1251 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1252 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1253 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1258 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1259 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1260 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1261 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1266 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1267 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1268 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1269 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1275 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1276 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1279 case GL_RED_INTEGER_EXT
:
1281 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1284 case GL_GREEN_INTEGER_EXT
:
1286 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1289 case GL_BLUE_INTEGER_EXT
:
1291 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1294 case GL_ALPHA_INTEGER_EXT
:
1296 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1299 case GL_RGB_INTEGER_EXT
:
1301 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1302 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1303 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1306 case GL_RGBA_INTEGER_EXT
:
1308 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1309 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1310 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1311 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1314 case GL_BGR_INTEGER_EXT
:
1316 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1317 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1318 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1321 case GL_BGRA_INTEGER_EXT
:
1323 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1324 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1325 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1326 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1329 case GL_LUMINANCE_INTEGER_EXT
:
1331 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1334 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1337 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1339 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1345 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1351 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1352 switch (dstFormat
) {
1355 dst
[i
] = rgba
[i
][RCOMP
];
1359 dst
[i
] = rgba
[i
][GCOMP
];
1363 dst
[i
] = rgba
[i
][BCOMP
];
1367 dst
[i
] = rgba
[i
][ACOMP
];
1371 dst
[i
] = luminance
[i
];
1373 case GL_LUMINANCE_ALPHA
:
1375 dst
[i
*2+0] = luminance
[i
];
1376 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1381 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1382 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1387 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1388 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1389 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1394 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1395 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1396 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1397 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1402 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1403 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1404 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1409 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1410 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1411 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1412 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1417 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1418 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1419 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1420 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1426 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1427 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1431 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1435 case GL_HALF_FLOAT_ARB
:
1437 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1438 switch (dstFormat
) {
1441 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1445 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1449 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1453 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1457 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1459 case GL_LUMINANCE_ALPHA
:
1461 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1462 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1467 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1468 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1473 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1474 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1475 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1480 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1481 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1482 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1483 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1488 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1489 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1490 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1495 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1496 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1497 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1498 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1503 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1504 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1505 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1506 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1512 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1513 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1517 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1521 case GL_UNSIGNED_BYTE_3_3_2
:
1522 if (dstFormat
== GL_RGB
) {
1523 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1525 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1526 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1527 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1531 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1532 if (dstFormat
== GL_RGB
) {
1533 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1535 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1536 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1537 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1541 case GL_UNSIGNED_SHORT_5_6_5
:
1542 if (dstFormat
== GL_RGB
) {
1543 GLushort
*dst
= (GLushort
*) dstAddr
;
1545 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1546 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1547 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1551 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1552 if (dstFormat
== GL_RGB
) {
1553 GLushort
*dst
= (GLushort
*) dstAddr
;
1555 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1556 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1557 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1561 case GL_UNSIGNED_SHORT_4_4_4_4
:
1562 if (dstFormat
== GL_RGBA
) {
1563 GLushort
*dst
= (GLushort
*) dstAddr
;
1565 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1566 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1567 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1568 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1571 else if (dstFormat
== GL_BGRA
) {
1572 GLushort
*dst
= (GLushort
*) dstAddr
;
1574 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1575 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1576 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1577 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1580 else if (dstFormat
== GL_ABGR_EXT
) {
1581 GLushort
*dst
= (GLushort
*) dstAddr
;
1583 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1584 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1585 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1586 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1590 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1591 if (dstFormat
== GL_RGBA
) {
1592 GLushort
*dst
= (GLushort
*) dstAddr
;
1594 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1595 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1596 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1597 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1600 else if (dstFormat
== GL_BGRA
) {
1601 GLushort
*dst
= (GLushort
*) dstAddr
;
1603 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1604 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1605 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1606 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1609 else if (dstFormat
== GL_ABGR_EXT
) {
1610 GLushort
*dst
= (GLushort
*) dstAddr
;
1612 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1613 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1614 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1615 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1619 case GL_UNSIGNED_SHORT_5_5_5_1
:
1620 if (dstFormat
== GL_RGBA
) {
1621 GLushort
*dst
= (GLushort
*) dstAddr
;
1623 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1624 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1625 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1626 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1629 else if (dstFormat
== GL_BGRA
) {
1630 GLushort
*dst
= (GLushort
*) dstAddr
;
1632 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1633 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1634 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1635 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1638 else if (dstFormat
== GL_ABGR_EXT
) {
1639 GLushort
*dst
= (GLushort
*) dstAddr
;
1641 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1642 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1643 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1644 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1648 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1649 if (dstFormat
== GL_RGBA
) {
1650 GLushort
*dst
= (GLushort
*) dstAddr
;
1652 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1653 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1654 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1655 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1658 else if (dstFormat
== GL_BGRA
) {
1659 GLushort
*dst
= (GLushort
*) dstAddr
;
1661 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1662 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1663 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1664 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1667 else if (dstFormat
== GL_ABGR_EXT
) {
1668 GLushort
*dst
= (GLushort
*) dstAddr
;
1670 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1671 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1672 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1673 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1677 case GL_UNSIGNED_INT_8_8_8_8
:
1678 if (dstFormat
== GL_RGBA
) {
1679 GLuint
*dst
= (GLuint
*) dstAddr
;
1681 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1682 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1683 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1684 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1687 else if (dstFormat
== GL_BGRA
) {
1688 GLuint
*dst
= (GLuint
*) dstAddr
;
1690 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1691 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1692 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1693 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1696 else if (dstFormat
== GL_ABGR_EXT
) {
1697 GLuint
*dst
= (GLuint
*) dstAddr
;
1699 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1700 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1701 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1702 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1706 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1707 if (dstFormat
== GL_RGBA
) {
1708 GLuint
*dst
= (GLuint
*) dstAddr
;
1710 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1711 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1712 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1713 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1716 else if (dstFormat
== GL_BGRA
) {
1717 GLuint
*dst
= (GLuint
*) dstAddr
;
1719 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1720 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1721 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1722 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1725 else if (dstFormat
== GL_ABGR_EXT
) {
1726 GLuint
*dst
= (GLuint
*) dstAddr
;
1728 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1729 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1730 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1731 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1735 case GL_UNSIGNED_INT_10_10_10_2
:
1736 if (dstFormat
== GL_RGBA
) {
1737 GLuint
*dst
= (GLuint
*) dstAddr
;
1739 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1740 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1741 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1742 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1745 else if (dstFormat
== GL_BGRA
) {
1746 GLuint
*dst
= (GLuint
*) dstAddr
;
1748 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1749 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1750 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1751 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1754 else if (dstFormat
== GL_ABGR_EXT
) {
1755 GLuint
*dst
= (GLuint
*) dstAddr
;
1757 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1758 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1759 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1760 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1764 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1765 if (dstFormat
== GL_RGBA
) {
1766 GLuint
*dst
= (GLuint
*) dstAddr
;
1768 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1769 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1770 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1771 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1774 else if (dstFormat
== GL_BGRA
) {
1775 GLuint
*dst
= (GLuint
*) dstAddr
;
1777 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1778 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1779 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1780 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1783 else if (dstFormat
== GL_ABGR_EXT
) {
1784 GLuint
*dst
= (GLuint
*) dstAddr
;
1786 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1787 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1788 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1789 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1794 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1798 if (dstPacking
->SwapBytes
) {
1799 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1800 if (swapSize
== 2) {
1801 if (dstPacking
->SwapBytes
) {
1802 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1805 else if (swapSize
== 4) {
1806 if (dstPacking
->SwapBytes
) {
1807 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1815 #define SWAP2BYTE(VALUE) \
1817 GLubyte *bytes = (GLubyte *) &(VALUE); \
1818 GLubyte tmp = bytes[0]; \
1819 bytes[0] = bytes[1]; \
1823 #define SWAP4BYTE(VALUE) \
1825 GLubyte *bytes = (GLubyte *) &(VALUE); \
1826 GLubyte tmp = bytes[0]; \
1827 bytes[0] = bytes[3]; \
1830 bytes[1] = bytes[2]; \
1836 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1837 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1838 const struct gl_pixelstore_attrib
*unpack
)
1840 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1842 ASSERT(srcType
== GL_BITMAP
||
1843 srcType
== GL_UNSIGNED_BYTE
||
1844 srcType
== GL_BYTE
||
1845 srcType
== GL_UNSIGNED_SHORT
||
1846 srcType
== GL_SHORT
||
1847 srcType
== GL_UNSIGNED_INT
||
1848 srcType
== GL_INT
||
1849 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1850 srcType
== GL_HALF_FLOAT_ARB
||
1851 srcType
== GL_FLOAT
);
1856 GLubyte
*ubsrc
= (GLubyte
*) src
;
1857 if (unpack
->LsbFirst
) {
1858 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1860 for (i
= 0; i
< n
; i
++) {
1861 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1872 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1874 for (i
= 0; i
< n
; i
++) {
1875 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1887 case GL_UNSIGNED_BYTE
:
1890 const GLubyte
*s
= (const GLubyte
*) src
;
1891 for (i
= 0; i
< n
; i
++)
1898 const GLbyte
*s
= (const GLbyte
*) src
;
1899 for (i
= 0; i
< n
; i
++)
1903 case GL_UNSIGNED_SHORT
:
1906 const GLushort
*s
= (const GLushort
*) src
;
1907 if (unpack
->SwapBytes
) {
1908 for (i
= 0; i
< n
; i
++) {
1909 GLushort value
= s
[i
];
1915 for (i
= 0; i
< n
; i
++)
1923 const GLshort
*s
= (const GLshort
*) src
;
1924 if (unpack
->SwapBytes
) {
1925 for (i
= 0; i
< n
; i
++) {
1926 GLshort value
= s
[i
];
1932 for (i
= 0; i
< n
; i
++)
1937 case GL_UNSIGNED_INT
:
1940 const GLuint
*s
= (const GLuint
*) src
;
1941 if (unpack
->SwapBytes
) {
1942 for (i
= 0; i
< n
; i
++) {
1943 GLuint value
= s
[i
];
1949 for (i
= 0; i
< n
; i
++)
1957 const GLint
*s
= (const GLint
*) src
;
1958 if (unpack
->SwapBytes
) {
1959 for (i
= 0; i
< n
; i
++) {
1966 for (i
= 0; i
< n
; i
++)
1974 const GLfloat
*s
= (const GLfloat
*) src
;
1975 if (unpack
->SwapBytes
) {
1976 for (i
= 0; i
< n
; i
++) {
1977 GLfloat value
= s
[i
];
1979 indexes
[i
] = (GLuint
) value
;
1983 for (i
= 0; i
< n
; i
++)
1984 indexes
[i
] = (GLuint
) s
[i
];
1988 case GL_HALF_FLOAT_ARB
:
1991 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
1992 if (unpack
->SwapBytes
) {
1993 for (i
= 0; i
< n
; i
++) {
1994 GLhalfARB value
= s
[i
];
1996 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2000 for (i
= 0; i
< n
; i
++)
2001 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2005 case GL_UNSIGNED_INT_24_8_EXT
:
2008 const GLuint
*s
= (const GLuint
*) src
;
2009 if (unpack
->SwapBytes
) {
2010 for (i
= 0; i
< n
; i
++) {
2011 GLuint value
= s
[i
];
2013 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2017 for (i
= 0; i
< n
; i
++)
2018 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2024 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2031 * This function extracts floating point RGBA values from arbitrary
2032 * image data. srcFormat and srcType are the format and type parameters
2033 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2035 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2036 * implements the "Conversion to floating point", "Conversion to RGB",
2037 * and "Final Expansion to RGBA" operations.
2039 * Args: n - number of pixels
2040 * rgba - output colors
2041 * srcFormat - format of incoming data
2042 * srcType - data type of incoming data
2043 * src - source data pointer
2044 * swapBytes - perform byteswapping of incoming data?
2047 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2048 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2049 GLboolean swapBytes
)
2051 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
2053 GLint rComp
, bComp
, gComp
, aComp
;
2054 GLboolean intFormat
;
2055 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2057 ASSERT(srcFormat
== GL_RED
||
2058 srcFormat
== GL_GREEN
||
2059 srcFormat
== GL_BLUE
||
2060 srcFormat
== GL_ALPHA
||
2061 srcFormat
== GL_LUMINANCE
||
2062 srcFormat
== GL_LUMINANCE_ALPHA
||
2063 srcFormat
== GL_INTENSITY
||
2064 srcFormat
== GL_RG
||
2065 srcFormat
== GL_RGB
||
2066 srcFormat
== GL_BGR
||
2067 srcFormat
== GL_RGBA
||
2068 srcFormat
== GL_BGRA
||
2069 srcFormat
== GL_ABGR_EXT
||
2070 srcFormat
== GL_DU8DV8_ATI
||
2071 srcFormat
== GL_DUDV_ATI
||
2072 srcFormat
== GL_RED_INTEGER_EXT
||
2073 srcFormat
== GL_GREEN_INTEGER_EXT
||
2074 srcFormat
== GL_BLUE_INTEGER_EXT
||
2075 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2076 srcFormat
== GL_RGB_INTEGER_EXT
||
2077 srcFormat
== GL_RGBA_INTEGER_EXT
||
2078 srcFormat
== GL_BGR_INTEGER_EXT
||
2079 srcFormat
== GL_BGRA_INTEGER_EXT
||
2080 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2081 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2083 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2084 srcType
== GL_BYTE
||
2085 srcType
== GL_UNSIGNED_SHORT
||
2086 srcType
== GL_SHORT
||
2087 srcType
== GL_UNSIGNED_INT
||
2088 srcType
== GL_INT
||
2089 srcType
== GL_HALF_FLOAT_ARB
||
2090 srcType
== GL_FLOAT
||
2091 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2092 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2093 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2094 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2095 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2096 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2097 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2098 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2099 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2100 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2101 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2102 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2104 rComp
= gComp
= bComp
= aComp
= -1;
2106 switch (srcFormat
) {
2108 case GL_RED_INTEGER_EXT
:
2110 greenIndex
= blueIndex
= alphaIndex
= -1;
2114 case GL_GREEN_INTEGER_EXT
:
2116 redIndex
= blueIndex
= alphaIndex
= -1;
2120 case GL_BLUE_INTEGER_EXT
:
2122 redIndex
= greenIndex
= alphaIndex
= -1;
2126 case GL_ALPHA_INTEGER_EXT
:
2127 redIndex
= greenIndex
= blueIndex
= -1;
2132 case GL_LUMINANCE_INTEGER_EXT
:
2133 redIndex
= greenIndex
= blueIndex
= 0;
2137 case GL_LUMINANCE_ALPHA
:
2138 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2139 redIndex
= greenIndex
= blueIndex
= 0;
2144 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
2160 case GL_RGB_INTEGER
:
2183 case GL_RGBA_INTEGER
:
2225 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
2226 _mesa_lookup_enum_by_nr(srcFormat
));
2230 intFormat
= _mesa_is_integer_format(srcFormat
);
2232 #define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
2233 if ((INDEX) < 0) { \
2236 for (i = 0; i < n; i++) { \
2237 rgba[i][CHANNEL] = DEFAULT_INT; \
2241 for (i = 0; i < n; i++) { \
2242 rgba[i][CHANNEL] = DEFAULT; \
2246 else if (swapBytes) { \
2247 const TYPE *s = (const TYPE *) src; \
2249 for (i = 0; i < n; i++) { \
2250 TYPE value = s[INDEX]; \
2251 if (sizeof(TYPE) == 2) { \
2254 else if (sizeof(TYPE) == 4) { \
2258 rgba[i][CHANNEL] = (GLfloat) value; \
2260 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2265 const TYPE *s = (const TYPE *) src; \
2268 for (i = 0; i < n; i++) { \
2269 rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
2274 for (i = 0; i < n; i++) { \
2275 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2282 case GL_UNSIGNED_BYTE
:
2283 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2284 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2285 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2286 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2289 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2290 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2291 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2292 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2294 case GL_UNSIGNED_SHORT
:
2295 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2296 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2297 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2298 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2301 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2302 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2303 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2304 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2306 case GL_UNSIGNED_INT
:
2307 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2308 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2309 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2310 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2313 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2314 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2315 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2316 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2319 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2320 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2321 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2322 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2324 case GL_HALF_FLOAT_ARB
:
2325 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2326 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2327 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2328 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2330 case GL_UNSIGNED_BYTE_3_3_2
:
2332 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2339 for (i
= 0; i
< n
; i
++) {
2340 GLubyte p
= ubsrc
[i
];
2341 rgba
[i
][rComp
] = ((p
>> 5) ) * rs
;
2342 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * gs
;
2343 rgba
[i
][bComp
] = ((p
) & 0x3) * bs
;
2344 rgba
[i
][aComp
] = 1.0F
;
2348 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2350 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2357 for (i
= 0; i
< n
; i
++) {
2358 GLubyte p
= ubsrc
[i
];
2359 rgba
[i
][rComp
] = ((p
) & 0x7) * rs
;
2360 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * gs
;
2361 rgba
[i
][bComp
] = ((p
>> 6) ) * bs
;
2362 rgba
[i
][aComp
] = 1.0F
;
2366 case GL_UNSIGNED_SHORT_5_6_5
:
2373 const GLushort
*ussrc
= (const GLushort
*) src
;
2375 for (i
= 0; i
< n
; i
++) {
2376 GLushort p
= ussrc
[i
];
2378 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2379 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2380 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
2381 rgba
[i
][aComp
] = 1.0F
;
2385 const GLushort
*ussrc
= (const GLushort
*) src
;
2387 for (i
= 0; i
< n
; i
++) {
2388 GLushort p
= ussrc
[i
];
2389 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2390 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2391 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
2392 rgba
[i
][aComp
] = 1.0F
;
2396 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2403 const GLushort
*ussrc
= (const GLushort
*) src
;
2405 for (i
= 0; i
< n
; i
++) {
2406 GLushort p
= ussrc
[i
];
2408 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2409 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2410 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
2411 rgba
[i
][aComp
] = 1.0F
;
2415 const GLushort
*ussrc
= (const GLushort
*) src
;
2417 for (i
= 0; i
< n
; i
++) {
2418 GLushort p
= ussrc
[i
];
2419 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2420 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
2421 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
2422 rgba
[i
][aComp
] = 1.0F
;
2426 case GL_UNSIGNED_SHORT_4_4_4_4
:
2428 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2431 const GLushort
*ussrc
= (const GLushort
*) src
;
2433 for (i
= 0; i
< n
; i
++) {
2434 GLushort p
= ussrc
[i
];
2436 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
2437 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
2438 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
2439 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
2443 const GLushort
*ussrc
= (const GLushort
*) src
;
2445 for (i
= 0; i
< n
; i
++) {
2446 GLushort p
= ussrc
[i
];
2447 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
2448 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
2449 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
2450 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
2454 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2456 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2459 const GLushort
*ussrc
= (const GLushort
*) src
;
2461 for (i
= 0; i
< n
; i
++) {
2462 GLushort p
= ussrc
[i
];
2464 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
2465 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
2466 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
2467 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
2471 const GLushort
*ussrc
= (const GLushort
*) src
;
2473 for (i
= 0; i
< n
; i
++) {
2474 GLushort p
= ussrc
[i
];
2475 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
2476 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
2477 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
2478 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
2482 case GL_UNSIGNED_SHORT_5_5_5_1
:
2484 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2487 const GLushort
*ussrc
= (const GLushort
*) src
;
2489 for (i
= 0; i
< n
; i
++) {
2490 GLushort p
= ussrc
[i
];
2492 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2493 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
2494 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
2495 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
2499 const GLushort
*ussrc
= (const GLushort
*) src
;
2501 for (i
= 0; i
< n
; i
++) {
2502 GLushort p
= ussrc
[i
];
2503 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
2504 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
2505 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
2506 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
2510 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2512 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2515 const GLushort
*ussrc
= (const GLushort
*) src
;
2517 for (i
= 0; i
< n
; i
++) {
2518 GLushort p
= ussrc
[i
];
2520 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2521 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
2522 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
2523 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
2527 const GLushort
*ussrc
= (const GLushort
*) src
;
2529 for (i
= 0; i
< n
; i
++) {
2530 GLushort p
= ussrc
[i
];
2531 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
2532 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
2533 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
2534 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
2538 case GL_UNSIGNED_INT_8_8_8_8
:
2540 const GLuint
*uisrc
= (const GLuint
*) src
;
2543 for (i
= 0; i
< n
; i
++) {
2544 GLuint p
= uisrc
[i
];
2545 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
2546 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2547 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2548 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
2552 for (i
= 0; i
< n
; i
++) {
2553 GLuint p
= uisrc
[i
];
2554 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2555 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2556 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2557 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2562 const GLuint
*uisrc
= (const GLuint
*) src
;
2565 for (i
= 0; i
< n
; i
++) {
2566 GLuint p
= uisrc
[i
];
2567 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
2568 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2569 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2570 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
2574 for (i
= 0; i
< n
; i
++) {
2575 GLuint p
= uisrc
[i
];
2576 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2577 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2578 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2579 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2584 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2586 const GLuint
*uisrc
= (const GLuint
*) src
;
2589 for (i
= 0; i
< n
; i
++) {
2590 GLuint p
= uisrc
[i
];
2591 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
2592 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2593 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2594 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
2598 for (i
= 0; i
< n
; i
++) {
2599 GLuint p
= uisrc
[i
];
2600 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2601 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2602 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2603 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2608 const GLuint
*uisrc
= (const GLuint
*) src
;
2611 for (i
= 0; i
< n
; i
++) {
2612 GLuint p
= uisrc
[i
];
2613 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
2614 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
2615 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
2616 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
2620 for (i
= 0; i
< n
; i
++) {
2621 GLuint p
= uisrc
[i
];
2622 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2623 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2624 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2625 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2630 case GL_UNSIGNED_INT_10_10_10_2
:
2632 rs
= 1.0F
/ 1023.0F
;
2633 gs
= 1.0F
/ 1023.0F
;
2634 bs
= 1.0F
/ 1023.0F
;
2638 const GLuint
*uisrc
= (const GLuint
*) src
;
2640 for (i
= 0; i
< n
; i
++) {
2641 GLuint p
= uisrc
[i
];
2643 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
2644 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
2645 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
2646 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
2650 const GLuint
*uisrc
= (const GLuint
*) src
;
2652 for (i
= 0; i
< n
; i
++) {
2653 GLuint p
= uisrc
[i
];
2654 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
2655 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
2656 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
2657 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
2661 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2663 rs
= 1.0F
/ 1023.0F
;
2664 gs
= 1.0F
/ 1023.0F
;
2665 bs
= 1.0F
/ 1023.0F
;
2669 const GLuint
*uisrc
= (const GLuint
*) src
;
2671 for (i
= 0; i
< n
; i
++) {
2672 GLuint p
= uisrc
[i
];
2674 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
2675 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
2676 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
2677 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
2681 const GLuint
*uisrc
= (const GLuint
*) src
;
2683 for (i
= 0; i
< n
; i
++) {
2684 GLuint p
= uisrc
[i
];
2685 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
2686 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
2687 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
2688 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
2693 _mesa_problem(NULL
, "bad srcType in extract float data");
2700 * Unpack a row of color image data from a client buffer according to
2701 * the pixel unpacking parameters.
2702 * Return GLchan values in the specified dest image format.
2703 * This is used by glDrawPixels and glTexImage?D().
2704 * \param ctx - the context
2705 * n - number of pixels in the span
2706 * dstFormat - format of destination color array
2707 * dest - the destination color array
2708 * srcFormat - source image format
2709 * srcType - source image data type
2710 * source - source image pointer
2711 * srcPacking - pixel unpacking parameters
2712 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2714 * XXX perhaps expand this to process whole images someday.
2717 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
2718 GLuint n
, GLenum dstFormat
, GLchan dest
[],
2719 GLenum srcFormat
, GLenum srcType
,
2720 const GLvoid
*source
,
2721 const struct gl_pixelstore_attrib
*srcPacking
,
2722 GLbitfield transferOps
)
2724 ASSERT(dstFormat
== GL_ALPHA
||
2725 dstFormat
== GL_LUMINANCE
||
2726 dstFormat
== GL_LUMINANCE_ALPHA
||
2727 dstFormat
== GL_INTENSITY
||
2728 dstFormat
== GL_RED
||
2729 dstFormat
== GL_RG
||
2730 dstFormat
== GL_RGB
||
2731 dstFormat
== GL_RGBA
||
2732 dstFormat
== GL_COLOR_INDEX
);
2734 ASSERT(srcFormat
== GL_RED
||
2735 srcFormat
== GL_GREEN
||
2736 srcFormat
== GL_BLUE
||
2737 srcFormat
== GL_ALPHA
||
2738 srcFormat
== GL_LUMINANCE
||
2739 srcFormat
== GL_LUMINANCE_ALPHA
||
2740 srcFormat
== GL_INTENSITY
||
2741 srcFormat
== GL_RG
||
2742 srcFormat
== GL_RGB
||
2743 srcFormat
== GL_BGR
||
2744 srcFormat
== GL_RGBA
||
2745 srcFormat
== GL_BGRA
||
2746 srcFormat
== GL_ABGR_EXT
||
2747 srcFormat
== GL_COLOR_INDEX
);
2749 ASSERT(srcType
== GL_BITMAP
||
2750 srcType
== GL_UNSIGNED_BYTE
||
2751 srcType
== GL_BYTE
||
2752 srcType
== GL_UNSIGNED_SHORT
||
2753 srcType
== GL_SHORT
||
2754 srcType
== GL_UNSIGNED_INT
||
2755 srcType
== GL_INT
||
2756 srcType
== GL_HALF_FLOAT_ARB
||
2757 srcType
== GL_FLOAT
||
2758 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2759 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2760 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2761 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2762 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2763 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2764 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2765 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2766 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2767 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2768 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2769 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2771 /* Try simple cases first */
2772 if (transferOps
== 0) {
2773 if (srcType
== CHAN_TYPE
) {
2774 if (dstFormat
== GL_RGBA
) {
2775 if (srcFormat
== GL_RGBA
) {
2776 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
2779 else if (srcFormat
== GL_RGB
) {
2781 const GLchan
*src
= (const GLchan
*) source
;
2783 for (i
= 0; i
< n
; i
++) {
2794 else if (dstFormat
== GL_RGB
) {
2795 if (srcFormat
== GL_RGB
) {
2796 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
2799 else if (srcFormat
== GL_RGBA
) {
2801 const GLchan
*src
= (const GLchan
*) source
;
2803 for (i
= 0; i
< n
; i
++) {
2813 else if (dstFormat
== srcFormat
) {
2814 GLint comps
= _mesa_components_in_format(srcFormat
);
2816 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
2821 * Common situation, loading 8bit RGBA/RGB source images
2822 * into 16/32 bit destination. (OSMesa16/32)
2824 else if (srcType
== GL_UNSIGNED_BYTE
) {
2825 if (dstFormat
== GL_RGBA
) {
2826 if (srcFormat
== GL_RGB
) {
2828 const GLubyte
*src
= (const GLubyte
*) source
;
2830 for (i
= 0; i
< n
; i
++) {
2831 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2832 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2833 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2840 else if (srcFormat
== GL_RGBA
) {
2842 const GLubyte
*src
= (const GLubyte
*) source
;
2844 for (i
= 0; i
< n
; i
++) {
2845 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2846 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2847 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2848 dst
[3] = UBYTE_TO_CHAN(src
[3]);
2855 else if (dstFormat
== GL_RGB
) {
2856 if (srcFormat
== GL_RGB
) {
2858 const GLubyte
*src
= (const GLubyte
*) source
;
2860 for (i
= 0; i
< n
; i
++) {
2861 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2862 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2863 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2869 else if (srcFormat
== GL_RGBA
) {
2871 const GLubyte
*src
= (const GLubyte
*) source
;
2873 for (i
= 0; i
< n
; i
++) {
2874 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2875 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2876 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2887 /* general solution begins here */
2889 GLint dstComponents
;
2890 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2891 GLint dstLuminanceIndex
, dstIntensityIndex
;
2892 GLfloat rgba
[MAX_WIDTH
][4];
2894 dstComponents
= _mesa_components_in_format( dstFormat
);
2895 /* source & dest image formats should have been error checked by now */
2896 assert(dstComponents
> 0);
2899 * Extract image data and convert to RGBA floats
2901 assert(n
<= MAX_WIDTH
);
2902 if (srcFormat
== GL_COLOR_INDEX
) {
2903 GLuint indexes
[MAX_WIDTH
];
2904 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2907 if (dstFormat
== GL_COLOR_INDEX
) {
2909 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
2910 /* convert to GLchan and return */
2911 for (i
= 0; i
< n
; i
++) {
2912 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2917 /* Convert indexes to RGBA */
2918 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2919 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2921 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2924 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
2925 * with color indexes.
2927 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
2930 /* non-color index data */
2931 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2932 srcPacking
->SwapBytes
);
2935 /* Need to clamp if returning GLubytes or GLushorts */
2936 #if CHAN_TYPE != GL_FLOAT
2937 transferOps
|= IMAGE_CLAMP_BIT
;
2941 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
2944 /* Now determine which color channels we need to produce.
2945 * And determine the dest index (offset) within each color tuple.
2947 switch (dstFormat
) {
2950 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2951 dstLuminanceIndex
= dstIntensityIndex
= -1;
2954 dstLuminanceIndex
= 0;
2955 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2956 dstIntensityIndex
= -1;
2958 case GL_LUMINANCE_ALPHA
:
2959 dstLuminanceIndex
= 0;
2961 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2962 dstIntensityIndex
= -1;
2965 dstIntensityIndex
= 0;
2966 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2967 dstLuminanceIndex
= -1;
2971 dstGreenIndex
= dstBlueIndex
= -1;
2972 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2978 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2984 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2991 dstLuminanceIndex
= dstIntensityIndex
= -1;
2994 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
2999 /* Now return the GLchan data in the requested dstFormat */
3001 if (dstRedIndex
>= 0) {
3004 for (i
= 0; i
< n
; i
++) {
3005 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
3006 dst
+= dstComponents
;
3010 if (dstGreenIndex
>= 0) {
3013 for (i
= 0; i
< n
; i
++) {
3014 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
3015 dst
+= dstComponents
;
3019 if (dstBlueIndex
>= 0) {
3022 for (i
= 0; i
< n
; i
++) {
3023 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
3024 dst
+= dstComponents
;
3028 if (dstAlphaIndex
>= 0) {
3031 for (i
= 0; i
< n
; i
++) {
3032 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
3033 dst
+= dstComponents
;
3037 if (dstIntensityIndex
>= 0) {
3040 assert(dstIntensityIndex
== 0);
3041 assert(dstComponents
== 1);
3042 for (i
= 0; i
< n
; i
++) {
3043 /* Intensity comes from red channel */
3044 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3048 if (dstLuminanceIndex
>= 0) {
3051 assert(dstLuminanceIndex
== 0);
3052 for (i
= 0; i
< n
; i
++) {
3053 /* Luminance comes from red channel */
3054 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3055 dst
+= dstComponents
;
3063 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3064 * instead of GLchan.
3067 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3068 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3069 GLenum srcFormat
, GLenum srcType
,
3070 const GLvoid
*source
,
3071 const struct gl_pixelstore_attrib
*srcPacking
,
3072 GLbitfield transferOps
)
3074 ASSERT(dstFormat
== GL_ALPHA
||
3075 dstFormat
== GL_LUMINANCE
||
3076 dstFormat
== GL_LUMINANCE_ALPHA
||
3077 dstFormat
== GL_INTENSITY
||
3078 dstFormat
== GL_RED
||
3079 dstFormat
== GL_RG
||
3080 dstFormat
== GL_RGB
||
3081 dstFormat
== GL_RGBA
||
3082 dstFormat
== GL_COLOR_INDEX
);
3084 ASSERT(srcFormat
== GL_RED
||
3085 srcFormat
== GL_GREEN
||
3086 srcFormat
== GL_BLUE
||
3087 srcFormat
== GL_ALPHA
||
3088 srcFormat
== GL_LUMINANCE
||
3089 srcFormat
== GL_LUMINANCE_ALPHA
||
3090 srcFormat
== GL_INTENSITY
||
3091 srcFormat
== GL_RG
||
3092 srcFormat
== GL_RGB
||
3093 srcFormat
== GL_BGR
||
3094 srcFormat
== GL_RGBA
||
3095 srcFormat
== GL_BGRA
||
3096 srcFormat
== GL_ABGR_EXT
||
3097 srcFormat
== GL_RED_INTEGER_EXT
||
3098 srcFormat
== GL_GREEN_INTEGER_EXT
||
3099 srcFormat
== GL_BLUE_INTEGER_EXT
||
3100 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3101 srcFormat
== GL_RGB_INTEGER_EXT
||
3102 srcFormat
== GL_RGBA_INTEGER_EXT
||
3103 srcFormat
== GL_BGR_INTEGER_EXT
||
3104 srcFormat
== GL_BGRA_INTEGER_EXT
||
3105 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3106 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3107 srcFormat
== GL_COLOR_INDEX
);
3109 ASSERT(srcType
== GL_BITMAP
||
3110 srcType
== GL_UNSIGNED_BYTE
||
3111 srcType
== GL_BYTE
||
3112 srcType
== GL_UNSIGNED_SHORT
||
3113 srcType
== GL_SHORT
||
3114 srcType
== GL_UNSIGNED_INT
||
3115 srcType
== GL_INT
||
3116 srcType
== GL_HALF_FLOAT_ARB
||
3117 srcType
== GL_FLOAT
||
3118 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3119 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3120 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3121 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3122 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3123 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3124 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3125 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3126 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3127 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3128 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3129 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3131 /* general solution, no special cases, yet */
3133 GLint dstComponents
;
3134 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3135 GLint dstLuminanceIndex
, dstIntensityIndex
;
3136 GLfloat rgba
[MAX_WIDTH
][4];
3138 dstComponents
= _mesa_components_in_format( dstFormat
);
3139 /* source & dest image formats should have been error checked by now */
3140 assert(dstComponents
> 0);
3143 * Extract image data and convert to RGBA floats
3145 assert(n
<= MAX_WIDTH
);
3146 if (srcFormat
== GL_COLOR_INDEX
) {
3147 GLuint indexes
[MAX_WIDTH
];
3148 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3151 if (dstFormat
== GL_COLOR_INDEX
) {
3153 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3154 /* convert to GLchan and return */
3155 for (i
= 0; i
< n
; i
++) {
3156 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3161 /* Convert indexes to RGBA */
3162 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3163 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3165 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3168 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3169 * with color indexes.
3171 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3174 /* non-color index data */
3175 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3176 srcPacking
->SwapBytes
);
3180 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3183 /* Now determine which color channels we need to produce.
3184 * And determine the dest index (offset) within each color tuple.
3186 switch (dstFormat
) {
3189 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3190 dstLuminanceIndex
= dstIntensityIndex
= -1;
3193 dstLuminanceIndex
= 0;
3194 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3195 dstIntensityIndex
= -1;
3197 case GL_LUMINANCE_ALPHA
:
3198 dstLuminanceIndex
= 0;
3200 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3201 dstIntensityIndex
= -1;
3204 dstIntensityIndex
= 0;
3205 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3206 dstLuminanceIndex
= -1;
3210 dstGreenIndex
= dstBlueIndex
= -1;
3211 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3217 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3223 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3230 dstLuminanceIndex
= dstIntensityIndex
= -1;
3233 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
3237 /* Now pack results in the requested dstFormat */
3238 if (dstRedIndex
>= 0) {
3239 GLfloat
*dst
= dest
;
3241 for (i
= 0; i
< n
; i
++) {
3242 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
3243 dst
+= dstComponents
;
3247 if (dstGreenIndex
>= 0) {
3248 GLfloat
*dst
= dest
;
3250 for (i
= 0; i
< n
; i
++) {
3251 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
3252 dst
+= dstComponents
;
3256 if (dstBlueIndex
>= 0) {
3257 GLfloat
*dst
= dest
;
3259 for (i
= 0; i
< n
; i
++) {
3260 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
3261 dst
+= dstComponents
;
3265 if (dstAlphaIndex
>= 0) {
3266 GLfloat
*dst
= dest
;
3268 for (i
= 0; i
< n
; i
++) {
3269 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
3270 dst
+= dstComponents
;
3274 if (dstIntensityIndex
>= 0) {
3275 GLfloat
*dst
= dest
;
3277 assert(dstIntensityIndex
== 0);
3278 assert(dstComponents
== 1);
3279 for (i
= 0; i
< n
; i
++) {
3280 /* Intensity comes from red channel */
3281 dst
[i
] = rgba
[i
][RCOMP
];
3285 if (dstLuminanceIndex
>= 0) {
3286 GLfloat
*dst
= dest
;
3288 assert(dstLuminanceIndex
== 0);
3289 for (i
= 0; i
< n
; i
++) {
3290 /* Luminance comes from red channel */
3291 dst
[0] = rgba
[i
][RCOMP
];
3292 dst
+= dstComponents
;
3299 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3300 * directly return GLbyte data, no transfer ops apply.
3303 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3304 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3305 GLenum srcFormat
, GLenum srcType
,
3306 const GLvoid
*source
,
3307 const struct gl_pixelstore_attrib
*srcPacking
,
3308 GLbitfield transferOps
)
3310 ASSERT(dstFormat
== GL_DUDV_ATI
);
3311 ASSERT(srcFormat
== GL_DUDV_ATI
);
3313 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3314 srcType
== GL_BYTE
||
3315 srcType
== GL_UNSIGNED_SHORT
||
3316 srcType
== GL_SHORT
||
3317 srcType
== GL_UNSIGNED_INT
||
3318 srcType
== GL_INT
||
3319 srcType
== GL_HALF_FLOAT_ARB
||
3320 srcType
== GL_FLOAT
);
3322 /* general solution */
3324 GLint dstComponents
;
3325 GLfloat rgba
[MAX_WIDTH
][4];
3329 dstComponents
= _mesa_components_in_format( dstFormat
);
3330 /* source & dest image formats should have been error checked by now */
3331 assert(dstComponents
> 0);
3334 * Extract image data and convert to RGBA floats
3336 assert(n
<= MAX_WIDTH
);
3337 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3338 srcPacking
->SwapBytes
);
3341 /* Now determine which color channels we need to produce.
3342 * And determine the dest index (offset) within each color tuple.
3345 /* Now pack results in the requested dstFormat */
3346 for (i
= 0; i
< n
; i
++) {
3347 /* not sure - need clamp[-1,1] here? */
3348 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
3349 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
3350 dst
+= dstComponents
;
3356 * Unpack a row of color index data from a client buffer according to
3357 * the pixel unpacking parameters.
3358 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3360 * Args: ctx - the context
3361 * n - number of pixels
3362 * dstType - destination data type
3363 * dest - destination array
3364 * srcType - source pixel type
3365 * source - source data pointer
3366 * srcPacking - pixel unpacking parameters
3367 * transferOps - the pixel transfer operations to apply
3370 _mesa_unpack_index_span( const struct gl_context
*ctx
, GLuint n
,
3371 GLenum dstType
, GLvoid
*dest
,
3372 GLenum srcType
, const GLvoid
*source
,
3373 const struct gl_pixelstore_attrib
*srcPacking
,
3374 GLbitfield transferOps
)
3376 ASSERT(srcType
== GL_BITMAP
||
3377 srcType
== GL_UNSIGNED_BYTE
||
3378 srcType
== GL_BYTE
||
3379 srcType
== GL_UNSIGNED_SHORT
||
3380 srcType
== GL_SHORT
||
3381 srcType
== GL_UNSIGNED_INT
||
3382 srcType
== GL_INT
||
3383 srcType
== GL_HALF_FLOAT_ARB
||
3384 srcType
== GL_FLOAT
);
3386 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3387 dstType
== GL_UNSIGNED_SHORT
||
3388 dstType
== GL_UNSIGNED_INT
);
3391 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3394 * Try simple cases first
3396 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3397 && dstType
== GL_UNSIGNED_BYTE
) {
3398 memcpy(dest
, source
, n
* sizeof(GLubyte
));
3400 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3401 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3402 memcpy(dest
, source
, n
* sizeof(GLuint
));
3408 GLuint indexes
[MAX_WIDTH
];
3409 assert(n
<= MAX_WIDTH
);
3411 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3415 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3417 /* convert to dest type */
3419 case GL_UNSIGNED_BYTE
:
3421 GLubyte
*dst
= (GLubyte
*) dest
;
3423 for (i
= 0; i
< n
; i
++) {
3424 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3428 case GL_UNSIGNED_SHORT
:
3430 GLuint
*dst
= (GLuint
*) dest
;
3432 for (i
= 0; i
< n
; i
++) {
3433 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3437 case GL_UNSIGNED_INT
:
3438 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
3441 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3448 _mesa_pack_index_span( const struct gl_context
*ctx
, GLuint n
,
3449 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
3450 const struct gl_pixelstore_attrib
*dstPacking
,
3451 GLbitfield transferOps
)
3453 GLuint indexes
[MAX_WIDTH
];
3455 ASSERT(n
<= MAX_WIDTH
);
3457 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3459 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
3460 /* make a copy of input */
3461 memcpy(indexes
, source
, n
* sizeof(GLuint
));
3462 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3467 case GL_UNSIGNED_BYTE
:
3469 GLubyte
*dst
= (GLubyte
*) dest
;
3471 for (i
= 0; i
< n
; i
++) {
3472 *dst
++ = (GLubyte
) source
[i
];
3478 GLbyte
*dst
= (GLbyte
*) dest
;
3480 for (i
= 0; i
< n
; i
++) {
3481 dst
[i
] = (GLbyte
) source
[i
];
3485 case GL_UNSIGNED_SHORT
:
3487 GLushort
*dst
= (GLushort
*) dest
;
3489 for (i
= 0; i
< n
; i
++) {
3490 dst
[i
] = (GLushort
) source
[i
];
3492 if (dstPacking
->SwapBytes
) {
3493 _mesa_swap2( (GLushort
*) dst
, n
);
3499 GLshort
*dst
= (GLshort
*) dest
;
3501 for (i
= 0; i
< n
; i
++) {
3502 dst
[i
] = (GLshort
) source
[i
];
3504 if (dstPacking
->SwapBytes
) {
3505 _mesa_swap2( (GLushort
*) dst
, n
);
3509 case GL_UNSIGNED_INT
:
3511 GLuint
*dst
= (GLuint
*) dest
;
3513 for (i
= 0; i
< n
; i
++) {
3514 dst
[i
] = (GLuint
) source
[i
];
3516 if (dstPacking
->SwapBytes
) {
3517 _mesa_swap4( (GLuint
*) dst
, n
);
3523 GLint
*dst
= (GLint
*) dest
;
3525 for (i
= 0; i
< n
; i
++) {
3526 dst
[i
] = (GLint
) source
[i
];
3528 if (dstPacking
->SwapBytes
) {
3529 _mesa_swap4( (GLuint
*) dst
, n
);
3535 GLfloat
*dst
= (GLfloat
*) dest
;
3537 for (i
= 0; i
< n
; i
++) {
3538 dst
[i
] = (GLfloat
) source
[i
];
3540 if (dstPacking
->SwapBytes
) {
3541 _mesa_swap4( (GLuint
*) dst
, n
);
3545 case GL_HALF_FLOAT_ARB
:
3547 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
3549 for (i
= 0; i
< n
; i
++) {
3550 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
3552 if (dstPacking
->SwapBytes
) {
3553 _mesa_swap2( (GLushort
*) dst
, n
);
3558 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3564 * Unpack a row of stencil data from a client buffer according to
3565 * the pixel unpacking parameters.
3566 * This is (or will be) used by glDrawPixels
3568 * Args: ctx - the context
3569 * n - number of pixels
3570 * dstType - destination data type
3571 * dest - destination array
3572 * srcType - source pixel type
3573 * source - source data pointer
3574 * srcPacking - pixel unpacking parameters
3575 * transferOps - apply offset/bias/lookup ops?
3578 _mesa_unpack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
3579 GLenum dstType
, GLvoid
*dest
,
3580 GLenum srcType
, const GLvoid
*source
,
3581 const struct gl_pixelstore_attrib
*srcPacking
,
3582 GLbitfield transferOps
)
3584 ASSERT(srcType
== GL_BITMAP
||
3585 srcType
== GL_UNSIGNED_BYTE
||
3586 srcType
== GL_BYTE
||
3587 srcType
== GL_UNSIGNED_SHORT
||
3588 srcType
== GL_SHORT
||
3589 srcType
== GL_UNSIGNED_INT
||
3590 srcType
== GL_INT
||
3591 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3592 srcType
== GL_HALF_FLOAT_ARB
||
3593 srcType
== GL_FLOAT
);
3595 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3596 dstType
== GL_UNSIGNED_SHORT
||
3597 dstType
== GL_UNSIGNED_INT
);
3599 /* only shift and offset apply to stencil */
3600 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3603 * Try simple cases first
3605 if (transferOps
== 0 &&
3606 !ctx
->Pixel
.MapStencilFlag
&&
3607 srcType
== GL_UNSIGNED_BYTE
&&
3608 dstType
== GL_UNSIGNED_BYTE
) {
3609 memcpy(dest
, source
, n
* sizeof(GLubyte
));
3611 else if (transferOps
== 0 &&
3612 !ctx
->Pixel
.MapStencilFlag
&&
3613 srcType
== GL_UNSIGNED_INT
&&
3614 dstType
== GL_UNSIGNED_INT
&&
3615 !srcPacking
->SwapBytes
) {
3616 memcpy(dest
, source
, n
* sizeof(GLuint
));
3622 GLuint indexes
[MAX_WIDTH
];
3623 assert(n
<= MAX_WIDTH
);
3625 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
3628 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3629 /* shift and offset indexes */
3630 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3633 if (ctx
->Pixel
.MapStencilFlag
) {
3634 /* Apply stencil lookup table */
3635 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
3637 for (i
= 0; i
< n
; i
++) {
3638 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
3642 /* convert to dest type */
3644 case GL_UNSIGNED_BYTE
:
3646 GLubyte
*dst
= (GLubyte
*) dest
;
3648 for (i
= 0; i
< n
; i
++) {
3649 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3653 case GL_UNSIGNED_SHORT
:
3655 GLuint
*dst
= (GLuint
*) dest
;
3657 for (i
= 0; i
< n
; i
++) {
3658 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3662 case GL_UNSIGNED_INT
:
3663 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
3666 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3673 _mesa_pack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
3674 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
3675 const struct gl_pixelstore_attrib
*dstPacking
)
3677 GLstencil stencil
[MAX_WIDTH
];
3679 ASSERT(n
<= MAX_WIDTH
);
3681 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
3682 ctx
->Pixel
.MapStencilFlag
) {
3683 /* make a copy of input */
3684 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
3685 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
3690 case GL_UNSIGNED_BYTE
:
3691 if (sizeof(GLstencil
) == 1) {
3692 memcpy( dest
, source
, n
);
3695 GLubyte
*dst
= (GLubyte
*) dest
;
3698 dst
[i
] = (GLubyte
) source
[i
];
3704 GLbyte
*dst
= (GLbyte
*) dest
;
3707 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
3711 case GL_UNSIGNED_SHORT
:
3713 GLushort
*dst
= (GLushort
*) dest
;
3716 dst
[i
] = (GLushort
) source
[i
];
3718 if (dstPacking
->SwapBytes
) {
3719 _mesa_swap2( (GLushort
*) dst
, n
);
3725 GLshort
*dst
= (GLshort
*) dest
;
3728 dst
[i
] = (GLshort
) source
[i
];
3730 if (dstPacking
->SwapBytes
) {
3731 _mesa_swap2( (GLushort
*) dst
, n
);
3735 case GL_UNSIGNED_INT
:
3737 GLuint
*dst
= (GLuint
*) dest
;
3740 dst
[i
] = (GLuint
) source
[i
];
3742 if (dstPacking
->SwapBytes
) {
3743 _mesa_swap4( (GLuint
*) dst
, n
);
3749 GLint
*dst
= (GLint
*) dest
;
3752 dst
[i
] = (GLint
) source
[i
];
3754 if (dstPacking
->SwapBytes
) {
3755 _mesa_swap4( (GLuint
*) dst
, n
);
3761 GLfloat
*dst
= (GLfloat
*) dest
;
3764 dst
[i
] = (GLfloat
) source
[i
];
3766 if (dstPacking
->SwapBytes
) {
3767 _mesa_swap4( (GLuint
*) dst
, n
);
3771 case GL_HALF_FLOAT_ARB
:
3773 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
3776 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
3778 if (dstPacking
->SwapBytes
) {
3779 _mesa_swap2( (GLushort
*) dst
, n
);
3784 if (dstPacking
->LsbFirst
) {
3785 GLubyte
*dst
= (GLubyte
*) dest
;
3788 for (i
= 0; i
< n
; i
++) {
3791 *dst
|= ((source
[i
] != 0) << shift
);
3800 GLubyte
*dst
= (GLubyte
*) dest
;
3803 for (i
= 0; i
< n
; i
++) {
3806 *dst
|= ((source
[i
] != 0) << shift
);
3816 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3820 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
3823 const GLTYPE *src = (const GLTYPE *)source; \
3824 for (i = 0; i < n; i++) { \
3825 GLTYPE value = src[i]; \
3826 if (srcPacking->SwapBytes) { \
3827 if (sizeof(GLTYPE) == 2) { \
3829 } else if (sizeof(GLTYPE) == 4) { \
3833 depthValues[i] = GLTYPE2FLOAT(value); \
3839 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
3840 * or GLfloat values.
3841 * The glPixelTransfer (scale/bias) params will be applied.
3843 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
3844 * \param depthMax max value for returned GLushort or GLuint values
3845 * (ignored for GLfloat).
3848 _mesa_unpack_depth_span( const struct gl_context
*ctx
, GLuint n
,
3849 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
3850 GLenum srcType
, const GLvoid
*source
,
3851 const struct gl_pixelstore_attrib
*srcPacking
)
3853 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
3854 GLboolean needClamp
= GL_FALSE
;
3856 /* Look for special cases first.
3857 * Not only are these faster, they're less prone to numeric conversion
3858 * problems. Otherwise, converting from an int type to a float then
3859 * back to an int type can introduce errors that will show up as
3860 * artifacts in things like depth peeling which uses glCopyTexImage.
3862 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
3863 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
3864 const GLuint
*src
= (const GLuint
*) source
;
3865 GLushort
*dst
= (GLushort
*) dest
;
3867 for (i
= 0; i
< n
; i
++) {
3868 dst
[i
] = src
[i
] >> 16;
3872 if (srcType
== GL_UNSIGNED_SHORT
3873 && dstType
== GL_UNSIGNED_INT
3874 && depthMax
== 0xffffffff) {
3875 const GLushort
*src
= (const GLushort
*) source
;
3876 GLuint
*dst
= (GLuint
*) dest
;
3878 for (i
= 0; i
< n
; i
++) {
3879 dst
[i
] = src
[i
] | (src
[i
] << 16);
3883 if (srcType
== GL_UNSIGNED_INT_24_8
3884 && dstType
== GL_UNSIGNED_INT
3885 && depthMax
== 0xffffff) {
3886 const GLuint
*src
= (const GLuint
*) source
;
3887 GLuint
*dst
= (GLuint
*) dest
;
3889 for (i
= 0; i
< n
; i
++) {
3890 dst
[i
] = src
[i
] >> 8;
3894 /* XXX may want to add additional cases here someday */
3897 /* general case path follows */
3899 if (dstType
== GL_FLOAT
) {
3900 depthValues
= (GLfloat
*) dest
;
3903 depthValues
= depthTemp
;
3906 /* Convert incoming values to GLfloat. Some conversions will require
3911 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
3912 needClamp
= GL_TRUE
;
3914 case GL_UNSIGNED_BYTE
:
3915 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
3918 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
3919 needClamp
= GL_TRUE
;
3921 case GL_UNSIGNED_SHORT
:
3922 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
3925 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
3926 needClamp
= GL_TRUE
;
3928 case GL_UNSIGNED_INT
:
3929 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
3931 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
3932 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
3933 depthMax
== 0xffffff &&
3934 ctx
->Pixel
.DepthScale
== 1.0 &&
3935 ctx
->Pixel
.DepthBias
== 0.0) {
3936 const GLuint
*src
= (const GLuint
*) source
;
3937 GLuint
*zValues
= (GLuint
*) dest
;
3939 for (i
= 0; i
< n
; i
++) {
3940 GLuint value
= src
[i
];
3941 if (srcPacking
->SwapBytes
) {
3944 zValues
[i
] = value
& 0xffffff00;
3949 const GLuint
*src
= (const GLuint
*) source
;
3950 const GLfloat scale
= 1.0f
/ 0xffffff;
3952 for (i
= 0; i
< n
; i
++) {
3953 GLuint value
= src
[i
];
3954 if (srcPacking
->SwapBytes
) {
3957 depthValues
[i
] = (value
>> 8) * scale
;
3962 DEPTH_VALUES(GLfloat
, 1*);
3963 needClamp
= GL_TRUE
;
3965 case GL_HALF_FLOAT_ARB
:
3968 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
3969 for (i
= 0; i
< n
; i
++) {
3970 GLhalfARB value
= src
[i
];
3971 if (srcPacking
->SwapBytes
) {
3974 depthValues
[i
] = _mesa_half_to_float(value
);
3976 needClamp
= GL_TRUE
;
3980 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3984 /* apply depth scale and bias */
3986 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
3987 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
3988 if (scale
!= 1.0 || bias
!= 0.0) {
3990 for (i
= 0; i
< n
; i
++) {
3991 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
3993 needClamp
= GL_TRUE
;
3997 /* clamp to [0, 1] */
4000 for (i
= 0; i
< n
; i
++) {
4001 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4006 * Convert values to dstType
4008 if (dstType
== GL_UNSIGNED_INT
) {
4009 GLuint
*zValues
= (GLuint
*) dest
;
4011 if (depthMax
<= 0xffffff) {
4012 /* no overflow worries */
4013 for (i
= 0; i
< n
; i
++) {
4014 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4018 /* need to use double precision to prevent overflow problems */
4019 for (i
= 0; i
< n
; i
++) {
4020 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4021 if (z
>= (GLdouble
) 0xffffffff)
4022 zValues
[i
] = 0xffffffff;
4024 zValues
[i
] = (GLuint
) z
;
4028 else if (dstType
== GL_UNSIGNED_SHORT
) {
4029 GLushort
*zValues
= (GLushort
*) dest
;
4031 ASSERT(depthMax
<= 0xffff);
4032 for (i
= 0; i
< n
; i
++) {
4033 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4037 ASSERT(dstType
== GL_FLOAT
);
4038 /*ASSERT(depthMax == 1.0F);*/
4044 * Pack an array of depth values. The values are floats in [0,1].
4047 _mesa_pack_depth_span( const struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4048 GLenum dstType
, const GLfloat
*depthSpan
,
4049 const struct gl_pixelstore_attrib
*dstPacking
)
4051 GLfloat depthCopy
[MAX_WIDTH
];
4053 ASSERT(n
<= MAX_WIDTH
);
4055 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4056 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4057 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4058 depthSpan
= depthCopy
;
4062 case GL_UNSIGNED_BYTE
:
4064 GLubyte
*dst
= (GLubyte
*) dest
;
4066 for (i
= 0; i
< n
; i
++) {
4067 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4073 GLbyte
*dst
= (GLbyte
*) dest
;
4075 for (i
= 0; i
< n
; i
++) {
4076 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4080 case GL_UNSIGNED_SHORT
:
4082 GLushort
*dst
= (GLushort
*) dest
;
4084 for (i
= 0; i
< n
; i
++) {
4085 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4087 if (dstPacking
->SwapBytes
) {
4088 _mesa_swap2( (GLushort
*) dst
, n
);
4094 GLshort
*dst
= (GLshort
*) dest
;
4096 for (i
= 0; i
< n
; i
++) {
4097 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4099 if (dstPacking
->SwapBytes
) {
4100 _mesa_swap2( (GLushort
*) dst
, n
);
4104 case GL_UNSIGNED_INT
:
4106 GLuint
*dst
= (GLuint
*) dest
;
4108 for (i
= 0; i
< n
; i
++) {
4109 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4111 if (dstPacking
->SwapBytes
) {
4112 _mesa_swap4( (GLuint
*) dst
, n
);
4118 GLint
*dst
= (GLint
*) dest
;
4120 for (i
= 0; i
< n
; i
++) {
4121 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4123 if (dstPacking
->SwapBytes
) {
4124 _mesa_swap4( (GLuint
*) dst
, n
);
4130 GLfloat
*dst
= (GLfloat
*) dest
;
4132 for (i
= 0; i
< n
; i
++) {
4133 dst
[i
] = depthSpan
[i
];
4135 if (dstPacking
->SwapBytes
) {
4136 _mesa_swap4( (GLuint
*) dst
, n
);
4140 case GL_HALF_FLOAT_ARB
:
4142 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4144 for (i
= 0; i
< n
; i
++) {
4145 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4147 if (dstPacking
->SwapBytes
) {
4148 _mesa_swap2( (GLushort
*) dst
, n
);
4153 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4160 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4163 _mesa_pack_depth_stencil_span(const struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4164 const GLfloat
*depthVals
,
4165 const GLstencil
*stencilVals
,
4166 const struct gl_pixelstore_attrib
*dstPacking
)
4168 GLfloat depthCopy
[MAX_WIDTH
];
4169 GLstencil stencilCopy
[MAX_WIDTH
];
4172 ASSERT(n
<= MAX_WIDTH
);
4174 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4175 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4176 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4177 depthVals
= depthCopy
;
4180 if (ctx
->Pixel
.IndexShift
||
4181 ctx
->Pixel
.IndexOffset
||
4182 ctx
->Pixel
.MapStencilFlag
) {
4183 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4184 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4185 stencilVals
= stencilCopy
;
4188 for (i
= 0; i
< n
; i
++) {
4189 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4190 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4193 if (dstPacking
->SwapBytes
) {
4194 _mesa_swap4(dest
, n
);
4202 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4203 * Return all image data in a contiguous block. This is used when we
4204 * compile glDrawPixels, glTexImage, etc into a display list. We
4205 * need a copy of the data in a standard format.
4208 _mesa_unpack_image( GLuint dimensions
,
4209 GLsizei width
, GLsizei height
, GLsizei depth
,
4210 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4211 const struct gl_pixelstore_attrib
*unpack
)
4213 GLint bytesPerRow
, compsPerRow
;
4214 GLboolean flipBytes
, swap2
, swap4
;
4217 return NULL
; /* not necessarily an error */
4219 if (width
<= 0 || height
<= 0 || depth
<= 0)
4220 return NULL
; /* generate error later */
4222 if (type
== GL_BITMAP
) {
4223 bytesPerRow
= (width
+ 7) >> 3;
4224 flipBytes
= unpack
->LsbFirst
;
4225 swap2
= swap4
= GL_FALSE
;
4229 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4230 GLint components
= _mesa_components_in_format(format
);
4233 if (_mesa_type_is_packed(type
))
4236 if (bytesPerPixel
<= 0 || components
<= 0)
4237 return NULL
; /* bad format or type. generate error later */
4238 bytesPerRow
= bytesPerPixel
* width
;
4239 bytesPerComp
= bytesPerPixel
/ components
;
4240 flipBytes
= GL_FALSE
;
4241 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4242 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4243 compsPerRow
= components
* width
;
4244 assert(compsPerRow
>= width
);
4249 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4253 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4256 for (img
= 0; img
< depth
; img
++) {
4257 for (row
= 0; row
< height
; row
++) {
4258 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4259 width
, height
, format
, type
, img
, row
, 0);
4261 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4263 flipBytes
= GL_FALSE
;
4264 if (unpack
->LsbFirst
) {
4265 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4266 GLubyte dstMask
= 128;
4267 const GLubyte
*s
= src
;
4270 for (i
= 0; i
< width
; i
++) {
4274 if (srcMask
== 128) {
4279 srcMask
= srcMask
<< 1;
4287 dstMask
= dstMask
>> 1;
4292 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
4293 GLubyte dstMask
= 128;
4294 const GLubyte
*s
= src
;
4297 for (i
= 0; i
< width
; i
++) {
4306 srcMask
= srcMask
>> 1;
4314 dstMask
= dstMask
>> 1;
4320 memcpy(dst
, src
, bytesPerRow
);
4323 /* byte flipping/swapping */
4325 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
4328 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
4331 _mesa_swap4((GLuint
*) dst
, compsPerRow
);