1 /* $Id: image.c,v 1.45 2000/10/29 18:12:15 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 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.
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
:
346 case GL_UNSIGNED_BYTE
:
348 case GL_UNSIGNED_SHORT
:
350 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 GLubyte
*src
= _mesa_image_address( packing
, pixels
, width
, height
,
624 GL_COLOR_INDEX
, GL_BITMAP
,
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;
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;
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
= _mesa_image_address( packing
, dest
, width
, height
,
719 GL_COLOR_INDEX
, GL_BITMAP
,
724 if (packing
->SkipPixels
== 0) {
725 MEMCPY( dst
, src
, width_in_bytes
);
726 if (packing
->LsbFirst
) {
727 flip_bytes( dst
, width_in_bytes
);
731 /* handling SkipPixels is a bit tricky (no pun intended!) */
733 if (packing
->LsbFirst
) {
734 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
735 GLubyte dstMask
= 128;
736 const GLubyte
*s
= src
;
739 for (i
= 0; i
< width
; i
++) {
743 if (srcMask
== 128) {
748 srcMask
= srcMask
<< 1;
756 dstMask
= dstMask
>> 1;
761 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
762 GLubyte dstMask
= 128;
763 const GLubyte
*s
= src
;
766 for (i
= 0; i
< width
; i
++) {
775 srcMask
= srcMask
>> 1;
783 dstMask
= dstMask
>> 1;
788 src
+= width_in_bytes
;
795 _mesa_pack_float_rgba_span( GLcontext
*ctx
,
796 GLuint n
, CONST GLfloat rgbaIn
[][4],
797 GLenum dstFormat
, GLenum dstType
,
799 const struct gl_pixelstore_attrib
*dstPacking
,
802 const GLint comps
= _mesa_components_in_format(dstFormat
);
803 GLfloat luminance
[MAX_WIDTH
];
808 /* make copy of incoming data */
809 GLfloat rgbaCopy
[MAX_WIDTH
][4];
810 for (i
= 0; i
< n
; i
++) {
811 rgbaCopy
[i
][0] = rgbaIn
[i
][0];
812 rgbaCopy
[i
][1] = rgbaIn
[i
][1];
813 rgbaCopy
[i
][2] = rgbaIn
[i
][2];
814 rgbaCopy
[i
][3] = rgbaIn
[i
][3];
817 rgba
= (GLfloat (*)[4]) rgbaCopy
;
820 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
821 _mesa_scale_and_bias_rgba( ctx
, n
, rgba
);
823 /* color map lookup */
824 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
825 _mesa_map_rgba( ctx
, n
, rgba
);
827 /* GL_COLOR_TABLE lookup */
828 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
829 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
832 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
833 /* this has to be done in the calling code */
835 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
836 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
837 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
839 /* color matrix transform */
840 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
841 _mesa_transform_rgba(ctx
, n
, rgba
);
843 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
844 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
845 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
847 /* update histogram count */
848 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
849 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
852 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
853 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
854 if (ctx
->MinMax
.Sink
)
859 /* use incoming data, not a copy */
860 rgba
= (GLfloat (*)[4]) rgbaIn
;
863 /* XXX clamp rgba to [0,1]? */
866 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
867 for (i
= 0; i
< n
; i
++) {
868 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
869 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
874 * Pack/store the pixels. Ugh! Lots of cases!!!
877 case GL_UNSIGNED_BYTE
:
879 GLubyte
*dst
= (GLubyte
*) dstAddr
;
883 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
887 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
891 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
895 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
899 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
901 case GL_LUMINANCE_ALPHA
:
903 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
904 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
909 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
910 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
911 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
916 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
917 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
918 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
919 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
924 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
925 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
926 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
931 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
932 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
933 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
934 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
939 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
940 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
941 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
942 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
946 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
952 GLbyte
*dst
= (GLbyte
*) dstAddr
;
956 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
960 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
964 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
968 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
972 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
974 case GL_LUMINANCE_ALPHA
:
976 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
977 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
982 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
983 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
984 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
989 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
990 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
991 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
992 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
997 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
998 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
999 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1004 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1005 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1006 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1007 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1011 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1012 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1013 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1014 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1018 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1022 case GL_UNSIGNED_SHORT
:
1024 GLushort
*dst
= (GLushort
*) dstAddr
;
1025 switch (dstFormat
) {
1028 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1032 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1036 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1040 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1044 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
1046 case GL_LUMINANCE_ALPHA
:
1048 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
1049 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1054 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1055 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1056 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1061 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1062 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1063 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1064 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1069 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1070 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1071 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1076 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1077 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1078 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1079 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1084 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1085 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1086 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1087 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1091 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1093 if (dstPacking
->SwapBytes
) {
1094 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1100 GLshort
*dst
= (GLshort
*) dstAddr
;
1101 switch (dstFormat
) {
1104 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1108 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1112 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1116 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1120 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1122 case GL_LUMINANCE_ALPHA
:
1124 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1125 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1130 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1131 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1132 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1137 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1138 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1139 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1140 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1145 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1146 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1147 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1152 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1153 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1154 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1155 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1159 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1160 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1161 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1162 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1166 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1168 if (dstPacking
->SwapBytes
) {
1169 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1173 case GL_UNSIGNED_INT
:
1175 GLuint
*dst
= (GLuint
*) dstAddr
;
1176 switch (dstFormat
) {
1179 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1183 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1187 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1191 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1195 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1197 case GL_LUMINANCE_ALPHA
:
1199 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1200 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1205 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1206 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1207 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1212 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1213 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1214 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1215 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1220 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1221 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1222 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1227 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1228 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1229 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1230 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1235 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1236 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1237 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1238 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1242 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1244 if (dstPacking
->SwapBytes
) {
1245 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1251 GLint
*dst
= (GLint
*) dstAddr
;
1252 switch (dstFormat
) {
1255 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1259 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1263 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1267 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1271 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1273 case GL_LUMINANCE_ALPHA
:
1275 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1276 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1281 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1282 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1283 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1288 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1289 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1290 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1291 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1296 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1297 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1298 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1303 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1304 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1305 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1306 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1311 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1312 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1313 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1314 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1318 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1320 if (dstPacking
->SwapBytes
) {
1321 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1327 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1328 switch (dstFormat
) {
1331 dst
[i
] = rgba
[i
][RCOMP
];
1335 dst
[i
] = rgba
[i
][GCOMP
];
1339 dst
[i
] = rgba
[i
][BCOMP
];
1343 dst
[i
] = rgba
[i
][ACOMP
];
1347 dst
[i
] = luminance
[i
];
1349 case GL_LUMINANCE_ALPHA
:
1351 dst
[i
*2+0] = luminance
[i
];
1352 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1357 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1358 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1359 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1364 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1365 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1366 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1367 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1372 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1373 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1374 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1379 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1380 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1381 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1382 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1387 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1388 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1389 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1390 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1394 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1396 if (dstPacking
->SwapBytes
) {
1397 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1401 case GL_UNSIGNED_BYTE_3_3_2
:
1402 if (dstFormat
== GL_RGB
) {
1403 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1405 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1406 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1407 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1411 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1412 if (dstFormat
== GL_RGB
) {
1413 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1415 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1416 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1417 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1421 case GL_UNSIGNED_SHORT_5_6_5
:
1422 if (dstFormat
== GL_RGB
) {
1423 GLushort
*dst
= (GLushort
*) dstAddr
;
1425 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1426 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1427 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1431 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1432 if (dstFormat
== GL_RGB
) {
1433 GLushort
*dst
= (GLushort
*) dstAddr
;
1435 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1436 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1437 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1441 case GL_UNSIGNED_SHORT_4_4_4_4
:
1442 if (dstFormat
== GL_RGBA
) {
1443 GLushort
*dst
= (GLushort
*) dstAddr
;
1445 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1446 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1447 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1448 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1451 else if (dstFormat
== GL_BGRA
) {
1452 GLushort
*dst
= (GLushort
*) dstAddr
;
1454 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 12)
1455 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1456 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 4)
1457 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1460 else if (dstFormat
== GL_ABGR_EXT
) {
1461 GLushort
*dst
= (GLushort
*) dstAddr
;
1463 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 4)
1464 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1465 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 12)
1466 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) );
1470 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1471 if (dstFormat
== GL_RGBA
) {
1472 GLushort
*dst
= (GLushort
*) dstAddr
;
1474 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1475 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1476 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1477 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1480 else if (dstFormat
== GL_BGRA
) {
1481 GLushort
*dst
= (GLushort
*) dstAddr
;
1483 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) )
1484 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1485 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 8)
1486 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1489 else if (dstFormat
== GL_ABGR_EXT
) {
1490 GLushort
*dst
= (GLushort
*) dstAddr
;
1492 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) )
1493 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1494 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1495 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12);
1499 case GL_UNSIGNED_SHORT_5_5_5_1
:
1500 if (dstFormat
== GL_RGBA
) {
1501 GLushort
*dst
= (GLushort
*) dstAddr
;
1503 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1504 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1505 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1506 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1509 else if (dstFormat
== GL_BGRA
) {
1510 GLushort
*dst
= (GLushort
*) dstAddr
;
1512 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11)
1513 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1514 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 1)
1515 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1518 else if (dstFormat
== GL_ABGR_EXT
) {
1519 GLushort
*dst
= (GLushort
*) dstAddr
;
1521 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) << 11)
1522 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 6)
1523 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 1)
1524 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) );
1528 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1529 if (dstFormat
== GL_RGBA
) {
1530 GLushort
*dst
= (GLushort
*) dstAddr
;
1532 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1533 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1534 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1535 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1538 else if (dstFormat
== GL_BGRA
) {
1539 GLushort
*dst
= (GLushort
*) dstAddr
;
1541 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) )
1542 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1543 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 10)
1544 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1547 else if (dstFormat
== GL_ABGR_EXT
) {
1548 GLushort
*dst
= (GLushort
*) dstAddr
;
1550 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) )
1551 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 5)
1552 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 10)
1553 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) << 15);
1557 case GL_UNSIGNED_INT_8_8_8_8
:
1558 if (dstFormat
== GL_RGBA
) {
1559 GLuint
*dst
= (GLuint
*) dstAddr
;
1561 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1562 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1563 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1564 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1567 else if (dstFormat
== GL_BGRA
) {
1568 GLuint
*dst
= (GLuint
*) dstAddr
;
1570 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1571 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1572 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1573 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1576 else if (dstFormat
== GL_ABGR_EXT
) {
1577 GLuint
*dst
= (GLuint
*) dstAddr
;
1579 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1580 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1581 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1582 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1586 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1587 if (dstFormat
== GL_RGBA
) {
1588 GLuint
*dst
= (GLuint
*) dstAddr
;
1590 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1591 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1592 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1593 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1596 else if (dstFormat
== GL_BGRA
) {
1597 GLuint
*dst
= (GLuint
*) dstAddr
;
1599 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1600 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1601 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1602 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1605 else if (dstFormat
== GL_ABGR_EXT
) {
1606 GLuint
*dst
= (GLuint
*) dstAddr
;
1608 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1609 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1610 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1611 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1615 case GL_UNSIGNED_INT_10_10_10_2
:
1616 if (dstFormat
== GL_RGBA
) {
1617 GLuint
*dst
= (GLuint
*) dstAddr
;
1619 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1620 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1621 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1622 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1625 else if (dstFormat
== GL_BGRA
) {
1626 GLuint
*dst
= (GLuint
*) dstAddr
;
1628 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1629 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1630 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1631 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1634 else if (dstFormat
== GL_ABGR_EXT
) {
1635 GLuint
*dst
= (GLuint
*) dstAddr
;
1637 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1638 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1639 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1640 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1644 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1645 if (dstFormat
== GL_RGBA
) {
1646 GLuint
*dst
= (GLuint
*) dstAddr
;
1648 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1649 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1650 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1651 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1654 else if (dstFormat
== GL_BGRA
) {
1655 GLuint
*dst
= (GLuint
*) dstAddr
;
1657 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1658 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1659 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1660 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1663 else if (dstFormat
== GL_ABGR_EXT
) {
1664 GLuint
*dst
= (GLuint
*) dstAddr
;
1666 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1667 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1668 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1669 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1674 gl_problem(ctx
, "bad type in _mesa_pack_float_rgba_span");
1681 * Pack the given RGBA span into client memory at 'dest' address
1682 * in the given pixel format and type.
1683 * Optionally apply the enabled pixel transfer ops.
1684 * Pack into memory using the given packing params struct.
1685 * This is used by glReadPixels and glGetTexImage?D()
1686 * Input: ctx - the context
1687 * n - number of pixels in the span
1689 * format - dest packing format
1690 * type - dest packing datatype
1691 * destination - destination packing address
1692 * packing - pixel packing parameters
1693 * transferOps - bitmask of IMAGE_*_BIT operations to apply
1696 _mesa_pack_rgba_span( GLcontext
*ctx
,
1697 GLuint n
, CONST GLchan srcRgba
[][4],
1698 GLenum dstFormat
, GLenum dstType
,
1700 const struct gl_pixelstore_attrib
*dstPacking
,
1703 ASSERT(ctx
->ImageTransferState
!= UPDATE_IMAGE_TRANSFER_STATE
);
1705 /* Test for optimized case first */
1706 if (transferOps
== 0 && dstFormat
== GL_RGBA
&& dstType
== CHAN_TYPE
) {
1707 /* common simple case */
1708 MEMCPY(dstAddr
, srcRgba
, n
* 4 * sizeof(GLchan
));
1710 else if (transferOps
== 0 && dstFormat
== GL_RGB
&& dstType
== CHAN_TYPE
) {
1711 /* common simple case */
1713 GLchan
*dest
= (GLchan
*) dstAddr
;
1714 for (i
= 0; i
< n
; i
++) {
1715 dest
[0] = srcRgba
[i
][RCOMP
];
1716 dest
[1] = srcRgba
[i
][GCOMP
];
1717 dest
[2] = srcRgba
[i
][BCOMP
];
1722 /* general solution */
1723 GLfloat rgba
[MAX_WIDTH
][4];
1725 assert(n
<= MAX_WIDTH
);
1726 /* convert color components to floating point */
1728 rgba
[i
][RCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][RCOMP
]);
1729 rgba
[i
][GCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][GCOMP
]);
1730 rgba
[i
][BCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][BCOMP
]);
1731 rgba
[i
][ACOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][ACOMP
]);
1733 _mesa_pack_float_rgba_span(ctx
, n
, (const GLfloat (*)[4]) rgba
,
1734 dstFormat
, dstType
, dstAddr
,
1735 dstPacking
, transferOps
);
1740 #define SWAP2BYTE(VALUE) \
1742 GLubyte *bytes = (GLubyte *) &(VALUE); \
1743 GLubyte tmp = bytes[0]; \
1744 bytes[0] = bytes[1]; \
1748 #define SWAP4BYTE(VALUE) \
1750 GLubyte *bytes = (GLubyte *) &(VALUE); \
1751 GLubyte tmp = bytes[0]; \
1752 bytes[0] = bytes[3]; \
1755 bytes[1] = bytes[2]; \
1761 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1762 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1763 const struct gl_pixelstore_attrib
*unpack
)
1765 assert(srcFormat
== GL_COLOR_INDEX
);
1767 ASSERT(srcType
== GL_BITMAP
||
1768 srcType
== GL_UNSIGNED_BYTE
||
1769 srcType
== GL_BYTE
||
1770 srcType
== GL_UNSIGNED_SHORT
||
1771 srcType
== GL_SHORT
||
1772 srcType
== GL_UNSIGNED_INT
||
1773 srcType
== GL_INT
||
1774 srcType
== GL_FLOAT
);
1779 GLubyte
*ubsrc
= (GLubyte
*) src
;
1780 if (unpack
->LsbFirst
) {
1781 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1783 for (i
= 0; i
< n
; i
++) {
1784 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1795 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1797 for (i
= 0; i
< n
; i
++) {
1798 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1810 case GL_UNSIGNED_BYTE
:
1813 const GLubyte
*s
= (const GLubyte
*) src
;
1814 for (i
= 0; i
< n
; i
++)
1821 const GLbyte
*s
= (const GLbyte
*) src
;
1822 for (i
= 0; i
< n
; i
++)
1826 case GL_UNSIGNED_SHORT
:
1829 const GLushort
*s
= (const GLushort
*) src
;
1830 if (unpack
->SwapBytes
) {
1831 for (i
= 0; i
< n
; i
++) {
1832 GLushort value
= s
[i
];
1838 for (i
= 0; i
< n
; i
++)
1846 const GLshort
*s
= (const GLshort
*) src
;
1847 if (unpack
->SwapBytes
) {
1848 for (i
= 0; i
< n
; i
++) {
1849 GLshort value
= s
[i
];
1855 for (i
= 0; i
< n
; i
++)
1860 case GL_UNSIGNED_INT
:
1863 const GLuint
*s
= (const GLuint
*) src
;
1864 if (unpack
->SwapBytes
) {
1865 for (i
= 0; i
< n
; i
++) {
1866 GLuint value
= s
[i
];
1872 for (i
= 0; i
< n
; i
++)
1880 const GLint
*s
= (const GLint
*) src
;
1881 if (unpack
->SwapBytes
) {
1882 for (i
= 0; i
< n
; i
++) {
1889 for (i
= 0; i
< n
; i
++)
1897 const GLfloat
*s
= (const GLfloat
*) src
;
1898 if (unpack
->SwapBytes
) {
1899 for (i
= 0; i
< n
; i
++) {
1900 GLfloat value
= s
[i
];
1902 indexes
[i
] = (GLuint
) value
;
1906 for (i
= 0; i
< n
; i
++)
1907 indexes
[i
] = (GLuint
) s
[i
];
1912 gl_problem(NULL
, "bad srcType in extract_uint_indexes");
1920 * This function extracts floating point RGBA values from arbitrary
1921 * image data. srcFormat and srcType are the format and type parameters
1922 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1924 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1925 * implements the "Conversion to floating point", "Conversion to RGB",
1926 * and "Final Expansion to RGBA" operations.
1928 * Args: n - number of pixels
1929 * rgba - output colors
1930 * srcFormat - format of incoming data
1931 * srcType - datatype of incoming data
1932 * src - source data pointer
1933 * swapBytes - perform byteswapping of incoming data?
1936 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
1937 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1938 GLboolean swapBytes
)
1940 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
1942 GLint rComp
, bComp
, gComp
, aComp
;
1944 ASSERT(srcFormat
== GL_RED
||
1945 srcFormat
== GL_GREEN
||
1946 srcFormat
== GL_BLUE
||
1947 srcFormat
== GL_ALPHA
||
1948 srcFormat
== GL_LUMINANCE
||
1949 srcFormat
== GL_LUMINANCE_ALPHA
||
1950 srcFormat
== GL_INTENSITY
||
1951 srcFormat
== GL_RGB
||
1952 srcFormat
== GL_BGR
||
1953 srcFormat
== GL_RGBA
||
1954 srcFormat
== GL_BGRA
||
1955 srcFormat
== GL_ABGR_EXT
);
1957 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
1958 srcType
== GL_BYTE
||
1959 srcType
== GL_UNSIGNED_SHORT
||
1960 srcType
== GL_SHORT
||
1961 srcType
== GL_UNSIGNED_INT
||
1962 srcType
== GL_INT
||
1963 srcType
== GL_FLOAT
||
1964 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
1965 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
1966 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
1967 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
1968 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
1969 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
1970 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
1971 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
1972 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
1973 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
1974 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
1975 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
1977 rComp
= gComp
= bComp
= aComp
= -1;
1979 switch (srcFormat
) {
1982 greenIndex
= blueIndex
= alphaIndex
= -1;
1987 redIndex
= blueIndex
= alphaIndex
= -1;
1992 redIndex
= greenIndex
= alphaIndex
= -1;
1996 redIndex
= greenIndex
= blueIndex
= -1;
2001 redIndex
= greenIndex
= blueIndex
= 0;
2005 case GL_LUMINANCE_ALPHA
:
2006 redIndex
= greenIndex
= blueIndex
= 0;
2012 greenIndex
= blueIndex
= alphaIndex
= -1;
2063 gl_problem(NULL
, "bad srcFormat in extract float data");
2068 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
2069 if ((INDEX) < 0) { \
2071 for (i = 0; i < n; i++) { \
2072 rgba[i][CHANNEL] = DEFAULT; \
2075 else if (swapBytes) { \
2076 const TYPE *s = (const TYPE *) src; \
2078 for (i = 0; i < n; i++) { \
2079 TYPE value = s[INDEX]; \
2080 if (sizeof(TYPE) == 2) { \
2083 else if (sizeof(TYPE) == 4) { \
2086 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2091 const TYPE *s = (const TYPE *) src; \
2093 for (i = 0; i < n; i++) { \
2094 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2100 case GL_UNSIGNED_BYTE
:
2101 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2102 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2103 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2104 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2107 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2108 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2109 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2110 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
2112 case GL_UNSIGNED_SHORT
:
2113 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2114 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2115 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2116 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
2119 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2120 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2121 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2122 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
2124 case GL_UNSIGNED_INT
:
2125 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2126 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2127 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2128 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
2131 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2132 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2133 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2134 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
2137 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2138 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2139 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2140 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
2142 case GL_UNSIGNED_BYTE_3_3_2
:
2144 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2146 for (i
= 0; i
< n
; i
++) {
2147 GLubyte p
= ubsrc
[i
];
2148 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
2149 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
2150 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
2151 rgba
[i
][ACOMP
] = 1.0F
;
2155 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2157 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2159 for (i
= 0; i
< n
; i
++) {
2160 GLubyte p
= ubsrc
[i
];
2161 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
2162 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
2163 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
2164 rgba
[i
][ACOMP
] = 1.0F
;
2168 case GL_UNSIGNED_SHORT_5_6_5
:
2170 const GLushort
*ussrc
= (const GLushort
*) src
;
2172 for (i
= 0; i
< n
; i
++) {
2173 GLushort p
= ussrc
[i
];
2175 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2176 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2177 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2178 rgba
[i
][ACOMP
] = 1.0F
;
2182 const GLushort
*ussrc
= (const GLushort
*) src
;
2184 for (i
= 0; i
< n
; i
++) {
2185 GLushort p
= ussrc
[i
];
2186 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2187 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2188 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2189 rgba
[i
][ACOMP
] = 1.0F
;
2193 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2195 const GLushort
*ussrc
= (const GLushort
*) src
;
2197 for (i
= 0; i
< n
; i
++) {
2198 GLushort p
= ussrc
[i
];
2200 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2201 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2202 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2203 rgba
[i
][ACOMP
] = 1.0F
;
2207 const GLushort
*ussrc
= (const GLushort
*) src
;
2209 for (i
= 0; i
< n
; i
++) {
2210 GLushort p
= ussrc
[i
];
2211 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2212 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2213 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2214 rgba
[i
][ACOMP
] = 1.0F
;
2218 case GL_UNSIGNED_SHORT_4_4_4_4
:
2220 const GLushort
*ussrc
= (const GLushort
*) src
;
2222 for (i
= 0; i
< n
; i
++) {
2223 GLushort p
= ussrc
[i
];
2225 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2226 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2227 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2228 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2232 const GLushort
*ussrc
= (const GLushort
*) src
;
2234 for (i
= 0; i
< n
; i
++) {
2235 GLushort p
= ussrc
[i
];
2236 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2237 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2238 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2239 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2243 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2245 const GLushort
*ussrc
= (const GLushort
*) src
;
2247 for (i
= 0; i
< n
; i
++) {
2248 GLushort p
= ussrc
[i
];
2250 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2251 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2252 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2253 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2257 const GLushort
*ussrc
= (const GLushort
*) src
;
2259 for (i
= 0; i
< n
; i
++) {
2260 GLushort p
= ussrc
[i
];
2261 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2262 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2263 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2264 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2268 case GL_UNSIGNED_SHORT_5_5_5_1
:
2270 const GLushort
*ussrc
= (const GLushort
*) src
;
2272 for (i
= 0; i
< n
; i
++) {
2273 GLushort p
= ussrc
[i
];
2275 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2276 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2277 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2278 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2282 const GLushort
*ussrc
= (const GLushort
*) src
;
2284 for (i
= 0; i
< n
; i
++) {
2285 GLushort p
= ussrc
[i
];
2286 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2287 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2288 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2289 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2293 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2295 const GLushort
*ussrc
= (const GLushort
*) src
;
2297 for (i
= 0; i
< n
; i
++) {
2298 GLushort p
= ussrc
[i
];
2300 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2301 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2302 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2303 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2307 const GLushort
*ussrc
= (const GLushort
*) src
;
2309 for (i
= 0; i
< n
; i
++) {
2310 GLushort p
= ussrc
[i
];
2311 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2312 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2313 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2314 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2318 case GL_UNSIGNED_INT_8_8_8_8
:
2320 const GLuint
*uisrc
= (const GLuint
*) src
;
2322 for (i
= 0; i
< n
; i
++) {
2323 GLuint p
= uisrc
[i
];
2324 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2325 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2326 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2327 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2331 const GLuint
*uisrc
= (const GLuint
*) src
;
2333 for (i
= 0; i
< n
; i
++) {
2334 GLuint p
= uisrc
[i
];
2335 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2336 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2337 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2338 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2342 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2344 const GLuint
*uisrc
= (const GLuint
*) src
;
2346 for (i
= 0; i
< n
; i
++) {
2347 GLuint p
= uisrc
[i
];
2348 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2349 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2350 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2351 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2355 const GLuint
*uisrc
= (const GLuint
*) src
;
2357 for (i
= 0; i
< n
; i
++) {
2358 GLuint p
= uisrc
[i
];
2359 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2360 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2361 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2362 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2366 case GL_UNSIGNED_INT_10_10_10_2
:
2368 const GLuint
*uisrc
= (const GLuint
*) src
;
2370 for (i
= 0; i
< n
; i
++) {
2371 GLuint p
= uisrc
[i
];
2373 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2374 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2375 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2376 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2380 const GLuint
*uisrc
= (const GLuint
*) src
;
2382 for (i
= 0; i
< n
; i
++) {
2383 GLuint p
= uisrc
[i
];
2384 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2385 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2386 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2387 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2391 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2393 const GLuint
*uisrc
= (const GLuint
*) src
;
2395 for (i
= 0; i
< n
; i
++) {
2396 GLuint p
= uisrc
[i
];
2398 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2399 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2400 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2401 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2405 const GLuint
*uisrc
= (const GLuint
*) src
;
2407 for (i
= 0; i
< n
; i
++) {
2408 GLuint p
= uisrc
[i
];
2409 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2410 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2411 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2412 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2417 gl_problem(NULL
, "bad srcType in extract float data");
2425 * Unpack a row of color image data from a client buffer according to
2426 * the pixel unpacking parameters.
2427 * Return GLubyte values in the specified dest image format.
2428 * This is (or will be) used by glDrawPixels and glTexImage?D().
2429 * Input: ctx - the context
2430 * n - number of pixels in the span
2431 * dstFormat - format of destination color array
2432 * dest - the destination color array
2433 * srcFormat - source image format
2434 * srcType - source image datatype
2435 * source - source image pointer
2436 * srcPacking - pixel unpacking parameters
2437 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2439 * XXX perhaps expand this to process whole images someday.
2442 _mesa_unpack_chan_color_span( GLcontext
*ctx
,
2443 GLuint n
, GLenum dstFormat
, GLchan dest
[],
2444 GLenum srcFormat
, GLenum srcType
,
2445 const GLvoid
*source
,
2446 const struct gl_pixelstore_attrib
*srcPacking
,
2447 GLuint transferOps
)
2449 ASSERT(dstFormat
== GL_ALPHA
||
2450 dstFormat
== GL_LUMINANCE
||
2451 dstFormat
== GL_LUMINANCE_ALPHA
||
2452 dstFormat
== GL_INTENSITY
||
2453 dstFormat
== GL_RGB
||
2454 dstFormat
== GL_RGBA
||
2455 dstFormat
== GL_COLOR_INDEX
);
2457 ASSERT(srcFormat
== GL_RED
||
2458 srcFormat
== GL_GREEN
||
2459 srcFormat
== GL_BLUE
||
2460 srcFormat
== GL_ALPHA
||
2461 srcFormat
== GL_LUMINANCE
||
2462 srcFormat
== GL_LUMINANCE_ALPHA
||
2463 srcFormat
== GL_INTENSITY
||
2464 srcFormat
== GL_RGB
||
2465 srcFormat
== GL_BGR
||
2466 srcFormat
== GL_RGBA
||
2467 srcFormat
== GL_BGRA
||
2468 srcFormat
== GL_ABGR_EXT
||
2469 srcFormat
== GL_COLOR_INDEX
);
2471 ASSERT(srcType
== GL_BITMAP
||
2472 srcType
== GL_UNSIGNED_BYTE
||
2473 srcType
== GL_BYTE
||
2474 srcType
== GL_UNSIGNED_SHORT
||
2475 srcType
== GL_SHORT
||
2476 srcType
== GL_UNSIGNED_INT
||
2477 srcType
== GL_INT
||
2478 srcType
== GL_FLOAT
||
2479 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2480 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2481 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2482 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2483 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2484 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2485 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2486 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2487 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2488 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2489 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2490 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2492 /* this is intended for RGBA mode only */
2493 assert(ctx
->Visual
.RGBAflag
);
2495 /* Try simple cases first */
2496 if (transferOps
== 0 && srcType
== CHAN_TYPE
) {
2497 if (dstFormat
== GL_RGBA
) {
2498 if (srcFormat
== GL_RGBA
) {
2499 MEMCPY( dest
, source
, n
* 4 * sizeof(GLchan
) );
2502 else if (srcFormat
== GL_RGB
) {
2504 const GLchan
*src
= (const GLchan
*) source
;
2506 for (i
= 0; i
< n
; i
++) {
2517 else if (dstFormat
== GL_RGB
) {
2518 if (srcFormat
== GL_RGB
) {
2519 MEMCPY( dest
, source
, n
* 3 * sizeof(GLchan
) );
2522 else if (srcFormat
== GL_RGBA
) {
2524 const GLchan
*src
= (const GLchan
*) source
;
2526 for (i
= 0; i
< n
; i
++) {
2536 else if (dstFormat
== srcFormat
) {
2537 GLint comps
= _mesa_components_in_format(srcFormat
);
2539 MEMCPY( dest
, source
, n
* comps
* sizeof(GLchan
) );
2545 /* general solution begins here */
2547 GLfloat rgba
[MAX_WIDTH
][4];
2548 GLint dstComponents
;
2549 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2550 GLint dstLuminanceIndex
, dstIntensityIndex
;
2552 dstComponents
= _mesa_components_in_format( dstFormat
);
2553 /* source & dest image formats should have been error checked by now */
2554 assert(dstComponents
> 0);
2557 * Extract image data and convert to RGBA floats
2559 assert(n
<= MAX_WIDTH
);
2560 if (srcFormat
== GL_COLOR_INDEX
) {
2561 GLuint indexes
[MAX_WIDTH
];
2562 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2565 if (dstFormat
== GL_COLOR_INDEX
2566 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2567 _mesa_map_ci(ctx
, n
, indexes
);
2569 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2570 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2573 if (dstFormat
== GL_COLOR_INDEX
) {
2574 /* convert to GLchan and return */
2576 for (i
= 0; i
< n
; i
++) {
2577 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2582 /* Convert indexes to RGBA */
2583 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2587 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2588 srcPacking
->SwapBytes
);
2590 /* scale and bias colors */
2591 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2592 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2594 /* color map lookup */
2595 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2596 _mesa_map_rgba(ctx
, n
, rgba
);
2601 /* GL_COLOR_TABLE lookup */
2602 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2603 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2606 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2607 /* this has to be done in the calling code */
2609 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2610 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2611 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2613 /* color matrix transform */
2614 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2615 _mesa_transform_rgba(ctx
, n
, rgba
);
2617 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2618 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2619 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2621 /* update histogram count */
2622 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2623 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2626 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2627 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2631 /* clamp to [0,1] */
2634 for (i
= 0; i
< n
; i
++) {
2635 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2636 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2637 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2638 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2642 /* Now determine which color channels we need to produce.
2643 * And determine the dest index (offset) within each color tuple.
2645 switch (dstFormat
) {
2648 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2649 dstLuminanceIndex
= dstIntensityIndex
= -1;
2652 dstLuminanceIndex
= 0;
2653 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2654 dstIntensityIndex
= -1;
2656 case GL_LUMINANCE_ALPHA
:
2657 dstLuminanceIndex
= 0;
2659 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2660 dstIntensityIndex
= -1;
2663 dstIntensityIndex
= 0;
2664 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2665 dstLuminanceIndex
= -1;
2671 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2678 dstLuminanceIndex
= dstIntensityIndex
= -1;
2681 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
2686 /* Now return the GLchan data in the requested dstFormat */
2688 if (dstRedIndex
>= 0) {
2691 for (i
= 0; i
< n
; i
++) {
2692 dst
[dstRedIndex
] = FLOAT_TO_CHAN(rgba
[i
][RCOMP
]);
2693 dst
+= dstComponents
;
2697 if (dstGreenIndex
>= 0) {
2700 for (i
= 0; i
< n
; i
++) {
2701 dst
[dstGreenIndex
] = FLOAT_TO_CHAN(rgba
[i
][GCOMP
]);
2702 dst
+= dstComponents
;
2706 if (dstBlueIndex
>= 0) {
2709 for (i
= 0; i
< n
; i
++) {
2710 dst
[dstBlueIndex
] = FLOAT_TO_CHAN(rgba
[i
][BCOMP
]);
2711 dst
+= dstComponents
;
2715 if (dstAlphaIndex
>= 0) {
2718 for (i
= 0; i
< n
; i
++) {
2719 dst
[dstAlphaIndex
] = FLOAT_TO_CHAN(rgba
[i
][ACOMP
]);
2720 dst
+= dstComponents
;
2724 if (dstIntensityIndex
>= 0) {
2727 assert(dstIntensityIndex
== 0);
2728 assert(dstComponents
== 1);
2729 for (i
= 0; i
< n
; i
++) {
2730 /* Intensity comes from red channel */
2731 dst
[i
] = FLOAT_TO_CHAN(rgba
[i
][RCOMP
]);
2735 if (dstLuminanceIndex
>= 0) {
2738 assert(dstLuminanceIndex
== 0);
2739 for (i
= 0; i
< n
; i
++) {
2740 /* Luminance comes from red channel */
2741 dst
[0] = FLOAT_TO_CHAN(rgba
[i
][RCOMP
]);
2742 dst
+= dstComponents
;
2750 _mesa_unpack_float_color_span( GLcontext
*ctx
,
2751 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
2752 GLenum srcFormat
, GLenum srcType
,
2753 const GLvoid
*source
,
2754 const struct gl_pixelstore_attrib
*srcPacking
,
2755 GLuint transferOps
, GLboolean clamp
)
2757 ASSERT(dstFormat
== GL_ALPHA
||
2758 dstFormat
== GL_LUMINANCE
||
2759 dstFormat
== GL_LUMINANCE_ALPHA
||
2760 dstFormat
== GL_INTENSITY
||
2761 dstFormat
== GL_RGB
||
2762 dstFormat
== GL_RGBA
||
2763 dstFormat
== GL_COLOR_INDEX
);
2765 ASSERT(srcFormat
== GL_RED
||
2766 srcFormat
== GL_GREEN
||
2767 srcFormat
== GL_BLUE
||
2768 srcFormat
== GL_ALPHA
||
2769 srcFormat
== GL_LUMINANCE
||
2770 srcFormat
== GL_LUMINANCE_ALPHA
||
2771 srcFormat
== GL_INTENSITY
||
2772 srcFormat
== GL_RGB
||
2773 srcFormat
== GL_BGR
||
2774 srcFormat
== GL_RGBA
||
2775 srcFormat
== GL_BGRA
||
2776 srcFormat
== GL_ABGR_EXT
||
2777 srcFormat
== GL_COLOR_INDEX
);
2779 ASSERT(srcType
== GL_BITMAP
||
2780 srcType
== GL_UNSIGNED_BYTE
||
2781 srcType
== GL_BYTE
||
2782 srcType
== GL_UNSIGNED_SHORT
||
2783 srcType
== GL_SHORT
||
2784 srcType
== GL_UNSIGNED_INT
||
2785 srcType
== GL_INT
||
2786 srcType
== GL_FLOAT
||
2787 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2788 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2789 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2790 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2791 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2792 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2793 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2794 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2795 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2796 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2797 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2798 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2800 /* this is intended for RGBA mode only */
2801 assert(ctx
->Visual
.RGBAflag
);
2803 /* general solution, no special cases, yet */
2805 GLfloat rgba
[MAX_WIDTH
][4];
2806 GLint dstComponents
;
2807 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2808 GLint dstLuminanceIndex
, dstIntensityIndex
;
2810 dstComponents
= _mesa_components_in_format( dstFormat
);
2811 /* source & dest image formats should have been error checked by now */
2812 assert(dstComponents
> 0);
2815 * Extract image data and convert to RGBA floats
2817 assert(n
<= MAX_WIDTH
);
2818 if (srcFormat
== GL_COLOR_INDEX
) {
2819 GLuint indexes
[MAX_WIDTH
];
2820 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2823 if (dstFormat
== GL_COLOR_INDEX
2824 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2825 _mesa_map_ci(ctx
, n
, indexes
);
2827 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2828 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2831 if (dstFormat
== GL_COLOR_INDEX
) {
2832 /* convert to GLchan and return */
2834 for (i
= 0; i
< n
; i
++) {
2835 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2840 /* Convert indexes to RGBA */
2841 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2845 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2846 srcPacking
->SwapBytes
);
2848 /* scale and bias colors */
2849 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2850 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2852 /* color map lookup */
2853 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2854 _mesa_map_rgba(ctx
, n
, rgba
);
2859 /* GL_COLOR_TABLE lookup */
2860 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2861 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2864 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2867 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2868 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2869 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2871 /* color matrix transform */
2872 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2873 _mesa_transform_rgba(ctx
, n
, rgba
);
2875 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2876 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2877 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2879 /* update histogram count */
2880 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2881 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2884 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2885 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2889 /* clamp to [0,1] */
2892 for (i
= 0; i
< n
; i
++) {
2893 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2894 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2895 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2896 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2900 /* Now determine which color channels we need to produce.
2901 * And determine the dest index (offset) within each color tuple.
2903 switch (dstFormat
) {
2906 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2907 dstLuminanceIndex
= dstIntensityIndex
= -1;
2910 dstLuminanceIndex
= 0;
2911 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2912 dstIntensityIndex
= -1;
2914 case GL_LUMINANCE_ALPHA
:
2915 dstLuminanceIndex
= 0;
2917 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2918 dstIntensityIndex
= -1;
2921 dstIntensityIndex
= 0;
2922 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2923 dstLuminanceIndex
= -1;
2929 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2936 dstLuminanceIndex
= dstIntensityIndex
= -1;
2939 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_float_color_span()");
2943 /* Now pack results in the requested dstFormat */
2944 if (dstRedIndex
>= 0) {
2945 GLfloat
*dst
= dest
;
2947 for (i
= 0; i
< n
; i
++) {
2948 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
2949 dst
+= dstComponents
;
2953 if (dstGreenIndex
>= 0) {
2954 GLfloat
*dst
= dest
;
2956 for (i
= 0; i
< n
; i
++) {
2957 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
2958 dst
+= dstComponents
;
2962 if (dstBlueIndex
>= 0) {
2963 GLfloat
*dst
= dest
;
2965 for (i
= 0; i
< n
; i
++) {
2966 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
2967 dst
+= dstComponents
;
2971 if (dstAlphaIndex
>= 0) {
2972 GLfloat
*dst
= dest
;
2974 for (i
= 0; i
< n
; i
++) {
2975 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
2976 dst
+= dstComponents
;
2980 if (dstIntensityIndex
>= 0) {
2981 GLfloat
*dst
= dest
;
2983 assert(dstIntensityIndex
== 0);
2984 assert(dstComponents
== 1);
2985 for (i
= 0; i
< n
; i
++) {
2986 /* Intensity comes from red channel */
2987 dst
[i
] = rgba
[i
][RCOMP
];
2991 if (dstLuminanceIndex
>= 0) {
2992 GLfloat
*dst
= dest
;
2994 assert(dstLuminanceIndex
== 0);
2995 for (i
= 0; i
< n
; i
++) {
2996 /* Luminance comes from red channel */
2997 dst
[0] = rgba
[i
][RCOMP
];
2998 dst
+= dstComponents
;
3008 * Unpack a row of color index data from a client buffer according to
3009 * the pixel unpacking parameters.
3010 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3012 * Args: ctx - the context
3013 * n - number of pixels
3014 * dstType - destination datatype
3015 * dest - destination array
3016 * srcType - source pixel type
3017 * source - source data pointer
3018 * srcPacking - pixel unpacking parameters
3019 * transferOps - the pixel transfer operations to apply
3022 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
3023 GLenum dstType
, GLvoid
*dest
,
3024 GLenum srcType
, const GLvoid
*source
,
3025 const struct gl_pixelstore_attrib
*srcPacking
,
3026 GLuint transferOps
)
3028 ASSERT(srcType
== GL_BITMAP
||
3029 srcType
== GL_UNSIGNED_BYTE
||
3030 srcType
== GL_BYTE
||
3031 srcType
== GL_UNSIGNED_SHORT
||
3032 srcType
== GL_SHORT
||
3033 srcType
== GL_UNSIGNED_INT
||
3034 srcType
== GL_INT
||
3035 srcType
== GL_FLOAT
);
3037 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3038 dstType
== GL_UNSIGNED_SHORT
||
3039 dstType
== GL_UNSIGNED_INT
);
3042 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3045 * Try simple cases first
3047 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3048 && dstType
== GL_UNSIGNED_BYTE
) {
3049 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3051 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3052 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3053 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3059 GLuint indexes
[MAX_WIDTH
];
3060 assert(n
<= MAX_WIDTH
);
3062 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3065 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3066 /* shift and offset indexes */
3067 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3069 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3070 /* Apply lookup table */
3071 _mesa_map_ci(ctx
, n
, indexes
);
3074 /* convert to dest type */
3076 case GL_UNSIGNED_BYTE
:
3078 GLubyte
*dst
= (GLubyte
*) dest
;
3080 for (i
= 0; i
< n
; i
++) {
3081 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3085 case GL_UNSIGNED_SHORT
:
3087 GLuint
*dst
= (GLuint
*) dest
;
3089 for (i
= 0; i
< n
; i
++) {
3090 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3094 case GL_UNSIGNED_INT
:
3095 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3098 gl_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3105 * Unpack a row of stencil data from a client buffer according to
3106 * the pixel unpacking parameters.
3107 * This is (or will be) used by glDrawPixels
3109 * Args: ctx - the context
3110 * n - number of pixels
3111 * dstType - destination datatype
3112 * dest - destination array
3113 * srcType - source pixel type
3114 * source - source data pointer
3115 * srcPacking - pixel unpacking parameters
3116 * transferOps - apply offset/bias/lookup ops?
3119 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3120 GLenum dstType
, GLvoid
*dest
,
3121 GLenum srcType
, const GLvoid
*source
,
3122 const struct gl_pixelstore_attrib
*srcPacking
,
3123 GLuint transferOps
)
3125 ASSERT(srcType
== GL_BITMAP
||
3126 srcType
== GL_UNSIGNED_BYTE
||
3127 srcType
== GL_BYTE
||
3128 srcType
== GL_UNSIGNED_SHORT
||
3129 srcType
== GL_SHORT
||
3130 srcType
== GL_UNSIGNED_INT
||
3131 srcType
== GL_INT
||
3132 srcType
== GL_FLOAT
);
3134 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3135 dstType
== GL_UNSIGNED_SHORT
||
3136 dstType
== GL_UNSIGNED_INT
);
3138 /* only shift and offset apply to stencil */
3139 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3142 * Try simple cases first
3144 if (transferOps
== 0 &&
3145 srcType
== GL_UNSIGNED_BYTE
&&
3146 dstType
== GL_UNSIGNED_BYTE
) {
3147 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3149 else if (transferOps
== 0 &&
3150 srcType
== GL_UNSIGNED_INT
&&
3151 dstType
== GL_UNSIGNED_INT
&&
3152 !srcPacking
->SwapBytes
) {
3153 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3159 GLuint indexes
[MAX_WIDTH
];
3160 assert(n
<= MAX_WIDTH
);
3162 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3166 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3167 /* shift and offset indexes */
3168 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3171 if (ctx
->Pixel
.MapStencilFlag
) {
3172 /* Apply stencil lookup table */
3173 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
3176 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
3181 /* convert to dest type */
3183 case GL_UNSIGNED_BYTE
:
3185 GLubyte
*dst
= (GLubyte
*) dest
;
3187 for (i
= 0; i
< n
; i
++) {
3188 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3192 case GL_UNSIGNED_SHORT
:
3194 GLuint
*dst
= (GLuint
*) dest
;
3196 for (i
= 0; i
< n
; i
++) {
3197 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3201 case GL_UNSIGNED_INT
:
3202 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3205 gl_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3213 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLdepth
*dest
,
3214 GLenum srcType
, const GLvoid
*source
,
3215 const struct gl_pixelstore_attrib
*srcPacking
,
3216 GLuint transferOps
)
3218 GLfloat
*depth
= MALLOC(n
* sizeof(GLfloat
));
3226 const GLubyte
*src
= (const GLubyte
*) source
;
3227 for (i
= 0; i
< n
; i
++) {
3228 depth
[i
] = BYTE_TO_FLOAT(src
[i
]);
3232 case GL_UNSIGNED_BYTE
:
3235 const GLubyte
*src
= (const GLubyte
*) source
;
3236 for (i
= 0; i
< n
; i
++) {
3237 depth
[i
] = UBYTE_TO_FLOAT(src
[i
]);
3244 const GLshort
*src
= (const GLshort
*) source
;
3245 for (i
= 0; i
< n
; i
++) {
3246 depth
[i
] = SHORT_TO_FLOAT(src
[i
]);
3250 case GL_UNSIGNED_SHORT
:
3253 const GLushort
*src
= (const GLushort
*) source
;
3254 for (i
= 0; i
< n
; i
++) {
3255 depth
[i
] = USHORT_TO_FLOAT(src
[i
]);
3262 const GLint
*src
= (const GLint
*) source
;
3263 for (i
= 0; i
< n
; i
++) {
3264 depth
[i
] = INT_TO_FLOAT(src
[i
]);
3268 case GL_UNSIGNED_INT
:
3271 const GLuint
*src
= (const GLuint
*) source
;
3272 for (i
= 0; i
< n
; i
++) {
3273 depth
[i
] = UINT_TO_FLOAT(src
[i
]);
3278 MEMCPY(depth
, source
, n
* sizeof(GLfloat
));
3281 gl_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3287 /* apply depth scale and bias */
3288 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3290 for (i
= 0; i
< n
; i
++) {
3291 depth
[i
] = depth
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3295 /* clamp depth values to [0,1] and convert from floats to integers */
3297 const GLfloat zs
= ctx
->Visual
.DepthMaxF
;
3299 for (i
= 0; i
< n
; i
++) {
3300 dest
[i
] = (GLdepth
) (CLAMP(depth
[i
], 0.0F
, 1.0F
) * zs
);
3310 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
3311 * Return all image data in a contiguous block.
3314 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
3315 GLenum format
, GLenum type
, const GLvoid
*pixels
,
3316 const struct gl_pixelstore_attrib
*unpack
)
3318 GLint bytesPerRow
, compsPerRow
;
3319 GLboolean flipBytes
, swap2
, swap4
;
3322 return NULL
; /* not necessarily an error */
3324 if (width
<= 0 || height
<= 0 || depth
<= 0)
3325 return NULL
; /* generate error later */
3327 if (format
== GL_BITMAP
) {
3328 bytesPerRow
= (width
+ 7) >> 3;
3329 flipBytes
= !unpack
->LsbFirst
;
3330 swap2
= swap4
= GL_FALSE
;
3334 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
3335 const GLint components
= _mesa_components_in_format(format
);
3337 if (bytesPerPixel
<= 0 || components
<= 0)
3338 return NULL
; /* bad format or type. generate error later */
3339 bytesPerRow
= bytesPerPixel
* width
;
3340 bytesPerComp
= bytesPerPixel
/ components
;
3341 flipBytes
= GL_FALSE
;
3342 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
3343 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
3344 compsPerRow
= components
* width
;
3345 assert(compsPerRow
>= width
);
3349 GLubyte
*destBuffer
= MALLOC(bytesPerRow
* height
* depth
);
3353 return NULL
; /* generate GL_OUT_OF_MEMORY later */
3356 for (img
= 0; img
< depth
; img
++) {
3357 for (row
= 0; row
< height
; row
++) {
3358 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
3359 width
, height
, format
, type
, img
, row
, 0);
3360 MEMCPY(dst
, src
, bytesPerRow
);
3361 /* byte flipping/swapping */
3363 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
3366 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
3369 _mesa_swap4((GLuint
*) dst
, compsPerRow
);