7 * Mesa 3-D graphics library
10 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
12 * Permission is hereby granted, free of charge, to any person obtaining a
13 * copy of this software and associated documentation files (the "Software"),
14 * to deal in the Software without restriction, including without limitation
15 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 * and/or sell copies of the Software, and to permit persons to whom the
17 * Software is furnished to do so, subject to the following conditions:
19 * The above copyright notice and this permission notice shall be included
20 * in all copies or substantial portions of the Software.
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 #include "histogram.h"
42 /** Compute ceiling of integer quotient of A divided by B. */
43 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
47 * Image packing parameters for Mesa's internal images.
49 * _mesa_unpack_image() returns image data in this format. When we execute
50 * image commands (glDrawPixels(), glTexImage(), etc) from within display lists
51 * we have to be sure to set the current unpacking parameters to these values!
53 const struct gl_pixelstore_attrib _mesa_native_packing
= {
60 GL_FALSE
, /* SwapBytes */
61 GL_FALSE
, /* LsbFirst */
62 GL_FALSE
, /* ClientStorage */
68 * Flip the 8 bits in each byte of the given array.
71 * \param n number of bytes.
73 * \todo try this trick to flip bytes someday:
75 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
76 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
77 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
81 flip_bytes( GLubyte
*p
, GLuint n
)
83 register GLuint i
, a
, b
;
86 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
87 a
= ((b
& 0x01) << 7) |
101 * Flip the order of the 2 bytes in each word in the given array.
104 * \param n number of words.
107 _mesa_swap2( GLushort
*p
, GLuint n
)
112 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
119 * Flip the order of the 4 bytes in each word in the given array.
122 _mesa_swap4( GLuint
*p
, GLuint n
)
124 register GLuint i
, a
, b
;
129 | ((b
>> 8) & 0xff00)
130 | ((b
<< 8) & 0xff0000)
131 | ((b
<< 24) & 0xff000000);
138 * Get the size of a GL data type.
140 * \param type GL data type.
142 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
143 * if an invalid type enum.
145 GLint
_mesa_sizeof_type( GLenum type
)
150 case GL_UNSIGNED_BYTE
:
151 return sizeof(GLubyte
);
153 return sizeof(GLbyte
);
154 case GL_UNSIGNED_SHORT
:
155 return sizeof(GLushort
);
157 return sizeof(GLshort
);
158 case GL_UNSIGNED_INT
:
159 return sizeof(GLuint
);
161 return sizeof(GLint
);
163 return sizeof(GLfloat
);
171 * Same as _mesa_sizeof_type() but also accepting the packed pixel
174 GLint
_mesa_sizeof_packed_type( GLenum type
)
179 case GL_UNSIGNED_BYTE
:
180 return sizeof(GLubyte
);
182 return sizeof(GLbyte
);
183 case GL_UNSIGNED_SHORT
:
184 return sizeof(GLushort
);
186 return sizeof(GLshort
);
187 case GL_UNSIGNED_INT
:
188 return sizeof(GLuint
);
190 return sizeof(GLint
);
192 return sizeof(GLfloat
);
193 case GL_UNSIGNED_BYTE_3_3_2
:
194 return sizeof(GLubyte
);
195 case GL_UNSIGNED_BYTE_2_3_3_REV
:
196 return sizeof(GLubyte
);
197 case GL_UNSIGNED_SHORT_5_6_5
:
198 return sizeof(GLushort
);
199 case GL_UNSIGNED_SHORT_5_6_5_REV
:
200 return sizeof(GLushort
);
201 case GL_UNSIGNED_SHORT_4_4_4_4
:
202 return sizeof(GLushort
);
203 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
204 return sizeof(GLushort
);
205 case GL_UNSIGNED_SHORT_5_5_5_1
:
206 return sizeof(GLushort
);
207 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
208 return sizeof(GLushort
);
209 case GL_UNSIGNED_INT_8_8_8_8
:
210 return sizeof(GLuint
);
211 case GL_UNSIGNED_INT_8_8_8_8_REV
:
212 return sizeof(GLuint
);
213 case GL_UNSIGNED_INT_10_10_10_2
:
214 return sizeof(GLuint
);
215 case GL_UNSIGNED_INT_2_10_10_10_REV
:
216 return sizeof(GLuint
);
217 case GL_UNSIGNED_SHORT_8_8_MESA
:
218 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
219 return sizeof(GLushort
);
227 * Get the number of components in a pixel format.
229 * \param format pixel format.
231 * \return the number of components in the given format, or -1 if a bad format.
233 GLint
_mesa_components_in_format( GLenum format
)
237 case GL_COLOR_INDEX1_EXT
:
238 case GL_COLOR_INDEX2_EXT
:
239 case GL_COLOR_INDEX4_EXT
:
240 case GL_COLOR_INDEX8_EXT
:
241 case GL_COLOR_INDEX12_EXT
:
242 case GL_COLOR_INDEX16_EXT
:
243 case GL_STENCIL_INDEX
:
244 case GL_DEPTH_COMPONENT
:
252 case GL_LUMINANCE_ALPHA
:
273 * Get the bytes per pixel of pixel format type pair.
275 * \param format pixel format.
276 * \param type pixel type.
278 * \return bytes per pixel, or -1 if a bad format or type was given.
280 GLint
_mesa_bytes_per_pixel( GLenum format
, GLenum type
)
282 GLint comps
= _mesa_components_in_format( format
);
288 return 0; /* special case */
290 case GL_UNSIGNED_BYTE
:
291 return comps
* sizeof(GLubyte
);
293 case GL_UNSIGNED_SHORT
:
294 return comps
* sizeof(GLshort
);
296 case GL_UNSIGNED_INT
:
297 return comps
* sizeof(GLint
);
299 return comps
* sizeof(GLfloat
);
300 case GL_UNSIGNED_BYTE_3_3_2
:
301 case GL_UNSIGNED_BYTE_2_3_3_REV
:
302 if (format
== GL_RGB
|| format
== GL_BGR
)
303 return sizeof(GLubyte
);
305 return -1; /* error */
306 case GL_UNSIGNED_SHORT_5_6_5
:
307 case GL_UNSIGNED_SHORT_5_6_5_REV
:
308 if (format
== GL_RGB
|| format
== GL_BGR
)
309 return sizeof(GLushort
);
311 return -1; /* error */
312 case GL_UNSIGNED_SHORT_4_4_4_4
:
313 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
314 case GL_UNSIGNED_SHORT_5_5_5_1
:
315 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
316 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
317 return sizeof(GLushort
);
320 case GL_UNSIGNED_INT_8_8_8_8
:
321 case GL_UNSIGNED_INT_8_8_8_8_REV
:
322 case GL_UNSIGNED_INT_10_10_10_2
:
323 case GL_UNSIGNED_INT_2_10_10_10_REV
:
324 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
325 return sizeof(GLuint
);
328 case GL_UNSIGNED_SHORT_8_8_MESA
:
329 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
330 if (format
== GL_YCBCR_MESA
)
331 return sizeof(GLushort
);
341 * Test for a legal pixel format and type.
343 * \param format pixel format.
344 * \param type pixel type.
346 * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
350 _mesa_is_legal_format_and_type( GLenum format
, GLenum type
)
354 case GL_STENCIL_INDEX
:
358 case GL_UNSIGNED_BYTE
:
360 case GL_UNSIGNED_SHORT
:
362 case GL_UNSIGNED_INT
:
374 case GL_LUMINANCE_ALPHA
:
375 case GL_DEPTH_COMPONENT
:
378 case GL_UNSIGNED_BYTE
:
380 case GL_UNSIGNED_SHORT
:
382 case GL_UNSIGNED_INT
:
392 case GL_UNSIGNED_BYTE
:
394 case GL_UNSIGNED_SHORT
:
396 case GL_UNSIGNED_INT
:
398 case GL_UNSIGNED_BYTE_3_3_2
:
399 case GL_UNSIGNED_BYTE_2_3_3_REV
:
400 case GL_UNSIGNED_SHORT_5_6_5
:
401 case GL_UNSIGNED_SHORT_5_6_5_REV
:
411 case GL_UNSIGNED_BYTE
:
413 case GL_UNSIGNED_SHORT
:
415 case GL_UNSIGNED_INT
:
417 case GL_UNSIGNED_SHORT_4_4_4_4
:
418 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
419 case GL_UNSIGNED_SHORT_5_5_5_1
:
420 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
421 case GL_UNSIGNED_INT_8_8_8_8
:
422 case GL_UNSIGNED_INT_8_8_8_8_REV
:
423 case GL_UNSIGNED_INT_10_10_10_2
:
424 case GL_UNSIGNED_INT_2_10_10_10_REV
:
430 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
||
431 type
== GL_UNSIGNED_SHORT_8_8_REV_MESA
)
443 * Get the address of a pixel in an image (actually a volume).
445 * Pixel unpacking/packing parameters are observed according to \p packing.
447 * \param image start of image data.
448 * \param width image width.
449 * \param height image height.
450 * \param format pixel format.
451 * \param type pixel data type.
452 * \param packing the pixelstore attributes
453 * \param img which image in the volume (0 for 1D or 2D images)
454 * \param row of pixel in the image
455 * \param column of pixel in the image
457 * \return address of pixel on success, or NULL on error.
459 * According to the \p packing information calculates the number of pixel/bytes
460 * per row/image and refers it.
462 * \sa gl_pixelstore_attrib.
465 _mesa_image_address( const struct gl_pixelstore_attrib
*packing
,
466 const GLvoid
*image
, GLsizei width
,
467 GLsizei height
, GLenum format
, GLenum type
,
468 GLint img
, GLint row
, GLint column
)
470 GLint alignment
; /* 1, 2 or 4 */
471 GLint pixels_per_row
;
472 GLint rows_per_image
;
475 GLint skipimages
; /* for 3-D volume images */
478 alignment
= packing
->Alignment
;
479 if (packing
->RowLength
> 0) {
480 pixels_per_row
= packing
->RowLength
;
483 pixels_per_row
= width
;
485 if (packing
->ImageHeight
> 0) {
486 rows_per_image
= packing
->ImageHeight
;
489 rows_per_image
= height
;
491 skiprows
= packing
->SkipRows
;
492 skippixels
= packing
->SkipPixels
;
493 skipimages
= packing
->SkipImages
;
495 if (type
==GL_BITMAP
) {
497 GLint comp_per_pixel
; /* components per pixel */
498 GLint bytes_per_comp
; /* bytes per component */
500 GLint bytes_per_image
;
502 /* Compute bytes per component */
503 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
504 if (bytes_per_comp
<0) {
508 /* Compute number of components per pixel */
509 comp_per_pixel
= _mesa_components_in_format( format
);
510 if (comp_per_pixel
<0 && type
!= GL_BITMAP
) {
514 bytes_per_row
= alignment
515 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
517 bytes_per_image
= bytes_per_row
* rows_per_image
;
519 pixel_addr
= (GLubyte
*) image
520 + (skipimages
+ img
) * bytes_per_image
521 + (skiprows
+ row
) * bytes_per_row
522 + (skippixels
+ column
) / 8;
525 /* Non-BITMAP data */
526 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
529 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
531 /* The pixel type and format should have been error checked earlier */
532 assert(bytes_per_pixel
> 0);
534 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
535 remainder
= bytes_per_row
% alignment
;
537 bytes_per_row
+= (alignment
- remainder
);
539 ASSERT(bytes_per_row
% alignment
== 0);
541 bytes_per_image
= bytes_per_row
* rows_per_image
;
543 if (packing
->Invert
) {
544 /* set pixel_addr to the last row */
545 topOfImage
= bytes_per_row
* (height
- 1);
546 bytes_per_row
= -bytes_per_row
;
552 /* compute final pixel address */
553 pixel_addr
= (GLubyte
*) image
554 + (skipimages
+ img
) * bytes_per_image
556 + (skiprows
+ row
) * bytes_per_row
557 + (skippixels
+ column
) * bytes_per_pixel
;
560 return (GLvoid
*) pixel_addr
;
565 * Compute the stride between image rows.
567 * \param packing the pixelstore attributes
568 * \param width image width.
569 * \param format pixel format.
570 * \param type pixel data type.
572 * \return the stride in bytes for the given parameters.
574 * Computes the number of bytes per pixel and row and compensates for alignment.
576 * \sa gl_pixelstore_attrib.
579 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
580 GLint width
, GLenum format
, GLenum type
)
583 if (type
== GL_BITMAP
) {
586 if (packing
->RowLength
== 0) {
587 bytes
= (width
+ 7) / 8;
590 bytes
= (packing
->RowLength
+ 7) / 8;
592 if (packing
->Invert
) {
593 /* negate the bytes per row (negative row stride) */
599 /* Non-BITMAP data */
600 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
601 GLint bytesPerRow
, remainder
;
602 if (bytesPerPixel
<= 0)
603 return -1; /* error */
604 if (packing
->RowLength
== 0) {
605 bytesPerRow
= bytesPerPixel
* width
;
608 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
610 remainder
= bytesPerRow
% packing
->Alignment
;
612 bytesPerRow
+= (packing
->Alignment
- remainder
);
614 bytesPerRow
= -bytesPerRow
;
623 * Compute the stride between images in a 3D texture (in bytes) for the given
624 * pixel packing parameters and image width, format and type.
627 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
628 GLint width
, GLint height
,
629 GLenum format
, GLenum type
)
632 ASSERT(type
!= GL_BITMAP
);
635 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
636 GLint bytesPerRow
, bytesPerImage
, remainder
;
638 if (bytesPerPixel
<= 0)
639 return -1; /* error */
640 if (packing
->RowLength
== 0) {
641 bytesPerRow
= bytesPerPixel
* width
;
644 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
646 remainder
= bytesPerRow
% packing
->Alignment
;
648 bytesPerRow
+= (packing
->Alignment
- remainder
);
650 if (packing
->ImageHeight
== 0)
651 bytesPerImage
= bytesPerRow
* height
;
653 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
655 return bytesPerImage
;
661 * Unpack a 32x32 pixel polygon stipple from user memory using the
662 * current pixel unpack settings.
665 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
666 const struct gl_pixelstore_attrib
*unpacking
)
668 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap( 32, 32, pattern
, unpacking
);
670 /* Convert pattern from GLubytes to GLuints and handle big/little
675 for (i
= 0; i
< 32; i
++) {
676 dest
[i
] = (p
[0] << 24)
688 * Pack polygon stipple into user memory given current pixel packing
692 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
693 const struct gl_pixelstore_attrib
*packing
)
695 /* Convert pattern from GLuints to GLubytes to handle big/little
696 * endian differences.
700 for (i
= 0; i
< 32; i
++) {
701 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
702 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
703 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
704 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
707 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
712 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
713 * order with row alignment = 1 byte.
716 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
717 const struct gl_pixelstore_attrib
*packing
)
719 GLint bytes
, row
, width_in_bytes
;
720 GLubyte
*buffer
, *dst
;
725 /* Alloc dest storage */
726 bytes
= ((width
+ 7) / 8 * height
);
727 buffer
= (GLubyte
*) MALLOC( bytes
);
732 width_in_bytes
= CEILING( width
, 8 );
734 for (row
= 0; row
< height
; row
++) {
735 const GLubyte
*src
= (const GLubyte
*)
736 _mesa_image_address(packing
, pixels
, width
, height
,
737 GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0);
743 if (packing
->SkipPixels
== 0) {
744 MEMCPY( dst
, src
, width_in_bytes
);
745 if (packing
->LsbFirst
) {
746 flip_bytes( dst
, width_in_bytes
);
750 /* handling SkipPixels is a bit tricky (no pun intended!) */
752 if (packing
->LsbFirst
) {
753 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
754 GLubyte dstMask
= 128;
755 const GLubyte
*s
= src
;
758 for (i
= 0; i
< width
; i
++) {
762 if (srcMask
== 128) {
767 srcMask
= srcMask
<< 1;
775 dstMask
= dstMask
>> 1;
780 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
781 GLubyte dstMask
= 128;
782 const GLubyte
*s
= src
;
785 for (i
= 0; i
< width
; i
++) {
794 srcMask
= srcMask
>> 1;
802 dstMask
= dstMask
>> 1;
807 dst
+= width_in_bytes
;
818 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
819 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
821 GLint row
, width_in_bytes
;
827 width_in_bytes
= CEILING( width
, 8 );
829 for (row
= 0; row
< height
; row
++) {
830 GLubyte
*dst
= (GLubyte
*) _mesa_image_address( packing
, dest
,
831 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0 );
835 if (packing
->SkipPixels
== 0) {
836 MEMCPY( dst
, src
, width_in_bytes
);
837 if (packing
->LsbFirst
) {
838 flip_bytes( dst
, width_in_bytes
);
842 /* handling SkipPixels is a bit tricky (no pun intended!) */
844 if (packing
->LsbFirst
) {
845 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
846 GLubyte dstMask
= 128;
847 const GLubyte
*s
= src
;
850 for (i
= 0; i
< width
; i
++) {
854 if (srcMask
== 128) {
859 srcMask
= srcMask
<< 1;
867 dstMask
= dstMask
>> 1;
872 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
873 GLubyte dstMask
= 128;
874 const GLubyte
*s
= src
;
877 for (i
= 0; i
< width
; i
++) {
886 srcMask
= srcMask
>> 1;
894 dstMask
= dstMask
>> 1;
899 src
+= width_in_bytes
;
905 * Used to pack an array [][4] of RGBA GLchan colors as specified
906 * by the dstFormat, dstType and dstPacking. Used by glReadPixels,
907 * glGetConvolutionFilter(), etc.
910 _mesa_pack_float_rgba_span( GLcontext
*ctx
,
911 GLuint n
, CONST GLfloat rgbaIn
[][4],
912 GLenum dstFormat
, GLenum dstType
,
914 const struct gl_pixelstore_attrib
*dstPacking
,
917 const GLint comps
= _mesa_components_in_format(dstFormat
);
918 GLfloat luminance
[MAX_WIDTH
];
923 /* make copy of incoming data */
924 DEFMARRAY(GLfloat
, rgbaCopy
, MAX_WIDTH
, 4); /* mac 32k limitation */
925 CHECKARRAY(rgbaCopy
, return); /* mac 32k limitation */
927 for (i
= 0; i
< n
; i
++) {
928 rgbaCopy
[i
][0] = rgbaIn
[i
][0];
929 rgbaCopy
[i
][1] = rgbaIn
[i
][1];
930 rgbaCopy
[i
][2] = rgbaIn
[i
][2];
931 rgbaCopy
[i
][3] = rgbaIn
[i
][3];
934 rgba
= (GLfloat (*)[4]) rgbaCopy
;
937 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
938 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
939 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
940 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
941 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
942 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
944 /* color map lookup */
945 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
946 _mesa_map_rgba( ctx
, n
, rgba
);
948 /* GL_COLOR_TABLE lookup */
949 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
950 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
953 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
954 /* this has to be done in the calling code */
956 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
957 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
958 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
959 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
960 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
961 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
962 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
963 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
964 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
965 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
966 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
968 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
969 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
970 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
972 /* color matrix transform */
973 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
974 _mesa_transform_rgba(ctx
, n
, rgba
);
976 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
977 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
978 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
980 /* update histogram count */
981 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
982 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
985 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
986 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
987 if (ctx
->MinMax
.Sink
) {
988 UNDEFARRAY(rgbaCopy
); /* mac 32k limitation */
992 UNDEFARRAY(rgbaCopy
); /* mac 32k limitation */
995 /* use incoming data, not a copy */
996 rgba
= (GLfloat (*)[4]) rgbaIn
;
999 /* XXX clamp rgba to [0,1]? */
1002 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
1003 for (i
= 0; i
< n
; i
++) {
1004 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1005 #if CHAN_TYPE == GL_FLOAT
1008 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
1014 * Pack/store the pixels. Ugh! Lots of cases!!!
1017 case GL_UNSIGNED_BYTE
:
1019 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1020 switch (dstFormat
) {
1023 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1027 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1031 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1035 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1039 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
1041 case GL_LUMINANCE_ALPHA
:
1043 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
1044 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1049 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1050 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1051 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1056 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1057 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1058 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1059 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1064 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1065 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1066 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1071 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1072 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1073 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1074 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1079 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1080 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1081 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1082 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1086 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1092 GLbyte
*dst
= (GLbyte
*) dstAddr
;
1093 switch (dstFormat
) {
1096 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1100 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1104 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1108 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1112 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
1114 case GL_LUMINANCE_ALPHA
:
1116 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
1117 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1122 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1123 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1124 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1129 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1130 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1131 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1132 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1137 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1138 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1139 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1144 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1145 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1146 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1147 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1151 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1152 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1153 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1154 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1158 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1162 case GL_UNSIGNED_SHORT
:
1164 GLushort
*dst
= (GLushort
*) dstAddr
;
1165 switch (dstFormat
) {
1168 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1172 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1176 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1180 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1184 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
1186 case GL_LUMINANCE_ALPHA
:
1188 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
1189 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1194 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1195 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1196 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1201 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1202 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1203 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1204 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1209 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1210 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1211 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1216 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1217 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1218 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1219 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1224 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
1225 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
1226 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1227 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1231 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1233 if (dstPacking
->SwapBytes
) {
1234 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1240 GLshort
*dst
= (GLshort
*) dstAddr
;
1241 switch (dstFormat
) {
1244 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1248 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1252 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1256 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1260 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1262 case GL_LUMINANCE_ALPHA
:
1264 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1265 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1270 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1271 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1272 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1277 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1278 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1279 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1280 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1285 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1286 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1287 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1292 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1293 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1294 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1295 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1299 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1300 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1301 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1302 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1306 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1308 if (dstPacking
->SwapBytes
) {
1309 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1313 case GL_UNSIGNED_INT
:
1315 GLuint
*dst
= (GLuint
*) dstAddr
;
1316 switch (dstFormat
) {
1319 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1323 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1327 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1331 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1335 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1337 case GL_LUMINANCE_ALPHA
:
1339 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1340 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1345 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1346 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1347 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1352 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1353 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1354 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1355 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1360 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1361 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1362 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1367 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1368 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1369 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1370 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1375 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1376 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1377 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1378 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1382 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1384 if (dstPacking
->SwapBytes
) {
1385 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1391 GLint
*dst
= (GLint
*) dstAddr
;
1392 switch (dstFormat
) {
1395 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1399 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1403 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1407 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1411 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1413 case GL_LUMINANCE_ALPHA
:
1415 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1416 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1421 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1422 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1423 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1428 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1429 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1430 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1431 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1436 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1437 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1438 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1443 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1444 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1445 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1446 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1451 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1452 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1453 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1454 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1458 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1460 if (dstPacking
->SwapBytes
) {
1461 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1467 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1468 switch (dstFormat
) {
1471 dst
[i
] = rgba
[i
][RCOMP
];
1475 dst
[i
] = rgba
[i
][GCOMP
];
1479 dst
[i
] = rgba
[i
][BCOMP
];
1483 dst
[i
] = rgba
[i
][ACOMP
];
1487 dst
[i
] = luminance
[i
];
1489 case GL_LUMINANCE_ALPHA
:
1491 dst
[i
*2+0] = luminance
[i
];
1492 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1497 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1498 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1499 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1504 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1505 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1506 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1507 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1512 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1513 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1514 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1519 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1520 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1521 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1522 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1527 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1528 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1529 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1530 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1534 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1536 if (dstPacking
->SwapBytes
) {
1537 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1541 case GL_UNSIGNED_BYTE_3_3_2
:
1542 if (dstFormat
== GL_RGB
) {
1543 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1545 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1546 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1547 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1551 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1552 if (dstFormat
== GL_RGB
) {
1553 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1555 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1556 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1557 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1561 case GL_UNSIGNED_SHORT_5_6_5
:
1562 if (dstFormat
== GL_RGB
) {
1563 GLushort
*dst
= (GLushort
*) dstAddr
;
1565 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1566 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1567 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1571 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1572 if (dstFormat
== GL_RGB
) {
1573 GLushort
*dst
= (GLushort
*) dstAddr
;
1575 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1576 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1577 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1581 case GL_UNSIGNED_SHORT_4_4_4_4
:
1582 if (dstFormat
== GL_RGBA
) {
1583 GLushort
*dst
= (GLushort
*) dstAddr
;
1585 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1586 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1587 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1588 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1591 else if (dstFormat
== GL_BGRA
) {
1592 GLushort
*dst
= (GLushort
*) dstAddr
;
1594 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 12)
1595 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1596 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 4)
1597 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1600 else if (dstFormat
== GL_ABGR_EXT
) {
1601 GLushort
*dst
= (GLushort
*) dstAddr
;
1603 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 4)
1604 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1605 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 12)
1606 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) );
1610 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1611 if (dstFormat
== GL_RGBA
) {
1612 GLushort
*dst
= (GLushort
*) dstAddr
;
1614 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1615 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1616 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1617 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1620 else if (dstFormat
== GL_BGRA
) {
1621 GLushort
*dst
= (GLushort
*) dstAddr
;
1623 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) )
1624 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1625 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 8)
1626 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1629 else if (dstFormat
== GL_ABGR_EXT
) {
1630 GLushort
*dst
= (GLushort
*) dstAddr
;
1632 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) )
1633 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1634 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1635 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12);
1639 case GL_UNSIGNED_SHORT_5_5_5_1
:
1640 if (dstFormat
== GL_RGBA
) {
1641 GLushort
*dst
= (GLushort
*) dstAddr
;
1643 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1644 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1645 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1646 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1649 else if (dstFormat
== GL_BGRA
) {
1650 GLushort
*dst
= (GLushort
*) dstAddr
;
1652 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11)
1653 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1654 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 1)
1655 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1658 else if (dstFormat
== GL_ABGR_EXT
) {
1659 GLushort
*dst
= (GLushort
*) dstAddr
;
1661 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) << 11)
1662 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 6)
1663 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 1)
1664 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) );
1668 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1669 if (dstFormat
== GL_RGBA
) {
1670 GLushort
*dst
= (GLushort
*) dstAddr
;
1672 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1673 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1674 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1675 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1678 else if (dstFormat
== GL_BGRA
) {
1679 GLushort
*dst
= (GLushort
*) dstAddr
;
1681 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) )
1682 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1683 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 10)
1684 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1687 else if (dstFormat
== GL_ABGR_EXT
) {
1688 GLushort
*dst
= (GLushort
*) dstAddr
;
1690 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) )
1691 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 5)
1692 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 10)
1693 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) << 15);
1697 case GL_UNSIGNED_INT_8_8_8_8
:
1698 if (dstFormat
== GL_RGBA
) {
1699 GLuint
*dst
= (GLuint
*) dstAddr
;
1701 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1702 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1703 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1704 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1707 else if (dstFormat
== GL_BGRA
) {
1708 GLuint
*dst
= (GLuint
*) dstAddr
;
1710 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1711 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1712 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1713 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1716 else if (dstFormat
== GL_ABGR_EXT
) {
1717 GLuint
*dst
= (GLuint
*) dstAddr
;
1719 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1720 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1721 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1722 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1726 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1727 if (dstFormat
== GL_RGBA
) {
1728 GLuint
*dst
= (GLuint
*) dstAddr
;
1730 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1731 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1732 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1733 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1736 else if (dstFormat
== GL_BGRA
) {
1737 GLuint
*dst
= (GLuint
*) dstAddr
;
1739 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1740 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1741 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1742 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1745 else if (dstFormat
== GL_ABGR_EXT
) {
1746 GLuint
*dst
= (GLuint
*) dstAddr
;
1748 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1749 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1750 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1751 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1755 case GL_UNSIGNED_INT_10_10_10_2
:
1756 if (dstFormat
== GL_RGBA
) {
1757 GLuint
*dst
= (GLuint
*) dstAddr
;
1759 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1760 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1761 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1762 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1765 else if (dstFormat
== GL_BGRA
) {
1766 GLuint
*dst
= (GLuint
*) dstAddr
;
1768 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1769 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1770 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1771 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1774 else if (dstFormat
== GL_ABGR_EXT
) {
1775 GLuint
*dst
= (GLuint
*) dstAddr
;
1777 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1778 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1779 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1780 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1784 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1785 if (dstFormat
== GL_RGBA
) {
1786 GLuint
*dst
= (GLuint
*) dstAddr
;
1788 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1789 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1790 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1791 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1794 else if (dstFormat
== GL_BGRA
) {
1795 GLuint
*dst
= (GLuint
*) dstAddr
;
1797 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1798 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1799 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1800 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1803 else if (dstFormat
== GL_ABGR_EXT
) {
1804 GLuint
*dst
= (GLuint
*) dstAddr
;
1806 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1807 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1808 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1809 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1814 _mesa_problem(ctx
, "bad type in _mesa_pack_float_rgba_span");
1820 * Pack the given RGBA span into client memory at 'dest' address
1821 * in the given pixel format and type.
1822 * Optionally apply the enabled pixel transfer ops.
1823 * Pack into memory using the given packing params struct.
1824 * This is used by glReadPixels and glGetTexImage?D()
1825 * \param ctx - the context
1826 * n - number of pixels in the span
1828 * format - dest packing format
1829 * type - dest packing data type
1830 * destination - destination packing address
1831 * packing - pixel packing parameters
1832 * transferOps - bitmask of IMAGE_*_BIT operations to apply
1835 _mesa_pack_rgba_span( GLcontext
*ctx
,
1836 GLuint n
, CONST GLchan srcRgba
[][4],
1837 GLenum dstFormat
, GLenum dstType
,
1839 const struct gl_pixelstore_attrib
*dstPacking
,
1842 ASSERT((ctx
->NewState
& _NEW_PIXEL
) == 0 || transferOps
== 0);
1844 /* Test for optimized case first */
1845 if (transferOps
== 0 && dstFormat
== GL_RGBA
&& dstType
== CHAN_TYPE
) {
1846 /* common simple case */
1847 MEMCPY(dstAddr
, srcRgba
, n
* 4 * sizeof(GLchan
));
1849 else if (transferOps
== 0 && dstFormat
== GL_RGB
&& dstType
== CHAN_TYPE
) {
1850 /* common simple case */
1852 GLchan
*dest
= (GLchan
*) dstAddr
;
1853 for (i
= 0; i
< n
; i
++) {
1854 dest
[0] = srcRgba
[i
][RCOMP
];
1855 dest
[1] = srcRgba
[i
][GCOMP
];
1856 dest
[2] = srcRgba
[i
][BCOMP
];
1860 else if (transferOps
== 0 && dstFormat
== GL_RGBA
&& dstType
== GL_UNSIGNED_BYTE
) {
1861 /* common simple case */
1863 GLubyte
*dest
= (GLubyte
*) dstAddr
;
1864 for (i
= 0; i
< n
; i
++) {
1865 dest
[0] = CHAN_TO_UBYTE(srcRgba
[i
][RCOMP
]);
1866 dest
[1] = CHAN_TO_UBYTE(srcRgba
[i
][GCOMP
]);
1867 dest
[2] = CHAN_TO_UBYTE(srcRgba
[i
][BCOMP
]);
1868 dest
[3] = CHAN_TO_UBYTE(srcRgba
[i
][ACOMP
]);
1873 /* general solution */
1875 DEFMARRAY(GLfloat
, rgba
, MAX_WIDTH
, 4); /* mac 32k limitation */
1876 CHECKARRAY(rgba
, return); /* mac 32k limitation */
1878 assert(n
<= MAX_WIDTH
);
1879 /* convert color components to floating point */
1881 rgba
[i
][RCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][RCOMP
]);
1882 rgba
[i
][GCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][GCOMP
]);
1883 rgba
[i
][BCOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][BCOMP
]);
1884 rgba
[i
][ACOMP
] = CHAN_TO_FLOAT(srcRgba
[i
][ACOMP
]);
1886 _mesa_pack_float_rgba_span(ctx
, n
, (const GLfloat (*)[4]) rgba
,
1887 dstFormat
, dstType
, dstAddr
,
1888 dstPacking
, transferOps
);
1889 UNDEFARRAY(rgba
); /* mac 32k limitation */
1894 #define SWAP2BYTE(VALUE) \
1896 GLubyte *bytes = (GLubyte *) &(VALUE); \
1897 GLubyte tmp = bytes[0]; \
1898 bytes[0] = bytes[1]; \
1902 #define SWAP4BYTE(VALUE) \
1904 GLubyte *bytes = (GLubyte *) &(VALUE); \
1905 GLubyte tmp = bytes[0]; \
1906 bytes[0] = bytes[3]; \
1909 bytes[1] = bytes[2]; \
1915 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1916 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1917 const struct gl_pixelstore_attrib
*unpack
)
1919 assert(srcFormat
== GL_COLOR_INDEX
);
1921 ASSERT(srcType
== GL_BITMAP
||
1922 srcType
== GL_UNSIGNED_BYTE
||
1923 srcType
== GL_BYTE
||
1924 srcType
== GL_UNSIGNED_SHORT
||
1925 srcType
== GL_SHORT
||
1926 srcType
== GL_UNSIGNED_INT
||
1927 srcType
== GL_INT
||
1928 srcType
== GL_FLOAT
);
1933 GLubyte
*ubsrc
= (GLubyte
*) src
;
1934 if (unpack
->LsbFirst
) {
1935 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1937 for (i
= 0; i
< n
; i
++) {
1938 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1949 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1951 for (i
= 0; i
< n
; i
++) {
1952 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1964 case GL_UNSIGNED_BYTE
:
1967 const GLubyte
*s
= (const GLubyte
*) src
;
1968 for (i
= 0; i
< n
; i
++)
1975 const GLbyte
*s
= (const GLbyte
*) src
;
1976 for (i
= 0; i
< n
; i
++)
1980 case GL_UNSIGNED_SHORT
:
1983 const GLushort
*s
= (const GLushort
*) src
;
1984 if (unpack
->SwapBytes
) {
1985 for (i
= 0; i
< n
; i
++) {
1986 GLushort value
= s
[i
];
1992 for (i
= 0; i
< n
; i
++)
2000 const GLshort
*s
= (const GLshort
*) src
;
2001 if (unpack
->SwapBytes
) {
2002 for (i
= 0; i
< n
; i
++) {
2003 GLshort value
= s
[i
];
2009 for (i
= 0; i
< n
; i
++)
2014 case GL_UNSIGNED_INT
:
2017 const GLuint
*s
= (const GLuint
*) src
;
2018 if (unpack
->SwapBytes
) {
2019 for (i
= 0; i
< n
; i
++) {
2020 GLuint value
= s
[i
];
2026 for (i
= 0; i
< n
; i
++)
2034 const GLint
*s
= (const GLint
*) src
;
2035 if (unpack
->SwapBytes
) {
2036 for (i
= 0; i
< n
; i
++) {
2043 for (i
= 0; i
< n
; i
++)
2051 const GLfloat
*s
= (const GLfloat
*) src
;
2052 if (unpack
->SwapBytes
) {
2053 for (i
= 0; i
< n
; i
++) {
2054 GLfloat value
= s
[i
];
2056 indexes
[i
] = (GLuint
) value
;
2060 for (i
= 0; i
< n
; i
++)
2061 indexes
[i
] = (GLuint
) s
[i
];
2066 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2073 * This function extracts floating point RGBA values from arbitrary
2074 * image data. srcFormat and srcType are the format and type parameters
2075 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2077 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2078 * implements the "Conversion to floating point", "Conversion to RGB",
2079 * and "Final Expansion to RGBA" operations.
2081 * Args: n - number of pixels
2082 * rgba - output colors
2083 * srcFormat - format of incoming data
2084 * srcType - data type of incoming data
2085 * src - source data pointer
2086 * swapBytes - perform byteswapping of incoming data?
2089 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2090 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2091 GLboolean swapBytes
)
2093 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
2095 GLint rComp
, bComp
, gComp
, aComp
;
2097 ASSERT(srcFormat
== GL_RED
||
2098 srcFormat
== GL_GREEN
||
2099 srcFormat
== GL_BLUE
||
2100 srcFormat
== GL_ALPHA
||
2101 srcFormat
== GL_LUMINANCE
||
2102 srcFormat
== GL_LUMINANCE_ALPHA
||
2103 srcFormat
== GL_INTENSITY
||
2104 srcFormat
== GL_RGB
||
2105 srcFormat
== GL_BGR
||
2106 srcFormat
== GL_RGBA
||
2107 srcFormat
== GL_BGRA
||
2108 srcFormat
== GL_ABGR_EXT
);
2110 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2111 srcType
== GL_BYTE
||
2112 srcType
== GL_UNSIGNED_SHORT
||
2113 srcType
== GL_SHORT
||
2114 srcType
== GL_UNSIGNED_INT
||
2115 srcType
== GL_INT
||
2116 srcType
== GL_FLOAT
||
2117 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2118 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2119 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2120 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2121 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2122 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2123 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2124 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2125 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2126 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2127 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2128 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2130 rComp
= gComp
= bComp
= aComp
= -1;
2132 switch (srcFormat
) {
2135 greenIndex
= blueIndex
= alphaIndex
= -1;
2140 redIndex
= blueIndex
= alphaIndex
= -1;
2145 redIndex
= greenIndex
= alphaIndex
= -1;
2149 redIndex
= greenIndex
= blueIndex
= -1;
2154 redIndex
= greenIndex
= blueIndex
= 0;
2158 case GL_LUMINANCE_ALPHA
:
2159 redIndex
= greenIndex
= blueIndex
= 0;
2164 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
2215 _mesa_problem(NULL
, "bad srcFormat in extract float data");
2220 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
2221 if ((INDEX) < 0) { \
2223 for (i = 0; i < n; i++) { \
2224 rgba[i][CHANNEL] = DEFAULT; \
2227 else if (swapBytes) { \
2228 const TYPE *s = (const TYPE *) src; \
2230 for (i = 0; i < n; i++) { \
2231 TYPE value = s[INDEX]; \
2232 if (sizeof(TYPE) == 2) { \
2235 else if (sizeof(TYPE) == 4) { \
2238 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2243 const TYPE *s = (const TYPE *) src; \
2245 for (i = 0; i < n; i++) { \
2246 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2252 case GL_UNSIGNED_BYTE
:
2253 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2254 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2255 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2256 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2259 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2260 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2261 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2262 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
2264 case GL_UNSIGNED_SHORT
:
2265 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2266 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2267 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2268 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
2271 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2272 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2273 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2274 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
2276 case GL_UNSIGNED_INT
:
2277 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2278 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2279 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2280 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
2283 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2284 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2285 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2286 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
2289 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2290 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2291 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2292 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
2294 case GL_UNSIGNED_BYTE_3_3_2
:
2296 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2298 for (i
= 0; i
< n
; i
++) {
2299 GLubyte p
= ubsrc
[i
];
2300 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
2301 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
2302 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
2303 rgba
[i
][ACOMP
] = 1.0F
;
2307 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2309 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2311 for (i
= 0; i
< n
; i
++) {
2312 GLubyte p
= ubsrc
[i
];
2313 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
2314 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
2315 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
2316 rgba
[i
][ACOMP
] = 1.0F
;
2320 case GL_UNSIGNED_SHORT_5_6_5
:
2322 const GLushort
*ussrc
= (const GLushort
*) src
;
2324 for (i
= 0; i
< n
; i
++) {
2325 GLushort p
= ussrc
[i
];
2327 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2328 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2329 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2330 rgba
[i
][ACOMP
] = 1.0F
;
2334 const GLushort
*ussrc
= (const GLushort
*) src
;
2336 for (i
= 0; i
< n
; i
++) {
2337 GLushort p
= ussrc
[i
];
2338 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2339 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2340 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2341 rgba
[i
][ACOMP
] = 1.0F
;
2345 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2347 const GLushort
*ussrc
= (const GLushort
*) src
;
2349 for (i
= 0; i
< n
; i
++) {
2350 GLushort p
= ussrc
[i
];
2352 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2353 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2354 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2355 rgba
[i
][ACOMP
] = 1.0F
;
2359 const GLushort
*ussrc
= (const GLushort
*) src
;
2361 for (i
= 0; i
< n
; i
++) {
2362 GLushort p
= ussrc
[i
];
2363 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2364 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2365 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2366 rgba
[i
][ACOMP
] = 1.0F
;
2370 case GL_UNSIGNED_SHORT_4_4_4_4
:
2372 const GLushort
*ussrc
= (const GLushort
*) src
;
2374 for (i
= 0; i
< n
; i
++) {
2375 GLushort p
= ussrc
[i
];
2377 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2378 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2379 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2380 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2384 const GLushort
*ussrc
= (const GLushort
*) src
;
2386 for (i
= 0; i
< n
; i
++) {
2387 GLushort p
= ussrc
[i
];
2388 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2389 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2390 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2391 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2395 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2397 const GLushort
*ussrc
= (const GLushort
*) src
;
2399 for (i
= 0; i
< n
; i
++) {
2400 GLushort p
= ussrc
[i
];
2402 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2403 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2404 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2405 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2409 const GLushort
*ussrc
= (const GLushort
*) src
;
2411 for (i
= 0; i
< n
; i
++) {
2412 GLushort p
= ussrc
[i
];
2413 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2414 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2415 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2416 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2420 case GL_UNSIGNED_SHORT_5_5_5_1
:
2422 const GLushort
*ussrc
= (const GLushort
*) src
;
2424 for (i
= 0; i
< n
; i
++) {
2425 GLushort p
= ussrc
[i
];
2427 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2428 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2429 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2430 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2434 const GLushort
*ussrc
= (const GLushort
*) src
;
2436 for (i
= 0; i
< n
; i
++) {
2437 GLushort p
= ussrc
[i
];
2438 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2439 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2440 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2441 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2445 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2447 const GLushort
*ussrc
= (const GLushort
*) src
;
2449 for (i
= 0; i
< n
; i
++) {
2450 GLushort p
= ussrc
[i
];
2452 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2453 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2454 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2455 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2459 const GLushort
*ussrc
= (const GLushort
*) src
;
2461 for (i
= 0; i
< n
; i
++) {
2462 GLushort p
= ussrc
[i
];
2463 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2464 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2465 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2466 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2470 case GL_UNSIGNED_INT_8_8_8_8
:
2472 const GLuint
*uisrc
= (const GLuint
*) src
;
2474 for (i
= 0; i
< n
; i
++) {
2475 GLuint p
= uisrc
[i
];
2476 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2477 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2478 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2479 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2483 const GLuint
*uisrc
= (const GLuint
*) src
;
2485 for (i
= 0; i
< n
; i
++) {
2486 GLuint p
= uisrc
[i
];
2487 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2488 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2489 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2490 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2494 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2496 const GLuint
*uisrc
= (const GLuint
*) src
;
2498 for (i
= 0; i
< n
; i
++) {
2499 GLuint p
= uisrc
[i
];
2500 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2501 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2502 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2503 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2507 const GLuint
*uisrc
= (const GLuint
*) src
;
2509 for (i
= 0; i
< n
; i
++) {
2510 GLuint p
= uisrc
[i
];
2511 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2512 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2513 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2514 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2518 case GL_UNSIGNED_INT_10_10_10_2
:
2520 const GLuint
*uisrc
= (const GLuint
*) src
;
2522 for (i
= 0; i
< n
; i
++) {
2523 GLuint p
= uisrc
[i
];
2525 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2526 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2527 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2528 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2532 const GLuint
*uisrc
= (const GLuint
*) src
;
2534 for (i
= 0; i
< n
; i
++) {
2535 GLuint p
= uisrc
[i
];
2536 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2537 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2538 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2539 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2543 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2545 const GLuint
*uisrc
= (const GLuint
*) src
;
2547 for (i
= 0; i
< n
; i
++) {
2548 GLuint p
= uisrc
[i
];
2550 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2551 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2552 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2553 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2557 const GLuint
*uisrc
= (const GLuint
*) src
;
2559 for (i
= 0; i
< n
; i
++) {
2560 GLuint p
= uisrc
[i
];
2561 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2562 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2563 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2564 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2569 _mesa_problem(NULL
, "bad srcType in extract float data");
2576 * Unpack a row of color image data from a client buffer according to
2577 * the pixel unpacking parameters.
2578 * Return GLubyte values in the specified dest image format.
2579 * This is (or will be) used by glDrawPixels and glTexImage?D().
2580 * \param ctx - the context
2581 * n - number of pixels in the span
2582 * dstFormat - format of destination color array
2583 * dest - the destination color array
2584 * srcFormat - source image format
2585 * srcType - source image data type
2586 * source - source image pointer
2587 * srcPacking - pixel unpacking parameters
2588 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2590 * XXX perhaps expand this to process whole images someday.
2593 _mesa_unpack_chan_color_span( GLcontext
*ctx
,
2594 GLuint n
, GLenum dstFormat
, GLchan dest
[],
2595 GLenum srcFormat
, GLenum srcType
,
2596 const GLvoid
*source
,
2597 const struct gl_pixelstore_attrib
*srcPacking
,
2598 GLuint transferOps
)
2600 ASSERT(dstFormat
== GL_ALPHA
||
2601 dstFormat
== GL_LUMINANCE
||
2602 dstFormat
== GL_LUMINANCE_ALPHA
||
2603 dstFormat
== GL_INTENSITY
||
2604 dstFormat
== GL_RGB
||
2605 dstFormat
== GL_RGBA
||
2606 dstFormat
== GL_COLOR_INDEX
);
2608 ASSERT(srcFormat
== GL_RED
||
2609 srcFormat
== GL_GREEN
||
2610 srcFormat
== GL_BLUE
||
2611 srcFormat
== GL_ALPHA
||
2612 srcFormat
== GL_LUMINANCE
||
2613 srcFormat
== GL_LUMINANCE_ALPHA
||
2614 srcFormat
== GL_INTENSITY
||
2615 srcFormat
== GL_RGB
||
2616 srcFormat
== GL_BGR
||
2617 srcFormat
== GL_RGBA
||
2618 srcFormat
== GL_BGRA
||
2619 srcFormat
== GL_ABGR_EXT
||
2620 srcFormat
== GL_COLOR_INDEX
);
2622 ASSERT(srcType
== GL_BITMAP
||
2623 srcType
== GL_UNSIGNED_BYTE
||
2624 srcType
== GL_BYTE
||
2625 srcType
== GL_UNSIGNED_SHORT
||
2626 srcType
== GL_SHORT
||
2627 srcType
== GL_UNSIGNED_INT
||
2628 srcType
== GL_INT
||
2629 srcType
== GL_FLOAT
||
2630 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2631 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2632 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2633 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2634 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2635 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2636 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2637 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2638 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2639 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2640 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2641 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2643 /* Try simple cases first */
2644 if (transferOps
== 0 ){
2645 if (srcType
== CHAN_TYPE
) {
2646 if (dstFormat
== GL_RGBA
) {
2647 if (srcFormat
== GL_RGBA
) {
2648 MEMCPY( dest
, source
, n
* 4 * sizeof(GLchan
) );
2651 else if (srcFormat
== GL_RGB
) {
2653 const GLchan
*src
= (const GLchan
*) source
;
2655 for (i
= 0; i
< n
; i
++) {
2666 else if (dstFormat
== GL_RGB
) {
2667 if (srcFormat
== GL_RGB
) {
2668 MEMCPY( dest
, source
, n
* 3 * sizeof(GLchan
) );
2671 else if (srcFormat
== GL_RGBA
) {
2673 const GLchan
*src
= (const GLchan
*) source
;
2675 for (i
= 0; i
< n
; i
++) {
2685 else if (dstFormat
== srcFormat
) {
2686 GLint comps
= _mesa_components_in_format(srcFormat
);
2688 MEMCPY( dest
, source
, n
* comps
* sizeof(GLchan
) );
2693 * Common situation, loading 8bit RGBA/RGB source images
2694 * into 16/32 bit destination. (OSMesa16/32)
2696 else if (srcType
== GL_UNSIGNED_BYTE
) {
2697 if (dstFormat
== GL_RGBA
) {
2698 if (srcFormat
== GL_RGB
) {
2700 const GLubyte
*src
= (const GLubyte
*) source
;
2702 for (i
= 0; i
< n
; i
++) {
2703 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2704 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2705 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2712 else if (srcFormat
== GL_RGBA
) {
2714 const GLubyte
*src
= (const GLubyte
*) source
;
2716 for (i
= 0; i
< n
; i
++) {
2717 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2718 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2719 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2720 dst
[3] = UBYTE_TO_CHAN(src
[3]);
2727 else if (dstFormat
== GL_RGB
) {
2728 if (srcFormat
== GL_RGB
) {
2730 const GLubyte
*src
= (const GLubyte
*) source
;
2732 for (i
= 0; i
< n
; i
++) {
2733 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2734 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2735 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2741 else if (srcFormat
== GL_RGBA
) {
2743 const GLubyte
*src
= (const GLubyte
*) source
;
2745 for (i
= 0; i
< n
; i
++) {
2746 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2747 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2748 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2759 /* general solution begins here */
2761 GLint dstComponents
;
2762 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2763 GLint dstLuminanceIndex
, dstIntensityIndex
;
2764 DEFMARRAY(GLfloat
, rgba
, MAX_WIDTH
, 4); /* mac 32k limitation */
2765 CHECKARRAY(rgba
, return); /* mac 32k limitation */
2767 dstComponents
= _mesa_components_in_format( dstFormat
);
2768 /* source & dest image formats should have been error checked by now */
2769 assert(dstComponents
> 0);
2772 * Extract image data and convert to RGBA floats
2774 assert(n
<= MAX_WIDTH
);
2775 if (srcFormat
== GL_COLOR_INDEX
) {
2776 GLuint indexes
[MAX_WIDTH
];
2777 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2780 if (dstFormat
== GL_COLOR_INDEX
2781 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
2782 _mesa_map_ci(ctx
, n
, indexes
);
2784 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2785 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2788 if (dstFormat
== GL_COLOR_INDEX
) {
2789 /* convert to GLchan and return */
2791 for (i
= 0; i
< n
; i
++) {
2792 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
2794 UNDEFARRAY(rgba
); /* mac 32k limitation */
2798 /* Convert indexes to RGBA */
2799 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2803 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2804 srcPacking
->SwapBytes
);
2806 /* scale and bias colors */
2807 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2808 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2809 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
2810 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
2811 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
2812 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
2814 /* color map lookup */
2815 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2816 _mesa_map_rgba(ctx
, n
, rgba
);
2821 /* GL_COLOR_TABLE lookup */
2822 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2823 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2826 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2827 /* this has to be done in the calling code */
2829 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
2830 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
2831 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
2832 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
2833 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
2834 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
2835 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
2836 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
2837 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
2838 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
2839 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
2841 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2842 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2843 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2845 /* color matrix transform */
2846 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2847 _mesa_transform_rgba(ctx
, n
, rgba
);
2849 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2850 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2851 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2853 /* update histogram count */
2854 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2855 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2858 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2859 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2863 /* clamp to [0,1] */
2864 #if CHAN_TYPE != GL_FLOAT
2867 for (i
= 0; i
< n
; i
++) {
2868 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2869 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2870 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2871 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2876 /* Now determine which color channels we need to produce.
2877 * And determine the dest index (offset) within each color tuple.
2879 switch (dstFormat
) {
2882 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2883 dstLuminanceIndex
= dstIntensityIndex
= -1;
2886 dstLuminanceIndex
= 0;
2887 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2888 dstIntensityIndex
= -1;
2890 case GL_LUMINANCE_ALPHA
:
2891 dstLuminanceIndex
= 0;
2893 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2894 dstIntensityIndex
= -1;
2897 dstIntensityIndex
= 0;
2898 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2899 dstLuminanceIndex
= -1;
2905 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2912 dstLuminanceIndex
= dstIntensityIndex
= -1;
2915 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
2916 UNDEFARRAY(rgba
); /* mac 32k limitation */
2921 /* Now return the GLchan data in the requested dstFormat */
2923 if (dstRedIndex
>= 0) {
2926 for (i
= 0; i
< n
; i
++) {
2927 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
2928 dst
+= dstComponents
;
2932 if (dstGreenIndex
>= 0) {
2935 for (i
= 0; i
< n
; i
++) {
2936 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
2937 dst
+= dstComponents
;
2941 if (dstBlueIndex
>= 0) {
2944 for (i
= 0; i
< n
; i
++) {
2945 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
2946 dst
+= dstComponents
;
2950 if (dstAlphaIndex
>= 0) {
2953 for (i
= 0; i
< n
; i
++) {
2954 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
2955 dst
+= dstComponents
;
2959 if (dstIntensityIndex
>= 0) {
2962 assert(dstIntensityIndex
== 0);
2963 assert(dstComponents
== 1);
2964 for (i
= 0; i
< n
; i
++) {
2965 /* Intensity comes from red channel */
2966 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
2970 if (dstLuminanceIndex
>= 0) {
2973 assert(dstLuminanceIndex
== 0);
2974 for (i
= 0; i
< n
; i
++) {
2975 /* Luminance comes from red channel */
2976 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
2977 dst
+= dstComponents
;
2980 UNDEFARRAY(rgba
); /* mac 32k limitation */
2986 _mesa_unpack_float_color_span( GLcontext
*ctx
,
2987 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
2988 GLenum srcFormat
, GLenum srcType
,
2989 const GLvoid
*source
,
2990 const struct gl_pixelstore_attrib
*srcPacking
,
2991 GLuint transferOps
, GLboolean clamp
)
2993 ASSERT(dstFormat
== GL_ALPHA
||
2994 dstFormat
== GL_LUMINANCE
||
2995 dstFormat
== GL_LUMINANCE_ALPHA
||
2996 dstFormat
== GL_INTENSITY
||
2997 dstFormat
== GL_RGB
||
2998 dstFormat
== GL_RGBA
||
2999 dstFormat
== GL_COLOR_INDEX
);
3001 ASSERT(srcFormat
== GL_RED
||
3002 srcFormat
== GL_GREEN
||
3003 srcFormat
== GL_BLUE
||
3004 srcFormat
== GL_ALPHA
||
3005 srcFormat
== GL_LUMINANCE
||
3006 srcFormat
== GL_LUMINANCE_ALPHA
||
3007 srcFormat
== GL_INTENSITY
||
3008 srcFormat
== GL_RGB
||
3009 srcFormat
== GL_BGR
||
3010 srcFormat
== GL_RGBA
||
3011 srcFormat
== GL_BGRA
||
3012 srcFormat
== GL_ABGR_EXT
||
3013 srcFormat
== GL_COLOR_INDEX
);
3015 ASSERT(srcType
== GL_BITMAP
||
3016 srcType
== GL_UNSIGNED_BYTE
||
3017 srcType
== GL_BYTE
||
3018 srcType
== GL_UNSIGNED_SHORT
||
3019 srcType
== GL_SHORT
||
3020 srcType
== GL_UNSIGNED_INT
||
3021 srcType
== GL_INT
||
3022 srcType
== GL_FLOAT
||
3023 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3024 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3025 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3026 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3027 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3028 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3029 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3030 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3031 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3032 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3033 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3034 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3036 /* general solution, no special cases, yet */
3038 GLint dstComponents
;
3039 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3040 GLint dstLuminanceIndex
, dstIntensityIndex
;
3041 DEFMARRAY(GLfloat
, rgba
, MAX_WIDTH
, 4); /* mac 32k limitation */
3042 CHECKARRAY(rgba
, return); /* mac 32k limitation */
3044 dstComponents
= _mesa_components_in_format( dstFormat
);
3045 /* source & dest image formats should have been error checked by now */
3046 assert(dstComponents
> 0);
3049 * Extract image data and convert to RGBA floats
3051 assert(n
<= MAX_WIDTH
);
3052 if (srcFormat
== GL_COLOR_INDEX
) {
3053 GLuint indexes
[MAX_WIDTH
];
3054 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3057 if (dstFormat
== GL_COLOR_INDEX
3058 && (transferOps
& IMAGE_MAP_COLOR_BIT
)) {
3059 _mesa_map_ci(ctx
, n
, indexes
);
3061 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3062 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3065 if (dstFormat
== GL_COLOR_INDEX
) {
3066 /* convert to GLchan and return */
3068 for (i
= 0; i
< n
; i
++) {
3069 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3071 UNDEFARRAY(rgba
); /* mac 32k limitation */
3075 /* Convert indexes to RGBA */
3076 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3080 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3081 srcPacking
->SwapBytes
);
3083 /* scale and bias colors */
3084 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
3085 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
3086 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
3087 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
3088 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
3089 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
3091 /* color map lookup */
3092 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3093 _mesa_map_rgba(ctx
, n
, rgba
);
3098 /* GL_COLOR_TABLE lookup */
3099 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
3100 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
3103 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
3106 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
3107 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
3108 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
,
3109 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
3110 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
3111 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
3112 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
3113 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
3114 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
3115 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
3116 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
3118 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
3119 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
3120 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
3122 /* color matrix transform */
3123 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
3124 _mesa_transform_rgba(ctx
, n
, rgba
);
3126 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
3127 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
3128 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
3130 /* update histogram count */
3131 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
3132 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
3135 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
3136 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
3140 /* clamp to [0,1] */
3141 #if CHAN_TYPE != GL_FLOAT
3144 for (i
= 0; i
< n
; i
++) {
3145 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
3146 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
3147 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
3148 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
3153 /* Now determine which color channels we need to produce.
3154 * And determine the dest index (offset) within each color tuple.
3156 switch (dstFormat
) {
3159 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3160 dstLuminanceIndex
= dstIntensityIndex
= -1;
3163 dstLuminanceIndex
= 0;
3164 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3165 dstIntensityIndex
= -1;
3167 case GL_LUMINANCE_ALPHA
:
3168 dstLuminanceIndex
= 0;
3170 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3171 dstIntensityIndex
= -1;
3174 dstIntensityIndex
= 0;
3175 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3176 dstLuminanceIndex
= -1;
3182 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3189 dstLuminanceIndex
= dstIntensityIndex
= -1;
3192 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_float_color_span()");
3193 UNDEFARRAY(rgba
); /* mac 32k limitation */
3197 /* Now pack results in the requested dstFormat */
3198 if (dstRedIndex
>= 0) {
3199 GLfloat
*dst
= dest
;
3201 for (i
= 0; i
< n
; i
++) {
3202 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
3203 dst
+= dstComponents
;
3207 if (dstGreenIndex
>= 0) {
3208 GLfloat
*dst
= dest
;
3210 for (i
= 0; i
< n
; i
++) {
3211 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
3212 dst
+= dstComponents
;
3216 if (dstBlueIndex
>= 0) {
3217 GLfloat
*dst
= dest
;
3219 for (i
= 0; i
< n
; i
++) {
3220 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
3221 dst
+= dstComponents
;
3225 if (dstAlphaIndex
>= 0) {
3226 GLfloat
*dst
= dest
;
3228 for (i
= 0; i
< n
; i
++) {
3229 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
3230 dst
+= dstComponents
;
3234 if (dstIntensityIndex
>= 0) {
3235 GLfloat
*dst
= dest
;
3237 assert(dstIntensityIndex
== 0);
3238 assert(dstComponents
== 1);
3239 for (i
= 0; i
< n
; i
++) {
3240 /* Intensity comes from red channel */
3241 dst
[i
] = rgba
[i
][RCOMP
];
3245 if (dstLuminanceIndex
>= 0) {
3246 GLfloat
*dst
= dest
;
3248 assert(dstLuminanceIndex
== 0);
3249 for (i
= 0; i
< n
; i
++) {
3250 /* Luminance comes from red channel */
3251 dst
[0] = rgba
[i
][RCOMP
];
3252 dst
+= dstComponents
;
3255 UNDEFARRAY(rgba
); /* mac 32k limitation */
3261 * Unpack a row of color index data from a client buffer according to
3262 * the pixel unpacking parameters.
3263 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3265 * Args: ctx - the context
3266 * n - number of pixels
3267 * dstType - destination data type
3268 * dest - destination array
3269 * srcType - source pixel type
3270 * source - source data pointer
3271 * srcPacking - pixel unpacking parameters
3272 * transferOps - the pixel transfer operations to apply
3275 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
3276 GLenum dstType
, GLvoid
*dest
,
3277 GLenum srcType
, const GLvoid
*source
,
3278 const struct gl_pixelstore_attrib
*srcPacking
,
3279 GLuint transferOps
)
3281 ASSERT(srcType
== GL_BITMAP
||
3282 srcType
== GL_UNSIGNED_BYTE
||
3283 srcType
== GL_BYTE
||
3284 srcType
== GL_UNSIGNED_SHORT
||
3285 srcType
== GL_SHORT
||
3286 srcType
== GL_UNSIGNED_INT
||
3287 srcType
== GL_INT
||
3288 srcType
== GL_FLOAT
);
3290 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3291 dstType
== GL_UNSIGNED_SHORT
||
3292 dstType
== GL_UNSIGNED_INT
);
3295 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3298 * Try simple cases first
3300 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3301 && dstType
== GL_UNSIGNED_BYTE
) {
3302 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3304 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3305 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3306 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3312 GLuint indexes
[MAX_WIDTH
];
3313 assert(n
<= MAX_WIDTH
);
3315 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3318 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3319 /* shift and offset indexes */
3320 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3322 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3323 /* Apply lookup table */
3324 _mesa_map_ci(ctx
, n
, indexes
);
3327 /* convert to dest type */
3329 case GL_UNSIGNED_BYTE
:
3331 GLubyte
*dst
= (GLubyte
*) dest
;
3333 for (i
= 0; i
< n
; i
++) {
3334 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3338 case GL_UNSIGNED_SHORT
:
3340 GLuint
*dst
= (GLuint
*) dest
;
3342 for (i
= 0; i
< n
; i
++) {
3343 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3347 case GL_UNSIGNED_INT
:
3348 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3351 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3358 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
3359 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
3360 const struct gl_pixelstore_attrib
*dstPacking
,
3361 GLuint transferOps
)
3363 GLuint indexes
[MAX_WIDTH
];
3365 ASSERT(n
<= MAX_WIDTH
);
3367 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3369 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
3370 /* make a copy of input */
3371 MEMCPY(indexes
, source
, n
* sizeof(GLuint
));
3372 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3373 _mesa_shift_and_offset_ci( ctx
, n
, indexes
);
3375 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
3376 _mesa_map_ci(ctx
, n
, indexes
);
3382 case GL_UNSIGNED_BYTE
:
3384 GLubyte
*dst
= (GLubyte
*) dest
;
3386 for (i
= 0; i
< n
; i
++) {
3387 *dst
++ = (GLubyte
) source
[i
];
3393 GLbyte
*dst
= (GLbyte
*) dest
;
3395 for (i
= 0; i
< n
; i
++) {
3396 dst
[i
] = (GLbyte
) source
[i
];
3400 case GL_UNSIGNED_SHORT
:
3402 GLushort
*dst
= (GLushort
*) dest
;
3404 for (i
= 0; i
< n
; i
++) {
3405 dst
[i
] = (GLushort
) source
[i
];
3407 if (dstPacking
->SwapBytes
) {
3408 _mesa_swap2( (GLushort
*) dst
, n
);
3414 GLshort
*dst
= (GLshort
*) dest
;
3416 for (i
= 0; i
< n
; i
++) {
3417 dst
[i
] = (GLshort
) source
[i
];
3419 if (dstPacking
->SwapBytes
) {
3420 _mesa_swap2( (GLushort
*) dst
, n
);
3424 case GL_UNSIGNED_INT
:
3426 GLuint
*dst
= (GLuint
*) dest
;
3428 for (i
= 0; i
< n
; i
++) {
3429 dst
[i
] = (GLuint
) source
[i
];
3431 if (dstPacking
->SwapBytes
) {
3432 _mesa_swap4( (GLuint
*) dst
, n
);
3438 GLint
*dst
= (GLint
*) dest
;
3440 for (i
= 0; i
< n
; i
++) {
3441 dst
[i
] = (GLint
) source
[i
];
3443 if (dstPacking
->SwapBytes
) {
3444 _mesa_swap4( (GLuint
*) dst
, n
);
3450 GLfloat
*dst
= (GLfloat
*) dest
;
3452 for (i
= 0; i
< n
; i
++) {
3453 dst
[i
] = (GLfloat
) source
[i
];
3455 if (dstPacking
->SwapBytes
) {
3456 _mesa_swap4( (GLuint
*) dst
, n
);
3461 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3467 * Unpack a row of stencil data from a client buffer according to
3468 * the pixel unpacking parameters.
3469 * This is (or will be) used by glDrawPixels
3471 * Args: ctx - the context
3472 * n - number of pixels
3473 * dstType - destination data type
3474 * dest - destination array
3475 * srcType - source pixel type
3476 * source - source data pointer
3477 * srcPacking - pixel unpacking parameters
3478 * transferOps - apply offset/bias/lookup ops?
3481 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3482 GLenum dstType
, GLvoid
*dest
,
3483 GLenum srcType
, const GLvoid
*source
,
3484 const struct gl_pixelstore_attrib
*srcPacking
,
3485 GLuint transferOps
)
3487 ASSERT(srcType
== GL_BITMAP
||
3488 srcType
== GL_UNSIGNED_BYTE
||
3489 srcType
== GL_BYTE
||
3490 srcType
== GL_UNSIGNED_SHORT
||
3491 srcType
== GL_SHORT
||
3492 srcType
== GL_UNSIGNED_INT
||
3493 srcType
== GL_INT
||
3494 srcType
== GL_FLOAT
);
3496 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3497 dstType
== GL_UNSIGNED_SHORT
||
3498 dstType
== GL_UNSIGNED_INT
);
3500 /* only shift and offset apply to stencil */
3501 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3504 * Try simple cases first
3506 if (transferOps
== 0 &&
3507 srcType
== GL_UNSIGNED_BYTE
&&
3508 dstType
== GL_UNSIGNED_BYTE
) {
3509 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
3511 else if (transferOps
== 0 &&
3512 srcType
== GL_UNSIGNED_INT
&&
3513 dstType
== GL_UNSIGNED_INT
&&
3514 !srcPacking
->SwapBytes
) {
3515 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
3521 GLuint indexes
[MAX_WIDTH
];
3522 assert(n
<= MAX_WIDTH
);
3524 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3528 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3529 /* shift and offset indexes */
3530 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3533 if (ctx
->Pixel
.MapStencilFlag
) {
3534 /* Apply stencil lookup table */
3535 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
3538 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
3543 /* convert to dest type */
3545 case GL_UNSIGNED_BYTE
:
3547 GLubyte
*dst
= (GLubyte
*) dest
;
3549 for (i
= 0; i
< n
; i
++) {
3550 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3554 case GL_UNSIGNED_SHORT
:
3556 GLuint
*dst
= (GLuint
*) dest
;
3558 for (i
= 0; i
< n
; i
++) {
3559 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3563 case GL_UNSIGNED_INT
:
3564 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3567 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3574 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3575 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
3576 const struct gl_pixelstore_attrib
*dstPacking
)
3578 GLstencil stencil
[MAX_WIDTH
];
3580 ASSERT(n
<= MAX_WIDTH
);
3582 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
3583 ctx
->Pixel
.MapStencilFlag
) {
3584 /* make a copy of input */
3585 MEMCPY(stencil
, source
, n
* sizeof(GLstencil
));
3586 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
3587 _mesa_shift_and_offset_stencil( ctx
, n
, stencil
);
3589 if (ctx
->Pixel
.MapStencilFlag
) {
3590 _mesa_map_stencil( ctx
, n
, stencil
);
3596 case GL_UNSIGNED_BYTE
:
3597 if (sizeof(GLstencil
) == 8) {
3598 MEMCPY( dest
, source
, n
);
3601 GLubyte
*dst
= (GLubyte
*) dest
;
3604 dst
[i
] = (GLubyte
) source
[i
];
3609 if (sizeof(GLstencil
) == 8) {
3610 MEMCPY( dest
, source
, n
);
3613 GLbyte
*dst
= (GLbyte
*) dest
;
3616 dst
[i
] = (GLbyte
) source
[i
];
3620 case GL_UNSIGNED_SHORT
:
3622 GLushort
*dst
= (GLushort
*) dest
;
3625 dst
[i
] = (GLushort
) source
[i
];
3627 if (dstPacking
->SwapBytes
) {
3628 _mesa_swap2( (GLushort
*) dst
, n
);
3634 GLshort
*dst
= (GLshort
*) dest
;
3637 dst
[i
] = (GLshort
) source
[i
];
3639 if (dstPacking
->SwapBytes
) {
3640 _mesa_swap2( (GLushort
*) dst
, n
);
3644 case GL_UNSIGNED_INT
:
3646 GLuint
*dst
= (GLuint
*) dest
;
3649 dst
[i
] = (GLuint
) source
[i
];
3651 if (dstPacking
->SwapBytes
) {
3652 _mesa_swap4( (GLuint
*) dst
, n
);
3658 GLint
*dst
= (GLint
*) dest
;
3661 *dst
++ = (GLint
) source
[i
];
3663 if (dstPacking
->SwapBytes
) {
3664 _mesa_swap4( (GLuint
*) dst
, n
);
3670 GLfloat
*dst
= (GLfloat
*) dest
;
3673 dst
[i
] = (GLfloat
) source
[i
];
3675 if (dstPacking
->SwapBytes
) {
3676 _mesa_swap4( (GLuint
*) dst
, n
);
3681 if (dstPacking
->LsbFirst
) {
3682 GLubyte
*dst
= (GLubyte
*) dest
;
3685 for (i
= 0; i
< n
; i
++) {
3688 *dst
|= ((source
[i
] != 0) << shift
);
3697 GLubyte
*dst
= (GLubyte
*) dest
;
3700 for (i
= 0; i
< n
; i
++) {
3703 *dst
|= ((source
[i
] != 0) << shift
);
3713 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3719 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLfloat
*dest
,
3720 GLenum srcType
, const GLvoid
*source
,
3721 const struct gl_pixelstore_attrib
*srcPacking
)
3727 const GLubyte
*src
= (const GLubyte
*) source
;
3728 for (i
= 0; i
< n
; i
++) {
3729 dest
[i
] = BYTE_TO_FLOAT(src
[i
]);
3733 case GL_UNSIGNED_BYTE
:
3736 const GLubyte
*src
= (const GLubyte
*) source
;
3737 for (i
= 0; i
< n
; i
++) {
3738 dest
[i
] = UBYTE_TO_FLOAT(src
[i
]);
3745 const GLshort
*src
= (const GLshort
*) source
;
3746 for (i
= 0; i
< n
; i
++) {
3747 dest
[i
] = SHORT_TO_FLOAT(src
[i
]);
3751 case GL_UNSIGNED_SHORT
:
3754 const GLushort
*src
= (const GLushort
*) source
;
3755 for (i
= 0; i
< n
; i
++) {
3756 dest
[i
] = USHORT_TO_FLOAT(src
[i
]);
3763 const GLint
*src
= (const GLint
*) source
;
3764 for (i
= 0; i
< n
; i
++) {
3765 dest
[i
] = INT_TO_FLOAT(src
[i
]);
3769 case GL_UNSIGNED_INT
:
3772 const GLuint
*src
= (const GLuint
*) source
;
3773 for (i
= 0; i
< n
; i
++) {
3774 dest
[i
] = UINT_TO_FLOAT(src
[i
]);
3779 MEMCPY(dest
, source
, n
* sizeof(GLfloat
));
3782 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3787 /* apply depth scale and bias and clamp to [0,1] */
3788 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3790 for (i
= 0; i
< n
; i
++) {
3791 GLfloat d
= dest
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3792 dest
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
3799 * Pack an array of depth values. The values are floats in [0,1].
3802 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
3803 GLenum dstType
, const GLfloat
*depthSpan
,
3804 const struct gl_pixelstore_attrib
*dstPacking
)
3806 GLfloat depthCopy
[MAX_WIDTH
];
3807 const GLboolean bias_or_scale
= ctx
->Pixel
.DepthBias
!= 0.0 ||
3808 ctx
->Pixel
.DepthScale
!= 1.0;
3810 ASSERT(n
<= MAX_WIDTH
);
3812 if (bias_or_scale
) {
3814 for (i
= 0; i
< n
; i
++) {
3816 d
= depthSpan
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3817 depthCopy
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
3819 depthSpan
= depthCopy
;
3823 case GL_UNSIGNED_BYTE
:
3825 GLubyte
*dst
= (GLubyte
*) dest
;
3827 for (i
= 0; i
< n
; i
++) {
3828 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
3834 GLbyte
*dst
= (GLbyte
*) dest
;
3836 for (i
= 0; i
< n
; i
++) {
3837 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
3841 case GL_UNSIGNED_SHORT
:
3843 GLushort
*dst
= (GLushort
*) dest
;
3845 for (i
= 0; i
< n
; i
++) {
3846 dst
[i
] = FLOAT_TO_USHORT( depthSpan
[i
] );
3848 if (dstPacking
->SwapBytes
) {
3849 _mesa_swap2( (GLushort
*) dst
, n
);
3855 GLshort
*dst
= (GLshort
*) dest
;
3857 for (i
= 0; i
< n
; i
++) {
3858 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
3860 if (dstPacking
->SwapBytes
) {
3861 _mesa_swap2( (GLushort
*) dst
, n
);
3865 case GL_UNSIGNED_INT
:
3867 GLuint
*dst
= (GLuint
*) dest
;
3869 for (i
= 0; i
< n
; i
++) {
3870 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
3872 if (dstPacking
->SwapBytes
) {
3873 _mesa_swap4( (GLuint
*) dst
, n
);
3879 GLint
*dst
= (GLint
*) dest
;
3881 for (i
= 0; i
< n
; i
++) {
3882 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
3884 if (dstPacking
->SwapBytes
) {
3885 _mesa_swap4( (GLuint
*) dst
, n
);
3891 GLfloat
*dst
= (GLfloat
*) dest
;
3893 for (i
= 0; i
< n
; i
++) {
3894 dst
[i
] = depthSpan
[i
];
3896 if (dstPacking
->SwapBytes
) {
3897 _mesa_swap4( (GLuint
*) dst
, n
);
3902 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
3908 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
3909 * Return all image data in a contiguous block.
3912 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
3913 GLenum format
, GLenum type
, const GLvoid
*pixels
,
3914 const struct gl_pixelstore_attrib
*unpack
)
3916 GLint bytesPerRow
, compsPerRow
;
3917 GLboolean flipBytes
, swap2
, swap4
;
3920 return NULL
; /* not necessarily an error */
3922 if (width
<= 0 || height
<= 0 || depth
<= 0)
3923 return NULL
; /* generate error later */
3925 if (format
== GL_BITMAP
) {
3926 bytesPerRow
= (width
+ 7) >> 3;
3927 flipBytes
= !unpack
->LsbFirst
;
3928 swap2
= swap4
= GL_FALSE
;
3932 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
3933 const GLint components
= _mesa_components_in_format(format
);
3935 if (bytesPerPixel
<= 0 || components
<= 0)
3936 return NULL
; /* bad format or type. generate error later */
3937 bytesPerRow
= bytesPerPixel
* width
;
3938 bytesPerComp
= bytesPerPixel
/ components
;
3939 flipBytes
= GL_FALSE
;
3940 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
3941 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
3942 compsPerRow
= components
* width
;
3943 assert(compsPerRow
>= width
);
3947 GLubyte
*destBuffer
= (GLubyte
*) MALLOC(bytesPerRow
* height
* depth
);
3951 return NULL
; /* generate GL_OUT_OF_MEMORY later */
3954 for (img
= 0; img
< depth
; img
++) {
3955 for (row
= 0; row
< height
; row
++) {
3956 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
3957 width
, height
, format
, type
, img
, row
, 0);
3958 MEMCPY(dst
, src
, bytesPerRow
);
3959 /* byte flipping/swapping */
3961 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
3964 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
3967 _mesa_swap4((GLuint
*) dst
, compsPerRow
);