2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 #include "histogram.h"
44 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
45 * we later convert the float to a packed integer value (such as for
46 * GL_RGB5_A1) because we'll wind up with a non-zero value.
48 * We redefine the macros here so zero is handled correctly.
51 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
54 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
58 /** Compute ceiling of integer quotient of A divided by B. */
59 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
63 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
66 _mesa_type_is_packed(GLenum type
)
69 case GL_UNSIGNED_BYTE_3_3_2
:
70 case GL_UNSIGNED_BYTE_2_3_3_REV
:
71 case GL_UNSIGNED_SHORT_5_6_5
:
72 case GL_UNSIGNED_SHORT_5_6_5_REV
:
73 case GL_UNSIGNED_SHORT_4_4_4_4
:
74 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
75 case GL_UNSIGNED_SHORT_5_5_5_1
:
76 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
77 case GL_UNSIGNED_INT_8_8_8_8
:
78 case GL_UNSIGNED_INT_8_8_8_8_REV
:
79 case GL_UNSIGNED_INT_10_10_10_2
:
80 case GL_UNSIGNED_INT_2_10_10_10_REV
:
81 case GL_UNSIGNED_SHORT_8_8_MESA
:
82 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
83 case GL_UNSIGNED_INT_24_8_EXT
:
91 * Flip the 8 bits in each byte of the given array.
94 * \param n number of bytes.
96 * \todo try this trick to flip bytes someday:
98 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
99 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
100 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
104 flip_bytes( GLubyte
*p
, GLuint n
)
106 register GLuint i
, a
, b
;
109 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
110 a
= ((b
& 0x01) << 7) |
124 * Flip the order of the 2 bytes in each word in the given array.
127 * \param n number of words.
130 _mesa_swap2( GLushort
*p
, GLuint n
)
135 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
142 * Flip the order of the 4 bytes in each word in the given array.
145 _mesa_swap4( GLuint
*p
, GLuint n
)
147 register GLuint i
, a
, b
;
152 | ((b
>> 8) & 0xff00)
153 | ((b
<< 8) & 0xff0000)
154 | ((b
<< 24) & 0xff000000);
161 * Get the size of a GL data type.
163 * \param type GL data type.
165 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
166 * if an invalid type enum.
169 _mesa_sizeof_type( GLenum type
)
174 case GL_UNSIGNED_BYTE
:
175 return sizeof(GLubyte
);
177 return sizeof(GLbyte
);
178 case GL_UNSIGNED_SHORT
:
179 return sizeof(GLushort
);
181 return sizeof(GLshort
);
182 case GL_UNSIGNED_INT
:
183 return sizeof(GLuint
);
185 return sizeof(GLint
);
187 return sizeof(GLfloat
);
188 case GL_HALF_FLOAT_ARB
:
189 return sizeof(GLhalfARB
);
197 * Same as _mesa_sizeof_type() but also accepting the packed pixel
201 _mesa_sizeof_packed_type( GLenum type
)
206 case GL_UNSIGNED_BYTE
:
207 return sizeof(GLubyte
);
209 return sizeof(GLbyte
);
210 case GL_UNSIGNED_SHORT
:
211 return sizeof(GLushort
);
213 return sizeof(GLshort
);
214 case GL_UNSIGNED_INT
:
215 return sizeof(GLuint
);
217 return sizeof(GLint
);
218 case GL_HALF_FLOAT_ARB
:
219 return sizeof(GLhalfARB
);
221 return sizeof(GLfloat
);
222 case GL_UNSIGNED_BYTE_3_3_2
:
223 return sizeof(GLubyte
);
224 case GL_UNSIGNED_BYTE_2_3_3_REV
:
225 return sizeof(GLubyte
);
226 case GL_UNSIGNED_SHORT_5_6_5
:
227 return sizeof(GLushort
);
228 case GL_UNSIGNED_SHORT_5_6_5_REV
:
229 return sizeof(GLushort
);
230 case GL_UNSIGNED_SHORT_4_4_4_4
:
231 return sizeof(GLushort
);
232 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
233 return sizeof(GLushort
);
234 case GL_UNSIGNED_SHORT_5_5_5_1
:
235 return sizeof(GLushort
);
236 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
237 return sizeof(GLushort
);
238 case GL_UNSIGNED_INT_8_8_8_8
:
239 return sizeof(GLuint
);
240 case GL_UNSIGNED_INT_8_8_8_8_REV
:
241 return sizeof(GLuint
);
242 case GL_UNSIGNED_INT_10_10_10_2
:
243 return sizeof(GLuint
);
244 case GL_UNSIGNED_INT_2_10_10_10_REV
:
245 return sizeof(GLuint
);
246 case GL_UNSIGNED_SHORT_8_8_MESA
:
247 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
248 return sizeof(GLushort
);
249 case GL_UNSIGNED_INT_24_8_EXT
:
250 return sizeof(GLuint
);
258 * Get the number of components in a pixel format.
260 * \param format pixel format.
262 * \return the number of components in the given format, or -1 if a bad format.
265 _mesa_components_in_format( GLenum format
)
269 case GL_COLOR_INDEX1_EXT
:
270 case GL_COLOR_INDEX2_EXT
:
271 case GL_COLOR_INDEX4_EXT
:
272 case GL_COLOR_INDEX8_EXT
:
273 case GL_COLOR_INDEX12_EXT
:
274 case GL_COLOR_INDEX16_EXT
:
275 case GL_STENCIL_INDEX
:
276 case GL_DEPTH_COMPONENT
:
284 case GL_LUMINANCE_ALPHA
:
298 case GL_DEPTH_STENCIL_EXT
:
307 * Get the bytes per pixel of pixel format type pair.
309 * \param format pixel format.
310 * \param type pixel type.
312 * \return bytes per pixel, or -1 if a bad format or type was given.
315 _mesa_bytes_per_pixel( GLenum format
, GLenum type
)
317 GLint comps
= _mesa_components_in_format( format
);
323 return 0; /* special case */
325 case GL_UNSIGNED_BYTE
:
326 return comps
* sizeof(GLubyte
);
328 case GL_UNSIGNED_SHORT
:
329 return comps
* sizeof(GLshort
);
331 case GL_UNSIGNED_INT
:
332 return comps
* sizeof(GLint
);
334 return comps
* sizeof(GLfloat
);
335 case GL_HALF_FLOAT_ARB
:
336 return comps
* sizeof(GLhalfARB
);
337 case GL_UNSIGNED_BYTE_3_3_2
:
338 case GL_UNSIGNED_BYTE_2_3_3_REV
:
339 if (format
== GL_RGB
|| format
== GL_BGR
)
340 return sizeof(GLubyte
);
342 return -1; /* error */
343 case GL_UNSIGNED_SHORT_5_6_5
:
344 case GL_UNSIGNED_SHORT_5_6_5_REV
:
345 if (format
== GL_RGB
|| format
== GL_BGR
)
346 return sizeof(GLushort
);
348 return -1; /* error */
349 case GL_UNSIGNED_SHORT_4_4_4_4
:
350 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
351 case GL_UNSIGNED_SHORT_5_5_5_1
:
352 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
353 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
354 return sizeof(GLushort
);
357 case GL_UNSIGNED_INT_8_8_8_8
:
358 case GL_UNSIGNED_INT_8_8_8_8_REV
:
359 case GL_UNSIGNED_INT_10_10_10_2
:
360 case GL_UNSIGNED_INT_2_10_10_10_REV
:
361 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
362 return sizeof(GLuint
);
365 case GL_UNSIGNED_SHORT_8_8_MESA
:
366 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
367 if (format
== GL_YCBCR_MESA
)
368 return sizeof(GLushort
);
371 case GL_UNSIGNED_INT_24_8_EXT
:
372 if (format
== GL_DEPTH_STENCIL_EXT
)
373 return sizeof(GLuint
);
383 * Test for a legal pixel format and type.
385 * \param format pixel format.
386 * \param type pixel type.
388 * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
392 _mesa_is_legal_format_and_type( GLcontext
*ctx
, GLenum format
, GLenum type
)
396 case GL_STENCIL_INDEX
:
400 case GL_UNSIGNED_BYTE
:
402 case GL_UNSIGNED_SHORT
:
404 case GL_UNSIGNED_INT
:
407 case GL_HALF_FLOAT_ARB
:
408 return ctx
->Extensions
.ARB_half_float_pixel
;
416 #if 0 /* not legal! see table 3.6 of the 1.5 spec */
420 case GL_LUMINANCE_ALPHA
:
421 case GL_DEPTH_COMPONENT
:
424 case GL_UNSIGNED_BYTE
:
426 case GL_UNSIGNED_SHORT
:
428 case GL_UNSIGNED_INT
:
431 case GL_HALF_FLOAT_ARB
:
432 return ctx
->Extensions
.ARB_half_float_pixel
;
439 case GL_UNSIGNED_BYTE
:
441 case GL_UNSIGNED_SHORT
:
443 case GL_UNSIGNED_INT
:
445 case GL_UNSIGNED_BYTE_3_3_2
:
446 case GL_UNSIGNED_BYTE_2_3_3_REV
:
447 case GL_UNSIGNED_SHORT_5_6_5
:
448 case GL_UNSIGNED_SHORT_5_6_5_REV
:
450 case GL_HALF_FLOAT_ARB
:
451 return ctx
->Extensions
.ARB_half_float_pixel
;
457 /* NOTE: no packed types are supported with BGR. That's
458 * intentional, according to the GL spec.
461 case GL_UNSIGNED_BYTE
:
463 case GL_UNSIGNED_SHORT
:
465 case GL_UNSIGNED_INT
:
468 case GL_HALF_FLOAT_ARB
:
469 return ctx
->Extensions
.ARB_half_float_pixel
;
478 case GL_UNSIGNED_BYTE
:
480 case GL_UNSIGNED_SHORT
:
482 case GL_UNSIGNED_INT
:
484 case GL_UNSIGNED_SHORT_4_4_4_4
:
485 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
486 case GL_UNSIGNED_SHORT_5_5_5_1
:
487 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
488 case GL_UNSIGNED_INT_8_8_8_8
:
489 case GL_UNSIGNED_INT_8_8_8_8_REV
:
490 case GL_UNSIGNED_INT_10_10_10_2
:
491 case GL_UNSIGNED_INT_2_10_10_10_REV
:
493 case GL_HALF_FLOAT_ARB
:
494 return ctx
->Extensions
.ARB_half_float_pixel
;
499 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
||
500 type
== GL_UNSIGNED_SHORT_8_8_REV_MESA
)
504 case GL_DEPTH_STENCIL_EXT
:
505 if (ctx
->Extensions
.EXT_packed_depth_stencil
506 && type
== GL_UNSIGNED_INT_24_8_EXT
)
518 * Return the address of a specific pixel in an image (1D, 2D or 3D).
520 * Pixel unpacking/packing parameters are observed according to \p packing.
522 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
523 * \param image starting address of image data
524 * \param width the image width
525 * \param height theimage height
526 * \param format the pixel format
527 * \param type the pixel data type
528 * \param packing the pixelstore attributes
529 * \param img which image in the volume (0 for 1D or 2D images)
530 * \param row row of pixel in the image (0 for 1D images)
531 * \param column column of pixel in the image
533 * \return address of pixel on success, or NULL on error.
535 * \sa gl_pixelstore_attrib.
538 _mesa_image_address( GLuint dimensions
,
539 const struct gl_pixelstore_attrib
*packing
,
541 GLsizei width
, GLsizei height
,
542 GLenum format
, GLenum type
,
543 GLint img
, GLint row
, GLint column
)
545 GLint alignment
; /* 1, 2 or 4 */
546 GLint pixels_per_row
;
547 GLint rows_per_image
;
550 GLint skipimages
; /* for 3-D volume images */
553 ASSERT(dimensions
>= 1 && dimensions
<= 3);
555 alignment
= packing
->Alignment
;
556 if (packing
->RowLength
> 0) {
557 pixels_per_row
= packing
->RowLength
;
560 pixels_per_row
= width
;
562 if (packing
->ImageHeight
> 0) {
563 rows_per_image
= packing
->ImageHeight
;
566 rows_per_image
= height
;
569 skippixels
= packing
->SkipPixels
;
570 /* Note: SKIP_ROWS _is_ used for 1D images */
571 skiprows
= packing
->SkipRows
;
572 /* Note: SKIP_IMAGES is only used for 3D images */
573 skipimages
= (dimensions
== 3) ? packing
->SkipImages
: 0;
575 if (type
== GL_BITMAP
) {
577 GLint comp_per_pixel
; /* components per pixel */
578 GLint bytes_per_comp
; /* bytes per component */
580 GLint bytes_per_image
;
582 /* Compute bytes per component */
583 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
584 if (bytes_per_comp
< 0) {
588 /* Compute number of components per pixel */
589 comp_per_pixel
= _mesa_components_in_format( format
);
590 if (comp_per_pixel
< 0) {
594 bytes_per_row
= alignment
595 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
597 bytes_per_image
= bytes_per_row
* rows_per_image
;
599 pixel_addr
= (GLubyte
*) image
600 + (skipimages
+ img
) * bytes_per_image
601 + (skiprows
+ row
) * bytes_per_row
602 + (skippixels
+ column
) / 8;
605 /* Non-BITMAP data */
606 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
609 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
611 /* The pixel type and format should have been error checked earlier */
612 assert(bytes_per_pixel
> 0);
614 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
615 remainder
= bytes_per_row
% alignment
;
617 bytes_per_row
+= (alignment
- remainder
);
619 ASSERT(bytes_per_row
% alignment
== 0);
621 bytes_per_image
= bytes_per_row
* rows_per_image
;
623 if (packing
->Invert
) {
624 /* set pixel_addr to the last row */
625 topOfImage
= bytes_per_row
* (height
- 1);
626 bytes_per_row
= -bytes_per_row
;
632 /* compute final pixel address */
633 pixel_addr
= (GLubyte
*) image
634 + (skipimages
+ img
) * bytes_per_image
636 + (skiprows
+ row
) * bytes_per_row
637 + (skippixels
+ column
) * bytes_per_pixel
;
640 return (GLvoid
*) pixel_addr
;
645 _mesa_image_address1d( const struct gl_pixelstore_attrib
*packing
,
648 GLenum format
, GLenum type
,
651 return _mesa_image_address(1, packing
, image
, width
, 1,
652 format
, type
, 0, 0, column
);
657 _mesa_image_address2d( const struct gl_pixelstore_attrib
*packing
,
659 GLsizei width
, GLsizei height
,
660 GLenum format
, GLenum type
,
661 GLint row
, GLint column
)
663 return _mesa_image_address(2, packing
, image
, width
, height
,
664 format
, type
, 0, row
, column
);
669 _mesa_image_address3d( const struct gl_pixelstore_attrib
*packing
,
671 GLsizei width
, GLsizei height
,
672 GLenum format
, GLenum type
,
673 GLint img
, GLint row
, GLint column
)
675 return _mesa_image_address(3, packing
, image
, width
, height
,
676 format
, type
, img
, row
, column
);
682 * Compute the stride (in bytes) between image rows.
684 * \param packing the pixelstore attributes
685 * \param width image width.
686 * \param format pixel format.
687 * \param type pixel data type.
689 * \return the stride in bytes for the given parameters, or -1 if error
692 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
693 GLint width
, GLenum format
, GLenum type
)
695 GLint bytesPerRow
, remainder
;
699 if (type
== GL_BITMAP
) {
700 if (packing
->RowLength
== 0) {
701 bytesPerRow
= (width
+ 7) / 8;
704 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
708 /* Non-BITMAP data */
709 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
710 if (bytesPerPixel
<= 0)
711 return -1; /* error */
712 if (packing
->RowLength
== 0) {
713 bytesPerRow
= bytesPerPixel
* width
;
716 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
720 remainder
= bytesPerRow
% packing
->Alignment
;
722 bytesPerRow
+= (packing
->Alignment
- remainder
);
725 if (packing
->Invert
) {
726 /* negate the bytes per row (negative row stride) */
727 bytesPerRow
= -bytesPerRow
;
737 * Compute the stride between images in a 3D texture (in bytes) for the given
738 * pixel packing parameters and image width, format and type.
741 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
742 GLint width
, GLint height
,
743 GLenum format
, GLenum type
)
746 ASSERT(type
!= GL_BITMAP
);
749 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
750 GLint bytesPerRow
, bytesPerImage
, remainder
;
752 if (bytesPerPixel
<= 0)
753 return -1; /* error */
754 if (packing
->RowLength
== 0) {
755 bytesPerRow
= bytesPerPixel
* width
;
758 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
760 remainder
= bytesPerRow
% packing
->Alignment
;
762 bytesPerRow
+= (packing
->Alignment
- remainder
);
764 if (packing
->ImageHeight
== 0)
765 bytesPerImage
= bytesPerRow
* height
;
767 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
769 return bytesPerImage
;
775 * Unpack a 32x32 pixel polygon stipple from user memory using the
776 * current pixel unpack settings.
779 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
780 const struct gl_pixelstore_attrib
*unpacking
)
782 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
784 /* Convert pattern from GLubytes to GLuints and handle big/little
789 for (i
= 0; i
< 32; i
++) {
790 dest
[i
] = (p
[0] << 24)
802 * Pack polygon stipple into user memory given current pixel packing
806 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
807 const struct gl_pixelstore_attrib
*packing
)
809 /* Convert pattern from GLuints to GLubytes to handle big/little
810 * endian differences.
814 for (i
= 0; i
< 32; i
++) {
815 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
816 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
817 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
818 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
821 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
826 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
827 * order with row alignment = 1 byte.
830 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
831 const struct gl_pixelstore_attrib
*packing
)
833 GLint bytes
, row
, width_in_bytes
;
834 GLubyte
*buffer
, *dst
;
839 /* Alloc dest storage */
840 bytes
= ((width
+ 7) / 8 * height
);
841 buffer
= (GLubyte
*) _mesa_malloc( bytes
);
845 width_in_bytes
= CEILING( width
, 8 );
847 for (row
= 0; row
< height
; row
++) {
848 const GLubyte
*src
= (const GLubyte
*)
849 _mesa_image_address2d(packing
, pixels
, width
, height
,
850 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
856 if (packing
->SkipPixels
== 0) {
857 _mesa_memcpy( dst
, src
, width_in_bytes
);
858 if (packing
->LsbFirst
) {
859 flip_bytes( dst
, width_in_bytes
);
863 /* handling SkipPixels is a bit tricky (no pun intended!) */
865 if (packing
->LsbFirst
) {
866 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
867 GLubyte dstMask
= 128;
868 const GLubyte
*s
= src
;
871 for (i
= 0; i
< width
; i
++) {
875 if (srcMask
== 128) {
880 srcMask
= srcMask
<< 1;
888 dstMask
= dstMask
>> 1;
893 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
894 GLubyte dstMask
= 128;
895 const GLubyte
*s
= src
;
898 for (i
= 0; i
< width
; i
++) {
907 srcMask
= srcMask
>> 1;
915 dstMask
= dstMask
>> 1;
920 dst
+= width_in_bytes
;
931 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
932 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
934 GLint row
, width_in_bytes
;
940 width_in_bytes
= CEILING( width
, 8 );
942 for (row
= 0; row
< height
; row
++) {
943 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
944 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
948 if (packing
->SkipPixels
== 0) {
949 _mesa_memcpy( dst
, src
, width_in_bytes
);
950 if (packing
->LsbFirst
) {
951 flip_bytes( dst
, width_in_bytes
);
955 /* handling SkipPixels is a bit tricky (no pun intended!) */
957 if (packing
->LsbFirst
) {
958 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
959 GLubyte dstMask
= 128;
960 const GLubyte
*s
= src
;
963 for (i
= 0; i
< width
; i
++) {
967 if (srcMask
== 128) {
972 srcMask
= srcMask
<< 1;
980 dstMask
= dstMask
>> 1;
985 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
986 GLubyte dstMask
= 128;
987 const GLubyte
*s
= src
;
990 for (i
= 0; i
< width
; i
++) {
999 srcMask
= srcMask
>> 1;
1007 dstMask
= dstMask
>> 1;
1012 src
+= width_in_bytes
;
1018 * Apply various pixel transfer operations to an array of RGBA pixels
1019 * as indicated by the transferOps bitmask
1022 _mesa_apply_rgba_transfer_ops(GLcontext
*ctx
, GLbitfield transferOps
,
1023 GLuint n
, GLfloat rgba
[][4])
1026 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
1027 _mesa_scale_and_bias_rgba(n
, rgba
,
1028 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
1029 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
1030 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
1031 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
1033 /* color map lookup */
1034 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1035 _mesa_map_rgba( ctx
, n
, rgba
);
1037 /* GL_COLOR_TABLE lookup */
1038 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
1039 _mesa_lookup_rgba_float(&ctx
->ColorTable
, n
, rgba
);
1042 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
1043 /* this has to be done in the calling code */
1044 _mesa_problem(ctx
, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
1046 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
1047 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
1048 _mesa_scale_and_bias_rgba(n
, rgba
,
1049 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
1050 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
1051 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
1052 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
1053 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
1054 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
1055 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
1056 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
1058 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
1059 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
1060 _mesa_lookup_rgba_float(&ctx
->PostConvolutionColorTable
, n
, rgba
);
1062 /* color matrix transform */
1063 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
1064 _mesa_transform_rgba(ctx
, n
, rgba
);
1066 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
1067 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
1068 _mesa_lookup_rgba_float(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
1070 /* update histogram count */
1071 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
1072 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
1074 /* update min/max values */
1075 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
1076 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
1078 /* clamping to [0,1] */
1079 if (transferOps
& IMAGE_CLAMP_BIT
) {
1081 for (i
= 0; i
< n
; i
++) {
1082 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1083 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1084 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1085 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1092 * Apply color index shift and offset to an array of pixels.
1095 shift_and_offset_ci( const GLcontext
*ctx
, GLuint n
, GLuint indexes
[] )
1097 GLint shift
= ctx
->Pixel
.IndexShift
;
1098 GLint offset
= ctx
->Pixel
.IndexOffset
;
1102 indexes
[i
] = (indexes
[i
] << shift
) + offset
;
1105 else if (shift
< 0) {
1108 indexes
[i
] = (indexes
[i
] >> shift
) + offset
;
1113 indexes
[i
] = indexes
[i
] + offset
;
1121 * Apply color index shift, offset and table lookup to an array
1125 _mesa_apply_ci_transfer_ops(const GLcontext
*ctx
, GLbitfield transferOps
,
1126 GLuint n
, GLuint indexes
[])
1128 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
1129 shift_and_offset_ci(ctx
, n
, indexes
);
1131 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1132 const GLuint mask
= ctx
->PixelMaps
.ItoI
.Size
- 1;
1134 for (i
= 0; i
< n
; i
++) {
1135 const GLuint j
= indexes
[i
] & mask
;
1136 indexes
[i
] = IROUND(ctx
->PixelMaps
.ItoI
.Map
[j
]);
1143 * Apply stencil index shift, offset and table lookup to an array
1144 * of stencil values.
1147 _mesa_apply_stencil_transfer_ops(const GLcontext
*ctx
, GLuint n
,
1148 GLstencil stencil
[])
1150 if (ctx
->Pixel
.IndexShift
!= 0 || ctx
->Pixel
.IndexOffset
!= 0) {
1151 const GLint offset
= ctx
->Pixel
.IndexOffset
;
1152 GLint shift
= ctx
->Pixel
.IndexShift
;
1155 for (i
= 0; i
< n
; i
++) {
1156 stencil
[i
] = (stencil
[i
] << shift
) + offset
;
1159 else if (shift
< 0) {
1161 for (i
= 0; i
< n
; i
++) {
1162 stencil
[i
] = (stencil
[i
] >> shift
) + offset
;
1166 for (i
= 0; i
< n
; i
++) {
1167 stencil
[i
] = stencil
[i
] + offset
;
1171 if (ctx
->Pixel
.MapStencilFlag
) {
1172 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
1174 for (i
= 0; i
< n
; i
++) {
1175 stencil
[i
] = ctx
->PixelMaps
.StoS
.Map
[ stencil
[i
] & mask
];
1182 * Used to pack an array [][4] of RGBA float colors as specified
1183 * by the dstFormat, dstType and dstPacking. Used by glReadPixels,
1184 * glGetConvolutionFilter(), etc.
1185 * Incoming colors will be clamped to [0,1] if needed.
1186 * Note: the rgba values will be modified by this function when any pixel
1187 * transfer ops are enabled.
1190 _mesa_pack_rgba_span_float(GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4],
1191 GLenum dstFormat
, GLenum dstType
,
1193 const struct gl_pixelstore_attrib
*dstPacking
,
1194 GLbitfield transferOps
)
1196 GLfloat luminance
[MAX_WIDTH
];
1197 const GLint comps
= _mesa_components_in_format(dstFormat
);
1200 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
1201 /* need to clamp to [0, 1] */
1202 transferOps
|= IMAGE_CLAMP_BIT
;
1206 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
1207 if ((transferOps
& IMAGE_MIN_MAX_BIT
) && ctx
->MinMax
.Sink
) {
1212 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
1213 /* compute luminance values */
1214 if (transferOps
& IMAGE_RED_TO_LUMINANCE
) {
1215 /* Luminance = Red (glGetTexImage) */
1216 for (i
= 0; i
< n
; i
++) {
1217 luminance
[i
] = rgba
[i
][RCOMP
];
1221 /* Luminance = Red + Green + Blue (glReadPixels) */
1222 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
1223 for (i
= 0; i
< n
; i
++) {
1224 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1225 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
1229 for (i
= 0; i
< n
; i
++) {
1230 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1237 * Pack/store the pixels. Ugh! Lots of cases!!!
1240 case GL_UNSIGNED_BYTE
:
1242 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1243 switch (dstFormat
) {
1246 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1250 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1254 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1258 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1262 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
1264 case GL_LUMINANCE_ALPHA
:
1266 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
1267 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1272 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1273 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1274 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1279 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1280 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1281 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1282 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1287 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1288 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1289 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1294 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1295 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1296 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1297 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1302 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1303 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1304 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1305 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1309 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1315 GLbyte
*dst
= (GLbyte
*) dstAddr
;
1316 switch (dstFormat
) {
1319 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1323 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1327 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1331 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1335 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
1337 case GL_LUMINANCE_ALPHA
:
1339 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
1340 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1345 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1346 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1347 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1352 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1353 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1354 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1355 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1360 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1361 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1362 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1367 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1368 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1369 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1370 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1375 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1376 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1377 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1378 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1382 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1386 case GL_UNSIGNED_SHORT
:
1388 GLushort
*dst
= (GLushort
*) dstAddr
;
1389 switch (dstFormat
) {
1392 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
1396 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
1400 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
1404 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
1408 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
1410 case GL_LUMINANCE_ALPHA
:
1412 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
1413 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
1418 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
1419 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1420 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
1425 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
1426 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1427 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
1428 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1433 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
1434 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1435 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
1440 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
1441 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1442 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1443 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1448 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1449 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1450 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1451 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1455 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1457 if (dstPacking
->SwapBytes
) {
1458 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1464 GLshort
*dst
= (GLshort
*) dstAddr
;
1465 switch (dstFormat
) {
1468 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1472 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1476 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1480 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1484 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1486 case GL_LUMINANCE_ALPHA
:
1488 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1489 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1494 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1495 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1496 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1501 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1502 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1503 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1504 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1509 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1510 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1511 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1516 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1517 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1518 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1519 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1524 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1525 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1526 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1527 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1531 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1533 if (dstPacking
->SwapBytes
) {
1534 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1538 case GL_UNSIGNED_INT
:
1540 GLuint
*dst
= (GLuint
*) dstAddr
;
1541 switch (dstFormat
) {
1544 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1548 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1552 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1556 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1560 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1562 case GL_LUMINANCE_ALPHA
:
1564 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1565 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1570 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1571 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1572 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1577 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1578 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1579 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1580 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1585 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1586 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1587 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1592 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1593 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1594 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1595 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1600 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1601 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1602 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1603 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1607 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1609 if (dstPacking
->SwapBytes
) {
1610 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1616 GLint
*dst
= (GLint
*) dstAddr
;
1617 switch (dstFormat
) {
1620 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1624 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1628 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1632 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1636 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1638 case GL_LUMINANCE_ALPHA
:
1640 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1641 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1646 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1647 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1648 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1653 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1654 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1655 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1656 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1661 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1662 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1663 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1668 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1669 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1670 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1671 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1676 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1677 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1678 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1679 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1683 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1685 if (dstPacking
->SwapBytes
) {
1686 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1692 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1693 switch (dstFormat
) {
1696 dst
[i
] = rgba
[i
][RCOMP
];
1700 dst
[i
] = rgba
[i
][GCOMP
];
1704 dst
[i
] = rgba
[i
][BCOMP
];
1708 dst
[i
] = rgba
[i
][ACOMP
];
1712 dst
[i
] = luminance
[i
];
1714 case GL_LUMINANCE_ALPHA
:
1716 dst
[i
*2+0] = luminance
[i
];
1717 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1722 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1723 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1724 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1729 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1730 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1731 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1732 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1737 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1738 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1739 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1744 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1745 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1746 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1747 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1752 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1753 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1754 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1755 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1759 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1761 if (dstPacking
->SwapBytes
) {
1762 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1766 case GL_HALF_FLOAT_ARB
:
1768 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1769 switch (dstFormat
) {
1772 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1776 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1780 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1784 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1788 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1790 case GL_LUMINANCE_ALPHA
:
1792 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1793 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1798 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1799 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1800 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1805 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1806 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1807 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1808 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1813 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1814 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1815 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1820 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1821 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1822 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1823 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1828 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1829 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1830 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1831 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1835 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1837 if (dstPacking
->SwapBytes
) {
1838 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1842 case GL_UNSIGNED_BYTE_3_3_2
:
1843 if (dstFormat
== GL_RGB
) {
1844 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1846 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1847 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1848 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1852 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1853 if (dstFormat
== GL_RGB
) {
1854 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1856 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1857 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1858 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 6);
1862 case GL_UNSIGNED_SHORT_5_6_5
:
1863 if (dstFormat
== GL_RGB
) {
1864 GLushort
*dst
= (GLushort
*) dstAddr
;
1866 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1867 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1868 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1872 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1873 if (dstFormat
== GL_RGB
) {
1874 GLushort
*dst
= (GLushort
*) dstAddr
;
1876 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1877 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1878 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1882 case GL_UNSIGNED_SHORT_4_4_4_4
:
1883 if (dstFormat
== GL_RGBA
) {
1884 GLushort
*dst
= (GLushort
*) dstAddr
;
1886 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1887 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1888 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1889 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1892 else if (dstFormat
== GL_BGRA
) {
1893 GLushort
*dst
= (GLushort
*) dstAddr
;
1895 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 12)
1896 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1897 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 4)
1898 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1901 else if (dstFormat
== GL_ABGR_EXT
) {
1902 GLushort
*dst
= (GLushort
*) dstAddr
;
1904 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12)
1905 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1906 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1907 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) );
1911 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1912 if (dstFormat
== GL_RGBA
) {
1913 GLushort
*dst
= (GLushort
*) dstAddr
;
1915 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1916 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1917 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1918 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1921 else if (dstFormat
== GL_BGRA
) {
1922 GLushort
*dst
= (GLushort
*) dstAddr
;
1924 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) )
1925 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1926 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 8)
1927 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1930 else if (dstFormat
== GL_ABGR_EXT
) {
1931 GLushort
*dst
= (GLushort
*) dstAddr
;
1933 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) )
1934 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1935 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1936 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12);
1940 case GL_UNSIGNED_SHORT_5_5_5_1
:
1941 if (dstFormat
== GL_RGBA
) {
1942 GLushort
*dst
= (GLushort
*) dstAddr
;
1944 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1945 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1946 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1947 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1950 else if (dstFormat
== GL_BGRA
) {
1951 GLushort
*dst
= (GLushort
*) dstAddr
;
1953 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11)
1954 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1955 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 1)
1956 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1959 else if (dstFormat
== GL_ABGR_EXT
) {
1960 GLushort
*dst
= (GLushort
*) dstAddr
;
1962 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) << 11)
1963 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 6)
1964 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 1)
1965 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) );
1969 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1970 if (dstFormat
== GL_RGBA
) {
1971 GLushort
*dst
= (GLushort
*) dstAddr
;
1973 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1974 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1975 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1976 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1979 else if (dstFormat
== GL_BGRA
) {
1980 GLushort
*dst
= (GLushort
*) dstAddr
;
1982 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) )
1983 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1984 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 10)
1985 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1988 else if (dstFormat
== GL_ABGR_EXT
) {
1989 GLushort
*dst
= (GLushort
*) dstAddr
;
1991 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) )
1992 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 5)
1993 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 10)
1994 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) << 15);
1998 case GL_UNSIGNED_INT_8_8_8_8
:
1999 if (dstFormat
== GL_RGBA
) {
2000 GLuint
*dst
= (GLuint
*) dstAddr
;
2002 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
2003 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
2004 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
2005 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
2008 else if (dstFormat
== GL_BGRA
) {
2009 GLuint
*dst
= (GLuint
*) dstAddr
;
2011 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
2012 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
2013 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
2014 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
2017 else if (dstFormat
== GL_ABGR_EXT
) {
2018 GLuint
*dst
= (GLuint
*) dstAddr
;
2020 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
2021 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
2022 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
2023 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
2027 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2028 if (dstFormat
== GL_RGBA
) {
2029 GLuint
*dst
= (GLuint
*) dstAddr
;
2031 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
2032 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
2033 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
2034 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
2037 else if (dstFormat
== GL_BGRA
) {
2038 GLuint
*dst
= (GLuint
*) dstAddr
;
2040 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
2041 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
2042 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
2043 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
2046 else if (dstFormat
== GL_ABGR_EXT
) {
2047 GLuint
*dst
= (GLuint
*) dstAddr
;
2049 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
2050 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
2051 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
2052 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
2056 case GL_UNSIGNED_INT_10_10_10_2
:
2057 if (dstFormat
== GL_RGBA
) {
2058 GLuint
*dst
= (GLuint
*) dstAddr
;
2060 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
2061 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
2062 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
2063 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
2066 else if (dstFormat
== GL_BGRA
) {
2067 GLuint
*dst
= (GLuint
*) dstAddr
;
2069 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
2070 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
2071 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
2072 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
2075 else if (dstFormat
== GL_ABGR_EXT
) {
2076 GLuint
*dst
= (GLuint
*) dstAddr
;
2078 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
2079 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
2080 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
2081 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
2085 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2086 if (dstFormat
== GL_RGBA
) {
2087 GLuint
*dst
= (GLuint
*) dstAddr
;
2089 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
2090 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
2091 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
2092 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
2095 else if (dstFormat
== GL_BGRA
) {
2096 GLuint
*dst
= (GLuint
*) dstAddr
;
2098 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
2099 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
2100 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
2101 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
2104 else if (dstFormat
== GL_ABGR_EXT
) {
2105 GLuint
*dst
= (GLuint
*) dstAddr
;
2107 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
2108 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
2109 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
2110 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
2115 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2120 #define SWAP2BYTE(VALUE) \
2122 GLubyte *bytes = (GLubyte *) &(VALUE); \
2123 GLubyte tmp = bytes[0]; \
2124 bytes[0] = bytes[1]; \
2128 #define SWAP4BYTE(VALUE) \
2130 GLubyte *bytes = (GLubyte *) &(VALUE); \
2131 GLubyte tmp = bytes[0]; \
2132 bytes[0] = bytes[3]; \
2135 bytes[1] = bytes[2]; \
2141 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2142 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2143 const struct gl_pixelstore_attrib
*unpack
)
2145 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2147 ASSERT(srcType
== GL_BITMAP
||
2148 srcType
== GL_UNSIGNED_BYTE
||
2149 srcType
== GL_BYTE
||
2150 srcType
== GL_UNSIGNED_SHORT
||
2151 srcType
== GL_SHORT
||
2152 srcType
== GL_UNSIGNED_INT
||
2153 srcType
== GL_INT
||
2154 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2155 srcType
== GL_HALF_FLOAT_ARB
||
2156 srcType
== GL_FLOAT
);
2161 GLubyte
*ubsrc
= (GLubyte
*) src
;
2162 if (unpack
->LsbFirst
) {
2163 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2165 for (i
= 0; i
< n
; i
++) {
2166 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2177 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2179 for (i
= 0; i
< n
; i
++) {
2180 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2192 case GL_UNSIGNED_BYTE
:
2195 const GLubyte
*s
= (const GLubyte
*) src
;
2196 for (i
= 0; i
< n
; i
++)
2203 const GLbyte
*s
= (const GLbyte
*) src
;
2204 for (i
= 0; i
< n
; i
++)
2208 case GL_UNSIGNED_SHORT
:
2211 const GLushort
*s
= (const GLushort
*) src
;
2212 if (unpack
->SwapBytes
) {
2213 for (i
= 0; i
< n
; i
++) {
2214 GLushort value
= s
[i
];
2220 for (i
= 0; i
< n
; i
++)
2228 const GLshort
*s
= (const GLshort
*) src
;
2229 if (unpack
->SwapBytes
) {
2230 for (i
= 0; i
< n
; i
++) {
2231 GLshort value
= s
[i
];
2237 for (i
= 0; i
< n
; i
++)
2242 case GL_UNSIGNED_INT
:
2245 const GLuint
*s
= (const GLuint
*) src
;
2246 if (unpack
->SwapBytes
) {
2247 for (i
= 0; i
< n
; i
++) {
2248 GLuint value
= s
[i
];
2254 for (i
= 0; i
< n
; i
++)
2262 const GLint
*s
= (const GLint
*) src
;
2263 if (unpack
->SwapBytes
) {
2264 for (i
= 0; i
< n
; i
++) {
2271 for (i
= 0; i
< n
; i
++)
2279 const GLfloat
*s
= (const GLfloat
*) src
;
2280 if (unpack
->SwapBytes
) {
2281 for (i
= 0; i
< n
; i
++) {
2282 GLfloat value
= s
[i
];
2284 indexes
[i
] = (GLuint
) value
;
2288 for (i
= 0; i
< n
; i
++)
2289 indexes
[i
] = (GLuint
) s
[i
];
2293 case GL_HALF_FLOAT_ARB
:
2296 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2297 if (unpack
->SwapBytes
) {
2298 for (i
= 0; i
< n
; i
++) {
2299 GLhalfARB value
= s
[i
];
2301 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2305 for (i
= 0; i
< n
; i
++)
2306 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2310 case GL_UNSIGNED_INT_24_8_EXT
:
2313 const GLuint
*s
= (const GLuint
*) src
;
2314 if (unpack
->SwapBytes
) {
2315 for (i
= 0; i
< n
; i
++) {
2316 GLuint value
= s
[i
];
2318 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2322 for (i
= 0; i
< n
; i
++)
2323 indexes
[i
] = s
[i
] & 0xfff; /* lower 8 bits */
2329 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2336 * This function extracts floating point RGBA values from arbitrary
2337 * image data. srcFormat and srcType are the format and type parameters
2338 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2340 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2341 * implements the "Conversion to floating point", "Conversion to RGB",
2342 * and "Final Expansion to RGBA" operations.
2344 * Args: n - number of pixels
2345 * rgba - output colors
2346 * srcFormat - format of incoming data
2347 * srcType - data type of incoming data
2348 * src - source data pointer
2349 * swapBytes - perform byteswapping of incoming data?
2352 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2353 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2354 GLboolean swapBytes
)
2356 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
2358 GLint rComp
, bComp
, gComp
, aComp
;
2360 ASSERT(srcFormat
== GL_RED
||
2361 srcFormat
== GL_GREEN
||
2362 srcFormat
== GL_BLUE
||
2363 srcFormat
== GL_ALPHA
||
2364 srcFormat
== GL_LUMINANCE
||
2365 srcFormat
== GL_LUMINANCE_ALPHA
||
2366 srcFormat
== GL_INTENSITY
||
2367 srcFormat
== GL_RGB
||
2368 srcFormat
== GL_BGR
||
2369 srcFormat
== GL_RGBA
||
2370 srcFormat
== GL_BGRA
||
2371 srcFormat
== GL_ABGR_EXT
);
2373 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2374 srcType
== GL_BYTE
||
2375 srcType
== GL_UNSIGNED_SHORT
||
2376 srcType
== GL_SHORT
||
2377 srcType
== GL_UNSIGNED_INT
||
2378 srcType
== GL_INT
||
2379 srcType
== GL_HALF_FLOAT_ARB
||
2380 srcType
== GL_FLOAT
||
2381 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2382 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2383 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2384 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2385 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2386 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2387 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2388 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2389 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2390 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2391 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2392 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2394 rComp
= gComp
= bComp
= aComp
= -1;
2396 switch (srcFormat
) {
2399 greenIndex
= blueIndex
= alphaIndex
= -1;
2404 redIndex
= blueIndex
= alphaIndex
= -1;
2409 redIndex
= greenIndex
= alphaIndex
= -1;
2413 redIndex
= greenIndex
= blueIndex
= -1;
2418 redIndex
= greenIndex
= blueIndex
= 0;
2422 case GL_LUMINANCE_ALPHA
:
2423 redIndex
= greenIndex
= blueIndex
= 0;
2428 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
2487 _mesa_problem(NULL
, "bad srcFormat in extract float data");
2492 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
2493 if ((INDEX) < 0) { \
2495 for (i = 0; i < n; i++) { \
2496 rgba[i][CHANNEL] = DEFAULT; \
2499 else if (swapBytes) { \
2500 const TYPE *s = (const TYPE *) src; \
2502 for (i = 0; i < n; i++) { \
2503 TYPE value = s[INDEX]; \
2504 if (sizeof(TYPE) == 2) { \
2507 else if (sizeof(TYPE) == 4) { \
2510 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
2515 const TYPE *s = (const TYPE *) src; \
2517 for (i = 0; i < n; i++) { \
2518 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
2524 case GL_UNSIGNED_BYTE
:
2525 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2526 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2527 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2528 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
2531 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2532 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2533 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
2534 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
2536 case GL_UNSIGNED_SHORT
:
2537 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2538 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2539 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
2540 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
2543 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2544 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2545 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
2546 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
2548 case GL_UNSIGNED_INT
:
2549 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2550 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2551 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
2552 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
2555 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2556 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2557 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
2558 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
2561 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2562 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2563 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
2564 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
2566 case GL_HALF_FLOAT_ARB
:
2567 PROCESS(redIndex
, RCOMP
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2568 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2569 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2570 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2572 case GL_UNSIGNED_BYTE_3_3_2
:
2574 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2576 for (i
= 0; i
< n
; i
++) {
2577 GLubyte p
= ubsrc
[i
];
2578 rgba
[i
][rComp
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
2579 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
2580 rgba
[i
][bComp
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
2581 rgba
[i
][aComp
] = 1.0F
;
2585 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2587 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2589 for (i
= 0; i
< n
; i
++) {
2590 GLubyte p
= ubsrc
[i
];
2591 rgba
[i
][rComp
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
2592 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
2593 rgba
[i
][bComp
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
2594 rgba
[i
][aComp
] = 1.0F
;
2598 case GL_UNSIGNED_SHORT_5_6_5
:
2600 const GLushort
*ussrc
= (const GLushort
*) src
;
2602 for (i
= 0; i
< n
; i
++) {
2603 GLushort p
= ussrc
[i
];
2605 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2606 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2607 rgba
[i
][bComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2608 rgba
[i
][aComp
] = 1.0F
;
2612 const GLushort
*ussrc
= (const GLushort
*) src
;
2614 for (i
= 0; i
< n
; i
++) {
2615 GLushort p
= ussrc
[i
];
2616 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2617 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2618 rgba
[i
][bComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2619 rgba
[i
][aComp
] = 1.0F
;
2623 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2625 const GLushort
*ussrc
= (const GLushort
*) src
;
2627 for (i
= 0; i
< n
; i
++) {
2628 GLushort p
= ussrc
[i
];
2630 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2631 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2632 rgba
[i
][bComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2633 rgba
[i
][aComp
] = 1.0F
;
2637 const GLushort
*ussrc
= (const GLushort
*) src
;
2639 for (i
= 0; i
< n
; i
++) {
2640 GLushort p
= ussrc
[i
];
2641 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2642 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2643 rgba
[i
][bComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2644 rgba
[i
][aComp
] = 1.0F
;
2648 case GL_UNSIGNED_SHORT_4_4_4_4
:
2650 const GLushort
*ussrc
= (const GLushort
*) src
;
2652 for (i
= 0; i
< n
; i
++) {
2653 GLushort p
= ussrc
[i
];
2655 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2656 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2657 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2658 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2662 const GLushort
*ussrc
= (const GLushort
*) src
;
2664 for (i
= 0; i
< n
; i
++) {
2665 GLushort p
= ussrc
[i
];
2666 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2667 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2668 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2669 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2673 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2675 const GLushort
*ussrc
= (const GLushort
*) src
;
2677 for (i
= 0; i
< n
; i
++) {
2678 GLushort p
= ussrc
[i
];
2680 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2681 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2682 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2683 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2687 const GLushort
*ussrc
= (const GLushort
*) src
;
2689 for (i
= 0; i
< n
; i
++) {
2690 GLushort p
= ussrc
[i
];
2691 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2692 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2693 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2694 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2698 case GL_UNSIGNED_SHORT_5_5_5_1
:
2700 const GLushort
*ussrc
= (const GLushort
*) src
;
2702 for (i
= 0; i
< n
; i
++) {
2703 GLushort p
= ussrc
[i
];
2705 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2706 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2707 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2708 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2712 const GLushort
*ussrc
= (const GLushort
*) src
;
2714 for (i
= 0; i
< n
; i
++) {
2715 GLushort p
= ussrc
[i
];
2716 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2717 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2718 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2719 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2723 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2725 const GLushort
*ussrc
= (const GLushort
*) src
;
2727 for (i
= 0; i
< n
; i
++) {
2728 GLushort p
= ussrc
[i
];
2730 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2731 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2732 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2733 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2737 const GLushort
*ussrc
= (const GLushort
*) src
;
2739 for (i
= 0; i
< n
; i
++) {
2740 GLushort p
= ussrc
[i
];
2741 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2742 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2743 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2744 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2748 case GL_UNSIGNED_INT_8_8_8_8
:
2750 const GLuint
*uisrc
= (const GLuint
*) src
;
2752 for (i
= 0; i
< n
; i
++) {
2753 GLuint p
= uisrc
[i
];
2754 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2755 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2756 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2757 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2761 const GLuint
*uisrc
= (const GLuint
*) src
;
2763 for (i
= 0; i
< n
; i
++) {
2764 GLuint p
= uisrc
[i
];
2765 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2766 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2767 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2768 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2772 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2774 const GLuint
*uisrc
= (const GLuint
*) src
;
2776 for (i
= 0; i
< n
; i
++) {
2777 GLuint p
= uisrc
[i
];
2778 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2779 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2780 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2781 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2785 const GLuint
*uisrc
= (const GLuint
*) src
;
2787 for (i
= 0; i
< n
; i
++) {
2788 GLuint p
= uisrc
[i
];
2789 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
2790 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2791 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2792 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
2796 case GL_UNSIGNED_INT_10_10_10_2
:
2798 const GLuint
*uisrc
= (const GLuint
*) src
;
2800 for (i
= 0; i
< n
; i
++) {
2801 GLuint p
= uisrc
[i
];
2803 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2804 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2805 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2806 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2810 const GLuint
*uisrc
= (const GLuint
*) src
;
2812 for (i
= 0; i
< n
; i
++) {
2813 GLuint p
= uisrc
[i
];
2814 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2815 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2816 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2817 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2821 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2823 const GLuint
*uisrc
= (const GLuint
*) src
;
2825 for (i
= 0; i
< n
; i
++) {
2826 GLuint p
= uisrc
[i
];
2828 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2829 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2830 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2831 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2835 const GLuint
*uisrc
= (const GLuint
*) src
;
2837 for (i
= 0; i
< n
; i
++) {
2838 GLuint p
= uisrc
[i
];
2839 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2840 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2841 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2842 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2847 _mesa_problem(NULL
, "bad srcType in extract float data");
2854 * Unpack a row of color image data from a client buffer according to
2855 * the pixel unpacking parameters.
2856 * Return GLchan values in the specified dest image format.
2857 * This is used by glDrawPixels and glTexImage?D().
2858 * \param ctx - the context
2859 * n - number of pixels in the span
2860 * dstFormat - format of destination color array
2861 * dest - the destination color array
2862 * srcFormat - source image format
2863 * srcType - source image data type
2864 * source - source image pointer
2865 * srcPacking - pixel unpacking parameters
2866 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2868 * XXX perhaps expand this to process whole images someday.
2871 _mesa_unpack_color_span_chan( GLcontext
*ctx
,
2872 GLuint n
, GLenum dstFormat
, GLchan dest
[],
2873 GLenum srcFormat
, GLenum srcType
,
2874 const GLvoid
*source
,
2875 const struct gl_pixelstore_attrib
*srcPacking
,
2876 GLbitfield transferOps
)
2878 ASSERT(dstFormat
== GL_ALPHA
||
2879 dstFormat
== GL_LUMINANCE
||
2880 dstFormat
== GL_LUMINANCE_ALPHA
||
2881 dstFormat
== GL_INTENSITY
||
2882 dstFormat
== GL_RGB
||
2883 dstFormat
== GL_RGBA
||
2884 dstFormat
== GL_COLOR_INDEX
);
2886 ASSERT(srcFormat
== GL_RED
||
2887 srcFormat
== GL_GREEN
||
2888 srcFormat
== GL_BLUE
||
2889 srcFormat
== GL_ALPHA
||
2890 srcFormat
== GL_LUMINANCE
||
2891 srcFormat
== GL_LUMINANCE_ALPHA
||
2892 srcFormat
== GL_INTENSITY
||
2893 srcFormat
== GL_RGB
||
2894 srcFormat
== GL_BGR
||
2895 srcFormat
== GL_RGBA
||
2896 srcFormat
== GL_BGRA
||
2897 srcFormat
== GL_ABGR_EXT
||
2898 srcFormat
== GL_COLOR_INDEX
);
2900 ASSERT(srcType
== GL_BITMAP
||
2901 srcType
== GL_UNSIGNED_BYTE
||
2902 srcType
== GL_BYTE
||
2903 srcType
== GL_UNSIGNED_SHORT
||
2904 srcType
== GL_SHORT
||
2905 srcType
== GL_UNSIGNED_INT
||
2906 srcType
== GL_INT
||
2907 srcType
== GL_HALF_FLOAT_ARB
||
2908 srcType
== GL_FLOAT
||
2909 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2910 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2911 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2912 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2913 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2914 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2915 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2916 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2917 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2918 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2919 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2920 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2922 /* Try simple cases first */
2923 if (transferOps
== 0) {
2924 if (srcType
== CHAN_TYPE
) {
2925 if (dstFormat
== GL_RGBA
) {
2926 if (srcFormat
== GL_RGBA
) {
2927 _mesa_memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
2930 else if (srcFormat
== GL_RGB
) {
2932 const GLchan
*src
= (const GLchan
*) source
;
2934 for (i
= 0; i
< n
; i
++) {
2945 else if (dstFormat
== GL_RGB
) {
2946 if (srcFormat
== GL_RGB
) {
2947 _mesa_memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
2950 else if (srcFormat
== GL_RGBA
) {
2952 const GLchan
*src
= (const GLchan
*) source
;
2954 for (i
= 0; i
< n
; i
++) {
2964 else if (dstFormat
== srcFormat
) {
2965 GLint comps
= _mesa_components_in_format(srcFormat
);
2967 _mesa_memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
2972 * Common situation, loading 8bit RGBA/RGB source images
2973 * into 16/32 bit destination. (OSMesa16/32)
2975 else if (srcType
== GL_UNSIGNED_BYTE
) {
2976 if (dstFormat
== GL_RGBA
) {
2977 if (srcFormat
== GL_RGB
) {
2979 const GLubyte
*src
= (const GLubyte
*) source
;
2981 for (i
= 0; i
< n
; i
++) {
2982 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2983 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2984 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2991 else if (srcFormat
== GL_RGBA
) {
2993 const GLubyte
*src
= (const GLubyte
*) source
;
2995 for (i
= 0; i
< n
; i
++) {
2996 dst
[0] = UBYTE_TO_CHAN(src
[0]);
2997 dst
[1] = UBYTE_TO_CHAN(src
[1]);
2998 dst
[2] = UBYTE_TO_CHAN(src
[2]);
2999 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3006 else if (dstFormat
== GL_RGB
) {
3007 if (srcFormat
== GL_RGB
) {
3009 const GLubyte
*src
= (const GLubyte
*) source
;
3011 for (i
= 0; i
< n
; i
++) {
3012 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3013 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3014 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3020 else if (srcFormat
== GL_RGBA
) {
3022 const GLubyte
*src
= (const GLubyte
*) source
;
3024 for (i
= 0; i
< n
; i
++) {
3025 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3026 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3027 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3038 /* general solution begins here */
3040 GLint dstComponents
;
3041 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3042 GLint dstLuminanceIndex
, dstIntensityIndex
;
3043 GLfloat rgba
[MAX_WIDTH
][4];
3045 dstComponents
= _mesa_components_in_format( dstFormat
);
3046 /* source & dest image formats should have been error checked by now */
3047 assert(dstComponents
> 0);
3050 * Extract image data and convert to RGBA floats
3052 assert(n
<= MAX_WIDTH
);
3053 if (srcFormat
== GL_COLOR_INDEX
) {
3054 GLuint indexes
[MAX_WIDTH
];
3055 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3058 if (dstFormat
== GL_COLOR_INDEX
) {
3060 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3061 /* convert to GLchan and return */
3062 for (i
= 0; i
< n
; i
++) {
3063 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3068 /* Convert indexes to RGBA */
3069 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3070 shift_and_offset_ci(ctx
, n
, indexes
);
3072 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3075 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3076 * with color indexes.
3078 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3081 /* non-color index data */
3082 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3083 srcPacking
->SwapBytes
);
3086 /* Need to clamp if returning GLubytes or GLushorts */
3087 #if CHAN_TYPE != GL_FLOAT
3088 transferOps
|= IMAGE_CLAMP_BIT
;
3092 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3095 /* Now determine which color channels we need to produce.
3096 * And determine the dest index (offset) within each color tuple.
3098 switch (dstFormat
) {
3101 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3102 dstLuminanceIndex
= dstIntensityIndex
= -1;
3105 dstLuminanceIndex
= 0;
3106 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3107 dstIntensityIndex
= -1;
3109 case GL_LUMINANCE_ALPHA
:
3110 dstLuminanceIndex
= 0;
3112 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3113 dstIntensityIndex
= -1;
3116 dstIntensityIndex
= 0;
3117 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3118 dstLuminanceIndex
= -1;
3124 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3131 dstLuminanceIndex
= dstIntensityIndex
= -1;
3134 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
3139 /* Now return the GLchan data in the requested dstFormat */
3141 if (dstRedIndex
>= 0) {
3144 for (i
= 0; i
< n
; i
++) {
3145 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
3146 dst
+= dstComponents
;
3150 if (dstGreenIndex
>= 0) {
3153 for (i
= 0; i
< n
; i
++) {
3154 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
3155 dst
+= dstComponents
;
3159 if (dstBlueIndex
>= 0) {
3162 for (i
= 0; i
< n
; i
++) {
3163 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
3164 dst
+= dstComponents
;
3168 if (dstAlphaIndex
>= 0) {
3171 for (i
= 0; i
< n
; i
++) {
3172 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
3173 dst
+= dstComponents
;
3177 if (dstIntensityIndex
>= 0) {
3180 assert(dstIntensityIndex
== 0);
3181 assert(dstComponents
== 1);
3182 for (i
= 0; i
< n
; i
++) {
3183 /* Intensity comes from red channel */
3184 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3188 if (dstLuminanceIndex
>= 0) {
3191 assert(dstLuminanceIndex
== 0);
3192 for (i
= 0; i
< n
; i
++) {
3193 /* Luminance comes from red channel */
3194 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3195 dst
+= dstComponents
;
3203 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3204 * instead of GLchan.
3207 _mesa_unpack_color_span_float( GLcontext
*ctx
,
3208 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3209 GLenum srcFormat
, GLenum srcType
,
3210 const GLvoid
*source
,
3211 const struct gl_pixelstore_attrib
*srcPacking
,
3212 GLbitfield transferOps
)
3214 ASSERT(dstFormat
== GL_ALPHA
||
3215 dstFormat
== GL_LUMINANCE
||
3216 dstFormat
== GL_LUMINANCE_ALPHA
||
3217 dstFormat
== GL_INTENSITY
||
3218 dstFormat
== GL_RGB
||
3219 dstFormat
== GL_RGBA
||
3220 dstFormat
== GL_COLOR_INDEX
);
3222 ASSERT(srcFormat
== GL_RED
||
3223 srcFormat
== GL_GREEN
||
3224 srcFormat
== GL_BLUE
||
3225 srcFormat
== GL_ALPHA
||
3226 srcFormat
== GL_LUMINANCE
||
3227 srcFormat
== GL_LUMINANCE_ALPHA
||
3228 srcFormat
== GL_INTENSITY
||
3229 srcFormat
== GL_RGB
||
3230 srcFormat
== GL_BGR
||
3231 srcFormat
== GL_RGBA
||
3232 srcFormat
== GL_BGRA
||
3233 srcFormat
== GL_ABGR_EXT
||
3234 srcFormat
== GL_COLOR_INDEX
);
3236 ASSERT(srcType
== GL_BITMAP
||
3237 srcType
== GL_UNSIGNED_BYTE
||
3238 srcType
== GL_BYTE
||
3239 srcType
== GL_UNSIGNED_SHORT
||
3240 srcType
== GL_SHORT
||
3241 srcType
== GL_UNSIGNED_INT
||
3242 srcType
== GL_INT
||
3243 srcType
== GL_HALF_FLOAT_ARB
||
3244 srcType
== GL_FLOAT
||
3245 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3246 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3247 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3248 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3249 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3250 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3251 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3252 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3253 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3254 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3255 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3256 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3258 /* general solution, no special cases, yet */
3260 GLint dstComponents
;
3261 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3262 GLint dstLuminanceIndex
, dstIntensityIndex
;
3263 GLfloat rgba
[MAX_WIDTH
][4];
3265 dstComponents
= _mesa_components_in_format( dstFormat
);
3266 /* source & dest image formats should have been error checked by now */
3267 assert(dstComponents
> 0);
3270 * Extract image data and convert to RGBA floats
3272 assert(n
<= MAX_WIDTH
);
3273 if (srcFormat
== GL_COLOR_INDEX
) {
3274 GLuint indexes
[MAX_WIDTH
];
3275 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3278 if (dstFormat
== GL_COLOR_INDEX
) {
3280 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3281 /* convert to GLchan and return */
3282 for (i
= 0; i
< n
; i
++) {
3283 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3288 /* Convert indexes to RGBA */
3289 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3290 shift_and_offset_ci(ctx
, n
, indexes
);
3292 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3295 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3296 * with color indexes.
3298 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3301 /* non-color index data */
3302 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3303 srcPacking
->SwapBytes
);
3307 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3310 /* Now determine which color channels we need to produce.
3311 * And determine the dest index (offset) within each color tuple.
3313 switch (dstFormat
) {
3316 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3317 dstLuminanceIndex
= dstIntensityIndex
= -1;
3320 dstLuminanceIndex
= 0;
3321 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3322 dstIntensityIndex
= -1;
3324 case GL_LUMINANCE_ALPHA
:
3325 dstLuminanceIndex
= 0;
3327 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3328 dstIntensityIndex
= -1;
3331 dstIntensityIndex
= 0;
3332 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3333 dstLuminanceIndex
= -1;
3339 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
3346 dstLuminanceIndex
= dstIntensityIndex
= -1;
3349 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
3353 /* Now pack results in the requested dstFormat */
3354 if (dstRedIndex
>= 0) {
3355 GLfloat
*dst
= dest
;
3357 for (i
= 0; i
< n
; i
++) {
3358 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
3359 dst
+= dstComponents
;
3363 if (dstGreenIndex
>= 0) {
3364 GLfloat
*dst
= dest
;
3366 for (i
= 0; i
< n
; i
++) {
3367 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
3368 dst
+= dstComponents
;
3372 if (dstBlueIndex
>= 0) {
3373 GLfloat
*dst
= dest
;
3375 for (i
= 0; i
< n
; i
++) {
3376 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
3377 dst
+= dstComponents
;
3381 if (dstAlphaIndex
>= 0) {
3382 GLfloat
*dst
= dest
;
3384 for (i
= 0; i
< n
; i
++) {
3385 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
3386 dst
+= dstComponents
;
3390 if (dstIntensityIndex
>= 0) {
3391 GLfloat
*dst
= dest
;
3393 assert(dstIntensityIndex
== 0);
3394 assert(dstComponents
== 1);
3395 for (i
= 0; i
< n
; i
++) {
3396 /* Intensity comes from red channel */
3397 dst
[i
] = rgba
[i
][RCOMP
];
3401 if (dstLuminanceIndex
>= 0) {
3402 GLfloat
*dst
= dest
;
3404 assert(dstLuminanceIndex
== 0);
3405 for (i
= 0; i
< n
; i
++) {
3406 /* Luminance comes from red channel */
3407 dst
[0] = rgba
[i
][RCOMP
];
3408 dst
+= dstComponents
;
3416 * Unpack a row of color index data from a client buffer according to
3417 * the pixel unpacking parameters.
3418 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3420 * Args: ctx - the context
3421 * n - number of pixels
3422 * dstType - destination data type
3423 * dest - destination array
3424 * srcType - source pixel type
3425 * source - source data pointer
3426 * srcPacking - pixel unpacking parameters
3427 * transferOps - the pixel transfer operations to apply
3430 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
3431 GLenum dstType
, GLvoid
*dest
,
3432 GLenum srcType
, const GLvoid
*source
,
3433 const struct gl_pixelstore_attrib
*srcPacking
,
3434 GLbitfield transferOps
)
3436 ASSERT(srcType
== GL_BITMAP
||
3437 srcType
== GL_UNSIGNED_BYTE
||
3438 srcType
== GL_BYTE
||
3439 srcType
== GL_UNSIGNED_SHORT
||
3440 srcType
== GL_SHORT
||
3441 srcType
== GL_UNSIGNED_INT
||
3442 srcType
== GL_INT
||
3443 srcType
== GL_HALF_FLOAT_ARB
||
3444 srcType
== GL_FLOAT
);
3446 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3447 dstType
== GL_UNSIGNED_SHORT
||
3448 dstType
== GL_UNSIGNED_INT
);
3451 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3454 * Try simple cases first
3456 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3457 && dstType
== GL_UNSIGNED_BYTE
) {
3458 _mesa_memcpy(dest
, source
, n
* sizeof(GLubyte
));
3460 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3461 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3462 _mesa_memcpy(dest
, source
, n
* sizeof(GLuint
));
3468 GLuint indexes
[MAX_WIDTH
];
3469 assert(n
<= MAX_WIDTH
);
3471 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3475 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3477 /* convert to dest type */
3479 case GL_UNSIGNED_BYTE
:
3481 GLubyte
*dst
= (GLubyte
*) dest
;
3483 for (i
= 0; i
< n
; i
++) {
3484 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3488 case GL_UNSIGNED_SHORT
:
3490 GLuint
*dst
= (GLuint
*) dest
;
3492 for (i
= 0; i
< n
; i
++) {
3493 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3497 case GL_UNSIGNED_INT
:
3498 _mesa_memcpy(dest
, indexes
, n
* sizeof(GLuint
));
3501 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3508 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
3509 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
3510 const struct gl_pixelstore_attrib
*dstPacking
,
3511 GLbitfield transferOps
)
3513 GLuint indexes
[MAX_WIDTH
];
3515 ASSERT(n
<= MAX_WIDTH
);
3517 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3519 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
3520 /* make a copy of input */
3521 _mesa_memcpy(indexes
, source
, n
* sizeof(GLuint
));
3522 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3527 case GL_UNSIGNED_BYTE
:
3529 GLubyte
*dst
= (GLubyte
*) dest
;
3531 for (i
= 0; i
< n
; i
++) {
3532 *dst
++ = (GLubyte
) source
[i
];
3538 GLbyte
*dst
= (GLbyte
*) dest
;
3540 for (i
= 0; i
< n
; i
++) {
3541 dst
[i
] = (GLbyte
) source
[i
];
3545 case GL_UNSIGNED_SHORT
:
3547 GLushort
*dst
= (GLushort
*) dest
;
3549 for (i
= 0; i
< n
; i
++) {
3550 dst
[i
] = (GLushort
) source
[i
];
3552 if (dstPacking
->SwapBytes
) {
3553 _mesa_swap2( (GLushort
*) dst
, n
);
3559 GLshort
*dst
= (GLshort
*) dest
;
3561 for (i
= 0; i
< n
; i
++) {
3562 dst
[i
] = (GLshort
) source
[i
];
3564 if (dstPacking
->SwapBytes
) {
3565 _mesa_swap2( (GLushort
*) dst
, n
);
3569 case GL_UNSIGNED_INT
:
3571 GLuint
*dst
= (GLuint
*) dest
;
3573 for (i
= 0; i
< n
; i
++) {
3574 dst
[i
] = (GLuint
) source
[i
];
3576 if (dstPacking
->SwapBytes
) {
3577 _mesa_swap4( (GLuint
*) dst
, n
);
3583 GLint
*dst
= (GLint
*) dest
;
3585 for (i
= 0; i
< n
; i
++) {
3586 dst
[i
] = (GLint
) source
[i
];
3588 if (dstPacking
->SwapBytes
) {
3589 _mesa_swap4( (GLuint
*) dst
, n
);
3595 GLfloat
*dst
= (GLfloat
*) dest
;
3597 for (i
= 0; i
< n
; i
++) {
3598 dst
[i
] = (GLfloat
) source
[i
];
3600 if (dstPacking
->SwapBytes
) {
3601 _mesa_swap4( (GLuint
*) dst
, n
);
3605 case GL_HALF_FLOAT_ARB
:
3607 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
3609 for (i
= 0; i
< n
; i
++) {
3610 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
3612 if (dstPacking
->SwapBytes
) {
3613 _mesa_swap2( (GLushort
*) dst
, n
);
3618 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3624 * Unpack a row of stencil data from a client buffer according to
3625 * the pixel unpacking parameters.
3626 * This is (or will be) used by glDrawPixels
3628 * Args: ctx - the context
3629 * n - number of pixels
3630 * dstType - destination data type
3631 * dest - destination array
3632 * srcType - source pixel type
3633 * source - source data pointer
3634 * srcPacking - pixel unpacking parameters
3635 * transferOps - apply offset/bias/lookup ops?
3638 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3639 GLenum dstType
, GLvoid
*dest
,
3640 GLenum srcType
, const GLvoid
*source
,
3641 const struct gl_pixelstore_attrib
*srcPacking
,
3642 GLbitfield transferOps
)
3644 ASSERT(srcType
== GL_BITMAP
||
3645 srcType
== GL_UNSIGNED_BYTE
||
3646 srcType
== GL_BYTE
||
3647 srcType
== GL_UNSIGNED_SHORT
||
3648 srcType
== GL_SHORT
||
3649 srcType
== GL_UNSIGNED_INT
||
3650 srcType
== GL_INT
||
3651 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3652 srcType
== GL_HALF_FLOAT_ARB
||
3653 srcType
== GL_FLOAT
);
3655 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3656 dstType
== GL_UNSIGNED_SHORT
||
3657 dstType
== GL_UNSIGNED_INT
);
3659 /* only shift and offset apply to stencil */
3660 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3663 * Try simple cases first
3665 if (transferOps
== 0 &&
3666 srcType
== GL_UNSIGNED_BYTE
&&
3667 dstType
== GL_UNSIGNED_BYTE
) {
3668 _mesa_memcpy(dest
, source
, n
* sizeof(GLubyte
));
3670 else if (transferOps
== 0 &&
3671 srcType
== GL_UNSIGNED_INT
&&
3672 dstType
== GL_UNSIGNED_INT
&&
3673 !srcPacking
->SwapBytes
) {
3674 _mesa_memcpy(dest
, source
, n
* sizeof(GLuint
));
3680 GLuint indexes
[MAX_WIDTH
];
3681 assert(n
<= MAX_WIDTH
);
3683 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
3687 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3688 /* shift and offset indexes */
3689 shift_and_offset_ci(ctx
, n
, indexes
);
3692 if (ctx
->Pixel
.MapStencilFlag
) {
3693 /* Apply stencil lookup table */
3694 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
3697 indexes
[i
] = ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
3702 /* convert to dest type */
3704 case GL_UNSIGNED_BYTE
:
3706 GLubyte
*dst
= (GLubyte
*) dest
;
3708 for (i
= 0; i
< n
; i
++) {
3709 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3713 case GL_UNSIGNED_SHORT
:
3715 GLuint
*dst
= (GLuint
*) dest
;
3717 for (i
= 0; i
< n
; i
++) {
3718 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3722 case GL_UNSIGNED_INT
:
3723 _mesa_memcpy(dest
, indexes
, n
* sizeof(GLuint
));
3726 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3733 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
3734 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
3735 const struct gl_pixelstore_attrib
*dstPacking
)
3737 GLstencil stencil
[MAX_WIDTH
];
3739 ASSERT(n
<= MAX_WIDTH
);
3741 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
3742 ctx
->Pixel
.MapStencilFlag
) {
3743 /* make a copy of input */
3744 _mesa_memcpy(stencil
, source
, n
* sizeof(GLstencil
));
3745 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
3750 case GL_UNSIGNED_BYTE
:
3751 if (sizeof(GLstencil
) == 8) {
3752 _mesa_memcpy( dest
, source
, n
);
3755 GLubyte
*dst
= (GLubyte
*) dest
;
3758 dst
[i
] = (GLubyte
) source
[i
];
3763 if (sizeof(GLstencil
) == 8) {
3764 _mesa_memcpy( dest
, source
, n
);
3767 GLbyte
*dst
= (GLbyte
*) dest
;
3770 dst
[i
] = (GLbyte
) source
[i
];
3774 case GL_UNSIGNED_SHORT
:
3776 GLushort
*dst
= (GLushort
*) dest
;
3779 dst
[i
] = (GLushort
) source
[i
];
3781 if (dstPacking
->SwapBytes
) {
3782 _mesa_swap2( (GLushort
*) dst
, n
);
3788 GLshort
*dst
= (GLshort
*) dest
;
3791 dst
[i
] = (GLshort
) source
[i
];
3793 if (dstPacking
->SwapBytes
) {
3794 _mesa_swap2( (GLushort
*) dst
, n
);
3798 case GL_UNSIGNED_INT
:
3800 GLuint
*dst
= (GLuint
*) dest
;
3803 dst
[i
] = (GLuint
) source
[i
];
3805 if (dstPacking
->SwapBytes
) {
3806 _mesa_swap4( (GLuint
*) dst
, n
);
3812 GLint
*dst
= (GLint
*) dest
;
3815 *dst
++ = (GLint
) source
[i
];
3817 if (dstPacking
->SwapBytes
) {
3818 _mesa_swap4( (GLuint
*) dst
, n
);
3824 GLfloat
*dst
= (GLfloat
*) dest
;
3827 dst
[i
] = (GLfloat
) source
[i
];
3829 if (dstPacking
->SwapBytes
) {
3830 _mesa_swap4( (GLuint
*) dst
, n
);
3834 case GL_HALF_FLOAT_ARB
:
3836 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
3839 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
3841 if (dstPacking
->SwapBytes
) {
3842 _mesa_swap2( (GLushort
*) dst
, n
);
3847 if (dstPacking
->LsbFirst
) {
3848 GLubyte
*dst
= (GLubyte
*) dest
;
3851 for (i
= 0; i
< n
; i
++) {
3854 *dst
|= ((source
[i
] != 0) << shift
);
3863 GLubyte
*dst
= (GLubyte
*) dest
;
3866 for (i
= 0; i
< n
; i
++) {
3869 *dst
|= ((source
[i
] != 0) << shift
);
3879 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3885 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
,
3886 GLenum dstType
, GLvoid
*dest
, GLfloat depthScale
,
3887 GLenum srcType
, const GLvoid
*source
,
3888 const struct gl_pixelstore_attrib
*srcPacking
)
3890 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
3892 if (dstType
== GL_FLOAT
) {
3893 depthValues
= (GLfloat
*) dest
;
3896 depthValues
= depthTemp
;
3899 /* XXX we need to obey srcPacking->SwapBytes here!!! */
3906 const GLubyte
*src
= (const GLubyte
*) source
;
3907 for (i
= 0; i
< n
; i
++) {
3908 depthValues
[i
] = BYTE_TO_FLOAT(src
[i
]);
3912 case GL_UNSIGNED_BYTE
:
3915 const GLubyte
*src
= (const GLubyte
*) source
;
3916 for (i
= 0; i
< n
; i
++) {
3917 depthValues
[i
] = UBYTE_TO_FLOAT(src
[i
]);
3924 const GLshort
*src
= (const GLshort
*) source
;
3925 for (i
= 0; i
< n
; i
++) {
3926 depthValues
[i
] = SHORT_TO_FLOAT(src
[i
]);
3930 case GL_UNSIGNED_SHORT
:
3933 const GLushort
*src
= (const GLushort
*) source
;
3934 for (i
= 0; i
< n
; i
++) {
3935 depthValues
[i
] = USHORT_TO_FLOAT(src
[i
]);
3942 const GLint
*src
= (const GLint
*) source
;
3943 for (i
= 0; i
< n
; i
++) {
3944 depthValues
[i
] = INT_TO_FLOAT(src
[i
]);
3948 case GL_UNSIGNED_INT
:
3951 const GLuint
*src
= (const GLuint
*) source
;
3952 for (i
= 0; i
< n
; i
++) {
3953 depthValues
[i
] = UINT_TO_FLOAT(src
[i
]);
3957 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
3958 if (dstType
== GL_UNSIGNED_INT
&&
3959 depthScale
== (GLfloat
) 0xffffff &&
3960 ctx
->Pixel
.DepthScale
== 1.0 &&
3961 ctx
->Pixel
.DepthBias
== 0.0) {
3962 const GLuint
*src
= (const GLuint
*) source
;
3963 GLuint
*zValues
= (GLuint
*) dest
;
3965 for (i
= 0; i
< n
; i
++) {
3966 zValues
[i
] = src
[i
] & 0xffffff00;
3971 const GLuint
*src
= (const GLuint
*) source
;
3972 const GLfloat scale
= 1.0f
/ 0xffffff;
3974 for (i
= 0; i
< n
; i
++) {
3975 depthValues
[i
] = (src
[i
] >> 8) * scale
;
3980 _mesa_memcpy(depthValues
, source
, n
* sizeof(GLfloat
));
3982 case GL_HALF_FLOAT_ARB
:
3985 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
3986 for (i
= 0; i
< n
; i
++) {
3987 depthValues
[i
] = _mesa_half_to_float(src
[i
]);
3992 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3997 /* apply depth scale and bias and clamp to [0,1] */
3998 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3999 _mesa_scale_and_bias_depth(ctx
, n
, depthValues
);
4002 if (dstType
== GL_UNSIGNED_INT
) {
4003 GLuint
*zValues
= (GLuint
*) dest
;
4005 if (depthScale
<= (GLfloat
) 0xffffff) {
4006 /* no overflow worries */
4007 for (i
= 0; i
< n
; i
++) {
4008 zValues
[i
] = (GLuint
) (depthValues
[i
] * depthScale
);
4012 /* need to use double precision to prevent overflow problems */
4013 for (i
= 0; i
< n
; i
++) {
4014 GLdouble z
= depthValues
[i
] * depthScale
;
4015 if (z
>= (GLdouble
) 0xffffffff)
4016 zValues
[i
] = 0xffffffff;
4018 zValues
[i
] = (GLuint
) z
;
4022 else if (dstType
== GL_UNSIGNED_SHORT
) {
4023 GLushort
*zValues
= (GLushort
*) dest
;
4025 ASSERT(depthScale
<= 65535.0);
4026 for (i
= 0; i
< n
; i
++) {
4027 zValues
[i
] = (GLushort
) (depthValues
[i
] * depthScale
);
4031 ASSERT(dstType
== GL_FLOAT
);
4032 ASSERT(depthScale
== 1.0F
);
4038 * Pack an array of depth values. The values are floats in [0,1].
4041 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
4042 GLenum dstType
, const GLfloat
*depthSpan
,
4043 const struct gl_pixelstore_attrib
*dstPacking
)
4045 GLfloat depthCopy
[MAX_WIDTH
];
4047 ASSERT(n
<= MAX_WIDTH
);
4049 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4050 _mesa_memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4051 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4052 depthSpan
= depthCopy
;
4056 case GL_UNSIGNED_BYTE
:
4058 GLubyte
*dst
= (GLubyte
*) dest
;
4060 for (i
= 0; i
< n
; i
++) {
4061 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4067 GLbyte
*dst
= (GLbyte
*) dest
;
4069 for (i
= 0; i
< n
; i
++) {
4070 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4074 case GL_UNSIGNED_SHORT
:
4076 GLushort
*dst
= (GLushort
*) dest
;
4078 for (i
= 0; i
< n
; i
++) {
4079 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4081 if (dstPacking
->SwapBytes
) {
4082 _mesa_swap2( (GLushort
*) dst
, n
);
4088 GLshort
*dst
= (GLshort
*) dest
;
4090 for (i
= 0; i
< n
; i
++) {
4091 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4093 if (dstPacking
->SwapBytes
) {
4094 _mesa_swap2( (GLushort
*) dst
, n
);
4098 case GL_UNSIGNED_INT
:
4100 GLuint
*dst
= (GLuint
*) dest
;
4102 for (i
= 0; i
< n
; i
++) {
4103 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4105 if (dstPacking
->SwapBytes
) {
4106 _mesa_swap4( (GLuint
*) dst
, n
);
4112 GLint
*dst
= (GLint
*) dest
;
4114 for (i
= 0; i
< n
; i
++) {
4115 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4117 if (dstPacking
->SwapBytes
) {
4118 _mesa_swap4( (GLuint
*) dst
, n
);
4124 GLfloat
*dst
= (GLfloat
*) dest
;
4126 for (i
= 0; i
< n
; i
++) {
4127 dst
[i
] = depthSpan
[i
];
4129 if (dstPacking
->SwapBytes
) {
4130 _mesa_swap4( (GLuint
*) dst
, n
);
4134 case GL_HALF_FLOAT_ARB
:
4136 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4138 for (i
= 0; i
< n
; i
++) {
4139 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4141 if (dstPacking
->SwapBytes
) {
4142 _mesa_swap2( (GLushort
*) dst
, n
);
4147 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4154 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4157 _mesa_pack_depth_stencil_span(const GLcontext
*ctx
, GLuint n
, GLuint
*dest
,
4158 const GLfloat
*depthVals
,
4159 const GLstencil
*stencilVals
,
4160 const struct gl_pixelstore_attrib
*dstPacking
)
4162 GLfloat depthCopy
[MAX_WIDTH
];
4163 GLstencil stencilCopy
[MAX_WIDTH
];
4166 ASSERT(n
<= MAX_WIDTH
);
4168 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4169 _mesa_memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4170 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4171 depthVals
= depthCopy
;
4174 if (ctx
->Pixel
.IndexShift
||
4175 ctx
->Pixel
.IndexOffset
||
4176 ctx
->Pixel
.MapStencilFlag
) {
4177 _mesa_memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4178 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4179 stencilVals
= stencilCopy
;
4182 for (i
= 0; i
< n
; i
++) {
4183 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4184 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4187 if (dstPacking
->SwapBytes
) {
4188 _mesa_swap4(dest
, n
);
4196 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4197 * Return all image data in a contiguous block. This is used when we
4198 * compile glDrawPixels, glTexImage, etc into a display list. We
4199 * need a copy of the data in a standard format.
4202 _mesa_unpack_image( GLuint dimensions
,
4203 GLsizei width
, GLsizei height
, GLsizei depth
,
4204 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4205 const struct gl_pixelstore_attrib
*unpack
)
4207 GLint bytesPerRow
, compsPerRow
;
4208 GLboolean flipBytes
, swap2
, swap4
;
4211 return NULL
; /* not necessarily an error */
4213 if (width
<= 0 || height
<= 0 || depth
<= 0)
4214 return NULL
; /* generate error later */
4216 if (type
== GL_BITMAP
) {
4217 bytesPerRow
= (width
+ 7) >> 3;
4218 flipBytes
= unpack
->LsbFirst
;
4219 swap2
= swap4
= GL_FALSE
;
4223 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4224 GLint components
= _mesa_components_in_format(format
);
4227 if (_mesa_type_is_packed(type
))
4230 if (bytesPerPixel
<= 0 || components
<= 0)
4231 return NULL
; /* bad format or type. generate error later */
4232 bytesPerRow
= bytesPerPixel
* width
;
4233 bytesPerComp
= bytesPerPixel
/ components
;
4234 flipBytes
= GL_FALSE
;
4235 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4236 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4237 compsPerRow
= components
* width
;
4238 assert(compsPerRow
>= width
);
4243 = (GLubyte
*) _mesa_malloc(bytesPerRow
* height
* depth
);
4247 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4250 for (img
= 0; img
< depth
; img
++) {
4251 for (row
= 0; row
< height
; row
++) {
4252 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4253 width
, height
, format
, type
, img
, row
, 0);
4255 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4257 flipBytes
= GL_FALSE
;
4258 if (unpack
->LsbFirst
) {
4259 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4260 GLubyte dstMask
= 128;
4261 const GLubyte
*s
= src
;
4264 for (i
= 0; i
< width
; i
++) {
4268 if (srcMask
== 128) {
4272 srcMask
= srcMask
<< 1;
4279 dstMask
= dstMask
>> 1;
4283 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
4284 GLubyte dstMask
= 128;
4285 const GLubyte
*s
= src
;
4288 for (i
= 0; i
< width
; i
++) {
4296 srcMask
= srcMask
>> 1;
4303 dstMask
= dstMask
>> 1;
4308 _mesa_memcpy(dst
, src
, bytesPerRow
);
4309 /* byte flipping/swapping */
4311 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
4314 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
4317 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
4326 #endif /* _HAVE_FULL_GL */
4331 * Convert an array of RGBA colors from one datatype to another.
4332 * NOTE: src may equal dst. In that case, we use a temporary buffer.
4335 _mesa_convert_colors(GLenum srcType
, const GLvoid
*src
,
4336 GLenum dstType
, GLvoid
*dst
,
4337 GLuint count
, const GLubyte mask
[])
4339 GLuint tempBuffer
[MAX_WIDTH
][4];
4340 const GLboolean useTemp
= (src
== dst
);
4342 ASSERT(srcType
!= dstType
);
4345 case GL_UNSIGNED_BYTE
:
4346 if (dstType
== GL_UNSIGNED_SHORT
) {
4347 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
4348 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
4350 for (i
= 0; i
< count
; i
++) {
4351 if (!mask
|| mask
[i
]) {
4352 dst2
[i
][RCOMP
] = UBYTE_TO_USHORT(src1
[i
][RCOMP
]);
4353 dst2
[i
][GCOMP
] = UBYTE_TO_USHORT(src1
[i
][GCOMP
]);
4354 dst2
[i
][BCOMP
] = UBYTE_TO_USHORT(src1
[i
][BCOMP
]);
4355 dst2
[i
][ACOMP
] = UBYTE_TO_USHORT(src1
[i
][ACOMP
]);
4359 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
4362 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
4363 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
4365 ASSERT(dstType
== GL_FLOAT
);
4366 for (i
= 0; i
< count
; i
++) {
4367 if (!mask
|| mask
[i
]) {
4368 dst4
[i
][RCOMP
] = UBYTE_TO_FLOAT(src1
[i
][RCOMP
]);
4369 dst4
[i
][GCOMP
] = UBYTE_TO_FLOAT(src1
[i
][GCOMP
]);
4370 dst4
[i
][BCOMP
] = UBYTE_TO_FLOAT(src1
[i
][BCOMP
]);
4371 dst4
[i
][ACOMP
] = UBYTE_TO_FLOAT(src1
[i
][ACOMP
]);
4375 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
4378 case GL_UNSIGNED_SHORT
:
4379 if (dstType
== GL_UNSIGNED_BYTE
) {
4380 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
4381 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
4383 for (i
= 0; i
< count
; i
++) {
4384 if (!mask
|| mask
[i
]) {
4385 dst1
[i
][RCOMP
] = USHORT_TO_UBYTE(src2
[i
][RCOMP
]);
4386 dst1
[i
][GCOMP
] = USHORT_TO_UBYTE(src2
[i
][GCOMP
]);
4387 dst1
[i
][BCOMP
] = USHORT_TO_UBYTE(src2
[i
][BCOMP
]);
4388 dst1
[i
][ACOMP
] = USHORT_TO_UBYTE(src2
[i
][ACOMP
]);
4392 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
4395 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
4396 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
4398 ASSERT(dstType
== GL_FLOAT
);
4399 for (i
= 0; i
< count
; i
++) {
4400 if (!mask
|| mask
[i
]) {
4401 dst4
[i
][RCOMP
] = USHORT_TO_FLOAT(src2
[i
][RCOMP
]);
4402 dst4
[i
][GCOMP
] = USHORT_TO_FLOAT(src2
[i
][GCOMP
]);
4403 dst4
[i
][BCOMP
] = USHORT_TO_FLOAT(src2
[i
][BCOMP
]);
4404 dst4
[i
][ACOMP
] = USHORT_TO_FLOAT(src2
[i
][ACOMP
]);
4408 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
4412 if (dstType
== GL_UNSIGNED_BYTE
) {
4413 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
4414 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
4416 for (i
= 0; i
< count
; i
++) {
4417 if (!mask
|| mask
[i
]) {
4418 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][RCOMP
], src4
[i
][RCOMP
]);
4419 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][GCOMP
], src4
[i
][GCOMP
]);
4420 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][BCOMP
], src4
[i
][BCOMP
]);
4421 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][ACOMP
], src4
[i
][ACOMP
]);
4425 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
4428 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
4429 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
4431 ASSERT(dstType
== GL_UNSIGNED_SHORT
);
4432 for (i
= 0; i
< count
; i
++) {
4433 if (!mask
|| mask
[i
]) {
4434 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][RCOMP
], src4
[i
][RCOMP
]);
4435 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][GCOMP
], src4
[i
][GCOMP
]);
4436 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][BCOMP
], src4
[i
][BCOMP
]);
4437 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][ACOMP
], src4
[i
][ACOMP
]);
4441 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
4445 _mesa_problem(NULL
, "Invalid datatype in _mesa_convert_colors");
4453 * Perform basic clipping for glDrawPixels. The image's position and size
4454 * and the unpack SkipPixels and SkipRows are adjusted so that the image
4455 * region is entirely within the window and scissor bounds.
4456 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
4457 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
4458 * we'll actually write. Beforehand, *destY-1 is the first drawing row.
4460 * \return GL_TRUE if image is ready for drawing or
4461 * GL_FALSE if image was completely clipped away (draw nothing)
4464 _mesa_clip_drawpixels(const GLcontext
*ctx
,
4465 GLint
*destX
, GLint
*destY
,
4466 GLsizei
*width
, GLsizei
*height
,
4467 struct gl_pixelstore_attrib
*unpack
)
4469 const GLframebuffer
*buffer
= ctx
->DrawBuffer
;
4471 if (unpack
->RowLength
== 0) {
4472 unpack
->RowLength
= *width
;
4475 ASSERT(ctx
->Pixel
.ZoomX
== 1.0F
);
4476 ASSERT(ctx
->Pixel
.ZoomY
== 1.0F
|| ctx
->Pixel
.ZoomY
== -1.0F
);
4479 if (*destX
< buffer
->_Xmin
) {
4480 unpack
->SkipPixels
+= (buffer
->_Xmin
- *destX
);
4481 *width
-= (buffer
->_Xmin
- *destX
);
4482 *destX
= buffer
->_Xmin
;
4484 /* right clipping */
4485 if (*destX
+ *width
> buffer
->_Xmax
)
4486 *width
-= (*destX
+ *width
- buffer
->_Xmax
);
4491 if (ctx
->Pixel
.ZoomY
== 1.0F
) {
4492 /* bottom clipping */
4493 if (*destY
< buffer
->_Ymin
) {
4494 unpack
->SkipRows
+= (buffer
->_Ymin
- *destY
);
4495 *height
-= (buffer
->_Ymin
- *destY
);
4496 *destY
= buffer
->_Ymin
;
4499 if (*destY
+ *height
> buffer
->_Ymax
)
4500 *height
-= (*destY
+ *height
- buffer
->_Ymax
);
4502 else { /* upside down */
4504 if (*destY
> buffer
->_Ymax
) {
4505 unpack
->SkipRows
+= (*destY
- buffer
->_Ymax
);
4506 *height
-= (*destY
- buffer
->_Ymax
);
4507 *destY
= buffer
->_Ymax
;
4509 /* bottom clipping */
4510 if (*destY
- *height
< buffer
->_Ymin
)
4511 *height
-= (buffer
->_Ymin
- (*destY
- *height
));
4512 /* adjust destY so it's the first row to write to */
4524 * Perform clipping for glReadPixels. The image's window position
4525 * and size, and the pack skipPixels, skipRows and rowLength are adjusted
4526 * so that the image region is entirely within the window bounds.
4527 * Note: this is different from _mesa_clip_drawpixels() in that the
4528 * scissor box is ignored, and we use the bounds of the current readbuffer
4531 * \return GL_TRUE if image is ready for drawing or
4532 * GL_FALSE if image was completely clipped away (draw nothing)
4535 _mesa_clip_readpixels(const GLcontext
*ctx
,
4536 GLint
*srcX
, GLint
*srcY
,
4537 GLsizei
*width
, GLsizei
*height
,
4538 struct gl_pixelstore_attrib
*pack
)
4540 const GLframebuffer
*buffer
= ctx
->ReadBuffer
;
4542 if (pack
->RowLength
== 0) {
4543 pack
->RowLength
= *width
;
4548 pack
->SkipPixels
+= (0 - *srcX
);
4549 *width
-= (0 - *srcX
);
4552 /* right clipping */
4553 if (*srcX
+ *width
> (GLsizei
) buffer
->Width
)
4554 *width
-= (*srcX
+ *width
- buffer
->Width
);
4559 /* bottom clipping */
4561 pack
->SkipRows
+= (0 - *srcY
);
4562 *height
-= (0 - *srcY
);
4566 if (*srcY
+ *height
> (GLsizei
) buffer
->Height
)
4567 *height
-= (*srcY
+ *height
- buffer
->Height
);
4577 * Clip the rectangle defined by (x, y, width, height) against the bounds
4578 * specified by [xmin, xmax) and [ymin, ymax).
4579 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
4582 _mesa_clip_to_region(GLint xmin
, GLint ymin
,
4583 GLint xmax
, GLint ymax
,
4585 GLsizei
*width
, GLsizei
*height
)
4589 *width
-= (xmin
- *x
);
4593 /* right clipping */
4594 if (*x
+ *width
> xmax
)
4595 *width
-= (*x
+ *width
- xmax
- 1);
4600 /* bottom (or top) clipping */
4602 *height
-= (ymin
- *y
);
4606 /* top (or bottom) clipping */
4607 if (*y
+ *height
> ymax
)
4608 *height
-= (*y
+ *height
- ymax
- 1);