1 /* $Id: image.c,v 1.58 2001/03/07 05:06:11 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 #include "histogram.h"
46 * These are the image packing parameters for Mesa's internal images.
47 * That is, _mesa_unpack_image() returns image data in this format.
48 * When we execute image commands (glDrawPixels, glTexImage, etc)
49 * from within display lists we have to be sure to set the current
50 * unpacking params to these values!
52 const struct gl_pixelstore_attrib _mesa_native_packing
= {
59 GL_FALSE
, /* SwapBytes */
60 GL_FALSE
/* LsbFirst */
66 * Flip the 8 bits in each byte of the given array.
68 * XXX 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);
74 flip_bytes( GLubyte
*p
, GLuint n
)
76 register GLuint i
, a
, b
;
79 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
80 a
= ((b
& 0x01) << 7) |
94 * Flip the order of the 2 bytes in each word in the given array.
97 _mesa_swap2( GLushort
*p
, GLuint n
)
102 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
109 * Flip the order of the 4 bytes in each word in the given array.
112 _mesa_swap4( GLuint
*p
, GLuint n
)
114 register GLuint i
, a
, b
;
119 | ((b
>> 8) & 0xff00)
120 | ((b
<< 8) & 0xff0000)
121 | ((b
<< 24) & 0xff000000);
130 * Return the size, in bytes, of the given GL datatype.
131 * Return 0 if GL_BITMAP.
132 * Return -1 if invalid type enum.
134 GLint
_mesa_sizeof_type( GLenum type
)
139 case GL_UNSIGNED_BYTE
:
140 return sizeof(GLubyte
);
142 return sizeof(GLbyte
);
143 case GL_UNSIGNED_SHORT
:
144 return sizeof(GLushort
);
146 return sizeof(GLshort
);
147 case GL_UNSIGNED_INT
:
148 return sizeof(GLuint
);
150 return sizeof(GLint
);
152 return sizeof(GLfloat
);
160 * Same as _mesa_sizeof_packed_type() but we also accept the
161 * packed pixel format datatypes.
163 GLint
_mesa_sizeof_packed_type( GLenum type
)
168 case GL_UNSIGNED_BYTE
:
169 return sizeof(GLubyte
);
171 return sizeof(GLbyte
);
172 case GL_UNSIGNED_SHORT
:
173 return sizeof(GLushort
);
175 return sizeof(GLshort
);
176 case GL_UNSIGNED_INT
:
177 return sizeof(GLuint
);
179 return sizeof(GLint
);
181 return sizeof(GLfloat
);
182 case GL_UNSIGNED_BYTE_3_3_2
:
183 return sizeof(GLubyte
);
184 case GL_UNSIGNED_BYTE_2_3_3_REV
:
185 return sizeof(GLubyte
);
186 case GL_UNSIGNED_SHORT_5_6_5
:
187 return sizeof(GLshort
);
188 case GL_UNSIGNED_SHORT_5_6_5_REV
:
189 return sizeof(GLshort
);
190 case GL_UNSIGNED_SHORT_4_4_4_4
:
191 return sizeof(GLshort
);
192 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
193 return sizeof(GLshort
);
194 case GL_UNSIGNED_SHORT_5_5_5_1
:
195 return sizeof(GLshort
);
196 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
197 return sizeof(GLshort
);
198 case GL_UNSIGNED_INT_8_8_8_8
:
199 return sizeof(GLuint
);
200 case GL_UNSIGNED_INT_8_8_8_8_REV
:
201 return sizeof(GLuint
);
202 case GL_UNSIGNED_INT_10_10_10_2
:
203 return sizeof(GLuint
);
204 case GL_UNSIGNED_INT_2_10_10_10_REV
:
205 return sizeof(GLuint
);
214 * Return the number of components in a GL enum pixel type.
215 * Return -1 if bad format.
217 GLint
_mesa_components_in_format( GLenum format
)
221 case GL_COLOR_INDEX1_EXT
:
222 case GL_COLOR_INDEX2_EXT
:
223 case GL_COLOR_INDEX4_EXT
:
224 case GL_COLOR_INDEX8_EXT
:
225 case GL_COLOR_INDEX12_EXT
:
226 case GL_COLOR_INDEX16_EXT
:
227 case GL_STENCIL_INDEX
:
228 case GL_DEPTH_COMPONENT
:
236 case GL_LUMINANCE_ALPHA
:
255 * Return bytes per pixel for given format and type
256 * Return -1 if bad format or type.
258 GLint
_mesa_bytes_per_pixel( GLenum format
, GLenum type
)
260 GLint comps
= _mesa_components_in_format( format
);
266 return 0; /* special case */
268 case GL_UNSIGNED_BYTE
:
269 return comps
* sizeof(GLubyte
);
271 case GL_UNSIGNED_SHORT
:
272 return comps
* sizeof(GLshort
);
274 case GL_UNSIGNED_INT
:
275 return comps
* sizeof(GLint
);
277 return comps
* sizeof(GLfloat
);
278 case GL_UNSIGNED_BYTE_3_3_2
:
279 case GL_UNSIGNED_BYTE_2_3_3_REV
:
280 if (format
== GL_RGB
|| format
== GL_BGR
)
281 return sizeof(GLubyte
);
283 return -1; /* error */
284 case GL_UNSIGNED_SHORT_5_6_5
:
285 case GL_UNSIGNED_SHORT_5_6_5_REV
:
286 if (format
== GL_RGB
|| format
== GL_BGR
)
287 return sizeof(GLshort
);
289 return -1; /* error */
290 case GL_UNSIGNED_SHORT_4_4_4_4
:
291 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
292 case GL_UNSIGNED_SHORT_5_5_5_1
:
293 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
294 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
295 return sizeof(GLushort
);
298 case GL_UNSIGNED_INT_8_8_8_8
:
299 case GL_UNSIGNED_INT_8_8_8_8_REV
:
300 case GL_UNSIGNED_INT_10_10_10_2
:
301 case GL_UNSIGNED_INT_2_10_10_10_REV
:
302 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
303 return sizeof(GLuint
);
313 * Test if the given pixel format and type are legal.
314 * Return GL_TRUE for legal, GL_FALSE for illegal.
317 _mesa_is_legal_format_and_type( GLenum format
, GLenum type
)
321 case GL_STENCIL_INDEX
:
325 case GL_UNSIGNED_BYTE
:
327 case GL_UNSIGNED_SHORT
:
329 case GL_UNSIGNED_INT
:
341 case GL_LUMINANCE_ALPHA
:
342 case GL_DEPTH_COMPONENT
:
345 case GL_UNSIGNED_BYTE
:
347 case GL_UNSIGNED_SHORT
:
349 case GL_UNSIGNED_INT
:
359 case GL_UNSIGNED_BYTE
:
361 case GL_UNSIGNED_SHORT
:
363 case GL_UNSIGNED_INT
:
365 case GL_UNSIGNED_BYTE_3_3_2
:
366 case GL_UNSIGNED_BYTE_2_3_3_REV
:
367 case GL_UNSIGNED_SHORT_5_6_5
:
368 case GL_UNSIGNED_SHORT_5_6_5_REV
:
378 case GL_UNSIGNED_BYTE
:
380 case GL_UNSIGNED_SHORT
:
382 case GL_UNSIGNED_INT
:
384 case GL_UNSIGNED_SHORT_4_4_4_4
:
385 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
386 case GL_UNSIGNED_SHORT_5_5_5_1
:
387 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
388 case GL_UNSIGNED_INT_8_8_8_8
:
389 case GL_UNSIGNED_INT_8_8_8_8_REV
:
390 case GL_UNSIGNED_INT_10_10_10_2
:
391 case GL_UNSIGNED_INT_2_10_10_10_REV
:
405 * Return the address of a pixel in an image (actually a volume).
406 * Pixel unpacking/packing parameters are observed according to 'packing'.
407 * Input: image - start of image data
408 * width, height - size of image
409 * format - image format
410 * type - pixel component type
411 * packing - the pixelstore attributes
412 * img - which image in the volume (0 for 1D or 2D images)
413 * row, column - location of pixel in the image
414 * Return: address of pixel at (image,row,column) in image or NULL if error.
417 _mesa_image_address( const struct gl_pixelstore_attrib
*packing
,
418 const GLvoid
*image
, GLsizei width
,
419 GLsizei height
, GLenum format
, GLenum type
,
420 GLint img
, GLint row
, GLint column
)
422 GLint alignment
; /* 1, 2 or 4 */
423 GLint pixels_per_row
;
424 GLint rows_per_image
;
427 GLint skipimages
; /* for 3-D volume images */
430 alignment
= packing
->Alignment
;
431 if (packing
->RowLength
> 0) {
432 pixels_per_row
= packing
->RowLength
;
435 pixels_per_row
= width
;
437 if (packing
->ImageHeight
> 0) {
438 rows_per_image
= packing
->ImageHeight
;
441 rows_per_image
= height
;
443 skiprows
= packing
->SkipRows
;
444 skippixels
= packing
->SkipPixels
;
445 skipimages
= packing
->SkipImages
;
447 if (type
==GL_BITMAP
) {
449 GLint comp_per_pixel
; /* components per pixel */
450 GLint bytes_per_comp
; /* bytes per component */
452 GLint bytes_per_image
;
454 /* Compute bytes per component */
455 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
456 if (bytes_per_comp
<0) {
460 /* Compute number of components per pixel */
461 comp_per_pixel
= _mesa_components_in_format( format
);
462 if (comp_per_pixel
<0 && type
!= GL_BITMAP
) {
466 bytes_per_row
= alignment
467 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
469 bytes_per_image
= bytes_per_row
* rows_per_image
;
471 pixel_addr
= (GLubyte
*) image
472 + (skipimages
+ img
) * bytes_per_image
473 + (skiprows
+ row
) * bytes_per_row
474 + (skippixels
+ column
) / 8;
477 /* Non-BITMAP data */
478 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
480 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
482 /* The pixel type and format should have been error checked earlier */
483 assert(bytes_per_pixel
> 0);
485 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
486 remainder
= bytes_per_row
% alignment
;
488 bytes_per_row
+= (alignment
- remainder
);
490 ASSERT(bytes_per_row
% alignment
== 0);
492 bytes_per_image
= bytes_per_row
* rows_per_image
;
494 /* compute final pixel address */
495 pixel_addr
= (GLubyte
*) image
496 + (skipimages
+ img
) * bytes_per_image
497 + (skiprows
+ row
) * bytes_per_row
498 + (skippixels
+ column
) * bytes_per_pixel
;
501 return (GLvoid
*) pixel_addr
;
507 * Compute the stride between image rows (in bytes) for the given
508 * pixel packing parameters and image width, format and type.
511 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
512 GLint width
, GLenum format
, GLenum type
)
515 if (type
== GL_BITMAP
) {
517 if (packing
->RowLength
== 0) {
518 GLint bytes
= (width
+ 7) / 8;
522 GLint bytes
= (packing
->RowLength
+ 7) / 8;
527 /* Non-BITMAP data */
528 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
529 GLint bytesPerRow
, remainder
;
530 if (bytesPerPixel
<= 0)
531 return -1; /* error */
532 if (packing
->RowLength
== 0) {
533 bytesPerRow
= bytesPerPixel
* width
;
536 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
538 remainder
= bytesPerRow
% packing
->Alignment
;
540 bytesPerRow
+= (packing
->Alignment
- remainder
);
548 * Unpack a 32x32 pixel polygon stipple from user memory using the
549 * current pixel unpack settings.
552 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
553 const struct gl_pixelstore_attrib
*unpacking
)
555 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap( 32, 32, pattern
, unpacking
);
557 /* Convert pattern from GLubytes to GLuints and handle big/little
562 for (i
= 0; i
< 32; i
++) {
563 dest
[i
] = (p
[0] << 24)
576 * Pack polygon stipple into user memory given current pixel packing
580 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
581 const struct gl_pixelstore_attrib
*packing
)
583 /* Convert pattern from GLuints to GLubytes to handle big/little
584 * endian differences.
588 for (i
= 0; i
< 32; i
++) {
589 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
590 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
591 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
592 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
595 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
600 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
601 * order with row alignment = 1 byte.
604 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
605 const struct gl_pixelstore_attrib
*packing
)
607 GLint bytes
, row
, width_in_bytes
;
608 GLubyte
*buffer
, *dst
;
613 /* Alloc dest storage */
614 bytes
= ((width
+ 7) / 8 * height
);
615 buffer
= (GLubyte
*) MALLOC( bytes
);
620 width_in_bytes
= CEILING( width
, 8 );
622 for (row
= 0; row
< height
; row
++) {
623 const GLubyte
*src
= (const GLubyte
*)
624 _mesa_image_address(packing
, pixels
, width
, height
,
625 GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0);
631 if (packing
->SkipPixels
== 0) {
632 MEMCPY( dst
, src
, width_in_bytes
);
633 if (packing
->LsbFirst
) {
634 flip_bytes( dst
, width_in_bytes
);
638 /* handling SkipPixels is a bit tricky (no pun intended!) */
640 if (packing
->LsbFirst
) {
641 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
642 GLubyte dstMask
= 128;
643 const GLubyte
*s
= src
;
646 for (i
= 0; i
< width
; i
++) {
650 if (srcMask
== 128) {
655 srcMask
= srcMask
<< 1;
663 dstMask
= dstMask
>> 1;
668 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
669 GLubyte dstMask
= 128;
670 const GLubyte
*s
= src
;
673 for (i
= 0; i
< width
; i
++) {
682 srcMask
= srcMask
>> 1;
690 dstMask
= dstMask
>> 1;
695 dst
+= width_in_bytes
;
706 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
707 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
709 GLint row
, width_in_bytes
;
715 width_in_bytes
= CEILING( width
, 8 );
717 for (row
= 0; row
< height
; row
++) {
718 GLubyte
*dst
= (GLubyte
*) _mesa_image_address( packing
, dest
,
719 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0 );
723 if (packing
->SkipPixels
== 0) {
724 MEMCPY( dst
, src
, width_in_bytes
);
725 if (packing
->LsbFirst
) {
726 flip_bytes( dst
, width_in_bytes
);
730 /* handling SkipPixels is a bit tricky (no pun intended!) */
732 if (packing
->LsbFirst
) {
733 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
734 GLubyte dstMask
= 128;
735 const GLubyte
*s
= src
;
738 for (i
= 0; i
< width
; i
++) {
742 if (srcMask
== 128) {
747 srcMask
= srcMask
<< 1;
755 dstMask
= dstMask
>> 1;
760 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
761 GLubyte dstMask
= 128;
762 const GLubyte
*s
= src
;
765 for (i
= 0; i
< width
; i
++) {
774 srcMask
= srcMask
>> 1;
782 dstMask
= dstMask
>> 1;
787 src
+= width_in_bytes
;
794 _mesa_pack_float_rgba_span( GLcontext
*ctx
,
795 GLuint n
, CONST GLfloat rgbaIn
[][4],
796 GLenum dstFormat
, GLenum dstType
,
798 const struct gl_pixelstore_attrib
*dstPacking
,
801 const GLint comps
= _mesa_components_in_format(dstFormat
);
802 GLfloat luminance
[MAX_WIDTH
];
807 /* make copy of incoming data */
808 GLfloat rgbaCopy
[MAX_WIDTH
][4];
809 for (i
= 0; i
< n
; i
++) {
810 rgbaCopy
[i
][0] = rgbaIn
[i
][0];
811 rgbaCopy
[i
][1] = rgbaIn
[i
][1];
812 rgbaCopy
[i
][2] = rgbaIn
[i
][2];
813 rgbaCopy
[i
][3] = rgbaIn
[i
][3];
816 rgba
= (GLfloat (*)[4]) rgbaCopy
;
819 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
820 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
821 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
822 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
823 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
824 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
826 /* color map lookup */
827 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
828 _mesa_map_rgba( ctx
, n
, rgba
);
830 /* GL_COLOR_TABLE lookup */
831 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
832 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
835 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
836 /* this has to be done in the calling code */
838 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
839 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
840 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
841 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
842 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
843 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
844 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
845 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
846 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
847 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
848 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
850 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
851 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
852 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
854 /* color matrix transform */
855 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
856 _mesa_transform_rgba(ctx
, n
, rgba
);
858 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
859 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
860 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
862 /* update histogram count */
863 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
864 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
867 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
868 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
869 if (ctx
->MinMax
.Sink
)
874 /* use incoming data, not a copy */
875 rgba
= (GLfloat (*)[4]) rgbaIn
;
878 /* XXX clamp rgba to [0,1]? */
881 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
882 for (i
= 0; i
< n
; i
++) {
883 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
884 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
889 * Pack/store the pixels. Ugh! Lots of cases!!!
892 case GL_UNSIGNED_BYTE
:
894 GLubyte
*dst
= (GLubyte
*) dstAddr
;
898 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
902 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
906 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
910 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
914 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
916 case GL_LUMINANCE_ALPHA
:
918 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
919 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
924 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
925 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
926 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
931 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
932 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
933 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
934 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
939 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
940 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
941 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
946 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
947 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
948 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
949 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
954 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
955 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
956 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
957 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
961 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
967 GLbyte
*dst
= (GLbyte
*) dstAddr
;
971 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
975 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
979 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
983 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
987 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
989 case GL_LUMINANCE_ALPHA
:
991 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
992 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
997 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
998 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
999 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1004 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1005 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1006 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1007 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1012 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1013 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1014 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1019 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1020 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1021 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1022 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1026 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1027 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1028 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1029 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1033 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1037 case GL_UNSIGNED_SHORT
:
1039 GLushort
*dst
= (GLushort
*) dstAddr
;
1040 switch (dstFormat
) {
1043 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1047 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1051 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1055 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1059 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
1061 case GL_LUMINANCE_ALPHA
:
1063 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
1064 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1069 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1070 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1071 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1076 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1077 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1078 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1079 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1084 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1085 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1086 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1091 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1092 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1093 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1094 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1099 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1100 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1101 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1102 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1106 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1108 if (dstPacking
->SwapBytes
) {
1109 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1115 GLshort
*dst
= (GLshort
*) dstAddr
;
1116 switch (dstFormat
) {
1119 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1123 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1127 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1131 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1135 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1137 case GL_LUMINANCE_ALPHA
:
1139 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1140 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1145 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1146 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1147 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1152 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1153 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1154 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1155 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1160 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1161 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1162 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1167 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1168 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1169 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1170 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1174 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1175 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1176 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1177 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1181 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1183 if (dstPacking
->SwapBytes
) {
1184 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1188 case GL_UNSIGNED_INT
:
1190 GLuint
*dst
= (GLuint
*) dstAddr
;
1191 switch (dstFormat
) {
1194 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1198 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1202 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1206 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1210 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1212 case GL_LUMINANCE_ALPHA
:
1214 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1215 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1220 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1221 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1222 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1227 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1228 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1229 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1230 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1235 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1236 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1237 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1242 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1243 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1244 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1245 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1250 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1251 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1252 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1253 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1257 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1259 if (dstPacking
->SwapBytes
) {
1260 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1266 GLint
*dst
= (GLint
*) dstAddr
;
1267 switch (dstFormat
) {
1270 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1274 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1278 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1282 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1286 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1288 case GL_LUMINANCE_ALPHA
:
1290 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1291 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1296 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1297 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1298 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1303 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1304 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1305 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1306 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1311 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1312 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1313 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1318 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1319 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1320 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1321 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1326 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1327 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1328 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1329 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1333 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1335 if (dstPacking
->SwapBytes
) {
1336 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1342 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1343 switch (dstFormat
) {
1346 dst
[i
] = rgba
[i
][RCOMP
];
1350 dst
[i
] = rgba
[i
][GCOMP
];
1354 dst
[i
] = rgba
[i
][BCOMP
];
1358 dst
[i
] = rgba
[i
][ACOMP
];
1362 dst
[i
] = luminance
[i
];
1364 case GL_LUMINANCE_ALPHA
:
1366 dst
[i
*2+0] = luminance
[i
];
1367 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1372 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1373 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1374 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1379 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1380 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1381 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1382 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1387 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1388 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1389 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1394 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1395 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1396 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1397 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1402 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1403 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1404 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1405 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1409 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1411 if (dstPacking
->SwapBytes
) {
1412 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1416 case GL_UNSIGNED_BYTE_3_3_2
:
1417 if (dstFormat
== GL_RGB
) {
1418 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1420 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1421 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1422 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1426 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1427 if (dstFormat
== GL_RGB
) {
1428 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1430 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1431 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1432 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1436 case GL_UNSIGNED_SHORT_5_6_5
:
1437 if (dstFormat
== GL_RGB
) {
1438 GLushort
*dst
= (GLushort
*) dstAddr
;
1440 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1441 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1442 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1446 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1447 if (dstFormat
== GL_RGB
) {
1448 GLushort
*dst
= (GLushort
*) dstAddr
;
1450 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1451 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1452 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1456 case GL_UNSIGNED_SHORT_4_4_4_4
:
1457 if (dstFormat
== GL_RGBA
) {
1458 GLushort
*dst
= (GLushort
*) dstAddr
;
1460 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1461 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1462 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1463 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1466 else if (dstFormat
== GL_BGRA
) {
1467 GLushort
*dst
= (GLushort
*) dstAddr
;
1469 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 12)
1470 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1471 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 4)
1472 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1475 else if (dstFormat
== GL_ABGR_EXT
) {
1476 GLushort
*dst
= (GLushort
*) dstAddr
;
1478 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 4)
1479 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1480 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 12)
1481 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) );
1485 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1486 if (dstFormat
== GL_RGBA
) {
1487 GLushort
*dst
= (GLushort
*) dstAddr
;
1489 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1490 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1491 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1492 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1495 else if (dstFormat
== GL_BGRA
) {
1496 GLushort
*dst
= (GLushort
*) dstAddr
;
1498 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) )
1499 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1500 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 8)
1501 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1504 else if (dstFormat
== GL_ABGR_EXT
) {
1505 GLushort
*dst
= (GLushort
*) dstAddr
;
1507 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) )
1508 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1509 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1510 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12);
1514 case GL_UNSIGNED_SHORT_5_5_5_1
:
1515 if (dstFormat
== GL_RGBA
) {
1516 GLushort
*dst
= (GLushort
*) dstAddr
;
1518 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1519 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1520 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1521 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1524 else if (dstFormat
== GL_BGRA
) {
1525 GLushort
*dst
= (GLushort
*) dstAddr
;
1527 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11)
1528 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1529 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 1)
1530 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1533 else if (dstFormat
== GL_ABGR_EXT
) {
1534 GLushort
*dst
= (GLushort
*) dstAddr
;
1536 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) << 11)
1537 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 6)
1538 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 1)
1539 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) );
1543 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1544 if (dstFormat
== GL_RGBA
) {
1545 GLushort
*dst
= (GLushort
*) dstAddr
;
1547 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1548 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1549 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1550 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1553 else if (dstFormat
== GL_BGRA
) {
1554 GLushort
*dst
= (GLushort
*) dstAddr
;
1556 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) )
1557 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1558 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 10)
1559 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1562 else if (dstFormat
== GL_ABGR_EXT
) {
1563 GLushort
*dst
= (GLushort
*) dstAddr
;
1565 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) )
1566 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 5)
1567 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 10)
1568 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) << 15);
1572 case GL_UNSIGNED_INT_8_8_8_8
:
1573 if (dstFormat
== GL_RGBA
) {
1574 GLuint
*dst
= (GLuint
*) dstAddr
;
1576 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1577 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1578 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1579 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1582 else if (dstFormat
== GL_BGRA
) {
1583 GLuint
*dst
= (GLuint
*) dstAddr
;
1585 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1586 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1587 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1588 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1591 else if (dstFormat
== GL_ABGR_EXT
) {
1592 GLuint
*dst
= (GLuint
*) dstAddr
;
1594 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1595 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1596 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1597 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1601 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1602 if (dstFormat
== GL_RGBA
) {
1603 GLuint
*dst
= (GLuint
*) dstAddr
;
1605 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1606 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1607 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1608 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1611 else if (dstFormat
== GL_BGRA
) {
1612 GLuint
*dst
= (GLuint
*) dstAddr
;
1614 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1615 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1616 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1617 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1620 else if (dstFormat
== GL_ABGR_EXT
) {
1621 GLuint
*dst
= (GLuint
*) dstAddr
;
1623 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1624 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1625 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1626 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1630 case GL_UNSIGNED_INT_10_10_10_2
:
1631 if (dstFormat
== GL_RGBA
) {
1632 GLuint
*dst
= (GLuint
*) dstAddr
;
1634 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1635 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1636 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1637 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1640 else if (dstFormat
== GL_BGRA
) {
1641 GLuint
*dst
= (GLuint
*) dstAddr
;
1643 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1644 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1645 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1646 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1649 else if (dstFormat
== GL_ABGR_EXT
) {
1650 GLuint
*dst
= (GLuint
*) dstAddr
;
1652 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1653 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1654 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1655 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1659 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1660 if (dstFormat
== GL_RGBA
) {
1661 GLuint
*dst
= (GLuint
*) dstAddr
;
1663 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1664 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1665 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1666 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1669 else if (dstFormat
== GL_BGRA
) {
1670 GLuint
*dst
= (GLuint
*) dstAddr
;
1672 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1673 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1674 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1675 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1678 else if (dstFormat
== GL_ABGR_EXT
) {
1679 GLuint
*dst
= (GLuint
*) dstAddr
;
1681 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1682 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1683 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1684 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1689 _mesa_problem(ctx
, "bad type in _mesa_pack_float_rgba_span");
1696 * Pack the given RGBA span into client memory at 'dest' address
1697 * in the given pixel format and type.
1698 * Optionally apply the enabled pixel transfer ops.
1699 * Pack into memory using the given packing params struct.
1700 * This is used by glReadPixels and glGetTexImage?D()
1701 * Input: ctx - the context
1702 * n - number of pixels in the span
1704 * format - dest packing format
1705 * type - dest packing datatype
1706 * destination - destination packing address
1707 * packing - pixel packing parameters
1708 * transferOps - bitmask of IMAGE_*_BIT operations to apply
1711 _mesa_pack_rgba_span( GLcontext
*ctx
,
1712 GLuint n
, CONST GLchan srcRgba
[][4],
1713 GLenum dstFormat
, GLenum dstType
,
1715 const struct gl_pixelstore_attrib
*dstPacking
,
1718 ASSERT((ctx
->NewState
& _NEW_PIXEL
) == 0);
1720 /* Test for optimized case first */
1721 if (transferOps
== 0 && dstFormat
== GL_RGBA
&& dstType
== CHAN_TYPE
) {
1722 /* common simple case */
1723 MEMCPY(dstAddr
, srcRgba
, n
* 4 * sizeof(GLchan
));
1725 else if (transferOps
== 0 && dstFormat
== GL_RGB
&& dstType
== CHAN_TYPE
) {
1726 /* common simple case */
1728 GLchan
*dest
= (GLchan
*) dstAddr
;
1729 for (i
= 0; i
< n
; i
++) {
1730 dest
[0] = srcRgba
[i
][RCOMP
];
1731 dest
[1] = srcRgba
[i
][GCOMP
];
1732 dest
[2] = srcRgba
[i
][BCOMP
];
1737 /* general solution */
1738 GLfloat rgba
[MAX_WIDTH
][4];
1740 assert(n
<= MAX_WIDTH
);
1741 /* convert color components to floating point */
1743 rgba
[i
][RCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][RCOMP
]);
1744 rgba
[i
][GCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][GCOMP
]);
1745 rgba
[i
][BCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][BCOMP
]);
1746 rgba
[i
][ACOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][ACOMP
]);
1748 _mesa_pack_float_rgba_span(ctx
, n
, (const GLfloat (*)[4]) rgba
,
1749 dstFormat
, dstType
, dstAddr
,
1750 dstPacking
, transferOps
);
1755 #define SWAP2BYTE(VALUE) \
1757 GLubyte *bytes = (GLubyte *) &(VALUE); \
1758 GLubyte tmp = bytes[0]; \
1759 bytes[0] = bytes[1]; \
1763 #define SWAP4BYTE(VALUE) \
1765 GLubyte *bytes = (GLubyte *) &(VALUE); \
1766 GLubyte tmp = bytes[0]; \
1767 bytes[0] = bytes[3]; \
1770 bytes[1] = bytes[2]; \
1776 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1777 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1778 const struct gl_pixelstore_attrib
*unpack
)
1780 assert(srcFormat
== GL_COLOR_INDEX
);
1782 ASSERT(srcType
== GL_BITMAP
||
1783 srcType
== GL_UNSIGNED_BYTE
||
1784 srcType
== GL_BYTE
||
1785 srcType
== GL_UNSIGNED_SHORT
||
1786 srcType
== GL_SHORT
||
1787 srcType
== GL_UNSIGNED_INT
||
1788 srcType
== GL_INT
||
1789 srcType
== GL_FLOAT
);
1794 GLubyte
*ubsrc
= (GLubyte
*) src
;
1795 if (unpack
->LsbFirst
) {
1796 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1798 for (i
= 0; i
< n
; i
++) {
1799 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1810 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1812 for (i
= 0; i
< n
; i
++) {
1813 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1825 case GL_UNSIGNED_BYTE
:
1828 const GLubyte
*s
= (const GLubyte
*) src
;
1829 for (i
= 0; i
< n
; i
++)
1836 const GLbyte
*s
= (const GLbyte
*) src
;
1837 for (i
= 0; i
< n
; i
++)
1841 case GL_UNSIGNED_SHORT
:
1844 const GLushort
*s
= (const GLushort
*) src
;
1845 if (unpack
->SwapBytes
) {
1846 for (i
= 0; i
< n
; i
++) {
1847 GLushort value
= s
[i
];
1853 for (i
= 0; i
< n
; i
++)
1861 const GLshort
*s
= (const GLshort
*) src
;
1862 if (unpack
->SwapBytes
) {
1863 for (i
= 0; i
< n
; i
++) {
1864 GLshort value
= s
[i
];
1870 for (i
= 0; i
< n
; i
++)
1875 case GL_UNSIGNED_INT
:
1878 const GLuint
*s
= (const GLuint
*) src
;
1879 if (unpack
->SwapBytes
) {
1880 for (i
= 0; i
< n
; i
++) {
1881 GLuint value
= s
[i
];
1887 for (i
= 0; i
< n
; i
++)
1895 const GLint
*s
= (const GLint
*) src
;
1896 if (unpack
->SwapBytes
) {
1897 for (i
= 0; i
< n
; i
++) {
1904 for (i
= 0; i
< n
; i
++)
1912 const GLfloat
*s
= (const GLfloat
*) src
;
1913 if (unpack
->SwapBytes
) {
1914 for (i
= 0; i
< n
; i
++) {
1915 GLfloat value
= s
[i
];
1917 indexes
[i
] = (GLuint
) value
;
1921 for (i
= 0; i
< n
; i
++)
1922 indexes
[i
] = (GLuint
) s
[i
];
1927 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
1935 * This function extracts floating point RGBA values from arbitrary
1936 * image data. srcFormat and srcType are the format and type parameters
1937 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1939 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1940 * implements the "Conversion to floating point", "Conversion to RGB",
1941 * and "Final Expansion to RGBA" operations.
1943 * Args: n - number of pixels
1944 * rgba - output colors
1945 * srcFormat - format of incoming data
1946 * srcType - datatype of incoming data
1947 * src - source data pointer
1948 * swapBytes - perform byteswapping of incoming data?
1951 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
1952 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1953 GLboolean swapBytes
)
1955 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
1957 GLint rComp
, bComp
, gComp
, aComp
;
1959 ASSERT(srcFormat
== GL_RED
||
1960 srcFormat
== GL_GREEN
||
1961 srcFormat
== GL_BLUE
||
1962 srcFormat
== GL_ALPHA
||
1963 srcFormat
== GL_LUMINANCE
||
1964 srcFormat
== GL_LUMINANCE_ALPHA
||
1965 srcFormat
== GL_INTENSITY
||
1966 srcFormat
== GL_RGB
||
1967 srcFormat
== GL_BGR
||
1968 srcFormat
== GL_RGBA
||
1969 srcFormat
== GL_BGRA
||
1970 srcFormat
== GL_ABGR_EXT
);
1972 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
1973 srcType
== GL_BYTE
||
1974 srcType
== GL_UNSIGNED_SHORT
||
1975 srcType
== GL_SHORT
||
1976 srcType
== GL_UNSIGNED_INT
||
1977 srcType
== GL_INT
||
1978 srcType
== GL_FLOAT
||
1979 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
1980 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
1981 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
1982 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
1983 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
1984 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
1985 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
1986 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
1987 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
1988 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
1989 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
1990 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
1992 rComp
= gComp
= bComp
= aComp
= -1;
1994 switch (srcFormat
) {
1997 greenIndex
= blueIndex
= alphaIndex
= -1;
2002 redIndex
= blueIndex
= alphaIndex
= -1;
2007 redIndex
= greenIndex
= alphaIndex
= -1;
2011 redIndex
= greenIndex
= blueIndex
= -1;
2016 redIndex
= greenIndex
= blueIndex
= 0;
2020 case GL_LUMINANCE_ALPHA
:
2021 redIndex
= greenIndex
= blueIndex
= 0;
2027 greenIndex
= blueIndex
= alphaIndex
= -1;
2078 _mesa_problem(NULL
, "bad srcFormat in extract float data");
2083 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
2084 if ((INDEX) < 0) { \
2086 for (i = 0; i < n; i++) { \
2087 rgba[i][CHANNEL] = DEFAULT; \
2090 else if (swapBytes) { \
2091 const TYPE *s = (const TYPE *) src; \
2093 for (i = 0; i < n; i++) { \
2094 TYPE value = s[INDEX]; \
2095 if (sizeof(TYPE) == 2) { \
2098 else if (sizeof(TYPE) == 4) { \
2101 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2106 const TYPE *s = (const TYPE *) src; \
2108 for (i = 0; i < n; i++) { \
2109 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2115 case GL_UNSIGNED_BYTE
:
2116 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2117 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2118 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2119 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2122 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2123 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2124 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2125 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
2127 case GL_UNSIGNED_SHORT
:
2128 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2129 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2130 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2131 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
2134 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2135 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2136 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2137 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
2139 case GL_UNSIGNED_INT
:
2140 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2141 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2142 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2143 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
2146 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2147 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2148 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2149 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
2152 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2153 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2154 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2155 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
2157 case GL_UNSIGNED_BYTE_3_3_2
:
2159 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2161 for (i
= 0; i
< n
; i
++) {
2162 GLubyte p
= ubsrc
[i
];
2163 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
2164 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
2165 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
2166 rgba
[i
][ACOMP
] = 1.0F
;
2170 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2172 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2174 for (i
= 0; i
< n
; i
++) {
2175 GLubyte p
= ubsrc
[i
];
2176 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
2177 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
2178 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
2179 rgba
[i
][ACOMP
] = 1.0F
;
2183 case GL_UNSIGNED_SHORT_5_6_5
:
2185 const GLushort
*ussrc
= (const GLushort
*) src
;
2187 for (i
= 0; i
< n
; i
++) {
2188 GLushort p
= ussrc
[i
];
2190 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2191 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2192 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2193 rgba
[i
][ACOMP
] = 1.0F
;
2197 const GLushort
*ussrc
= (const GLushort
*) src
;
2199 for (i
= 0; i
< n
; i
++) {
2200 GLushort p
= ussrc
[i
];
2201 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2202 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2203 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2204 rgba
[i
][ACOMP
] = 1.0F
;
2208 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2210 const GLushort
*ussrc
= (const GLushort
*) src
;
2212 for (i
= 0; i
< n
; i
++) {
2213 GLushort p
= ussrc
[i
];
2215 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2216 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2217 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2218 rgba
[i
][ACOMP
] = 1.0F
;
2222 const GLushort
*ussrc
= (const GLushort
*) src
;
2224 for (i
= 0; i
< n
; i
++) {
2225 GLushort p
= ussrc
[i
];
2226 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2227 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2228 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2229 rgba
[i
][ACOMP
] = 1.0F
;
2233 case GL_UNSIGNED_SHORT_4_4_4_4
:
2235 const GLushort
*ussrc
= (const GLushort
*) src
;
2237 for (i
= 0; i
< n
; i
++) {
2238 GLushort p
= ussrc
[i
];
2240 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2241 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2242 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2243 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2247 const GLushort
*ussrc
= (const GLushort
*) src
;
2249 for (i
= 0; i
< n
; i
++) {
2250 GLushort p
= ussrc
[i
];
2251 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2252 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2253 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2254 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2258 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2260 const GLushort
*ussrc
= (const GLushort
*) src
;
2262 for (i
= 0; i
< n
; i
++) {
2263 GLushort p
= ussrc
[i
];
2265 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2266 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2267 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2268 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2272 const GLushort
*ussrc
= (const GLushort
*) src
;
2274 for (i
= 0; i
< n
; i
++) {
2275 GLushort p
= ussrc
[i
];
2276 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2277 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2278 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2279 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2283 case GL_UNSIGNED_SHORT_5_5_5_1
:
2285 const GLushort
*ussrc
= (const GLushort
*) src
;
2287 for (i
= 0; i
< n
; i
++) {
2288 GLushort p
= ussrc
[i
];
2290 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2291 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2292 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2293 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2297 const GLushort
*ussrc
= (const GLushort
*) src
;
2299 for (i
= 0; i
< n
; i
++) {
2300 GLushort p
= ussrc
[i
];
2301 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2302 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2303 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2304 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2308 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2310 const GLushort
*ussrc
= (const GLushort
*) src
;
2312 for (i
= 0; i
< n
; i
++) {
2313 GLushort p
= ussrc
[i
];
2315 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2316 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2317 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2318 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2322 const GLushort
*ussrc
= (const GLushort
*) src
;
2324 for (i
= 0; i
< n
; i
++) {
2325 GLushort p
= ussrc
[i
];
2326 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2327 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2328 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2329 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2333 case GL_UNSIGNED_INT_8_8_8_8
:
2335 const GLuint
*uisrc
= (const GLuint
*) src
;
2337 for (i
= 0; i
< n
; i
++) {
2338 GLuint p
= uisrc
[i
];
2339 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2340 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2341 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2342 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2346 const GLuint
*uisrc
= (const GLuint
*) src
;
2348 for (i
= 0; i
< n
; i
++) {
2349 GLuint p
= uisrc
[i
];
2350 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2351 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2352 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2353 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2357 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2359 const GLuint
*uisrc
= (const GLuint
*) src
;
2361 for (i
= 0; i
< n
; i
++) {
2362 GLuint p
= uisrc
[i
];
2363 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2364 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2365 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2366 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2370 const GLuint
*uisrc
= (const GLuint
*) src
;
2372 for (i
= 0; i
< n
; i
++) {
2373 GLuint p
= uisrc
[i
];
2374 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2375 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2376 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2377 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2381 case GL_UNSIGNED_INT_10_10_10_2
:
2383 const GLuint
*uisrc
= (const GLuint
*) src
;
2385 for (i
= 0; i
< n
; i
++) {
2386 GLuint p
= uisrc
[i
];
2388 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2389 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2390 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2391 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2395 const GLuint
*uisrc
= (const GLuint
*) src
;
2397 for (i
= 0; i
< n
; i
++) {
2398 GLuint p
= uisrc
[i
];
2399 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2400 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2401 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2402 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2406 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2408 const GLuint
*uisrc
= (const GLuint
*) src
;
2410 for (i
= 0; i
< n
; i
++) {
2411 GLuint p
= uisrc
[i
];
2413 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2414 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2415 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2416 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2420 const GLuint
*uisrc
= (const GLuint
*) src
;
2422 for (i
= 0; i
< n
; i
++) {
2423 GLuint p
= uisrc
[i
];
2424 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2425 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2426 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2427 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2432 _mesa_problem(NULL
, "bad srcType in extract float data");
2440 * Unpack a row of color image data from a client buffer according to
2441 * the pixel unpacking parameters.
2442 * Return GLubyte values in the specified dest image format.
2443 * This is (or will be) used by glDrawPixels and glTexImage?D().
2444 * Input: ctx - the context
2445 * n - number of pixels in the span
2446 * dstFormat - format of destination color array
2447 * dest - the destination color array
2448 * srcFormat - source image format
2449 * srcType - source image datatype
2450 * source - source image pointer
2451 * srcPacking - pixel unpacking parameters
2452 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2454 * XXX perhaps expand this to process whole images someday.
2457 _mesa_unpack_chan_color_span( GLcontext
*ctx
,
2458 GLuint n
, GLenum dstFormat
, GLchan dest
[],
2459 GLenum srcFormat
, GLenum srcType
,
2460 const GLvoid
*source
,
2461 const struct gl_pixelstore_attrib
*srcPacking
,
2462 GLuint transferOps
)
2464 ASSERT(dstFormat
== GL_ALPHA
||
2465 dstFormat
== GL_LUMINANCE
||
2466 dstFormat
== GL_LUMINANCE_ALPHA
||
2467 dstFormat
== GL_INTENSITY
||
2468 dstFormat
== GL_RGB
||
2469 dstFormat
== GL_RGBA
||
2470 dstFormat
== GL_COLOR_INDEX
);
2472 ASSERT(srcFormat
== GL_RED
||
2473 srcFormat
== GL_GREEN
||
2474 srcFormat
== GL_BLUE
||
2475 srcFormat
== GL_ALPHA
||
2476 srcFormat
== GL_LUMINANCE
||
2477 srcFormat
== GL_LUMINANCE_ALPHA
||
2478 srcFormat
== GL_INTENSITY
||
2479 srcFormat
== GL_RGB
||
2480 srcFormat
== GL_BGR
||
2481 srcFormat
== GL_RGBA
||
2482 srcFormat
== GL_BGRA
||
2483 srcFormat
== GL_ABGR_EXT
||
2484 srcFormat
== GL_COLOR_INDEX
);
2486 ASSERT(srcType
== GL_BITMAP
||
2487 srcType
== GL_UNSIGNED_BYTE
||
2488 srcType
== GL_BYTE
||
2489 srcType
== GL_UNSIGNED_SHORT
||
2490 srcType
== GL_SHORT
||
2491 srcType
== GL_UNSIGNED_INT
||
2492 srcType
== GL_INT
||
2493 srcType
== GL_FLOAT
||
2494 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2495 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2496 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2497 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2498 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2499 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2500 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2501 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2502 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2503 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2504 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2505 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2507 /* Try simple cases first */
2508 if (transferOps
== 0 && srcType
== CHAN_TYPE
) {
2509 if (dstFormat
== GL_RGBA
) {
2510 if (srcFormat
== GL_RGBA
) {
2511 MEMCPY( dest
, source
, n
* 4 * sizeof(GLchan
) );
2514 else if (srcFormat
== GL_RGB
) {
2516 const GLchan
*src
= (const GLchan
*) source
;
2518 for (i
= 0; i
< n
; i
++) {
2529 else if (dstFormat
== GL_RGB
) {
2530 if (srcFormat
== GL_RGB
) {
2531 MEMCPY( dest
, source
, n
* 3 * sizeof(GLchan
) );
2534 else if (srcFormat
== GL_RGBA
) {
2536 const GLchan
*src
= (const GLchan
*) source
;
2538 for (i
= 0; i
< n
; i
++) {
2548 else if (dstFormat
== srcFormat
) {
2549 GLint comps
= _mesa_components_in_format(srcFormat
);
2551 MEMCPY( dest
, source
, n
* comps
* sizeof(GLchan
) );
2557 /* general solution begins here */
2559 GLfloat rgba
[MAX_WIDTH
][4];
2560 GLint dstComponents
;
2561 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2562 GLint dstLuminanceIndex
, dstIntensityIndex
;
2564 dstComponents
= _mesa_components_in_format( dstFormat
);
2565 /* source & dest image formats should have been error checked by now */
2566 assert(dstComponents
> 0);
2569 * Extract image data and convert to RGBA floats
2571 assert(n
<= MAX_WIDTH
);
2572 if (srcFormat
== GL_COLOR_INDEX
) {
2573 GLuint indexes
[MAX_WIDTH
];
2574 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2577 if (dstFormat
== GL_COLOR_INDEX
2578 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2579 _mesa_map_ci(ctx
, n
, indexes
);
2581 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2582 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2585 if (dstFormat
== GL_COLOR_INDEX
) {
2586 /* convert to GLchan and return */
2588 for (i
= 0; i
< n
; i
++) {
2589 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2594 /* Convert indexes to RGBA */
2595 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2599 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2600 srcPacking
->SwapBytes
);
2602 /* scale and bias colors */
2603 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2604 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2605 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
2606 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
2607 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
2608 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
2610 /* color map lookup */
2611 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2612 _mesa_map_rgba(ctx
, n
, rgba
);
2617 /* GL_COLOR_TABLE lookup */
2618 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2619 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2622 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2623 /* this has to be done in the calling code */
2625 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
2626 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
2627 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2628 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
2629 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
2630 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
2631 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
2632 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
2633 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
2634 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
2635 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
2637 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2638 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2639 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2641 /* color matrix transform */
2642 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2643 _mesa_transform_rgba(ctx
, n
, rgba
);
2645 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2646 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2647 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2649 /* update histogram count */
2650 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2651 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2654 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2655 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2659 /* clamp to [0,1] */
2662 for (i
= 0; i
< n
; i
++) {
2663 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2664 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2665 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2666 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2670 /* Now determine which color channels we need to produce.
2671 * And determine the dest index (offset) within each color tuple.
2673 switch (dstFormat
) {
2676 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2677 dstLuminanceIndex
= dstIntensityIndex
= -1;
2680 dstLuminanceIndex
= 0;
2681 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2682 dstIntensityIndex
= -1;
2684 case GL_LUMINANCE_ALPHA
:
2685 dstLuminanceIndex
= 0;
2687 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2688 dstIntensityIndex
= -1;
2691 dstIntensityIndex
= 0;
2692 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2693 dstLuminanceIndex
= -1;
2699 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2706 dstLuminanceIndex
= dstIntensityIndex
= -1;
2709 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
2714 /* Now return the GLchan data in the requested dstFormat */
2716 if (dstRedIndex
>= 0) {
2719 for (i
= 0; i
< n
; i
++) {
2720 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
2721 dst
+= dstComponents
;
2725 if (dstGreenIndex
>= 0) {
2728 for (i
= 0; i
< n
; i
++) {
2729 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
2730 dst
+= dstComponents
;
2734 if (dstBlueIndex
>= 0) {
2737 for (i
= 0; i
< n
; i
++) {
2738 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
2739 dst
+= dstComponents
;
2743 if (dstAlphaIndex
>= 0) {
2746 for (i
= 0; i
< n
; i
++) {
2747 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
2748 dst
+= dstComponents
;
2752 if (dstIntensityIndex
>= 0) {
2755 assert(dstIntensityIndex
== 0);
2756 assert(dstComponents
== 1);
2757 for (i
= 0; i
< n
; i
++) {
2758 /* Intensity comes from red channel */
2759 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
2763 if (dstLuminanceIndex
>= 0) {
2766 assert(dstLuminanceIndex
== 0);
2767 for (i
= 0; i
< n
; i
++) {
2768 /* Luminance comes from red channel */
2769 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
2770 dst
+= dstComponents
;
2778 _mesa_unpack_float_color_span( GLcontext
*ctx
,
2779 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
2780 GLenum srcFormat
, GLenum srcType
,
2781 const GLvoid
*source
,
2782 const struct gl_pixelstore_attrib
*srcPacking
,
2783 GLuint transferOps
, GLboolean clamp
)
2785 ASSERT(dstFormat
== GL_ALPHA
||
2786 dstFormat
== GL_LUMINANCE
||
2787 dstFormat
== GL_LUMINANCE_ALPHA
||
2788 dstFormat
== GL_INTENSITY
||
2789 dstFormat
== GL_RGB
||
2790 dstFormat
== GL_RGBA
||
2791 dstFormat
== GL_COLOR_INDEX
);
2793 ASSERT(srcFormat
== GL_RED
||
2794 srcFormat
== GL_GREEN
||
2795 srcFormat
== GL_BLUE
||
2796 srcFormat
== GL_ALPHA
||
2797 srcFormat
== GL_LUMINANCE
||
2798 srcFormat
== GL_LUMINANCE_ALPHA
||
2799 srcFormat
== GL_INTENSITY
||
2800 srcFormat
== GL_RGB
||
2801 srcFormat
== GL_BGR
||
2802 srcFormat
== GL_RGBA
||
2803 srcFormat
== GL_BGRA
||
2804 srcFormat
== GL_ABGR_EXT
||
2805 srcFormat
== GL_COLOR_INDEX
);
2807 ASSERT(srcType
== GL_BITMAP
||
2808 srcType
== GL_UNSIGNED_BYTE
||
2809 srcType
== GL_BYTE
||
2810 srcType
== GL_UNSIGNED_SHORT
||
2811 srcType
== GL_SHORT
||
2812 srcType
== GL_UNSIGNED_INT
||
2813 srcType
== GL_INT
||
2814 srcType
== GL_FLOAT
||
2815 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2816 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2817 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2818 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2819 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2820 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2821 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2822 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2823 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2824 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2825 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2826 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2828 /* general solution, no special cases, yet */
2830 GLfloat rgba
[MAX_WIDTH
][4];
2831 GLint dstComponents
;
2832 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2833 GLint dstLuminanceIndex
, dstIntensityIndex
;
2835 dstComponents
= _mesa_components_in_format( dstFormat
);
2836 /* source & dest image formats should have been error checked by now */
2837 assert(dstComponents
> 0);
2840 * Extract image data and convert to RGBA floats
2842 assert(n
<= MAX_WIDTH
);
2843 if (srcFormat
== GL_COLOR_INDEX
) {
2844 GLuint indexes
[MAX_WIDTH
];
2845 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2848 if (dstFormat
== GL_COLOR_INDEX
2849 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2850 _mesa_map_ci(ctx
, n
, indexes
);
2852 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2853 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2856 if (dstFormat
== GL_COLOR_INDEX
) {
2857 /* convert to GLchan and return */
2859 for (i
= 0; i
< n
; i
++) {
2860 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2865 /* Convert indexes to RGBA */
2866 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2870 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2871 srcPacking
->SwapBytes
);
2873 /* scale and bias colors */
2874 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2875 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2876 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
2877 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
2878 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
2879 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
2881 /* color map lookup */
2882 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2883 _mesa_map_rgba(ctx
, n
, rgba
);
2888 /* GL_COLOR_TABLE lookup */
2889 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2890 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2893 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2896 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
2897 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
2898 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2899 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
2900 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
2901 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
2902 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
2903 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
2904 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
2905 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
2906 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
2908 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2909 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2910 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2912 /* color matrix transform */
2913 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2914 _mesa_transform_rgba(ctx
, n
, rgba
);
2916 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2917 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2918 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2920 /* update histogram count */
2921 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2922 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2925 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2926 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2930 /* clamp to [0,1] */
2933 for (i
= 0; i
< n
; i
++) {
2934 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2935 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2936 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2937 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2941 /* Now determine which color channels we need to produce.
2942 * And determine the dest index (offset) within each color tuple.
2944 switch (dstFormat
) {
2947 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2948 dstLuminanceIndex
= dstIntensityIndex
= -1;
2951 dstLuminanceIndex
= 0;
2952 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2953 dstIntensityIndex
= -1;
2955 case GL_LUMINANCE_ALPHA
:
2956 dstLuminanceIndex
= 0;
2958 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2959 dstIntensityIndex
= -1;
2962 dstIntensityIndex
= 0;
2963 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2964 dstLuminanceIndex
= -1;
2970 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2977 dstLuminanceIndex
= dstIntensityIndex
= -1;
2980 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_float_color_span()");
2984 /* Now pack results in the requested dstFormat */
2985 if (dstRedIndex
>= 0) {
2986 GLfloat
*dst
= dest
;
2988 for (i
= 0; i
< n
; i
++) {
2989 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
2990 dst
+= dstComponents
;
2994 if (dstGreenIndex
>= 0) {
2995 GLfloat
*dst
= dest
;
2997 for (i
= 0; i
< n
; i
++) {
2998 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
2999 dst
+= dstComponents
;
3003 if (dstBlueIndex
>= 0) {
3004 GLfloat
*dst
= dest
;
3006 for (i
= 0; i
< n
; i
++) {
3007 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
3008 dst
+= dstComponents
;
3012 if (dstAlphaIndex
>= 0) {
3013 GLfloat
*dst
= dest
;
3015 for (i
= 0; i
< n
; i
++) {
3016 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
3017 dst
+= dstComponents
;
3021 if (dstIntensityIndex
>= 0) {
3022 GLfloat
*dst
= dest
;
3024 assert(dstIntensityIndex
== 0);
3025 assert(dstComponents
== 1);
3026 for (i
= 0; i
< n
; i
++) {
3027 /* Intensity comes from red channel */
3028 dst
[i
] = rgba
[i
][RCOMP
];
3032 if (dstLuminanceIndex
>= 0) {
3033 GLfloat
*dst
= dest
;
3035 assert(dstLuminanceIndex
== 0);
3036 for (i
= 0; i
< n
; i
++) {
3037 /* Luminance comes from red channel */
3038 dst
[0] = rgba
[i
][RCOMP
];
3039 dst
+= dstComponents
;
3049 * Unpack a row of color index data from a client buffer according to
3050 * the pixel unpacking parameters.
3051 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3053 * Args: ctx - the context
3054 * n - number of pixels
3055 * dstType - destination datatype
3056 * dest - destination array
3057 * srcType - source pixel type
3058 * source - source data pointer
3059 * srcPacking - pixel unpacking parameters
3060 * transferOps - the pixel transfer operations to apply
3063 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
3064 GLenum dstType
, GLvoid
*dest
,
3065 GLenum srcType
, const GLvoid
*source
,
3066 const struct gl_pixelstore_attrib
*srcPacking
,
3067 GLuint transferOps
)
3069 ASSERT(srcType
== GL_BITMAP
||
3070 srcType
== GL_UNSIGNED_BYTE
||
3071 srcType
== GL_BYTE
||
3072 srcType
== GL_UNSIGNED_SHORT
||
3073 srcType
== GL_SHORT
||
3074 srcType
== GL_UNSIGNED_INT
||
3075 srcType
== GL_INT
||
3076 srcType
== GL_FLOAT
);
3078 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3079 dstType
== GL_UNSIGNED_SHORT
||
3080 dstType
== GL_UNSIGNED_INT
);
3083 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3086 * Try simple cases first
3088 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3089 && dstType
== GL_UNSIGNED_BYTE
) {
3090 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3092 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3093 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3094 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3100 GLuint indexes
[MAX_WIDTH
];
3101 assert(n
<= MAX_WIDTH
);
3103 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3106 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3107 /* shift and offset indexes */
3108 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3110 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3111 /* Apply lookup table */
3112 _mesa_map_ci(ctx
, n
, indexes
);
3115 /* convert to dest type */
3117 case GL_UNSIGNED_BYTE
:
3119 GLubyte
*dst
= (GLubyte
*) dest
;
3121 for (i
= 0; i
< n
; i
++) {
3122 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3126 case GL_UNSIGNED_SHORT
:
3128 GLuint
*dst
= (GLuint
*) dest
;
3130 for (i
= 0; i
< n
; i
++) {
3131 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3135 case GL_UNSIGNED_INT
:
3136 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3139 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3146 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
3147 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
3148 const struct gl_pixelstore_attrib
*dstPacking
,
3149 GLuint transferOps
)
3151 GLuint indexes
[MAX_WIDTH
];
3153 ASSERT(n
<= MAX_WIDTH
);
3155 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3157 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
3158 /* make a copy of input */
3159 MEMCPY(indexes
, source
, n
* sizeof(GLuint
));
3160 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3161 _mesa_shift_and_offset_ci( ctx
, n
, indexes
);
3163 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3164 _mesa_map_ci(ctx
, n
, indexes
);
3170 case GL_UNSIGNED_BYTE
:
3172 GLubyte
*dst
= (GLubyte
*) dest
;
3174 for (i
= 0; i
< n
; i
++) {
3175 *dst
++ = (GLubyte
) source
[i
];
3181 GLbyte
*dst
= (GLbyte
*) dest
;
3183 for (i
= 0; i
< n
; i
++) {
3184 dst
[i
] = (GLbyte
) indexes
[i
];
3188 case GL_UNSIGNED_SHORT
:
3190 GLushort
*dst
= (GLushort
*) dest
;
3192 for (i
= 0; i
< n
; i
++) {
3193 dst
[i
] = (GLushort
) indexes
[i
];
3195 if (dstPacking
->SwapBytes
) {
3196 _mesa_swap2( (GLushort
*) dst
, n
);
3202 GLshort
*dst
= (GLshort
*) dest
;
3204 for (i
= 0; i
< n
; i
++) {
3205 dst
[i
] = (GLshort
) indexes
[i
];
3207 if (dstPacking
->SwapBytes
) {
3208 _mesa_swap2( (GLushort
*) dst
, n
);
3212 case GL_UNSIGNED_INT
:
3214 GLuint
*dst
= (GLuint
*) dest
;
3216 for (i
= 0; i
< n
; i
++) {
3217 dst
[i
] = (GLuint
) indexes
[i
];
3219 if (dstPacking
->SwapBytes
) {
3220 _mesa_swap4( (GLuint
*) dst
, n
);
3226 GLint
*dst
= (GLint
*) dest
;
3228 for (i
= 0; i
< n
; i
++) {
3229 dst
[i
] = (GLint
) indexes
[i
];
3231 if (dstPacking
->SwapBytes
) {
3232 _mesa_swap4( (GLuint
*) dst
, n
);
3238 GLfloat
*dst
= (GLfloat
*) dest
;
3240 for (i
= 0; i
< n
; i
++) {
3241 dst
[i
] = (GLfloat
) indexes
[i
];
3243 if (dstPacking
->SwapBytes
) {
3244 _mesa_swap4( (GLuint
*) dst
, n
);
3249 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3256 * Unpack a row of stencil data from a client buffer according to
3257 * the pixel unpacking parameters.
3258 * This is (or will be) used by glDrawPixels
3260 * Args: ctx - the context
3261 * n - number of pixels
3262 * dstType - destination datatype
3263 * dest - destination array
3264 * srcType - source pixel type
3265 * source - source data pointer
3266 * srcPacking - pixel unpacking parameters
3267 * transferOps - apply offset/bias/lookup ops?
3270 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3271 GLenum dstType
, GLvoid
*dest
,
3272 GLenum srcType
, const GLvoid
*source
,
3273 const struct gl_pixelstore_attrib
*srcPacking
,
3274 GLuint transferOps
)
3276 ASSERT(srcType
== GL_BITMAP
||
3277 srcType
== GL_UNSIGNED_BYTE
||
3278 srcType
== GL_BYTE
||
3279 srcType
== GL_UNSIGNED_SHORT
||
3280 srcType
== GL_SHORT
||
3281 srcType
== GL_UNSIGNED_INT
||
3282 srcType
== GL_INT
||
3283 srcType
== GL_FLOAT
);
3285 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3286 dstType
== GL_UNSIGNED_SHORT
||
3287 dstType
== GL_UNSIGNED_INT
);
3289 /* only shift and offset apply to stencil */
3290 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3293 * Try simple cases first
3295 if (transferOps
== 0 &&
3296 srcType
== GL_UNSIGNED_BYTE
&&
3297 dstType
== GL_UNSIGNED_BYTE
) {
3298 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3300 else if (transferOps
== 0 &&
3301 srcType
== GL_UNSIGNED_INT
&&
3302 dstType
== GL_UNSIGNED_INT
&&
3303 !srcPacking
->SwapBytes
) {
3304 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3310 GLuint indexes
[MAX_WIDTH
];
3311 assert(n
<= MAX_WIDTH
);
3313 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3317 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3318 /* shift and offset indexes */
3319 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3322 if (ctx
->Pixel
.MapStencilFlag
) {
3323 /* Apply stencil lookup table */
3324 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
3327 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
3332 /* convert to dest type */
3334 case GL_UNSIGNED_BYTE
:
3336 GLubyte
*dst
= (GLubyte
*) dest
;
3338 for (i
= 0; i
< n
; i
++) {
3339 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3343 case GL_UNSIGNED_SHORT
:
3345 GLuint
*dst
= (GLuint
*) dest
;
3347 for (i
= 0; i
< n
; i
++) {
3348 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3352 case GL_UNSIGNED_INT
:
3353 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3356 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3363 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3364 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
3365 const struct gl_pixelstore_attrib
*dstPacking
)
3367 GLstencil stencil
[MAX_WIDTH
];
3369 ASSERT(n
<= MAX_WIDTH
);
3371 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
3372 ctx
->Pixel
.MapStencilFlag
) {
3373 /* make a copy of input */
3374 MEMCPY(stencil
, source
, n
* sizeof(GLstencil
));
3375 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
3376 _mesa_shift_and_offset_stencil( ctx
, n
, stencil
);
3378 if (ctx
->Pixel
.MapStencilFlag
) {
3379 _mesa_map_stencil( ctx
, n
, stencil
);
3385 case GL_UNSIGNED_BYTE
:
3386 if (sizeof(GLstencil
) == 8) {
3387 MEMCPY( dest
, source
, n
);
3390 GLubyte
*dst
= (GLubyte
*) dest
;
3393 dst
[i
] = (GLubyte
) source
[i
];
3398 if (sizeof(GLstencil
) == 8) {
3399 MEMCPY( dest
, source
, n
);
3402 GLbyte
*dst
= (GLbyte
*) dest
;
3405 dst
[i
] = (GLbyte
) source
[i
];
3409 case GL_UNSIGNED_SHORT
:
3411 GLushort
*dst
= (GLushort
*) dest
;
3414 dst
[i
] = (GLushort
) source
[i
];
3416 if (dstPacking
->SwapBytes
) {
3417 _mesa_swap2( (GLushort
*) dst
, n
);
3423 GLshort
*dst
= (GLshort
*) dest
;
3426 dst
[i
] = (GLshort
) source
[i
];
3428 if (dstPacking
->SwapBytes
) {
3429 _mesa_swap2( (GLushort
*) dst
, n
);
3433 case GL_UNSIGNED_INT
:
3435 GLuint
*dst
= (GLuint
*) dest
;
3438 dst
[i
] = (GLuint
) source
[i
];
3440 if (dstPacking
->SwapBytes
) {
3441 _mesa_swap4( (GLuint
*) dst
, n
);
3447 GLint
*dst
= (GLint
*) dest
;
3450 *dst
++ = (GLint
) source
[i
];
3452 if (dstPacking
->SwapBytes
) {
3453 _mesa_swap4( (GLuint
*) dst
, n
);
3459 GLfloat
*dst
= (GLfloat
*) dest
;
3462 dst
[i
] = (GLfloat
) source
[i
];
3464 if (dstPacking
->SwapBytes
) {
3465 _mesa_swap4( (GLuint
*) dst
, n
);
3470 if (dstPacking
->LsbFirst
) {
3471 GLubyte
*dst
= (GLubyte
*) dest
;
3474 for (i
= 0; i
< n
; i
++) {
3477 *dst
|= ((source
[i
] != 0) << shift
);
3486 GLubyte
*dst
= (GLubyte
*) dest
;
3489 for (i
= 0; i
< n
; i
++) {
3492 *dst
|= ((source
[i
] != 0) << shift
);
3502 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3509 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLfloat
*dest
,
3510 GLenum srcType
, const GLvoid
*source
,
3511 const struct gl_pixelstore_attrib
*srcPacking
)
3517 const GLubyte
*src
= (const GLubyte
*) source
;
3518 for (i
= 0; i
< n
; i
++) {
3519 dest
[i
] = BYTE_TO_FLOAT(src
[i
]);
3523 case GL_UNSIGNED_BYTE
:
3526 const GLubyte
*src
= (const GLubyte
*) source
;
3527 for (i
= 0; i
< n
; i
++) {
3528 dest
[i
] = UBYTE_TO_FLOAT(src
[i
]);
3535 const GLshort
*src
= (const GLshort
*) source
;
3536 for (i
= 0; i
< n
; i
++) {
3537 dest
[i
] = SHORT_TO_FLOAT(src
[i
]);
3541 case GL_UNSIGNED_SHORT
:
3544 const GLushort
*src
= (const GLushort
*) source
;
3545 for (i
= 0; i
< n
; i
++) {
3546 dest
[i
] = USHORT_TO_FLOAT(src
[i
]);
3553 const GLint
*src
= (const GLint
*) source
;
3554 for (i
= 0; i
< n
; i
++) {
3555 dest
[i
] = INT_TO_FLOAT(src
[i
]);
3559 case GL_UNSIGNED_INT
:
3562 const GLuint
*src
= (const GLuint
*) source
;
3563 for (i
= 0; i
< n
; i
++) {
3564 dest
[i
] = UINT_TO_FLOAT(src
[i
]);
3569 MEMCPY(dest
, source
, n
* sizeof(GLfloat
));
3572 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3577 /* apply depth scale and bias and clamp to [0,1] */
3578 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3580 for (i
= 0; i
< n
; i
++) {
3581 GLfloat d
= dest
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3582 dest
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
3590 * Pack an array of depth values. The values are floats in [0,1].
3593 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
3594 GLenum dstType
, const GLfloat
*depthSpan
,
3595 const struct gl_pixelstore_attrib
*dstPacking
)
3597 GLfloat depthCopy
[MAX_WIDTH
];
3598 const GLboolean bias_or_scale
= ctx
->Pixel
.DepthBias
!= 0.0 ||
3599 ctx
->Pixel
.DepthScale
!= 1.0;
3601 ASSERT(n
<= MAX_WIDTH
);
3603 if (bias_or_scale
) {
3605 for (i
= 0; i
< n
; i
++) {
3607 d
= depthSpan
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3608 depthCopy
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
3610 depthSpan
= depthCopy
;
3614 case GL_UNSIGNED_BYTE
:
3616 GLubyte
*dst
= (GLubyte
*) dest
;
3618 for (i
= 0; i
< n
; i
++) {
3619 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
3625 GLbyte
*dst
= (GLbyte
*) dest
;
3627 for (i
= 0; i
< n
; i
++) {
3628 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
3632 case GL_UNSIGNED_SHORT
:
3634 GLushort
*dst
= (GLushort
*) dest
;
3636 for (i
= 0; i
< n
; i
++) {
3637 dst
[i
] = FLOAT_TO_USHORT( depthSpan
[i
] );
3639 if (dstPacking
->SwapBytes
) {
3640 _mesa_swap2( (GLushort
*) dst
, n
);
3646 GLshort
*dst
= (GLshort
*) dest
;
3648 for (i
= 0; i
< n
; i
++) {
3649 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
3651 if (dstPacking
->SwapBytes
) {
3652 _mesa_swap2( (GLushort
*) dst
, n
);
3656 case GL_UNSIGNED_INT
:
3658 GLuint
*dst
= (GLuint
*) dest
;
3660 for (i
= 0; i
< n
; i
++) {
3661 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
3663 if (dstPacking
->SwapBytes
) {
3664 _mesa_swap4( (GLuint
*) dst
, n
);
3670 GLint
*dst
= (GLint
*) dest
;
3672 for (i
= 0; i
< n
; i
++) {
3673 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
3675 if (dstPacking
->SwapBytes
) {
3676 _mesa_swap4( (GLuint
*) dst
, n
);
3682 GLfloat
*dst
= (GLfloat
*) dest
;
3684 for (i
= 0; i
< n
; i
++) {
3685 dst
[i
] = depthSpan
[i
];
3687 if (dstPacking
->SwapBytes
) {
3688 _mesa_swap4( (GLuint
*) dst
, n
);
3693 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
3701 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
3702 * Return all image data in a contiguous block.
3705 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
3706 GLenum format
, GLenum type
, const GLvoid
*pixels
,
3707 const struct gl_pixelstore_attrib
*unpack
)
3709 GLint bytesPerRow
, compsPerRow
;
3710 GLboolean flipBytes
, swap2
, swap4
;
3713 return NULL
; /* not necessarily an error */
3715 if (width
<= 0 || height
<= 0 || depth
<= 0)
3716 return NULL
; /* generate error later */
3718 if (format
== GL_BITMAP
) {
3719 bytesPerRow
= (width
+ 7) >> 3;
3720 flipBytes
= !unpack
->LsbFirst
;
3721 swap2
= swap4
= GL_FALSE
;
3725 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
3726 const GLint components
= _mesa_components_in_format(format
);
3728 if (bytesPerPixel
<= 0 || components
<= 0)
3729 return NULL
; /* bad format or type. generate error later */
3730 bytesPerRow
= bytesPerPixel
* width
;
3731 bytesPerComp
= bytesPerPixel
/ components
;
3732 flipBytes
= GL_FALSE
;
3733 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
3734 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
3735 compsPerRow
= components
* width
;
3736 assert(compsPerRow
>= width
);
3740 GLubyte
*destBuffer
= (GLubyte
*) MALLOC(bytesPerRow
* height
* depth
);
3744 return NULL
; /* generate GL_OUT_OF_MEMORY later */
3747 for (img
= 0; img
< depth
; img
++) {
3748 for (row
= 0; row
< height
; row
++) {
3749 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
3750 width
, height
, format
, type
, img
, row
, 0);
3751 MEMCPY(dst
, src
, bytesPerRow
);
3752 /* byte flipping/swapping */
3754 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
3757 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
3760 _mesa_swap4((GLuint
*) dst
, compsPerRow
);