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.
43 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
44 * we later convert the float to a packed integer value (such as for
45 * GL_RGB5_A1) because we'll wind up with a non-zero value.
47 * We redefine the macros here so zero is handled correctly.
50 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
53 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
57 /** Compute ceiling of integer quotient of A divided by B. */
58 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
62 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
65 _mesa_type_is_packed(GLenum type
)
68 case GL_UNSIGNED_BYTE_3_3_2
:
69 case GL_UNSIGNED_BYTE_2_3_3_REV
:
70 case GL_UNSIGNED_SHORT_5_6_5
:
71 case GL_UNSIGNED_SHORT_5_6_5_REV
:
72 case GL_UNSIGNED_SHORT_4_4_4_4
:
73 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
74 case GL_UNSIGNED_SHORT_5_5_5_1
:
75 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
76 case GL_UNSIGNED_INT_8_8_8_8
:
77 case GL_UNSIGNED_INT_8_8_8_8_REV
:
78 case GL_UNSIGNED_INT_10_10_10_2
:
79 case GL_UNSIGNED_INT_2_10_10_10_REV
:
80 case GL_UNSIGNED_SHORT_8_8_MESA
:
81 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
82 case GL_UNSIGNED_INT_24_8_EXT
:
90 * Flip the 8 bits in each byte of the given array.
93 * \param n number of bytes.
95 * \todo try this trick to flip bytes someday:
97 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
98 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
99 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
103 flip_bytes( GLubyte
*p
, GLuint n
)
106 for (i
= 0; i
< n
; i
++) {
107 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
108 a
= ((b
& 0x01) << 7) |
122 * Flip the order of the 2 bytes in each word in the given array.
125 * \param n number of words.
128 _mesa_swap2( GLushort
*p
, GLuint n
)
131 for (i
= 0; i
< n
; i
++) {
132 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
139 * Flip the order of the 4 bytes in each word in the given array.
142 _mesa_swap4( GLuint
*p
, GLuint n
)
145 for (i
= 0; i
< n
; i
++) {
148 | ((b
>> 8) & 0xff00)
149 | ((b
<< 8) & 0xff0000)
150 | ((b
<< 24) & 0xff000000);
157 * Get the size of a GL data type.
159 * \param type GL data type.
161 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
162 * if an invalid type enum.
165 _mesa_sizeof_type( GLenum type
)
170 case GL_UNSIGNED_BYTE
:
171 return sizeof(GLubyte
);
173 return sizeof(GLbyte
);
174 case GL_UNSIGNED_SHORT
:
175 return sizeof(GLushort
);
177 return sizeof(GLshort
);
178 case GL_UNSIGNED_INT
:
179 return sizeof(GLuint
);
181 return sizeof(GLint
);
183 return sizeof(GLfloat
);
185 return sizeof(GLdouble
);
186 case GL_HALF_FLOAT_ARB
:
187 return sizeof(GLhalfARB
);
195 * Same as _mesa_sizeof_type() but also accepting the packed pixel
199 _mesa_sizeof_packed_type( GLenum type
)
204 case GL_UNSIGNED_BYTE
:
205 return sizeof(GLubyte
);
207 return sizeof(GLbyte
);
208 case GL_UNSIGNED_SHORT
:
209 return sizeof(GLushort
);
211 return sizeof(GLshort
);
212 case GL_UNSIGNED_INT
:
213 return sizeof(GLuint
);
215 return sizeof(GLint
);
216 case GL_HALF_FLOAT_ARB
:
217 return sizeof(GLhalfARB
);
219 return sizeof(GLfloat
);
220 case GL_UNSIGNED_BYTE_3_3_2
:
221 return sizeof(GLubyte
);
222 case GL_UNSIGNED_BYTE_2_3_3_REV
:
223 return sizeof(GLubyte
);
224 case GL_UNSIGNED_SHORT_5_6_5
:
225 return sizeof(GLushort
);
226 case GL_UNSIGNED_SHORT_5_6_5_REV
:
227 return sizeof(GLushort
);
228 case GL_UNSIGNED_SHORT_4_4_4_4
:
229 return sizeof(GLushort
);
230 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
231 return sizeof(GLushort
);
232 case GL_UNSIGNED_SHORT_5_5_5_1
:
233 return sizeof(GLushort
);
234 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
235 return sizeof(GLushort
);
236 case GL_UNSIGNED_INT_8_8_8_8
:
237 return sizeof(GLuint
);
238 case GL_UNSIGNED_INT_8_8_8_8_REV
:
239 return sizeof(GLuint
);
240 case GL_UNSIGNED_INT_10_10_10_2
:
241 return sizeof(GLuint
);
242 case GL_UNSIGNED_INT_2_10_10_10_REV
:
243 return sizeof(GLuint
);
244 case GL_UNSIGNED_SHORT_8_8_MESA
:
245 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
246 return sizeof(GLushort
);
247 case GL_UNSIGNED_INT_24_8_EXT
:
248 return sizeof(GLuint
);
256 * Get the number of components in a pixel format.
258 * \param format pixel format.
260 * \return the number of components in the given format, or -1 if a bad format.
263 _mesa_components_in_format( GLenum format
)
267 case GL_COLOR_INDEX1_EXT
:
268 case GL_COLOR_INDEX2_EXT
:
269 case GL_COLOR_INDEX4_EXT
:
270 case GL_COLOR_INDEX8_EXT
:
271 case GL_COLOR_INDEX12_EXT
:
272 case GL_COLOR_INDEX16_EXT
:
273 case GL_STENCIL_INDEX
:
274 case GL_DEPTH_COMPONENT
:
276 case GL_RED_INTEGER_EXT
:
278 case GL_GREEN_INTEGER_EXT
:
280 case GL_BLUE_INTEGER_EXT
:
282 case GL_ALPHA_INTEGER_EXT
:
284 case GL_LUMINANCE_INTEGER_EXT
:
287 case GL_LUMINANCE_ALPHA
:
288 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
;
447 if (!ctx
->Extensions
.ARB_texture_rg
)
452 case GL_UNSIGNED_BYTE
:
454 case GL_UNSIGNED_SHORT
:
456 case GL_UNSIGNED_INT
:
459 case GL_HALF_FLOAT_ARB
:
460 return ctx
->Extensions
.ARB_half_float_pixel
;
467 case GL_UNSIGNED_BYTE
:
469 case GL_UNSIGNED_SHORT
:
471 case GL_UNSIGNED_INT
:
473 case GL_UNSIGNED_BYTE_3_3_2
:
474 case GL_UNSIGNED_BYTE_2_3_3_REV
:
475 case GL_UNSIGNED_SHORT_5_6_5
:
476 case GL_UNSIGNED_SHORT_5_6_5_REV
:
478 case GL_HALF_FLOAT_ARB
:
479 return ctx
->Extensions
.ARB_half_float_pixel
;
485 /* NOTE: no packed types are supported with BGR. That's
486 * intentional, according to the GL spec.
489 case GL_UNSIGNED_BYTE
:
491 case GL_UNSIGNED_SHORT
:
493 case GL_UNSIGNED_INT
:
496 case GL_HALF_FLOAT_ARB
:
497 return ctx
->Extensions
.ARB_half_float_pixel
;
506 case GL_UNSIGNED_BYTE
:
508 case GL_UNSIGNED_SHORT
:
510 case GL_UNSIGNED_INT
:
512 case GL_UNSIGNED_SHORT_4_4_4_4
:
513 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
514 case GL_UNSIGNED_SHORT_5_5_5_1
:
515 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
516 case GL_UNSIGNED_INT_8_8_8_8
:
517 case GL_UNSIGNED_INT_8_8_8_8_REV
:
518 case GL_UNSIGNED_INT_10_10_10_2
:
519 case GL_UNSIGNED_INT_2_10_10_10_REV
:
521 case GL_HALF_FLOAT_ARB
:
522 return ctx
->Extensions
.ARB_half_float_pixel
;
527 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
||
528 type
== GL_UNSIGNED_SHORT_8_8_REV_MESA
)
532 case GL_DEPTH_STENCIL_EXT
:
533 if (ctx
->Extensions
.EXT_packed_depth_stencil
534 && type
== GL_UNSIGNED_INT_24_8_EXT
)
542 case GL_UNSIGNED_BYTE
:
544 case GL_UNSIGNED_SHORT
:
546 case GL_UNSIGNED_INT
:
552 case GL_RED_INTEGER_EXT
:
553 case GL_GREEN_INTEGER_EXT
:
554 case GL_BLUE_INTEGER_EXT
:
555 case GL_ALPHA_INTEGER_EXT
:
556 case GL_RGB_INTEGER_EXT
:
557 case GL_RGBA_INTEGER_EXT
:
558 case GL_BGR_INTEGER_EXT
:
559 case GL_BGRA_INTEGER_EXT
:
560 case GL_LUMINANCE_INTEGER_EXT
:
561 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
564 case GL_UNSIGNED_BYTE
:
566 case GL_UNSIGNED_SHORT
:
568 case GL_UNSIGNED_INT
:
569 return ctx
->Extensions
.EXT_texture_integer
;
582 * Test if the given image format is a color/RGBA format (i.e., not color
583 * index, depth, stencil, etc).
584 * \param format the image format value (may by an internal texture format)
585 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
588 _mesa_is_color_format(GLenum format
)
606 case GL_LUMINANCE_ALPHA
:
607 case GL_LUMINANCE4_ALPHA4
:
608 case GL_LUMINANCE6_ALPHA2
:
609 case GL_LUMINANCE8_ALPHA8
:
610 case GL_LUMINANCE12_ALPHA4
:
611 case GL_LUMINANCE12_ALPHA12
:
612 case GL_LUMINANCE16_ALPHA16
:
644 /* float texture formats */
645 case GL_ALPHA16F_ARB
:
646 case GL_ALPHA32F_ARB
:
647 case GL_LUMINANCE16F_ARB
:
648 case GL_LUMINANCE32F_ARB
:
649 case GL_LUMINANCE_ALPHA16F_ARB
:
650 case GL_LUMINANCE_ALPHA32F_ARB
:
651 case GL_INTENSITY16F_ARB
:
652 case GL_INTENSITY32F_ARB
:
661 /* compressed formats */
662 case GL_COMPRESSED_ALPHA
:
663 case GL_COMPRESSED_LUMINANCE
:
664 case GL_COMPRESSED_LUMINANCE_ALPHA
:
665 case GL_COMPRESSED_INTENSITY
:
666 case GL_COMPRESSED_RGB
:
667 case GL_COMPRESSED_RGBA
:
672 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
673 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
674 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
675 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
676 case GL_COMPRESSED_RGB_FXT1_3DFX
:
677 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
678 #if FEATURE_EXT_texture_sRGB
681 case GL_SRGB_ALPHA_EXT
:
682 case GL_SRGB8_ALPHA8_EXT
:
683 case GL_SLUMINANCE_ALPHA_EXT
:
684 case GL_SLUMINANCE8_ALPHA8_EXT
:
685 case GL_SLUMINANCE_EXT
:
686 case GL_SLUMINANCE8_EXT
:
687 case GL_COMPRESSED_SRGB_EXT
:
688 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
689 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
690 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
691 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
692 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
693 case GL_COMPRESSED_SLUMINANCE_EXT
:
694 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
695 #endif /* FEATURE_EXT_texture_sRGB */
697 /* signed texture formats */
701 case GL_YCBCR_MESA
: /* not considered to be RGB */
710 * Test if the given image format is a color index format.
713 _mesa_is_index_format(GLenum format
)
717 case GL_COLOR_INDEX1_EXT
:
718 case GL_COLOR_INDEX2_EXT
:
719 case GL_COLOR_INDEX4_EXT
:
720 case GL_COLOR_INDEX8_EXT
:
721 case GL_COLOR_INDEX12_EXT
:
722 case GL_COLOR_INDEX16_EXT
:
731 * Test if the given image format is a depth component format.
734 _mesa_is_depth_format(GLenum format
)
737 case GL_DEPTH_COMPONENT
:
738 case GL_DEPTH_COMPONENT16
:
739 case GL_DEPTH_COMPONENT24
:
740 case GL_DEPTH_COMPONENT32
:
749 * Test if the given image format is a stencil format.
752 _mesa_is_stencil_format(GLenum format
)
755 case GL_STENCIL_INDEX
:
756 case GL_DEPTH_STENCIL
:
765 * Test if the given image format is a YCbCr format.
768 _mesa_is_ycbcr_format(GLenum format
)
780 * Test if the given image format is a depth+stencil format.
783 _mesa_is_depthstencil_format(GLenum format
)
786 case GL_DEPTH24_STENCIL8_EXT
:
787 case GL_DEPTH_STENCIL_EXT
:
796 * Test if the given image format is a depth or stencil format.
799 _mesa_is_depth_or_stencil_format(GLenum format
)
802 case GL_DEPTH_COMPONENT
:
803 case GL_DEPTH_COMPONENT16
:
804 case GL_DEPTH_COMPONENT24
:
805 case GL_DEPTH_COMPONENT32
:
806 case GL_STENCIL_INDEX
:
807 case GL_STENCIL_INDEX1_EXT
:
808 case GL_STENCIL_INDEX4_EXT
:
809 case GL_STENCIL_INDEX8_EXT
:
810 case GL_STENCIL_INDEX16_EXT
:
811 case GL_DEPTH_STENCIL_EXT
:
812 case GL_DEPTH24_STENCIL8_EXT
:
821 * Test if the given image format is a dudv format.
824 _mesa_is_dudv_format(GLenum format
)
837 * Test if the given format is an integer (non-normalized) format.
840 _mesa_is_integer_format(GLenum format
)
843 case GL_RED_INTEGER_EXT
:
844 case GL_GREEN_INTEGER_EXT
:
845 case GL_BLUE_INTEGER_EXT
:
846 case GL_ALPHA_INTEGER_EXT
:
847 case GL_RGB_INTEGER_EXT
:
848 case GL_RGBA_INTEGER_EXT
:
849 case GL_BGR_INTEGER_EXT
:
850 case GL_BGRA_INTEGER_EXT
:
851 case GL_LUMINANCE_INTEGER_EXT
:
852 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
861 * Test if an image format is a supported compressed format.
862 * \param format the internal format token provided by the user.
863 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
866 _mesa_is_compressed_format(GLcontext
*ctx
, GLenum format
)
869 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
870 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
871 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
872 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
873 return ctx
->Extensions
.EXT_texture_compression_s3tc
;
878 return ctx
->Extensions
.S3_s3tc
;
879 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
880 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
881 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
882 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
883 return ctx
->Extensions
.EXT_texture_sRGB
884 && ctx
->Extensions
.EXT_texture_compression_s3tc
;
885 case GL_COMPRESSED_RGB_FXT1_3DFX
:
886 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
887 return ctx
->Extensions
.TDFX_texture_compression_FXT1
;
895 * Return the address of a specific pixel in an image (1D, 2D or 3D).
897 * Pixel unpacking/packing parameters are observed according to \p packing.
899 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
900 * \param image starting address of image data
901 * \param width the image width
902 * \param height theimage height
903 * \param format the pixel format
904 * \param type the pixel data type
905 * \param packing the pixelstore attributes
906 * \param img which image in the volume (0 for 1D or 2D images)
907 * \param row row of pixel in the image (0 for 1D images)
908 * \param column column of pixel in the image
910 * \return address of pixel on success, or NULL on error.
912 * \sa gl_pixelstore_attrib.
915 _mesa_image_address( GLuint dimensions
,
916 const struct gl_pixelstore_attrib
*packing
,
918 GLsizei width
, GLsizei height
,
919 GLenum format
, GLenum type
,
920 GLint img
, GLint row
, GLint column
)
922 GLint alignment
; /* 1, 2 or 4 */
923 GLint pixels_per_row
;
924 GLint rows_per_image
;
927 GLint skipimages
; /* for 3-D volume images */
930 ASSERT(dimensions
>= 1 && dimensions
<= 3);
932 alignment
= packing
->Alignment
;
933 if (packing
->RowLength
> 0) {
934 pixels_per_row
= packing
->RowLength
;
937 pixels_per_row
= width
;
939 if (packing
->ImageHeight
> 0) {
940 rows_per_image
= packing
->ImageHeight
;
943 rows_per_image
= height
;
946 skippixels
= packing
->SkipPixels
;
947 /* Note: SKIP_ROWS _is_ used for 1D images */
948 skiprows
= packing
->SkipRows
;
949 /* Note: SKIP_IMAGES is only used for 3D images */
950 skipimages
= (dimensions
== 3) ? packing
->SkipImages
: 0;
952 if (type
== GL_BITMAP
) {
954 GLint comp_per_pixel
; /* components per pixel */
955 GLint bytes_per_comp
; /* bytes per component */
957 GLint bytes_per_image
;
959 /* Compute bytes per component */
960 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
961 if (bytes_per_comp
< 0) {
965 /* Compute number of components per pixel */
966 comp_per_pixel
= _mesa_components_in_format( format
);
967 if (comp_per_pixel
< 0) {
971 bytes_per_row
= alignment
972 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
974 bytes_per_image
= bytes_per_row
* rows_per_image
;
976 pixel_addr
= (GLubyte
*) image
977 + (skipimages
+ img
) * bytes_per_image
978 + (skiprows
+ row
) * bytes_per_row
979 + (skippixels
+ column
) / 8;
982 /* Non-BITMAP data */
983 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
986 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
988 /* The pixel type and format should have been error checked earlier */
989 assert(bytes_per_pixel
> 0);
991 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
992 remainder
= bytes_per_row
% alignment
;
994 bytes_per_row
+= (alignment
- remainder
);
996 ASSERT(bytes_per_row
% alignment
== 0);
998 bytes_per_image
= bytes_per_row
* rows_per_image
;
1000 if (packing
->Invert
) {
1001 /* set pixel_addr to the last row */
1002 topOfImage
= bytes_per_row
* (height
- 1);
1003 bytes_per_row
= -bytes_per_row
;
1009 /* compute final pixel address */
1010 pixel_addr
= (GLubyte
*) image
1011 + (skipimages
+ img
) * bytes_per_image
1013 + (skiprows
+ row
) * bytes_per_row
1014 + (skippixels
+ column
) * bytes_per_pixel
;
1017 return (GLvoid
*) pixel_addr
;
1022 _mesa_image_address1d( const struct gl_pixelstore_attrib
*packing
,
1023 const GLvoid
*image
,
1025 GLenum format
, GLenum type
,
1028 return _mesa_image_address(1, packing
, image
, width
, 1,
1029 format
, type
, 0, 0, column
);
1034 _mesa_image_address2d( const struct gl_pixelstore_attrib
*packing
,
1035 const GLvoid
*image
,
1036 GLsizei width
, GLsizei height
,
1037 GLenum format
, GLenum type
,
1038 GLint row
, GLint column
)
1040 return _mesa_image_address(2, packing
, image
, width
, height
,
1041 format
, type
, 0, row
, column
);
1046 _mesa_image_address3d( const struct gl_pixelstore_attrib
*packing
,
1047 const GLvoid
*image
,
1048 GLsizei width
, GLsizei height
,
1049 GLenum format
, GLenum type
,
1050 GLint img
, GLint row
, GLint column
)
1052 return _mesa_image_address(3, packing
, image
, width
, height
,
1053 format
, type
, img
, row
, column
);
1059 * Compute the stride (in bytes) between image rows.
1061 * \param packing the pixelstore attributes
1062 * \param width image width.
1063 * \param format pixel format.
1064 * \param type pixel data type.
1066 * \return the stride in bytes for the given parameters, or -1 if error
1069 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
1070 GLint width
, GLenum format
, GLenum type
)
1072 GLint bytesPerRow
, remainder
;
1076 if (type
== GL_BITMAP
) {
1077 if (packing
->RowLength
== 0) {
1078 bytesPerRow
= (width
+ 7) / 8;
1081 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1085 /* Non-BITMAP data */
1086 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1087 if (bytesPerPixel
<= 0)
1088 return -1; /* error */
1089 if (packing
->RowLength
== 0) {
1090 bytesPerRow
= bytesPerPixel
* width
;
1093 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1097 remainder
= bytesPerRow
% packing
->Alignment
;
1098 if (remainder
> 0) {
1099 bytesPerRow
+= (packing
->Alignment
- remainder
);
1102 if (packing
->Invert
) {
1103 /* negate the bytes per row (negative row stride) */
1104 bytesPerRow
= -bytesPerRow
;
1114 * Compute the stride between images in a 3D texture (in bytes) for the given
1115 * pixel packing parameters and image width, format and type.
1118 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
1119 GLint width
, GLint height
,
1120 GLenum format
, GLenum type
)
1122 GLint bytesPerRow
, bytesPerImage
, remainder
;
1126 if (type
== GL_BITMAP
) {
1127 if (packing
->RowLength
== 0) {
1128 bytesPerRow
= (width
+ 7) / 8;
1131 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1135 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1137 if (bytesPerPixel
<= 0)
1138 return -1; /* error */
1139 if (packing
->RowLength
== 0) {
1140 bytesPerRow
= bytesPerPixel
* width
;
1143 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1147 remainder
= bytesPerRow
% packing
->Alignment
;
1149 bytesPerRow
+= (packing
->Alignment
- remainder
);
1151 if (packing
->ImageHeight
== 0)
1152 bytesPerImage
= bytesPerRow
* height
;
1154 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
1156 return bytesPerImage
;
1161 * Unpack a 32x32 pixel polygon stipple from user memory using the
1162 * current pixel unpack settings.
1165 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
1166 const struct gl_pixelstore_attrib
*unpacking
)
1168 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
1170 /* Convert pattern from GLubytes to GLuints and handle big/little
1171 * endian differences
1175 for (i
= 0; i
< 32; i
++) {
1176 dest
[i
] = (p
[0] << 24)
1188 * Pack polygon stipple into user memory given current pixel packing
1192 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
1193 const struct gl_pixelstore_attrib
*packing
)
1195 /* Convert pattern from GLuints to GLubytes to handle big/little
1196 * endian differences.
1200 for (i
= 0; i
< 32; i
++) {
1201 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
1202 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
1203 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
1204 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
1207 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
1212 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
1213 * order with row alignment = 1 byte.
1216 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
1217 const struct gl_pixelstore_attrib
*packing
)
1219 GLint bytes
, row
, width_in_bytes
;
1220 GLubyte
*buffer
, *dst
;
1225 /* Alloc dest storage */
1226 bytes
= ((width
+ 7) / 8 * height
);
1227 buffer
= (GLubyte
*) malloc( bytes
);
1231 width_in_bytes
= CEILING( width
, 8 );
1233 for (row
= 0; row
< height
; row
++) {
1234 const GLubyte
*src
= (const GLubyte
*)
1235 _mesa_image_address2d(packing
, pixels
, width
, height
,
1236 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1242 if ((packing
->SkipPixels
& 7) == 0) {
1243 memcpy( dst
, src
, width_in_bytes
);
1244 if (packing
->LsbFirst
) {
1245 flip_bytes( dst
, width_in_bytes
);
1249 /* handling SkipPixels is a bit tricky (no pun intended!) */
1251 if (packing
->LsbFirst
) {
1252 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
1253 GLubyte dstMask
= 128;
1254 const GLubyte
*s
= src
;
1257 for (i
= 0; i
< width
; i
++) {
1261 if (srcMask
== 128) {
1266 srcMask
= srcMask
<< 1;
1274 dstMask
= dstMask
>> 1;
1279 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
1280 GLubyte dstMask
= 128;
1281 const GLubyte
*s
= src
;
1284 for (i
= 0; i
< width
; i
++) {
1293 srcMask
= srcMask
>> 1;
1301 dstMask
= dstMask
>> 1;
1306 dst
+= width_in_bytes
;
1317 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
1318 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
1320 GLint row
, width_in_bytes
;
1326 width_in_bytes
= CEILING( width
, 8 );
1328 for (row
= 0; row
< height
; row
++) {
1329 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
1330 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1334 if ((packing
->SkipPixels
& 7) == 0) {
1335 memcpy( dst
, src
, width_in_bytes
);
1336 if (packing
->LsbFirst
) {
1337 flip_bytes( dst
, width_in_bytes
);
1341 /* handling SkipPixels is a bit tricky (no pun intended!) */
1343 if (packing
->LsbFirst
) {
1344 GLubyte srcMask
= 128;
1345 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
1346 const GLubyte
*s
= src
;
1349 for (i
= 0; i
< width
; i
++) {
1358 srcMask
= srcMask
>> 1;
1360 if (dstMask
== 128) {
1366 dstMask
= dstMask
<< 1;
1371 GLubyte srcMask
= 128;
1372 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
1373 const GLubyte
*s
= src
;
1376 for (i
= 0; i
< width
; i
++) {
1385 srcMask
= srcMask
>> 1;
1393 dstMask
= dstMask
>> 1;
1398 src
+= width_in_bytes
;
1404 * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1405 * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1406 * "On" bits will set texels to \p onValue.
1407 * "Off" bits will not modify texels.
1408 * \param width src bitmap width in pixels
1409 * \param height src bitmap height in pixels
1410 * \param unpack bitmap unpacking state
1411 * \param bitmap the src bitmap data
1412 * \param destBuffer start of dest buffer
1413 * \param destStride row stride in dest buffer
1414 * \param onValue if bit is 1, set destBuffer pixel to this value
1417 _mesa_expand_bitmap(GLsizei width
, GLsizei height
,
1418 const struct gl_pixelstore_attrib
*unpack
,
1419 const GLubyte
*bitmap
,
1420 GLubyte
*destBuffer
, GLint destStride
,
1423 const GLubyte
*srcRow
= (const GLubyte
*)
1424 _mesa_image_address2d(unpack
, bitmap
, width
, height
,
1425 GL_COLOR_INDEX
, GL_BITMAP
, 0, 0);
1426 const GLint srcStride
= _mesa_image_row_stride(unpack
, width
,
1427 GL_COLOR_INDEX
, GL_BITMAP
);
1430 #define SET_PIXEL(COL, ROW) \
1431 destBuffer[(ROW) * destStride + (COL)] = onValue;
1433 for (row
= 0; row
< height
; row
++) {
1434 const GLubyte
*src
= srcRow
;
1436 if (unpack
->LsbFirst
) {
1438 GLubyte mask
= 1U << (unpack
->SkipPixels
& 0x7);
1439 for (col
= 0; col
< width
; col
++) {
1442 SET_PIXEL(col
, row
);
1454 /* get ready for next row */
1460 GLubyte mask
= 128U >> (unpack
->SkipPixels
& 0x7);
1461 for (col
= 0; col
< width
; col
++) {
1464 SET_PIXEL(col
, row
);
1476 /* get ready for next row */
1481 srcRow
+= srcStride
;
1488 /**********************************************************************/
1489 /***** Pixel processing functions ******/
1490 /**********************************************************************/
1493 * Apply scale and bias factors to an array of RGBA pixels.
1496 _mesa_scale_and_bias_rgba(GLuint n
, GLfloat rgba
[][4],
1497 GLfloat rScale
, GLfloat gScale
,
1498 GLfloat bScale
, GLfloat aScale
,
1499 GLfloat rBias
, GLfloat gBias
,
1500 GLfloat bBias
, GLfloat aBias
)
1502 if (rScale
!= 1.0 || rBias
!= 0.0) {
1504 for (i
= 0; i
< n
; i
++) {
1505 rgba
[i
][RCOMP
] = rgba
[i
][RCOMP
] * rScale
+ rBias
;
1508 if (gScale
!= 1.0 || gBias
!= 0.0) {
1510 for (i
= 0; i
< n
; i
++) {
1511 rgba
[i
][GCOMP
] = rgba
[i
][GCOMP
] * gScale
+ gBias
;
1514 if (bScale
!= 1.0 || bBias
!= 0.0) {
1516 for (i
= 0; i
< n
; i
++) {
1517 rgba
[i
][BCOMP
] = rgba
[i
][BCOMP
] * bScale
+ bBias
;
1520 if (aScale
!= 1.0 || aBias
!= 0.0) {
1522 for (i
= 0; i
< n
; i
++) {
1523 rgba
[i
][ACOMP
] = rgba
[i
][ACOMP
] * aScale
+ aBias
;
1530 * Apply pixel mapping to an array of floating point RGBA pixels.
1533 _mesa_map_rgba( const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4] )
1535 const GLfloat rscale
= (GLfloat
) (ctx
->PixelMaps
.RtoR
.Size
- 1);
1536 const GLfloat gscale
= (GLfloat
) (ctx
->PixelMaps
.GtoG
.Size
- 1);
1537 const GLfloat bscale
= (GLfloat
) (ctx
->PixelMaps
.BtoB
.Size
- 1);
1538 const GLfloat ascale
= (GLfloat
) (ctx
->PixelMaps
.AtoA
.Size
- 1);
1539 const GLfloat
*rMap
= ctx
->PixelMaps
.RtoR
.Map
;
1540 const GLfloat
*gMap
= ctx
->PixelMaps
.GtoG
.Map
;
1541 const GLfloat
*bMap
= ctx
->PixelMaps
.BtoB
.Map
;
1542 const GLfloat
*aMap
= ctx
->PixelMaps
.AtoA
.Map
;
1545 GLfloat r
= CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1546 GLfloat g
= CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1547 GLfloat b
= CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1548 GLfloat a
= CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1549 rgba
[i
][RCOMP
] = rMap
[IROUND(r
* rscale
)];
1550 rgba
[i
][GCOMP
] = gMap
[IROUND(g
* gscale
)];
1551 rgba
[i
][BCOMP
] = bMap
[IROUND(b
* bscale
)];
1552 rgba
[i
][ACOMP
] = aMap
[IROUND(a
* ascale
)];
1557 * Apply a color table lookup to an array of floating point RGBA colors.
1560 _mesa_lookup_rgba_float(const struct gl_color_table
*table
,
1561 GLuint n
, GLfloat rgba
[][4])
1563 const GLint max
= table
->Size
- 1;
1564 const GLfloat scale
= (GLfloat
) max
;
1565 const GLfloat
*lut
= table
->TableF
;
1568 if (!table
->TableF
|| table
->Size
== 0)
1571 switch (table
->_BaseFormat
) {
1573 /* replace RGBA with I */
1574 for (i
= 0; i
< n
; i
++) {
1575 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1576 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1584 /* replace RGB with L */
1585 for (i
= 0; i
< n
; i
++) {
1586 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1587 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1594 /* replace A with A */
1595 for (i
= 0; i
< n
; i
++) {
1596 GLint j
= IROUND(rgba
[i
][ACOMP
] * scale
);
1597 rgba
[i
][ACOMP
] = lut
[CLAMP(j
, 0, max
)];
1600 case GL_LUMINANCE_ALPHA
:
1601 /* replace RGBA with LLLA */
1602 for (i
= 0; i
< n
; i
++) {
1603 GLint jL
= IROUND(rgba
[i
][RCOMP
] * scale
);
1604 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1605 GLfloat luminance
, alpha
;
1606 jL
= CLAMP(jL
, 0, max
);
1607 jA
= CLAMP(jA
, 0, max
);
1608 luminance
= lut
[jL
* 2 + 0];
1609 alpha
= lut
[jA
* 2 + 1];
1612 rgba
[i
][BCOMP
] = luminance
;
1613 rgba
[i
][ACOMP
] = alpha
;;
1617 /* replace RGB with RGB */
1618 for (i
= 0; i
< n
; i
++) {
1619 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1620 jR
= CLAMP(jR
, 0, max
);
1621 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1625 /* replace RG with RG */
1626 for (i
= 0; i
< n
; i
++) {
1627 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1628 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1629 jR
= CLAMP(jR
, 0, max
);
1630 jG
= CLAMP(jG
, 0, max
);
1631 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1632 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1636 /* replace RGB with RGB */
1637 for (i
= 0; i
< n
; i
++) {
1638 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1639 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1640 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1641 jR
= CLAMP(jR
, 0, max
);
1642 jG
= CLAMP(jG
, 0, max
);
1643 jB
= CLAMP(jB
, 0, max
);
1644 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1645 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1646 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1650 /* replace RGBA with RGBA */
1651 for (i
= 0; i
< n
; i
++) {
1652 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1653 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1654 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1655 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1656 jR
= CLAMP(jR
, 0, max
);
1657 jG
= CLAMP(jG
, 0, max
);
1658 jB
= CLAMP(jB
, 0, max
);
1659 jA
= CLAMP(jA
, 0, max
);
1660 rgba
[i
][RCOMP
] = lut
[jR
* 4 + 0];
1661 rgba
[i
][GCOMP
] = lut
[jG
* 4 + 1];
1662 rgba
[i
][BCOMP
] = lut
[jB
* 4 + 2];
1663 rgba
[i
][ACOMP
] = lut
[jA
* 4 + 3];
1667 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_float");
1675 * Apply a color table lookup to an array of ubyte/RGBA colors.
1678 _mesa_lookup_rgba_ubyte(const struct gl_color_table
*table
,
1679 GLuint n
, GLubyte rgba
[][4])
1681 const GLubyte
*lut
= table
->TableUB
;
1682 const GLfloat scale
= (GLfloat
) (table
->Size
- 1) / (GLfloat
)255.0;
1685 if (!table
->TableUB
|| table
->Size
== 0)
1688 switch (table
->_BaseFormat
) {
1690 /* replace RGBA with I */
1691 if (table
->Size
== 256) {
1692 for (i
= 0; i
< n
; i
++) {
1693 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1701 for (i
= 0; i
< n
; i
++) {
1702 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1706 rgba
[i
][ACOMP
] = lut
[j
];
1711 /* replace RGB with L */
1712 if (table
->Size
== 256) {
1713 for (i
= 0; i
< n
; i
++) {
1714 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1721 for (i
= 0; i
< n
; i
++) {
1722 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1725 rgba
[i
][BCOMP
] = lut
[j
];
1730 /* replace A with A */
1731 if (table
->Size
== 256) {
1732 for (i
= 0; i
< n
; i
++) {
1733 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
]];
1737 for (i
= 0; i
< n
; i
++) {
1738 GLint j
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1739 rgba
[i
][ACOMP
] = lut
[j
];
1743 case GL_LUMINANCE_ALPHA
:
1744 /* replace RGBA with LLLA */
1745 if (table
->Size
== 256) {
1746 for (i
= 0; i
< n
; i
++) {
1747 GLubyte l
= lut
[rgba
[i
][RCOMP
] * 2 + 0];
1748 GLubyte a
= lut
[rgba
[i
][ACOMP
] * 2 + 1];;
1756 for (i
= 0; i
< n
; i
++) {
1757 GLint jL
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1758 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1759 GLubyte luminance
= lut
[jL
* 2 + 0];
1760 GLubyte alpha
= lut
[jA
* 2 + 1];
1763 rgba
[i
][BCOMP
] = luminance
;
1764 rgba
[i
][ACOMP
] = alpha
;
1769 if (table
->Size
== 256) {
1770 for (i
= 0; i
< n
; i
++) {
1771 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 3 + 0];
1772 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 3 + 1];
1773 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 3 + 2];
1777 for (i
= 0; i
< n
; i
++) {
1778 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1779 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1780 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1781 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1782 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1783 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1788 if (table
->Size
== 256) {
1789 for (i
= 0; i
< n
; i
++) {
1790 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 4 + 0];
1791 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 4 + 1];
1792 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 4 + 2];
1793 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
] * 4 + 3];
1797 for (i
= 0; i
< n
; i
++) {
1798 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1799 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1800 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1801 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1802 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][RCOMP
], lut
[jR
* 4 + 0]);
1803 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][GCOMP
], lut
[jG
* 4 + 1]);
1804 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][BCOMP
], lut
[jB
* 4 + 2]);
1805 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][ACOMP
], lut
[jA
* 4 + 3]);
1810 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_chan");
1818 * Map color indexes to float rgba values.
1821 _mesa_map_ci_to_rgba( const GLcontext
*ctx
, GLuint n
,
1822 const GLuint index
[], GLfloat rgba
[][4] )
1824 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1825 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1826 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1827 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1828 const GLfloat
*rMap
= ctx
->PixelMaps
.ItoR
.Map
;
1829 const GLfloat
*gMap
= ctx
->PixelMaps
.ItoG
.Map
;
1830 const GLfloat
*bMap
= ctx
->PixelMaps
.ItoB
.Map
;
1831 const GLfloat
*aMap
= ctx
->PixelMaps
.ItoA
.Map
;
1834 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1835 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1836 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1837 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1843 * Map ubyte color indexes to ubyte/RGBA values.
1846 _mesa_map_ci8_to_rgba8(const GLcontext
*ctx
, GLuint n
, const GLubyte index
[],
1849 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1850 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1851 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1852 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1853 const GLubyte
*rMap
= ctx
->PixelMaps
.ItoR
.Map8
;
1854 const GLubyte
*gMap
= ctx
->PixelMaps
.ItoG
.Map8
;
1855 const GLubyte
*bMap
= ctx
->PixelMaps
.ItoB
.Map8
;
1856 const GLubyte
*aMap
= ctx
->PixelMaps
.ItoA
.Map8
;
1859 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1860 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1861 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1862 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1868 _mesa_scale_and_bias_depth(const GLcontext
*ctx
, GLuint n
,
1869 GLfloat depthValues
[])
1871 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
1872 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
1874 for (i
= 0; i
< n
; i
++) {
1875 GLfloat d
= depthValues
[i
] * scale
+ bias
;
1876 depthValues
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
1882 _mesa_scale_and_bias_depth_uint(const GLcontext
*ctx
, GLuint n
,
1883 GLuint depthValues
[])
1885 const GLdouble max
= (double) 0xffffffff;
1886 const GLdouble scale
= ctx
->Pixel
.DepthScale
;
1887 const GLdouble bias
= ctx
->Pixel
.DepthBias
* max
;
1889 for (i
= 0; i
< n
; i
++) {
1890 GLdouble d
= (GLdouble
) depthValues
[i
] * scale
+ bias
;
1891 d
= CLAMP(d
, 0.0, max
);
1892 depthValues
[i
] = (GLuint
) d
;
1897 * Apply various pixel transfer operations to an array of RGBA pixels
1898 * as indicated by the transferOps bitmask
1901 _mesa_apply_rgba_transfer_ops(GLcontext
*ctx
, GLbitfield transferOps
,
1902 GLuint n
, GLfloat rgba
[][4])
1905 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
1906 _mesa_scale_and_bias_rgba(n
, rgba
,
1907 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
1908 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
1909 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
1910 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
1912 /* color map lookup */
1913 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1914 _mesa_map_rgba( ctx
, n
, rgba
);
1917 /* clamping to [0,1] */
1918 if (transferOps
& IMAGE_CLAMP_BIT
) {
1920 for (i
= 0; i
< n
; i
++) {
1921 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1922 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1923 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1924 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1931 * Apply color index shift and offset to an array of pixels.
1934 shift_and_offset_ci( const GLcontext
*ctx
, GLuint n
, GLuint indexes
[] )
1936 GLint shift
= ctx
->Pixel
.IndexShift
;
1937 GLint offset
= ctx
->Pixel
.IndexOffset
;
1941 indexes
[i
] = (indexes
[i
] << shift
) + offset
;
1944 else if (shift
< 0) {
1947 indexes
[i
] = (indexes
[i
] >> shift
) + offset
;
1952 indexes
[i
] = indexes
[i
] + offset
;
1960 * Apply color index shift, offset and table lookup to an array
1964 _mesa_apply_ci_transfer_ops(const GLcontext
*ctx
, GLbitfield transferOps
,
1965 GLuint n
, GLuint indexes
[])
1967 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
1968 shift_and_offset_ci(ctx
, n
, indexes
);
1970 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1971 const GLuint mask
= ctx
->PixelMaps
.ItoI
.Size
- 1;
1973 for (i
= 0; i
< n
; i
++) {
1974 const GLuint j
= indexes
[i
] & mask
;
1975 indexes
[i
] = IROUND(ctx
->PixelMaps
.ItoI
.Map
[j
]);
1982 * Apply stencil index shift, offset and table lookup to an array
1983 * of stencil values.
1986 _mesa_apply_stencil_transfer_ops(const GLcontext
*ctx
, GLuint n
,
1987 GLstencil stencil
[])
1989 if (ctx
->Pixel
.IndexShift
!= 0 || ctx
->Pixel
.IndexOffset
!= 0) {
1990 const GLint offset
= ctx
->Pixel
.IndexOffset
;
1991 GLint shift
= ctx
->Pixel
.IndexShift
;
1994 for (i
= 0; i
< n
; i
++) {
1995 stencil
[i
] = (stencil
[i
] << shift
) + offset
;
1998 else if (shift
< 0) {
2000 for (i
= 0; i
< n
; i
++) {
2001 stencil
[i
] = (stencil
[i
] >> shift
) + offset
;
2005 for (i
= 0; i
< n
; i
++) {
2006 stencil
[i
] = stencil
[i
] + offset
;
2010 if (ctx
->Pixel
.MapStencilFlag
) {
2011 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
2013 for (i
= 0; i
< n
; i
++) {
2014 stencil
[i
] = (GLstencil
)ctx
->PixelMaps
.StoS
.Map
[ stencil
[i
] & mask
];
2021 * Used to pack an array [][4] of RGBA float colors as specified
2022 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
2023 * Note: the rgba values will be modified by this function when any pixel
2024 * transfer ops are enabled.
2027 _mesa_pack_rgba_span_float(GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4],
2028 GLenum dstFormat
, GLenum dstType
,
2030 const struct gl_pixelstore_attrib
*dstPacking
,
2031 GLbitfield transferOps
)
2033 GLfloat luminance
[MAX_WIDTH
];
2034 const GLint comps
= _mesa_components_in_format(dstFormat
);
2038 * This test should probably go away. Have the caller set/clear the
2039 * IMAGE_CLAMP_BIT as needed.
2041 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
2042 /* need to clamp to [0, 1] */
2043 transferOps
|= IMAGE_CLAMP_BIT
;
2047 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
2050 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
2051 /* compute luminance values */
2052 if (transferOps
& IMAGE_CLAMP_BIT
) {
2053 for (i
= 0; i
< n
; i
++) {
2054 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2055 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
2059 for (i
= 0; i
< n
; i
++) {
2060 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2066 * Pack/store the pixels. Ugh! Lots of cases!!!
2069 case GL_UNSIGNED_BYTE
:
2071 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2072 switch (dstFormat
) {
2075 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2079 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2083 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2087 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2091 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
2093 case GL_LUMINANCE_ALPHA
:
2095 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
2096 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2101 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2102 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2103 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2108 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2109 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2110 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2111 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2116 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2117 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2118 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2123 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2124 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2125 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2126 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2131 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2132 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2133 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2134 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2140 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2141 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2145 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2151 GLbyte
*dst
= (GLbyte
*) dstAddr
;
2152 switch (dstFormat
) {
2155 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2159 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2163 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2167 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2171 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
2173 case GL_LUMINANCE_ALPHA
:
2175 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
2176 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2181 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2182 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2183 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2188 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2189 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2190 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2191 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2196 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2197 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2198 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2203 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2204 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2205 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2206 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2211 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2212 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2213 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2214 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2220 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2221 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2225 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2229 case GL_UNSIGNED_SHORT
:
2231 GLushort
*dst
= (GLushort
*) dstAddr
;
2232 switch (dstFormat
) {
2235 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
2239 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
2243 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
2247 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
2251 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
2253 case GL_LUMINANCE_ALPHA
:
2255 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
2256 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
2261 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
2262 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2263 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
2268 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
2269 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2270 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
2271 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2276 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
2277 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2278 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
2283 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
2284 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2285 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
2286 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2291 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
2292 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
2293 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
2294 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
2300 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
2301 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
2305 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2311 GLshort
*dst
= (GLshort
*) dstAddr
;
2312 switch (dstFormat
) {
2315 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2319 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2323 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2327 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2331 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
2333 case GL_LUMINANCE_ALPHA
:
2335 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
2336 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2341 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2342 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2343 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2348 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2349 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2350 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2351 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2356 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2357 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2358 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2363 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2364 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2365 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2366 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2371 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2372 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2373 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2374 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2380 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2381 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2385 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2389 case GL_UNSIGNED_INT
:
2391 GLuint
*dst
= (GLuint
*) dstAddr
;
2392 switch (dstFormat
) {
2395 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2399 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2403 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2407 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2411 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
2413 case GL_LUMINANCE_ALPHA
:
2415 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
2416 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2421 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2422 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2423 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2428 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2429 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2430 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2431 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2436 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2437 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2438 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2443 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2444 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2445 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2446 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2451 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2452 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2453 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2454 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2460 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2461 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2465 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2471 GLint
*dst
= (GLint
*) dstAddr
;
2472 switch (dstFormat
) {
2475 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2479 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2483 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2487 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2491 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2493 case GL_LUMINANCE_ALPHA
:
2495 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2496 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2501 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2502 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2503 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2508 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2509 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2510 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2511 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2516 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2517 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2518 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2523 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2524 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2525 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2526 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2531 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2532 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2533 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2534 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2540 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2541 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2545 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2551 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2552 switch (dstFormat
) {
2555 dst
[i
] = rgba
[i
][RCOMP
];
2559 dst
[i
] = rgba
[i
][GCOMP
];
2563 dst
[i
] = rgba
[i
][BCOMP
];
2567 dst
[i
] = rgba
[i
][ACOMP
];
2571 dst
[i
] = luminance
[i
];
2573 case GL_LUMINANCE_ALPHA
:
2575 dst
[i
*2+0] = luminance
[i
];
2576 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2581 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2582 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2583 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2588 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2589 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2590 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2591 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2596 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2597 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2598 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2603 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2604 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2605 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2606 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2611 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2612 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2613 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2614 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2620 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2621 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2625 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2629 case GL_HALF_FLOAT_ARB
:
2631 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2632 switch (dstFormat
) {
2635 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2639 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2643 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2647 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2651 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2653 case GL_LUMINANCE_ALPHA
:
2655 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2656 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2661 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2662 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2663 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2668 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2669 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2670 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2671 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2676 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2677 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2678 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2683 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2684 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2685 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2686 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2691 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2692 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2693 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2694 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2700 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2701 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2705 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2709 case GL_UNSIGNED_BYTE_3_3_2
:
2710 if (dstFormat
== GL_RGB
) {
2711 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2713 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2714 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2715 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
2719 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2720 if (dstFormat
== GL_RGB
) {
2721 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2723 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
2724 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2725 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2729 case GL_UNSIGNED_SHORT_5_6_5
:
2730 if (dstFormat
== GL_RGB
) {
2731 GLushort
*dst
= (GLushort
*) dstAddr
;
2733 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2734 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2735 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
2739 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2740 if (dstFormat
== GL_RGB
) {
2741 GLushort
*dst
= (GLushort
*) dstAddr
;
2743 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2744 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2745 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2749 case GL_UNSIGNED_SHORT_4_4_4_4
:
2750 if (dstFormat
== GL_RGBA
) {
2751 GLushort
*dst
= (GLushort
*) dstAddr
;
2753 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2754 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2755 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2756 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2759 else if (dstFormat
== GL_BGRA
) {
2760 GLushort
*dst
= (GLushort
*) dstAddr
;
2762 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2763 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2764 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2765 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2768 else if (dstFormat
== GL_ABGR_EXT
) {
2769 GLushort
*dst
= (GLushort
*) dstAddr
;
2771 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2772 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2773 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2774 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
2778 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2779 if (dstFormat
== GL_RGBA
) {
2780 GLushort
*dst
= (GLushort
*) dstAddr
;
2782 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
2783 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2784 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2785 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2788 else if (dstFormat
== GL_BGRA
) {
2789 GLushort
*dst
= (GLushort
*) dstAddr
;
2791 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
2792 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2793 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2794 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2797 else if (dstFormat
== GL_ABGR_EXT
) {
2798 GLushort
*dst
= (GLushort
*) dstAddr
;
2800 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
2801 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2802 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2803 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2807 case GL_UNSIGNED_SHORT_5_5_5_1
:
2808 if (dstFormat
== GL_RGBA
) {
2809 GLushort
*dst
= (GLushort
*) dstAddr
;
2811 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2812 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2813 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2814 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2817 else if (dstFormat
== GL_BGRA
) {
2818 GLushort
*dst
= (GLushort
*) dstAddr
;
2820 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2821 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2822 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2823 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2826 else if (dstFormat
== GL_ABGR_EXT
) {
2827 GLushort
*dst
= (GLushort
*) dstAddr
;
2829 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2830 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2831 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2832 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
2836 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2837 if (dstFormat
== GL_RGBA
) {
2838 GLushort
*dst
= (GLushort
*) dstAddr
;
2840 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2841 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2842 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2843 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2846 else if (dstFormat
== GL_BGRA
) {
2847 GLushort
*dst
= (GLushort
*) dstAddr
;
2849 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
2850 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2851 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2852 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2855 else if (dstFormat
== GL_ABGR_EXT
) {
2856 GLushort
*dst
= (GLushort
*) dstAddr
;
2858 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
2859 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2860 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2861 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2865 case GL_UNSIGNED_INT_8_8_8_8
:
2866 if (dstFormat
== GL_RGBA
) {
2867 GLuint
*dst
= (GLuint
*) dstAddr
;
2869 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
2870 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2871 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
2872 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2875 else if (dstFormat
== GL_BGRA
) {
2876 GLuint
*dst
= (GLuint
*) dstAddr
;
2878 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
2879 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2880 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
2881 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2884 else if (dstFormat
== GL_ABGR_EXT
) {
2885 GLuint
*dst
= (GLuint
*) dstAddr
;
2887 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
2888 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
2889 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
2890 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
2894 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2895 if (dstFormat
== GL_RGBA
) {
2896 GLuint
*dst
= (GLuint
*) dstAddr
;
2898 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
2899 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2900 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2901 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2904 else if (dstFormat
== GL_BGRA
) {
2905 GLuint
*dst
= (GLuint
*) dstAddr
;
2907 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
2908 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2909 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
2910 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2913 else if (dstFormat
== GL_ABGR_EXT
) {
2914 GLuint
*dst
= (GLuint
*) dstAddr
;
2916 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
2917 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
2918 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
2919 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
2923 case GL_UNSIGNED_INT_10_10_10_2
:
2924 if (dstFormat
== GL_RGBA
) {
2925 GLuint
*dst
= (GLuint
*) dstAddr
;
2927 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
2928 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2929 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
2930 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
2933 else if (dstFormat
== GL_BGRA
) {
2934 GLuint
*dst
= (GLuint
*) dstAddr
;
2936 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
2937 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2938 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
2939 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
2942 else if (dstFormat
== GL_ABGR_EXT
) {
2943 GLuint
*dst
= (GLuint
*) dstAddr
;
2945 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
2946 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
2947 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
2948 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
2952 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2953 if (dstFormat
== GL_RGBA
) {
2954 GLuint
*dst
= (GLuint
*) dstAddr
;
2956 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
2957 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2958 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
2959 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2962 else if (dstFormat
== GL_BGRA
) {
2963 GLuint
*dst
= (GLuint
*) dstAddr
;
2965 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
2966 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2967 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
2968 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2971 else if (dstFormat
== GL_ABGR_EXT
) {
2972 GLuint
*dst
= (GLuint
*) dstAddr
;
2974 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
2975 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2976 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2977 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2982 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2986 if (dstPacking
->SwapBytes
) {
2987 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2988 if (swapSize
== 2) {
2989 if (dstPacking
->SwapBytes
) {
2990 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2993 else if (swapSize
== 4) {
2994 if (dstPacking
->SwapBytes
) {
2995 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
3002 #define SWAP2BYTE(VALUE) \
3004 GLubyte *bytes = (GLubyte *) &(VALUE); \
3005 GLubyte tmp = bytes[0]; \
3006 bytes[0] = bytes[1]; \
3010 #define SWAP4BYTE(VALUE) \
3012 GLubyte *bytes = (GLubyte *) &(VALUE); \
3013 GLubyte tmp = bytes[0]; \
3014 bytes[0] = bytes[3]; \
3017 bytes[1] = bytes[2]; \
3023 extract_uint_indexes(GLuint n
, GLuint indexes
[],
3024 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3025 const struct gl_pixelstore_attrib
*unpack
)
3027 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
3029 ASSERT(srcType
== GL_BITMAP
||
3030 srcType
== GL_UNSIGNED_BYTE
||
3031 srcType
== GL_BYTE
||
3032 srcType
== GL_UNSIGNED_SHORT
||
3033 srcType
== GL_SHORT
||
3034 srcType
== GL_UNSIGNED_INT
||
3035 srcType
== GL_INT
||
3036 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3037 srcType
== GL_HALF_FLOAT_ARB
||
3038 srcType
== GL_FLOAT
);
3043 GLubyte
*ubsrc
= (GLubyte
*) src
;
3044 if (unpack
->LsbFirst
) {
3045 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
3047 for (i
= 0; i
< n
; i
++) {
3048 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3059 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
3061 for (i
= 0; i
< n
; i
++) {
3062 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3074 case GL_UNSIGNED_BYTE
:
3077 const GLubyte
*s
= (const GLubyte
*) src
;
3078 for (i
= 0; i
< n
; i
++)
3085 const GLbyte
*s
= (const GLbyte
*) src
;
3086 for (i
= 0; i
< n
; i
++)
3090 case GL_UNSIGNED_SHORT
:
3093 const GLushort
*s
= (const GLushort
*) src
;
3094 if (unpack
->SwapBytes
) {
3095 for (i
= 0; i
< n
; i
++) {
3096 GLushort value
= s
[i
];
3102 for (i
= 0; i
< n
; i
++)
3110 const GLshort
*s
= (const GLshort
*) src
;
3111 if (unpack
->SwapBytes
) {
3112 for (i
= 0; i
< n
; i
++) {
3113 GLshort value
= s
[i
];
3119 for (i
= 0; i
< n
; i
++)
3124 case GL_UNSIGNED_INT
:
3127 const GLuint
*s
= (const GLuint
*) src
;
3128 if (unpack
->SwapBytes
) {
3129 for (i
= 0; i
< n
; i
++) {
3130 GLuint value
= s
[i
];
3136 for (i
= 0; i
< n
; i
++)
3144 const GLint
*s
= (const GLint
*) src
;
3145 if (unpack
->SwapBytes
) {
3146 for (i
= 0; i
< n
; i
++) {
3153 for (i
= 0; i
< n
; i
++)
3161 const GLfloat
*s
= (const GLfloat
*) src
;
3162 if (unpack
->SwapBytes
) {
3163 for (i
= 0; i
< n
; i
++) {
3164 GLfloat value
= s
[i
];
3166 indexes
[i
] = (GLuint
) value
;
3170 for (i
= 0; i
< n
; i
++)
3171 indexes
[i
] = (GLuint
) s
[i
];
3175 case GL_HALF_FLOAT_ARB
:
3178 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
3179 if (unpack
->SwapBytes
) {
3180 for (i
= 0; i
< n
; i
++) {
3181 GLhalfARB value
= s
[i
];
3183 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
3187 for (i
= 0; i
< n
; i
++)
3188 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
3192 case GL_UNSIGNED_INT_24_8_EXT
:
3195 const GLuint
*s
= (const GLuint
*) src
;
3196 if (unpack
->SwapBytes
) {
3197 for (i
= 0; i
< n
; i
++) {
3198 GLuint value
= s
[i
];
3200 indexes
[i
] = value
& 0xff; /* lower 8 bits */
3204 for (i
= 0; i
< n
; i
++)
3205 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
3211 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
3218 * This function extracts floating point RGBA values from arbitrary
3219 * image data. srcFormat and srcType are the format and type parameters
3220 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3222 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3223 * implements the "Conversion to floating point", "Conversion to RGB",
3224 * and "Final Expansion to RGBA" operations.
3226 * Args: n - number of pixels
3227 * rgba - output colors
3228 * srcFormat - format of incoming data
3229 * srcType - data type of incoming data
3230 * src - source data pointer
3231 * swapBytes - perform byteswapping of incoming data?
3234 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3235 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3236 GLboolean swapBytes
)
3238 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
3240 GLint rComp
, bComp
, gComp
, aComp
;
3241 GLboolean intFormat
;
3242 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
3244 ASSERT(srcFormat
== GL_RED
||
3245 srcFormat
== GL_GREEN
||
3246 srcFormat
== GL_BLUE
||
3247 srcFormat
== GL_ALPHA
||
3248 srcFormat
== GL_LUMINANCE
||
3249 srcFormat
== GL_LUMINANCE_ALPHA
||
3250 srcFormat
== GL_INTENSITY
||
3251 srcFormat
== GL_RG
||
3252 srcFormat
== GL_RGB
||
3253 srcFormat
== GL_BGR
||
3254 srcFormat
== GL_RGBA
||
3255 srcFormat
== GL_BGRA
||
3256 srcFormat
== GL_ABGR_EXT
||
3257 srcFormat
== GL_DU8DV8_ATI
||
3258 srcFormat
== GL_DUDV_ATI
||
3259 srcFormat
== GL_RED_INTEGER_EXT
||
3260 srcFormat
== GL_GREEN_INTEGER_EXT
||
3261 srcFormat
== GL_BLUE_INTEGER_EXT
||
3262 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3263 srcFormat
== GL_RGB_INTEGER_EXT
||
3264 srcFormat
== GL_RGBA_INTEGER_EXT
||
3265 srcFormat
== GL_BGR_INTEGER_EXT
||
3266 srcFormat
== GL_BGRA_INTEGER_EXT
||
3267 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3268 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3270 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3271 srcType
== GL_BYTE
||
3272 srcType
== GL_UNSIGNED_SHORT
||
3273 srcType
== GL_SHORT
||
3274 srcType
== GL_UNSIGNED_INT
||
3275 srcType
== GL_INT
||
3276 srcType
== GL_HALF_FLOAT_ARB
||
3277 srcType
== GL_FLOAT
||
3278 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3279 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3280 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3281 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3282 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3283 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3284 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3285 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3286 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3287 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3288 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3289 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3291 rComp
= gComp
= bComp
= aComp
= -1;
3293 switch (srcFormat
) {
3295 case GL_RED_INTEGER_EXT
:
3297 greenIndex
= blueIndex
= alphaIndex
= -1;
3301 case GL_GREEN_INTEGER_EXT
:
3303 redIndex
= blueIndex
= alphaIndex
= -1;
3307 case GL_BLUE_INTEGER_EXT
:
3309 redIndex
= greenIndex
= alphaIndex
= -1;
3313 case GL_ALPHA_INTEGER_EXT
:
3314 redIndex
= greenIndex
= blueIndex
= -1;
3319 case GL_LUMINANCE_INTEGER_EXT
:
3320 redIndex
= greenIndex
= blueIndex
= 0;
3324 case GL_LUMINANCE_ALPHA
:
3325 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
3326 redIndex
= greenIndex
= blueIndex
= 0;
3331 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
3347 case GL_RGB_INTEGER
:
3370 case GL_RGBA_INTEGER
:
3412 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
3413 _mesa_lookup_enum_by_nr(srcFormat
));
3417 intFormat
= _mesa_is_integer_format(srcFormat
);
3419 #define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
3420 if ((INDEX) < 0) { \
3423 for (i = 0; i < n; i++) { \
3424 rgba[i][CHANNEL] = DEFAULT_INT; \
3428 for (i = 0; i < n; i++) { \
3429 rgba[i][CHANNEL] = DEFAULT; \
3433 else if (swapBytes) { \
3434 const TYPE *s = (const TYPE *) src; \
3436 for (i = 0; i < n; i++) { \
3437 TYPE value = s[INDEX]; \
3438 if (sizeof(TYPE) == 2) { \
3441 else if (sizeof(TYPE) == 4) { \
3445 rgba[i][CHANNEL] = (GLfloat) value; \
3447 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
3452 const TYPE *s = (const TYPE *) src; \
3455 for (i = 0; i < n; i++) { \
3456 rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
3461 for (i = 0; i < n; i++) { \
3462 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
3469 case GL_UNSIGNED_BYTE
:
3470 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3471 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3472 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3473 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
3476 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3477 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3478 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3479 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
3481 case GL_UNSIGNED_SHORT
:
3482 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3483 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3484 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3485 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
3488 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3489 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3490 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3491 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
3493 case GL_UNSIGNED_INT
:
3494 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3495 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3496 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3497 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
3500 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3501 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3502 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3503 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
3506 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3507 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3508 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3509 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
3511 case GL_HALF_FLOAT_ARB
:
3512 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3513 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3514 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3515 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3517 case GL_UNSIGNED_BYTE_3_3_2
:
3519 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3526 for (i
= 0; i
< n
; i
++) {
3527 GLubyte p
= ubsrc
[i
];
3528 rgba
[i
][rComp
] = ((p
>> 5) ) * rs
;
3529 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * gs
;
3530 rgba
[i
][bComp
] = ((p
) & 0x3) * bs
;
3531 rgba
[i
][aComp
] = 1.0F
;
3535 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3537 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3544 for (i
= 0; i
< n
; i
++) {
3545 GLubyte p
= ubsrc
[i
];
3546 rgba
[i
][rComp
] = ((p
) & 0x7) * rs
;
3547 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * gs
;
3548 rgba
[i
][bComp
] = ((p
>> 6) ) * bs
;
3549 rgba
[i
][aComp
] = 1.0F
;
3553 case GL_UNSIGNED_SHORT_5_6_5
:
3560 const GLushort
*ussrc
= (const GLushort
*) src
;
3562 for (i
= 0; i
< n
; i
++) {
3563 GLushort p
= ussrc
[i
];
3565 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3566 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3567 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3568 rgba
[i
][aComp
] = 1.0F
;
3572 const GLushort
*ussrc
= (const GLushort
*) src
;
3574 for (i
= 0; i
< n
; i
++) {
3575 GLushort p
= ussrc
[i
];
3576 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3577 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3578 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3579 rgba
[i
][aComp
] = 1.0F
;
3583 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3590 const GLushort
*ussrc
= (const GLushort
*) src
;
3592 for (i
= 0; i
< n
; i
++) {
3593 GLushort p
= ussrc
[i
];
3595 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3596 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3597 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3598 rgba
[i
][aComp
] = 1.0F
;
3602 const GLushort
*ussrc
= (const GLushort
*) src
;
3604 for (i
= 0; i
< n
; i
++) {
3605 GLushort p
= ussrc
[i
];
3606 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3607 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3608 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3609 rgba
[i
][aComp
] = 1.0F
;
3613 case GL_UNSIGNED_SHORT_4_4_4_4
:
3615 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3618 const GLushort
*ussrc
= (const GLushort
*) src
;
3620 for (i
= 0; i
< n
; i
++) {
3621 GLushort p
= ussrc
[i
];
3623 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3624 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3625 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3626 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3630 const GLushort
*ussrc
= (const GLushort
*) src
;
3632 for (i
= 0; i
< n
; i
++) {
3633 GLushort p
= ussrc
[i
];
3634 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3635 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3636 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3637 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3641 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3643 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3646 const GLushort
*ussrc
= (const GLushort
*) src
;
3648 for (i
= 0; i
< n
; i
++) {
3649 GLushort p
= ussrc
[i
];
3651 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3652 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3653 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3654 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3658 const GLushort
*ussrc
= (const GLushort
*) src
;
3660 for (i
= 0; i
< n
; i
++) {
3661 GLushort p
= ussrc
[i
];
3662 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3663 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3664 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3665 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3669 case GL_UNSIGNED_SHORT_5_5_5_1
:
3671 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3674 const GLushort
*ussrc
= (const GLushort
*) src
;
3676 for (i
= 0; i
< n
; i
++) {
3677 GLushort p
= ussrc
[i
];
3679 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3680 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3681 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3682 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3686 const GLushort
*ussrc
= (const GLushort
*) src
;
3688 for (i
= 0; i
< n
; i
++) {
3689 GLushort p
= ussrc
[i
];
3690 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3691 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3692 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3693 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3697 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3699 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3702 const GLushort
*ussrc
= (const GLushort
*) src
;
3704 for (i
= 0; i
< n
; i
++) {
3705 GLushort p
= ussrc
[i
];
3707 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3708 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3709 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3710 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3714 const GLushort
*ussrc
= (const GLushort
*) src
;
3716 for (i
= 0; i
< n
; i
++) {
3717 GLushort p
= ussrc
[i
];
3718 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3719 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3720 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3721 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3725 case GL_UNSIGNED_INT_8_8_8_8
:
3727 const GLuint
*uisrc
= (const GLuint
*) src
;
3730 for (i
= 0; i
< n
; i
++) {
3731 GLuint p
= uisrc
[i
];
3732 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3733 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3734 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3735 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3739 for (i
= 0; i
< n
; i
++) {
3740 GLuint p
= uisrc
[i
];
3741 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3742 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3743 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3744 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3749 const GLuint
*uisrc
= (const GLuint
*) src
;
3752 for (i
= 0; i
< n
; i
++) {
3753 GLuint p
= uisrc
[i
];
3754 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3755 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3756 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3757 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3761 for (i
= 0; i
< n
; i
++) {
3762 GLuint p
= uisrc
[i
];
3763 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3764 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3765 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3766 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3771 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3773 const GLuint
*uisrc
= (const GLuint
*) src
;
3776 for (i
= 0; i
< n
; i
++) {
3777 GLuint p
= uisrc
[i
];
3778 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3779 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3780 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3781 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3785 for (i
= 0; i
< n
; i
++) {
3786 GLuint p
= uisrc
[i
];
3787 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3788 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3789 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3790 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3795 const GLuint
*uisrc
= (const GLuint
*) src
;
3798 for (i
= 0; i
< n
; i
++) {
3799 GLuint p
= uisrc
[i
];
3800 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3801 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3802 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3803 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3807 for (i
= 0; i
< n
; i
++) {
3808 GLuint p
= uisrc
[i
];
3809 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3810 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3811 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3812 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3817 case GL_UNSIGNED_INT_10_10_10_2
:
3819 rs
= 1.0F
/ 1023.0F
;
3820 gs
= 1.0F
/ 1023.0F
;
3821 bs
= 1.0F
/ 1023.0F
;
3825 const GLuint
*uisrc
= (const GLuint
*) src
;
3827 for (i
= 0; i
< n
; i
++) {
3828 GLuint p
= uisrc
[i
];
3830 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3831 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3832 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3833 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3837 const GLuint
*uisrc
= (const GLuint
*) src
;
3839 for (i
= 0; i
< n
; i
++) {
3840 GLuint p
= uisrc
[i
];
3841 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3842 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3843 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3844 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3848 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3850 rs
= 1.0F
/ 1023.0F
;
3851 gs
= 1.0F
/ 1023.0F
;
3852 bs
= 1.0F
/ 1023.0F
;
3856 const GLuint
*uisrc
= (const GLuint
*) src
;
3858 for (i
= 0; i
< n
; i
++) {
3859 GLuint p
= uisrc
[i
];
3861 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3862 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3863 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3864 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3868 const GLuint
*uisrc
= (const GLuint
*) src
;
3870 for (i
= 0; i
< n
; i
++) {
3871 GLuint p
= uisrc
[i
];
3872 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3873 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3874 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3875 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3880 _mesa_problem(NULL
, "bad srcType in extract float data");
3887 * Unpack a row of color image data from a client buffer according to
3888 * the pixel unpacking parameters.
3889 * Return GLchan values in the specified dest image format.
3890 * This is used by glDrawPixels and glTexImage?D().
3891 * \param ctx - the context
3892 * n - number of pixels in the span
3893 * dstFormat - format of destination color array
3894 * dest - the destination color array
3895 * srcFormat - source image format
3896 * srcType - source image data type
3897 * source - source image pointer
3898 * srcPacking - pixel unpacking parameters
3899 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3901 * XXX perhaps expand this to process whole images someday.
3904 _mesa_unpack_color_span_chan( GLcontext
*ctx
,
3905 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3906 GLenum srcFormat
, GLenum srcType
,
3907 const GLvoid
*source
,
3908 const struct gl_pixelstore_attrib
*srcPacking
,
3909 GLbitfield transferOps
)
3911 ASSERT(dstFormat
== GL_ALPHA
||
3912 dstFormat
== GL_LUMINANCE
||
3913 dstFormat
== GL_LUMINANCE_ALPHA
||
3914 dstFormat
== GL_INTENSITY
||
3915 dstFormat
== GL_RED
||
3916 dstFormat
== GL_RG
||
3917 dstFormat
== GL_RGB
||
3918 dstFormat
== GL_RGBA
||
3919 dstFormat
== GL_COLOR_INDEX
);
3921 ASSERT(srcFormat
== GL_RED
||
3922 srcFormat
== GL_GREEN
||
3923 srcFormat
== GL_BLUE
||
3924 srcFormat
== GL_ALPHA
||
3925 srcFormat
== GL_LUMINANCE
||
3926 srcFormat
== GL_LUMINANCE_ALPHA
||
3927 srcFormat
== GL_INTENSITY
||
3928 srcFormat
== GL_RG
||
3929 srcFormat
== GL_RGB
||
3930 srcFormat
== GL_BGR
||
3931 srcFormat
== GL_RGBA
||
3932 srcFormat
== GL_BGRA
||
3933 srcFormat
== GL_ABGR_EXT
||
3934 srcFormat
== GL_COLOR_INDEX
);
3936 ASSERT(srcType
== GL_BITMAP
||
3937 srcType
== GL_UNSIGNED_BYTE
||
3938 srcType
== GL_BYTE
||
3939 srcType
== GL_UNSIGNED_SHORT
||
3940 srcType
== GL_SHORT
||
3941 srcType
== GL_UNSIGNED_INT
||
3942 srcType
== GL_INT
||
3943 srcType
== GL_HALF_FLOAT_ARB
||
3944 srcType
== GL_FLOAT
||
3945 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3946 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3947 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3948 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3949 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3950 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3951 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3952 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3953 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3954 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3955 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3956 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3958 /* Try simple cases first */
3959 if (transferOps
== 0) {
3960 if (srcType
== CHAN_TYPE
) {
3961 if (dstFormat
== GL_RGBA
) {
3962 if (srcFormat
== GL_RGBA
) {
3963 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3966 else if (srcFormat
== GL_RGB
) {
3968 const GLchan
*src
= (const GLchan
*) source
;
3970 for (i
= 0; i
< n
; i
++) {
3981 else if (dstFormat
== GL_RGB
) {
3982 if (srcFormat
== GL_RGB
) {
3983 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3986 else if (srcFormat
== GL_RGBA
) {
3988 const GLchan
*src
= (const GLchan
*) source
;
3990 for (i
= 0; i
< n
; i
++) {
4000 else if (dstFormat
== srcFormat
) {
4001 GLint comps
= _mesa_components_in_format(srcFormat
);
4003 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
4008 * Common situation, loading 8bit RGBA/RGB source images
4009 * into 16/32 bit destination. (OSMesa16/32)
4011 else if (srcType
== GL_UNSIGNED_BYTE
) {
4012 if (dstFormat
== GL_RGBA
) {
4013 if (srcFormat
== GL_RGB
) {
4015 const GLubyte
*src
= (const GLubyte
*) source
;
4017 for (i
= 0; i
< n
; i
++) {
4018 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4019 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4020 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4027 else if (srcFormat
== GL_RGBA
) {
4029 const GLubyte
*src
= (const GLubyte
*) source
;
4031 for (i
= 0; i
< n
; i
++) {
4032 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4033 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4034 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4035 dst
[3] = UBYTE_TO_CHAN(src
[3]);
4042 else if (dstFormat
== GL_RGB
) {
4043 if (srcFormat
== GL_RGB
) {
4045 const GLubyte
*src
= (const GLubyte
*) source
;
4047 for (i
= 0; i
< n
; i
++) {
4048 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4049 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4050 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4056 else if (srcFormat
== GL_RGBA
) {
4058 const GLubyte
*src
= (const GLubyte
*) source
;
4060 for (i
= 0; i
< n
; i
++) {
4061 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4062 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4063 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4074 /* general solution begins here */
4076 GLint dstComponents
;
4077 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4078 GLint dstLuminanceIndex
, dstIntensityIndex
;
4079 GLfloat rgba
[MAX_WIDTH
][4];
4081 dstComponents
= _mesa_components_in_format( dstFormat
);
4082 /* source & dest image formats should have been error checked by now */
4083 assert(dstComponents
> 0);
4086 * Extract image data and convert to RGBA floats
4088 assert(n
<= MAX_WIDTH
);
4089 if (srcFormat
== GL_COLOR_INDEX
) {
4090 GLuint indexes
[MAX_WIDTH
];
4091 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4094 if (dstFormat
== GL_COLOR_INDEX
) {
4096 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4097 /* convert to GLchan and return */
4098 for (i
= 0; i
< n
; i
++) {
4099 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4104 /* Convert indexes to RGBA */
4105 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4106 shift_and_offset_ci(ctx
, n
, indexes
);
4108 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4111 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4112 * with color indexes.
4114 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4117 /* non-color index data */
4118 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4119 srcPacking
->SwapBytes
);
4122 /* Need to clamp if returning GLubytes or GLushorts */
4123 #if CHAN_TYPE != GL_FLOAT
4124 transferOps
|= IMAGE_CLAMP_BIT
;
4128 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4131 /* Now determine which color channels we need to produce.
4132 * And determine the dest index (offset) within each color tuple.
4134 switch (dstFormat
) {
4137 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4138 dstLuminanceIndex
= dstIntensityIndex
= -1;
4141 dstLuminanceIndex
= 0;
4142 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4143 dstIntensityIndex
= -1;
4145 case GL_LUMINANCE_ALPHA
:
4146 dstLuminanceIndex
= 0;
4148 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4149 dstIntensityIndex
= -1;
4152 dstIntensityIndex
= 0;
4153 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4154 dstLuminanceIndex
= -1;
4158 dstGreenIndex
= dstBlueIndex
= -1;
4159 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4165 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4171 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4178 dstLuminanceIndex
= dstIntensityIndex
= -1;
4181 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
4186 /* Now return the GLchan data in the requested dstFormat */
4188 if (dstRedIndex
>= 0) {
4191 for (i
= 0; i
< n
; i
++) {
4192 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
4193 dst
+= dstComponents
;
4197 if (dstGreenIndex
>= 0) {
4200 for (i
= 0; i
< n
; i
++) {
4201 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
4202 dst
+= dstComponents
;
4206 if (dstBlueIndex
>= 0) {
4209 for (i
= 0; i
< n
; i
++) {
4210 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
4211 dst
+= dstComponents
;
4215 if (dstAlphaIndex
>= 0) {
4218 for (i
= 0; i
< n
; i
++) {
4219 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
4220 dst
+= dstComponents
;
4224 if (dstIntensityIndex
>= 0) {
4227 assert(dstIntensityIndex
== 0);
4228 assert(dstComponents
== 1);
4229 for (i
= 0; i
< n
; i
++) {
4230 /* Intensity comes from red channel */
4231 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
4235 if (dstLuminanceIndex
>= 0) {
4238 assert(dstLuminanceIndex
== 0);
4239 for (i
= 0; i
< n
; i
++) {
4240 /* Luminance comes from red channel */
4241 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
4242 dst
+= dstComponents
;
4250 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
4251 * instead of GLchan.
4254 _mesa_unpack_color_span_float( GLcontext
*ctx
,
4255 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4256 GLenum srcFormat
, GLenum srcType
,
4257 const GLvoid
*source
,
4258 const struct gl_pixelstore_attrib
*srcPacking
,
4259 GLbitfield transferOps
)
4261 ASSERT(dstFormat
== GL_ALPHA
||
4262 dstFormat
== GL_LUMINANCE
||
4263 dstFormat
== GL_LUMINANCE_ALPHA
||
4264 dstFormat
== GL_INTENSITY
||
4265 dstFormat
== GL_RED
||
4266 dstFormat
== GL_RG
||
4267 dstFormat
== GL_RGB
||
4268 dstFormat
== GL_RGBA
||
4269 dstFormat
== GL_COLOR_INDEX
);
4271 ASSERT(srcFormat
== GL_RED
||
4272 srcFormat
== GL_GREEN
||
4273 srcFormat
== GL_BLUE
||
4274 srcFormat
== GL_ALPHA
||
4275 srcFormat
== GL_LUMINANCE
||
4276 srcFormat
== GL_LUMINANCE_ALPHA
||
4277 srcFormat
== GL_INTENSITY
||
4278 srcFormat
== GL_RG
||
4279 srcFormat
== GL_RGB
||
4280 srcFormat
== GL_BGR
||
4281 srcFormat
== GL_RGBA
||
4282 srcFormat
== GL_BGRA
||
4283 srcFormat
== GL_ABGR_EXT
||
4284 srcFormat
== GL_RED_INTEGER_EXT
||
4285 srcFormat
== GL_GREEN_INTEGER_EXT
||
4286 srcFormat
== GL_BLUE_INTEGER_EXT
||
4287 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4288 srcFormat
== GL_RGB_INTEGER_EXT
||
4289 srcFormat
== GL_RGBA_INTEGER_EXT
||
4290 srcFormat
== GL_BGR_INTEGER_EXT
||
4291 srcFormat
== GL_BGRA_INTEGER_EXT
||
4292 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4293 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4294 srcFormat
== GL_COLOR_INDEX
);
4296 ASSERT(srcType
== GL_BITMAP
||
4297 srcType
== GL_UNSIGNED_BYTE
||
4298 srcType
== GL_BYTE
||
4299 srcType
== GL_UNSIGNED_SHORT
||
4300 srcType
== GL_SHORT
||
4301 srcType
== GL_UNSIGNED_INT
||
4302 srcType
== GL_INT
||
4303 srcType
== GL_HALF_FLOAT_ARB
||
4304 srcType
== GL_FLOAT
||
4305 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4306 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4307 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4308 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4309 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4310 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4311 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4312 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4313 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4314 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4315 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4316 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4318 /* general solution, no special cases, yet */
4320 GLint dstComponents
;
4321 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4322 GLint dstLuminanceIndex
, dstIntensityIndex
;
4323 GLfloat rgba
[MAX_WIDTH
][4];
4325 dstComponents
= _mesa_components_in_format( dstFormat
);
4326 /* source & dest image formats should have been error checked by now */
4327 assert(dstComponents
> 0);
4330 * Extract image data and convert to RGBA floats
4332 assert(n
<= MAX_WIDTH
);
4333 if (srcFormat
== GL_COLOR_INDEX
) {
4334 GLuint indexes
[MAX_WIDTH
];
4335 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4338 if (dstFormat
== GL_COLOR_INDEX
) {
4340 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4341 /* convert to GLchan and return */
4342 for (i
= 0; i
< n
; i
++) {
4343 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4348 /* Convert indexes to RGBA */
4349 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4350 shift_and_offset_ci(ctx
, n
, indexes
);
4352 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4355 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4356 * with color indexes.
4358 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4361 /* non-color index data */
4362 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4363 srcPacking
->SwapBytes
);
4367 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4370 /* Now determine which color channels we need to produce.
4371 * And determine the dest index (offset) within each color tuple.
4373 switch (dstFormat
) {
4376 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4377 dstLuminanceIndex
= dstIntensityIndex
= -1;
4380 dstLuminanceIndex
= 0;
4381 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4382 dstIntensityIndex
= -1;
4384 case GL_LUMINANCE_ALPHA
:
4385 dstLuminanceIndex
= 0;
4387 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4388 dstIntensityIndex
= -1;
4391 dstIntensityIndex
= 0;
4392 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4393 dstLuminanceIndex
= -1;
4397 dstGreenIndex
= dstBlueIndex
= -1;
4398 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4404 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4410 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4417 dstLuminanceIndex
= dstIntensityIndex
= -1;
4420 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
4424 /* Now pack results in the requested dstFormat */
4425 if (dstRedIndex
>= 0) {
4426 GLfloat
*dst
= dest
;
4428 for (i
= 0; i
< n
; i
++) {
4429 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
4430 dst
+= dstComponents
;
4434 if (dstGreenIndex
>= 0) {
4435 GLfloat
*dst
= dest
;
4437 for (i
= 0; i
< n
; i
++) {
4438 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
4439 dst
+= dstComponents
;
4443 if (dstBlueIndex
>= 0) {
4444 GLfloat
*dst
= dest
;
4446 for (i
= 0; i
< n
; i
++) {
4447 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
4448 dst
+= dstComponents
;
4452 if (dstAlphaIndex
>= 0) {
4453 GLfloat
*dst
= dest
;
4455 for (i
= 0; i
< n
; i
++) {
4456 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
4457 dst
+= dstComponents
;
4461 if (dstIntensityIndex
>= 0) {
4462 GLfloat
*dst
= dest
;
4464 assert(dstIntensityIndex
== 0);
4465 assert(dstComponents
== 1);
4466 for (i
= 0; i
< n
; i
++) {
4467 /* Intensity comes from red channel */
4468 dst
[i
] = rgba
[i
][RCOMP
];
4472 if (dstLuminanceIndex
>= 0) {
4473 GLfloat
*dst
= dest
;
4475 assert(dstLuminanceIndex
== 0);
4476 for (i
= 0; i
< n
; i
++) {
4477 /* Luminance comes from red channel */
4478 dst
[0] = rgba
[i
][RCOMP
];
4479 dst
+= dstComponents
;
4486 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4487 * directly return GLbyte data, no transfer ops apply.
4490 _mesa_unpack_dudv_span_byte( GLcontext
*ctx
,
4491 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4492 GLenum srcFormat
, GLenum srcType
,
4493 const GLvoid
*source
,
4494 const struct gl_pixelstore_attrib
*srcPacking
,
4495 GLbitfield transferOps
)
4497 ASSERT(dstFormat
== GL_DUDV_ATI
);
4498 ASSERT(srcFormat
== GL_DUDV_ATI
);
4500 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4501 srcType
== GL_BYTE
||
4502 srcType
== GL_UNSIGNED_SHORT
||
4503 srcType
== GL_SHORT
||
4504 srcType
== GL_UNSIGNED_INT
||
4505 srcType
== GL_INT
||
4506 srcType
== GL_HALF_FLOAT_ARB
||
4507 srcType
== GL_FLOAT
);
4509 /* general solution */
4511 GLint dstComponents
;
4512 GLfloat rgba
[MAX_WIDTH
][4];
4516 dstComponents
= _mesa_components_in_format( dstFormat
);
4517 /* source & dest image formats should have been error checked by now */
4518 assert(dstComponents
> 0);
4521 * Extract image data and convert to RGBA floats
4523 assert(n
<= MAX_WIDTH
);
4524 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4525 srcPacking
->SwapBytes
);
4528 /* Now determine which color channels we need to produce.
4529 * And determine the dest index (offset) within each color tuple.
4532 /* Now pack results in the requested dstFormat */
4533 for (i
= 0; i
< n
; i
++) {
4534 /* not sure - need clamp[-1,1] here? */
4535 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4536 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4537 dst
+= dstComponents
;
4543 * Unpack a row of color index data from a client buffer according to
4544 * the pixel unpacking parameters.
4545 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4547 * Args: ctx - the context
4548 * n - number of pixels
4549 * dstType - destination data type
4550 * dest - destination array
4551 * srcType - source pixel type
4552 * source - source data pointer
4553 * srcPacking - pixel unpacking parameters
4554 * transferOps - the pixel transfer operations to apply
4557 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
4558 GLenum dstType
, GLvoid
*dest
,
4559 GLenum srcType
, const GLvoid
*source
,
4560 const struct gl_pixelstore_attrib
*srcPacking
,
4561 GLbitfield transferOps
)
4563 ASSERT(srcType
== GL_BITMAP
||
4564 srcType
== GL_UNSIGNED_BYTE
||
4565 srcType
== GL_BYTE
||
4566 srcType
== GL_UNSIGNED_SHORT
||
4567 srcType
== GL_SHORT
||
4568 srcType
== GL_UNSIGNED_INT
||
4569 srcType
== GL_INT
||
4570 srcType
== GL_HALF_FLOAT_ARB
||
4571 srcType
== GL_FLOAT
);
4573 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4574 dstType
== GL_UNSIGNED_SHORT
||
4575 dstType
== GL_UNSIGNED_INT
);
4578 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4581 * Try simple cases first
4583 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4584 && dstType
== GL_UNSIGNED_BYTE
) {
4585 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4587 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4588 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4589 memcpy(dest
, source
, n
* sizeof(GLuint
));
4595 GLuint indexes
[MAX_WIDTH
];
4596 assert(n
<= MAX_WIDTH
);
4598 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4602 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4604 /* convert to dest type */
4606 case GL_UNSIGNED_BYTE
:
4608 GLubyte
*dst
= (GLubyte
*) dest
;
4610 for (i
= 0; i
< n
; i
++) {
4611 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4615 case GL_UNSIGNED_SHORT
:
4617 GLuint
*dst
= (GLuint
*) dest
;
4619 for (i
= 0; i
< n
; i
++) {
4620 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4624 case GL_UNSIGNED_INT
:
4625 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4628 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4635 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
4636 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4637 const struct gl_pixelstore_attrib
*dstPacking
,
4638 GLbitfield transferOps
)
4640 GLuint indexes
[MAX_WIDTH
];
4642 ASSERT(n
<= MAX_WIDTH
);
4644 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4646 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4647 /* make a copy of input */
4648 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4649 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4654 case GL_UNSIGNED_BYTE
:
4656 GLubyte
*dst
= (GLubyte
*) dest
;
4658 for (i
= 0; i
< n
; i
++) {
4659 *dst
++ = (GLubyte
) source
[i
];
4665 GLbyte
*dst
= (GLbyte
*) dest
;
4667 for (i
= 0; i
< n
; i
++) {
4668 dst
[i
] = (GLbyte
) source
[i
];
4672 case GL_UNSIGNED_SHORT
:
4674 GLushort
*dst
= (GLushort
*) dest
;
4676 for (i
= 0; i
< n
; i
++) {
4677 dst
[i
] = (GLushort
) source
[i
];
4679 if (dstPacking
->SwapBytes
) {
4680 _mesa_swap2( (GLushort
*) dst
, n
);
4686 GLshort
*dst
= (GLshort
*) dest
;
4688 for (i
= 0; i
< n
; i
++) {
4689 dst
[i
] = (GLshort
) source
[i
];
4691 if (dstPacking
->SwapBytes
) {
4692 _mesa_swap2( (GLushort
*) dst
, n
);
4696 case GL_UNSIGNED_INT
:
4698 GLuint
*dst
= (GLuint
*) dest
;
4700 for (i
= 0; i
< n
; i
++) {
4701 dst
[i
] = (GLuint
) source
[i
];
4703 if (dstPacking
->SwapBytes
) {
4704 _mesa_swap4( (GLuint
*) dst
, n
);
4710 GLint
*dst
= (GLint
*) dest
;
4712 for (i
= 0; i
< n
; i
++) {
4713 dst
[i
] = (GLint
) source
[i
];
4715 if (dstPacking
->SwapBytes
) {
4716 _mesa_swap4( (GLuint
*) dst
, n
);
4722 GLfloat
*dst
= (GLfloat
*) dest
;
4724 for (i
= 0; i
< n
; i
++) {
4725 dst
[i
] = (GLfloat
) source
[i
];
4727 if (dstPacking
->SwapBytes
) {
4728 _mesa_swap4( (GLuint
*) dst
, n
);
4732 case GL_HALF_FLOAT_ARB
:
4734 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4736 for (i
= 0; i
< n
; i
++) {
4737 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4739 if (dstPacking
->SwapBytes
) {
4740 _mesa_swap2( (GLushort
*) dst
, n
);
4745 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4751 * Unpack a row of stencil data from a client buffer according to
4752 * the pixel unpacking parameters.
4753 * This is (or will be) used by glDrawPixels
4755 * Args: ctx - the context
4756 * n - number of pixels
4757 * dstType - destination data type
4758 * dest - destination array
4759 * srcType - source pixel type
4760 * source - source data pointer
4761 * srcPacking - pixel unpacking parameters
4762 * transferOps - apply offset/bias/lookup ops?
4765 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4766 GLenum dstType
, GLvoid
*dest
,
4767 GLenum srcType
, const GLvoid
*source
,
4768 const struct gl_pixelstore_attrib
*srcPacking
,
4769 GLbitfield transferOps
)
4771 ASSERT(srcType
== GL_BITMAP
||
4772 srcType
== GL_UNSIGNED_BYTE
||
4773 srcType
== GL_BYTE
||
4774 srcType
== GL_UNSIGNED_SHORT
||
4775 srcType
== GL_SHORT
||
4776 srcType
== GL_UNSIGNED_INT
||
4777 srcType
== GL_INT
||
4778 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4779 srcType
== GL_HALF_FLOAT_ARB
||
4780 srcType
== GL_FLOAT
);
4782 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4783 dstType
== GL_UNSIGNED_SHORT
||
4784 dstType
== GL_UNSIGNED_INT
);
4786 /* only shift and offset apply to stencil */
4787 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4790 * Try simple cases first
4792 if (transferOps
== 0 &&
4793 !ctx
->Pixel
.MapStencilFlag
&&
4794 srcType
== GL_UNSIGNED_BYTE
&&
4795 dstType
== GL_UNSIGNED_BYTE
) {
4796 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4798 else if (transferOps
== 0 &&
4799 !ctx
->Pixel
.MapStencilFlag
&&
4800 srcType
== GL_UNSIGNED_INT
&&
4801 dstType
== GL_UNSIGNED_INT
&&
4802 !srcPacking
->SwapBytes
) {
4803 memcpy(dest
, source
, n
* sizeof(GLuint
));
4809 GLuint indexes
[MAX_WIDTH
];
4810 assert(n
<= MAX_WIDTH
);
4812 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4815 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4816 /* shift and offset indexes */
4817 shift_and_offset_ci(ctx
, n
, indexes
);
4820 if (ctx
->Pixel
.MapStencilFlag
) {
4821 /* Apply stencil lookup table */
4822 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4824 for (i
= 0; i
< n
; i
++) {
4825 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4829 /* convert to dest type */
4831 case GL_UNSIGNED_BYTE
:
4833 GLubyte
*dst
= (GLubyte
*) dest
;
4835 for (i
= 0; i
< n
; i
++) {
4836 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4840 case GL_UNSIGNED_SHORT
:
4842 GLuint
*dst
= (GLuint
*) dest
;
4844 for (i
= 0; i
< n
; i
++) {
4845 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4849 case GL_UNSIGNED_INT
:
4850 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4853 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4860 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4861 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4862 const struct gl_pixelstore_attrib
*dstPacking
)
4864 GLstencil stencil
[MAX_WIDTH
];
4866 ASSERT(n
<= MAX_WIDTH
);
4868 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4869 ctx
->Pixel
.MapStencilFlag
) {
4870 /* make a copy of input */
4871 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4872 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4877 case GL_UNSIGNED_BYTE
:
4878 if (sizeof(GLstencil
) == 1) {
4879 memcpy( dest
, source
, n
);
4882 GLubyte
*dst
= (GLubyte
*) dest
;
4885 dst
[i
] = (GLubyte
) source
[i
];
4891 GLbyte
*dst
= (GLbyte
*) dest
;
4894 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4898 case GL_UNSIGNED_SHORT
:
4900 GLushort
*dst
= (GLushort
*) dest
;
4903 dst
[i
] = (GLushort
) source
[i
];
4905 if (dstPacking
->SwapBytes
) {
4906 _mesa_swap2( (GLushort
*) dst
, n
);
4912 GLshort
*dst
= (GLshort
*) dest
;
4915 dst
[i
] = (GLshort
) source
[i
];
4917 if (dstPacking
->SwapBytes
) {
4918 _mesa_swap2( (GLushort
*) dst
, n
);
4922 case GL_UNSIGNED_INT
:
4924 GLuint
*dst
= (GLuint
*) dest
;
4927 dst
[i
] = (GLuint
) source
[i
];
4929 if (dstPacking
->SwapBytes
) {
4930 _mesa_swap4( (GLuint
*) dst
, n
);
4936 GLint
*dst
= (GLint
*) dest
;
4939 dst
[i
] = (GLint
) source
[i
];
4941 if (dstPacking
->SwapBytes
) {
4942 _mesa_swap4( (GLuint
*) dst
, n
);
4948 GLfloat
*dst
= (GLfloat
*) dest
;
4951 dst
[i
] = (GLfloat
) source
[i
];
4953 if (dstPacking
->SwapBytes
) {
4954 _mesa_swap4( (GLuint
*) dst
, n
);
4958 case GL_HALF_FLOAT_ARB
:
4960 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4963 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4965 if (dstPacking
->SwapBytes
) {
4966 _mesa_swap2( (GLushort
*) dst
, n
);
4971 if (dstPacking
->LsbFirst
) {
4972 GLubyte
*dst
= (GLubyte
*) dest
;
4975 for (i
= 0; i
< n
; i
++) {
4978 *dst
|= ((source
[i
] != 0) << shift
);
4987 GLubyte
*dst
= (GLubyte
*) dest
;
4990 for (i
= 0; i
< n
; i
++) {
4993 *dst
|= ((source
[i
] != 0) << shift
);
5003 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5007 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5010 const GLTYPE *src = (const GLTYPE *)source; \
5011 for (i = 0; i < n; i++) { \
5012 GLTYPE value = src[i]; \
5013 if (srcPacking->SwapBytes) { \
5014 if (sizeof(GLTYPE) == 2) { \
5016 } else if (sizeof(GLTYPE) == 4) { \
5020 depthValues[i] = GLTYPE2FLOAT(value); \
5026 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5027 * or GLfloat values.
5028 * The glPixelTransfer (scale/bias) params will be applied.
5030 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5031 * \param depthMax max value for returned GLushort or GLuint values
5032 * (ignored for GLfloat).
5035 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
,
5036 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5037 GLenum srcType
, const GLvoid
*source
,
5038 const struct gl_pixelstore_attrib
*srcPacking
)
5040 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
5041 GLboolean needClamp
= GL_FALSE
;
5043 /* Look for special cases first.
5044 * Not only are these faster, they're less prone to numeric conversion
5045 * problems. Otherwise, converting from an int type to a float then
5046 * back to an int type can introduce errors that will show up as
5047 * artifacts in things like depth peeling which uses glCopyTexImage.
5049 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5050 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5051 const GLuint
*src
= (const GLuint
*) source
;
5052 GLushort
*dst
= (GLushort
*) dest
;
5054 for (i
= 0; i
< n
; i
++) {
5055 dst
[i
] = src
[i
] >> 16;
5059 if (srcType
== GL_UNSIGNED_SHORT
5060 && dstType
== GL_UNSIGNED_INT
5061 && depthMax
== 0xffffffff) {
5062 const GLushort
*src
= (const GLushort
*) source
;
5063 GLuint
*dst
= (GLuint
*) dest
;
5065 for (i
= 0; i
< n
; i
++) {
5066 dst
[i
] = src
[i
] | (src
[i
] << 16);
5070 if (srcType
== GL_UNSIGNED_INT_24_8
5071 && dstType
== GL_UNSIGNED_INT
5072 && depthMax
== 0xffffff) {
5073 const GLuint
*src
= (const GLuint
*) source
;
5074 GLuint
*dst
= (GLuint
*) dest
;
5076 for (i
= 0; i
< n
; i
++) {
5077 dst
[i
] = src
[i
] >> 8;
5081 /* XXX may want to add additional cases here someday */
5084 /* general case path follows */
5086 if (dstType
== GL_FLOAT
) {
5087 depthValues
= (GLfloat
*) dest
;
5090 depthValues
= depthTemp
;
5093 /* Convert incoming values to GLfloat. Some conversions will require
5098 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
5099 needClamp
= GL_TRUE
;
5101 case GL_UNSIGNED_BYTE
:
5102 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5105 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
5106 needClamp
= GL_TRUE
;
5108 case GL_UNSIGNED_SHORT
:
5109 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5112 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5113 needClamp
= GL_TRUE
;
5115 case GL_UNSIGNED_INT
:
5116 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5118 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5119 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5120 depthMax
== 0xffffff &&
5121 ctx
->Pixel
.DepthScale
== 1.0 &&
5122 ctx
->Pixel
.DepthBias
== 0.0) {
5123 const GLuint
*src
= (const GLuint
*) source
;
5124 GLuint
*zValues
= (GLuint
*) dest
;
5126 for (i
= 0; i
< n
; i
++) {
5127 GLuint value
= src
[i
];
5128 if (srcPacking
->SwapBytes
) {
5131 zValues
[i
] = value
& 0xffffff00;
5136 const GLuint
*src
= (const GLuint
*) source
;
5137 const GLfloat scale
= 1.0f
/ 0xffffff;
5139 for (i
= 0; i
< n
; i
++) {
5140 GLuint value
= src
[i
];
5141 if (srcPacking
->SwapBytes
) {
5144 depthValues
[i
] = (value
>> 8) * scale
;
5149 DEPTH_VALUES(GLfloat
, 1*);
5150 needClamp
= GL_TRUE
;
5152 case GL_HALF_FLOAT_ARB
:
5155 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5156 for (i
= 0; i
< n
; i
++) {
5157 GLhalfARB value
= src
[i
];
5158 if (srcPacking
->SwapBytes
) {
5161 depthValues
[i
] = _mesa_half_to_float(value
);
5163 needClamp
= GL_TRUE
;
5167 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5171 /* apply depth scale and bias */
5173 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5174 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5175 if (scale
!= 1.0 || bias
!= 0.0) {
5177 for (i
= 0; i
< n
; i
++) {
5178 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5180 needClamp
= GL_TRUE
;
5184 /* clamp to [0, 1] */
5187 for (i
= 0; i
< n
; i
++) {
5188 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5193 * Convert values to dstType
5195 if (dstType
== GL_UNSIGNED_INT
) {
5196 GLuint
*zValues
= (GLuint
*) dest
;
5198 if (depthMax
<= 0xffffff) {
5199 /* no overflow worries */
5200 for (i
= 0; i
< n
; i
++) {
5201 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5205 /* need to use double precision to prevent overflow problems */
5206 for (i
= 0; i
< n
; i
++) {
5207 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
5208 if (z
>= (GLdouble
) 0xffffffff)
5209 zValues
[i
] = 0xffffffff;
5211 zValues
[i
] = (GLuint
) z
;
5215 else if (dstType
== GL_UNSIGNED_SHORT
) {
5216 GLushort
*zValues
= (GLushort
*) dest
;
5218 ASSERT(depthMax
<= 0xffff);
5219 for (i
= 0; i
< n
; i
++) {
5220 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5224 ASSERT(dstType
== GL_FLOAT
);
5225 /*ASSERT(depthMax == 1.0F);*/
5231 * Pack an array of depth values. The values are floats in [0,1].
5234 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
5235 GLenum dstType
, const GLfloat
*depthSpan
,
5236 const struct gl_pixelstore_attrib
*dstPacking
)
5238 GLfloat depthCopy
[MAX_WIDTH
];
5240 ASSERT(n
<= MAX_WIDTH
);
5242 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5243 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5244 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5245 depthSpan
= depthCopy
;
5249 case GL_UNSIGNED_BYTE
:
5251 GLubyte
*dst
= (GLubyte
*) dest
;
5253 for (i
= 0; i
< n
; i
++) {
5254 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5260 GLbyte
*dst
= (GLbyte
*) dest
;
5262 for (i
= 0; i
< n
; i
++) {
5263 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5267 case GL_UNSIGNED_SHORT
:
5269 GLushort
*dst
= (GLushort
*) dest
;
5271 for (i
= 0; i
< n
; i
++) {
5272 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5274 if (dstPacking
->SwapBytes
) {
5275 _mesa_swap2( (GLushort
*) dst
, n
);
5281 GLshort
*dst
= (GLshort
*) dest
;
5283 for (i
= 0; i
< n
; i
++) {
5284 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5286 if (dstPacking
->SwapBytes
) {
5287 _mesa_swap2( (GLushort
*) dst
, n
);
5291 case GL_UNSIGNED_INT
:
5293 GLuint
*dst
= (GLuint
*) dest
;
5295 for (i
= 0; i
< n
; i
++) {
5296 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5298 if (dstPacking
->SwapBytes
) {
5299 _mesa_swap4( (GLuint
*) dst
, n
);
5305 GLint
*dst
= (GLint
*) dest
;
5307 for (i
= 0; i
< n
; i
++) {
5308 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5310 if (dstPacking
->SwapBytes
) {
5311 _mesa_swap4( (GLuint
*) dst
, n
);
5317 GLfloat
*dst
= (GLfloat
*) dest
;
5319 for (i
= 0; i
< n
; i
++) {
5320 dst
[i
] = depthSpan
[i
];
5322 if (dstPacking
->SwapBytes
) {
5323 _mesa_swap4( (GLuint
*) dst
, n
);
5327 case GL_HALF_FLOAT_ARB
:
5329 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5331 for (i
= 0; i
< n
; i
++) {
5332 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5334 if (dstPacking
->SwapBytes
) {
5335 _mesa_swap2( (GLushort
*) dst
, n
);
5340 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5347 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5350 _mesa_pack_depth_stencil_span(const GLcontext
*ctx
, GLuint n
, GLuint
*dest
,
5351 const GLfloat
*depthVals
,
5352 const GLstencil
*stencilVals
,
5353 const struct gl_pixelstore_attrib
*dstPacking
)
5355 GLfloat depthCopy
[MAX_WIDTH
];
5356 GLstencil stencilCopy
[MAX_WIDTH
];
5359 ASSERT(n
<= MAX_WIDTH
);
5361 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5362 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5363 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5364 depthVals
= depthCopy
;
5367 if (ctx
->Pixel
.IndexShift
||
5368 ctx
->Pixel
.IndexOffset
||
5369 ctx
->Pixel
.MapStencilFlag
) {
5370 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5371 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5372 stencilVals
= stencilCopy
;
5375 for (i
= 0; i
< n
; i
++) {
5376 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5377 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5380 if (dstPacking
->SwapBytes
) {
5381 _mesa_swap4(dest
, n
);
5389 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5390 * Return all image data in a contiguous block. This is used when we
5391 * compile glDrawPixels, glTexImage, etc into a display list. We
5392 * need a copy of the data in a standard format.
5395 _mesa_unpack_image( GLuint dimensions
,
5396 GLsizei width
, GLsizei height
, GLsizei depth
,
5397 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5398 const struct gl_pixelstore_attrib
*unpack
)
5400 GLint bytesPerRow
, compsPerRow
;
5401 GLboolean flipBytes
, swap2
, swap4
;
5404 return NULL
; /* not necessarily an error */
5406 if (width
<= 0 || height
<= 0 || depth
<= 0)
5407 return NULL
; /* generate error later */
5409 if (type
== GL_BITMAP
) {
5410 bytesPerRow
= (width
+ 7) >> 3;
5411 flipBytes
= unpack
->LsbFirst
;
5412 swap2
= swap4
= GL_FALSE
;
5416 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5417 GLint components
= _mesa_components_in_format(format
);
5420 if (_mesa_type_is_packed(type
))
5423 if (bytesPerPixel
<= 0 || components
<= 0)
5424 return NULL
; /* bad format or type. generate error later */
5425 bytesPerRow
= bytesPerPixel
* width
;
5426 bytesPerComp
= bytesPerPixel
/ components
;
5427 flipBytes
= GL_FALSE
;
5428 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5429 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5430 compsPerRow
= components
* width
;
5431 assert(compsPerRow
>= width
);
5436 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5440 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5443 for (img
= 0; img
< depth
; img
++) {
5444 for (row
= 0; row
< height
; row
++) {
5445 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5446 width
, height
, format
, type
, img
, row
, 0);
5448 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5450 flipBytes
= GL_FALSE
;
5451 if (unpack
->LsbFirst
) {
5452 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5453 GLubyte dstMask
= 128;
5454 const GLubyte
*s
= src
;
5457 for (i
= 0; i
< width
; i
++) {
5461 if (srcMask
== 128) {
5466 srcMask
= srcMask
<< 1;
5474 dstMask
= dstMask
>> 1;
5479 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5480 GLubyte dstMask
= 128;
5481 const GLubyte
*s
= src
;
5484 for (i
= 0; i
< width
; i
++) {
5493 srcMask
= srcMask
>> 1;
5501 dstMask
= dstMask
>> 1;
5507 memcpy(dst
, src
, bytesPerRow
);
5510 /* byte flipping/swapping */
5512 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5515 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5518 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5527 #endif /* _HAVE_FULL_GL */
5532 * Convert an array of RGBA colors from one datatype to another.
5533 * NOTE: src may equal dst. In that case, we use a temporary buffer.
5536 _mesa_convert_colors(GLenum srcType
, const GLvoid
*src
,
5537 GLenum dstType
, GLvoid
*dst
,
5538 GLuint count
, const GLubyte mask
[])
5540 GLuint tempBuffer
[MAX_WIDTH
][4];
5541 const GLboolean useTemp
= (src
== dst
);
5543 ASSERT(srcType
!= dstType
);
5546 case GL_UNSIGNED_BYTE
:
5547 if (dstType
== GL_UNSIGNED_SHORT
) {
5548 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5549 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5551 for (i
= 0; i
< count
; i
++) {
5552 if (!mask
|| mask
[i
]) {
5553 dst2
[i
][RCOMP
] = UBYTE_TO_USHORT(src1
[i
][RCOMP
]);
5554 dst2
[i
][GCOMP
] = UBYTE_TO_USHORT(src1
[i
][GCOMP
]);
5555 dst2
[i
][BCOMP
] = UBYTE_TO_USHORT(src1
[i
][BCOMP
]);
5556 dst2
[i
][ACOMP
] = UBYTE_TO_USHORT(src1
[i
][ACOMP
]);
5560 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5563 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5564 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5566 ASSERT(dstType
== GL_FLOAT
);
5567 for (i
= 0; i
< count
; i
++) {
5568 if (!mask
|| mask
[i
]) {
5569 dst4
[i
][RCOMP
] = UBYTE_TO_FLOAT(src1
[i
][RCOMP
]);
5570 dst4
[i
][GCOMP
] = UBYTE_TO_FLOAT(src1
[i
][GCOMP
]);
5571 dst4
[i
][BCOMP
] = UBYTE_TO_FLOAT(src1
[i
][BCOMP
]);
5572 dst4
[i
][ACOMP
] = UBYTE_TO_FLOAT(src1
[i
][ACOMP
]);
5576 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5579 case GL_UNSIGNED_SHORT
:
5580 if (dstType
== GL_UNSIGNED_BYTE
) {
5581 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5582 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5584 for (i
= 0; i
< count
; i
++) {
5585 if (!mask
|| mask
[i
]) {
5586 dst1
[i
][RCOMP
] = USHORT_TO_UBYTE(src2
[i
][RCOMP
]);
5587 dst1
[i
][GCOMP
] = USHORT_TO_UBYTE(src2
[i
][GCOMP
]);
5588 dst1
[i
][BCOMP
] = USHORT_TO_UBYTE(src2
[i
][BCOMP
]);
5589 dst1
[i
][ACOMP
] = USHORT_TO_UBYTE(src2
[i
][ACOMP
]);
5593 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5596 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5597 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5599 ASSERT(dstType
== GL_FLOAT
);
5600 for (i
= 0; i
< count
; i
++) {
5601 if (!mask
|| mask
[i
]) {
5602 dst4
[i
][RCOMP
] = USHORT_TO_FLOAT(src2
[i
][RCOMP
]);
5603 dst4
[i
][GCOMP
] = USHORT_TO_FLOAT(src2
[i
][GCOMP
]);
5604 dst4
[i
][BCOMP
] = USHORT_TO_FLOAT(src2
[i
][BCOMP
]);
5605 dst4
[i
][ACOMP
] = USHORT_TO_FLOAT(src2
[i
][ACOMP
]);
5609 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5613 if (dstType
== GL_UNSIGNED_BYTE
) {
5614 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5615 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5617 for (i
= 0; i
< count
; i
++) {
5618 if (!mask
|| mask
[i
]) {
5619 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][RCOMP
], src4
[i
][RCOMP
]);
5620 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][GCOMP
], src4
[i
][GCOMP
]);
5621 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][BCOMP
], src4
[i
][BCOMP
]);
5622 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][ACOMP
], src4
[i
][ACOMP
]);
5626 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5629 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5630 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5632 ASSERT(dstType
== GL_UNSIGNED_SHORT
);
5633 for (i
= 0; i
< count
; i
++) {
5634 if (!mask
|| mask
[i
]) {
5635 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][RCOMP
], src4
[i
][RCOMP
]);
5636 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][GCOMP
], src4
[i
][GCOMP
]);
5637 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][BCOMP
], src4
[i
][BCOMP
]);
5638 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][ACOMP
], src4
[i
][ACOMP
]);
5642 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5646 _mesa_problem(NULL
, "Invalid datatype in _mesa_convert_colors");
5654 * Perform basic clipping for glDrawPixels. The image's position and size
5655 * and the unpack SkipPixels and SkipRows are adjusted so that the image
5656 * region is entirely within the window and scissor bounds.
5657 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
5658 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
5659 * we'll actually write. Beforehand, *destY-1 is the first drawing row.
5661 * \return GL_TRUE if image is ready for drawing or
5662 * GL_FALSE if image was completely clipped away (draw nothing)
5665 _mesa_clip_drawpixels(const GLcontext
*ctx
,
5666 GLint
*destX
, GLint
*destY
,
5667 GLsizei
*width
, GLsizei
*height
,
5668 struct gl_pixelstore_attrib
*unpack
)
5670 const GLframebuffer
*buffer
= ctx
->DrawBuffer
;
5672 if (unpack
->RowLength
== 0) {
5673 unpack
->RowLength
= *width
;
5676 ASSERT(ctx
->Pixel
.ZoomX
== 1.0F
);
5677 ASSERT(ctx
->Pixel
.ZoomY
== 1.0F
|| ctx
->Pixel
.ZoomY
== -1.0F
);
5680 if (*destX
< buffer
->_Xmin
) {
5681 unpack
->SkipPixels
+= (buffer
->_Xmin
- *destX
);
5682 *width
-= (buffer
->_Xmin
- *destX
);
5683 *destX
= buffer
->_Xmin
;
5685 /* right clipping */
5686 if (*destX
+ *width
> buffer
->_Xmax
)
5687 *width
-= (*destX
+ *width
- buffer
->_Xmax
);
5692 if (ctx
->Pixel
.ZoomY
== 1.0F
) {
5693 /* bottom clipping */
5694 if (*destY
< buffer
->_Ymin
) {
5695 unpack
->SkipRows
+= (buffer
->_Ymin
- *destY
);
5696 *height
-= (buffer
->_Ymin
- *destY
);
5697 *destY
= buffer
->_Ymin
;
5700 if (*destY
+ *height
> buffer
->_Ymax
)
5701 *height
-= (*destY
+ *height
- buffer
->_Ymax
);
5703 else { /* upside down */
5705 if (*destY
> buffer
->_Ymax
) {
5706 unpack
->SkipRows
+= (*destY
- buffer
->_Ymax
);
5707 *height
-= (*destY
- buffer
->_Ymax
);
5708 *destY
= buffer
->_Ymax
;
5710 /* bottom clipping */
5711 if (*destY
- *height
< buffer
->_Ymin
)
5712 *height
-= (buffer
->_Ymin
- (*destY
- *height
));
5713 /* adjust destY so it's the first row to write to */
5725 * Perform clipping for glReadPixels. The image's window position
5726 * and size, and the pack skipPixels, skipRows and rowLength are adjusted
5727 * so that the image region is entirely within the window bounds.
5728 * Note: this is different from _mesa_clip_drawpixels() in that the
5729 * scissor box is ignored, and we use the bounds of the current readbuffer
5732 * \return GL_TRUE if image is ready for drawing or
5733 * GL_FALSE if image was completely clipped away (draw nothing)
5736 _mesa_clip_readpixels(const GLcontext
*ctx
,
5737 GLint
*srcX
, GLint
*srcY
,
5738 GLsizei
*width
, GLsizei
*height
,
5739 struct gl_pixelstore_attrib
*pack
)
5741 const GLframebuffer
*buffer
= ctx
->ReadBuffer
;
5743 if (pack
->RowLength
== 0) {
5744 pack
->RowLength
= *width
;
5749 pack
->SkipPixels
+= (0 - *srcX
);
5750 *width
-= (0 - *srcX
);
5753 /* right clipping */
5754 if (*srcX
+ *width
> (GLsizei
) buffer
->Width
)
5755 *width
-= (*srcX
+ *width
- buffer
->Width
);
5760 /* bottom clipping */
5762 pack
->SkipRows
+= (0 - *srcY
);
5763 *height
-= (0 - *srcY
);
5767 if (*srcY
+ *height
> (GLsizei
) buffer
->Height
)
5768 *height
-= (*srcY
+ *height
- buffer
->Height
);
5778 * Do clipping for a glCopyTexSubImage call.
5779 * The framebuffer source region might extend outside the framebuffer
5780 * bounds. Clip the source region against the framebuffer bounds and
5781 * adjust the texture/dest position and size accordingly.
5783 * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
5786 _mesa_clip_copytexsubimage(const GLcontext
*ctx
,
5787 GLint
*destX
, GLint
*destY
,
5788 GLint
*srcX
, GLint
*srcY
,
5789 GLsizei
*width
, GLsizei
*height
)
5791 const struct gl_framebuffer
*fb
= ctx
->ReadBuffer
;
5792 const GLint srcX0
= *srcX
, srcY0
= *srcY
;
5794 if (_mesa_clip_to_region(0, 0, fb
->Width
, fb
->Height
,
5795 srcX
, srcY
, width
, height
)) {
5796 *destX
= *destX
+ *srcX
- srcX0
;
5797 *destY
= *destY
+ *srcY
- srcY0
;
5809 * Clip the rectangle defined by (x, y, width, height) against the bounds
5810 * specified by [xmin, xmax) and [ymin, ymax).
5811 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
5814 _mesa_clip_to_region(GLint xmin
, GLint ymin
,
5815 GLint xmax
, GLint ymax
,
5817 GLsizei
*width
, GLsizei
*height
)
5821 *width
-= (xmin
- *x
);
5825 /* right clipping */
5826 if (*x
+ *width
> xmax
)
5827 *width
-= (*x
+ *width
- xmax
);
5832 /* bottom (or top) clipping */
5834 *height
-= (ymin
- *y
);
5838 /* top (or bottom) clipping */
5839 if (*y
+ *height
> ymax
)
5840 *height
-= (*y
+ *height
- ymax
);
5850 * Clip dst coords against Xmax (or Ymax).
5853 clip_right_or_top(GLint
*srcX0
, GLint
*srcX1
,
5854 GLint
*dstX0
, GLint
*dstX1
,
5859 if (*dstX1
> maxValue
) {
5860 /* X1 outside right edge */
5861 ASSERT(*dstX0
< maxValue
); /* X0 should be inside right edge */
5862 t
= (GLfloat
) (maxValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5863 /* chop off [t, 1] part */
5864 ASSERT(t
>= 0.0 && t
<= 1.0);
5866 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5867 *srcX1
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5869 else if (*dstX0
> maxValue
) {
5870 /* X0 outside right edge */
5871 ASSERT(*dstX1
< maxValue
); /* X1 should be inside right edge */
5872 t
= (GLfloat
) (maxValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5873 /* chop off [t, 1] part */
5874 ASSERT(t
>= 0.0 && t
<= 1.0);
5876 bias
= (*srcX0
< *srcX1
) ? -0.5F
: 0.5F
;
5877 *srcX0
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5883 * Clip dst coords against Xmin (or Ymin).
5886 clip_left_or_bottom(GLint
*srcX0
, GLint
*srcX1
,
5887 GLint
*dstX0
, GLint
*dstX1
,
5892 if (*dstX0
< minValue
) {
5893 /* X0 outside left edge */
5894 ASSERT(*dstX1
> minValue
); /* X1 should be inside left edge */
5895 t
= (GLfloat
) (minValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5896 /* chop off [0, t] part */
5897 ASSERT(t
>= 0.0 && t
<= 1.0);
5899 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
; /* flipped??? */
5900 *srcX0
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5902 else if (*dstX1
< minValue
) {
5903 /* X1 outside left edge */
5904 ASSERT(*dstX0
> minValue
); /* X0 should be inside left edge */
5905 t
= (GLfloat
) (minValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5906 /* chop off [0, t] part */
5907 ASSERT(t
>= 0.0 && t
<= 1.0);
5909 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5910 *srcX1
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5916 * Do clipping of blit src/dest rectangles.
5917 * The dest rect is clipped against both the buffer bounds and scissor bounds.
5918 * The src rect is just clipped against the buffer bounds.
5920 * When either the src or dest rect is clipped, the other is also clipped
5923 * Note that X0 need not be less than X1 (same for Y) for either the source
5924 * and dest rects. That makes the clipping a little trickier.
5926 * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
5929 _mesa_clip_blit(GLcontext
*ctx
,
5930 GLint
*srcX0
, GLint
*srcY0
, GLint
*srcX1
, GLint
*srcY1
,
5931 GLint
*dstX0
, GLint
*dstY0
, GLint
*dstX1
, GLint
*dstY1
)
5933 const GLint srcXmin
= 0;
5934 const GLint srcXmax
= ctx
->ReadBuffer
->Width
;
5935 const GLint srcYmin
= 0;
5936 const GLint srcYmax
= ctx
->ReadBuffer
->Height
;
5938 /* these include scissor bounds */
5939 const GLint dstXmin
= ctx
->DrawBuffer
->_Xmin
;
5940 const GLint dstXmax
= ctx
->DrawBuffer
->_Xmax
;
5941 const GLint dstYmin
= ctx
->DrawBuffer
->_Ymin
;
5942 const GLint dstYmax
= ctx
->DrawBuffer
->_Ymax
;
5945 printf("PreClipX: src: %d .. %d dst: %d .. %d\n",
5946 *srcX0, *srcX1, *dstX0, *dstX1);
5947 printf("PreClipY: src: %d .. %d dst: %d .. %d\n",
5948 *srcY0, *srcY1, *dstY0, *dstY1);
5951 /* trivial rejection tests */
5952 if (*dstX0
== *dstX1
)
5953 return GL_FALSE
; /* no width */
5954 if (*dstX0
<= dstXmin
&& *dstX1
<= dstXmin
)
5955 return GL_FALSE
; /* totally out (left) of bounds */
5956 if (*dstX0
>= dstXmax
&& *dstX1
>= dstXmax
)
5957 return GL_FALSE
; /* totally out (right) of bounds */
5959 if (*dstY0
== *dstY1
)
5961 if (*dstY0
<= dstYmin
&& *dstY1
<= dstYmin
)
5963 if (*dstY0
>= dstYmax
&& *dstY1
>= dstYmax
)
5966 if (*srcX0
== *srcX1
)
5968 if (*srcX0
<= srcXmin
&& *srcX1
<= srcXmin
)
5970 if (*srcX0
>= srcXmax
&& *srcX1
>= srcXmax
)
5973 if (*srcY0
== *srcY1
)
5975 if (*srcY0
<= srcYmin
&& *srcY1
<= srcYmin
)
5977 if (*srcY0
>= srcYmax
&& *srcY1
>= srcYmax
)
5983 clip_right_or_top(srcX0
, srcX1
, dstX0
, dstX1
, dstXmax
);
5984 clip_right_or_top(srcY0
, srcY1
, dstY0
, dstY1
, dstYmax
);
5985 clip_left_or_bottom(srcX0
, srcX1
, dstX0
, dstX1
, dstXmin
);
5986 clip_left_or_bottom(srcY0
, srcY1
, dstY0
, dstY1
, dstYmin
);
5989 * src clip (just swap src/dst values from above)
5991 clip_right_or_top(dstX0
, dstX1
, srcX0
, srcX1
, srcXmax
);
5992 clip_right_or_top(dstY0
, dstY1
, srcY0
, srcY1
, srcYmax
);
5993 clip_left_or_bottom(dstX0
, dstX1
, srcX0
, srcX1
, srcXmin
);
5994 clip_left_or_bottom(dstY0
, dstY1
, srcY0
, srcY1
, srcYmin
);
5997 printf("PostClipX: src: %d .. %d dst: %d .. %d\n",
5998 *srcX0, *srcX1, *dstX0, *dstX1);
5999 printf("PostClipY: src: %d .. %d dst: %d .. %d\n",
6000 *srcY0, *srcY1, *dstY0, *dstY1);
6003 ASSERT(*dstX0
>= dstXmin
);
6004 ASSERT(*dstX0
<= dstXmax
);
6005 ASSERT(*dstX1
>= dstXmin
);
6006 ASSERT(*dstX1
<= dstXmax
);
6008 ASSERT(*dstY0
>= dstYmin
);
6009 ASSERT(*dstY0
<= dstYmax
);
6010 ASSERT(*dstY1
>= dstYmin
);
6011 ASSERT(*dstY1
<= dstYmax
);
6013 ASSERT(*srcX0
>= srcXmin
);
6014 ASSERT(*srcX0
<= srcXmax
);
6015 ASSERT(*srcX1
>= srcXmin
);
6016 ASSERT(*srcX1
<= srcXmax
);
6018 ASSERT(*srcY0
>= srcYmin
);
6019 ASSERT(*srcY0
<= srcYmax
);
6020 ASSERT(*srcY1
>= srcYmin
);
6021 ASSERT(*srcY1
<= srcYmax
);