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( struct gl_context
*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_RED
:
667 case GL_COMPRESSED_RG
:
668 case GL_COMPRESSED_RGB
:
669 case GL_COMPRESSED_RGBA
:
674 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
675 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
676 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
677 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
678 case GL_COMPRESSED_RGB_FXT1_3DFX
:
679 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
680 #if FEATURE_EXT_texture_sRGB
683 case GL_SRGB_ALPHA_EXT
:
684 case GL_SRGB8_ALPHA8_EXT
:
685 case GL_SLUMINANCE_ALPHA_EXT
:
686 case GL_SLUMINANCE8_ALPHA8_EXT
:
687 case GL_SLUMINANCE_EXT
:
688 case GL_SLUMINANCE8_EXT
:
689 case GL_COMPRESSED_SRGB_EXT
:
690 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
691 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
692 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
693 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
694 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
695 case GL_COMPRESSED_SLUMINANCE_EXT
:
696 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
697 #endif /* FEATURE_EXT_texture_sRGB */
698 case GL_COMPRESSED_RED_RGTC1
:
699 case GL_COMPRESSED_SIGNED_RED_RGTC1
:
700 case GL_COMPRESSED_RG_RGTC2
:
701 case GL_COMPRESSED_SIGNED_RG_RGTC2
:
703 /* signed texture formats */
707 case GL_YCBCR_MESA
: /* not considered to be RGB */
716 * Test if the given image format is a color index format.
719 _mesa_is_index_format(GLenum format
)
723 case GL_COLOR_INDEX1_EXT
:
724 case GL_COLOR_INDEX2_EXT
:
725 case GL_COLOR_INDEX4_EXT
:
726 case GL_COLOR_INDEX8_EXT
:
727 case GL_COLOR_INDEX12_EXT
:
728 case GL_COLOR_INDEX16_EXT
:
737 * Test if the given image format is a depth component format.
740 _mesa_is_depth_format(GLenum format
)
743 case GL_DEPTH_COMPONENT
:
744 case GL_DEPTH_COMPONENT16
:
745 case GL_DEPTH_COMPONENT24
:
746 case GL_DEPTH_COMPONENT32
:
755 * Test if the given image format is a stencil format.
758 _mesa_is_stencil_format(GLenum format
)
761 case GL_STENCIL_INDEX
:
762 case GL_DEPTH_STENCIL
:
771 * Test if the given image format is a YCbCr format.
774 _mesa_is_ycbcr_format(GLenum format
)
786 * Test if the given image format is a depth+stencil format.
789 _mesa_is_depthstencil_format(GLenum format
)
792 case GL_DEPTH24_STENCIL8_EXT
:
793 case GL_DEPTH_STENCIL_EXT
:
802 * Test if the given image format is a depth or stencil format.
805 _mesa_is_depth_or_stencil_format(GLenum format
)
808 case GL_DEPTH_COMPONENT
:
809 case GL_DEPTH_COMPONENT16
:
810 case GL_DEPTH_COMPONENT24
:
811 case GL_DEPTH_COMPONENT32
:
812 case GL_STENCIL_INDEX
:
813 case GL_STENCIL_INDEX1_EXT
:
814 case GL_STENCIL_INDEX4_EXT
:
815 case GL_STENCIL_INDEX8_EXT
:
816 case GL_STENCIL_INDEX16_EXT
:
817 case GL_DEPTH_STENCIL_EXT
:
818 case GL_DEPTH24_STENCIL8_EXT
:
827 * Test if the given image format is a dudv format.
830 _mesa_is_dudv_format(GLenum format
)
843 * Test if the given format is an integer (non-normalized) format.
846 _mesa_is_integer_format(GLenum format
)
849 case GL_RED_INTEGER_EXT
:
850 case GL_GREEN_INTEGER_EXT
:
851 case GL_BLUE_INTEGER_EXT
:
852 case GL_ALPHA_INTEGER_EXT
:
853 case GL_RGB_INTEGER_EXT
:
854 case GL_RGBA_INTEGER_EXT
:
855 case GL_BGR_INTEGER_EXT
:
856 case GL_BGRA_INTEGER_EXT
:
857 case GL_LUMINANCE_INTEGER_EXT
:
858 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
867 * Test if an image format is a supported compressed format.
868 * \param format the internal format token provided by the user.
869 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
872 _mesa_is_compressed_format(struct gl_context
*ctx
, GLenum format
)
875 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
876 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
877 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
878 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
879 return ctx
->Extensions
.EXT_texture_compression_s3tc
;
884 return ctx
->Extensions
.S3_s3tc
;
885 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
886 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
887 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
888 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
889 return ctx
->Extensions
.EXT_texture_sRGB
890 && ctx
->Extensions
.EXT_texture_compression_s3tc
;
891 case GL_COMPRESSED_RGB_FXT1_3DFX
:
892 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
893 return ctx
->Extensions
.TDFX_texture_compression_FXT1
;
894 case GL_COMPRESSED_RED_RGTC1
:
895 case GL_COMPRESSED_SIGNED_RED_RGTC1
:
896 case GL_COMPRESSED_RG_RGTC2
:
897 case GL_COMPRESSED_SIGNED_RG_RGTC2
:
898 return ctx
->Extensions
.ARB_texture_compression_rgtc
;
906 * Return the address of a specific pixel in an image (1D, 2D or 3D).
908 * Pixel unpacking/packing parameters are observed according to \p packing.
910 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
911 * \param image starting address of image data
912 * \param width the image width
913 * \param height theimage height
914 * \param format the pixel format
915 * \param type the pixel data type
916 * \param packing the pixelstore attributes
917 * \param img which image in the volume (0 for 1D or 2D images)
918 * \param row row of pixel in the image (0 for 1D images)
919 * \param column column of pixel in the image
921 * \return address of pixel on success, or NULL on error.
923 * \sa gl_pixelstore_attrib.
926 _mesa_image_address( GLuint dimensions
,
927 const struct gl_pixelstore_attrib
*packing
,
929 GLsizei width
, GLsizei height
,
930 GLenum format
, GLenum type
,
931 GLint img
, GLint row
, GLint column
)
933 GLint alignment
; /* 1, 2 or 4 */
934 GLint pixels_per_row
;
935 GLint rows_per_image
;
938 GLint skipimages
; /* for 3-D volume images */
941 ASSERT(dimensions
>= 1 && dimensions
<= 3);
943 alignment
= packing
->Alignment
;
944 if (packing
->RowLength
> 0) {
945 pixels_per_row
= packing
->RowLength
;
948 pixels_per_row
= width
;
950 if (packing
->ImageHeight
> 0) {
951 rows_per_image
= packing
->ImageHeight
;
954 rows_per_image
= height
;
957 skippixels
= packing
->SkipPixels
;
958 /* Note: SKIP_ROWS _is_ used for 1D images */
959 skiprows
= packing
->SkipRows
;
960 /* Note: SKIP_IMAGES is only used for 3D images */
961 skipimages
= (dimensions
== 3) ? packing
->SkipImages
: 0;
963 if (type
== GL_BITMAP
) {
965 GLint comp_per_pixel
; /* components per pixel */
966 GLint bytes_per_comp
; /* bytes per component */
968 GLint bytes_per_image
;
970 /* Compute bytes per component */
971 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
972 if (bytes_per_comp
< 0) {
976 /* Compute number of components per pixel */
977 comp_per_pixel
= _mesa_components_in_format( format
);
978 if (comp_per_pixel
< 0) {
982 bytes_per_row
= alignment
983 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
985 bytes_per_image
= bytes_per_row
* rows_per_image
;
987 pixel_addr
= (GLubyte
*) image
988 + (skipimages
+ img
) * bytes_per_image
989 + (skiprows
+ row
) * bytes_per_row
990 + (skippixels
+ column
) / 8;
993 /* Non-BITMAP data */
994 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
997 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
999 /* The pixel type and format should have been error checked earlier */
1000 assert(bytes_per_pixel
> 0);
1002 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
1003 remainder
= bytes_per_row
% alignment
;
1005 bytes_per_row
+= (alignment
- remainder
);
1007 ASSERT(bytes_per_row
% alignment
== 0);
1009 bytes_per_image
= bytes_per_row
* rows_per_image
;
1011 if (packing
->Invert
) {
1012 /* set pixel_addr to the last row */
1013 topOfImage
= bytes_per_row
* (height
- 1);
1014 bytes_per_row
= -bytes_per_row
;
1020 /* compute final pixel address */
1021 pixel_addr
= (GLubyte
*) image
1022 + (skipimages
+ img
) * bytes_per_image
1024 + (skiprows
+ row
) * bytes_per_row
1025 + (skippixels
+ column
) * bytes_per_pixel
;
1028 return (GLvoid
*) pixel_addr
;
1033 _mesa_image_address1d( const struct gl_pixelstore_attrib
*packing
,
1034 const GLvoid
*image
,
1036 GLenum format
, GLenum type
,
1039 return _mesa_image_address(1, packing
, image
, width
, 1,
1040 format
, type
, 0, 0, column
);
1045 _mesa_image_address2d( const struct gl_pixelstore_attrib
*packing
,
1046 const GLvoid
*image
,
1047 GLsizei width
, GLsizei height
,
1048 GLenum format
, GLenum type
,
1049 GLint row
, GLint column
)
1051 return _mesa_image_address(2, packing
, image
, width
, height
,
1052 format
, type
, 0, row
, column
);
1057 _mesa_image_address3d( const struct gl_pixelstore_attrib
*packing
,
1058 const GLvoid
*image
,
1059 GLsizei width
, GLsizei height
,
1060 GLenum format
, GLenum type
,
1061 GLint img
, GLint row
, GLint column
)
1063 return _mesa_image_address(3, packing
, image
, width
, height
,
1064 format
, type
, img
, row
, column
);
1070 * Compute the stride (in bytes) between image rows.
1072 * \param packing the pixelstore attributes
1073 * \param width image width.
1074 * \param format pixel format.
1075 * \param type pixel data type.
1077 * \return the stride in bytes for the given parameters, or -1 if error
1080 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
1081 GLint width
, GLenum format
, GLenum type
)
1083 GLint bytesPerRow
, remainder
;
1087 if (type
== GL_BITMAP
) {
1088 if (packing
->RowLength
== 0) {
1089 bytesPerRow
= (width
+ 7) / 8;
1092 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1096 /* Non-BITMAP data */
1097 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1098 if (bytesPerPixel
<= 0)
1099 return -1; /* error */
1100 if (packing
->RowLength
== 0) {
1101 bytesPerRow
= bytesPerPixel
* width
;
1104 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1108 remainder
= bytesPerRow
% packing
->Alignment
;
1109 if (remainder
> 0) {
1110 bytesPerRow
+= (packing
->Alignment
- remainder
);
1113 if (packing
->Invert
) {
1114 /* negate the bytes per row (negative row stride) */
1115 bytesPerRow
= -bytesPerRow
;
1125 * Compute the stride between images in a 3D texture (in bytes) for the given
1126 * pixel packing parameters and image width, format and type.
1129 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
1130 GLint width
, GLint height
,
1131 GLenum format
, GLenum type
)
1133 GLint bytesPerRow
, bytesPerImage
, remainder
;
1137 if (type
== GL_BITMAP
) {
1138 if (packing
->RowLength
== 0) {
1139 bytesPerRow
= (width
+ 7) / 8;
1142 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1146 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1148 if (bytesPerPixel
<= 0)
1149 return -1; /* error */
1150 if (packing
->RowLength
== 0) {
1151 bytesPerRow
= bytesPerPixel
* width
;
1154 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1158 remainder
= bytesPerRow
% packing
->Alignment
;
1160 bytesPerRow
+= (packing
->Alignment
- remainder
);
1162 if (packing
->ImageHeight
== 0)
1163 bytesPerImage
= bytesPerRow
* height
;
1165 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
1167 return bytesPerImage
;
1172 * Unpack a 32x32 pixel polygon stipple from user memory using the
1173 * current pixel unpack settings.
1176 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
1177 const struct gl_pixelstore_attrib
*unpacking
)
1179 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
1181 /* Convert pattern from GLubytes to GLuints and handle big/little
1182 * endian differences
1186 for (i
= 0; i
< 32; i
++) {
1187 dest
[i
] = (p
[0] << 24)
1199 * Pack polygon stipple into user memory given current pixel packing
1203 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
1204 const struct gl_pixelstore_attrib
*packing
)
1206 /* Convert pattern from GLuints to GLubytes to handle big/little
1207 * endian differences.
1211 for (i
= 0; i
< 32; i
++) {
1212 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
1213 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
1214 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
1215 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
1218 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
1223 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
1224 * order with row alignment = 1 byte.
1227 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
1228 const struct gl_pixelstore_attrib
*packing
)
1230 GLint bytes
, row
, width_in_bytes
;
1231 GLubyte
*buffer
, *dst
;
1236 /* Alloc dest storage */
1237 bytes
= ((width
+ 7) / 8 * height
);
1238 buffer
= (GLubyte
*) malloc( bytes
);
1242 width_in_bytes
= CEILING( width
, 8 );
1244 for (row
= 0; row
< height
; row
++) {
1245 const GLubyte
*src
= (const GLubyte
*)
1246 _mesa_image_address2d(packing
, pixels
, width
, height
,
1247 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1253 if ((packing
->SkipPixels
& 7) == 0) {
1254 memcpy( dst
, src
, width_in_bytes
);
1255 if (packing
->LsbFirst
) {
1256 flip_bytes( dst
, width_in_bytes
);
1260 /* handling SkipPixels is a bit tricky (no pun intended!) */
1262 if (packing
->LsbFirst
) {
1263 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
1264 GLubyte dstMask
= 128;
1265 const GLubyte
*s
= src
;
1268 for (i
= 0; i
< width
; i
++) {
1272 if (srcMask
== 128) {
1277 srcMask
= srcMask
<< 1;
1285 dstMask
= dstMask
>> 1;
1290 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
1291 GLubyte dstMask
= 128;
1292 const GLubyte
*s
= src
;
1295 for (i
= 0; i
< width
; i
++) {
1304 srcMask
= srcMask
>> 1;
1312 dstMask
= dstMask
>> 1;
1317 dst
+= width_in_bytes
;
1328 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
1329 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
1331 GLint row
, width_in_bytes
;
1337 width_in_bytes
= CEILING( width
, 8 );
1339 for (row
= 0; row
< height
; row
++) {
1340 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
1341 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1345 if ((packing
->SkipPixels
& 7) == 0) {
1346 memcpy( dst
, src
, width_in_bytes
);
1347 if (packing
->LsbFirst
) {
1348 flip_bytes( dst
, width_in_bytes
);
1352 /* handling SkipPixels is a bit tricky (no pun intended!) */
1354 if (packing
->LsbFirst
) {
1355 GLubyte srcMask
= 128;
1356 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
1357 const GLubyte
*s
= src
;
1360 for (i
= 0; i
< width
; i
++) {
1369 srcMask
= srcMask
>> 1;
1371 if (dstMask
== 128) {
1377 dstMask
= dstMask
<< 1;
1382 GLubyte srcMask
= 128;
1383 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
1384 const GLubyte
*s
= src
;
1387 for (i
= 0; i
< width
; i
++) {
1396 srcMask
= srcMask
>> 1;
1404 dstMask
= dstMask
>> 1;
1409 src
+= width_in_bytes
;
1415 * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1416 * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1417 * "On" bits will set texels to \p onValue.
1418 * "Off" bits will not modify texels.
1419 * \param width src bitmap width in pixels
1420 * \param height src bitmap height in pixels
1421 * \param unpack bitmap unpacking state
1422 * \param bitmap the src bitmap data
1423 * \param destBuffer start of dest buffer
1424 * \param destStride row stride in dest buffer
1425 * \param onValue if bit is 1, set destBuffer pixel to this value
1428 _mesa_expand_bitmap(GLsizei width
, GLsizei height
,
1429 const struct gl_pixelstore_attrib
*unpack
,
1430 const GLubyte
*bitmap
,
1431 GLubyte
*destBuffer
, GLint destStride
,
1434 const GLubyte
*srcRow
= (const GLubyte
*)
1435 _mesa_image_address2d(unpack
, bitmap
, width
, height
,
1436 GL_COLOR_INDEX
, GL_BITMAP
, 0, 0);
1437 const GLint srcStride
= _mesa_image_row_stride(unpack
, width
,
1438 GL_COLOR_INDEX
, GL_BITMAP
);
1441 #define SET_PIXEL(COL, ROW) \
1442 destBuffer[(ROW) * destStride + (COL)] = onValue;
1444 for (row
= 0; row
< height
; row
++) {
1445 const GLubyte
*src
= srcRow
;
1447 if (unpack
->LsbFirst
) {
1449 GLubyte mask
= 1U << (unpack
->SkipPixels
& 0x7);
1450 for (col
= 0; col
< width
; col
++) {
1453 SET_PIXEL(col
, row
);
1465 /* get ready for next row */
1471 GLubyte mask
= 128U >> (unpack
->SkipPixels
& 0x7);
1472 for (col
= 0; col
< width
; col
++) {
1475 SET_PIXEL(col
, row
);
1487 /* get ready for next row */
1492 srcRow
+= srcStride
;
1499 /**********************************************************************/
1500 /***** Pixel processing functions ******/
1501 /**********************************************************************/
1504 * Apply scale and bias factors to an array of RGBA pixels.
1507 _mesa_scale_and_bias_rgba(GLuint n
, GLfloat rgba
[][4],
1508 GLfloat rScale
, GLfloat gScale
,
1509 GLfloat bScale
, GLfloat aScale
,
1510 GLfloat rBias
, GLfloat gBias
,
1511 GLfloat bBias
, GLfloat aBias
)
1513 if (rScale
!= 1.0 || rBias
!= 0.0) {
1515 for (i
= 0; i
< n
; i
++) {
1516 rgba
[i
][RCOMP
] = rgba
[i
][RCOMP
] * rScale
+ rBias
;
1519 if (gScale
!= 1.0 || gBias
!= 0.0) {
1521 for (i
= 0; i
< n
; i
++) {
1522 rgba
[i
][GCOMP
] = rgba
[i
][GCOMP
] * gScale
+ gBias
;
1525 if (bScale
!= 1.0 || bBias
!= 0.0) {
1527 for (i
= 0; i
< n
; i
++) {
1528 rgba
[i
][BCOMP
] = rgba
[i
][BCOMP
] * bScale
+ bBias
;
1531 if (aScale
!= 1.0 || aBias
!= 0.0) {
1533 for (i
= 0; i
< n
; i
++) {
1534 rgba
[i
][ACOMP
] = rgba
[i
][ACOMP
] * aScale
+ aBias
;
1541 * Apply pixel mapping to an array of floating point RGBA pixels.
1544 _mesa_map_rgba( const struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4] )
1546 const GLfloat rscale
= (GLfloat
) (ctx
->PixelMaps
.RtoR
.Size
- 1);
1547 const GLfloat gscale
= (GLfloat
) (ctx
->PixelMaps
.GtoG
.Size
- 1);
1548 const GLfloat bscale
= (GLfloat
) (ctx
->PixelMaps
.BtoB
.Size
- 1);
1549 const GLfloat ascale
= (GLfloat
) (ctx
->PixelMaps
.AtoA
.Size
- 1);
1550 const GLfloat
*rMap
= ctx
->PixelMaps
.RtoR
.Map
;
1551 const GLfloat
*gMap
= ctx
->PixelMaps
.GtoG
.Map
;
1552 const GLfloat
*bMap
= ctx
->PixelMaps
.BtoB
.Map
;
1553 const GLfloat
*aMap
= ctx
->PixelMaps
.AtoA
.Map
;
1556 GLfloat r
= CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1557 GLfloat g
= CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1558 GLfloat b
= CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1559 GLfloat a
= CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1560 rgba
[i
][RCOMP
] = rMap
[IROUND(r
* rscale
)];
1561 rgba
[i
][GCOMP
] = gMap
[IROUND(g
* gscale
)];
1562 rgba
[i
][BCOMP
] = bMap
[IROUND(b
* bscale
)];
1563 rgba
[i
][ACOMP
] = aMap
[IROUND(a
* ascale
)];
1568 * Apply a color table lookup to an array of floating point RGBA colors.
1571 _mesa_lookup_rgba_float(const struct gl_color_table
*table
,
1572 GLuint n
, GLfloat rgba
[][4])
1574 const GLint max
= table
->Size
- 1;
1575 const GLfloat scale
= (GLfloat
) max
;
1576 const GLfloat
*lut
= table
->TableF
;
1579 if (!table
->TableF
|| table
->Size
== 0)
1582 switch (table
->_BaseFormat
) {
1584 /* replace RGBA with I */
1585 for (i
= 0; i
< n
; i
++) {
1586 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1587 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1595 /* replace RGB with L */
1596 for (i
= 0; i
< n
; i
++) {
1597 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1598 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1605 /* replace A with A */
1606 for (i
= 0; i
< n
; i
++) {
1607 GLint j
= IROUND(rgba
[i
][ACOMP
] * scale
);
1608 rgba
[i
][ACOMP
] = lut
[CLAMP(j
, 0, max
)];
1611 case GL_LUMINANCE_ALPHA
:
1612 /* replace RGBA with LLLA */
1613 for (i
= 0; i
< n
; i
++) {
1614 GLint jL
= IROUND(rgba
[i
][RCOMP
] * scale
);
1615 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1616 GLfloat luminance
, alpha
;
1617 jL
= CLAMP(jL
, 0, max
);
1618 jA
= CLAMP(jA
, 0, max
);
1619 luminance
= lut
[jL
* 2 + 0];
1620 alpha
= lut
[jA
* 2 + 1];
1623 rgba
[i
][BCOMP
] = luminance
;
1624 rgba
[i
][ACOMP
] = alpha
;;
1628 /* replace RGB with RGB */
1629 for (i
= 0; i
< n
; i
++) {
1630 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1631 jR
= CLAMP(jR
, 0, max
);
1632 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1636 /* replace RG with RG */
1637 for (i
= 0; i
< n
; i
++) {
1638 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1639 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1640 jR
= CLAMP(jR
, 0, max
);
1641 jG
= CLAMP(jG
, 0, max
);
1642 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1643 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1647 /* replace RGB with RGB */
1648 for (i
= 0; i
< n
; i
++) {
1649 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1650 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1651 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1652 jR
= CLAMP(jR
, 0, max
);
1653 jG
= CLAMP(jG
, 0, max
);
1654 jB
= CLAMP(jB
, 0, max
);
1655 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1656 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1657 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1661 /* replace RGBA with RGBA */
1662 for (i
= 0; i
< n
; i
++) {
1663 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1664 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1665 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1666 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1667 jR
= CLAMP(jR
, 0, max
);
1668 jG
= CLAMP(jG
, 0, max
);
1669 jB
= CLAMP(jB
, 0, max
);
1670 jA
= CLAMP(jA
, 0, max
);
1671 rgba
[i
][RCOMP
] = lut
[jR
* 4 + 0];
1672 rgba
[i
][GCOMP
] = lut
[jG
* 4 + 1];
1673 rgba
[i
][BCOMP
] = lut
[jB
* 4 + 2];
1674 rgba
[i
][ACOMP
] = lut
[jA
* 4 + 3];
1678 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_float");
1686 * Apply a color table lookup to an array of ubyte/RGBA colors.
1689 _mesa_lookup_rgba_ubyte(const struct gl_color_table
*table
,
1690 GLuint n
, GLubyte rgba
[][4])
1692 const GLubyte
*lut
= table
->TableUB
;
1693 const GLfloat scale
= (GLfloat
) (table
->Size
- 1) / (GLfloat
)255.0;
1696 if (!table
->TableUB
|| table
->Size
== 0)
1699 switch (table
->_BaseFormat
) {
1701 /* replace RGBA with I */
1702 if (table
->Size
== 256) {
1703 for (i
= 0; i
< n
; i
++) {
1704 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1712 for (i
= 0; i
< n
; i
++) {
1713 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1717 rgba
[i
][ACOMP
] = lut
[j
];
1722 /* replace RGB with L */
1723 if (table
->Size
== 256) {
1724 for (i
= 0; i
< n
; i
++) {
1725 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1732 for (i
= 0; i
< n
; i
++) {
1733 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1736 rgba
[i
][BCOMP
] = lut
[j
];
1741 /* replace A with A */
1742 if (table
->Size
== 256) {
1743 for (i
= 0; i
< n
; i
++) {
1744 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
]];
1748 for (i
= 0; i
< n
; i
++) {
1749 GLint j
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1750 rgba
[i
][ACOMP
] = lut
[j
];
1754 case GL_LUMINANCE_ALPHA
:
1755 /* replace RGBA with LLLA */
1756 if (table
->Size
== 256) {
1757 for (i
= 0; i
< n
; i
++) {
1758 GLubyte l
= lut
[rgba
[i
][RCOMP
] * 2 + 0];
1759 GLubyte a
= lut
[rgba
[i
][ACOMP
] * 2 + 1];;
1767 for (i
= 0; i
< n
; i
++) {
1768 GLint jL
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1769 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1770 GLubyte luminance
= lut
[jL
* 2 + 0];
1771 GLubyte alpha
= lut
[jA
* 2 + 1];
1774 rgba
[i
][BCOMP
] = luminance
;
1775 rgba
[i
][ACOMP
] = alpha
;
1780 if (table
->Size
== 256) {
1781 for (i
= 0; i
< n
; i
++) {
1782 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 3 + 0];
1783 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 3 + 1];
1784 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 3 + 2];
1788 for (i
= 0; i
< n
; i
++) {
1789 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1790 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1791 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1792 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1793 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1794 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1799 if (table
->Size
== 256) {
1800 for (i
= 0; i
< n
; i
++) {
1801 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 4 + 0];
1802 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 4 + 1];
1803 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 4 + 2];
1804 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
] * 4 + 3];
1808 for (i
= 0; i
< n
; i
++) {
1809 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1810 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1811 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1812 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1813 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][RCOMP
], lut
[jR
* 4 + 0]);
1814 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][GCOMP
], lut
[jG
* 4 + 1]);
1815 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][BCOMP
], lut
[jB
* 4 + 2]);
1816 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][ACOMP
], lut
[jA
* 4 + 3]);
1821 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_chan");
1829 * Map color indexes to float rgba values.
1832 _mesa_map_ci_to_rgba( const struct gl_context
*ctx
, GLuint n
,
1833 const GLuint index
[], GLfloat rgba
[][4] )
1835 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1836 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1837 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1838 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1839 const GLfloat
*rMap
= ctx
->PixelMaps
.ItoR
.Map
;
1840 const GLfloat
*gMap
= ctx
->PixelMaps
.ItoG
.Map
;
1841 const GLfloat
*bMap
= ctx
->PixelMaps
.ItoB
.Map
;
1842 const GLfloat
*aMap
= ctx
->PixelMaps
.ItoA
.Map
;
1845 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1846 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1847 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1848 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1854 * Map ubyte color indexes to ubyte/RGBA values.
1857 _mesa_map_ci8_to_rgba8(const struct gl_context
*ctx
, GLuint n
, const GLubyte index
[],
1860 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1861 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1862 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1863 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1864 const GLubyte
*rMap
= ctx
->PixelMaps
.ItoR
.Map8
;
1865 const GLubyte
*gMap
= ctx
->PixelMaps
.ItoG
.Map8
;
1866 const GLubyte
*bMap
= ctx
->PixelMaps
.ItoB
.Map8
;
1867 const GLubyte
*aMap
= ctx
->PixelMaps
.ItoA
.Map8
;
1870 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1871 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1872 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1873 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1879 _mesa_scale_and_bias_depth(const struct gl_context
*ctx
, GLuint n
,
1880 GLfloat depthValues
[])
1882 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
1883 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
1885 for (i
= 0; i
< n
; i
++) {
1886 GLfloat d
= depthValues
[i
] * scale
+ bias
;
1887 depthValues
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
1893 _mesa_scale_and_bias_depth_uint(const struct gl_context
*ctx
, GLuint n
,
1894 GLuint depthValues
[])
1896 const GLdouble max
= (double) 0xffffffff;
1897 const GLdouble scale
= ctx
->Pixel
.DepthScale
;
1898 const GLdouble bias
= ctx
->Pixel
.DepthBias
* max
;
1900 for (i
= 0; i
< n
; i
++) {
1901 GLdouble d
= (GLdouble
) depthValues
[i
] * scale
+ bias
;
1902 d
= CLAMP(d
, 0.0, max
);
1903 depthValues
[i
] = (GLuint
) d
;
1908 * Apply various pixel transfer operations to an array of RGBA pixels
1909 * as indicated by the transferOps bitmask
1912 _mesa_apply_rgba_transfer_ops(struct gl_context
*ctx
, GLbitfield transferOps
,
1913 GLuint n
, GLfloat rgba
[][4])
1916 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
1917 _mesa_scale_and_bias_rgba(n
, rgba
,
1918 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
1919 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
1920 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
1921 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
1923 /* color map lookup */
1924 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1925 _mesa_map_rgba( ctx
, n
, rgba
);
1928 /* clamping to [0,1] */
1929 if (transferOps
& IMAGE_CLAMP_BIT
) {
1931 for (i
= 0; i
< n
; i
++) {
1932 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1933 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1934 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1935 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1942 * Apply color index shift and offset to an array of pixels.
1945 shift_and_offset_ci( const struct gl_context
*ctx
, GLuint n
, GLuint indexes
[] )
1947 GLint shift
= ctx
->Pixel
.IndexShift
;
1948 GLint offset
= ctx
->Pixel
.IndexOffset
;
1952 indexes
[i
] = (indexes
[i
] << shift
) + offset
;
1955 else if (shift
< 0) {
1958 indexes
[i
] = (indexes
[i
] >> shift
) + offset
;
1963 indexes
[i
] = indexes
[i
] + offset
;
1971 * Apply color index shift, offset and table lookup to an array
1975 _mesa_apply_ci_transfer_ops(const struct gl_context
*ctx
, GLbitfield transferOps
,
1976 GLuint n
, GLuint indexes
[])
1978 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
1979 shift_and_offset_ci(ctx
, n
, indexes
);
1981 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1982 const GLuint mask
= ctx
->PixelMaps
.ItoI
.Size
- 1;
1984 for (i
= 0; i
< n
; i
++) {
1985 const GLuint j
= indexes
[i
] & mask
;
1986 indexes
[i
] = IROUND(ctx
->PixelMaps
.ItoI
.Map
[j
]);
1993 * Apply stencil index shift, offset and table lookup to an array
1994 * of stencil values.
1997 _mesa_apply_stencil_transfer_ops(const struct gl_context
*ctx
, GLuint n
,
1998 GLstencil stencil
[])
2000 if (ctx
->Pixel
.IndexShift
!= 0 || ctx
->Pixel
.IndexOffset
!= 0) {
2001 const GLint offset
= ctx
->Pixel
.IndexOffset
;
2002 GLint shift
= ctx
->Pixel
.IndexShift
;
2005 for (i
= 0; i
< n
; i
++) {
2006 stencil
[i
] = (stencil
[i
] << shift
) + offset
;
2009 else if (shift
< 0) {
2011 for (i
= 0; i
< n
; i
++) {
2012 stencil
[i
] = (stencil
[i
] >> shift
) + offset
;
2016 for (i
= 0; i
< n
; i
++) {
2017 stencil
[i
] = stencil
[i
] + offset
;
2021 if (ctx
->Pixel
.MapStencilFlag
) {
2022 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
2024 for (i
= 0; i
< n
; i
++) {
2025 stencil
[i
] = (GLstencil
)ctx
->PixelMaps
.StoS
.Map
[ stencil
[i
] & mask
];
2032 * Used to pack an array [][4] of RGBA float colors as specified
2033 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
2034 * Note: the rgba values will be modified by this function when any pixel
2035 * transfer ops are enabled.
2038 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
2039 GLenum dstFormat
, GLenum dstType
,
2041 const struct gl_pixelstore_attrib
*dstPacking
,
2042 GLbitfield transferOps
)
2044 GLfloat luminance
[MAX_WIDTH
];
2045 const GLint comps
= _mesa_components_in_format(dstFormat
);
2049 * This test should probably go away. Have the caller set/clear the
2050 * IMAGE_CLAMP_BIT as needed.
2052 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
2053 /* need to clamp to [0, 1] */
2054 transferOps
|= IMAGE_CLAMP_BIT
;
2058 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
2061 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
2062 /* compute luminance values */
2063 if (transferOps
& IMAGE_CLAMP_BIT
) {
2064 for (i
= 0; i
< n
; i
++) {
2065 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2066 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
2070 for (i
= 0; i
< n
; i
++) {
2071 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2077 * Pack/store the pixels. Ugh! Lots of cases!!!
2080 case GL_UNSIGNED_BYTE
:
2082 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2083 switch (dstFormat
) {
2086 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2090 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2094 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2098 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2102 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
2104 case GL_LUMINANCE_ALPHA
:
2106 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
2107 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2112 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2113 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2118 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2119 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2120 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2125 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2126 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2127 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2128 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2133 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2134 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2135 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2140 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2141 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2142 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2143 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2148 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2149 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2150 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2151 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2157 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2158 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2162 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2168 GLbyte
*dst
= (GLbyte
*) dstAddr
;
2169 switch (dstFormat
) {
2172 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2176 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2180 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2184 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2188 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
2190 case GL_LUMINANCE_ALPHA
:
2192 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
2193 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2198 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2199 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2204 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2205 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2206 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2211 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2212 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2213 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2214 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2219 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2220 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2221 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2226 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2227 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2228 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2229 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2234 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2235 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2236 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2237 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2243 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2244 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2248 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2252 case GL_UNSIGNED_SHORT
:
2254 GLushort
*dst
= (GLushort
*) dstAddr
;
2255 switch (dstFormat
) {
2258 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
2262 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
2266 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
2270 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
2274 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
2276 case GL_LUMINANCE_ALPHA
:
2278 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
2279 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
2284 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
2285 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
2290 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
2291 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2292 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
2297 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
2298 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2299 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
2300 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2305 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
2306 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2307 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
2312 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
2313 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2314 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
2315 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2320 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
2321 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
2322 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
2323 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
2329 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
2330 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
2334 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2340 GLshort
*dst
= (GLshort
*) dstAddr
;
2341 switch (dstFormat
) {
2344 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2348 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2352 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2356 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2360 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
2362 case GL_LUMINANCE_ALPHA
:
2364 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
2365 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2370 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2371 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2376 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2377 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2378 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2383 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2384 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2385 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2386 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2391 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2392 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2393 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2398 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2399 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2400 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2401 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2406 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2407 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2408 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2409 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2415 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2416 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2420 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2424 case GL_UNSIGNED_INT
:
2426 GLuint
*dst
= (GLuint
*) dstAddr
;
2427 switch (dstFormat
) {
2430 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2434 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2438 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2442 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2446 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
2448 case GL_LUMINANCE_ALPHA
:
2450 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
2451 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2456 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2457 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2462 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2463 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2464 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2469 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2470 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2471 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2472 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2477 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2478 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2479 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2484 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2485 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2486 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2487 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2492 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2493 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2494 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2495 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2501 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2502 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2506 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2512 GLint
*dst
= (GLint
*) dstAddr
;
2513 switch (dstFormat
) {
2516 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2520 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2524 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2528 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2532 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2534 case GL_LUMINANCE_ALPHA
:
2536 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2537 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2542 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2543 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2548 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2549 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2550 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2555 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2556 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2557 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2558 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2563 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2564 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2565 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2570 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2571 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2572 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2573 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2578 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2579 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2580 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2581 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2587 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2588 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2592 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2598 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2599 switch (dstFormat
) {
2602 dst
[i
] = rgba
[i
][RCOMP
];
2606 dst
[i
] = rgba
[i
][GCOMP
];
2610 dst
[i
] = rgba
[i
][BCOMP
];
2614 dst
[i
] = rgba
[i
][ACOMP
];
2618 dst
[i
] = luminance
[i
];
2620 case GL_LUMINANCE_ALPHA
:
2622 dst
[i
*2+0] = luminance
[i
];
2623 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2628 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2629 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2634 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2635 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2636 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2641 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2642 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2643 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2644 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2649 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2650 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2651 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2656 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2657 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2658 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2659 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2664 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2665 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2666 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2667 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2673 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2674 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2678 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2682 case GL_HALF_FLOAT_ARB
:
2684 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2685 switch (dstFormat
) {
2688 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2692 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2696 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2700 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2704 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2706 case GL_LUMINANCE_ALPHA
:
2708 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2709 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2714 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2715 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2720 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2721 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2722 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2727 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2728 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2729 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2730 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2735 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2736 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2737 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2742 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2743 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2744 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2745 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2750 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2751 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2752 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2753 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2759 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2760 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2764 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2768 case GL_UNSIGNED_BYTE_3_3_2
:
2769 if (dstFormat
== GL_RGB
) {
2770 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2772 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2773 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2774 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
2778 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2779 if (dstFormat
== GL_RGB
) {
2780 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2782 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
2783 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2784 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2788 case GL_UNSIGNED_SHORT_5_6_5
:
2789 if (dstFormat
== GL_RGB
) {
2790 GLushort
*dst
= (GLushort
*) dstAddr
;
2792 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2793 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2794 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
2798 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2799 if (dstFormat
== GL_RGB
) {
2800 GLushort
*dst
= (GLushort
*) dstAddr
;
2802 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2803 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2804 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2808 case GL_UNSIGNED_SHORT_4_4_4_4
:
2809 if (dstFormat
== GL_RGBA
) {
2810 GLushort
*dst
= (GLushort
*) dstAddr
;
2812 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2813 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2814 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2815 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2818 else if (dstFormat
== GL_BGRA
) {
2819 GLushort
*dst
= (GLushort
*) dstAddr
;
2821 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2822 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2823 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2824 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2827 else if (dstFormat
== GL_ABGR_EXT
) {
2828 GLushort
*dst
= (GLushort
*) dstAddr
;
2830 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2831 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2832 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2833 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
2837 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2838 if (dstFormat
== GL_RGBA
) {
2839 GLushort
*dst
= (GLushort
*) dstAddr
;
2841 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
2842 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2843 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2844 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2847 else if (dstFormat
== GL_BGRA
) {
2848 GLushort
*dst
= (GLushort
*) dstAddr
;
2850 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
2851 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2852 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2853 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2856 else if (dstFormat
== GL_ABGR_EXT
) {
2857 GLushort
*dst
= (GLushort
*) dstAddr
;
2859 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
2860 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2861 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2862 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2866 case GL_UNSIGNED_SHORT_5_5_5_1
:
2867 if (dstFormat
== GL_RGBA
) {
2868 GLushort
*dst
= (GLushort
*) dstAddr
;
2870 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2871 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2872 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2873 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2876 else if (dstFormat
== GL_BGRA
) {
2877 GLushort
*dst
= (GLushort
*) dstAddr
;
2879 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2880 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2881 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2882 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2885 else if (dstFormat
== GL_ABGR_EXT
) {
2886 GLushort
*dst
= (GLushort
*) dstAddr
;
2888 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2889 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2890 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2891 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
2895 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2896 if (dstFormat
== GL_RGBA
) {
2897 GLushort
*dst
= (GLushort
*) dstAddr
;
2899 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2900 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2901 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2902 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2905 else if (dstFormat
== GL_BGRA
) {
2906 GLushort
*dst
= (GLushort
*) dstAddr
;
2908 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
2909 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2910 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2911 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2914 else if (dstFormat
== GL_ABGR_EXT
) {
2915 GLushort
*dst
= (GLushort
*) dstAddr
;
2917 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
2918 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2919 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2920 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2924 case GL_UNSIGNED_INT_8_8_8_8
:
2925 if (dstFormat
== GL_RGBA
) {
2926 GLuint
*dst
= (GLuint
*) dstAddr
;
2928 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
2929 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2930 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
2931 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2934 else if (dstFormat
== GL_BGRA
) {
2935 GLuint
*dst
= (GLuint
*) dstAddr
;
2937 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
2938 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2939 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
2940 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2943 else if (dstFormat
== GL_ABGR_EXT
) {
2944 GLuint
*dst
= (GLuint
*) dstAddr
;
2946 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
2947 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
2948 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
2949 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
2953 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2954 if (dstFormat
== GL_RGBA
) {
2955 GLuint
*dst
= (GLuint
*) dstAddr
;
2957 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
2958 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2959 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2960 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2963 else if (dstFormat
== GL_BGRA
) {
2964 GLuint
*dst
= (GLuint
*) dstAddr
;
2966 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
2967 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2968 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
2969 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2972 else if (dstFormat
== GL_ABGR_EXT
) {
2973 GLuint
*dst
= (GLuint
*) dstAddr
;
2975 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
2976 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
2977 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
2978 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
2982 case GL_UNSIGNED_INT_10_10_10_2
:
2983 if (dstFormat
== GL_RGBA
) {
2984 GLuint
*dst
= (GLuint
*) dstAddr
;
2986 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
2987 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2988 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
2989 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
2992 else if (dstFormat
== GL_BGRA
) {
2993 GLuint
*dst
= (GLuint
*) dstAddr
;
2995 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
2996 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2997 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
2998 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
3001 else if (dstFormat
== GL_ABGR_EXT
) {
3002 GLuint
*dst
= (GLuint
*) dstAddr
;
3004 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
3005 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
3006 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
3007 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
3011 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3012 if (dstFormat
== GL_RGBA
) {
3013 GLuint
*dst
= (GLuint
*) dstAddr
;
3015 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
3016 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
3017 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
3018 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
3021 else if (dstFormat
== GL_BGRA
) {
3022 GLuint
*dst
= (GLuint
*) dstAddr
;
3024 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
3025 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
3026 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
3027 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
3030 else if (dstFormat
== GL_ABGR_EXT
) {
3031 GLuint
*dst
= (GLuint
*) dstAddr
;
3033 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
3034 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
3035 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
3036 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
3041 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
3045 if (dstPacking
->SwapBytes
) {
3046 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
3047 if (swapSize
== 2) {
3048 if (dstPacking
->SwapBytes
) {
3049 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
3052 else if (swapSize
== 4) {
3053 if (dstPacking
->SwapBytes
) {
3054 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
3061 #define SWAP2BYTE(VALUE) \
3063 GLubyte *bytes = (GLubyte *) &(VALUE); \
3064 GLubyte tmp = bytes[0]; \
3065 bytes[0] = bytes[1]; \
3069 #define SWAP4BYTE(VALUE) \
3071 GLubyte *bytes = (GLubyte *) &(VALUE); \
3072 GLubyte tmp = bytes[0]; \
3073 bytes[0] = bytes[3]; \
3076 bytes[1] = bytes[2]; \
3082 extract_uint_indexes(GLuint n
, GLuint indexes
[],
3083 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3084 const struct gl_pixelstore_attrib
*unpack
)
3086 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
3088 ASSERT(srcType
== GL_BITMAP
||
3089 srcType
== GL_UNSIGNED_BYTE
||
3090 srcType
== GL_BYTE
||
3091 srcType
== GL_UNSIGNED_SHORT
||
3092 srcType
== GL_SHORT
||
3093 srcType
== GL_UNSIGNED_INT
||
3094 srcType
== GL_INT
||
3095 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3096 srcType
== GL_HALF_FLOAT_ARB
||
3097 srcType
== GL_FLOAT
);
3102 GLubyte
*ubsrc
= (GLubyte
*) src
;
3103 if (unpack
->LsbFirst
) {
3104 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
3106 for (i
= 0; i
< n
; i
++) {
3107 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3118 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
3120 for (i
= 0; i
< n
; i
++) {
3121 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3133 case GL_UNSIGNED_BYTE
:
3136 const GLubyte
*s
= (const GLubyte
*) src
;
3137 for (i
= 0; i
< n
; i
++)
3144 const GLbyte
*s
= (const GLbyte
*) src
;
3145 for (i
= 0; i
< n
; i
++)
3149 case GL_UNSIGNED_SHORT
:
3152 const GLushort
*s
= (const GLushort
*) src
;
3153 if (unpack
->SwapBytes
) {
3154 for (i
= 0; i
< n
; i
++) {
3155 GLushort value
= s
[i
];
3161 for (i
= 0; i
< n
; i
++)
3169 const GLshort
*s
= (const GLshort
*) src
;
3170 if (unpack
->SwapBytes
) {
3171 for (i
= 0; i
< n
; i
++) {
3172 GLshort value
= s
[i
];
3178 for (i
= 0; i
< n
; i
++)
3183 case GL_UNSIGNED_INT
:
3186 const GLuint
*s
= (const GLuint
*) src
;
3187 if (unpack
->SwapBytes
) {
3188 for (i
= 0; i
< n
; i
++) {
3189 GLuint value
= s
[i
];
3195 for (i
= 0; i
< n
; i
++)
3203 const GLint
*s
= (const GLint
*) src
;
3204 if (unpack
->SwapBytes
) {
3205 for (i
= 0; i
< n
; i
++) {
3212 for (i
= 0; i
< n
; i
++)
3220 const GLfloat
*s
= (const GLfloat
*) src
;
3221 if (unpack
->SwapBytes
) {
3222 for (i
= 0; i
< n
; i
++) {
3223 GLfloat value
= s
[i
];
3225 indexes
[i
] = (GLuint
) value
;
3229 for (i
= 0; i
< n
; i
++)
3230 indexes
[i
] = (GLuint
) s
[i
];
3234 case GL_HALF_FLOAT_ARB
:
3237 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
3238 if (unpack
->SwapBytes
) {
3239 for (i
= 0; i
< n
; i
++) {
3240 GLhalfARB value
= s
[i
];
3242 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
3246 for (i
= 0; i
< n
; i
++)
3247 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
3251 case GL_UNSIGNED_INT_24_8_EXT
:
3254 const GLuint
*s
= (const GLuint
*) src
;
3255 if (unpack
->SwapBytes
) {
3256 for (i
= 0; i
< n
; i
++) {
3257 GLuint value
= s
[i
];
3259 indexes
[i
] = value
& 0xff; /* lower 8 bits */
3263 for (i
= 0; i
< n
; i
++)
3264 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
3270 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
3277 * This function extracts floating point RGBA values from arbitrary
3278 * image data. srcFormat and srcType are the format and type parameters
3279 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3281 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3282 * implements the "Conversion to floating point", "Conversion to RGB",
3283 * and "Final Expansion to RGBA" operations.
3285 * Args: n - number of pixels
3286 * rgba - output colors
3287 * srcFormat - format of incoming data
3288 * srcType - data type of incoming data
3289 * src - source data pointer
3290 * swapBytes - perform byteswapping of incoming data?
3293 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3294 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3295 GLboolean swapBytes
)
3297 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
3299 GLint rComp
, bComp
, gComp
, aComp
;
3300 GLboolean intFormat
;
3301 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
3303 ASSERT(srcFormat
== GL_RED
||
3304 srcFormat
== GL_GREEN
||
3305 srcFormat
== GL_BLUE
||
3306 srcFormat
== GL_ALPHA
||
3307 srcFormat
== GL_LUMINANCE
||
3308 srcFormat
== GL_LUMINANCE_ALPHA
||
3309 srcFormat
== GL_INTENSITY
||
3310 srcFormat
== GL_RG
||
3311 srcFormat
== GL_RGB
||
3312 srcFormat
== GL_BGR
||
3313 srcFormat
== GL_RGBA
||
3314 srcFormat
== GL_BGRA
||
3315 srcFormat
== GL_ABGR_EXT
||
3316 srcFormat
== GL_DU8DV8_ATI
||
3317 srcFormat
== GL_DUDV_ATI
||
3318 srcFormat
== GL_RED_INTEGER_EXT
||
3319 srcFormat
== GL_GREEN_INTEGER_EXT
||
3320 srcFormat
== GL_BLUE_INTEGER_EXT
||
3321 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3322 srcFormat
== GL_RGB_INTEGER_EXT
||
3323 srcFormat
== GL_RGBA_INTEGER_EXT
||
3324 srcFormat
== GL_BGR_INTEGER_EXT
||
3325 srcFormat
== GL_BGRA_INTEGER_EXT
||
3326 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3327 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3329 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3330 srcType
== GL_BYTE
||
3331 srcType
== GL_UNSIGNED_SHORT
||
3332 srcType
== GL_SHORT
||
3333 srcType
== GL_UNSIGNED_INT
||
3334 srcType
== GL_INT
||
3335 srcType
== GL_HALF_FLOAT_ARB
||
3336 srcType
== GL_FLOAT
||
3337 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3338 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3339 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3340 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3341 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3342 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3343 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3344 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3345 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3346 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3347 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3348 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3350 rComp
= gComp
= bComp
= aComp
= -1;
3352 switch (srcFormat
) {
3354 case GL_RED_INTEGER_EXT
:
3356 greenIndex
= blueIndex
= alphaIndex
= -1;
3360 case GL_GREEN_INTEGER_EXT
:
3362 redIndex
= blueIndex
= alphaIndex
= -1;
3366 case GL_BLUE_INTEGER_EXT
:
3368 redIndex
= greenIndex
= alphaIndex
= -1;
3372 case GL_ALPHA_INTEGER_EXT
:
3373 redIndex
= greenIndex
= blueIndex
= -1;
3378 case GL_LUMINANCE_INTEGER_EXT
:
3379 redIndex
= greenIndex
= blueIndex
= 0;
3383 case GL_LUMINANCE_ALPHA
:
3384 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
3385 redIndex
= greenIndex
= blueIndex
= 0;
3390 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
3406 case GL_RGB_INTEGER
:
3429 case GL_RGBA_INTEGER
:
3471 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
3472 _mesa_lookup_enum_by_nr(srcFormat
));
3476 intFormat
= _mesa_is_integer_format(srcFormat
);
3478 #define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
3479 if ((INDEX) < 0) { \
3482 for (i = 0; i < n; i++) { \
3483 rgba[i][CHANNEL] = DEFAULT_INT; \
3487 for (i = 0; i < n; i++) { \
3488 rgba[i][CHANNEL] = DEFAULT; \
3492 else if (swapBytes) { \
3493 const TYPE *s = (const TYPE *) src; \
3495 for (i = 0; i < n; i++) { \
3496 TYPE value = s[INDEX]; \
3497 if (sizeof(TYPE) == 2) { \
3500 else if (sizeof(TYPE) == 4) { \
3504 rgba[i][CHANNEL] = (GLfloat) value; \
3506 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
3511 const TYPE *s = (const TYPE *) src; \
3514 for (i = 0; i < n; i++) { \
3515 rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
3520 for (i = 0; i < n; i++) { \
3521 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
3528 case GL_UNSIGNED_BYTE
:
3529 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3530 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3531 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3532 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
3535 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3536 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3537 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3538 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
3540 case GL_UNSIGNED_SHORT
:
3541 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3542 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3543 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3544 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
3547 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3548 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3549 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3550 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
3552 case GL_UNSIGNED_INT
:
3553 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3554 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3555 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3556 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
3559 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3560 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3561 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3562 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
3565 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3566 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3567 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3568 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
3570 case GL_HALF_FLOAT_ARB
:
3571 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3572 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3573 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3574 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3576 case GL_UNSIGNED_BYTE_3_3_2
:
3578 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3585 for (i
= 0; i
< n
; i
++) {
3586 GLubyte p
= ubsrc
[i
];
3587 rgba
[i
][rComp
] = ((p
>> 5) ) * rs
;
3588 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * gs
;
3589 rgba
[i
][bComp
] = ((p
) & 0x3) * bs
;
3590 rgba
[i
][aComp
] = 1.0F
;
3594 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3596 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3603 for (i
= 0; i
< n
; i
++) {
3604 GLubyte p
= ubsrc
[i
];
3605 rgba
[i
][rComp
] = ((p
) & 0x7) * rs
;
3606 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * gs
;
3607 rgba
[i
][bComp
] = ((p
>> 6) ) * bs
;
3608 rgba
[i
][aComp
] = 1.0F
;
3612 case GL_UNSIGNED_SHORT_5_6_5
:
3619 const GLushort
*ussrc
= (const GLushort
*) src
;
3621 for (i
= 0; i
< n
; i
++) {
3622 GLushort p
= ussrc
[i
];
3624 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3625 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3626 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3627 rgba
[i
][aComp
] = 1.0F
;
3631 const GLushort
*ussrc
= (const GLushort
*) src
;
3633 for (i
= 0; i
< n
; i
++) {
3634 GLushort p
= ussrc
[i
];
3635 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3636 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3637 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3638 rgba
[i
][aComp
] = 1.0F
;
3642 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3649 const GLushort
*ussrc
= (const GLushort
*) src
;
3651 for (i
= 0; i
< n
; i
++) {
3652 GLushort p
= ussrc
[i
];
3654 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3655 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3656 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3657 rgba
[i
][aComp
] = 1.0F
;
3661 const GLushort
*ussrc
= (const GLushort
*) src
;
3663 for (i
= 0; i
< n
; i
++) {
3664 GLushort p
= ussrc
[i
];
3665 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3666 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3667 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3668 rgba
[i
][aComp
] = 1.0F
;
3672 case GL_UNSIGNED_SHORT_4_4_4_4
:
3674 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3677 const GLushort
*ussrc
= (const GLushort
*) src
;
3679 for (i
= 0; i
< n
; i
++) {
3680 GLushort p
= ussrc
[i
];
3682 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3683 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3684 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3685 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3689 const GLushort
*ussrc
= (const GLushort
*) src
;
3691 for (i
= 0; i
< n
; i
++) {
3692 GLushort p
= ussrc
[i
];
3693 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3694 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3695 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3696 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3700 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3702 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3705 const GLushort
*ussrc
= (const GLushort
*) src
;
3707 for (i
= 0; i
< n
; i
++) {
3708 GLushort p
= ussrc
[i
];
3710 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3711 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3712 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3713 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3717 const GLushort
*ussrc
= (const GLushort
*) src
;
3719 for (i
= 0; i
< n
; i
++) {
3720 GLushort p
= ussrc
[i
];
3721 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3722 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3723 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3724 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3728 case GL_UNSIGNED_SHORT_5_5_5_1
:
3730 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3733 const GLushort
*ussrc
= (const GLushort
*) src
;
3735 for (i
= 0; i
< n
; i
++) {
3736 GLushort p
= ussrc
[i
];
3738 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3739 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3740 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3741 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3745 const GLushort
*ussrc
= (const GLushort
*) src
;
3747 for (i
= 0; i
< n
; i
++) {
3748 GLushort p
= ussrc
[i
];
3749 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3750 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3751 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3752 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3756 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3758 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3761 const GLushort
*ussrc
= (const GLushort
*) src
;
3763 for (i
= 0; i
< n
; i
++) {
3764 GLushort p
= ussrc
[i
];
3766 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3767 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3768 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3769 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3773 const GLushort
*ussrc
= (const GLushort
*) src
;
3775 for (i
= 0; i
< n
; i
++) {
3776 GLushort p
= ussrc
[i
];
3777 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3778 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3779 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3780 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3784 case GL_UNSIGNED_INT_8_8_8_8
:
3786 const GLuint
*uisrc
= (const GLuint
*) src
;
3789 for (i
= 0; i
< n
; i
++) {
3790 GLuint p
= uisrc
[i
];
3791 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3792 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3793 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3794 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3798 for (i
= 0; i
< n
; i
++) {
3799 GLuint p
= uisrc
[i
];
3800 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3801 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3802 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3803 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3808 const GLuint
*uisrc
= (const GLuint
*) src
;
3811 for (i
= 0; i
< n
; i
++) {
3812 GLuint p
= uisrc
[i
];
3813 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3814 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3815 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3816 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3820 for (i
= 0; i
< n
; i
++) {
3821 GLuint p
= uisrc
[i
];
3822 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3823 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3824 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3825 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3830 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3832 const GLuint
*uisrc
= (const GLuint
*) src
;
3835 for (i
= 0; i
< n
; i
++) {
3836 GLuint p
= uisrc
[i
];
3837 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3838 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3839 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3840 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3844 for (i
= 0; i
< n
; i
++) {
3845 GLuint p
= uisrc
[i
];
3846 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3847 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3848 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3849 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3854 const GLuint
*uisrc
= (const GLuint
*) src
;
3857 for (i
= 0; i
< n
; i
++) {
3858 GLuint p
= uisrc
[i
];
3859 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3860 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3861 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3862 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3866 for (i
= 0; i
< n
; i
++) {
3867 GLuint p
= uisrc
[i
];
3868 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3869 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3870 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3871 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3876 case GL_UNSIGNED_INT_10_10_10_2
:
3878 rs
= 1.0F
/ 1023.0F
;
3879 gs
= 1.0F
/ 1023.0F
;
3880 bs
= 1.0F
/ 1023.0F
;
3884 const GLuint
*uisrc
= (const GLuint
*) src
;
3886 for (i
= 0; i
< n
; i
++) {
3887 GLuint p
= uisrc
[i
];
3889 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3890 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3891 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3892 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3896 const GLuint
*uisrc
= (const GLuint
*) src
;
3898 for (i
= 0; i
< n
; i
++) {
3899 GLuint p
= uisrc
[i
];
3900 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3901 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3902 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3903 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3907 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3909 rs
= 1.0F
/ 1023.0F
;
3910 gs
= 1.0F
/ 1023.0F
;
3911 bs
= 1.0F
/ 1023.0F
;
3915 const GLuint
*uisrc
= (const GLuint
*) src
;
3917 for (i
= 0; i
< n
; i
++) {
3918 GLuint p
= uisrc
[i
];
3920 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3921 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3922 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3923 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3927 const GLuint
*uisrc
= (const GLuint
*) src
;
3929 for (i
= 0; i
< n
; i
++) {
3930 GLuint p
= uisrc
[i
];
3931 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3932 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3933 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3934 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3939 _mesa_problem(NULL
, "bad srcType in extract float data");
3946 * Unpack a row of color image data from a client buffer according to
3947 * the pixel unpacking parameters.
3948 * Return GLchan values in the specified dest image format.
3949 * This is used by glDrawPixels and glTexImage?D().
3950 * \param ctx - the context
3951 * n - number of pixels in the span
3952 * dstFormat - format of destination color array
3953 * dest - the destination color array
3954 * srcFormat - source image format
3955 * srcType - source image data type
3956 * source - source image pointer
3957 * srcPacking - pixel unpacking parameters
3958 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3960 * XXX perhaps expand this to process whole images someday.
3963 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3964 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3965 GLenum srcFormat
, GLenum srcType
,
3966 const GLvoid
*source
,
3967 const struct gl_pixelstore_attrib
*srcPacking
,
3968 GLbitfield transferOps
)
3970 ASSERT(dstFormat
== GL_ALPHA
||
3971 dstFormat
== GL_LUMINANCE
||
3972 dstFormat
== GL_LUMINANCE_ALPHA
||
3973 dstFormat
== GL_INTENSITY
||
3974 dstFormat
== GL_RED
||
3975 dstFormat
== GL_RG
||
3976 dstFormat
== GL_RGB
||
3977 dstFormat
== GL_RGBA
||
3978 dstFormat
== GL_COLOR_INDEX
);
3980 ASSERT(srcFormat
== GL_RED
||
3981 srcFormat
== GL_GREEN
||
3982 srcFormat
== GL_BLUE
||
3983 srcFormat
== GL_ALPHA
||
3984 srcFormat
== GL_LUMINANCE
||
3985 srcFormat
== GL_LUMINANCE_ALPHA
||
3986 srcFormat
== GL_INTENSITY
||
3987 srcFormat
== GL_RG
||
3988 srcFormat
== GL_RGB
||
3989 srcFormat
== GL_BGR
||
3990 srcFormat
== GL_RGBA
||
3991 srcFormat
== GL_BGRA
||
3992 srcFormat
== GL_ABGR_EXT
||
3993 srcFormat
== GL_COLOR_INDEX
);
3995 ASSERT(srcType
== GL_BITMAP
||
3996 srcType
== GL_UNSIGNED_BYTE
||
3997 srcType
== GL_BYTE
||
3998 srcType
== GL_UNSIGNED_SHORT
||
3999 srcType
== GL_SHORT
||
4000 srcType
== GL_UNSIGNED_INT
||
4001 srcType
== GL_INT
||
4002 srcType
== GL_HALF_FLOAT_ARB
||
4003 srcType
== GL_FLOAT
||
4004 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4005 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4006 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4007 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4008 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4009 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4010 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4011 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4012 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4013 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4014 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4015 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4017 /* Try simple cases first */
4018 if (transferOps
== 0) {
4019 if (srcType
== CHAN_TYPE
) {
4020 if (dstFormat
== GL_RGBA
) {
4021 if (srcFormat
== GL_RGBA
) {
4022 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
4025 else if (srcFormat
== GL_RGB
) {
4027 const GLchan
*src
= (const GLchan
*) source
;
4029 for (i
= 0; i
< n
; i
++) {
4040 else if (dstFormat
== GL_RGB
) {
4041 if (srcFormat
== GL_RGB
) {
4042 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
4045 else if (srcFormat
== GL_RGBA
) {
4047 const GLchan
*src
= (const GLchan
*) source
;
4049 for (i
= 0; i
< n
; i
++) {
4059 else if (dstFormat
== srcFormat
) {
4060 GLint comps
= _mesa_components_in_format(srcFormat
);
4062 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
4067 * Common situation, loading 8bit RGBA/RGB source images
4068 * into 16/32 bit destination. (OSMesa16/32)
4070 else if (srcType
== GL_UNSIGNED_BYTE
) {
4071 if (dstFormat
== GL_RGBA
) {
4072 if (srcFormat
== GL_RGB
) {
4074 const GLubyte
*src
= (const GLubyte
*) source
;
4076 for (i
= 0; i
< n
; i
++) {
4077 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4078 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4079 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4086 else if (srcFormat
== GL_RGBA
) {
4088 const GLubyte
*src
= (const GLubyte
*) source
;
4090 for (i
= 0; i
< n
; i
++) {
4091 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4092 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4093 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4094 dst
[3] = UBYTE_TO_CHAN(src
[3]);
4101 else if (dstFormat
== GL_RGB
) {
4102 if (srcFormat
== GL_RGB
) {
4104 const GLubyte
*src
= (const GLubyte
*) source
;
4106 for (i
= 0; i
< n
; i
++) {
4107 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4108 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4109 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4115 else if (srcFormat
== GL_RGBA
) {
4117 const GLubyte
*src
= (const GLubyte
*) source
;
4119 for (i
= 0; i
< n
; i
++) {
4120 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4121 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4122 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4133 /* general solution begins here */
4135 GLint dstComponents
;
4136 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4137 GLint dstLuminanceIndex
, dstIntensityIndex
;
4138 GLfloat rgba
[MAX_WIDTH
][4];
4140 dstComponents
= _mesa_components_in_format( dstFormat
);
4141 /* source & dest image formats should have been error checked by now */
4142 assert(dstComponents
> 0);
4145 * Extract image data and convert to RGBA floats
4147 assert(n
<= MAX_WIDTH
);
4148 if (srcFormat
== GL_COLOR_INDEX
) {
4149 GLuint indexes
[MAX_WIDTH
];
4150 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4153 if (dstFormat
== GL_COLOR_INDEX
) {
4155 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4156 /* convert to GLchan and return */
4157 for (i
= 0; i
< n
; i
++) {
4158 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4163 /* Convert indexes to RGBA */
4164 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4165 shift_and_offset_ci(ctx
, n
, indexes
);
4167 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4170 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4171 * with color indexes.
4173 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4176 /* non-color index data */
4177 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4178 srcPacking
->SwapBytes
);
4181 /* Need to clamp if returning GLubytes or GLushorts */
4182 #if CHAN_TYPE != GL_FLOAT
4183 transferOps
|= IMAGE_CLAMP_BIT
;
4187 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4190 /* Now determine which color channels we need to produce.
4191 * And determine the dest index (offset) within each color tuple.
4193 switch (dstFormat
) {
4196 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4197 dstLuminanceIndex
= dstIntensityIndex
= -1;
4200 dstLuminanceIndex
= 0;
4201 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4202 dstIntensityIndex
= -1;
4204 case GL_LUMINANCE_ALPHA
:
4205 dstLuminanceIndex
= 0;
4207 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4208 dstIntensityIndex
= -1;
4211 dstIntensityIndex
= 0;
4212 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4213 dstLuminanceIndex
= -1;
4217 dstGreenIndex
= dstBlueIndex
= -1;
4218 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4224 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4230 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4237 dstLuminanceIndex
= dstIntensityIndex
= -1;
4240 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
4245 /* Now return the GLchan data in the requested dstFormat */
4247 if (dstRedIndex
>= 0) {
4250 for (i
= 0; i
< n
; i
++) {
4251 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
4252 dst
+= dstComponents
;
4256 if (dstGreenIndex
>= 0) {
4259 for (i
= 0; i
< n
; i
++) {
4260 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
4261 dst
+= dstComponents
;
4265 if (dstBlueIndex
>= 0) {
4268 for (i
= 0; i
< n
; i
++) {
4269 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
4270 dst
+= dstComponents
;
4274 if (dstAlphaIndex
>= 0) {
4277 for (i
= 0; i
< n
; i
++) {
4278 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
4279 dst
+= dstComponents
;
4283 if (dstIntensityIndex
>= 0) {
4286 assert(dstIntensityIndex
== 0);
4287 assert(dstComponents
== 1);
4288 for (i
= 0; i
< n
; i
++) {
4289 /* Intensity comes from red channel */
4290 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
4294 if (dstLuminanceIndex
>= 0) {
4297 assert(dstLuminanceIndex
== 0);
4298 for (i
= 0; i
< n
; i
++) {
4299 /* Luminance comes from red channel */
4300 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
4301 dst
+= dstComponents
;
4309 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
4310 * instead of GLchan.
4313 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
4314 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4315 GLenum srcFormat
, GLenum srcType
,
4316 const GLvoid
*source
,
4317 const struct gl_pixelstore_attrib
*srcPacking
,
4318 GLbitfield transferOps
)
4320 ASSERT(dstFormat
== GL_ALPHA
||
4321 dstFormat
== GL_LUMINANCE
||
4322 dstFormat
== GL_LUMINANCE_ALPHA
||
4323 dstFormat
== GL_INTENSITY
||
4324 dstFormat
== GL_RED
||
4325 dstFormat
== GL_RG
||
4326 dstFormat
== GL_RGB
||
4327 dstFormat
== GL_RGBA
||
4328 dstFormat
== GL_COLOR_INDEX
);
4330 ASSERT(srcFormat
== GL_RED
||
4331 srcFormat
== GL_GREEN
||
4332 srcFormat
== GL_BLUE
||
4333 srcFormat
== GL_ALPHA
||
4334 srcFormat
== GL_LUMINANCE
||
4335 srcFormat
== GL_LUMINANCE_ALPHA
||
4336 srcFormat
== GL_INTENSITY
||
4337 srcFormat
== GL_RG
||
4338 srcFormat
== GL_RGB
||
4339 srcFormat
== GL_BGR
||
4340 srcFormat
== GL_RGBA
||
4341 srcFormat
== GL_BGRA
||
4342 srcFormat
== GL_ABGR_EXT
||
4343 srcFormat
== GL_RED_INTEGER_EXT
||
4344 srcFormat
== GL_GREEN_INTEGER_EXT
||
4345 srcFormat
== GL_BLUE_INTEGER_EXT
||
4346 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4347 srcFormat
== GL_RGB_INTEGER_EXT
||
4348 srcFormat
== GL_RGBA_INTEGER_EXT
||
4349 srcFormat
== GL_BGR_INTEGER_EXT
||
4350 srcFormat
== GL_BGRA_INTEGER_EXT
||
4351 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4352 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4353 srcFormat
== GL_COLOR_INDEX
);
4355 ASSERT(srcType
== GL_BITMAP
||
4356 srcType
== GL_UNSIGNED_BYTE
||
4357 srcType
== GL_BYTE
||
4358 srcType
== GL_UNSIGNED_SHORT
||
4359 srcType
== GL_SHORT
||
4360 srcType
== GL_UNSIGNED_INT
||
4361 srcType
== GL_INT
||
4362 srcType
== GL_HALF_FLOAT_ARB
||
4363 srcType
== GL_FLOAT
||
4364 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4365 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4366 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4367 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4368 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4369 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4370 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4371 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4372 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4373 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4374 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4375 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4377 /* general solution, no special cases, yet */
4379 GLint dstComponents
;
4380 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4381 GLint dstLuminanceIndex
, dstIntensityIndex
;
4382 GLfloat rgba
[MAX_WIDTH
][4];
4384 dstComponents
= _mesa_components_in_format( dstFormat
);
4385 /* source & dest image formats should have been error checked by now */
4386 assert(dstComponents
> 0);
4389 * Extract image data and convert to RGBA floats
4391 assert(n
<= MAX_WIDTH
);
4392 if (srcFormat
== GL_COLOR_INDEX
) {
4393 GLuint indexes
[MAX_WIDTH
];
4394 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4397 if (dstFormat
== GL_COLOR_INDEX
) {
4399 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4400 /* convert to GLchan and return */
4401 for (i
= 0; i
< n
; i
++) {
4402 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4407 /* Convert indexes to RGBA */
4408 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4409 shift_and_offset_ci(ctx
, n
, indexes
);
4411 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4414 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4415 * with color indexes.
4417 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4420 /* non-color index data */
4421 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4422 srcPacking
->SwapBytes
);
4426 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4429 /* Now determine which color channels we need to produce.
4430 * And determine the dest index (offset) within each color tuple.
4432 switch (dstFormat
) {
4435 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4436 dstLuminanceIndex
= dstIntensityIndex
= -1;
4439 dstLuminanceIndex
= 0;
4440 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4441 dstIntensityIndex
= -1;
4443 case GL_LUMINANCE_ALPHA
:
4444 dstLuminanceIndex
= 0;
4446 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4447 dstIntensityIndex
= -1;
4450 dstIntensityIndex
= 0;
4451 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4452 dstLuminanceIndex
= -1;
4456 dstGreenIndex
= dstBlueIndex
= -1;
4457 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4463 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4469 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4476 dstLuminanceIndex
= dstIntensityIndex
= -1;
4479 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
4483 /* Now pack results in the requested dstFormat */
4484 if (dstRedIndex
>= 0) {
4485 GLfloat
*dst
= dest
;
4487 for (i
= 0; i
< n
; i
++) {
4488 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
4489 dst
+= dstComponents
;
4493 if (dstGreenIndex
>= 0) {
4494 GLfloat
*dst
= dest
;
4496 for (i
= 0; i
< n
; i
++) {
4497 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
4498 dst
+= dstComponents
;
4502 if (dstBlueIndex
>= 0) {
4503 GLfloat
*dst
= dest
;
4505 for (i
= 0; i
< n
; i
++) {
4506 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
4507 dst
+= dstComponents
;
4511 if (dstAlphaIndex
>= 0) {
4512 GLfloat
*dst
= dest
;
4514 for (i
= 0; i
< n
; i
++) {
4515 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
4516 dst
+= dstComponents
;
4520 if (dstIntensityIndex
>= 0) {
4521 GLfloat
*dst
= dest
;
4523 assert(dstIntensityIndex
== 0);
4524 assert(dstComponents
== 1);
4525 for (i
= 0; i
< n
; i
++) {
4526 /* Intensity comes from red channel */
4527 dst
[i
] = rgba
[i
][RCOMP
];
4531 if (dstLuminanceIndex
>= 0) {
4532 GLfloat
*dst
= dest
;
4534 assert(dstLuminanceIndex
== 0);
4535 for (i
= 0; i
< n
; i
++) {
4536 /* Luminance comes from red channel */
4537 dst
[0] = rgba
[i
][RCOMP
];
4538 dst
+= dstComponents
;
4545 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4546 * directly return GLbyte data, no transfer ops apply.
4549 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4550 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4551 GLenum srcFormat
, GLenum srcType
,
4552 const GLvoid
*source
,
4553 const struct gl_pixelstore_attrib
*srcPacking
,
4554 GLbitfield transferOps
)
4556 ASSERT(dstFormat
== GL_DUDV_ATI
);
4557 ASSERT(srcFormat
== GL_DUDV_ATI
);
4559 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4560 srcType
== GL_BYTE
||
4561 srcType
== GL_UNSIGNED_SHORT
||
4562 srcType
== GL_SHORT
||
4563 srcType
== GL_UNSIGNED_INT
||
4564 srcType
== GL_INT
||
4565 srcType
== GL_HALF_FLOAT_ARB
||
4566 srcType
== GL_FLOAT
);
4568 /* general solution */
4570 GLint dstComponents
;
4571 GLfloat rgba
[MAX_WIDTH
][4];
4575 dstComponents
= _mesa_components_in_format( dstFormat
);
4576 /* source & dest image formats should have been error checked by now */
4577 assert(dstComponents
> 0);
4580 * Extract image data and convert to RGBA floats
4582 assert(n
<= MAX_WIDTH
);
4583 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4584 srcPacking
->SwapBytes
);
4587 /* Now determine which color channels we need to produce.
4588 * And determine the dest index (offset) within each color tuple.
4591 /* Now pack results in the requested dstFormat */
4592 for (i
= 0; i
< n
; i
++) {
4593 /* not sure - need clamp[-1,1] here? */
4594 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4595 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4596 dst
+= dstComponents
;
4602 * Unpack a row of color index data from a client buffer according to
4603 * the pixel unpacking parameters.
4604 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4606 * Args: ctx - the context
4607 * n - number of pixels
4608 * dstType - destination data type
4609 * dest - destination array
4610 * srcType - source pixel type
4611 * source - source data pointer
4612 * srcPacking - pixel unpacking parameters
4613 * transferOps - the pixel transfer operations to apply
4616 _mesa_unpack_index_span( const struct gl_context
*ctx
, GLuint n
,
4617 GLenum dstType
, GLvoid
*dest
,
4618 GLenum srcType
, const GLvoid
*source
,
4619 const struct gl_pixelstore_attrib
*srcPacking
,
4620 GLbitfield transferOps
)
4622 ASSERT(srcType
== GL_BITMAP
||
4623 srcType
== GL_UNSIGNED_BYTE
||
4624 srcType
== GL_BYTE
||
4625 srcType
== GL_UNSIGNED_SHORT
||
4626 srcType
== GL_SHORT
||
4627 srcType
== GL_UNSIGNED_INT
||
4628 srcType
== GL_INT
||
4629 srcType
== GL_HALF_FLOAT_ARB
||
4630 srcType
== GL_FLOAT
);
4632 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4633 dstType
== GL_UNSIGNED_SHORT
||
4634 dstType
== GL_UNSIGNED_INT
);
4637 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4640 * Try simple cases first
4642 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4643 && dstType
== GL_UNSIGNED_BYTE
) {
4644 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4646 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4647 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4648 memcpy(dest
, source
, n
* sizeof(GLuint
));
4654 GLuint indexes
[MAX_WIDTH
];
4655 assert(n
<= MAX_WIDTH
);
4657 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4661 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4663 /* convert to dest type */
4665 case GL_UNSIGNED_BYTE
:
4667 GLubyte
*dst
= (GLubyte
*) dest
;
4669 for (i
= 0; i
< n
; i
++) {
4670 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4674 case GL_UNSIGNED_SHORT
:
4676 GLuint
*dst
= (GLuint
*) dest
;
4678 for (i
= 0; i
< n
; i
++) {
4679 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4683 case GL_UNSIGNED_INT
:
4684 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4687 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4694 _mesa_pack_index_span( const struct gl_context
*ctx
, GLuint n
,
4695 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4696 const struct gl_pixelstore_attrib
*dstPacking
,
4697 GLbitfield transferOps
)
4699 GLuint indexes
[MAX_WIDTH
];
4701 ASSERT(n
<= MAX_WIDTH
);
4703 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4705 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4706 /* make a copy of input */
4707 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4708 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4713 case GL_UNSIGNED_BYTE
:
4715 GLubyte
*dst
= (GLubyte
*) dest
;
4717 for (i
= 0; i
< n
; i
++) {
4718 *dst
++ = (GLubyte
) source
[i
];
4724 GLbyte
*dst
= (GLbyte
*) dest
;
4726 for (i
= 0; i
< n
; i
++) {
4727 dst
[i
] = (GLbyte
) source
[i
];
4731 case GL_UNSIGNED_SHORT
:
4733 GLushort
*dst
= (GLushort
*) dest
;
4735 for (i
= 0; i
< n
; i
++) {
4736 dst
[i
] = (GLushort
) source
[i
];
4738 if (dstPacking
->SwapBytes
) {
4739 _mesa_swap2( (GLushort
*) dst
, n
);
4745 GLshort
*dst
= (GLshort
*) dest
;
4747 for (i
= 0; i
< n
; i
++) {
4748 dst
[i
] = (GLshort
) source
[i
];
4750 if (dstPacking
->SwapBytes
) {
4751 _mesa_swap2( (GLushort
*) dst
, n
);
4755 case GL_UNSIGNED_INT
:
4757 GLuint
*dst
= (GLuint
*) dest
;
4759 for (i
= 0; i
< n
; i
++) {
4760 dst
[i
] = (GLuint
) source
[i
];
4762 if (dstPacking
->SwapBytes
) {
4763 _mesa_swap4( (GLuint
*) dst
, n
);
4769 GLint
*dst
= (GLint
*) dest
;
4771 for (i
= 0; i
< n
; i
++) {
4772 dst
[i
] = (GLint
) source
[i
];
4774 if (dstPacking
->SwapBytes
) {
4775 _mesa_swap4( (GLuint
*) dst
, n
);
4781 GLfloat
*dst
= (GLfloat
*) dest
;
4783 for (i
= 0; i
< n
; i
++) {
4784 dst
[i
] = (GLfloat
) source
[i
];
4786 if (dstPacking
->SwapBytes
) {
4787 _mesa_swap4( (GLuint
*) dst
, n
);
4791 case GL_HALF_FLOAT_ARB
:
4793 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4795 for (i
= 0; i
< n
; i
++) {
4796 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4798 if (dstPacking
->SwapBytes
) {
4799 _mesa_swap2( (GLushort
*) dst
, n
);
4804 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4810 * Unpack a row of stencil data from a client buffer according to
4811 * the pixel unpacking parameters.
4812 * This is (or will be) used by glDrawPixels
4814 * Args: ctx - the context
4815 * n - number of pixels
4816 * dstType - destination data type
4817 * dest - destination array
4818 * srcType - source pixel type
4819 * source - source data pointer
4820 * srcPacking - pixel unpacking parameters
4821 * transferOps - apply offset/bias/lookup ops?
4824 _mesa_unpack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4825 GLenum dstType
, GLvoid
*dest
,
4826 GLenum srcType
, const GLvoid
*source
,
4827 const struct gl_pixelstore_attrib
*srcPacking
,
4828 GLbitfield transferOps
)
4830 ASSERT(srcType
== GL_BITMAP
||
4831 srcType
== GL_UNSIGNED_BYTE
||
4832 srcType
== GL_BYTE
||
4833 srcType
== GL_UNSIGNED_SHORT
||
4834 srcType
== GL_SHORT
||
4835 srcType
== GL_UNSIGNED_INT
||
4836 srcType
== GL_INT
||
4837 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4838 srcType
== GL_HALF_FLOAT_ARB
||
4839 srcType
== GL_FLOAT
);
4841 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4842 dstType
== GL_UNSIGNED_SHORT
||
4843 dstType
== GL_UNSIGNED_INT
);
4845 /* only shift and offset apply to stencil */
4846 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4849 * Try simple cases first
4851 if (transferOps
== 0 &&
4852 !ctx
->Pixel
.MapStencilFlag
&&
4853 srcType
== GL_UNSIGNED_BYTE
&&
4854 dstType
== GL_UNSIGNED_BYTE
) {
4855 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4857 else if (transferOps
== 0 &&
4858 !ctx
->Pixel
.MapStencilFlag
&&
4859 srcType
== GL_UNSIGNED_INT
&&
4860 dstType
== GL_UNSIGNED_INT
&&
4861 !srcPacking
->SwapBytes
) {
4862 memcpy(dest
, source
, n
* sizeof(GLuint
));
4868 GLuint indexes
[MAX_WIDTH
];
4869 assert(n
<= MAX_WIDTH
);
4871 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4874 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4875 /* shift and offset indexes */
4876 shift_and_offset_ci(ctx
, n
, indexes
);
4879 if (ctx
->Pixel
.MapStencilFlag
) {
4880 /* Apply stencil lookup table */
4881 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4883 for (i
= 0; i
< n
; i
++) {
4884 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4888 /* convert to dest type */
4890 case GL_UNSIGNED_BYTE
:
4892 GLubyte
*dst
= (GLubyte
*) dest
;
4894 for (i
= 0; i
< n
; i
++) {
4895 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4899 case GL_UNSIGNED_SHORT
:
4901 GLuint
*dst
= (GLuint
*) dest
;
4903 for (i
= 0; i
< n
; i
++) {
4904 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4908 case GL_UNSIGNED_INT
:
4909 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4912 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4919 _mesa_pack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4920 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4921 const struct gl_pixelstore_attrib
*dstPacking
)
4923 GLstencil stencil
[MAX_WIDTH
];
4925 ASSERT(n
<= MAX_WIDTH
);
4927 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4928 ctx
->Pixel
.MapStencilFlag
) {
4929 /* make a copy of input */
4930 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4931 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4936 case GL_UNSIGNED_BYTE
:
4937 if (sizeof(GLstencil
) == 1) {
4938 memcpy( dest
, source
, n
);
4941 GLubyte
*dst
= (GLubyte
*) dest
;
4944 dst
[i
] = (GLubyte
) source
[i
];
4950 GLbyte
*dst
= (GLbyte
*) dest
;
4953 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4957 case GL_UNSIGNED_SHORT
:
4959 GLushort
*dst
= (GLushort
*) dest
;
4962 dst
[i
] = (GLushort
) source
[i
];
4964 if (dstPacking
->SwapBytes
) {
4965 _mesa_swap2( (GLushort
*) dst
, n
);
4971 GLshort
*dst
= (GLshort
*) dest
;
4974 dst
[i
] = (GLshort
) source
[i
];
4976 if (dstPacking
->SwapBytes
) {
4977 _mesa_swap2( (GLushort
*) dst
, n
);
4981 case GL_UNSIGNED_INT
:
4983 GLuint
*dst
= (GLuint
*) dest
;
4986 dst
[i
] = (GLuint
) source
[i
];
4988 if (dstPacking
->SwapBytes
) {
4989 _mesa_swap4( (GLuint
*) dst
, n
);
4995 GLint
*dst
= (GLint
*) dest
;
4998 dst
[i
] = (GLint
) source
[i
];
5000 if (dstPacking
->SwapBytes
) {
5001 _mesa_swap4( (GLuint
*) dst
, n
);
5007 GLfloat
*dst
= (GLfloat
*) dest
;
5010 dst
[i
] = (GLfloat
) source
[i
];
5012 if (dstPacking
->SwapBytes
) {
5013 _mesa_swap4( (GLuint
*) dst
, n
);
5017 case GL_HALF_FLOAT_ARB
:
5019 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5022 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
5024 if (dstPacking
->SwapBytes
) {
5025 _mesa_swap2( (GLushort
*) dst
, n
);
5030 if (dstPacking
->LsbFirst
) {
5031 GLubyte
*dst
= (GLubyte
*) dest
;
5034 for (i
= 0; i
< n
; i
++) {
5037 *dst
|= ((source
[i
] != 0) << shift
);
5046 GLubyte
*dst
= (GLubyte
*) dest
;
5049 for (i
= 0; i
< n
; i
++) {
5052 *dst
|= ((source
[i
] != 0) << shift
);
5062 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5066 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5069 const GLTYPE *src = (const GLTYPE *)source; \
5070 for (i = 0; i < n; i++) { \
5071 GLTYPE value = src[i]; \
5072 if (srcPacking->SwapBytes) { \
5073 if (sizeof(GLTYPE) == 2) { \
5075 } else if (sizeof(GLTYPE) == 4) { \
5079 depthValues[i] = GLTYPE2FLOAT(value); \
5085 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5086 * or GLfloat values.
5087 * The glPixelTransfer (scale/bias) params will be applied.
5089 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5090 * \param depthMax max value for returned GLushort or GLuint values
5091 * (ignored for GLfloat).
5094 _mesa_unpack_depth_span( const struct gl_context
*ctx
, GLuint n
,
5095 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5096 GLenum srcType
, const GLvoid
*source
,
5097 const struct gl_pixelstore_attrib
*srcPacking
)
5099 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
5100 GLboolean needClamp
= GL_FALSE
;
5102 /* Look for special cases first.
5103 * Not only are these faster, they're less prone to numeric conversion
5104 * problems. Otherwise, converting from an int type to a float then
5105 * back to an int type can introduce errors that will show up as
5106 * artifacts in things like depth peeling which uses glCopyTexImage.
5108 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5109 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5110 const GLuint
*src
= (const GLuint
*) source
;
5111 GLushort
*dst
= (GLushort
*) dest
;
5113 for (i
= 0; i
< n
; i
++) {
5114 dst
[i
] = src
[i
] >> 16;
5118 if (srcType
== GL_UNSIGNED_SHORT
5119 && dstType
== GL_UNSIGNED_INT
5120 && depthMax
== 0xffffffff) {
5121 const GLushort
*src
= (const GLushort
*) source
;
5122 GLuint
*dst
= (GLuint
*) dest
;
5124 for (i
= 0; i
< n
; i
++) {
5125 dst
[i
] = src
[i
] | (src
[i
] << 16);
5129 if (srcType
== GL_UNSIGNED_INT_24_8
5130 && dstType
== GL_UNSIGNED_INT
5131 && depthMax
== 0xffffff) {
5132 const GLuint
*src
= (const GLuint
*) source
;
5133 GLuint
*dst
= (GLuint
*) dest
;
5135 for (i
= 0; i
< n
; i
++) {
5136 dst
[i
] = src
[i
] >> 8;
5140 /* XXX may want to add additional cases here someday */
5143 /* general case path follows */
5145 if (dstType
== GL_FLOAT
) {
5146 depthValues
= (GLfloat
*) dest
;
5149 depthValues
= depthTemp
;
5152 /* Convert incoming values to GLfloat. Some conversions will require
5157 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
5158 needClamp
= GL_TRUE
;
5160 case GL_UNSIGNED_BYTE
:
5161 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5164 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
5165 needClamp
= GL_TRUE
;
5167 case GL_UNSIGNED_SHORT
:
5168 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5171 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5172 needClamp
= GL_TRUE
;
5174 case GL_UNSIGNED_INT
:
5175 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5177 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5178 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5179 depthMax
== 0xffffff &&
5180 ctx
->Pixel
.DepthScale
== 1.0 &&
5181 ctx
->Pixel
.DepthBias
== 0.0) {
5182 const GLuint
*src
= (const GLuint
*) source
;
5183 GLuint
*zValues
= (GLuint
*) dest
;
5185 for (i
= 0; i
< n
; i
++) {
5186 GLuint value
= src
[i
];
5187 if (srcPacking
->SwapBytes
) {
5190 zValues
[i
] = value
& 0xffffff00;
5195 const GLuint
*src
= (const GLuint
*) source
;
5196 const GLfloat scale
= 1.0f
/ 0xffffff;
5198 for (i
= 0; i
< n
; i
++) {
5199 GLuint value
= src
[i
];
5200 if (srcPacking
->SwapBytes
) {
5203 depthValues
[i
] = (value
>> 8) * scale
;
5208 DEPTH_VALUES(GLfloat
, 1*);
5209 needClamp
= GL_TRUE
;
5211 case GL_HALF_FLOAT_ARB
:
5214 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5215 for (i
= 0; i
< n
; i
++) {
5216 GLhalfARB value
= src
[i
];
5217 if (srcPacking
->SwapBytes
) {
5220 depthValues
[i
] = _mesa_half_to_float(value
);
5222 needClamp
= GL_TRUE
;
5226 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5230 /* apply depth scale and bias */
5232 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5233 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5234 if (scale
!= 1.0 || bias
!= 0.0) {
5236 for (i
= 0; i
< n
; i
++) {
5237 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5239 needClamp
= GL_TRUE
;
5243 /* clamp to [0, 1] */
5246 for (i
= 0; i
< n
; i
++) {
5247 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5252 * Convert values to dstType
5254 if (dstType
== GL_UNSIGNED_INT
) {
5255 GLuint
*zValues
= (GLuint
*) dest
;
5257 if (depthMax
<= 0xffffff) {
5258 /* no overflow worries */
5259 for (i
= 0; i
< n
; i
++) {
5260 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5264 /* need to use double precision to prevent overflow problems */
5265 for (i
= 0; i
< n
; i
++) {
5266 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
5267 if (z
>= (GLdouble
) 0xffffffff)
5268 zValues
[i
] = 0xffffffff;
5270 zValues
[i
] = (GLuint
) z
;
5274 else if (dstType
== GL_UNSIGNED_SHORT
) {
5275 GLushort
*zValues
= (GLushort
*) dest
;
5277 ASSERT(depthMax
<= 0xffff);
5278 for (i
= 0; i
< n
; i
++) {
5279 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5283 ASSERT(dstType
== GL_FLOAT
);
5284 /*ASSERT(depthMax == 1.0F);*/
5290 * Pack an array of depth values. The values are floats in [0,1].
5293 _mesa_pack_depth_span( const struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
5294 GLenum dstType
, const GLfloat
*depthSpan
,
5295 const struct gl_pixelstore_attrib
*dstPacking
)
5297 GLfloat depthCopy
[MAX_WIDTH
];
5299 ASSERT(n
<= MAX_WIDTH
);
5301 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5302 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5303 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5304 depthSpan
= depthCopy
;
5308 case GL_UNSIGNED_BYTE
:
5310 GLubyte
*dst
= (GLubyte
*) dest
;
5312 for (i
= 0; i
< n
; i
++) {
5313 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5319 GLbyte
*dst
= (GLbyte
*) dest
;
5321 for (i
= 0; i
< n
; i
++) {
5322 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5326 case GL_UNSIGNED_SHORT
:
5328 GLushort
*dst
= (GLushort
*) dest
;
5330 for (i
= 0; i
< n
; i
++) {
5331 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5333 if (dstPacking
->SwapBytes
) {
5334 _mesa_swap2( (GLushort
*) dst
, n
);
5340 GLshort
*dst
= (GLshort
*) dest
;
5342 for (i
= 0; i
< n
; i
++) {
5343 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5345 if (dstPacking
->SwapBytes
) {
5346 _mesa_swap2( (GLushort
*) dst
, n
);
5350 case GL_UNSIGNED_INT
:
5352 GLuint
*dst
= (GLuint
*) dest
;
5354 for (i
= 0; i
< n
; i
++) {
5355 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5357 if (dstPacking
->SwapBytes
) {
5358 _mesa_swap4( (GLuint
*) dst
, n
);
5364 GLint
*dst
= (GLint
*) dest
;
5366 for (i
= 0; i
< n
; i
++) {
5367 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5369 if (dstPacking
->SwapBytes
) {
5370 _mesa_swap4( (GLuint
*) dst
, n
);
5376 GLfloat
*dst
= (GLfloat
*) dest
;
5378 for (i
= 0; i
< n
; i
++) {
5379 dst
[i
] = depthSpan
[i
];
5381 if (dstPacking
->SwapBytes
) {
5382 _mesa_swap4( (GLuint
*) dst
, n
);
5386 case GL_HALF_FLOAT_ARB
:
5388 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5390 for (i
= 0; i
< n
; i
++) {
5391 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5393 if (dstPacking
->SwapBytes
) {
5394 _mesa_swap2( (GLushort
*) dst
, n
);
5399 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5406 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5409 _mesa_pack_depth_stencil_span(const struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
5410 const GLfloat
*depthVals
,
5411 const GLstencil
*stencilVals
,
5412 const struct gl_pixelstore_attrib
*dstPacking
)
5414 GLfloat depthCopy
[MAX_WIDTH
];
5415 GLstencil stencilCopy
[MAX_WIDTH
];
5418 ASSERT(n
<= MAX_WIDTH
);
5420 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5421 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5422 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5423 depthVals
= depthCopy
;
5426 if (ctx
->Pixel
.IndexShift
||
5427 ctx
->Pixel
.IndexOffset
||
5428 ctx
->Pixel
.MapStencilFlag
) {
5429 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5430 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5431 stencilVals
= stencilCopy
;
5434 for (i
= 0; i
< n
; i
++) {
5435 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5436 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5439 if (dstPacking
->SwapBytes
) {
5440 _mesa_swap4(dest
, n
);
5448 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5449 * Return all image data in a contiguous block. This is used when we
5450 * compile glDrawPixels, glTexImage, etc into a display list. We
5451 * need a copy of the data in a standard format.
5454 _mesa_unpack_image( GLuint dimensions
,
5455 GLsizei width
, GLsizei height
, GLsizei depth
,
5456 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5457 const struct gl_pixelstore_attrib
*unpack
)
5459 GLint bytesPerRow
, compsPerRow
;
5460 GLboolean flipBytes
, swap2
, swap4
;
5463 return NULL
; /* not necessarily an error */
5465 if (width
<= 0 || height
<= 0 || depth
<= 0)
5466 return NULL
; /* generate error later */
5468 if (type
== GL_BITMAP
) {
5469 bytesPerRow
= (width
+ 7) >> 3;
5470 flipBytes
= unpack
->LsbFirst
;
5471 swap2
= swap4
= GL_FALSE
;
5475 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5476 GLint components
= _mesa_components_in_format(format
);
5479 if (_mesa_type_is_packed(type
))
5482 if (bytesPerPixel
<= 0 || components
<= 0)
5483 return NULL
; /* bad format or type. generate error later */
5484 bytesPerRow
= bytesPerPixel
* width
;
5485 bytesPerComp
= bytesPerPixel
/ components
;
5486 flipBytes
= GL_FALSE
;
5487 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5488 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5489 compsPerRow
= components
* width
;
5490 assert(compsPerRow
>= width
);
5495 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5499 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5502 for (img
= 0; img
< depth
; img
++) {
5503 for (row
= 0; row
< height
; row
++) {
5504 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5505 width
, height
, format
, type
, img
, row
, 0);
5507 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5509 flipBytes
= GL_FALSE
;
5510 if (unpack
->LsbFirst
) {
5511 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5512 GLubyte dstMask
= 128;
5513 const GLubyte
*s
= src
;
5516 for (i
= 0; i
< width
; i
++) {
5520 if (srcMask
== 128) {
5525 srcMask
= srcMask
<< 1;
5533 dstMask
= dstMask
>> 1;
5538 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5539 GLubyte dstMask
= 128;
5540 const GLubyte
*s
= src
;
5543 for (i
= 0; i
< width
; i
++) {
5552 srcMask
= srcMask
>> 1;
5560 dstMask
= dstMask
>> 1;
5566 memcpy(dst
, src
, bytesPerRow
);
5569 /* byte flipping/swapping */
5571 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5574 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5577 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5586 #endif /* _HAVE_FULL_GL */
5591 * Convert an array of RGBA colors from one datatype to another.
5592 * NOTE: src may equal dst. In that case, we use a temporary buffer.
5595 _mesa_convert_colors(GLenum srcType
, const GLvoid
*src
,
5596 GLenum dstType
, GLvoid
*dst
,
5597 GLuint count
, const GLubyte mask
[])
5599 GLuint tempBuffer
[MAX_WIDTH
][4];
5600 const GLboolean useTemp
= (src
== dst
);
5602 ASSERT(srcType
!= dstType
);
5605 case GL_UNSIGNED_BYTE
:
5606 if (dstType
== GL_UNSIGNED_SHORT
) {
5607 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5608 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5610 for (i
= 0; i
< count
; i
++) {
5611 if (!mask
|| mask
[i
]) {
5612 dst2
[i
][RCOMP
] = UBYTE_TO_USHORT(src1
[i
][RCOMP
]);
5613 dst2
[i
][GCOMP
] = UBYTE_TO_USHORT(src1
[i
][GCOMP
]);
5614 dst2
[i
][BCOMP
] = UBYTE_TO_USHORT(src1
[i
][BCOMP
]);
5615 dst2
[i
][ACOMP
] = UBYTE_TO_USHORT(src1
[i
][ACOMP
]);
5619 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5622 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5623 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5625 ASSERT(dstType
== GL_FLOAT
);
5626 for (i
= 0; i
< count
; i
++) {
5627 if (!mask
|| mask
[i
]) {
5628 dst4
[i
][RCOMP
] = UBYTE_TO_FLOAT(src1
[i
][RCOMP
]);
5629 dst4
[i
][GCOMP
] = UBYTE_TO_FLOAT(src1
[i
][GCOMP
]);
5630 dst4
[i
][BCOMP
] = UBYTE_TO_FLOAT(src1
[i
][BCOMP
]);
5631 dst4
[i
][ACOMP
] = UBYTE_TO_FLOAT(src1
[i
][ACOMP
]);
5635 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5638 case GL_UNSIGNED_SHORT
:
5639 if (dstType
== GL_UNSIGNED_BYTE
) {
5640 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5641 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5643 for (i
= 0; i
< count
; i
++) {
5644 if (!mask
|| mask
[i
]) {
5645 dst1
[i
][RCOMP
] = USHORT_TO_UBYTE(src2
[i
][RCOMP
]);
5646 dst1
[i
][GCOMP
] = USHORT_TO_UBYTE(src2
[i
][GCOMP
]);
5647 dst1
[i
][BCOMP
] = USHORT_TO_UBYTE(src2
[i
][BCOMP
]);
5648 dst1
[i
][ACOMP
] = USHORT_TO_UBYTE(src2
[i
][ACOMP
]);
5652 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5655 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5656 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5658 ASSERT(dstType
== GL_FLOAT
);
5659 for (i
= 0; i
< count
; i
++) {
5660 if (!mask
|| mask
[i
]) {
5661 dst4
[i
][RCOMP
] = USHORT_TO_FLOAT(src2
[i
][RCOMP
]);
5662 dst4
[i
][GCOMP
] = USHORT_TO_FLOAT(src2
[i
][GCOMP
]);
5663 dst4
[i
][BCOMP
] = USHORT_TO_FLOAT(src2
[i
][BCOMP
]);
5664 dst4
[i
][ACOMP
] = USHORT_TO_FLOAT(src2
[i
][ACOMP
]);
5668 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5672 if (dstType
== GL_UNSIGNED_BYTE
) {
5673 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5674 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5676 for (i
= 0; i
< count
; i
++) {
5677 if (!mask
|| mask
[i
]) {
5678 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][RCOMP
], src4
[i
][RCOMP
]);
5679 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][GCOMP
], src4
[i
][GCOMP
]);
5680 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][BCOMP
], src4
[i
][BCOMP
]);
5681 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][ACOMP
], src4
[i
][ACOMP
]);
5685 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5688 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5689 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5691 ASSERT(dstType
== GL_UNSIGNED_SHORT
);
5692 for (i
= 0; i
< count
; i
++) {
5693 if (!mask
|| mask
[i
]) {
5694 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][RCOMP
], src4
[i
][RCOMP
]);
5695 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][GCOMP
], src4
[i
][GCOMP
]);
5696 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][BCOMP
], src4
[i
][BCOMP
]);
5697 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][ACOMP
], src4
[i
][ACOMP
]);
5701 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5705 _mesa_problem(NULL
, "Invalid datatype in _mesa_convert_colors");
5713 * Perform basic clipping for glDrawPixels. The image's position and size
5714 * and the unpack SkipPixels and SkipRows are adjusted so that the image
5715 * region is entirely within the window and scissor bounds.
5716 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
5717 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
5718 * we'll actually write. Beforehand, *destY-1 is the first drawing row.
5720 * \return GL_TRUE if image is ready for drawing or
5721 * GL_FALSE if image was completely clipped away (draw nothing)
5724 _mesa_clip_drawpixels(const struct gl_context
*ctx
,
5725 GLint
*destX
, GLint
*destY
,
5726 GLsizei
*width
, GLsizei
*height
,
5727 struct gl_pixelstore_attrib
*unpack
)
5729 const struct gl_framebuffer
*buffer
= ctx
->DrawBuffer
;
5731 if (unpack
->RowLength
== 0) {
5732 unpack
->RowLength
= *width
;
5735 ASSERT(ctx
->Pixel
.ZoomX
== 1.0F
);
5736 ASSERT(ctx
->Pixel
.ZoomY
== 1.0F
|| ctx
->Pixel
.ZoomY
== -1.0F
);
5739 if (*destX
< buffer
->_Xmin
) {
5740 unpack
->SkipPixels
+= (buffer
->_Xmin
- *destX
);
5741 *width
-= (buffer
->_Xmin
- *destX
);
5742 *destX
= buffer
->_Xmin
;
5744 /* right clipping */
5745 if (*destX
+ *width
> buffer
->_Xmax
)
5746 *width
-= (*destX
+ *width
- buffer
->_Xmax
);
5751 if (ctx
->Pixel
.ZoomY
== 1.0F
) {
5752 /* bottom clipping */
5753 if (*destY
< buffer
->_Ymin
) {
5754 unpack
->SkipRows
+= (buffer
->_Ymin
- *destY
);
5755 *height
-= (buffer
->_Ymin
- *destY
);
5756 *destY
= buffer
->_Ymin
;
5759 if (*destY
+ *height
> buffer
->_Ymax
)
5760 *height
-= (*destY
+ *height
- buffer
->_Ymax
);
5762 else { /* upside down */
5764 if (*destY
> buffer
->_Ymax
) {
5765 unpack
->SkipRows
+= (*destY
- buffer
->_Ymax
);
5766 *height
-= (*destY
- buffer
->_Ymax
);
5767 *destY
= buffer
->_Ymax
;
5769 /* bottom clipping */
5770 if (*destY
- *height
< buffer
->_Ymin
)
5771 *height
-= (buffer
->_Ymin
- (*destY
- *height
));
5772 /* adjust destY so it's the first row to write to */
5784 * Perform clipping for glReadPixels. The image's window position
5785 * and size, and the pack skipPixels, skipRows and rowLength are adjusted
5786 * so that the image region is entirely within the window bounds.
5787 * Note: this is different from _mesa_clip_drawpixels() in that the
5788 * scissor box is ignored, and we use the bounds of the current readbuffer
5791 * \return GL_TRUE if image is ready for drawing or
5792 * GL_FALSE if image was completely clipped away (draw nothing)
5795 _mesa_clip_readpixels(const struct gl_context
*ctx
,
5796 GLint
*srcX
, GLint
*srcY
,
5797 GLsizei
*width
, GLsizei
*height
,
5798 struct gl_pixelstore_attrib
*pack
)
5800 const struct gl_framebuffer
*buffer
= ctx
->ReadBuffer
;
5802 if (pack
->RowLength
== 0) {
5803 pack
->RowLength
= *width
;
5808 pack
->SkipPixels
+= (0 - *srcX
);
5809 *width
-= (0 - *srcX
);
5812 /* right clipping */
5813 if (*srcX
+ *width
> (GLsizei
) buffer
->Width
)
5814 *width
-= (*srcX
+ *width
- buffer
->Width
);
5819 /* bottom clipping */
5821 pack
->SkipRows
+= (0 - *srcY
);
5822 *height
-= (0 - *srcY
);
5826 if (*srcY
+ *height
> (GLsizei
) buffer
->Height
)
5827 *height
-= (*srcY
+ *height
- buffer
->Height
);
5837 * Do clipping for a glCopyTexSubImage call.
5838 * The framebuffer source region might extend outside the framebuffer
5839 * bounds. Clip the source region against the framebuffer bounds and
5840 * adjust the texture/dest position and size accordingly.
5842 * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
5845 _mesa_clip_copytexsubimage(const struct gl_context
*ctx
,
5846 GLint
*destX
, GLint
*destY
,
5847 GLint
*srcX
, GLint
*srcY
,
5848 GLsizei
*width
, GLsizei
*height
)
5850 const struct gl_framebuffer
*fb
= ctx
->ReadBuffer
;
5851 const GLint srcX0
= *srcX
, srcY0
= *srcY
;
5853 if (_mesa_clip_to_region(0, 0, fb
->Width
, fb
->Height
,
5854 srcX
, srcY
, width
, height
)) {
5855 *destX
= *destX
+ *srcX
- srcX0
;
5856 *destY
= *destY
+ *srcY
- srcY0
;
5868 * Clip the rectangle defined by (x, y, width, height) against the bounds
5869 * specified by [xmin, xmax) and [ymin, ymax).
5870 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
5873 _mesa_clip_to_region(GLint xmin
, GLint ymin
,
5874 GLint xmax
, GLint ymax
,
5876 GLsizei
*width
, GLsizei
*height
)
5880 *width
-= (xmin
- *x
);
5884 /* right clipping */
5885 if (*x
+ *width
> xmax
)
5886 *width
-= (*x
+ *width
- xmax
);
5891 /* bottom (or top) clipping */
5893 *height
-= (ymin
- *y
);
5897 /* top (or bottom) clipping */
5898 if (*y
+ *height
> ymax
)
5899 *height
-= (*y
+ *height
- ymax
);
5909 * Clip dst coords against Xmax (or Ymax).
5912 clip_right_or_top(GLint
*srcX0
, GLint
*srcX1
,
5913 GLint
*dstX0
, GLint
*dstX1
,
5918 if (*dstX1
> maxValue
) {
5919 /* X1 outside right edge */
5920 ASSERT(*dstX0
< maxValue
); /* X0 should be inside right edge */
5921 t
= (GLfloat
) (maxValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5922 /* chop off [t, 1] part */
5923 ASSERT(t
>= 0.0 && t
<= 1.0);
5925 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5926 *srcX1
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5928 else if (*dstX0
> maxValue
) {
5929 /* X0 outside right edge */
5930 ASSERT(*dstX1
< maxValue
); /* X1 should be inside right edge */
5931 t
= (GLfloat
) (maxValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5932 /* chop off [t, 1] part */
5933 ASSERT(t
>= 0.0 && t
<= 1.0);
5935 bias
= (*srcX0
< *srcX1
) ? -0.5F
: 0.5F
;
5936 *srcX0
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5942 * Clip dst coords against Xmin (or Ymin).
5945 clip_left_or_bottom(GLint
*srcX0
, GLint
*srcX1
,
5946 GLint
*dstX0
, GLint
*dstX1
,
5951 if (*dstX0
< minValue
) {
5952 /* X0 outside left edge */
5953 ASSERT(*dstX1
> minValue
); /* X1 should be inside left edge */
5954 t
= (GLfloat
) (minValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5955 /* chop off [0, t] part */
5956 ASSERT(t
>= 0.0 && t
<= 1.0);
5958 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
; /* flipped??? */
5959 *srcX0
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5961 else if (*dstX1
< minValue
) {
5962 /* X1 outside left edge */
5963 ASSERT(*dstX0
> minValue
); /* X0 should be inside left edge */
5964 t
= (GLfloat
) (minValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5965 /* chop off [0, t] part */
5966 ASSERT(t
>= 0.0 && t
<= 1.0);
5968 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5969 *srcX1
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5975 * Do clipping of blit src/dest rectangles.
5976 * The dest rect is clipped against both the buffer bounds and scissor bounds.
5977 * The src rect is just clipped against the buffer bounds.
5979 * When either the src or dest rect is clipped, the other is also clipped
5982 * Note that X0 need not be less than X1 (same for Y) for either the source
5983 * and dest rects. That makes the clipping a little trickier.
5985 * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
5988 _mesa_clip_blit(struct gl_context
*ctx
,
5989 GLint
*srcX0
, GLint
*srcY0
, GLint
*srcX1
, GLint
*srcY1
,
5990 GLint
*dstX0
, GLint
*dstY0
, GLint
*dstX1
, GLint
*dstY1
)
5992 const GLint srcXmin
= 0;
5993 const GLint srcXmax
= ctx
->ReadBuffer
->Width
;
5994 const GLint srcYmin
= 0;
5995 const GLint srcYmax
= ctx
->ReadBuffer
->Height
;
5997 /* these include scissor bounds */
5998 const GLint dstXmin
= ctx
->DrawBuffer
->_Xmin
;
5999 const GLint dstXmax
= ctx
->DrawBuffer
->_Xmax
;
6000 const GLint dstYmin
= ctx
->DrawBuffer
->_Ymin
;
6001 const GLint dstYmax
= ctx
->DrawBuffer
->_Ymax
;
6004 printf("PreClipX: src: %d .. %d dst: %d .. %d\n",
6005 *srcX0, *srcX1, *dstX0, *dstX1);
6006 printf("PreClipY: src: %d .. %d dst: %d .. %d\n",
6007 *srcY0, *srcY1, *dstY0, *dstY1);
6010 /* trivial rejection tests */
6011 if (*dstX0
== *dstX1
)
6012 return GL_FALSE
; /* no width */
6013 if (*dstX0
<= dstXmin
&& *dstX1
<= dstXmin
)
6014 return GL_FALSE
; /* totally out (left) of bounds */
6015 if (*dstX0
>= dstXmax
&& *dstX1
>= dstXmax
)
6016 return GL_FALSE
; /* totally out (right) of bounds */
6018 if (*dstY0
== *dstY1
)
6020 if (*dstY0
<= dstYmin
&& *dstY1
<= dstYmin
)
6022 if (*dstY0
>= dstYmax
&& *dstY1
>= dstYmax
)
6025 if (*srcX0
== *srcX1
)
6027 if (*srcX0
<= srcXmin
&& *srcX1
<= srcXmin
)
6029 if (*srcX0
>= srcXmax
&& *srcX1
>= srcXmax
)
6032 if (*srcY0
== *srcY1
)
6034 if (*srcY0
<= srcYmin
&& *srcY1
<= srcYmin
)
6036 if (*srcY0
>= srcYmax
&& *srcY1
>= srcYmax
)
6042 clip_right_or_top(srcX0
, srcX1
, dstX0
, dstX1
, dstXmax
);
6043 clip_right_or_top(srcY0
, srcY1
, dstY0
, dstY1
, dstYmax
);
6044 clip_left_or_bottom(srcX0
, srcX1
, dstX0
, dstX1
, dstXmin
);
6045 clip_left_or_bottom(srcY0
, srcY1
, dstY0
, dstY1
, dstYmin
);
6048 * src clip (just swap src/dst values from above)
6050 clip_right_or_top(dstX0
, dstX1
, srcX0
, srcX1
, srcXmax
);
6051 clip_right_or_top(dstY0
, dstY1
, srcY0
, srcY1
, srcYmax
);
6052 clip_left_or_bottom(dstX0
, dstX1
, srcX0
, srcX1
, srcXmin
);
6053 clip_left_or_bottom(dstY0
, dstY1
, srcY0
, srcY1
, srcYmin
);
6056 printf("PostClipX: src: %d .. %d dst: %d .. %d\n",
6057 *srcX0, *srcX1, *dstX0, *dstX1);
6058 printf("PostClipY: src: %d .. %d dst: %d .. %d\n",
6059 *srcY0, *srcY1, *dstY0, *dstY1);
6062 ASSERT(*dstX0
>= dstXmin
);
6063 ASSERT(*dstX0
<= dstXmax
);
6064 ASSERT(*dstX1
>= dstXmin
);
6065 ASSERT(*dstX1
<= dstXmax
);
6067 ASSERT(*dstY0
>= dstYmin
);
6068 ASSERT(*dstY0
<= dstYmax
);
6069 ASSERT(*dstY1
>= dstYmin
);
6070 ASSERT(*dstY1
<= dstYmax
);
6072 ASSERT(*srcX0
>= srcXmin
);
6073 ASSERT(*srcX0
<= srcXmax
);
6074 ASSERT(*srcX1
>= srcXmin
);
6075 ASSERT(*srcX1
<= srcXmax
);
6077 ASSERT(*srcY0
>= srcYmin
);
6078 ASSERT(*srcY0
<= srcYmax
);
6079 ASSERT(*srcY1
>= srcYmin
);
6080 ASSERT(*srcY1
<= srcYmax
);