1 /* $Id: image.c,v 1.65 2002/03/19 16:47:04 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2002 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 * Compute the stride between images in a 3D texture (in bytes) for the given
549 * pixel packing parameters and image width, format and type.
552 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
553 GLint width
, GLint height
,
554 GLenum format
, GLenum type
)
557 ASSERT(type
!= GL_BITMAP
);
560 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
561 GLint bytesPerRow
, bytesPerImage
, remainder
;
563 if (bytesPerPixel
<= 0)
564 return -1; /* error */
565 if (packing
->RowLength
== 0) {
566 bytesPerRow
= bytesPerPixel
* width
;
569 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
571 remainder
= bytesPerRow
% packing
->Alignment
;
573 bytesPerRow
+= (packing
->Alignment
- remainder
);
575 if (packing
->ImageHeight
== 0)
576 bytesPerImage
= bytesPerRow
* height
;
578 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
580 return bytesPerImage
;
588 * Unpack a 32x32 pixel polygon stipple from user memory using the
589 * current pixel unpack settings.
592 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
593 const struct gl_pixelstore_attrib
*unpacking
)
595 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap( 32, 32, pattern
, unpacking
);
597 /* Convert pattern from GLubytes to GLuints and handle big/little
602 for (i
= 0; i
< 32; i
++) {
603 dest
[i
] = (p
[0] << 24)
616 * Pack polygon stipple into user memory given current pixel packing
620 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
621 const struct gl_pixelstore_attrib
*packing
)
623 /* Convert pattern from GLuints to GLubytes to handle big/little
624 * endian differences.
628 for (i
= 0; i
< 32; i
++) {
629 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
630 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
631 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
632 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
635 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
640 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
641 * order with row alignment = 1 byte.
644 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
645 const struct gl_pixelstore_attrib
*packing
)
647 GLint bytes
, row
, width_in_bytes
;
648 GLubyte
*buffer
, *dst
;
653 /* Alloc dest storage */
654 bytes
= ((width
+ 7) / 8 * height
);
655 buffer
= (GLubyte
*) MALLOC( bytes
);
660 width_in_bytes
= CEILING( width
, 8 );
662 for (row
= 0; row
< height
; row
++) {
663 const GLubyte
*src
= (const GLubyte
*)
664 _mesa_image_address(packing
, pixels
, width
, height
,
665 GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0);
671 if (packing
->SkipPixels
== 0) {
672 MEMCPY( dst
, src
, width_in_bytes
);
673 if (packing
->LsbFirst
) {
674 flip_bytes( dst
, width_in_bytes
);
678 /* handling SkipPixels is a bit tricky (no pun intended!) */
680 if (packing
->LsbFirst
) {
681 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
682 GLubyte dstMask
= 128;
683 const GLubyte
*s
= src
;
686 for (i
= 0; i
< width
; i
++) {
690 if (srcMask
== 128) {
695 srcMask
= srcMask
<< 1;
703 dstMask
= dstMask
>> 1;
708 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
709 GLubyte dstMask
= 128;
710 const GLubyte
*s
= src
;
713 for (i
= 0; i
< width
; i
++) {
722 srcMask
= srcMask
>> 1;
730 dstMask
= dstMask
>> 1;
735 dst
+= width_in_bytes
;
746 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
747 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
749 GLint row
, width_in_bytes
;
755 width_in_bytes
= CEILING( width
, 8 );
757 for (row
= 0; row
< height
; row
++) {
758 GLubyte
*dst
= (GLubyte
*) _mesa_image_address( packing
, dest
,
759 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0 );
763 if (packing
->SkipPixels
== 0) {
764 MEMCPY( dst
, src
, width_in_bytes
);
765 if (packing
->LsbFirst
) {
766 flip_bytes( dst
, width_in_bytes
);
770 /* handling SkipPixels is a bit tricky (no pun intended!) */
772 if (packing
->LsbFirst
) {
773 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
774 GLubyte dstMask
= 128;
775 const GLubyte
*s
= src
;
778 for (i
= 0; i
< width
; i
++) {
782 if (srcMask
== 128) {
787 srcMask
= srcMask
<< 1;
795 dstMask
= dstMask
>> 1;
800 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
801 GLubyte dstMask
= 128;
802 const GLubyte
*s
= src
;
805 for (i
= 0; i
< width
; i
++) {
814 srcMask
= srcMask
>> 1;
822 dstMask
= dstMask
>> 1;
827 src
+= width_in_bytes
;
834 * Used to pack an array [][4] of RGBA GLchan colors as specified
835 * by the dstFormat, dstType and dstPacking. Used by glReadPixels,
836 * glGetConvolutionFilter(), etc.
839 _mesa_pack_float_rgba_span( GLcontext
*ctx
,
840 GLuint n
, CONST GLfloat rgbaIn
[][4],
841 GLenum dstFormat
, GLenum dstType
,
843 const struct gl_pixelstore_attrib
*dstPacking
,
846 const GLint comps
= _mesa_components_in_format(dstFormat
);
847 GLfloat luminance
[MAX_WIDTH
];
852 /* make copy of incoming data */
853 DEFMARRAY(GLfloat
, rgbaCopy
, MAX_WIDTH
, 4); /* mac 32k limitation */
854 CHECKARRAY(rgbaCopy
, return); /* mac 32k limitation */
856 for (i
= 0; i
< n
; i
++) {
857 rgbaCopy
[i
][0] = rgbaIn
[i
][0];
858 rgbaCopy
[i
][1] = rgbaIn
[i
][1];
859 rgbaCopy
[i
][2] = rgbaIn
[i
][2];
860 rgbaCopy
[i
][3] = rgbaIn
[i
][3];
863 rgba
= (GLfloat (*)[4]) rgbaCopy
;
866 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
867 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
868 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
869 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
870 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
871 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
873 /* color map lookup */
874 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
875 _mesa_map_rgba( ctx
, n
, rgba
);
877 /* GL_COLOR_TABLE lookup */
878 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
879 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
882 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
883 /* this has to be done in the calling code */
885 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
886 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
887 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
888 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
889 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
890 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
891 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
892 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
893 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
894 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
895 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
897 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
898 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
899 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
901 /* color matrix transform */
902 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
903 _mesa_transform_rgba(ctx
, n
, rgba
);
905 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
906 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
907 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
909 /* update histogram count */
910 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
911 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
914 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
915 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
916 if (ctx
->MinMax
.Sink
) {
917 UNDEFARRAY(rgbaCopy
); /* mac 32k limitation */
921 UNDEFARRAY(rgbaCopy
); /* mac 32k limitation */
924 /* use incoming data, not a copy */
925 rgba
= (GLfloat (*)[4]) rgbaIn
;
928 /* XXX clamp rgba to [0,1]? */
931 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
932 for (i
= 0; i
< n
; i
++) {
933 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
934 #if CHAN_TYPE == GL_FLOAT
937 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
943 * Pack/store the pixels. Ugh! Lots of cases!!!
946 case GL_UNSIGNED_BYTE
:
948 GLubyte
*dst
= (GLubyte
*) dstAddr
;
952 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
956 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
960 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
964 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
968 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
970 case GL_LUMINANCE_ALPHA
:
972 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
973 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
978 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
979 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
980 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
985 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
986 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
987 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
988 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
993 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
994 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
995 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1000 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1001 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1002 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1003 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1008 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1009 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1010 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1011 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1015 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1021 GLbyte
*dst
= (GLbyte
*) dstAddr
;
1022 switch (dstFormat
) {
1025 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1029 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1033 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1037 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1041 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
1043 case GL_LUMINANCE_ALPHA
:
1045 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
1046 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1051 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1052 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1053 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1058 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1059 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1060 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1061 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1066 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1067 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1068 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1073 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1074 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1075 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1076 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1080 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1081 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1082 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1083 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1087 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1091 case GL_UNSIGNED_SHORT
:
1093 GLushort
*dst
= (GLushort
*) dstAddr
;
1094 switch (dstFormat
) {
1097 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1101 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1105 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1109 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1113 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
1115 case GL_LUMINANCE_ALPHA
:
1117 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
1118 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1123 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1124 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1125 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1130 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1131 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1132 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1133 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1138 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1139 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1140 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1145 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1146 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1147 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1148 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1153 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1154 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1155 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1156 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1160 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1162 if (dstPacking
->SwapBytes
) {
1163 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1169 GLshort
*dst
= (GLshort
*) dstAddr
;
1170 switch (dstFormat
) {
1173 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1177 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1181 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1185 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1189 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1191 case GL_LUMINANCE_ALPHA
:
1193 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1194 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1199 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1200 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1201 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1206 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1207 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1208 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1209 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1214 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1215 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1216 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1221 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1222 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1223 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1224 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1228 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1229 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1230 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1231 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1235 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1237 if (dstPacking
->SwapBytes
) {
1238 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1242 case GL_UNSIGNED_INT
:
1244 GLuint
*dst
= (GLuint
*) dstAddr
;
1245 switch (dstFormat
) {
1248 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1252 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1256 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1260 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1264 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1266 case GL_LUMINANCE_ALPHA
:
1268 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1269 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1274 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1275 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1276 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1281 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1282 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1283 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1284 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1289 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1290 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1291 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1296 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1297 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1298 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1299 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1304 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1305 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1306 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1307 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1311 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1313 if (dstPacking
->SwapBytes
) {
1314 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1320 GLint
*dst
= (GLint
*) dstAddr
;
1321 switch (dstFormat
) {
1324 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1328 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1332 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1336 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1340 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1342 case GL_LUMINANCE_ALPHA
:
1344 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1345 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1350 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1351 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1352 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1357 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1358 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1359 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1360 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1365 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1366 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1367 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1372 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1373 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1374 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1375 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1380 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1381 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1382 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1383 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1387 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1389 if (dstPacking
->SwapBytes
) {
1390 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1396 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1397 switch (dstFormat
) {
1400 dst
[i
] = rgba
[i
][RCOMP
];
1404 dst
[i
] = rgba
[i
][GCOMP
];
1408 dst
[i
] = rgba
[i
][BCOMP
];
1412 dst
[i
] = rgba
[i
][ACOMP
];
1416 dst
[i
] = luminance
[i
];
1418 case GL_LUMINANCE_ALPHA
:
1420 dst
[i
*2+0] = luminance
[i
];
1421 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1426 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1427 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1428 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1433 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1434 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1435 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1436 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1441 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1442 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1443 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1448 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1449 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1450 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1451 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1456 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1457 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1458 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1459 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1463 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1465 if (dstPacking
->SwapBytes
) {
1466 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1470 case GL_UNSIGNED_BYTE_3_3_2
:
1471 if (dstFormat
== GL_RGB
) {
1472 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1474 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1475 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1476 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1480 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1481 if (dstFormat
== GL_RGB
) {
1482 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1484 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1485 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1486 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1490 case GL_UNSIGNED_SHORT_5_6_5
:
1491 if (dstFormat
== GL_RGB
) {
1492 GLushort
*dst
= (GLushort
*) dstAddr
;
1494 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1495 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1496 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1500 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1501 if (dstFormat
== GL_RGB
) {
1502 GLushort
*dst
= (GLushort
*) dstAddr
;
1504 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1505 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1506 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1510 case GL_UNSIGNED_SHORT_4_4_4_4
:
1511 if (dstFormat
== GL_RGBA
) {
1512 GLushort
*dst
= (GLushort
*) dstAddr
;
1514 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1515 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1516 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1517 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1520 else if (dstFormat
== GL_BGRA
) {
1521 GLushort
*dst
= (GLushort
*) dstAddr
;
1523 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 12)
1524 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1525 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 4)
1526 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1529 else if (dstFormat
== GL_ABGR_EXT
) {
1530 GLushort
*dst
= (GLushort
*) dstAddr
;
1532 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 4)
1533 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1534 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 12)
1535 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) );
1539 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1540 if (dstFormat
== GL_RGBA
) {
1541 GLushort
*dst
= (GLushort
*) dstAddr
;
1543 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1544 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1545 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1546 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1549 else if (dstFormat
== GL_BGRA
) {
1550 GLushort
*dst
= (GLushort
*) dstAddr
;
1552 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) )
1553 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1554 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 8)
1555 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1558 else if (dstFormat
== GL_ABGR_EXT
) {
1559 GLushort
*dst
= (GLushort
*) dstAddr
;
1561 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) )
1562 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1563 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1564 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12);
1568 case GL_UNSIGNED_SHORT_5_5_5_1
:
1569 if (dstFormat
== GL_RGBA
) {
1570 GLushort
*dst
= (GLushort
*) dstAddr
;
1572 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1573 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1574 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1575 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1578 else if (dstFormat
== GL_BGRA
) {
1579 GLushort
*dst
= (GLushort
*) dstAddr
;
1581 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11)
1582 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1583 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 1)
1584 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1587 else if (dstFormat
== GL_ABGR_EXT
) {
1588 GLushort
*dst
= (GLushort
*) dstAddr
;
1590 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) << 11)
1591 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 6)
1592 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 1)
1593 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) );
1597 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1598 if (dstFormat
== GL_RGBA
) {
1599 GLushort
*dst
= (GLushort
*) dstAddr
;
1601 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1602 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1603 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1604 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1607 else if (dstFormat
== GL_BGRA
) {
1608 GLushort
*dst
= (GLushort
*) dstAddr
;
1610 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) )
1611 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1612 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 10)
1613 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1616 else if (dstFormat
== GL_ABGR_EXT
) {
1617 GLushort
*dst
= (GLushort
*) dstAddr
;
1619 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) )
1620 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 5)
1621 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 10)
1622 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) << 15);
1626 case GL_UNSIGNED_INT_8_8_8_8
:
1627 if (dstFormat
== GL_RGBA
) {
1628 GLuint
*dst
= (GLuint
*) dstAddr
;
1630 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1631 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1632 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1633 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1636 else if (dstFormat
== GL_BGRA
) {
1637 GLuint
*dst
= (GLuint
*) dstAddr
;
1639 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1640 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1641 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1642 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1645 else if (dstFormat
== GL_ABGR_EXT
) {
1646 GLuint
*dst
= (GLuint
*) dstAddr
;
1648 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1649 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1650 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1651 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1655 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1656 if (dstFormat
== GL_RGBA
) {
1657 GLuint
*dst
= (GLuint
*) dstAddr
;
1659 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1660 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1661 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1662 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1665 else if (dstFormat
== GL_BGRA
) {
1666 GLuint
*dst
= (GLuint
*) dstAddr
;
1668 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1669 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1670 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1671 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1674 else if (dstFormat
== GL_ABGR_EXT
) {
1675 GLuint
*dst
= (GLuint
*) dstAddr
;
1677 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1678 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1679 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1680 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1684 case GL_UNSIGNED_INT_10_10_10_2
:
1685 if (dstFormat
== GL_RGBA
) {
1686 GLuint
*dst
= (GLuint
*) dstAddr
;
1688 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1689 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1690 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1691 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1694 else if (dstFormat
== GL_BGRA
) {
1695 GLuint
*dst
= (GLuint
*) dstAddr
;
1697 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1698 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1699 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1700 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1703 else if (dstFormat
== GL_ABGR_EXT
) {
1704 GLuint
*dst
= (GLuint
*) dstAddr
;
1706 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1707 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1708 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1709 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1713 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1714 if (dstFormat
== GL_RGBA
) {
1715 GLuint
*dst
= (GLuint
*) dstAddr
;
1717 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1718 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1719 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1720 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1723 else if (dstFormat
== GL_BGRA
) {
1724 GLuint
*dst
= (GLuint
*) dstAddr
;
1726 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1727 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1728 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1729 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1732 else if (dstFormat
== GL_ABGR_EXT
) {
1733 GLuint
*dst
= (GLuint
*) dstAddr
;
1735 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1736 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1737 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1738 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1743 _mesa_problem(ctx
, "bad type in _mesa_pack_float_rgba_span");
1750 * Pack the given RGBA span into client memory at 'dest' address
1751 * in the given pixel format and type.
1752 * Optionally apply the enabled pixel transfer ops.
1753 * Pack into memory using the given packing params struct.
1754 * This is used by glReadPixels and glGetTexImage?D()
1755 * Input: ctx - the context
1756 * n - number of pixels in the span
1758 * format - dest packing format
1759 * type - dest packing datatype
1760 * destination - destination packing address
1761 * packing - pixel packing parameters
1762 * transferOps - bitmask of IMAGE_*_BIT operations to apply
1765 _mesa_pack_rgba_span( GLcontext
*ctx
,
1766 GLuint n
, CONST GLchan srcRgba
[][4],
1767 GLenum dstFormat
, GLenum dstType
,
1769 const struct gl_pixelstore_attrib
*dstPacking
,
1772 ASSERT((ctx
->NewState
& _NEW_PIXEL
) == 0 || transferOps
== 0);
1774 /* Test for optimized case first */
1775 if (transferOps
== 0 && dstFormat
== GL_RGBA
&& dstType
== CHAN_TYPE
) {
1776 /* common simple case */
1777 MEMCPY(dstAddr
, srcRgba
, n
* 4 * sizeof(GLchan
));
1779 else if (transferOps
== 0 && dstFormat
== GL_RGB
&& dstType
== CHAN_TYPE
) {
1780 /* common simple case */
1782 GLchan
*dest
= (GLchan
*) dstAddr
;
1783 for (i
= 0; i
< n
; i
++) {
1784 dest
[0] = srcRgba
[i
][RCOMP
];
1785 dest
[1] = srcRgba
[i
][GCOMP
];
1786 dest
[2] = srcRgba
[i
][BCOMP
];
1790 else if (transferOps
== 0 && dstFormat
== GL_RGBA
&& dstType
== GL_UNSIGNED_BYTE
) {
1791 /* common simple case */
1793 GLubyte
*dest
= (GLubyte
*) dstAddr
;
1794 for (i
= 0; i
< n
; i
++) {
1795 dest
[0] = CHAN_TO_UBYTE(srcRgba
[i
][RCOMP
]);
1796 dest
[1] = CHAN_TO_UBYTE(srcRgba
[i
][GCOMP
]);
1797 dest
[2] = CHAN_TO_UBYTE(srcRgba
[i
][BCOMP
]);
1798 dest
[3] = CHAN_TO_UBYTE(srcRgba
[i
][ACOMP
]);
1803 /* general solution */
1805 DEFMARRAY(GLfloat
, rgba
, MAX_WIDTH
, 4); /* mac 32k limitation */
1806 CHECKARRAY(rgba
, return); /* mac 32k limitation */
1808 assert(n
<= MAX_WIDTH
);
1809 /* convert color components to floating point */
1811 rgba
[i
][RCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][RCOMP
]);
1812 rgba
[i
][GCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][GCOMP
]);
1813 rgba
[i
][BCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][BCOMP
]);
1814 rgba
[i
][ACOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][ACOMP
]);
1816 _mesa_pack_float_rgba_span(ctx
, n
, (const GLfloat (*)[4]) rgba
,
1817 dstFormat
, dstType
, dstAddr
,
1818 dstPacking
, transferOps
);
1819 UNDEFARRAY(rgba
); /* mac 32k limitation */
1824 #define SWAP2BYTE(VALUE) \
1826 GLubyte *bytes = (GLubyte *) &(VALUE); \
1827 GLubyte tmp = bytes[0]; \
1828 bytes[0] = bytes[1]; \
1832 #define SWAP4BYTE(VALUE) \
1834 GLubyte *bytes = (GLubyte *) &(VALUE); \
1835 GLubyte tmp = bytes[0]; \
1836 bytes[0] = bytes[3]; \
1839 bytes[1] = bytes[2]; \
1845 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1846 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1847 const struct gl_pixelstore_attrib
*unpack
)
1849 assert(srcFormat
== GL_COLOR_INDEX
);
1851 ASSERT(srcType
== GL_BITMAP
||
1852 srcType
== GL_UNSIGNED_BYTE
||
1853 srcType
== GL_BYTE
||
1854 srcType
== GL_UNSIGNED_SHORT
||
1855 srcType
== GL_SHORT
||
1856 srcType
== GL_UNSIGNED_INT
||
1857 srcType
== GL_INT
||
1858 srcType
== GL_FLOAT
);
1863 GLubyte
*ubsrc
= (GLubyte
*) src
;
1864 if (unpack
->LsbFirst
) {
1865 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1867 for (i
= 0; i
< n
; i
++) {
1868 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1879 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1881 for (i
= 0; i
< n
; i
++) {
1882 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1894 case GL_UNSIGNED_BYTE
:
1897 const GLubyte
*s
= (const GLubyte
*) src
;
1898 for (i
= 0; i
< n
; i
++)
1905 const GLbyte
*s
= (const GLbyte
*) src
;
1906 for (i
= 0; i
< n
; i
++)
1910 case GL_UNSIGNED_SHORT
:
1913 const GLushort
*s
= (const GLushort
*) src
;
1914 if (unpack
->SwapBytes
) {
1915 for (i
= 0; i
< n
; i
++) {
1916 GLushort value
= s
[i
];
1922 for (i
= 0; i
< n
; i
++)
1930 const GLshort
*s
= (const GLshort
*) src
;
1931 if (unpack
->SwapBytes
) {
1932 for (i
= 0; i
< n
; i
++) {
1933 GLshort value
= s
[i
];
1939 for (i
= 0; i
< n
; i
++)
1944 case GL_UNSIGNED_INT
:
1947 const GLuint
*s
= (const GLuint
*) src
;
1948 if (unpack
->SwapBytes
) {
1949 for (i
= 0; i
< n
; i
++) {
1950 GLuint value
= s
[i
];
1956 for (i
= 0; i
< n
; i
++)
1964 const GLint
*s
= (const GLint
*) src
;
1965 if (unpack
->SwapBytes
) {
1966 for (i
= 0; i
< n
; i
++) {
1973 for (i
= 0; i
< n
; i
++)
1981 const GLfloat
*s
= (const GLfloat
*) src
;
1982 if (unpack
->SwapBytes
) {
1983 for (i
= 0; i
< n
; i
++) {
1984 GLfloat value
= s
[i
];
1986 indexes
[i
] = (GLuint
) value
;
1990 for (i
= 0; i
< n
; i
++)
1991 indexes
[i
] = (GLuint
) s
[i
];
1996 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2004 * This function extracts floating point RGBA values from arbitrary
2005 * image data. srcFormat and srcType are the format and type parameters
2006 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2008 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2009 * implements the "Conversion to floating point", "Conversion to RGB",
2010 * and "Final Expansion to RGBA" operations.
2012 * Args: n - number of pixels
2013 * rgba - output colors
2014 * srcFormat - format of incoming data
2015 * srcType - datatype of incoming data
2016 * src - source data pointer
2017 * swapBytes - perform byteswapping of incoming data?
2020 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2021 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2022 GLboolean swapBytes
)
2024 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
2026 GLint rComp
, bComp
, gComp
, aComp
;
2028 ASSERT(srcFormat
== GL_RED
||
2029 srcFormat
== GL_GREEN
||
2030 srcFormat
== GL_BLUE
||
2031 srcFormat
== GL_ALPHA
||
2032 srcFormat
== GL_LUMINANCE
||
2033 srcFormat
== GL_LUMINANCE_ALPHA
||
2034 srcFormat
== GL_INTENSITY
||
2035 srcFormat
== GL_RGB
||
2036 srcFormat
== GL_BGR
||
2037 srcFormat
== GL_RGBA
||
2038 srcFormat
== GL_BGRA
||
2039 srcFormat
== GL_ABGR_EXT
);
2041 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2042 srcType
== GL_BYTE
||
2043 srcType
== GL_UNSIGNED_SHORT
||
2044 srcType
== GL_SHORT
||
2045 srcType
== GL_UNSIGNED_INT
||
2046 srcType
== GL_INT
||
2047 srcType
== GL_FLOAT
||
2048 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2049 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2050 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2051 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2052 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2053 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2054 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2055 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2056 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2057 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2058 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2059 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2061 rComp
= gComp
= bComp
= aComp
= -1;
2063 switch (srcFormat
) {
2066 greenIndex
= blueIndex
= alphaIndex
= -1;
2071 redIndex
= blueIndex
= alphaIndex
= -1;
2076 redIndex
= greenIndex
= alphaIndex
= -1;
2080 redIndex
= greenIndex
= blueIndex
= -1;
2085 redIndex
= greenIndex
= blueIndex
= 0;
2089 case GL_LUMINANCE_ALPHA
:
2090 redIndex
= greenIndex
= blueIndex
= 0;
2095 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
2146 _mesa_problem(NULL
, "bad srcFormat in extract float data");
2151 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
2152 if ((INDEX) < 0) { \
2154 for (i = 0; i < n; i++) { \
2155 rgba[i][CHANNEL] = DEFAULT; \
2158 else if (swapBytes) { \
2159 const TYPE *s = (const TYPE *) src; \
2161 for (i = 0; i < n; i++) { \
2162 TYPE value = s[INDEX]; \
2163 if (sizeof(TYPE) == 2) { \
2166 else if (sizeof(TYPE) == 4) { \
2169 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2174 const TYPE *s = (const TYPE *) src; \
2176 for (i = 0; i < n; i++) { \
2177 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2183 case GL_UNSIGNED_BYTE
:
2184 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2185 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2186 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2187 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2190 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2191 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2192 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2193 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
2195 case GL_UNSIGNED_SHORT
:
2196 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2197 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2198 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2199 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
2202 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2203 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2204 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2205 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
2207 case GL_UNSIGNED_INT
:
2208 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2209 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2210 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2211 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
2214 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2215 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2216 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2217 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
2220 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2221 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2222 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2223 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
2225 case GL_UNSIGNED_BYTE_3_3_2
:
2227 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2229 for (i
= 0; i
< n
; i
++) {
2230 GLubyte p
= ubsrc
[i
];
2231 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
2232 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
2233 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
2234 rgba
[i
][ACOMP
] = 1.0F
;
2238 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2240 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2242 for (i
= 0; i
< n
; i
++) {
2243 GLubyte p
= ubsrc
[i
];
2244 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
2245 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
2246 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
2247 rgba
[i
][ACOMP
] = 1.0F
;
2251 case GL_UNSIGNED_SHORT_5_6_5
:
2253 const GLushort
*ussrc
= (const GLushort
*) src
;
2255 for (i
= 0; i
< n
; i
++) {
2256 GLushort p
= ussrc
[i
];
2258 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2259 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2260 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2261 rgba
[i
][ACOMP
] = 1.0F
;
2265 const GLushort
*ussrc
= (const GLushort
*) src
;
2267 for (i
= 0; i
< n
; i
++) {
2268 GLushort p
= ussrc
[i
];
2269 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2270 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2271 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2272 rgba
[i
][ACOMP
] = 1.0F
;
2276 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2278 const GLushort
*ussrc
= (const GLushort
*) src
;
2280 for (i
= 0; i
< n
; i
++) {
2281 GLushort p
= ussrc
[i
];
2283 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2284 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2285 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2286 rgba
[i
][ACOMP
] = 1.0F
;
2290 const GLushort
*ussrc
= (const GLushort
*) src
;
2292 for (i
= 0; i
< n
; i
++) {
2293 GLushort p
= ussrc
[i
];
2294 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2295 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2296 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2297 rgba
[i
][ACOMP
] = 1.0F
;
2301 case GL_UNSIGNED_SHORT_4_4_4_4
:
2303 const GLushort
*ussrc
= (const GLushort
*) src
;
2305 for (i
= 0; i
< n
; i
++) {
2306 GLushort p
= ussrc
[i
];
2308 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2309 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2310 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2311 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2315 const GLushort
*ussrc
= (const GLushort
*) src
;
2317 for (i
= 0; i
< n
; i
++) {
2318 GLushort p
= ussrc
[i
];
2319 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2320 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2321 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2322 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2326 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2328 const GLushort
*ussrc
= (const GLushort
*) src
;
2330 for (i
= 0; i
< n
; i
++) {
2331 GLushort p
= ussrc
[i
];
2333 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2334 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2335 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2336 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2340 const GLushort
*ussrc
= (const GLushort
*) src
;
2342 for (i
= 0; i
< n
; i
++) {
2343 GLushort p
= ussrc
[i
];
2344 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2345 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2346 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2347 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2351 case GL_UNSIGNED_SHORT_5_5_5_1
:
2353 const GLushort
*ussrc
= (const GLushort
*) src
;
2355 for (i
= 0; i
< n
; i
++) {
2356 GLushort p
= ussrc
[i
];
2358 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2359 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2360 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2361 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2365 const GLushort
*ussrc
= (const GLushort
*) src
;
2367 for (i
= 0; i
< n
; i
++) {
2368 GLushort p
= ussrc
[i
];
2369 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2370 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2371 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2372 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2376 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2378 const GLushort
*ussrc
= (const GLushort
*) src
;
2380 for (i
= 0; i
< n
; i
++) {
2381 GLushort p
= ussrc
[i
];
2383 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2384 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2385 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2386 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2390 const GLushort
*ussrc
= (const GLushort
*) src
;
2392 for (i
= 0; i
< n
; i
++) {
2393 GLushort p
= ussrc
[i
];
2394 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2395 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2396 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2397 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2401 case GL_UNSIGNED_INT_8_8_8_8
:
2403 const GLuint
*uisrc
= (const GLuint
*) src
;
2405 for (i
= 0; i
< n
; i
++) {
2406 GLuint p
= uisrc
[i
];
2407 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2408 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2409 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2410 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2414 const GLuint
*uisrc
= (const GLuint
*) src
;
2416 for (i
= 0; i
< n
; i
++) {
2417 GLuint p
= uisrc
[i
];
2418 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2419 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2420 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2421 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2425 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2427 const GLuint
*uisrc
= (const GLuint
*) src
;
2429 for (i
= 0; i
< n
; i
++) {
2430 GLuint p
= uisrc
[i
];
2431 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2432 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2433 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2434 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2438 const GLuint
*uisrc
= (const GLuint
*) src
;
2440 for (i
= 0; i
< n
; i
++) {
2441 GLuint p
= uisrc
[i
];
2442 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2443 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2444 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2445 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2449 case GL_UNSIGNED_INT_10_10_10_2
:
2451 const GLuint
*uisrc
= (const GLuint
*) src
;
2453 for (i
= 0; i
< n
; i
++) {
2454 GLuint p
= uisrc
[i
];
2456 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2457 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2458 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2459 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2463 const GLuint
*uisrc
= (const GLuint
*) src
;
2465 for (i
= 0; i
< n
; i
++) {
2466 GLuint p
= uisrc
[i
];
2467 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2468 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2469 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2470 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2474 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2476 const GLuint
*uisrc
= (const GLuint
*) src
;
2478 for (i
= 0; i
< n
; i
++) {
2479 GLuint p
= uisrc
[i
];
2481 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2482 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2483 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2484 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2488 const GLuint
*uisrc
= (const GLuint
*) src
;
2490 for (i
= 0; i
< n
; i
++) {
2491 GLuint p
= uisrc
[i
];
2492 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2493 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2494 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2495 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2500 _mesa_problem(NULL
, "bad srcType in extract float data");
2508 * Unpack a row of color image data from a client buffer according to
2509 * the pixel unpacking parameters.
2510 * Return GLubyte values in the specified dest image format.
2511 * This is (or will be) used by glDrawPixels and glTexImage?D().
2512 * Input: ctx - the context
2513 * n - number of pixels in the span
2514 * dstFormat - format of destination color array
2515 * dest - the destination color array
2516 * srcFormat - source image format
2517 * srcType - source image datatype
2518 * source - source image pointer
2519 * srcPacking - pixel unpacking parameters
2520 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2522 * XXX perhaps expand this to process whole images someday.
2525 _mesa_unpack_chan_color_span( GLcontext
*ctx
,
2526 GLuint n
, GLenum dstFormat
, GLchan dest
[],
2527 GLenum srcFormat
, GLenum srcType
,
2528 const GLvoid
*source
,
2529 const struct gl_pixelstore_attrib
*srcPacking
,
2530 GLuint transferOps
)
2532 ASSERT(dstFormat
== GL_ALPHA
||
2533 dstFormat
== GL_LUMINANCE
||
2534 dstFormat
== GL_LUMINANCE_ALPHA
||
2535 dstFormat
== GL_INTENSITY
||
2536 dstFormat
== GL_RGB
||
2537 dstFormat
== GL_RGBA
||
2538 dstFormat
== GL_COLOR_INDEX
);
2540 ASSERT(srcFormat
== GL_RED
||
2541 srcFormat
== GL_GREEN
||
2542 srcFormat
== GL_BLUE
||
2543 srcFormat
== GL_ALPHA
||
2544 srcFormat
== GL_LUMINANCE
||
2545 srcFormat
== GL_LUMINANCE_ALPHA
||
2546 srcFormat
== GL_INTENSITY
||
2547 srcFormat
== GL_RGB
||
2548 srcFormat
== GL_BGR
||
2549 srcFormat
== GL_RGBA
||
2550 srcFormat
== GL_BGRA
||
2551 srcFormat
== GL_ABGR_EXT
||
2552 srcFormat
== GL_COLOR_INDEX
);
2554 ASSERT(srcType
== GL_BITMAP
||
2555 srcType
== GL_UNSIGNED_BYTE
||
2556 srcType
== GL_BYTE
||
2557 srcType
== GL_UNSIGNED_SHORT
||
2558 srcType
== GL_SHORT
||
2559 srcType
== GL_UNSIGNED_INT
||
2560 srcType
== GL_INT
||
2561 srcType
== GL_FLOAT
||
2562 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2563 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2564 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2565 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2566 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2567 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2568 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2569 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2570 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2571 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2572 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2573 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2575 /* Try simple cases first */
2576 if (transferOps
== 0 ){
2577 if (srcType
== CHAN_TYPE
) {
2578 if (dstFormat
== GL_RGBA
) {
2579 if (srcFormat
== GL_RGBA
) {
2580 MEMCPY( dest
, source
, n
* 4 * sizeof(GLchan
) );
2583 else if (srcFormat
== GL_RGB
) {
2585 const GLchan
*src
= (const GLchan
*) source
;
2587 for (i
= 0; i
< n
; i
++) {
2598 else if (dstFormat
== GL_RGB
) {
2599 if (srcFormat
== GL_RGB
) {
2600 MEMCPY( dest
, source
, n
* 3 * sizeof(GLchan
) );
2603 else if (srcFormat
== GL_RGBA
) {
2605 const GLchan
*src
= (const GLchan
*) source
;
2607 for (i
= 0; i
< n
; i
++) {
2617 else if (dstFormat
== srcFormat
) {
2618 GLint comps
= _mesa_components_in_format(srcFormat
);
2620 MEMCPY( dest
, source
, n
* comps
* sizeof(GLchan
) );
2625 * Common situation, loading 8bit RGBA/RGB source images
2626 * into 16/32 bit destination. (OSMesa16/32)
2628 else if (srcType
== GL_UNSIGNED_BYTE
) {
2629 if (dstFormat
== GL_RGBA
) {
2630 if (srcFormat
== GL_RGB
) {
2632 const GLubyte
*src
= (const GLubyte
*) source
;
2634 for (i
= 0; i
< n
; i
++) {
2635 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2636 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2637 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2644 else if (srcFormat
== GL_RGBA
) {
2646 const GLubyte
*src
= (const GLubyte
*) source
;
2648 for (i
= 0; i
< n
; i
++) {
2649 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2650 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2651 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2652 dst
[3] = UBYTE_TO_CHAN(src
[3]);
2659 else if (dstFormat
== GL_RGB
) {
2660 if (srcFormat
== GL_RGB
) {
2662 const GLubyte
*src
= (const GLubyte
*) source
;
2664 for (i
= 0; i
< n
; i
++) {
2665 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2666 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2667 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2673 else if (srcFormat
== GL_RGBA
) {
2675 const GLubyte
*src
= (const GLubyte
*) source
;
2677 for (i
= 0; i
< n
; i
++) {
2678 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2679 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2680 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2691 /* general solution begins here */
2693 GLint dstComponents
;
2694 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2695 GLint dstLuminanceIndex
, dstIntensityIndex
;
2696 DEFMARRAY(GLfloat
, rgba
, MAX_WIDTH
, 4); /* mac 32k limitation */
2697 CHECKARRAY(rgba
, return); /* mac 32k limitation */
2699 dstComponents
= _mesa_components_in_format( dstFormat
);
2700 /* source & dest image formats should have been error checked by now */
2701 assert(dstComponents
> 0);
2704 * Extract image data and convert to RGBA floats
2706 assert(n
<= MAX_WIDTH
);
2707 if (srcFormat
== GL_COLOR_INDEX
) {
2708 GLuint indexes
[MAX_WIDTH
];
2709 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2712 if (dstFormat
== GL_COLOR_INDEX
2713 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2714 _mesa_map_ci(ctx
, n
, indexes
);
2716 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2717 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2720 if (dstFormat
== GL_COLOR_INDEX
) {
2721 /* convert to GLchan and return */
2723 for (i
= 0; i
< n
; i
++) {
2724 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2726 UNDEFARRAY(rgba
); /* mac 32k limitation */
2730 /* Convert indexes to RGBA */
2731 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2735 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2736 srcPacking
->SwapBytes
);
2738 /* scale and bias colors */
2739 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2740 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2741 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
2742 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
2743 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
2744 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
2746 /* color map lookup */
2747 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2748 _mesa_map_rgba(ctx
, n
, rgba
);
2753 /* GL_COLOR_TABLE lookup */
2754 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2755 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2758 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2759 /* this has to be done in the calling code */
2761 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
2762 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
2763 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2764 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
2765 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
2766 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
2767 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
2768 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
2769 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
2770 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
2771 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
2773 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2774 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2775 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2777 /* color matrix transform */
2778 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2779 _mesa_transform_rgba(ctx
, n
, rgba
);
2781 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2782 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2783 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2785 /* update histogram count */
2786 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2787 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2790 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2791 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2795 /* clamp to [0,1] */
2796 #if CHAN_TYPE != GL_FLOAT
2799 for (i
= 0; i
< n
; i
++) {
2800 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2801 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2802 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2803 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2808 /* Now determine which color channels we need to produce.
2809 * And determine the dest index (offset) within each color tuple.
2811 switch (dstFormat
) {
2814 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2815 dstLuminanceIndex
= dstIntensityIndex
= -1;
2818 dstLuminanceIndex
= 0;
2819 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2820 dstIntensityIndex
= -1;
2822 case GL_LUMINANCE_ALPHA
:
2823 dstLuminanceIndex
= 0;
2825 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2826 dstIntensityIndex
= -1;
2829 dstIntensityIndex
= 0;
2830 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2831 dstLuminanceIndex
= -1;
2837 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2844 dstLuminanceIndex
= dstIntensityIndex
= -1;
2847 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
2848 UNDEFARRAY(rgba
); /* mac 32k limitation */
2853 /* Now return the GLchan data in the requested dstFormat */
2855 if (dstRedIndex
>= 0) {
2858 for (i
= 0; i
< n
; i
++) {
2859 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
2860 dst
+= dstComponents
;
2864 if (dstGreenIndex
>= 0) {
2867 for (i
= 0; i
< n
; i
++) {
2868 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
2869 dst
+= dstComponents
;
2873 if (dstBlueIndex
>= 0) {
2876 for (i
= 0; i
< n
; i
++) {
2877 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
2878 dst
+= dstComponents
;
2882 if (dstAlphaIndex
>= 0) {
2885 for (i
= 0; i
< n
; i
++) {
2886 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
2887 dst
+= dstComponents
;
2891 if (dstIntensityIndex
>= 0) {
2894 assert(dstIntensityIndex
== 0);
2895 assert(dstComponents
== 1);
2896 for (i
= 0; i
< n
; i
++) {
2897 /* Intensity comes from red channel */
2898 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
2902 if (dstLuminanceIndex
>= 0) {
2905 assert(dstLuminanceIndex
== 0);
2906 for (i
= 0; i
< n
; i
++) {
2907 /* Luminance comes from red channel */
2908 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
2909 dst
+= dstComponents
;
2912 UNDEFARRAY(rgba
); /* mac 32k limitation */
2918 _mesa_unpack_float_color_span( GLcontext
*ctx
,
2919 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
2920 GLenum srcFormat
, GLenum srcType
,
2921 const GLvoid
*source
,
2922 const struct gl_pixelstore_attrib
*srcPacking
,
2923 GLuint transferOps
, GLboolean clamp
)
2925 ASSERT(dstFormat
== GL_ALPHA
||
2926 dstFormat
== GL_LUMINANCE
||
2927 dstFormat
== GL_LUMINANCE_ALPHA
||
2928 dstFormat
== GL_INTENSITY
||
2929 dstFormat
== GL_RGB
||
2930 dstFormat
== GL_RGBA
||
2931 dstFormat
== GL_COLOR_INDEX
);
2933 ASSERT(srcFormat
== GL_RED
||
2934 srcFormat
== GL_GREEN
||
2935 srcFormat
== GL_BLUE
||
2936 srcFormat
== GL_ALPHA
||
2937 srcFormat
== GL_LUMINANCE
||
2938 srcFormat
== GL_LUMINANCE_ALPHA
||
2939 srcFormat
== GL_INTENSITY
||
2940 srcFormat
== GL_RGB
||
2941 srcFormat
== GL_BGR
||
2942 srcFormat
== GL_RGBA
||
2943 srcFormat
== GL_BGRA
||
2944 srcFormat
== GL_ABGR_EXT
||
2945 srcFormat
== GL_COLOR_INDEX
);
2947 ASSERT(srcType
== GL_BITMAP
||
2948 srcType
== GL_UNSIGNED_BYTE
||
2949 srcType
== GL_BYTE
||
2950 srcType
== GL_UNSIGNED_SHORT
||
2951 srcType
== GL_SHORT
||
2952 srcType
== GL_UNSIGNED_INT
||
2953 srcType
== GL_INT
||
2954 srcType
== GL_FLOAT
||
2955 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2956 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2957 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2958 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2959 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2960 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2961 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2962 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2963 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2964 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2965 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2966 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2968 /* general solution, no special cases, yet */
2970 GLint dstComponents
;
2971 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2972 GLint dstLuminanceIndex
, dstIntensityIndex
;
2973 DEFMARRAY(GLfloat
, rgba
, MAX_WIDTH
, 4); /* mac 32k limitation */
2974 CHECKARRAY(rgba
, return); /* mac 32k limitation */
2976 dstComponents
= _mesa_components_in_format( dstFormat
);
2977 /* source & dest image formats should have been error checked by now */
2978 assert(dstComponents
> 0);
2981 * Extract image data and convert to RGBA floats
2983 assert(n
<= MAX_WIDTH
);
2984 if (srcFormat
== GL_COLOR_INDEX
) {
2985 GLuint indexes
[MAX_WIDTH
];
2986 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2989 if (dstFormat
== GL_COLOR_INDEX
2990 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2991 _mesa_map_ci(ctx
, n
, indexes
);
2993 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2994 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2997 if (dstFormat
== GL_COLOR_INDEX
) {
2998 /* convert to GLchan and return */
3000 for (i
= 0; i
< n
; i
++) {
3001 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3003 UNDEFARRAY(rgba
); /* mac 32k limitation */
3007 /* Convert indexes to RGBA */
3008 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3012 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3013 srcPacking
->SwapBytes
);
3015 /* scale and bias colors */
3016 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
3017 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
3018 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
3019 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
3020 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
3021 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
3023 /* color map lookup */
3024 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3025 _mesa_map_rgba(ctx
, n
, rgba
);
3030 /* GL_COLOR_TABLE lookup */
3031 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
3032 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
3035 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
3038 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
3039 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
3040 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
3041 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
3042 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
3043 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
3044 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
3045 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
3046 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
3047 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
3048 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
3050 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
3051 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
3052 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
3054 /* color matrix transform */
3055 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
3056 _mesa_transform_rgba(ctx
, n
, rgba
);
3058 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
3059 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
3060 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
3062 /* update histogram count */
3063 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
3064 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
3067 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
3068 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
3072 /* clamp to [0,1] */
3073 #if CHAN_TYPE != GL_FLOAT
3076 for (i
= 0; i
< n
; i
++) {
3077 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
3078 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
3079 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
3080 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
3085 /* Now determine which color channels we need to produce.
3086 * And determine the dest index (offset) within each color tuple.
3088 switch (dstFormat
) {
3091 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3092 dstLuminanceIndex
= dstIntensityIndex
= -1;
3095 dstLuminanceIndex
= 0;
3096 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3097 dstIntensityIndex
= -1;
3099 case GL_LUMINANCE_ALPHA
:
3100 dstLuminanceIndex
= 0;
3102 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3103 dstIntensityIndex
= -1;
3106 dstIntensityIndex
= 0;
3107 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3108 dstLuminanceIndex
= -1;
3114 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3121 dstLuminanceIndex
= dstIntensityIndex
= -1;
3124 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_float_color_span()");
3125 UNDEFARRAY(rgba
); /* mac 32k limitation */
3129 /* Now pack results in the requested dstFormat */
3130 if (dstRedIndex
>= 0) {
3131 GLfloat
*dst
= dest
;
3133 for (i
= 0; i
< n
; i
++) {
3134 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
3135 dst
+= dstComponents
;
3139 if (dstGreenIndex
>= 0) {
3140 GLfloat
*dst
= dest
;
3142 for (i
= 0; i
< n
; i
++) {
3143 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
3144 dst
+= dstComponents
;
3148 if (dstBlueIndex
>= 0) {
3149 GLfloat
*dst
= dest
;
3151 for (i
= 0; i
< n
; i
++) {
3152 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
3153 dst
+= dstComponents
;
3157 if (dstAlphaIndex
>= 0) {
3158 GLfloat
*dst
= dest
;
3160 for (i
= 0; i
< n
; i
++) {
3161 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
3162 dst
+= dstComponents
;
3166 if (dstIntensityIndex
>= 0) {
3167 GLfloat
*dst
= dest
;
3169 assert(dstIntensityIndex
== 0);
3170 assert(dstComponents
== 1);
3171 for (i
= 0; i
< n
; i
++) {
3172 /* Intensity comes from red channel */
3173 dst
[i
] = rgba
[i
][RCOMP
];
3177 if (dstLuminanceIndex
>= 0) {
3178 GLfloat
*dst
= dest
;
3180 assert(dstLuminanceIndex
== 0);
3181 for (i
= 0; i
< n
; i
++) {
3182 /* Luminance comes from red channel */
3183 dst
[0] = rgba
[i
][RCOMP
];
3184 dst
+= dstComponents
;
3187 UNDEFARRAY(rgba
); /* mac 32k limitation */
3195 * Unpack a row of color index data from a client buffer according to
3196 * the pixel unpacking parameters.
3197 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3199 * Args: ctx - the context
3200 * n - number of pixels
3201 * dstType - destination datatype
3202 * dest - destination array
3203 * srcType - source pixel type
3204 * source - source data pointer
3205 * srcPacking - pixel unpacking parameters
3206 * transferOps - the pixel transfer operations to apply
3209 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
3210 GLenum dstType
, GLvoid
*dest
,
3211 GLenum srcType
, const GLvoid
*source
,
3212 const struct gl_pixelstore_attrib
*srcPacking
,
3213 GLuint transferOps
)
3215 ASSERT(srcType
== GL_BITMAP
||
3216 srcType
== GL_UNSIGNED_BYTE
||
3217 srcType
== GL_BYTE
||
3218 srcType
== GL_UNSIGNED_SHORT
||
3219 srcType
== GL_SHORT
||
3220 srcType
== GL_UNSIGNED_INT
||
3221 srcType
== GL_INT
||
3222 srcType
== GL_FLOAT
);
3224 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3225 dstType
== GL_UNSIGNED_SHORT
||
3226 dstType
== GL_UNSIGNED_INT
);
3229 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3232 * Try simple cases first
3234 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3235 && dstType
== GL_UNSIGNED_BYTE
) {
3236 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3238 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3239 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3240 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3246 GLuint indexes
[MAX_WIDTH
];
3247 assert(n
<= MAX_WIDTH
);
3249 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3252 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3253 /* shift and offset indexes */
3254 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3256 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3257 /* Apply lookup table */
3258 _mesa_map_ci(ctx
, n
, indexes
);
3261 /* convert to dest type */
3263 case GL_UNSIGNED_BYTE
:
3265 GLubyte
*dst
= (GLubyte
*) dest
;
3267 for (i
= 0; i
< n
; i
++) {
3268 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3272 case GL_UNSIGNED_SHORT
:
3274 GLuint
*dst
= (GLuint
*) dest
;
3276 for (i
= 0; i
< n
; i
++) {
3277 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3281 case GL_UNSIGNED_INT
:
3282 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3285 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3292 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
3293 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
3294 const struct gl_pixelstore_attrib
*dstPacking
,
3295 GLuint transferOps
)
3297 GLuint indexes
[MAX_WIDTH
];
3299 ASSERT(n
<= MAX_WIDTH
);
3301 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3303 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
3304 /* make a copy of input */
3305 MEMCPY(indexes
, source
, n
* sizeof(GLuint
));
3306 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3307 _mesa_shift_and_offset_ci( ctx
, n
, indexes
);
3309 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3310 _mesa_map_ci(ctx
, n
, indexes
);
3316 case GL_UNSIGNED_BYTE
:
3318 GLubyte
*dst
= (GLubyte
*) dest
;
3320 for (i
= 0; i
< n
; i
++) {
3321 *dst
++ = (GLubyte
) source
[i
];
3327 GLbyte
*dst
= (GLbyte
*) dest
;
3329 for (i
= 0; i
< n
; i
++) {
3330 dst
[i
] = (GLbyte
) source
[i
];
3334 case GL_UNSIGNED_SHORT
:
3336 GLushort
*dst
= (GLushort
*) dest
;
3338 for (i
= 0; i
< n
; i
++) {
3339 dst
[i
] = (GLushort
) source
[i
];
3341 if (dstPacking
->SwapBytes
) {
3342 _mesa_swap2( (GLushort
*) dst
, n
);
3348 GLshort
*dst
= (GLshort
*) dest
;
3350 for (i
= 0; i
< n
; i
++) {
3351 dst
[i
] = (GLshort
) source
[i
];
3353 if (dstPacking
->SwapBytes
) {
3354 _mesa_swap2( (GLushort
*) dst
, n
);
3358 case GL_UNSIGNED_INT
:
3360 GLuint
*dst
= (GLuint
*) dest
;
3362 for (i
= 0; i
< n
; i
++) {
3363 dst
[i
] = (GLuint
) source
[i
];
3365 if (dstPacking
->SwapBytes
) {
3366 _mesa_swap4( (GLuint
*) dst
, n
);
3372 GLint
*dst
= (GLint
*) dest
;
3374 for (i
= 0; i
< n
; i
++) {
3375 dst
[i
] = (GLint
) source
[i
];
3377 if (dstPacking
->SwapBytes
) {
3378 _mesa_swap4( (GLuint
*) dst
, n
);
3384 GLfloat
*dst
= (GLfloat
*) dest
;
3386 for (i
= 0; i
< n
; i
++) {
3387 dst
[i
] = (GLfloat
) source
[i
];
3389 if (dstPacking
->SwapBytes
) {
3390 _mesa_swap4( (GLuint
*) dst
, n
);
3395 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3402 * Unpack a row of stencil data from a client buffer according to
3403 * the pixel unpacking parameters.
3404 * This is (or will be) used by glDrawPixels
3406 * Args: ctx - the context
3407 * n - number of pixels
3408 * dstType - destination datatype
3409 * dest - destination array
3410 * srcType - source pixel type
3411 * source - source data pointer
3412 * srcPacking - pixel unpacking parameters
3413 * transferOps - apply offset/bias/lookup ops?
3416 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3417 GLenum dstType
, GLvoid
*dest
,
3418 GLenum srcType
, const GLvoid
*source
,
3419 const struct gl_pixelstore_attrib
*srcPacking
,
3420 GLuint transferOps
)
3422 ASSERT(srcType
== GL_BITMAP
||
3423 srcType
== GL_UNSIGNED_BYTE
||
3424 srcType
== GL_BYTE
||
3425 srcType
== GL_UNSIGNED_SHORT
||
3426 srcType
== GL_SHORT
||
3427 srcType
== GL_UNSIGNED_INT
||
3428 srcType
== GL_INT
||
3429 srcType
== GL_FLOAT
);
3431 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3432 dstType
== GL_UNSIGNED_SHORT
||
3433 dstType
== GL_UNSIGNED_INT
);
3435 /* only shift and offset apply to stencil */
3436 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3439 * Try simple cases first
3441 if (transferOps
== 0 &&
3442 srcType
== GL_UNSIGNED_BYTE
&&
3443 dstType
== GL_UNSIGNED_BYTE
) {
3444 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3446 else if (transferOps
== 0 &&
3447 srcType
== GL_UNSIGNED_INT
&&
3448 dstType
== GL_UNSIGNED_INT
&&
3449 !srcPacking
->SwapBytes
) {
3450 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3456 GLuint indexes
[MAX_WIDTH
];
3457 assert(n
<= MAX_WIDTH
);
3459 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3463 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3464 /* shift and offset indexes */
3465 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3468 if (ctx
->Pixel
.MapStencilFlag
) {
3469 /* Apply stencil lookup table */
3470 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
3473 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
3478 /* convert to dest type */
3480 case GL_UNSIGNED_BYTE
:
3482 GLubyte
*dst
= (GLubyte
*) dest
;
3484 for (i
= 0; i
< n
; i
++) {
3485 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3489 case GL_UNSIGNED_SHORT
:
3491 GLuint
*dst
= (GLuint
*) dest
;
3493 for (i
= 0; i
< n
; i
++) {
3494 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3498 case GL_UNSIGNED_INT
:
3499 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3502 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3509 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3510 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
3511 const struct gl_pixelstore_attrib
*dstPacking
)
3513 GLstencil stencil
[MAX_WIDTH
];
3515 ASSERT(n
<= MAX_WIDTH
);
3517 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
3518 ctx
->Pixel
.MapStencilFlag
) {
3519 /* make a copy of input */
3520 MEMCPY(stencil
, source
, n
* sizeof(GLstencil
));
3521 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
3522 _mesa_shift_and_offset_stencil( ctx
, n
, stencil
);
3524 if (ctx
->Pixel
.MapStencilFlag
) {
3525 _mesa_map_stencil( ctx
, n
, stencil
);
3531 case GL_UNSIGNED_BYTE
:
3532 if (sizeof(GLstencil
) == 8) {
3533 MEMCPY( dest
, source
, n
);
3536 GLubyte
*dst
= (GLubyte
*) dest
;
3539 dst
[i
] = (GLubyte
) source
[i
];
3544 if (sizeof(GLstencil
) == 8) {
3545 MEMCPY( dest
, source
, n
);
3548 GLbyte
*dst
= (GLbyte
*) dest
;
3551 dst
[i
] = (GLbyte
) source
[i
];
3555 case GL_UNSIGNED_SHORT
:
3557 GLushort
*dst
= (GLushort
*) dest
;
3560 dst
[i
] = (GLushort
) source
[i
];
3562 if (dstPacking
->SwapBytes
) {
3563 _mesa_swap2( (GLushort
*) dst
, n
);
3569 GLshort
*dst
= (GLshort
*) dest
;
3572 dst
[i
] = (GLshort
) source
[i
];
3574 if (dstPacking
->SwapBytes
) {
3575 _mesa_swap2( (GLushort
*) dst
, n
);
3579 case GL_UNSIGNED_INT
:
3581 GLuint
*dst
= (GLuint
*) dest
;
3584 dst
[i
] = (GLuint
) source
[i
];
3586 if (dstPacking
->SwapBytes
) {
3587 _mesa_swap4( (GLuint
*) dst
, n
);
3593 GLint
*dst
= (GLint
*) dest
;
3596 *dst
++ = (GLint
) source
[i
];
3598 if (dstPacking
->SwapBytes
) {
3599 _mesa_swap4( (GLuint
*) dst
, n
);
3605 GLfloat
*dst
= (GLfloat
*) dest
;
3608 dst
[i
] = (GLfloat
) source
[i
];
3610 if (dstPacking
->SwapBytes
) {
3611 _mesa_swap4( (GLuint
*) dst
, n
);
3616 if (dstPacking
->LsbFirst
) {
3617 GLubyte
*dst
= (GLubyte
*) dest
;
3620 for (i
= 0; i
< n
; i
++) {
3623 *dst
|= ((source
[i
] != 0) << shift
);
3632 GLubyte
*dst
= (GLubyte
*) dest
;
3635 for (i
= 0; i
< n
; i
++) {
3638 *dst
|= ((source
[i
] != 0) << shift
);
3648 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3655 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLfloat
*dest
,
3656 GLenum srcType
, const GLvoid
*source
,
3657 const struct gl_pixelstore_attrib
*srcPacking
)
3663 const GLubyte
*src
= (const GLubyte
*) source
;
3664 for (i
= 0; i
< n
; i
++) {
3665 dest
[i
] = BYTE_TO_FLOAT(src
[i
]);
3669 case GL_UNSIGNED_BYTE
:
3672 const GLubyte
*src
= (const GLubyte
*) source
;
3673 for (i
= 0; i
< n
; i
++) {
3674 dest
[i
] = UBYTE_TO_FLOAT(src
[i
]);
3681 const GLshort
*src
= (const GLshort
*) source
;
3682 for (i
= 0; i
< n
; i
++) {
3683 dest
[i
] = SHORT_TO_FLOAT(src
[i
]);
3687 case GL_UNSIGNED_SHORT
:
3690 const GLushort
*src
= (const GLushort
*) source
;
3691 for (i
= 0; i
< n
; i
++) {
3692 dest
[i
] = USHORT_TO_FLOAT(src
[i
]);
3699 const GLint
*src
= (const GLint
*) source
;
3700 for (i
= 0; i
< n
; i
++) {
3701 dest
[i
] = INT_TO_FLOAT(src
[i
]);
3705 case GL_UNSIGNED_INT
:
3708 const GLuint
*src
= (const GLuint
*) source
;
3709 for (i
= 0; i
< n
; i
++) {
3710 dest
[i
] = UINT_TO_FLOAT(src
[i
]);
3715 MEMCPY(dest
, source
, n
* sizeof(GLfloat
));
3718 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3723 /* apply depth scale and bias and clamp to [0,1] */
3724 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3726 for (i
= 0; i
< n
; i
++) {
3727 GLfloat d
= dest
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3728 dest
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
3736 * Pack an array of depth values. The values are floats in [0,1].
3739 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
3740 GLenum dstType
, const GLfloat
*depthSpan
,
3741 const struct gl_pixelstore_attrib
*dstPacking
)
3743 GLfloat depthCopy
[MAX_WIDTH
];
3744 const GLboolean bias_or_scale
= ctx
->Pixel
.DepthBias
!= 0.0 ||
3745 ctx
->Pixel
.DepthScale
!= 1.0;
3747 ASSERT(n
<= MAX_WIDTH
);
3749 if (bias_or_scale
) {
3751 for (i
= 0; i
< n
; i
++) {
3753 d
= depthSpan
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3754 depthCopy
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
3756 depthSpan
= depthCopy
;
3760 case GL_UNSIGNED_BYTE
:
3762 GLubyte
*dst
= (GLubyte
*) dest
;
3764 for (i
= 0; i
< n
; i
++) {
3765 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
3771 GLbyte
*dst
= (GLbyte
*) dest
;
3773 for (i
= 0; i
< n
; i
++) {
3774 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
3778 case GL_UNSIGNED_SHORT
:
3780 GLushort
*dst
= (GLushort
*) dest
;
3782 for (i
= 0; i
< n
; i
++) {
3783 dst
[i
] = FLOAT_TO_USHORT( depthSpan
[i
] );
3785 if (dstPacking
->SwapBytes
) {
3786 _mesa_swap2( (GLushort
*) dst
, n
);
3792 GLshort
*dst
= (GLshort
*) dest
;
3794 for (i
= 0; i
< n
; i
++) {
3795 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
3797 if (dstPacking
->SwapBytes
) {
3798 _mesa_swap2( (GLushort
*) dst
, n
);
3802 case GL_UNSIGNED_INT
:
3804 GLuint
*dst
= (GLuint
*) dest
;
3806 for (i
= 0; i
< n
; i
++) {
3807 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
3809 if (dstPacking
->SwapBytes
) {
3810 _mesa_swap4( (GLuint
*) dst
, n
);
3816 GLint
*dst
= (GLint
*) dest
;
3818 for (i
= 0; i
< n
; i
++) {
3819 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
3821 if (dstPacking
->SwapBytes
) {
3822 _mesa_swap4( (GLuint
*) dst
, n
);
3828 GLfloat
*dst
= (GLfloat
*) dest
;
3830 for (i
= 0; i
< n
; i
++) {
3831 dst
[i
] = depthSpan
[i
];
3833 if (dstPacking
->SwapBytes
) {
3834 _mesa_swap4( (GLuint
*) dst
, n
);
3839 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
3847 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
3848 * Return all image data in a contiguous block.
3851 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
3852 GLenum format
, GLenum type
, const GLvoid
*pixels
,
3853 const struct gl_pixelstore_attrib
*unpack
)
3855 GLint bytesPerRow
, compsPerRow
;
3856 GLboolean flipBytes
, swap2
, swap4
;
3859 return NULL
; /* not necessarily an error */
3861 if (width
<= 0 || height
<= 0 || depth
<= 0)
3862 return NULL
; /* generate error later */
3864 if (format
== GL_BITMAP
) {
3865 bytesPerRow
= (width
+ 7) >> 3;
3866 flipBytes
= !unpack
->LsbFirst
;
3867 swap2
= swap4
= GL_FALSE
;
3871 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
3872 const GLint components
= _mesa_components_in_format(format
);
3874 if (bytesPerPixel
<= 0 || components
<= 0)
3875 return NULL
; /* bad format or type. generate error later */
3876 bytesPerRow
= bytesPerPixel
* width
;
3877 bytesPerComp
= bytesPerPixel
/ components
;
3878 flipBytes
= GL_FALSE
;
3879 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
3880 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
3881 compsPerRow
= components
* width
;
3882 assert(compsPerRow
>= width
);
3886 GLubyte
*destBuffer
= (GLubyte
*) MALLOC(bytesPerRow
* height
* depth
);
3890 return NULL
; /* generate GL_OUT_OF_MEMORY later */
3893 for (img
= 0; img
< depth
; img
++) {
3894 for (row
= 0; row
< height
; row
++) {
3895 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
3896 width
, height
, format
, type
, img
, row
, 0);
3897 MEMCPY(dst
, src
, bytesPerRow
);
3898 /* byte flipping/swapping */
3900 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
3903 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
3906 _mesa_swap4((GLuint
*) dst
, compsPerRow
);