2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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
)
107 for (i
= 0; i
< n
; i
++) {
108 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
109 a
= ((b
& 0x01) << 7) |
123 * Flip the order of the 2 bytes in each word in the given array.
126 * \param n number of words.
129 _mesa_swap2( GLushort
*p
, GLuint n
)
132 for (i
= 0; i
< n
; i
++) {
133 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
140 * Flip the order of the 4 bytes in each word in the given array.
143 _mesa_swap4( GLuint
*p
, GLuint n
)
146 for (i
= 0; i
< n
; i
++) {
149 | ((b
>> 8) & 0xff00)
150 | ((b
<< 8) & 0xff0000)
151 | ((b
<< 24) & 0xff000000);
158 * Get the size of a GL data type.
160 * \param type GL data type.
162 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
163 * if an invalid type enum.
166 _mesa_sizeof_type( GLenum type
)
171 case GL_UNSIGNED_BYTE
:
172 return sizeof(GLubyte
);
174 return sizeof(GLbyte
);
175 case GL_UNSIGNED_SHORT
:
176 return sizeof(GLushort
);
178 return sizeof(GLshort
);
179 case GL_UNSIGNED_INT
:
180 return sizeof(GLuint
);
182 return sizeof(GLint
);
184 return sizeof(GLfloat
);
186 return sizeof(GLdouble
);
187 case GL_HALF_FLOAT_ARB
:
188 return sizeof(GLhalfARB
);
196 * Same as _mesa_sizeof_type() but also accepting the packed pixel
200 _mesa_sizeof_packed_type( GLenum type
)
205 case GL_UNSIGNED_BYTE
:
206 return sizeof(GLubyte
);
208 return sizeof(GLbyte
);
209 case GL_UNSIGNED_SHORT
:
210 return sizeof(GLushort
);
212 return sizeof(GLshort
);
213 case GL_UNSIGNED_INT
:
214 return sizeof(GLuint
);
216 return sizeof(GLint
);
217 case GL_HALF_FLOAT_ARB
:
218 return sizeof(GLhalfARB
);
220 return sizeof(GLfloat
);
221 case GL_UNSIGNED_BYTE_3_3_2
:
222 return sizeof(GLubyte
);
223 case GL_UNSIGNED_BYTE_2_3_3_REV
:
224 return sizeof(GLubyte
);
225 case GL_UNSIGNED_SHORT_5_6_5
:
226 return sizeof(GLushort
);
227 case GL_UNSIGNED_SHORT_5_6_5_REV
:
228 return sizeof(GLushort
);
229 case GL_UNSIGNED_SHORT_4_4_4_4
:
230 return sizeof(GLushort
);
231 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
232 return sizeof(GLushort
);
233 case GL_UNSIGNED_SHORT_5_5_5_1
:
234 return sizeof(GLushort
);
235 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
236 return sizeof(GLushort
);
237 case GL_UNSIGNED_INT_8_8_8_8
:
238 return sizeof(GLuint
);
239 case GL_UNSIGNED_INT_8_8_8_8_REV
:
240 return sizeof(GLuint
);
241 case GL_UNSIGNED_INT_10_10_10_2
:
242 return sizeof(GLuint
);
243 case GL_UNSIGNED_INT_2_10_10_10_REV
:
244 return sizeof(GLuint
);
245 case GL_UNSIGNED_SHORT_8_8_MESA
:
246 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
247 return sizeof(GLushort
);
248 case GL_UNSIGNED_INT_24_8_EXT
:
249 return sizeof(GLuint
);
257 * Get the number of components in a pixel format.
259 * \param format pixel format.
261 * \return the number of components in the given format, or -1 if a bad format.
264 _mesa_components_in_format( GLenum format
)
268 case GL_COLOR_INDEX1_EXT
:
269 case GL_COLOR_INDEX2_EXT
:
270 case GL_COLOR_INDEX4_EXT
:
271 case GL_COLOR_INDEX8_EXT
:
272 case GL_COLOR_INDEX12_EXT
:
273 case GL_COLOR_INDEX16_EXT
:
274 case GL_STENCIL_INDEX
:
275 case GL_DEPTH_COMPONENT
:
277 case GL_RED_INTEGER_EXT
:
279 case GL_GREEN_INTEGER_EXT
:
281 case GL_BLUE_INTEGER_EXT
:
283 case GL_ALPHA_INTEGER_EXT
:
285 case GL_LUMINANCE_INTEGER_EXT
:
288 case GL_LUMINANCE_ALPHA
:
289 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
292 case GL_RGB_INTEGER_EXT
:
295 case GL_RGBA_INTEGER_EXT
:
305 case GL_DEPTH_STENCIL_EXT
:
317 * Get the bytes per pixel of pixel format type pair.
319 * \param format pixel format.
320 * \param type pixel type.
322 * \return bytes per pixel, or -1 if a bad format or type was given.
325 _mesa_bytes_per_pixel( GLenum format
, GLenum type
)
327 GLint comps
= _mesa_components_in_format( format
);
333 return 0; /* special case */
335 case GL_UNSIGNED_BYTE
:
336 return comps
* sizeof(GLubyte
);
338 case GL_UNSIGNED_SHORT
:
339 return comps
* sizeof(GLshort
);
341 case GL_UNSIGNED_INT
:
342 return comps
* sizeof(GLint
);
344 return comps
* sizeof(GLfloat
);
345 case GL_HALF_FLOAT_ARB
:
346 return comps
* sizeof(GLhalfARB
);
347 case GL_UNSIGNED_BYTE_3_3_2
:
348 case GL_UNSIGNED_BYTE_2_3_3_REV
:
349 if (format
== GL_RGB
|| format
== GL_BGR
)
350 return sizeof(GLubyte
);
352 return -1; /* error */
353 case GL_UNSIGNED_SHORT_5_6_5
:
354 case GL_UNSIGNED_SHORT_5_6_5_REV
:
355 if (format
== GL_RGB
|| format
== GL_BGR
)
356 return sizeof(GLushort
);
358 return -1; /* error */
359 case GL_UNSIGNED_SHORT_4_4_4_4
:
360 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
361 case GL_UNSIGNED_SHORT_5_5_5_1
:
362 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
363 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
364 return sizeof(GLushort
);
367 case GL_UNSIGNED_INT_8_8_8_8
:
368 case GL_UNSIGNED_INT_8_8_8_8_REV
:
369 case GL_UNSIGNED_INT_10_10_10_2
:
370 case GL_UNSIGNED_INT_2_10_10_10_REV
:
371 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
372 return sizeof(GLuint
);
375 case GL_UNSIGNED_SHORT_8_8_MESA
:
376 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
377 if (format
== GL_YCBCR_MESA
)
378 return sizeof(GLushort
);
381 case GL_UNSIGNED_INT_24_8_EXT
:
382 if (format
== GL_DEPTH_STENCIL_EXT
)
383 return sizeof(GLuint
);
393 * Test for a legal pixel format and type.
395 * \param format pixel format.
396 * \param type pixel type.
398 * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
402 _mesa_is_legal_format_and_type( GLcontext
*ctx
, GLenum format
, GLenum type
)
406 case GL_STENCIL_INDEX
:
410 case GL_UNSIGNED_BYTE
:
412 case GL_UNSIGNED_SHORT
:
414 case GL_UNSIGNED_INT
:
417 case GL_HALF_FLOAT_ARB
:
418 return ctx
->Extensions
.ARB_half_float_pixel
;
426 #if 0 /* not legal! see table 3.6 of the 1.5 spec */
430 case GL_LUMINANCE_ALPHA
:
431 case GL_DEPTH_COMPONENT
:
434 case GL_UNSIGNED_BYTE
:
436 case GL_UNSIGNED_SHORT
:
438 case GL_UNSIGNED_INT
:
441 case GL_HALF_FLOAT_ARB
:
442 return ctx
->Extensions
.ARB_half_float_pixel
;
449 case GL_UNSIGNED_BYTE
:
451 case GL_UNSIGNED_SHORT
:
453 case GL_UNSIGNED_INT
:
455 case GL_UNSIGNED_BYTE_3_3_2
:
456 case GL_UNSIGNED_BYTE_2_3_3_REV
:
457 case GL_UNSIGNED_SHORT_5_6_5
:
458 case GL_UNSIGNED_SHORT_5_6_5_REV
:
460 case GL_HALF_FLOAT_ARB
:
461 return ctx
->Extensions
.ARB_half_float_pixel
;
467 /* NOTE: no packed types are supported with BGR. That's
468 * intentional, according to the GL spec.
471 case GL_UNSIGNED_BYTE
:
473 case GL_UNSIGNED_SHORT
:
475 case GL_UNSIGNED_INT
:
478 case GL_HALF_FLOAT_ARB
:
479 return ctx
->Extensions
.ARB_half_float_pixel
;
488 case GL_UNSIGNED_BYTE
:
490 case GL_UNSIGNED_SHORT
:
492 case GL_UNSIGNED_INT
:
494 case GL_UNSIGNED_SHORT_4_4_4_4
:
495 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
496 case GL_UNSIGNED_SHORT_5_5_5_1
:
497 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
498 case GL_UNSIGNED_INT_8_8_8_8
:
499 case GL_UNSIGNED_INT_8_8_8_8_REV
:
500 case GL_UNSIGNED_INT_10_10_10_2
:
501 case GL_UNSIGNED_INT_2_10_10_10_REV
:
503 case GL_HALF_FLOAT_ARB
:
504 return ctx
->Extensions
.ARB_half_float_pixel
;
509 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
||
510 type
== GL_UNSIGNED_SHORT_8_8_REV_MESA
)
514 case GL_DEPTH_STENCIL_EXT
:
515 if (ctx
->Extensions
.EXT_packed_depth_stencil
516 && type
== GL_UNSIGNED_INT_24_8_EXT
)
524 case GL_UNSIGNED_BYTE
:
526 case GL_UNSIGNED_SHORT
:
528 case GL_UNSIGNED_INT
:
534 case GL_RED_INTEGER_EXT
:
535 case GL_GREEN_INTEGER_EXT
:
536 case GL_BLUE_INTEGER_EXT
:
537 case GL_ALPHA_INTEGER_EXT
:
538 case GL_RGB_INTEGER_EXT
:
539 case GL_RGBA_INTEGER_EXT
:
540 case GL_BGR_INTEGER_EXT
:
541 case GL_BGRA_INTEGER_EXT
:
542 case GL_LUMINANCE_INTEGER_EXT
:
543 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
546 case GL_UNSIGNED_BYTE
:
548 case GL_UNSIGNED_SHORT
:
550 case GL_UNSIGNED_INT
:
551 return ctx
->Extensions
.EXT_texture_integer
;
564 * Test if the given image format is a color/RGBA format (i.e., not color
565 * index, depth, stencil, etc).
566 * \param format the image format value (may by an internal texture format)
567 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
570 _mesa_is_color_format(GLenum format
)
588 case GL_LUMINANCE_ALPHA
:
589 case GL_LUMINANCE4_ALPHA4
:
590 case GL_LUMINANCE6_ALPHA2
:
591 case GL_LUMINANCE8_ALPHA8
:
592 case GL_LUMINANCE12_ALPHA4
:
593 case GL_LUMINANCE12_ALPHA12
:
594 case GL_LUMINANCE16_ALPHA16
:
621 /* float texture formats */
622 case GL_ALPHA16F_ARB
:
623 case GL_ALPHA32F_ARB
:
624 case GL_LUMINANCE16F_ARB
:
625 case GL_LUMINANCE32F_ARB
:
626 case GL_LUMINANCE_ALPHA16F_ARB
:
627 case GL_LUMINANCE_ALPHA32F_ARB
:
628 case GL_INTENSITY16F_ARB
:
629 case GL_INTENSITY32F_ARB
:
634 /* compressed formats */
635 case GL_COMPRESSED_ALPHA
:
636 case GL_COMPRESSED_LUMINANCE
:
637 case GL_COMPRESSED_LUMINANCE_ALPHA
:
638 case GL_COMPRESSED_INTENSITY
:
639 case GL_COMPRESSED_RGB
:
640 case GL_COMPRESSED_RGBA
:
645 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
646 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
647 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
648 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
649 case GL_COMPRESSED_RGB_FXT1_3DFX
:
650 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
651 #if FEATURE_EXT_texture_sRGB
654 case GL_SRGB_ALPHA_EXT
:
655 case GL_SRGB8_ALPHA8_EXT
:
656 case GL_SLUMINANCE_ALPHA_EXT
:
657 case GL_SLUMINANCE8_ALPHA8_EXT
:
658 case GL_SLUMINANCE_EXT
:
659 case GL_SLUMINANCE8_EXT
:
660 case GL_COMPRESSED_SRGB_EXT
:
661 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
662 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
663 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
664 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
665 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
666 case GL_COMPRESSED_SLUMINANCE_EXT
:
667 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
668 #endif /* FEATURE_EXT_texture_sRGB */
670 /* signed texture formats */
674 case GL_YCBCR_MESA
: /* not considered to be RGB */
683 * Test if the given image format is a color index format.
686 _mesa_is_index_format(GLenum format
)
690 case GL_COLOR_INDEX1_EXT
:
691 case GL_COLOR_INDEX2_EXT
:
692 case GL_COLOR_INDEX4_EXT
:
693 case GL_COLOR_INDEX8_EXT
:
694 case GL_COLOR_INDEX12_EXT
:
695 case GL_COLOR_INDEX16_EXT
:
704 * Test if the given image format is a depth component format.
707 _mesa_is_depth_format(GLenum format
)
710 case GL_DEPTH_COMPONENT
:
711 case GL_DEPTH_COMPONENT16
:
712 case GL_DEPTH_COMPONENT24
:
713 case GL_DEPTH_COMPONENT32
:
722 * Test if the given image format is a stencil format.
725 _mesa_is_stencil_format(GLenum format
)
728 case GL_STENCIL_INDEX
:
729 case GL_DEPTH_STENCIL
:
738 * Test if the given image format is a YCbCr format.
741 _mesa_is_ycbcr_format(GLenum format
)
753 * Test if the given image format is a depth+stencil format.
756 _mesa_is_depthstencil_format(GLenum format
)
759 case GL_DEPTH24_STENCIL8_EXT
:
760 case GL_DEPTH_STENCIL_EXT
:
769 * Test if the given image format is a depth or stencil format.
772 _mesa_is_depth_or_stencil_format(GLenum format
)
775 case GL_DEPTH_COMPONENT
:
776 case GL_DEPTH_COMPONENT16
:
777 case GL_DEPTH_COMPONENT24
:
778 case GL_DEPTH_COMPONENT32
:
779 case GL_STENCIL_INDEX
:
780 case GL_STENCIL_INDEX1_EXT
:
781 case GL_STENCIL_INDEX4_EXT
:
782 case GL_STENCIL_INDEX8_EXT
:
783 case GL_STENCIL_INDEX16_EXT
:
784 case GL_DEPTH_STENCIL_EXT
:
785 case GL_DEPTH24_STENCIL8_EXT
:
794 * Test if the given image format is a dudv format.
797 _mesa_is_dudv_format(GLenum format
)
810 * Test if the given format is an integer (non-normalized) format.
813 _mesa_is_integer_format(GLenum format
)
816 case GL_RED_INTEGER_EXT
:
817 case GL_GREEN_INTEGER_EXT
:
818 case GL_BLUE_INTEGER_EXT
:
819 case GL_ALPHA_INTEGER_EXT
:
820 case GL_RGB_INTEGER_EXT
:
821 case GL_RGBA_INTEGER_EXT
:
822 case GL_BGR_INTEGER_EXT
:
823 case GL_BGRA_INTEGER_EXT
:
824 case GL_LUMINANCE_INTEGER_EXT
:
825 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
834 * Test if an image format is a supported compressed format.
835 * \param format the internal format token provided by the user.
836 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
839 _mesa_is_compressed_format(GLcontext
*ctx
, GLenum format
)
842 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
843 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
844 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
845 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
846 return ctx
->Extensions
.EXT_texture_compression_s3tc
;
851 return ctx
->Extensions
.S3_s3tc
;
852 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
853 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
854 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
855 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
856 return ctx
->Extensions
.EXT_texture_sRGB
857 && ctx
->Extensions
.EXT_texture_compression_s3tc
;
858 case GL_COMPRESSED_RGB_FXT1_3DFX
:
859 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
860 return ctx
->Extensions
.TDFX_texture_compression_FXT1
;
868 * Return the address of a specific pixel in an image (1D, 2D or 3D).
870 * Pixel unpacking/packing parameters are observed according to \p packing.
872 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
873 * \param image starting address of image data
874 * \param width the image width
875 * \param height theimage height
876 * \param format the pixel format
877 * \param type the pixel data type
878 * \param packing the pixelstore attributes
879 * \param img which image in the volume (0 for 1D or 2D images)
880 * \param row row of pixel in the image (0 for 1D images)
881 * \param column column of pixel in the image
883 * \return address of pixel on success, or NULL on error.
885 * \sa gl_pixelstore_attrib.
888 _mesa_image_address( GLuint dimensions
,
889 const struct gl_pixelstore_attrib
*packing
,
891 GLsizei width
, GLsizei height
,
892 GLenum format
, GLenum type
,
893 GLint img
, GLint row
, GLint column
)
895 GLint alignment
; /* 1, 2 or 4 */
896 GLint pixels_per_row
;
897 GLint rows_per_image
;
900 GLint skipimages
; /* for 3-D volume images */
903 ASSERT(dimensions
>= 1 && dimensions
<= 3);
905 alignment
= packing
->Alignment
;
906 if (packing
->RowLength
> 0) {
907 pixels_per_row
= packing
->RowLength
;
910 pixels_per_row
= width
;
912 if (packing
->ImageHeight
> 0) {
913 rows_per_image
= packing
->ImageHeight
;
916 rows_per_image
= height
;
919 skippixels
= packing
->SkipPixels
;
920 /* Note: SKIP_ROWS _is_ used for 1D images */
921 skiprows
= packing
->SkipRows
;
922 /* Note: SKIP_IMAGES is only used for 3D images */
923 skipimages
= (dimensions
== 3) ? packing
->SkipImages
: 0;
925 if (type
== GL_BITMAP
) {
927 GLint comp_per_pixel
; /* components per pixel */
928 GLint bytes_per_comp
; /* bytes per component */
930 GLint bytes_per_image
;
932 /* Compute bytes per component */
933 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
934 if (bytes_per_comp
< 0) {
938 /* Compute number of components per pixel */
939 comp_per_pixel
= _mesa_components_in_format( format
);
940 if (comp_per_pixel
< 0) {
944 bytes_per_row
= alignment
945 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
947 bytes_per_image
= bytes_per_row
* rows_per_image
;
949 pixel_addr
= (GLubyte
*) image
950 + (skipimages
+ img
) * bytes_per_image
951 + (skiprows
+ row
) * bytes_per_row
952 + (skippixels
+ column
) / 8;
955 /* Non-BITMAP data */
956 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
959 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
961 /* The pixel type and format should have been error checked earlier */
962 assert(bytes_per_pixel
> 0);
964 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
965 remainder
= bytes_per_row
% alignment
;
967 bytes_per_row
+= (alignment
- remainder
);
969 ASSERT(bytes_per_row
% alignment
== 0);
971 bytes_per_image
= bytes_per_row
* rows_per_image
;
973 if (packing
->Invert
) {
974 /* set pixel_addr to the last row */
975 topOfImage
= bytes_per_row
* (height
- 1);
976 bytes_per_row
= -bytes_per_row
;
982 /* compute final pixel address */
983 pixel_addr
= (GLubyte
*) image
984 + (skipimages
+ img
) * bytes_per_image
986 + (skiprows
+ row
) * bytes_per_row
987 + (skippixels
+ column
) * bytes_per_pixel
;
990 return (GLvoid
*) pixel_addr
;
995 _mesa_image_address1d( const struct gl_pixelstore_attrib
*packing
,
998 GLenum format
, GLenum type
,
1001 return _mesa_image_address(1, packing
, image
, width
, 1,
1002 format
, type
, 0, 0, column
);
1007 _mesa_image_address2d( const struct gl_pixelstore_attrib
*packing
,
1008 const GLvoid
*image
,
1009 GLsizei width
, GLsizei height
,
1010 GLenum format
, GLenum type
,
1011 GLint row
, GLint column
)
1013 return _mesa_image_address(2, packing
, image
, width
, height
,
1014 format
, type
, 0, row
, column
);
1019 _mesa_image_address3d( const struct gl_pixelstore_attrib
*packing
,
1020 const GLvoid
*image
,
1021 GLsizei width
, GLsizei height
,
1022 GLenum format
, GLenum type
,
1023 GLint img
, GLint row
, GLint column
)
1025 return _mesa_image_address(3, packing
, image
, width
, height
,
1026 format
, type
, img
, row
, column
);
1032 * Compute the stride (in bytes) between image rows.
1034 * \param packing the pixelstore attributes
1035 * \param width image width.
1036 * \param format pixel format.
1037 * \param type pixel data type.
1039 * \return the stride in bytes for the given parameters, or -1 if error
1042 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
1043 GLint width
, GLenum format
, GLenum type
)
1045 GLint bytesPerRow
, remainder
;
1049 if (type
== GL_BITMAP
) {
1050 if (packing
->RowLength
== 0) {
1051 bytesPerRow
= (width
+ 7) / 8;
1054 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1058 /* Non-BITMAP data */
1059 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1060 if (bytesPerPixel
<= 0)
1061 return -1; /* error */
1062 if (packing
->RowLength
== 0) {
1063 bytesPerRow
= bytesPerPixel
* width
;
1066 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1070 remainder
= bytesPerRow
% packing
->Alignment
;
1071 if (remainder
> 0) {
1072 bytesPerRow
+= (packing
->Alignment
- remainder
);
1075 if (packing
->Invert
) {
1076 /* negate the bytes per row (negative row stride) */
1077 bytesPerRow
= -bytesPerRow
;
1087 * Compute the stride between images in a 3D texture (in bytes) for the given
1088 * pixel packing parameters and image width, format and type.
1091 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
1092 GLint width
, GLint height
,
1093 GLenum format
, GLenum type
)
1095 GLint bytesPerRow
, bytesPerImage
, remainder
;
1099 if (type
== GL_BITMAP
) {
1100 if (packing
->RowLength
== 0) {
1101 bytesPerRow
= (width
+ 7) / 8;
1104 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1108 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1110 if (bytesPerPixel
<= 0)
1111 return -1; /* error */
1112 if (packing
->RowLength
== 0) {
1113 bytesPerRow
= bytesPerPixel
* width
;
1116 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1120 remainder
= bytesPerRow
% packing
->Alignment
;
1122 bytesPerRow
+= (packing
->Alignment
- remainder
);
1124 if (packing
->ImageHeight
== 0)
1125 bytesPerImage
= bytesPerRow
* height
;
1127 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
1129 return bytesPerImage
;
1134 * Unpack a 32x32 pixel polygon stipple from user memory using the
1135 * current pixel unpack settings.
1138 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
1139 const struct gl_pixelstore_attrib
*unpacking
)
1141 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
1143 /* Convert pattern from GLubytes to GLuints and handle big/little
1144 * endian differences
1148 for (i
= 0; i
< 32; i
++) {
1149 dest
[i
] = (p
[0] << 24)
1161 * Pack polygon stipple into user memory given current pixel packing
1165 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
1166 const struct gl_pixelstore_attrib
*packing
)
1168 /* Convert pattern from GLuints to GLubytes to handle big/little
1169 * endian differences.
1173 for (i
= 0; i
< 32; i
++) {
1174 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
1175 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
1176 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
1177 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
1180 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
1185 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
1186 * order with row alignment = 1 byte.
1189 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
1190 const struct gl_pixelstore_attrib
*packing
)
1192 GLint bytes
, row
, width_in_bytes
;
1193 GLubyte
*buffer
, *dst
;
1198 /* Alloc dest storage */
1199 bytes
= ((width
+ 7) / 8 * height
);
1200 buffer
= (GLubyte
*) malloc( bytes
);
1204 width_in_bytes
= CEILING( width
, 8 );
1206 for (row
= 0; row
< height
; row
++) {
1207 const GLubyte
*src
= (const GLubyte
*)
1208 _mesa_image_address2d(packing
, pixels
, width
, height
,
1209 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1215 if ((packing
->SkipPixels
& 7) == 0) {
1216 memcpy( dst
, src
, width_in_bytes
);
1217 if (packing
->LsbFirst
) {
1218 flip_bytes( dst
, width_in_bytes
);
1222 /* handling SkipPixels is a bit tricky (no pun intended!) */
1224 if (packing
->LsbFirst
) {
1225 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
1226 GLubyte dstMask
= 128;
1227 const GLubyte
*s
= src
;
1230 for (i
= 0; i
< width
; i
++) {
1234 if (srcMask
== 128) {
1239 srcMask
= srcMask
<< 1;
1247 dstMask
= dstMask
>> 1;
1252 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
1253 GLubyte dstMask
= 128;
1254 const GLubyte
*s
= src
;
1257 for (i
= 0; i
< width
; i
++) {
1266 srcMask
= srcMask
>> 1;
1274 dstMask
= dstMask
>> 1;
1279 dst
+= width_in_bytes
;
1290 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
1291 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
1293 GLint row
, width_in_bytes
;
1299 width_in_bytes
= CEILING( width
, 8 );
1301 for (row
= 0; row
< height
; row
++) {
1302 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
1303 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1307 if ((packing
->SkipPixels
& 7) == 0) {
1308 memcpy( dst
, src
, width_in_bytes
);
1309 if (packing
->LsbFirst
) {
1310 flip_bytes( dst
, width_in_bytes
);
1314 /* handling SkipPixels is a bit tricky (no pun intended!) */
1316 if (packing
->LsbFirst
) {
1317 GLubyte srcMask
= 128;
1318 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
1319 const GLubyte
*s
= src
;
1322 for (i
= 0; i
< width
; i
++) {
1331 srcMask
= srcMask
>> 1;
1333 if (dstMask
== 128) {
1339 dstMask
= dstMask
<< 1;
1344 GLubyte srcMask
= 128;
1345 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
1346 const GLubyte
*s
= src
;
1349 for (i
= 0; i
< width
; i
++) {
1358 srcMask
= srcMask
>> 1;
1366 dstMask
= dstMask
>> 1;
1371 src
+= width_in_bytes
;
1377 * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1378 * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1379 * "On" bits will set texels to \p onValue.
1380 * "Off" bits will not modify texels.
1381 * \param width src bitmap width in pixels
1382 * \param height src bitmap height in pixels
1383 * \param unpack bitmap unpacking state
1384 * \param bitmap the src bitmap data
1385 * \param destBuffer start of dest buffer
1386 * \param destStride row stride in dest buffer
1387 * \param onValue if bit is 1, set destBuffer pixel to this value
1390 _mesa_expand_bitmap(GLsizei width
, GLsizei height
,
1391 const struct gl_pixelstore_attrib
*unpack
,
1392 const GLubyte
*bitmap
,
1393 GLubyte
*destBuffer
, GLint destStride
,
1396 const GLubyte
*srcRow
= (const GLubyte
*)
1397 _mesa_image_address2d(unpack
, bitmap
, width
, height
,
1398 GL_COLOR_INDEX
, GL_BITMAP
, 0, 0);
1399 const GLint srcStride
= _mesa_image_row_stride(unpack
, width
,
1400 GL_COLOR_INDEX
, GL_BITMAP
);
1403 #define SET_PIXEL(COL, ROW) \
1404 destBuffer[(ROW) * destStride + (COL)] = onValue;
1406 for (row
= 0; row
< height
; row
++) {
1407 const GLubyte
*src
= srcRow
;
1409 if (unpack
->LsbFirst
) {
1411 GLubyte mask
= 1U << (unpack
->SkipPixels
& 0x7);
1412 for (col
= 0; col
< width
; col
++) {
1415 SET_PIXEL(col
, row
);
1427 /* get ready for next row */
1433 GLubyte mask
= 128U >> (unpack
->SkipPixels
& 0x7);
1434 for (col
= 0; col
< width
; col
++) {
1437 SET_PIXEL(col
, row
);
1449 /* get ready for next row */
1454 srcRow
+= srcStride
;
1461 /**********************************************************************/
1462 /***** Pixel processing functions ******/
1463 /**********************************************************************/
1466 * Apply scale and bias factors to an array of RGBA pixels.
1469 _mesa_scale_and_bias_rgba(GLuint n
, GLfloat rgba
[][4],
1470 GLfloat rScale
, GLfloat gScale
,
1471 GLfloat bScale
, GLfloat aScale
,
1472 GLfloat rBias
, GLfloat gBias
,
1473 GLfloat bBias
, GLfloat aBias
)
1475 if (rScale
!= 1.0 || rBias
!= 0.0) {
1477 for (i
= 0; i
< n
; i
++) {
1478 rgba
[i
][RCOMP
] = rgba
[i
][RCOMP
] * rScale
+ rBias
;
1481 if (gScale
!= 1.0 || gBias
!= 0.0) {
1483 for (i
= 0; i
< n
; i
++) {
1484 rgba
[i
][GCOMP
] = rgba
[i
][GCOMP
] * gScale
+ gBias
;
1487 if (bScale
!= 1.0 || bBias
!= 0.0) {
1489 for (i
= 0; i
< n
; i
++) {
1490 rgba
[i
][BCOMP
] = rgba
[i
][BCOMP
] * bScale
+ bBias
;
1493 if (aScale
!= 1.0 || aBias
!= 0.0) {
1495 for (i
= 0; i
< n
; i
++) {
1496 rgba
[i
][ACOMP
] = rgba
[i
][ACOMP
] * aScale
+ aBias
;
1503 * Apply pixel mapping to an array of floating point RGBA pixels.
1506 _mesa_map_rgba( const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4] )
1508 const GLfloat rscale
= (GLfloat
) (ctx
->PixelMaps
.RtoR
.Size
- 1);
1509 const GLfloat gscale
= (GLfloat
) (ctx
->PixelMaps
.GtoG
.Size
- 1);
1510 const GLfloat bscale
= (GLfloat
) (ctx
->PixelMaps
.BtoB
.Size
- 1);
1511 const GLfloat ascale
= (GLfloat
) (ctx
->PixelMaps
.AtoA
.Size
- 1);
1512 const GLfloat
*rMap
= ctx
->PixelMaps
.RtoR
.Map
;
1513 const GLfloat
*gMap
= ctx
->PixelMaps
.GtoG
.Map
;
1514 const GLfloat
*bMap
= ctx
->PixelMaps
.BtoB
.Map
;
1515 const GLfloat
*aMap
= ctx
->PixelMaps
.AtoA
.Map
;
1518 GLfloat r
= CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1519 GLfloat g
= CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1520 GLfloat b
= CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1521 GLfloat a
= CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1522 rgba
[i
][RCOMP
] = rMap
[IROUND(r
* rscale
)];
1523 rgba
[i
][GCOMP
] = gMap
[IROUND(g
* gscale
)];
1524 rgba
[i
][BCOMP
] = bMap
[IROUND(b
* bscale
)];
1525 rgba
[i
][ACOMP
] = aMap
[IROUND(a
* ascale
)];
1531 * Apply the color matrix and post color matrix scaling and biasing.
1534 _mesa_transform_rgba(const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4])
1536 const GLfloat rs
= ctx
->Pixel
.PostColorMatrixScale
[0];
1537 const GLfloat rb
= ctx
->Pixel
.PostColorMatrixBias
[0];
1538 const GLfloat gs
= ctx
->Pixel
.PostColorMatrixScale
[1];
1539 const GLfloat gb
= ctx
->Pixel
.PostColorMatrixBias
[1];
1540 const GLfloat bs
= ctx
->Pixel
.PostColorMatrixScale
[2];
1541 const GLfloat bb
= ctx
->Pixel
.PostColorMatrixBias
[2];
1542 const GLfloat as
= ctx
->Pixel
.PostColorMatrixScale
[3];
1543 const GLfloat ab
= ctx
->Pixel
.PostColorMatrixBias
[3];
1544 const GLfloat
*m
= ctx
->ColorMatrixStack
.Top
->m
;
1546 for (i
= 0; i
< n
; i
++) {
1547 const GLfloat r
= rgba
[i
][RCOMP
];
1548 const GLfloat g
= rgba
[i
][GCOMP
];
1549 const GLfloat b
= rgba
[i
][BCOMP
];
1550 const GLfloat a
= rgba
[i
][ACOMP
];
1551 rgba
[i
][RCOMP
] = (m
[0] * r
+ m
[4] * g
+ m
[ 8] * b
+ m
[12] * a
) * rs
+ rb
;
1552 rgba
[i
][GCOMP
] = (m
[1] * r
+ m
[5] * g
+ m
[ 9] * b
+ m
[13] * a
) * gs
+ gb
;
1553 rgba
[i
][BCOMP
] = (m
[2] * r
+ m
[6] * g
+ m
[10] * b
+ m
[14] * a
) * bs
+ bb
;
1554 rgba
[i
][ACOMP
] = (m
[3] * r
+ m
[7] * g
+ m
[11] * b
+ m
[15] * a
) * as
+ ab
;
1560 * Apply a color table lookup to an array of floating point RGBA colors.
1563 _mesa_lookup_rgba_float(const struct gl_color_table
*table
,
1564 GLuint n
, GLfloat rgba
[][4])
1566 const GLint max
= table
->Size
- 1;
1567 const GLfloat scale
= (GLfloat
) max
;
1568 const GLfloat
*lut
= table
->TableF
;
1571 if (!table
->TableF
|| table
->Size
== 0)
1574 switch (table
->_BaseFormat
) {
1576 /* replace RGBA with I */
1577 for (i
= 0; i
< n
; i
++) {
1578 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1579 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1587 /* replace RGB with L */
1588 for (i
= 0; i
< n
; i
++) {
1589 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1590 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1597 /* replace A with A */
1598 for (i
= 0; i
< n
; i
++) {
1599 GLint j
= IROUND(rgba
[i
][ACOMP
] * scale
);
1600 rgba
[i
][ACOMP
] = lut
[CLAMP(j
, 0, max
)];
1603 case GL_LUMINANCE_ALPHA
:
1604 /* replace RGBA with LLLA */
1605 for (i
= 0; i
< n
; i
++) {
1606 GLint jL
= IROUND(rgba
[i
][RCOMP
] * scale
);
1607 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1608 GLfloat luminance
, alpha
;
1609 jL
= CLAMP(jL
, 0, max
);
1610 jA
= CLAMP(jA
, 0, max
);
1611 luminance
= lut
[jL
* 2 + 0];
1612 alpha
= lut
[jA
* 2 + 1];
1615 rgba
[i
][BCOMP
] = luminance
;
1616 rgba
[i
][ACOMP
] = alpha
;;
1620 /* replace RGB with RGB */
1621 for (i
= 0; i
< n
; i
++) {
1622 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1623 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1624 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1625 jR
= CLAMP(jR
, 0, max
);
1626 jG
= CLAMP(jG
, 0, max
);
1627 jB
= CLAMP(jB
, 0, max
);
1628 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1629 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1630 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1634 /* replace RGBA with RGBA */
1635 for (i
= 0; i
< n
; i
++) {
1636 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1637 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1638 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1639 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1640 jR
= CLAMP(jR
, 0, max
);
1641 jG
= CLAMP(jG
, 0, max
);
1642 jB
= CLAMP(jB
, 0, max
);
1643 jA
= CLAMP(jA
, 0, max
);
1644 rgba
[i
][RCOMP
] = lut
[jR
* 4 + 0];
1645 rgba
[i
][GCOMP
] = lut
[jG
* 4 + 1];
1646 rgba
[i
][BCOMP
] = lut
[jB
* 4 + 2];
1647 rgba
[i
][ACOMP
] = lut
[jA
* 4 + 3];
1651 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_float");
1659 * Apply a color table lookup to an array of ubyte/RGBA colors.
1662 _mesa_lookup_rgba_ubyte(const struct gl_color_table
*table
,
1663 GLuint n
, GLubyte rgba
[][4])
1665 const GLubyte
*lut
= table
->TableUB
;
1666 const GLfloat scale
= (GLfloat
) (table
->Size
- 1) / (GLfloat
)255.0;
1669 if (!table
->TableUB
|| table
->Size
== 0)
1672 switch (table
->_BaseFormat
) {
1674 /* replace RGBA with I */
1675 if (table
->Size
== 256) {
1676 for (i
= 0; i
< n
; i
++) {
1677 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1685 for (i
= 0; i
< n
; i
++) {
1686 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1690 rgba
[i
][ACOMP
] = lut
[j
];
1695 /* replace RGB with L */
1696 if (table
->Size
== 256) {
1697 for (i
= 0; i
< n
; i
++) {
1698 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1705 for (i
= 0; i
< n
; i
++) {
1706 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1709 rgba
[i
][BCOMP
] = lut
[j
];
1714 /* replace A with A */
1715 if (table
->Size
== 256) {
1716 for (i
= 0; i
< n
; i
++) {
1717 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
]];
1721 for (i
= 0; i
< n
; i
++) {
1722 GLint j
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1723 rgba
[i
][ACOMP
] = lut
[j
];
1727 case GL_LUMINANCE_ALPHA
:
1728 /* replace RGBA with LLLA */
1729 if (table
->Size
== 256) {
1730 for (i
= 0; i
< n
; i
++) {
1731 GLubyte l
= lut
[rgba
[i
][RCOMP
] * 2 + 0];
1732 GLubyte a
= lut
[rgba
[i
][ACOMP
] * 2 + 1];;
1740 for (i
= 0; i
< n
; i
++) {
1741 GLint jL
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1742 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1743 GLubyte luminance
= lut
[jL
* 2 + 0];
1744 GLubyte alpha
= lut
[jA
* 2 + 1];
1747 rgba
[i
][BCOMP
] = luminance
;
1748 rgba
[i
][ACOMP
] = alpha
;
1753 if (table
->Size
== 256) {
1754 for (i
= 0; i
< n
; i
++) {
1755 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 3 + 0];
1756 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 3 + 1];
1757 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 3 + 2];
1761 for (i
= 0; i
< n
; i
++) {
1762 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1763 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1764 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1765 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1766 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1767 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1772 if (table
->Size
== 256) {
1773 for (i
= 0; i
< n
; i
++) {
1774 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 4 + 0];
1775 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 4 + 1];
1776 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 4 + 2];
1777 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
] * 4 + 3];
1781 for (i
= 0; i
< n
; i
++) {
1782 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1783 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1784 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1785 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1786 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][RCOMP
], lut
[jR
* 4 + 0]);
1787 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][GCOMP
], lut
[jG
* 4 + 1]);
1788 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][BCOMP
], lut
[jB
* 4 + 2]);
1789 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][ACOMP
], lut
[jA
* 4 + 3]);
1794 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_chan");
1802 * Map color indexes to float rgba values.
1805 _mesa_map_ci_to_rgba( const GLcontext
*ctx
, GLuint n
,
1806 const GLuint index
[], GLfloat rgba
[][4] )
1808 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1809 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1810 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1811 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1812 const GLfloat
*rMap
= ctx
->PixelMaps
.ItoR
.Map
;
1813 const GLfloat
*gMap
= ctx
->PixelMaps
.ItoG
.Map
;
1814 const GLfloat
*bMap
= ctx
->PixelMaps
.ItoB
.Map
;
1815 const GLfloat
*aMap
= ctx
->PixelMaps
.ItoA
.Map
;
1818 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1819 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1820 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1821 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1827 * Map ubyte color indexes to ubyte/RGBA values.
1830 _mesa_map_ci8_to_rgba8(const GLcontext
*ctx
, GLuint n
, const GLubyte index
[],
1833 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1834 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1835 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1836 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1837 const GLubyte
*rMap
= ctx
->PixelMaps
.ItoR
.Map8
;
1838 const GLubyte
*gMap
= ctx
->PixelMaps
.ItoG
.Map8
;
1839 const GLubyte
*bMap
= ctx
->PixelMaps
.ItoB
.Map8
;
1840 const GLubyte
*aMap
= ctx
->PixelMaps
.ItoA
.Map8
;
1843 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1844 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1845 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1846 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1852 _mesa_scale_and_bias_depth(const GLcontext
*ctx
, GLuint n
,
1853 GLfloat depthValues
[])
1855 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
1856 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
1858 for (i
= 0; i
< n
; i
++) {
1859 GLfloat d
= depthValues
[i
] * scale
+ bias
;
1860 depthValues
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
1866 _mesa_scale_and_bias_depth_uint(const GLcontext
*ctx
, GLuint n
,
1867 GLuint depthValues
[])
1869 const GLdouble max
= (double) 0xffffffff;
1870 const GLdouble scale
= ctx
->Pixel
.DepthScale
;
1871 const GLdouble bias
= ctx
->Pixel
.DepthBias
* max
;
1873 for (i
= 0; i
< n
; i
++) {
1874 GLdouble d
= (GLdouble
) depthValues
[i
] * scale
+ bias
;
1875 d
= CLAMP(d
, 0.0, max
);
1876 depthValues
[i
] = (GLuint
) d
;
1883 * Update the min/max values from an array of fragment colors.
1886 update_minmax(GLcontext
*ctx
, GLuint n
, const GLfloat rgba
[][4])
1889 for (i
= 0; i
< n
; i
++) {
1891 if (rgba
[i
][RCOMP
] < ctx
->MinMax
.Min
[RCOMP
])
1892 ctx
->MinMax
.Min
[RCOMP
] = rgba
[i
][RCOMP
];
1893 if (rgba
[i
][GCOMP
] < ctx
->MinMax
.Min
[GCOMP
])
1894 ctx
->MinMax
.Min
[GCOMP
] = rgba
[i
][GCOMP
];
1895 if (rgba
[i
][BCOMP
] < ctx
->MinMax
.Min
[BCOMP
])
1896 ctx
->MinMax
.Min
[BCOMP
] = rgba
[i
][BCOMP
];
1897 if (rgba
[i
][ACOMP
] < ctx
->MinMax
.Min
[ACOMP
])
1898 ctx
->MinMax
.Min
[ACOMP
] = rgba
[i
][ACOMP
];
1901 if (rgba
[i
][RCOMP
] > ctx
->MinMax
.Max
[RCOMP
])
1902 ctx
->MinMax
.Max
[RCOMP
] = rgba
[i
][RCOMP
];
1903 if (rgba
[i
][GCOMP
] > ctx
->MinMax
.Max
[GCOMP
])
1904 ctx
->MinMax
.Max
[GCOMP
] = rgba
[i
][GCOMP
];
1905 if (rgba
[i
][BCOMP
] > ctx
->MinMax
.Max
[BCOMP
])
1906 ctx
->MinMax
.Max
[BCOMP
] = rgba
[i
][BCOMP
];
1907 if (rgba
[i
][ACOMP
] > ctx
->MinMax
.Max
[ACOMP
])
1908 ctx
->MinMax
.Max
[ACOMP
] = rgba
[i
][ACOMP
];
1914 * Update the histogram values from an array of fragment colors.
1917 update_histogram(GLcontext
*ctx
, GLuint n
, const GLfloat rgba
[][4])
1919 const GLint max
= ctx
->Histogram
.Width
- 1;
1920 GLfloat w
= (GLfloat
) max
;
1923 if (ctx
->Histogram
.Width
== 0)
1926 for (i
= 0; i
< n
; i
++) {
1927 GLint ri
= IROUND(rgba
[i
][RCOMP
] * w
);
1928 GLint gi
= IROUND(rgba
[i
][GCOMP
] * w
);
1929 GLint bi
= IROUND(rgba
[i
][BCOMP
] * w
);
1930 GLint ai
= IROUND(rgba
[i
][ACOMP
] * w
);
1931 ri
= CLAMP(ri
, 0, max
);
1932 gi
= CLAMP(gi
, 0, max
);
1933 bi
= CLAMP(bi
, 0, max
);
1934 ai
= CLAMP(ai
, 0, max
);
1935 ctx
->Histogram
.Count
[ri
][RCOMP
]++;
1936 ctx
->Histogram
.Count
[gi
][GCOMP
]++;
1937 ctx
->Histogram
.Count
[bi
][BCOMP
]++;
1938 ctx
->Histogram
.Count
[ai
][ACOMP
]++;
1944 * Apply various pixel transfer operations to an array of RGBA pixels
1945 * as indicated by the transferOps bitmask
1948 _mesa_apply_rgba_transfer_ops(GLcontext
*ctx
, GLbitfield transferOps
,
1949 GLuint n
, GLfloat rgba
[][4])
1952 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
1953 _mesa_scale_and_bias_rgba(n
, rgba
,
1954 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
1955 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
1956 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
1957 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
1959 /* color map lookup */
1960 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1961 _mesa_map_rgba( ctx
, n
, rgba
);
1963 /* GL_COLOR_TABLE lookup */
1964 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
1965 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_PRECONVOLUTION
], n
, rgba
);
1968 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
1969 /* this has to be done in the calling code */
1970 _mesa_problem(ctx
, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
1972 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
1973 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
1974 _mesa_scale_and_bias_rgba(n
, rgba
,
1975 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
1976 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
1977 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
1978 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
1979 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
1980 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
1981 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
1982 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
1984 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
1985 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
1986 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_POSTCONVOLUTION
], n
, rgba
);
1988 /* color matrix transform */
1989 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
1990 _mesa_transform_rgba(ctx
, n
, rgba
);
1992 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
1993 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
1994 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_POSTCOLORMATRIX
], n
, rgba
);
1996 /* update histogram count */
1997 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
1998 update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2000 /* update min/max values */
2001 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2002 update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2004 /* clamping to [0,1] */
2005 if (transferOps
& IMAGE_CLAMP_BIT
) {
2007 for (i
= 0; i
< n
; i
++) {
2008 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2009 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2010 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2011 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2018 * Apply color index shift and offset to an array of pixels.
2021 shift_and_offset_ci( const GLcontext
*ctx
, GLuint n
, GLuint indexes
[] )
2023 GLint shift
= ctx
->Pixel
.IndexShift
;
2024 GLint offset
= ctx
->Pixel
.IndexOffset
;
2028 indexes
[i
] = (indexes
[i
] << shift
) + offset
;
2031 else if (shift
< 0) {
2034 indexes
[i
] = (indexes
[i
] >> shift
) + offset
;
2039 indexes
[i
] = indexes
[i
] + offset
;
2047 * Apply color index shift, offset and table lookup to an array
2051 _mesa_apply_ci_transfer_ops(const GLcontext
*ctx
, GLbitfield transferOps
,
2052 GLuint n
, GLuint indexes
[])
2054 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2055 shift_and_offset_ci(ctx
, n
, indexes
);
2057 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2058 const GLuint mask
= ctx
->PixelMaps
.ItoI
.Size
- 1;
2060 for (i
= 0; i
< n
; i
++) {
2061 const GLuint j
= indexes
[i
] & mask
;
2062 indexes
[i
] = IROUND(ctx
->PixelMaps
.ItoI
.Map
[j
]);
2069 * Apply stencil index shift, offset and table lookup to an array
2070 * of stencil values.
2073 _mesa_apply_stencil_transfer_ops(const GLcontext
*ctx
, GLuint n
,
2074 GLstencil stencil
[])
2076 if (ctx
->Pixel
.IndexShift
!= 0 || ctx
->Pixel
.IndexOffset
!= 0) {
2077 const GLint offset
= ctx
->Pixel
.IndexOffset
;
2078 GLint shift
= ctx
->Pixel
.IndexShift
;
2081 for (i
= 0; i
< n
; i
++) {
2082 stencil
[i
] = (stencil
[i
] << shift
) + offset
;
2085 else if (shift
< 0) {
2087 for (i
= 0; i
< n
; i
++) {
2088 stencil
[i
] = (stencil
[i
] >> shift
) + offset
;
2092 for (i
= 0; i
< n
; i
++) {
2093 stencil
[i
] = stencil
[i
] + offset
;
2097 if (ctx
->Pixel
.MapStencilFlag
) {
2098 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
2100 for (i
= 0; i
< n
; i
++) {
2101 stencil
[i
] = (GLstencil
)ctx
->PixelMaps
.StoS
.Map
[ stencil
[i
] & mask
];
2108 * Used to pack an array [][4] of RGBA float colors as specified
2109 * by the dstFormat, dstType and dstPacking. Used by glReadPixels,
2110 * glGetConvolutionFilter(), etc.
2111 * Note: the rgba values will be modified by this function when any pixel
2112 * transfer ops are enabled.
2115 _mesa_pack_rgba_span_float(GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4],
2116 GLenum dstFormat
, GLenum dstType
,
2118 const struct gl_pixelstore_attrib
*dstPacking
,
2119 GLbitfield transferOps
)
2121 GLfloat luminance
[MAX_WIDTH
];
2122 const GLint comps
= _mesa_components_in_format(dstFormat
);
2126 * This test should probably go away. Have the caller set/clear the
2127 * IMAGE_CLAMP_BIT as needed.
2129 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
2130 /* need to clamp to [0, 1] */
2131 transferOps
|= IMAGE_CLAMP_BIT
;
2135 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
2136 if ((transferOps
& IMAGE_MIN_MAX_BIT
) && ctx
->MinMax
.Sink
) {
2141 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
2142 /* compute luminance values */
2143 if (transferOps
& IMAGE_CLAMP_BIT
) {
2144 for (i
= 0; i
< n
; i
++) {
2145 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2146 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
2150 for (i
= 0; i
< n
; i
++) {
2151 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2157 * Pack/store the pixels. Ugh! Lots of cases!!!
2160 case GL_UNSIGNED_BYTE
:
2162 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2163 switch (dstFormat
) {
2166 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2170 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2174 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2178 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2182 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
2184 case GL_LUMINANCE_ALPHA
:
2186 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
2187 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2192 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2193 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2194 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2199 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2200 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2201 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2202 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2207 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2208 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2209 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2214 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2215 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2216 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2217 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2222 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2223 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2224 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2225 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2231 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2232 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2236 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2242 GLbyte
*dst
= (GLbyte
*) dstAddr
;
2243 switch (dstFormat
) {
2246 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2250 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2254 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2258 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2262 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
2264 case GL_LUMINANCE_ALPHA
:
2266 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
2267 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2272 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2273 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2274 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2279 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2280 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2281 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2282 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2287 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2288 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2289 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2294 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2295 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2296 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2297 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2302 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2303 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2304 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2305 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2311 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2312 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2316 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2320 case GL_UNSIGNED_SHORT
:
2322 GLushort
*dst
= (GLushort
*) dstAddr
;
2323 switch (dstFormat
) {
2326 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
2330 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
2334 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
2338 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
2342 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
2344 case GL_LUMINANCE_ALPHA
:
2346 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
2347 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
2352 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
2353 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2354 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
2359 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
2360 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2361 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
2362 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2367 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
2368 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2369 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
2374 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
2375 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2376 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
2377 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2382 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
2383 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
2384 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
2385 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
2391 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
2392 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
2396 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2402 GLshort
*dst
= (GLshort
*) dstAddr
;
2403 switch (dstFormat
) {
2406 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2410 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2414 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2418 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2422 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
2424 case GL_LUMINANCE_ALPHA
:
2426 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
2427 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2432 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2433 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2434 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2439 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2440 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2441 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2442 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2447 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2448 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2449 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2454 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2455 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2456 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2457 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2462 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2463 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2464 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2465 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2471 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2472 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2476 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2480 case GL_UNSIGNED_INT
:
2482 GLuint
*dst
= (GLuint
*) dstAddr
;
2483 switch (dstFormat
) {
2486 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2490 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2494 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2498 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2502 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
2504 case GL_LUMINANCE_ALPHA
:
2506 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
2507 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2512 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2513 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2514 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2519 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2520 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2521 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2522 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2527 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2528 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2529 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2534 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2535 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2536 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2537 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2542 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2543 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2544 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2545 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2551 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2552 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2556 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2562 GLint
*dst
= (GLint
*) dstAddr
;
2563 switch (dstFormat
) {
2566 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2570 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2574 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2578 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2582 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2584 case GL_LUMINANCE_ALPHA
:
2586 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2587 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2592 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2593 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2594 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2599 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2600 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2601 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2602 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2607 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2608 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2609 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2614 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2615 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2616 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2617 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2622 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2623 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2624 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2625 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2631 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2632 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2636 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2642 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2643 switch (dstFormat
) {
2646 dst
[i
] = rgba
[i
][RCOMP
];
2650 dst
[i
] = rgba
[i
][GCOMP
];
2654 dst
[i
] = rgba
[i
][BCOMP
];
2658 dst
[i
] = rgba
[i
][ACOMP
];
2662 dst
[i
] = luminance
[i
];
2664 case GL_LUMINANCE_ALPHA
:
2666 dst
[i
*2+0] = luminance
[i
];
2667 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2672 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2673 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2674 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2679 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2680 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2681 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2682 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2687 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2688 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2689 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2694 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2695 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2696 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2697 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2702 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2703 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2704 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2705 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2711 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2712 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2716 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2720 case GL_HALF_FLOAT_ARB
:
2722 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2723 switch (dstFormat
) {
2726 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2730 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2734 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2738 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2742 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2744 case GL_LUMINANCE_ALPHA
:
2746 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2747 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2752 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2753 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2754 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2759 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2760 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2761 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2762 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2767 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2768 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2769 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2774 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2775 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2776 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2777 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2782 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2783 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2784 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2785 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2791 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2792 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2796 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2800 case GL_UNSIGNED_BYTE_3_3_2
:
2801 if (dstFormat
== GL_RGB
) {
2802 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2804 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2805 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2806 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
2810 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2811 if (dstFormat
== GL_RGB
) {
2812 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2814 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
2815 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2816 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2820 case GL_UNSIGNED_SHORT_5_6_5
:
2821 if (dstFormat
== GL_RGB
) {
2822 GLushort
*dst
= (GLushort
*) dstAddr
;
2824 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2825 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2826 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
2830 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2831 if (dstFormat
== GL_RGB
) {
2832 GLushort
*dst
= (GLushort
*) dstAddr
;
2834 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2835 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2836 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2840 case GL_UNSIGNED_SHORT_4_4_4_4
:
2841 if (dstFormat
== GL_RGBA
) {
2842 GLushort
*dst
= (GLushort
*) dstAddr
;
2844 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2845 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2846 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2847 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2850 else if (dstFormat
== GL_BGRA
) {
2851 GLushort
*dst
= (GLushort
*) dstAddr
;
2853 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2854 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2855 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2856 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2859 else if (dstFormat
== GL_ABGR_EXT
) {
2860 GLushort
*dst
= (GLushort
*) dstAddr
;
2862 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2863 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2864 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2865 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
2869 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2870 if (dstFormat
== GL_RGBA
) {
2871 GLushort
*dst
= (GLushort
*) dstAddr
;
2873 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
2874 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2875 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2876 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2879 else if (dstFormat
== GL_BGRA
) {
2880 GLushort
*dst
= (GLushort
*) dstAddr
;
2882 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
2883 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2884 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2885 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2888 else if (dstFormat
== GL_ABGR_EXT
) {
2889 GLushort
*dst
= (GLushort
*) dstAddr
;
2891 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
2892 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2893 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2894 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2898 case GL_UNSIGNED_SHORT_5_5_5_1
:
2899 if (dstFormat
== GL_RGBA
) {
2900 GLushort
*dst
= (GLushort
*) dstAddr
;
2902 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2903 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2904 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2905 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2908 else if (dstFormat
== GL_BGRA
) {
2909 GLushort
*dst
= (GLushort
*) dstAddr
;
2911 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2912 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2913 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2914 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2917 else if (dstFormat
== GL_ABGR_EXT
) {
2918 GLushort
*dst
= (GLushort
*) dstAddr
;
2920 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2921 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2922 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2923 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
2927 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2928 if (dstFormat
== GL_RGBA
) {
2929 GLushort
*dst
= (GLushort
*) dstAddr
;
2931 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2932 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2933 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2934 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2937 else if (dstFormat
== GL_BGRA
) {
2938 GLushort
*dst
= (GLushort
*) dstAddr
;
2940 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
2941 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2942 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2943 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2946 else if (dstFormat
== GL_ABGR_EXT
) {
2947 GLushort
*dst
= (GLushort
*) dstAddr
;
2949 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
2950 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2951 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2952 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2956 case GL_UNSIGNED_INT_8_8_8_8
:
2957 if (dstFormat
== GL_RGBA
) {
2958 GLuint
*dst
= (GLuint
*) dstAddr
;
2960 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
2961 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2962 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
2963 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2966 else if (dstFormat
== GL_BGRA
) {
2967 GLuint
*dst
= (GLuint
*) dstAddr
;
2969 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
2970 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2971 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
2972 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2975 else if (dstFormat
== GL_ABGR_EXT
) {
2976 GLuint
*dst
= (GLuint
*) dstAddr
;
2978 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
2979 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
2980 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
2981 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
2985 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2986 if (dstFormat
== GL_RGBA
) {
2987 GLuint
*dst
= (GLuint
*) dstAddr
;
2989 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
2990 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2991 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2992 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2995 else if (dstFormat
== GL_BGRA
) {
2996 GLuint
*dst
= (GLuint
*) dstAddr
;
2998 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
2999 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
3000 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
3001 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
3004 else if (dstFormat
== GL_ABGR_EXT
) {
3005 GLuint
*dst
= (GLuint
*) dstAddr
;
3007 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
3008 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
3009 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
3010 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
3014 case GL_UNSIGNED_INT_10_10_10_2
:
3015 if (dstFormat
== GL_RGBA
) {
3016 GLuint
*dst
= (GLuint
*) dstAddr
;
3018 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
3019 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
3020 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
3021 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
3024 else if (dstFormat
== GL_BGRA
) {
3025 GLuint
*dst
= (GLuint
*) dstAddr
;
3027 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
3028 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
3029 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
3030 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
3033 else if (dstFormat
== GL_ABGR_EXT
) {
3034 GLuint
*dst
= (GLuint
*) dstAddr
;
3036 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
3037 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
3038 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
3039 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
3043 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3044 if (dstFormat
== GL_RGBA
) {
3045 GLuint
*dst
= (GLuint
*) dstAddr
;
3047 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
3048 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
3049 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
3050 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
3053 else if (dstFormat
== GL_BGRA
) {
3054 GLuint
*dst
= (GLuint
*) dstAddr
;
3056 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
3057 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
3058 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
3059 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
3062 else if (dstFormat
== GL_ABGR_EXT
) {
3063 GLuint
*dst
= (GLuint
*) dstAddr
;
3065 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
3066 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
3067 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
3068 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
3073 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
3077 if (dstPacking
->SwapBytes
) {
3078 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
3079 if (swapSize
== 2) {
3080 if (dstPacking
->SwapBytes
) {
3081 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
3084 else if (swapSize
== 4) {
3085 if (dstPacking
->SwapBytes
) {
3086 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
3093 #define SWAP2BYTE(VALUE) \
3095 GLubyte *bytes = (GLubyte *) &(VALUE); \
3096 GLubyte tmp = bytes[0]; \
3097 bytes[0] = bytes[1]; \
3101 #define SWAP4BYTE(VALUE) \
3103 GLubyte *bytes = (GLubyte *) &(VALUE); \
3104 GLubyte tmp = bytes[0]; \
3105 bytes[0] = bytes[3]; \
3108 bytes[1] = bytes[2]; \
3114 extract_uint_indexes(GLuint n
, GLuint indexes
[],
3115 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3116 const struct gl_pixelstore_attrib
*unpack
)
3118 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
3120 ASSERT(srcType
== GL_BITMAP
||
3121 srcType
== GL_UNSIGNED_BYTE
||
3122 srcType
== GL_BYTE
||
3123 srcType
== GL_UNSIGNED_SHORT
||
3124 srcType
== GL_SHORT
||
3125 srcType
== GL_UNSIGNED_INT
||
3126 srcType
== GL_INT
||
3127 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3128 srcType
== GL_HALF_FLOAT_ARB
||
3129 srcType
== GL_FLOAT
);
3134 GLubyte
*ubsrc
= (GLubyte
*) src
;
3135 if (unpack
->LsbFirst
) {
3136 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
3138 for (i
= 0; i
< n
; i
++) {
3139 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3150 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
3152 for (i
= 0; i
< n
; i
++) {
3153 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3165 case GL_UNSIGNED_BYTE
:
3168 const GLubyte
*s
= (const GLubyte
*) src
;
3169 for (i
= 0; i
< n
; i
++)
3176 const GLbyte
*s
= (const GLbyte
*) src
;
3177 for (i
= 0; i
< n
; i
++)
3181 case GL_UNSIGNED_SHORT
:
3184 const GLushort
*s
= (const GLushort
*) src
;
3185 if (unpack
->SwapBytes
) {
3186 for (i
= 0; i
< n
; i
++) {
3187 GLushort value
= s
[i
];
3193 for (i
= 0; i
< n
; i
++)
3201 const GLshort
*s
= (const GLshort
*) src
;
3202 if (unpack
->SwapBytes
) {
3203 for (i
= 0; i
< n
; i
++) {
3204 GLshort value
= s
[i
];
3210 for (i
= 0; i
< n
; i
++)
3215 case GL_UNSIGNED_INT
:
3218 const GLuint
*s
= (const GLuint
*) src
;
3219 if (unpack
->SwapBytes
) {
3220 for (i
= 0; i
< n
; i
++) {
3221 GLuint value
= s
[i
];
3227 for (i
= 0; i
< n
; i
++)
3235 const GLint
*s
= (const GLint
*) src
;
3236 if (unpack
->SwapBytes
) {
3237 for (i
= 0; i
< n
; i
++) {
3244 for (i
= 0; i
< n
; i
++)
3252 const GLfloat
*s
= (const GLfloat
*) src
;
3253 if (unpack
->SwapBytes
) {
3254 for (i
= 0; i
< n
; i
++) {
3255 GLfloat value
= s
[i
];
3257 indexes
[i
] = (GLuint
) value
;
3261 for (i
= 0; i
< n
; i
++)
3262 indexes
[i
] = (GLuint
) s
[i
];
3266 case GL_HALF_FLOAT_ARB
:
3269 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
3270 if (unpack
->SwapBytes
) {
3271 for (i
= 0; i
< n
; i
++) {
3272 GLhalfARB value
= s
[i
];
3274 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
3278 for (i
= 0; i
< n
; i
++)
3279 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
3283 case GL_UNSIGNED_INT_24_8_EXT
:
3286 const GLuint
*s
= (const GLuint
*) src
;
3287 if (unpack
->SwapBytes
) {
3288 for (i
= 0; i
< n
; i
++) {
3289 GLuint value
= s
[i
];
3291 indexes
[i
] = value
& 0xff; /* lower 8 bits */
3295 for (i
= 0; i
< n
; i
++)
3296 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
3302 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
3309 * This function extracts floating point RGBA values from arbitrary
3310 * image data. srcFormat and srcType are the format and type parameters
3311 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3313 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3314 * implements the "Conversion to floating point", "Conversion to RGB",
3315 * and "Final Expansion to RGBA" operations.
3317 * Args: n - number of pixels
3318 * rgba - output colors
3319 * srcFormat - format of incoming data
3320 * srcType - data type of incoming data
3321 * src - source data pointer
3322 * swapBytes - perform byteswapping of incoming data?
3325 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3326 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3327 GLboolean swapBytes
)
3329 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
3331 GLint rComp
, bComp
, gComp
, aComp
;
3332 GLboolean intFormat
;
3333 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
3335 ASSERT(srcFormat
== GL_RED
||
3336 srcFormat
== GL_GREEN
||
3337 srcFormat
== GL_BLUE
||
3338 srcFormat
== GL_ALPHA
||
3339 srcFormat
== GL_LUMINANCE
||
3340 srcFormat
== GL_LUMINANCE_ALPHA
||
3341 srcFormat
== GL_INTENSITY
||
3342 srcFormat
== GL_RGB
||
3343 srcFormat
== GL_BGR
||
3344 srcFormat
== GL_RGBA
||
3345 srcFormat
== GL_BGRA
||
3346 srcFormat
== GL_ABGR_EXT
||
3347 srcFormat
== GL_DU8DV8_ATI
||
3348 srcFormat
== GL_DUDV_ATI
||
3349 srcFormat
== GL_RED_INTEGER_EXT
||
3350 srcFormat
== GL_GREEN_INTEGER_EXT
||
3351 srcFormat
== GL_BLUE_INTEGER_EXT
||
3352 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3353 srcFormat
== GL_RGB_INTEGER_EXT
||
3354 srcFormat
== GL_RGBA_INTEGER_EXT
||
3355 srcFormat
== GL_BGR_INTEGER_EXT
||
3356 srcFormat
== GL_BGRA_INTEGER_EXT
||
3357 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3358 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3360 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3361 srcType
== GL_BYTE
||
3362 srcType
== GL_UNSIGNED_SHORT
||
3363 srcType
== GL_SHORT
||
3364 srcType
== GL_UNSIGNED_INT
||
3365 srcType
== GL_INT
||
3366 srcType
== GL_HALF_FLOAT_ARB
||
3367 srcType
== GL_FLOAT
||
3368 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3369 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3370 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3371 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3372 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3373 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3374 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3375 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3376 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3377 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3378 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3379 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3381 rComp
= gComp
= bComp
= aComp
= -1;
3383 switch (srcFormat
) {
3385 case GL_RED_INTEGER_EXT
:
3387 greenIndex
= blueIndex
= alphaIndex
= -1;
3391 case GL_GREEN_INTEGER_EXT
:
3393 redIndex
= blueIndex
= alphaIndex
= -1;
3397 case GL_BLUE_INTEGER_EXT
:
3399 redIndex
= greenIndex
= alphaIndex
= -1;
3403 case GL_ALPHA_INTEGER_EXT
:
3404 redIndex
= greenIndex
= blueIndex
= -1;
3409 case GL_LUMINANCE_INTEGER_EXT
:
3410 redIndex
= greenIndex
= blueIndex
= 0;
3414 case GL_LUMINANCE_ALPHA
:
3415 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
3416 redIndex
= greenIndex
= blueIndex
= 0;
3421 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
3425 case GL_RGB_INTEGER
:
3448 case GL_RGBA_INTEGER
:
3490 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
3491 _mesa_lookup_enum_by_nr(srcFormat
));
3495 intFormat
= _mesa_is_integer_format(srcFormat
);
3497 #define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
3498 if ((INDEX) < 0) { \
3501 for (i = 0; i < n; i++) { \
3502 rgba[i][CHANNEL] = DEFAULT_INT; \
3506 for (i = 0; i < n; i++) { \
3507 rgba[i][CHANNEL] = DEFAULT; \
3511 else if (swapBytes) { \
3512 const TYPE *s = (const TYPE *) src; \
3514 for (i = 0; i < n; i++) { \
3515 TYPE value = s[INDEX]; \
3516 if (sizeof(TYPE) == 2) { \
3519 else if (sizeof(TYPE) == 4) { \
3523 rgba[i][CHANNEL] = (GLfloat) value; \
3525 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
3530 const TYPE *s = (const TYPE *) src; \
3533 for (i = 0; i < n; i++) { \
3534 rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
3539 for (i = 0; i < n; i++) { \
3540 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
3547 case GL_UNSIGNED_BYTE
:
3548 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3549 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3550 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3551 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
3554 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3555 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3556 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3557 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
3559 case GL_UNSIGNED_SHORT
:
3560 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3561 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3562 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3563 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
3566 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3567 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3568 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3569 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
3571 case GL_UNSIGNED_INT
:
3572 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3573 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3574 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3575 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
3578 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3579 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3580 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3581 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
3584 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3585 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3586 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3587 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
3589 case GL_HALF_FLOAT_ARB
:
3590 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3591 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3592 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3593 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3595 case GL_UNSIGNED_BYTE_3_3_2
:
3597 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3604 for (i
= 0; i
< n
; i
++) {
3605 GLubyte p
= ubsrc
[i
];
3606 rgba
[i
][rComp
] = ((p
>> 5) ) * rs
;
3607 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * gs
;
3608 rgba
[i
][bComp
] = ((p
) & 0x3) * bs
;
3609 rgba
[i
][aComp
] = 1.0F
;
3613 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3615 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3622 for (i
= 0; i
< n
; i
++) {
3623 GLubyte p
= ubsrc
[i
];
3624 rgba
[i
][rComp
] = ((p
) & 0x7) * rs
;
3625 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * gs
;
3626 rgba
[i
][bComp
] = ((p
>> 6) ) * bs
;
3627 rgba
[i
][aComp
] = 1.0F
;
3631 case GL_UNSIGNED_SHORT_5_6_5
:
3638 const GLushort
*ussrc
= (const GLushort
*) src
;
3640 for (i
= 0; i
< n
; i
++) {
3641 GLushort p
= ussrc
[i
];
3643 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3644 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3645 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3646 rgba
[i
][aComp
] = 1.0F
;
3650 const GLushort
*ussrc
= (const GLushort
*) src
;
3652 for (i
= 0; i
< n
; i
++) {
3653 GLushort p
= ussrc
[i
];
3654 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3655 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3656 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3657 rgba
[i
][aComp
] = 1.0F
;
3661 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3668 const GLushort
*ussrc
= (const GLushort
*) src
;
3670 for (i
= 0; i
< n
; i
++) {
3671 GLushort p
= ussrc
[i
];
3673 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3674 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3675 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3676 rgba
[i
][aComp
] = 1.0F
;
3680 const GLushort
*ussrc
= (const GLushort
*) src
;
3682 for (i
= 0; i
< n
; i
++) {
3683 GLushort p
= ussrc
[i
];
3684 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3685 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3686 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3687 rgba
[i
][aComp
] = 1.0F
;
3691 case GL_UNSIGNED_SHORT_4_4_4_4
:
3693 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3696 const GLushort
*ussrc
= (const GLushort
*) src
;
3698 for (i
= 0; i
< n
; i
++) {
3699 GLushort p
= ussrc
[i
];
3701 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3702 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3703 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3704 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3708 const GLushort
*ussrc
= (const GLushort
*) src
;
3710 for (i
= 0; i
< n
; i
++) {
3711 GLushort p
= ussrc
[i
];
3712 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3713 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3714 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3715 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3719 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3721 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3724 const GLushort
*ussrc
= (const GLushort
*) src
;
3726 for (i
= 0; i
< n
; i
++) {
3727 GLushort p
= ussrc
[i
];
3729 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3730 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3731 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3732 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3736 const GLushort
*ussrc
= (const GLushort
*) src
;
3738 for (i
= 0; i
< n
; i
++) {
3739 GLushort p
= ussrc
[i
];
3740 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3741 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3742 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3743 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3747 case GL_UNSIGNED_SHORT_5_5_5_1
:
3749 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3752 const GLushort
*ussrc
= (const GLushort
*) src
;
3754 for (i
= 0; i
< n
; i
++) {
3755 GLushort p
= ussrc
[i
];
3757 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3758 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3759 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3760 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3764 const GLushort
*ussrc
= (const GLushort
*) src
;
3766 for (i
= 0; i
< n
; i
++) {
3767 GLushort p
= ussrc
[i
];
3768 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3769 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3770 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3771 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3775 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3777 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3780 const GLushort
*ussrc
= (const GLushort
*) src
;
3782 for (i
= 0; i
< n
; i
++) {
3783 GLushort p
= ussrc
[i
];
3785 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3786 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3787 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3788 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3792 const GLushort
*ussrc
= (const GLushort
*) src
;
3794 for (i
= 0; i
< n
; i
++) {
3795 GLushort p
= ussrc
[i
];
3796 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3797 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3798 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3799 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3803 case GL_UNSIGNED_INT_8_8_8_8
:
3805 const GLuint
*uisrc
= (const GLuint
*) src
;
3808 for (i
= 0; i
< n
; i
++) {
3809 GLuint p
= uisrc
[i
];
3810 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3811 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3812 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3813 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3817 for (i
= 0; i
< n
; i
++) {
3818 GLuint p
= uisrc
[i
];
3819 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3820 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3821 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3822 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3827 const GLuint
*uisrc
= (const GLuint
*) src
;
3830 for (i
= 0; i
< n
; i
++) {
3831 GLuint p
= uisrc
[i
];
3832 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3833 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3834 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3835 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3839 for (i
= 0; i
< n
; i
++) {
3840 GLuint p
= uisrc
[i
];
3841 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3842 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3843 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3844 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3849 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3851 const GLuint
*uisrc
= (const GLuint
*) src
;
3854 for (i
= 0; i
< n
; i
++) {
3855 GLuint p
= uisrc
[i
];
3856 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3857 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3858 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3859 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3863 for (i
= 0; i
< n
; i
++) {
3864 GLuint p
= uisrc
[i
];
3865 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3866 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3867 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3868 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3873 const GLuint
*uisrc
= (const GLuint
*) src
;
3876 for (i
= 0; i
< n
; i
++) {
3877 GLuint p
= uisrc
[i
];
3878 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3879 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3880 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3881 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3885 for (i
= 0; i
< n
; i
++) {
3886 GLuint p
= uisrc
[i
];
3887 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3888 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3889 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3890 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3895 case GL_UNSIGNED_INT_10_10_10_2
:
3897 rs
= 1.0F
/ 1023.0F
;
3898 gs
= 1.0F
/ 1023.0F
;
3899 bs
= 1.0F
/ 1023.0F
;
3903 const GLuint
*uisrc
= (const GLuint
*) src
;
3905 for (i
= 0; i
< n
; i
++) {
3906 GLuint p
= uisrc
[i
];
3908 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3909 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3910 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3911 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3915 const GLuint
*uisrc
= (const GLuint
*) src
;
3917 for (i
= 0; i
< n
; i
++) {
3918 GLuint p
= uisrc
[i
];
3919 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3920 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3921 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3922 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3926 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3928 rs
= 1.0F
/ 1023.0F
;
3929 gs
= 1.0F
/ 1023.0F
;
3930 bs
= 1.0F
/ 1023.0F
;
3934 const GLuint
*uisrc
= (const GLuint
*) src
;
3936 for (i
= 0; i
< n
; i
++) {
3937 GLuint p
= uisrc
[i
];
3939 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3940 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3941 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3942 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3946 const GLuint
*uisrc
= (const GLuint
*) src
;
3948 for (i
= 0; i
< n
; i
++) {
3949 GLuint p
= uisrc
[i
];
3950 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3951 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3952 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3953 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3958 _mesa_problem(NULL
, "bad srcType in extract float data");
3965 * Unpack a row of color image data from a client buffer according to
3966 * the pixel unpacking parameters.
3967 * Return GLchan values in the specified dest image format.
3968 * This is used by glDrawPixels and glTexImage?D().
3969 * \param ctx - the context
3970 * n - number of pixels in the span
3971 * dstFormat - format of destination color array
3972 * dest - the destination color array
3973 * srcFormat - source image format
3974 * srcType - source image data type
3975 * source - source image pointer
3976 * srcPacking - pixel unpacking parameters
3977 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3979 * XXX perhaps expand this to process whole images someday.
3982 _mesa_unpack_color_span_chan( GLcontext
*ctx
,
3983 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3984 GLenum srcFormat
, GLenum srcType
,
3985 const GLvoid
*source
,
3986 const struct gl_pixelstore_attrib
*srcPacking
,
3987 GLbitfield transferOps
)
3989 ASSERT(dstFormat
== GL_ALPHA
||
3990 dstFormat
== GL_LUMINANCE
||
3991 dstFormat
== GL_LUMINANCE_ALPHA
||
3992 dstFormat
== GL_INTENSITY
||
3993 dstFormat
== GL_RGB
||
3994 dstFormat
== GL_RGBA
||
3995 dstFormat
== GL_COLOR_INDEX
);
3997 ASSERT(srcFormat
== GL_RED
||
3998 srcFormat
== GL_GREEN
||
3999 srcFormat
== GL_BLUE
||
4000 srcFormat
== GL_ALPHA
||
4001 srcFormat
== GL_LUMINANCE
||
4002 srcFormat
== GL_LUMINANCE_ALPHA
||
4003 srcFormat
== GL_INTENSITY
||
4004 srcFormat
== GL_RGB
||
4005 srcFormat
== GL_BGR
||
4006 srcFormat
== GL_RGBA
||
4007 srcFormat
== GL_BGRA
||
4008 srcFormat
== GL_ABGR_EXT
||
4009 srcFormat
== GL_COLOR_INDEX
);
4011 ASSERT(srcType
== GL_BITMAP
||
4012 srcType
== GL_UNSIGNED_BYTE
||
4013 srcType
== GL_BYTE
||
4014 srcType
== GL_UNSIGNED_SHORT
||
4015 srcType
== GL_SHORT
||
4016 srcType
== GL_UNSIGNED_INT
||
4017 srcType
== GL_INT
||
4018 srcType
== GL_HALF_FLOAT_ARB
||
4019 srcType
== GL_FLOAT
||
4020 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4021 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4022 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4023 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4024 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4025 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4026 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4027 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4028 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4029 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4030 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4031 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4033 /* Try simple cases first */
4034 if (transferOps
== 0) {
4035 if (srcType
== CHAN_TYPE
) {
4036 if (dstFormat
== GL_RGBA
) {
4037 if (srcFormat
== GL_RGBA
) {
4038 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
4041 else if (srcFormat
== GL_RGB
) {
4043 const GLchan
*src
= (const GLchan
*) source
;
4045 for (i
= 0; i
< n
; i
++) {
4056 else if (dstFormat
== GL_RGB
) {
4057 if (srcFormat
== GL_RGB
) {
4058 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
4061 else if (srcFormat
== GL_RGBA
) {
4063 const GLchan
*src
= (const GLchan
*) source
;
4065 for (i
= 0; i
< n
; i
++) {
4075 else if (dstFormat
== srcFormat
) {
4076 GLint comps
= _mesa_components_in_format(srcFormat
);
4078 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
4083 * Common situation, loading 8bit RGBA/RGB source images
4084 * into 16/32 bit destination. (OSMesa16/32)
4086 else if (srcType
== GL_UNSIGNED_BYTE
) {
4087 if (dstFormat
== GL_RGBA
) {
4088 if (srcFormat
== GL_RGB
) {
4090 const GLubyte
*src
= (const GLubyte
*) source
;
4092 for (i
= 0; i
< n
; i
++) {
4093 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4094 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4095 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4102 else if (srcFormat
== GL_RGBA
) {
4104 const GLubyte
*src
= (const GLubyte
*) source
;
4106 for (i
= 0; i
< n
; i
++) {
4107 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4108 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4109 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4110 dst
[3] = UBYTE_TO_CHAN(src
[3]);
4117 else if (dstFormat
== GL_RGB
) {
4118 if (srcFormat
== GL_RGB
) {
4120 const GLubyte
*src
= (const GLubyte
*) source
;
4122 for (i
= 0; i
< n
; i
++) {
4123 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4124 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4125 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4131 else if (srcFormat
== GL_RGBA
) {
4133 const GLubyte
*src
= (const GLubyte
*) source
;
4135 for (i
= 0; i
< n
; i
++) {
4136 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4137 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4138 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4149 /* general solution begins here */
4151 GLint dstComponents
;
4152 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4153 GLint dstLuminanceIndex
, dstIntensityIndex
;
4154 GLfloat rgba
[MAX_WIDTH
][4];
4156 dstComponents
= _mesa_components_in_format( dstFormat
);
4157 /* source & dest image formats should have been error checked by now */
4158 assert(dstComponents
> 0);
4161 * Extract image data and convert to RGBA floats
4163 assert(n
<= MAX_WIDTH
);
4164 if (srcFormat
== GL_COLOR_INDEX
) {
4165 GLuint indexes
[MAX_WIDTH
];
4166 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4169 if (dstFormat
== GL_COLOR_INDEX
) {
4171 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4172 /* convert to GLchan and return */
4173 for (i
= 0; i
< n
; i
++) {
4174 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4179 /* Convert indexes to RGBA */
4180 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4181 shift_and_offset_ci(ctx
, n
, indexes
);
4183 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4186 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4187 * with color indexes.
4189 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4192 /* non-color index data */
4193 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4194 srcPacking
->SwapBytes
);
4197 /* Need to clamp if returning GLubytes or GLushorts */
4198 #if CHAN_TYPE != GL_FLOAT
4199 transferOps
|= IMAGE_CLAMP_BIT
;
4203 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4206 /* Now determine which color channels we need to produce.
4207 * And determine the dest index (offset) within each color tuple.
4209 switch (dstFormat
) {
4212 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4213 dstLuminanceIndex
= dstIntensityIndex
= -1;
4216 dstLuminanceIndex
= 0;
4217 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4218 dstIntensityIndex
= -1;
4220 case GL_LUMINANCE_ALPHA
:
4221 dstLuminanceIndex
= 0;
4223 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4224 dstIntensityIndex
= -1;
4227 dstIntensityIndex
= 0;
4228 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4229 dstLuminanceIndex
= -1;
4235 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4242 dstLuminanceIndex
= dstIntensityIndex
= -1;
4245 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
4250 /* Now return the GLchan data in the requested dstFormat */
4252 if (dstRedIndex
>= 0) {
4255 for (i
= 0; i
< n
; i
++) {
4256 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
4257 dst
+= dstComponents
;
4261 if (dstGreenIndex
>= 0) {
4264 for (i
= 0; i
< n
; i
++) {
4265 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
4266 dst
+= dstComponents
;
4270 if (dstBlueIndex
>= 0) {
4273 for (i
= 0; i
< n
; i
++) {
4274 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
4275 dst
+= dstComponents
;
4279 if (dstAlphaIndex
>= 0) {
4282 for (i
= 0; i
< n
; i
++) {
4283 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
4284 dst
+= dstComponents
;
4288 if (dstIntensityIndex
>= 0) {
4291 assert(dstIntensityIndex
== 0);
4292 assert(dstComponents
== 1);
4293 for (i
= 0; i
< n
; i
++) {
4294 /* Intensity comes from red channel */
4295 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
4299 if (dstLuminanceIndex
>= 0) {
4302 assert(dstLuminanceIndex
== 0);
4303 for (i
= 0; i
< n
; i
++) {
4304 /* Luminance comes from red channel */
4305 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
4306 dst
+= dstComponents
;
4314 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
4315 * instead of GLchan.
4318 _mesa_unpack_color_span_float( GLcontext
*ctx
,
4319 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4320 GLenum srcFormat
, GLenum srcType
,
4321 const GLvoid
*source
,
4322 const struct gl_pixelstore_attrib
*srcPacking
,
4323 GLbitfield transferOps
)
4325 ASSERT(dstFormat
== GL_ALPHA
||
4326 dstFormat
== GL_LUMINANCE
||
4327 dstFormat
== GL_LUMINANCE_ALPHA
||
4328 dstFormat
== GL_INTENSITY
||
4329 dstFormat
== GL_RGB
||
4330 dstFormat
== GL_RGBA
||
4331 dstFormat
== GL_COLOR_INDEX
);
4333 ASSERT(srcFormat
== GL_RED
||
4334 srcFormat
== GL_GREEN
||
4335 srcFormat
== GL_BLUE
||
4336 srcFormat
== GL_ALPHA
||
4337 srcFormat
== GL_LUMINANCE
||
4338 srcFormat
== GL_LUMINANCE_ALPHA
||
4339 srcFormat
== GL_INTENSITY
||
4340 srcFormat
== GL_RGB
||
4341 srcFormat
== GL_BGR
||
4342 srcFormat
== GL_RGBA
||
4343 srcFormat
== GL_BGRA
||
4344 srcFormat
== GL_ABGR_EXT
||
4345 srcFormat
== GL_RED_INTEGER_EXT
||
4346 srcFormat
== GL_GREEN_INTEGER_EXT
||
4347 srcFormat
== GL_BLUE_INTEGER_EXT
||
4348 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4349 srcFormat
== GL_RGB_INTEGER_EXT
||
4350 srcFormat
== GL_RGBA_INTEGER_EXT
||
4351 srcFormat
== GL_BGR_INTEGER_EXT
||
4352 srcFormat
== GL_BGRA_INTEGER_EXT
||
4353 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4354 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4355 srcFormat
== GL_COLOR_INDEX
);
4357 ASSERT(srcType
== GL_BITMAP
||
4358 srcType
== GL_UNSIGNED_BYTE
||
4359 srcType
== GL_BYTE
||
4360 srcType
== GL_UNSIGNED_SHORT
||
4361 srcType
== GL_SHORT
||
4362 srcType
== GL_UNSIGNED_INT
||
4363 srcType
== GL_INT
||
4364 srcType
== GL_HALF_FLOAT_ARB
||
4365 srcType
== GL_FLOAT
||
4366 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4367 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4368 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4369 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4370 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4371 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4372 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4373 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4374 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4375 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4376 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4377 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4379 /* general solution, no special cases, yet */
4381 GLint dstComponents
;
4382 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4383 GLint dstLuminanceIndex
, dstIntensityIndex
;
4384 GLfloat rgba
[MAX_WIDTH
][4];
4386 dstComponents
= _mesa_components_in_format( dstFormat
);
4387 /* source & dest image formats should have been error checked by now */
4388 assert(dstComponents
> 0);
4391 * Extract image data and convert to RGBA floats
4393 assert(n
<= MAX_WIDTH
);
4394 if (srcFormat
== GL_COLOR_INDEX
) {
4395 GLuint indexes
[MAX_WIDTH
];
4396 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4399 if (dstFormat
== GL_COLOR_INDEX
) {
4401 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4402 /* convert to GLchan and return */
4403 for (i
= 0; i
< n
; i
++) {
4404 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4409 /* Convert indexes to RGBA */
4410 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4411 shift_and_offset_ci(ctx
, n
, indexes
);
4413 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4416 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4417 * with color indexes.
4419 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4422 /* non-color index data */
4423 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4424 srcPacking
->SwapBytes
);
4428 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4431 /* Now determine which color channels we need to produce.
4432 * And determine the dest index (offset) within each color tuple.
4434 switch (dstFormat
) {
4437 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4438 dstLuminanceIndex
= dstIntensityIndex
= -1;
4441 dstLuminanceIndex
= 0;
4442 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4443 dstIntensityIndex
= -1;
4445 case GL_LUMINANCE_ALPHA
:
4446 dstLuminanceIndex
= 0;
4448 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4449 dstIntensityIndex
= -1;
4452 dstIntensityIndex
= 0;
4453 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4454 dstLuminanceIndex
= -1;
4460 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4467 dstLuminanceIndex
= dstIntensityIndex
= -1;
4470 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
4474 /* Now pack results in the requested dstFormat */
4475 if (dstRedIndex
>= 0) {
4476 GLfloat
*dst
= dest
;
4478 for (i
= 0; i
< n
; i
++) {
4479 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
4480 dst
+= dstComponents
;
4484 if (dstGreenIndex
>= 0) {
4485 GLfloat
*dst
= dest
;
4487 for (i
= 0; i
< n
; i
++) {
4488 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
4489 dst
+= dstComponents
;
4493 if (dstBlueIndex
>= 0) {
4494 GLfloat
*dst
= dest
;
4496 for (i
= 0; i
< n
; i
++) {
4497 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
4498 dst
+= dstComponents
;
4502 if (dstAlphaIndex
>= 0) {
4503 GLfloat
*dst
= dest
;
4505 for (i
= 0; i
< n
; i
++) {
4506 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
4507 dst
+= dstComponents
;
4511 if (dstIntensityIndex
>= 0) {
4512 GLfloat
*dst
= dest
;
4514 assert(dstIntensityIndex
== 0);
4515 assert(dstComponents
== 1);
4516 for (i
= 0; i
< n
; i
++) {
4517 /* Intensity comes from red channel */
4518 dst
[i
] = rgba
[i
][RCOMP
];
4522 if (dstLuminanceIndex
>= 0) {
4523 GLfloat
*dst
= dest
;
4525 assert(dstLuminanceIndex
== 0);
4526 for (i
= 0; i
< n
; i
++) {
4527 /* Luminance comes from red channel */
4528 dst
[0] = rgba
[i
][RCOMP
];
4529 dst
+= dstComponents
;
4536 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4537 * directly return GLbyte data, no transfer ops apply.
4540 _mesa_unpack_dudv_span_byte( GLcontext
*ctx
,
4541 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4542 GLenum srcFormat
, GLenum srcType
,
4543 const GLvoid
*source
,
4544 const struct gl_pixelstore_attrib
*srcPacking
,
4545 GLbitfield transferOps
)
4547 ASSERT(dstFormat
== GL_DUDV_ATI
);
4548 ASSERT(srcFormat
== GL_DUDV_ATI
);
4550 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4551 srcType
== GL_BYTE
||
4552 srcType
== GL_UNSIGNED_SHORT
||
4553 srcType
== GL_SHORT
||
4554 srcType
== GL_UNSIGNED_INT
||
4555 srcType
== GL_INT
||
4556 srcType
== GL_HALF_FLOAT_ARB
||
4557 srcType
== GL_FLOAT
);
4559 /* general solution */
4561 GLint dstComponents
;
4562 GLfloat rgba
[MAX_WIDTH
][4];
4566 dstComponents
= _mesa_components_in_format( dstFormat
);
4567 /* source & dest image formats should have been error checked by now */
4568 assert(dstComponents
> 0);
4571 * Extract image data and convert to RGBA floats
4573 assert(n
<= MAX_WIDTH
);
4574 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4575 srcPacking
->SwapBytes
);
4578 /* Now determine which color channels we need to produce.
4579 * And determine the dest index (offset) within each color tuple.
4582 /* Now pack results in the requested dstFormat */
4583 for (i
= 0; i
< n
; i
++) {
4584 /* not sure - need clamp[-1,1] here? */
4585 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4586 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4587 dst
+= dstComponents
;
4593 * Unpack a row of color index data from a client buffer according to
4594 * the pixel unpacking parameters.
4595 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4597 * Args: ctx - the context
4598 * n - number of pixels
4599 * dstType - destination data type
4600 * dest - destination array
4601 * srcType - source pixel type
4602 * source - source data pointer
4603 * srcPacking - pixel unpacking parameters
4604 * transferOps - the pixel transfer operations to apply
4607 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
4608 GLenum dstType
, GLvoid
*dest
,
4609 GLenum srcType
, const GLvoid
*source
,
4610 const struct gl_pixelstore_attrib
*srcPacking
,
4611 GLbitfield transferOps
)
4613 ASSERT(srcType
== GL_BITMAP
||
4614 srcType
== GL_UNSIGNED_BYTE
||
4615 srcType
== GL_BYTE
||
4616 srcType
== GL_UNSIGNED_SHORT
||
4617 srcType
== GL_SHORT
||
4618 srcType
== GL_UNSIGNED_INT
||
4619 srcType
== GL_INT
||
4620 srcType
== GL_HALF_FLOAT_ARB
||
4621 srcType
== GL_FLOAT
);
4623 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4624 dstType
== GL_UNSIGNED_SHORT
||
4625 dstType
== GL_UNSIGNED_INT
);
4628 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4631 * Try simple cases first
4633 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4634 && dstType
== GL_UNSIGNED_BYTE
) {
4635 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4637 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4638 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4639 memcpy(dest
, source
, n
* sizeof(GLuint
));
4645 GLuint indexes
[MAX_WIDTH
];
4646 assert(n
<= MAX_WIDTH
);
4648 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4652 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4654 /* convert to dest type */
4656 case GL_UNSIGNED_BYTE
:
4658 GLubyte
*dst
= (GLubyte
*) dest
;
4660 for (i
= 0; i
< n
; i
++) {
4661 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4665 case GL_UNSIGNED_SHORT
:
4667 GLuint
*dst
= (GLuint
*) dest
;
4669 for (i
= 0; i
< n
; i
++) {
4670 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4674 case GL_UNSIGNED_INT
:
4675 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4678 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4685 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
4686 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4687 const struct gl_pixelstore_attrib
*dstPacking
,
4688 GLbitfield transferOps
)
4690 GLuint indexes
[MAX_WIDTH
];
4692 ASSERT(n
<= MAX_WIDTH
);
4694 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4696 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4697 /* make a copy of input */
4698 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4699 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4704 case GL_UNSIGNED_BYTE
:
4706 GLubyte
*dst
= (GLubyte
*) dest
;
4708 for (i
= 0; i
< n
; i
++) {
4709 *dst
++ = (GLubyte
) source
[i
];
4715 GLbyte
*dst
= (GLbyte
*) dest
;
4717 for (i
= 0; i
< n
; i
++) {
4718 dst
[i
] = (GLbyte
) source
[i
];
4722 case GL_UNSIGNED_SHORT
:
4724 GLushort
*dst
= (GLushort
*) dest
;
4726 for (i
= 0; i
< n
; i
++) {
4727 dst
[i
] = (GLushort
) source
[i
];
4729 if (dstPacking
->SwapBytes
) {
4730 _mesa_swap2( (GLushort
*) dst
, n
);
4736 GLshort
*dst
= (GLshort
*) dest
;
4738 for (i
= 0; i
< n
; i
++) {
4739 dst
[i
] = (GLshort
) source
[i
];
4741 if (dstPacking
->SwapBytes
) {
4742 _mesa_swap2( (GLushort
*) dst
, n
);
4746 case GL_UNSIGNED_INT
:
4748 GLuint
*dst
= (GLuint
*) dest
;
4750 for (i
= 0; i
< n
; i
++) {
4751 dst
[i
] = (GLuint
) source
[i
];
4753 if (dstPacking
->SwapBytes
) {
4754 _mesa_swap4( (GLuint
*) dst
, n
);
4760 GLint
*dst
= (GLint
*) dest
;
4762 for (i
= 0; i
< n
; i
++) {
4763 dst
[i
] = (GLint
) source
[i
];
4765 if (dstPacking
->SwapBytes
) {
4766 _mesa_swap4( (GLuint
*) dst
, n
);
4772 GLfloat
*dst
= (GLfloat
*) dest
;
4774 for (i
= 0; i
< n
; i
++) {
4775 dst
[i
] = (GLfloat
) source
[i
];
4777 if (dstPacking
->SwapBytes
) {
4778 _mesa_swap4( (GLuint
*) dst
, n
);
4782 case GL_HALF_FLOAT_ARB
:
4784 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4786 for (i
= 0; i
< n
; i
++) {
4787 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4789 if (dstPacking
->SwapBytes
) {
4790 _mesa_swap2( (GLushort
*) dst
, n
);
4795 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4801 * Unpack a row of stencil data from a client buffer according to
4802 * the pixel unpacking parameters.
4803 * This is (or will be) used by glDrawPixels
4805 * Args: ctx - the context
4806 * n - number of pixels
4807 * dstType - destination data type
4808 * dest - destination array
4809 * srcType - source pixel type
4810 * source - source data pointer
4811 * srcPacking - pixel unpacking parameters
4812 * transferOps - apply offset/bias/lookup ops?
4815 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4816 GLenum dstType
, GLvoid
*dest
,
4817 GLenum srcType
, const GLvoid
*source
,
4818 const struct gl_pixelstore_attrib
*srcPacking
,
4819 GLbitfield transferOps
)
4821 ASSERT(srcType
== GL_BITMAP
||
4822 srcType
== GL_UNSIGNED_BYTE
||
4823 srcType
== GL_BYTE
||
4824 srcType
== GL_UNSIGNED_SHORT
||
4825 srcType
== GL_SHORT
||
4826 srcType
== GL_UNSIGNED_INT
||
4827 srcType
== GL_INT
||
4828 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4829 srcType
== GL_HALF_FLOAT_ARB
||
4830 srcType
== GL_FLOAT
);
4832 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4833 dstType
== GL_UNSIGNED_SHORT
||
4834 dstType
== GL_UNSIGNED_INT
);
4836 /* only shift and offset apply to stencil */
4837 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4840 * Try simple cases first
4842 if (transferOps
== 0 &&
4843 !ctx
->Pixel
.MapStencilFlag
&&
4844 srcType
== GL_UNSIGNED_BYTE
&&
4845 dstType
== GL_UNSIGNED_BYTE
) {
4846 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4848 else if (transferOps
== 0 &&
4849 !ctx
->Pixel
.MapStencilFlag
&&
4850 srcType
== GL_UNSIGNED_INT
&&
4851 dstType
== GL_UNSIGNED_INT
&&
4852 !srcPacking
->SwapBytes
) {
4853 memcpy(dest
, source
, n
* sizeof(GLuint
));
4859 GLuint indexes
[MAX_WIDTH
];
4860 assert(n
<= MAX_WIDTH
);
4862 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4865 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4866 /* shift and offset indexes */
4867 shift_and_offset_ci(ctx
, n
, indexes
);
4870 if (ctx
->Pixel
.MapStencilFlag
) {
4871 /* Apply stencil lookup table */
4872 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4874 for (i
= 0; i
< n
; i
++) {
4875 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4879 /* convert to dest type */
4881 case GL_UNSIGNED_BYTE
:
4883 GLubyte
*dst
= (GLubyte
*) dest
;
4885 for (i
= 0; i
< n
; i
++) {
4886 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4890 case GL_UNSIGNED_SHORT
:
4892 GLuint
*dst
= (GLuint
*) dest
;
4894 for (i
= 0; i
< n
; i
++) {
4895 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4899 case GL_UNSIGNED_INT
:
4900 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4903 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4910 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4911 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4912 const struct gl_pixelstore_attrib
*dstPacking
)
4914 GLstencil stencil
[MAX_WIDTH
];
4916 ASSERT(n
<= MAX_WIDTH
);
4918 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4919 ctx
->Pixel
.MapStencilFlag
) {
4920 /* make a copy of input */
4921 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4922 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4927 case GL_UNSIGNED_BYTE
:
4928 if (sizeof(GLstencil
) == 1) {
4929 memcpy( dest
, source
, n
);
4932 GLubyte
*dst
= (GLubyte
*) dest
;
4935 dst
[i
] = (GLubyte
) source
[i
];
4941 GLbyte
*dst
= (GLbyte
*) dest
;
4944 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4948 case GL_UNSIGNED_SHORT
:
4950 GLushort
*dst
= (GLushort
*) dest
;
4953 dst
[i
] = (GLushort
) source
[i
];
4955 if (dstPacking
->SwapBytes
) {
4956 _mesa_swap2( (GLushort
*) dst
, n
);
4962 GLshort
*dst
= (GLshort
*) dest
;
4965 dst
[i
] = (GLshort
) source
[i
];
4967 if (dstPacking
->SwapBytes
) {
4968 _mesa_swap2( (GLushort
*) dst
, n
);
4972 case GL_UNSIGNED_INT
:
4974 GLuint
*dst
= (GLuint
*) dest
;
4977 dst
[i
] = (GLuint
) source
[i
];
4979 if (dstPacking
->SwapBytes
) {
4980 _mesa_swap4( (GLuint
*) dst
, n
);
4986 GLint
*dst
= (GLint
*) dest
;
4989 dst
[i
] = (GLint
) source
[i
];
4991 if (dstPacking
->SwapBytes
) {
4992 _mesa_swap4( (GLuint
*) dst
, n
);
4998 GLfloat
*dst
= (GLfloat
*) dest
;
5001 dst
[i
] = (GLfloat
) source
[i
];
5003 if (dstPacking
->SwapBytes
) {
5004 _mesa_swap4( (GLuint
*) dst
, n
);
5008 case GL_HALF_FLOAT_ARB
:
5010 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5013 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
5015 if (dstPacking
->SwapBytes
) {
5016 _mesa_swap2( (GLushort
*) dst
, n
);
5021 if (dstPacking
->LsbFirst
) {
5022 GLubyte
*dst
= (GLubyte
*) dest
;
5025 for (i
= 0; i
< n
; i
++) {
5028 *dst
|= ((source
[i
] != 0) << shift
);
5037 GLubyte
*dst
= (GLubyte
*) dest
;
5040 for (i
= 0; i
< n
; i
++) {
5043 *dst
|= ((source
[i
] != 0) << shift
);
5053 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5057 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5060 const GLTYPE *src = (const GLTYPE *)source; \
5061 for (i = 0; i < n; i++) { \
5062 GLTYPE value = src[i]; \
5063 if (srcPacking->SwapBytes) { \
5064 if (sizeof(GLTYPE) == 2) { \
5066 } else if (sizeof(GLTYPE) == 4) { \
5070 depthValues[i] = GLTYPE2FLOAT(value); \
5076 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5077 * or GLfloat values.
5078 * The glPixelTransfer (scale/bias) params will be applied.
5080 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5081 * \param depthMax max value for returned GLushort or GLuint values
5082 * (ignored for GLfloat).
5085 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
,
5086 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5087 GLenum srcType
, const GLvoid
*source
,
5088 const struct gl_pixelstore_attrib
*srcPacking
)
5090 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
5091 GLboolean needClamp
= GL_FALSE
;
5093 /* Look for special cases first.
5094 * Not only are these faster, they're less prone to numeric conversion
5095 * problems. Otherwise, converting from an int type to a float then
5096 * back to an int type can introduce errors that will show up as
5097 * artifacts in things like depth peeling which uses glCopyTexImage.
5099 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5100 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5101 const GLuint
*src
= (const GLuint
*) source
;
5102 GLushort
*dst
= (GLushort
*) dest
;
5104 for (i
= 0; i
< n
; i
++) {
5105 dst
[i
] = src
[i
] >> 16;
5109 if (srcType
== GL_UNSIGNED_SHORT
5110 && dstType
== GL_UNSIGNED_INT
5111 && depthMax
== 0xffffffff) {
5112 const GLushort
*src
= (const GLushort
*) source
;
5113 GLuint
*dst
= (GLuint
*) dest
;
5115 for (i
= 0; i
< n
; i
++) {
5116 dst
[i
] = src
[i
] | (src
[i
] << 16);
5120 if (srcType
== GL_UNSIGNED_INT_24_8
5121 && dstType
== GL_UNSIGNED_INT
5122 && depthMax
== 0xffffff) {
5123 const GLuint
*src
= (const GLuint
*) source
;
5124 GLuint
*dst
= (GLuint
*) dest
;
5126 for (i
= 0; i
< n
; i
++) {
5127 dst
[i
] = src
[i
] >> 8;
5131 /* XXX may want to add additional cases here someday */
5134 /* general case path follows */
5136 if (dstType
== GL_FLOAT
) {
5137 depthValues
= (GLfloat
*) dest
;
5140 depthValues
= depthTemp
;
5143 /* Convert incoming values to GLfloat. Some conversions will require
5148 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
5149 needClamp
= GL_TRUE
;
5151 case GL_UNSIGNED_BYTE
:
5152 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5155 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
5156 needClamp
= GL_TRUE
;
5158 case GL_UNSIGNED_SHORT
:
5159 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5162 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5163 needClamp
= GL_TRUE
;
5165 case GL_UNSIGNED_INT
:
5166 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5168 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5169 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5170 depthMax
== 0xffffff &&
5171 ctx
->Pixel
.DepthScale
== 1.0 &&
5172 ctx
->Pixel
.DepthBias
== 0.0) {
5173 const GLuint
*src
= (const GLuint
*) source
;
5174 GLuint
*zValues
= (GLuint
*) dest
;
5176 for (i
= 0; i
< n
; i
++) {
5177 GLuint value
= src
[i
];
5178 if (srcPacking
->SwapBytes
) {
5181 zValues
[i
] = value
& 0xffffff00;
5186 const GLuint
*src
= (const GLuint
*) source
;
5187 const GLfloat scale
= 1.0f
/ 0xffffff;
5189 for (i
= 0; i
< n
; i
++) {
5190 GLuint value
= src
[i
];
5191 if (srcPacking
->SwapBytes
) {
5194 depthValues
[i
] = (value
>> 8) * scale
;
5199 DEPTH_VALUES(GLfloat
, 1*);
5200 needClamp
= GL_TRUE
;
5202 case GL_HALF_FLOAT_ARB
:
5205 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5206 for (i
= 0; i
< n
; i
++) {
5207 GLhalfARB value
= src
[i
];
5208 if (srcPacking
->SwapBytes
) {
5211 depthValues
[i
] = _mesa_half_to_float(value
);
5213 needClamp
= GL_TRUE
;
5217 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5221 /* apply depth scale and bias */
5223 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5224 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5225 if (scale
!= 1.0 || bias
!= 0.0) {
5227 for (i
= 0; i
< n
; i
++) {
5228 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5230 needClamp
= GL_TRUE
;
5234 /* clamp to [0, 1] */
5237 for (i
= 0; i
< n
; i
++) {
5238 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5243 * Convert values to dstType
5245 if (dstType
== GL_UNSIGNED_INT
) {
5246 GLuint
*zValues
= (GLuint
*) dest
;
5248 if (depthMax
<= 0xffffff) {
5249 /* no overflow worries */
5250 for (i
= 0; i
< n
; i
++) {
5251 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5255 /* need to use double precision to prevent overflow problems */
5256 for (i
= 0; i
< n
; i
++) {
5257 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
5258 if (z
>= (GLdouble
) 0xffffffff)
5259 zValues
[i
] = 0xffffffff;
5261 zValues
[i
] = (GLuint
) z
;
5265 else if (dstType
== GL_UNSIGNED_SHORT
) {
5266 GLushort
*zValues
= (GLushort
*) dest
;
5268 ASSERT(depthMax
<= 0xffff);
5269 for (i
= 0; i
< n
; i
++) {
5270 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5274 ASSERT(dstType
== GL_FLOAT
);
5275 /*ASSERT(depthMax == 1.0F);*/
5281 * Pack an array of depth values. The values are floats in [0,1].
5284 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
5285 GLenum dstType
, const GLfloat
*depthSpan
,
5286 const struct gl_pixelstore_attrib
*dstPacking
)
5288 GLfloat depthCopy
[MAX_WIDTH
];
5290 ASSERT(n
<= MAX_WIDTH
);
5292 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5293 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5294 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5295 depthSpan
= depthCopy
;
5299 case GL_UNSIGNED_BYTE
:
5301 GLubyte
*dst
= (GLubyte
*) dest
;
5303 for (i
= 0; i
< n
; i
++) {
5304 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5310 GLbyte
*dst
= (GLbyte
*) dest
;
5312 for (i
= 0; i
< n
; i
++) {
5313 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5317 case GL_UNSIGNED_SHORT
:
5319 GLushort
*dst
= (GLushort
*) dest
;
5321 for (i
= 0; i
< n
; i
++) {
5322 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5324 if (dstPacking
->SwapBytes
) {
5325 _mesa_swap2( (GLushort
*) dst
, n
);
5331 GLshort
*dst
= (GLshort
*) dest
;
5333 for (i
= 0; i
< n
; i
++) {
5334 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5336 if (dstPacking
->SwapBytes
) {
5337 _mesa_swap2( (GLushort
*) dst
, n
);
5341 case GL_UNSIGNED_INT
:
5343 GLuint
*dst
= (GLuint
*) dest
;
5345 for (i
= 0; i
< n
; i
++) {
5346 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5348 if (dstPacking
->SwapBytes
) {
5349 _mesa_swap4( (GLuint
*) dst
, n
);
5355 GLint
*dst
= (GLint
*) dest
;
5357 for (i
= 0; i
< n
; i
++) {
5358 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5360 if (dstPacking
->SwapBytes
) {
5361 _mesa_swap4( (GLuint
*) dst
, n
);
5367 GLfloat
*dst
= (GLfloat
*) dest
;
5369 for (i
= 0; i
< n
; i
++) {
5370 dst
[i
] = depthSpan
[i
];
5372 if (dstPacking
->SwapBytes
) {
5373 _mesa_swap4( (GLuint
*) dst
, n
);
5377 case GL_HALF_FLOAT_ARB
:
5379 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5381 for (i
= 0; i
< n
; i
++) {
5382 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5384 if (dstPacking
->SwapBytes
) {
5385 _mesa_swap2( (GLushort
*) dst
, n
);
5390 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5397 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5400 _mesa_pack_depth_stencil_span(const GLcontext
*ctx
, GLuint n
, GLuint
*dest
,
5401 const GLfloat
*depthVals
,
5402 const GLstencil
*stencilVals
,
5403 const struct gl_pixelstore_attrib
*dstPacking
)
5405 GLfloat depthCopy
[MAX_WIDTH
];
5406 GLstencil stencilCopy
[MAX_WIDTH
];
5409 ASSERT(n
<= MAX_WIDTH
);
5411 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5412 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5413 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5414 depthVals
= depthCopy
;
5417 if (ctx
->Pixel
.IndexShift
||
5418 ctx
->Pixel
.IndexOffset
||
5419 ctx
->Pixel
.MapStencilFlag
) {
5420 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5421 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5422 stencilVals
= stencilCopy
;
5425 for (i
= 0; i
< n
; i
++) {
5426 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5427 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5430 if (dstPacking
->SwapBytes
) {
5431 _mesa_swap4(dest
, n
);
5439 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5440 * Return all image data in a contiguous block. This is used when we
5441 * compile glDrawPixels, glTexImage, etc into a display list. We
5442 * need a copy of the data in a standard format.
5445 _mesa_unpack_image( GLuint dimensions
,
5446 GLsizei width
, GLsizei height
, GLsizei depth
,
5447 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5448 const struct gl_pixelstore_attrib
*unpack
)
5450 GLint bytesPerRow
, compsPerRow
;
5451 GLboolean flipBytes
, swap2
, swap4
;
5454 return NULL
; /* not necessarily an error */
5456 if (width
<= 0 || height
<= 0 || depth
<= 0)
5457 return NULL
; /* generate error later */
5459 if (type
== GL_BITMAP
) {
5460 bytesPerRow
= (width
+ 7) >> 3;
5461 flipBytes
= unpack
->LsbFirst
;
5462 swap2
= swap4
= GL_FALSE
;
5466 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5467 GLint components
= _mesa_components_in_format(format
);
5470 if (_mesa_type_is_packed(type
))
5473 if (bytesPerPixel
<= 0 || components
<= 0)
5474 return NULL
; /* bad format or type. generate error later */
5475 bytesPerRow
= bytesPerPixel
* width
;
5476 bytesPerComp
= bytesPerPixel
/ components
;
5477 flipBytes
= GL_FALSE
;
5478 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5479 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5480 compsPerRow
= components
* width
;
5481 assert(compsPerRow
>= width
);
5486 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5490 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5493 for (img
= 0; img
< depth
; img
++) {
5494 for (row
= 0; row
< height
; row
++) {
5495 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5496 width
, height
, format
, type
, img
, row
, 0);
5498 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5500 flipBytes
= GL_FALSE
;
5501 if (unpack
->LsbFirst
) {
5502 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5503 GLubyte dstMask
= 128;
5504 const GLubyte
*s
= src
;
5507 for (i
= 0; i
< width
; i
++) {
5511 if (srcMask
== 128) {
5516 srcMask
= srcMask
<< 1;
5524 dstMask
= dstMask
>> 1;
5529 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5530 GLubyte dstMask
= 128;
5531 const GLubyte
*s
= src
;
5534 for (i
= 0; i
< width
; i
++) {
5543 srcMask
= srcMask
>> 1;
5551 dstMask
= dstMask
>> 1;
5557 memcpy(dst
, src
, bytesPerRow
);
5560 /* byte flipping/swapping */
5562 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5565 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5568 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5577 #endif /* _HAVE_FULL_GL */
5582 * Convert an array of RGBA colors from one datatype to another.
5583 * NOTE: src may equal dst. In that case, we use a temporary buffer.
5586 _mesa_convert_colors(GLenum srcType
, const GLvoid
*src
,
5587 GLenum dstType
, GLvoid
*dst
,
5588 GLuint count
, const GLubyte mask
[])
5590 GLuint tempBuffer
[MAX_WIDTH
][4];
5591 const GLboolean useTemp
= (src
== dst
);
5593 ASSERT(srcType
!= dstType
);
5596 case GL_UNSIGNED_BYTE
:
5597 if (dstType
== GL_UNSIGNED_SHORT
) {
5598 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5599 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5601 for (i
= 0; i
< count
; i
++) {
5602 if (!mask
|| mask
[i
]) {
5603 dst2
[i
][RCOMP
] = UBYTE_TO_USHORT(src1
[i
][RCOMP
]);
5604 dst2
[i
][GCOMP
] = UBYTE_TO_USHORT(src1
[i
][GCOMP
]);
5605 dst2
[i
][BCOMP
] = UBYTE_TO_USHORT(src1
[i
][BCOMP
]);
5606 dst2
[i
][ACOMP
] = UBYTE_TO_USHORT(src1
[i
][ACOMP
]);
5610 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5613 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5614 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5616 ASSERT(dstType
== GL_FLOAT
);
5617 for (i
= 0; i
< count
; i
++) {
5618 if (!mask
|| mask
[i
]) {
5619 dst4
[i
][RCOMP
] = UBYTE_TO_FLOAT(src1
[i
][RCOMP
]);
5620 dst4
[i
][GCOMP
] = UBYTE_TO_FLOAT(src1
[i
][GCOMP
]);
5621 dst4
[i
][BCOMP
] = UBYTE_TO_FLOAT(src1
[i
][BCOMP
]);
5622 dst4
[i
][ACOMP
] = UBYTE_TO_FLOAT(src1
[i
][ACOMP
]);
5626 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5629 case GL_UNSIGNED_SHORT
:
5630 if (dstType
== GL_UNSIGNED_BYTE
) {
5631 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5632 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5634 for (i
= 0; i
< count
; i
++) {
5635 if (!mask
|| mask
[i
]) {
5636 dst1
[i
][RCOMP
] = USHORT_TO_UBYTE(src2
[i
][RCOMP
]);
5637 dst1
[i
][GCOMP
] = USHORT_TO_UBYTE(src2
[i
][GCOMP
]);
5638 dst1
[i
][BCOMP
] = USHORT_TO_UBYTE(src2
[i
][BCOMP
]);
5639 dst1
[i
][ACOMP
] = USHORT_TO_UBYTE(src2
[i
][ACOMP
]);
5643 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5646 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5647 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5649 ASSERT(dstType
== GL_FLOAT
);
5650 for (i
= 0; i
< count
; i
++) {
5651 if (!mask
|| mask
[i
]) {
5652 dst4
[i
][RCOMP
] = USHORT_TO_FLOAT(src2
[i
][RCOMP
]);
5653 dst4
[i
][GCOMP
] = USHORT_TO_FLOAT(src2
[i
][GCOMP
]);
5654 dst4
[i
][BCOMP
] = USHORT_TO_FLOAT(src2
[i
][BCOMP
]);
5655 dst4
[i
][ACOMP
] = USHORT_TO_FLOAT(src2
[i
][ACOMP
]);
5659 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5663 if (dstType
== GL_UNSIGNED_BYTE
) {
5664 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5665 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5667 for (i
= 0; i
< count
; i
++) {
5668 if (!mask
|| mask
[i
]) {
5669 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][RCOMP
], src4
[i
][RCOMP
]);
5670 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][GCOMP
], src4
[i
][GCOMP
]);
5671 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][BCOMP
], src4
[i
][BCOMP
]);
5672 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][ACOMP
], src4
[i
][ACOMP
]);
5676 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5679 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5680 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5682 ASSERT(dstType
== GL_UNSIGNED_SHORT
);
5683 for (i
= 0; i
< count
; i
++) {
5684 if (!mask
|| mask
[i
]) {
5685 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][RCOMP
], src4
[i
][RCOMP
]);
5686 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][GCOMP
], src4
[i
][GCOMP
]);
5687 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][BCOMP
], src4
[i
][BCOMP
]);
5688 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][ACOMP
], src4
[i
][ACOMP
]);
5692 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5696 _mesa_problem(NULL
, "Invalid datatype in _mesa_convert_colors");
5704 * Perform basic clipping for glDrawPixels. The image's position and size
5705 * and the unpack SkipPixels and SkipRows are adjusted so that the image
5706 * region is entirely within the window and scissor bounds.
5707 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
5708 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
5709 * we'll actually write. Beforehand, *destY-1 is the first drawing row.
5711 * \return GL_TRUE if image is ready for drawing or
5712 * GL_FALSE if image was completely clipped away (draw nothing)
5715 _mesa_clip_drawpixels(const GLcontext
*ctx
,
5716 GLint
*destX
, GLint
*destY
,
5717 GLsizei
*width
, GLsizei
*height
,
5718 struct gl_pixelstore_attrib
*unpack
)
5720 const GLframebuffer
*buffer
= ctx
->DrawBuffer
;
5722 if (unpack
->RowLength
== 0) {
5723 unpack
->RowLength
= *width
;
5726 ASSERT(ctx
->Pixel
.ZoomX
== 1.0F
);
5727 ASSERT(ctx
->Pixel
.ZoomY
== 1.0F
|| ctx
->Pixel
.ZoomY
== -1.0F
);
5730 if (*destX
< buffer
->_Xmin
) {
5731 unpack
->SkipPixels
+= (buffer
->_Xmin
- *destX
);
5732 *width
-= (buffer
->_Xmin
- *destX
);
5733 *destX
= buffer
->_Xmin
;
5735 /* right clipping */
5736 if (*destX
+ *width
> buffer
->_Xmax
)
5737 *width
-= (*destX
+ *width
- buffer
->_Xmax
);
5742 if (ctx
->Pixel
.ZoomY
== 1.0F
) {
5743 /* bottom clipping */
5744 if (*destY
< buffer
->_Ymin
) {
5745 unpack
->SkipRows
+= (buffer
->_Ymin
- *destY
);
5746 *height
-= (buffer
->_Ymin
- *destY
);
5747 *destY
= buffer
->_Ymin
;
5750 if (*destY
+ *height
> buffer
->_Ymax
)
5751 *height
-= (*destY
+ *height
- buffer
->_Ymax
);
5753 else { /* upside down */
5755 if (*destY
> buffer
->_Ymax
) {
5756 unpack
->SkipRows
+= (*destY
- buffer
->_Ymax
);
5757 *height
-= (*destY
- buffer
->_Ymax
);
5758 *destY
= buffer
->_Ymax
;
5760 /* bottom clipping */
5761 if (*destY
- *height
< buffer
->_Ymin
)
5762 *height
-= (buffer
->_Ymin
- (*destY
- *height
));
5763 /* adjust destY so it's the first row to write to */
5775 * Perform clipping for glReadPixels. The image's window position
5776 * and size, and the pack skipPixels, skipRows and rowLength are adjusted
5777 * so that the image region is entirely within the window bounds.
5778 * Note: this is different from _mesa_clip_drawpixels() in that the
5779 * scissor box is ignored, and we use the bounds of the current readbuffer
5782 * \return GL_TRUE if image is ready for drawing or
5783 * GL_FALSE if image was completely clipped away (draw nothing)
5786 _mesa_clip_readpixels(const GLcontext
*ctx
,
5787 GLint
*srcX
, GLint
*srcY
,
5788 GLsizei
*width
, GLsizei
*height
,
5789 struct gl_pixelstore_attrib
*pack
)
5791 const GLframebuffer
*buffer
= ctx
->ReadBuffer
;
5793 if (pack
->RowLength
== 0) {
5794 pack
->RowLength
= *width
;
5799 pack
->SkipPixels
+= (0 - *srcX
);
5800 *width
-= (0 - *srcX
);
5803 /* right clipping */
5804 if (*srcX
+ *width
> (GLsizei
) buffer
->Width
)
5805 *width
-= (*srcX
+ *width
- buffer
->Width
);
5810 /* bottom clipping */
5812 pack
->SkipRows
+= (0 - *srcY
);
5813 *height
-= (0 - *srcY
);
5817 if (*srcY
+ *height
> (GLsizei
) buffer
->Height
)
5818 *height
-= (*srcY
+ *height
- buffer
->Height
);
5828 * Do clipping for a glCopyTexSubImage call.
5829 * The framebuffer source region might extend outside the framebuffer
5830 * bounds. Clip the source region against the framebuffer bounds and
5831 * adjust the texture/dest position and size accordingly.
5833 * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
5836 _mesa_clip_copytexsubimage(const GLcontext
*ctx
,
5837 GLint
*destX
, GLint
*destY
,
5838 GLint
*srcX
, GLint
*srcY
,
5839 GLsizei
*width
, GLsizei
*height
)
5841 const struct gl_framebuffer
*fb
= ctx
->ReadBuffer
;
5842 const GLint srcX0
= *srcX
, srcY0
= *srcY
;
5844 if (_mesa_clip_to_region(0, 0, fb
->Width
, fb
->Height
,
5845 srcX
, srcY
, width
, height
)) {
5846 *destX
= *destX
+ *srcX
- srcX0
;
5847 *destY
= *destY
+ *srcY
- srcY0
;
5859 * Clip the rectangle defined by (x, y, width, height) against the bounds
5860 * specified by [xmin, xmax) and [ymin, ymax).
5861 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
5864 _mesa_clip_to_region(GLint xmin
, GLint ymin
,
5865 GLint xmax
, GLint ymax
,
5867 GLsizei
*width
, GLsizei
*height
)
5871 *width
-= (xmin
- *x
);
5875 /* right clipping */
5876 if (*x
+ *width
> xmax
)
5877 *width
-= (*x
+ *width
- xmax
);
5882 /* bottom (or top) clipping */
5884 *height
-= (ymin
- *y
);
5888 /* top (or bottom) clipping */
5889 if (*y
+ *height
> ymax
)
5890 *height
-= (*y
+ *height
- ymax
);
5900 * Clip dst coords against Xmax (or Ymax).
5903 clip_right_or_top(GLint
*srcX0
, GLint
*srcX1
,
5904 GLint
*dstX0
, GLint
*dstX1
,
5909 if (*dstX1
> maxValue
) {
5910 /* X1 outside right edge */
5911 ASSERT(*dstX0
< maxValue
); /* X0 should be inside right edge */
5912 t
= (GLfloat
) (maxValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5913 /* chop off [t, 1] part */
5914 ASSERT(t
>= 0.0 && t
<= 1.0);
5916 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5917 *srcX1
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5919 else if (*dstX0
> maxValue
) {
5920 /* X0 outside right edge */
5921 ASSERT(*dstX1
< maxValue
); /* X1 should be inside right edge */
5922 t
= (GLfloat
) (maxValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5923 /* chop off [t, 1] part */
5924 ASSERT(t
>= 0.0 && t
<= 1.0);
5926 bias
= (*srcX0
< *srcX1
) ? -0.5F
: 0.5F
;
5927 *srcX0
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5933 * Clip dst coords against Xmin (or Ymin).
5936 clip_left_or_bottom(GLint
*srcX0
, GLint
*srcX1
,
5937 GLint
*dstX0
, GLint
*dstX1
,
5942 if (*dstX0
< minValue
) {
5943 /* X0 outside left edge */
5944 ASSERT(*dstX1
> minValue
); /* X1 should be inside left edge */
5945 t
= (GLfloat
) (minValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5946 /* chop off [0, t] part */
5947 ASSERT(t
>= 0.0 && t
<= 1.0);
5949 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
; /* flipped??? */
5950 *srcX0
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5952 else if (*dstX1
< minValue
) {
5953 /* X1 outside left edge */
5954 ASSERT(*dstX0
> minValue
); /* X0 should be inside left edge */
5955 t
= (GLfloat
) (minValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5956 /* chop off [0, t] part */
5957 ASSERT(t
>= 0.0 && t
<= 1.0);
5959 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5960 *srcX1
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5966 * Do clipping of blit src/dest rectangles.
5967 * The dest rect is clipped against both the buffer bounds and scissor bounds.
5968 * The src rect is just clipped against the buffer bounds.
5970 * When either the src or dest rect is clipped, the other is also clipped
5973 * Note that X0 need not be less than X1 (same for Y) for either the source
5974 * and dest rects. That makes the clipping a little trickier.
5976 * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
5979 _mesa_clip_blit(GLcontext
*ctx
,
5980 GLint
*srcX0
, GLint
*srcY0
, GLint
*srcX1
, GLint
*srcY1
,
5981 GLint
*dstX0
, GLint
*dstY0
, GLint
*dstX1
, GLint
*dstY1
)
5983 const GLint srcXmin
= 0;
5984 const GLint srcXmax
= ctx
->ReadBuffer
->Width
;
5985 const GLint srcYmin
= 0;
5986 const GLint srcYmax
= ctx
->ReadBuffer
->Height
;
5988 /* these include scissor bounds */
5989 const GLint dstXmin
= ctx
->DrawBuffer
->_Xmin
;
5990 const GLint dstXmax
= ctx
->DrawBuffer
->_Xmax
;
5991 const GLint dstYmin
= ctx
->DrawBuffer
->_Ymin
;
5992 const GLint dstYmax
= ctx
->DrawBuffer
->_Ymax
;
5995 printf("PreClipX: src: %d .. %d dst: %d .. %d\n",
5996 *srcX0, *srcX1, *dstX0, *dstX1);
5997 printf("PreClipY: src: %d .. %d dst: %d .. %d\n",
5998 *srcY0, *srcY1, *dstY0, *dstY1);
6001 /* trivial rejection tests */
6002 if (*dstX0
== *dstX1
)
6003 return GL_FALSE
; /* no width */
6004 if (*dstX0
<= dstXmin
&& *dstX1
<= dstXmin
)
6005 return GL_FALSE
; /* totally out (left) of bounds */
6006 if (*dstX0
>= dstXmax
&& *dstX1
>= dstXmax
)
6007 return GL_FALSE
; /* totally out (right) of bounds */
6009 if (*dstY0
== *dstY1
)
6011 if (*dstY0
<= dstYmin
&& *dstY1
<= dstYmin
)
6013 if (*dstY0
>= dstYmax
&& *dstY1
>= dstYmax
)
6016 if (*srcX0
== *srcX1
)
6018 if (*srcX0
<= srcXmin
&& *srcX1
<= srcXmin
)
6020 if (*srcX0
>= srcXmax
&& *srcX1
>= srcXmax
)
6023 if (*srcY0
== *srcY1
)
6025 if (*srcY0
<= srcYmin
&& *srcY1
<= srcYmin
)
6027 if (*srcY0
>= srcYmax
&& *srcY1
>= srcYmax
)
6033 clip_right_or_top(srcX0
, srcX1
, dstX0
, dstX1
, dstXmax
);
6034 clip_right_or_top(srcY0
, srcY1
, dstY0
, dstY1
, dstYmax
);
6035 clip_left_or_bottom(srcX0
, srcX1
, dstX0
, dstX1
, dstXmin
);
6036 clip_left_or_bottom(srcY0
, srcY1
, dstY0
, dstY1
, dstYmin
);
6039 * src clip (just swap src/dst values from above)
6041 clip_right_or_top(dstX0
, dstX1
, srcX0
, srcX1
, srcXmax
);
6042 clip_right_or_top(dstY0
, dstY1
, srcY0
, srcY1
, srcYmax
);
6043 clip_left_or_bottom(dstX0
, dstX1
, srcX0
, srcX1
, srcXmin
);
6044 clip_left_or_bottom(dstY0
, dstY1
, srcY0
, srcY1
, srcYmin
);
6047 printf("PostClipX: src: %d .. %d dst: %d .. %d\n",
6048 *srcX0, *srcX1, *dstX0, *dstX1);
6049 printf("PostClipY: src: %d .. %d dst: %d .. %d\n",
6050 *srcY0, *srcY1, *dstY0, *dstY1);
6053 ASSERT(*dstX0
>= dstXmin
);
6054 ASSERT(*dstX0
<= dstXmax
);
6055 ASSERT(*dstX1
>= dstXmin
);
6056 ASSERT(*dstX1
<= dstXmax
);
6058 ASSERT(*dstY0
>= dstYmin
);
6059 ASSERT(*dstY0
<= dstYmax
);
6060 ASSERT(*dstY1
>= dstYmin
);
6061 ASSERT(*dstY1
<= dstYmax
);
6063 ASSERT(*srcX0
>= srcXmin
);
6064 ASSERT(*srcX0
<= srcXmax
);
6065 ASSERT(*srcX1
>= srcXmin
);
6066 ASSERT(*srcX1
<= srcXmax
);
6068 ASSERT(*srcY0
>= srcYmin
);
6069 ASSERT(*srcY0
<= srcYmax
);
6070 ASSERT(*srcY1
>= srcYmin
);
6071 ASSERT(*srcY1
<= srcYmax
);