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.
45 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
46 * we later convert the float to a packed integer value (such as for
47 * GL_RGB5_A1) because we'll wind up with a non-zero value.
49 * We redefine the macros here so zero is handled correctly.
52 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
55 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
59 /** Compute ceiling of integer quotient of A divided by B. */
60 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
64 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
67 _mesa_type_is_packed(GLenum type
)
70 case GL_UNSIGNED_BYTE_3_3_2
:
71 case GL_UNSIGNED_BYTE_2_3_3_REV
:
72 case GL_UNSIGNED_SHORT_5_6_5
:
73 case GL_UNSIGNED_SHORT_5_6_5_REV
:
74 case GL_UNSIGNED_SHORT_4_4_4_4
:
75 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
76 case GL_UNSIGNED_SHORT_5_5_5_1
:
77 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
78 case GL_UNSIGNED_INT_8_8_8_8
:
79 case GL_UNSIGNED_INT_8_8_8_8_REV
:
80 case GL_UNSIGNED_INT_10_10_10_2
:
81 case GL_UNSIGNED_INT_2_10_10_10_REV
:
82 case GL_UNSIGNED_SHORT_8_8_MESA
:
83 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
84 case GL_UNSIGNED_INT_24_8_EXT
:
92 * Flip the 8 bits in each byte of the given array.
95 * \param n number of bytes.
97 * \todo try this trick to flip bytes someday:
99 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
100 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
101 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
105 flip_bytes( GLubyte
*p
, GLuint n
)
108 for (i
= 0; i
< n
; i
++) {
109 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
110 a
= ((b
& 0x01) << 7) |
124 * Flip the order of the 2 bytes in each word in the given array.
127 * \param n number of words.
130 _mesa_swap2( GLushort
*p
, GLuint n
)
133 for (i
= 0; i
< n
; i
++) {
134 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
141 * Flip the order of the 4 bytes in each word in the given array.
144 _mesa_swap4( GLuint
*p
, GLuint n
)
147 for (i
= 0; i
< n
; i
++) {
150 | ((b
>> 8) & 0xff00)
151 | ((b
<< 8) & 0xff0000)
152 | ((b
<< 24) & 0xff000000);
159 * Get the size of a GL data type.
161 * \param type GL data type.
163 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
164 * if an invalid type enum.
167 _mesa_sizeof_type( GLenum type
)
172 case GL_UNSIGNED_BYTE
:
173 return sizeof(GLubyte
);
175 return sizeof(GLbyte
);
176 case GL_UNSIGNED_SHORT
:
177 return sizeof(GLushort
);
179 return sizeof(GLshort
);
180 case GL_UNSIGNED_INT
:
181 return sizeof(GLuint
);
183 return sizeof(GLint
);
185 return sizeof(GLfloat
);
187 return sizeof(GLdouble
);
188 case GL_HALF_FLOAT_ARB
:
189 return sizeof(GLhalfARB
);
197 * Same as _mesa_sizeof_type() but also accepting the packed pixel
201 _mesa_sizeof_packed_type( GLenum type
)
206 case GL_UNSIGNED_BYTE
:
207 return sizeof(GLubyte
);
209 return sizeof(GLbyte
);
210 case GL_UNSIGNED_SHORT
:
211 return sizeof(GLushort
);
213 return sizeof(GLshort
);
214 case GL_UNSIGNED_INT
:
215 return sizeof(GLuint
);
217 return sizeof(GLint
);
218 case GL_HALF_FLOAT_ARB
:
219 return sizeof(GLhalfARB
);
221 return sizeof(GLfloat
);
222 case GL_UNSIGNED_BYTE_3_3_2
:
223 return sizeof(GLubyte
);
224 case GL_UNSIGNED_BYTE_2_3_3_REV
:
225 return sizeof(GLubyte
);
226 case GL_UNSIGNED_SHORT_5_6_5
:
227 return sizeof(GLushort
);
228 case GL_UNSIGNED_SHORT_5_6_5_REV
:
229 return sizeof(GLushort
);
230 case GL_UNSIGNED_SHORT_4_4_4_4
:
231 return sizeof(GLushort
);
232 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
233 return sizeof(GLushort
);
234 case GL_UNSIGNED_SHORT_5_5_5_1
:
235 return sizeof(GLushort
);
236 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
237 return sizeof(GLushort
);
238 case GL_UNSIGNED_INT_8_8_8_8
:
239 return sizeof(GLuint
);
240 case GL_UNSIGNED_INT_8_8_8_8_REV
:
241 return sizeof(GLuint
);
242 case GL_UNSIGNED_INT_10_10_10_2
:
243 return sizeof(GLuint
);
244 case GL_UNSIGNED_INT_2_10_10_10_REV
:
245 return sizeof(GLuint
);
246 case GL_UNSIGNED_SHORT_8_8_MESA
:
247 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
248 return sizeof(GLushort
);
249 case GL_UNSIGNED_INT_24_8_EXT
:
250 return sizeof(GLuint
);
258 * Get the number of components in a pixel format.
260 * \param format pixel format.
262 * \return the number of components in the given format, or -1 if a bad format.
265 _mesa_components_in_format( GLenum format
)
269 case GL_COLOR_INDEX1_EXT
:
270 case GL_COLOR_INDEX2_EXT
:
271 case GL_COLOR_INDEX4_EXT
:
272 case GL_COLOR_INDEX8_EXT
:
273 case GL_COLOR_INDEX12_EXT
:
274 case GL_COLOR_INDEX16_EXT
:
275 case GL_STENCIL_INDEX
:
276 case GL_DEPTH_COMPONENT
:
284 case GL_LUMINANCE_ALPHA
:
298 case GL_DEPTH_STENCIL_EXT
:
310 * Get the bytes per pixel of pixel format type pair.
312 * \param format pixel format.
313 * \param type pixel type.
315 * \return bytes per pixel, or -1 if a bad format or type was given.
318 _mesa_bytes_per_pixel( GLenum format
, GLenum type
)
320 GLint comps
= _mesa_components_in_format( format
);
326 return 0; /* special case */
328 case GL_UNSIGNED_BYTE
:
329 return comps
* sizeof(GLubyte
);
331 case GL_UNSIGNED_SHORT
:
332 return comps
* sizeof(GLshort
);
334 case GL_UNSIGNED_INT
:
335 return comps
* sizeof(GLint
);
337 return comps
* sizeof(GLfloat
);
338 case GL_HALF_FLOAT_ARB
:
339 return comps
* sizeof(GLhalfARB
);
340 case GL_UNSIGNED_BYTE_3_3_2
:
341 case GL_UNSIGNED_BYTE_2_3_3_REV
:
342 if (format
== GL_RGB
|| format
== GL_BGR
)
343 return sizeof(GLubyte
);
345 return -1; /* error */
346 case GL_UNSIGNED_SHORT_5_6_5
:
347 case GL_UNSIGNED_SHORT_5_6_5_REV
:
348 if (format
== GL_RGB
|| format
== GL_BGR
)
349 return sizeof(GLushort
);
351 return -1; /* error */
352 case GL_UNSIGNED_SHORT_4_4_4_4
:
353 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
354 case GL_UNSIGNED_SHORT_5_5_5_1
:
355 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
356 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
357 return sizeof(GLushort
);
360 case GL_UNSIGNED_INT_8_8_8_8
:
361 case GL_UNSIGNED_INT_8_8_8_8_REV
:
362 case GL_UNSIGNED_INT_10_10_10_2
:
363 case GL_UNSIGNED_INT_2_10_10_10_REV
:
364 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
365 return sizeof(GLuint
);
368 case GL_UNSIGNED_SHORT_8_8_MESA
:
369 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
370 if (format
== GL_YCBCR_MESA
)
371 return sizeof(GLushort
);
374 case GL_UNSIGNED_INT_24_8_EXT
:
375 if (format
== GL_DEPTH_STENCIL_EXT
)
376 return sizeof(GLuint
);
386 * Test for a legal pixel format and type.
388 * \param format pixel format.
389 * \param type pixel type.
391 * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
395 _mesa_is_legal_format_and_type( GLcontext
*ctx
, GLenum format
, GLenum type
)
399 case GL_STENCIL_INDEX
:
403 case GL_UNSIGNED_BYTE
:
405 case GL_UNSIGNED_SHORT
:
407 case GL_UNSIGNED_INT
:
410 case GL_HALF_FLOAT_ARB
:
411 return ctx
->Extensions
.ARB_half_float_pixel
;
419 #if 0 /* not legal! see table 3.6 of the 1.5 spec */
423 case GL_LUMINANCE_ALPHA
:
424 case GL_DEPTH_COMPONENT
:
427 case GL_UNSIGNED_BYTE
:
429 case GL_UNSIGNED_SHORT
:
431 case GL_UNSIGNED_INT
:
434 case GL_HALF_FLOAT_ARB
:
435 return ctx
->Extensions
.ARB_half_float_pixel
;
442 case GL_UNSIGNED_BYTE
:
444 case GL_UNSIGNED_SHORT
:
446 case GL_UNSIGNED_INT
:
448 case GL_UNSIGNED_BYTE_3_3_2
:
449 case GL_UNSIGNED_BYTE_2_3_3_REV
:
450 case GL_UNSIGNED_SHORT_5_6_5
:
451 case GL_UNSIGNED_SHORT_5_6_5_REV
:
453 case GL_HALF_FLOAT_ARB
:
454 return ctx
->Extensions
.ARB_half_float_pixel
;
460 /* NOTE: no packed types are supported with BGR. That's
461 * intentional, according to the GL spec.
464 case GL_UNSIGNED_BYTE
:
466 case GL_UNSIGNED_SHORT
:
468 case GL_UNSIGNED_INT
:
471 case GL_HALF_FLOAT_ARB
:
472 return ctx
->Extensions
.ARB_half_float_pixel
;
481 case GL_UNSIGNED_BYTE
:
483 case GL_UNSIGNED_SHORT
:
485 case GL_UNSIGNED_INT
:
487 case GL_UNSIGNED_SHORT_4_4_4_4
:
488 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
489 case GL_UNSIGNED_SHORT_5_5_5_1
:
490 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
491 case GL_UNSIGNED_INT_8_8_8_8
:
492 case GL_UNSIGNED_INT_8_8_8_8_REV
:
493 case GL_UNSIGNED_INT_10_10_10_2
:
494 case GL_UNSIGNED_INT_2_10_10_10_REV
:
496 case GL_HALF_FLOAT_ARB
:
497 return ctx
->Extensions
.ARB_half_float_pixel
;
502 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
||
503 type
== GL_UNSIGNED_SHORT_8_8_REV_MESA
)
507 case GL_DEPTH_STENCIL_EXT
:
508 if (ctx
->Extensions
.EXT_packed_depth_stencil
509 && type
== GL_UNSIGNED_INT_24_8_EXT
)
517 case GL_UNSIGNED_BYTE
:
519 case GL_UNSIGNED_SHORT
:
521 case GL_UNSIGNED_INT
:
535 * Test if the given image format is a color/RGBA format (i.e., not color
536 * index, depth, stencil, etc).
537 * \param format the image format value (may by an internal texture format)
538 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
541 _mesa_is_color_format(GLenum format
)
559 case GL_LUMINANCE_ALPHA
:
560 case GL_LUMINANCE4_ALPHA4
:
561 case GL_LUMINANCE6_ALPHA2
:
562 case GL_LUMINANCE8_ALPHA8
:
563 case GL_LUMINANCE12_ALPHA4
:
564 case GL_LUMINANCE12_ALPHA12
:
565 case GL_LUMINANCE16_ALPHA16
:
592 /* float texture formats */
593 case GL_ALPHA16F_ARB
:
594 case GL_ALPHA32F_ARB
:
595 case GL_LUMINANCE16F_ARB
:
596 case GL_LUMINANCE32F_ARB
:
597 case GL_LUMINANCE_ALPHA16F_ARB
:
598 case GL_LUMINANCE_ALPHA32F_ARB
:
599 case GL_INTENSITY16F_ARB
:
600 case GL_INTENSITY32F_ARB
:
605 /* compressed formats */
606 case GL_COMPRESSED_ALPHA
:
607 case GL_COMPRESSED_LUMINANCE
:
608 case GL_COMPRESSED_LUMINANCE_ALPHA
:
609 case GL_COMPRESSED_INTENSITY
:
610 case GL_COMPRESSED_RGB
:
611 case GL_COMPRESSED_RGBA
:
616 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
617 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
618 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
619 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
620 case GL_COMPRESSED_RGB_FXT1_3DFX
:
621 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
622 #if FEATURE_EXT_texture_sRGB
625 case GL_SRGB_ALPHA_EXT
:
626 case GL_SRGB8_ALPHA8_EXT
:
627 case GL_SLUMINANCE_ALPHA_EXT
:
628 case GL_SLUMINANCE8_ALPHA8_EXT
:
629 case GL_SLUMINANCE_EXT
:
630 case GL_SLUMINANCE8_EXT
:
631 case GL_COMPRESSED_SRGB_EXT
:
632 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
633 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
634 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
635 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
636 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
637 case GL_COMPRESSED_SLUMINANCE_EXT
:
638 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
639 #endif /* FEATURE_EXT_texture_sRGB */
641 /* signed texture formats */
645 case GL_YCBCR_MESA
: /* not considered to be RGB */
654 * Test if the given image format is a color index format.
657 _mesa_is_index_format(GLenum format
)
661 case GL_COLOR_INDEX1_EXT
:
662 case GL_COLOR_INDEX2_EXT
:
663 case GL_COLOR_INDEX4_EXT
:
664 case GL_COLOR_INDEX8_EXT
:
665 case GL_COLOR_INDEX12_EXT
:
666 case GL_COLOR_INDEX16_EXT
:
675 * Test if the given image format is a depth component format.
678 _mesa_is_depth_format(GLenum format
)
681 case GL_DEPTH_COMPONENT
:
682 case GL_DEPTH_COMPONENT16
:
683 case GL_DEPTH_COMPONENT24
:
684 case GL_DEPTH_COMPONENT32
:
693 * Test if the given image format is a stencil format.
696 _mesa_is_stencil_format(GLenum format
)
699 case GL_STENCIL_INDEX
:
700 case GL_DEPTH_STENCIL
:
709 * Test if the given image format is a YCbCr format.
712 _mesa_is_ycbcr_format(GLenum format
)
724 * Test if the given image format is a depth+stencil format.
727 _mesa_is_depthstencil_format(GLenum format
)
730 case GL_DEPTH24_STENCIL8_EXT
:
731 case GL_DEPTH_STENCIL_EXT
:
739 * Test if the given image format is a dudv format.
742 _mesa_is_dudv_format(GLenum format
)
755 * Return the address of a specific pixel in an image (1D, 2D or 3D).
757 * Pixel unpacking/packing parameters are observed according to \p packing.
759 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
760 * \param image starting address of image data
761 * \param width the image width
762 * \param height theimage height
763 * \param format the pixel format
764 * \param type the pixel data type
765 * \param packing the pixelstore attributes
766 * \param img which image in the volume (0 for 1D or 2D images)
767 * \param row row of pixel in the image (0 for 1D images)
768 * \param column column of pixel in the image
770 * \return address of pixel on success, or NULL on error.
772 * \sa gl_pixelstore_attrib.
775 _mesa_image_address( GLuint dimensions
,
776 const struct gl_pixelstore_attrib
*packing
,
778 GLsizei width
, GLsizei height
,
779 GLenum format
, GLenum type
,
780 GLint img
, GLint row
, GLint column
)
782 GLint alignment
; /* 1, 2 or 4 */
783 GLint pixels_per_row
;
784 GLint rows_per_image
;
787 GLint skipimages
; /* for 3-D volume images */
790 ASSERT(dimensions
>= 1 && dimensions
<= 3);
792 alignment
= packing
->Alignment
;
793 if (packing
->RowLength
> 0) {
794 pixels_per_row
= packing
->RowLength
;
797 pixels_per_row
= width
;
799 if (packing
->ImageHeight
> 0) {
800 rows_per_image
= packing
->ImageHeight
;
803 rows_per_image
= height
;
806 skippixels
= packing
->SkipPixels
;
807 /* Note: SKIP_ROWS _is_ used for 1D images */
808 skiprows
= packing
->SkipRows
;
809 /* Note: SKIP_IMAGES is only used for 3D images */
810 skipimages
= (dimensions
== 3) ? packing
->SkipImages
: 0;
812 if (type
== GL_BITMAP
) {
814 GLint comp_per_pixel
; /* components per pixel */
815 GLint bytes_per_comp
; /* bytes per component */
817 GLint bytes_per_image
;
819 /* Compute bytes per component */
820 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
821 if (bytes_per_comp
< 0) {
825 /* Compute number of components per pixel */
826 comp_per_pixel
= _mesa_components_in_format( format
);
827 if (comp_per_pixel
< 0) {
831 bytes_per_row
= alignment
832 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
834 bytes_per_image
= bytes_per_row
* rows_per_image
;
836 pixel_addr
= (GLubyte
*) image
837 + (skipimages
+ img
) * bytes_per_image
838 + (skiprows
+ row
) * bytes_per_row
839 + (skippixels
+ column
) / 8;
842 /* Non-BITMAP data */
843 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
846 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
848 /* The pixel type and format should have been error checked earlier */
849 assert(bytes_per_pixel
> 0);
851 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
852 remainder
= bytes_per_row
% alignment
;
854 bytes_per_row
+= (alignment
- remainder
);
856 ASSERT(bytes_per_row
% alignment
== 0);
858 bytes_per_image
= bytes_per_row
* rows_per_image
;
860 if (packing
->Invert
) {
861 /* set pixel_addr to the last row */
862 topOfImage
= bytes_per_row
* (height
- 1);
863 bytes_per_row
= -bytes_per_row
;
869 /* compute final pixel address */
870 pixel_addr
= (GLubyte
*) image
871 + (skipimages
+ img
) * bytes_per_image
873 + (skiprows
+ row
) * bytes_per_row
874 + (skippixels
+ column
) * bytes_per_pixel
;
877 return (GLvoid
*) pixel_addr
;
882 _mesa_image_address1d( const struct gl_pixelstore_attrib
*packing
,
885 GLenum format
, GLenum type
,
888 return _mesa_image_address(1, packing
, image
, width
, 1,
889 format
, type
, 0, 0, column
);
894 _mesa_image_address2d( const struct gl_pixelstore_attrib
*packing
,
896 GLsizei width
, GLsizei height
,
897 GLenum format
, GLenum type
,
898 GLint row
, GLint column
)
900 return _mesa_image_address(2, packing
, image
, width
, height
,
901 format
, type
, 0, row
, column
);
906 _mesa_image_address3d( const struct gl_pixelstore_attrib
*packing
,
908 GLsizei width
, GLsizei height
,
909 GLenum format
, GLenum type
,
910 GLint img
, GLint row
, GLint column
)
912 return _mesa_image_address(3, packing
, image
, width
, height
,
913 format
, type
, img
, row
, column
);
919 * Compute the stride (in bytes) between image rows.
921 * \param packing the pixelstore attributes
922 * \param width image width.
923 * \param format pixel format.
924 * \param type pixel data type.
926 * \return the stride in bytes for the given parameters, or -1 if error
929 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
930 GLint width
, GLenum format
, GLenum type
)
932 GLint bytesPerRow
, remainder
;
936 if (type
== GL_BITMAP
) {
937 if (packing
->RowLength
== 0) {
938 bytesPerRow
= (width
+ 7) / 8;
941 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
945 /* Non-BITMAP data */
946 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
947 if (bytesPerPixel
<= 0)
948 return -1; /* error */
949 if (packing
->RowLength
== 0) {
950 bytesPerRow
= bytesPerPixel
* width
;
953 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
957 remainder
= bytesPerRow
% packing
->Alignment
;
959 bytesPerRow
+= (packing
->Alignment
- remainder
);
962 if (packing
->Invert
) {
963 /* negate the bytes per row (negative row stride) */
964 bytesPerRow
= -bytesPerRow
;
974 * Compute the stride between images in a 3D texture (in bytes) for the given
975 * pixel packing parameters and image width, format and type.
978 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
979 GLint width
, GLint height
,
980 GLenum format
, GLenum type
)
982 GLint bytesPerRow
, bytesPerImage
, remainder
;
986 if (type
== GL_BITMAP
) {
987 if (packing
->RowLength
== 0) {
988 bytesPerRow
= (width
+ 7) / 8;
991 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
995 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
997 if (bytesPerPixel
<= 0)
998 return -1; /* error */
999 if (packing
->RowLength
== 0) {
1000 bytesPerRow
= bytesPerPixel
* width
;
1003 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1007 remainder
= bytesPerRow
% packing
->Alignment
;
1009 bytesPerRow
+= (packing
->Alignment
- remainder
);
1011 if (packing
->ImageHeight
== 0)
1012 bytesPerImage
= bytesPerRow
* height
;
1014 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
1016 return bytesPerImage
;
1021 * Unpack a 32x32 pixel polygon stipple from user memory using the
1022 * current pixel unpack settings.
1025 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
1026 const struct gl_pixelstore_attrib
*unpacking
)
1028 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
1030 /* Convert pattern from GLubytes to GLuints and handle big/little
1031 * endian differences
1035 for (i
= 0; i
< 32; i
++) {
1036 dest
[i
] = (p
[0] << 24)
1048 * Pack polygon stipple into user memory given current pixel packing
1052 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
1053 const struct gl_pixelstore_attrib
*packing
)
1055 /* Convert pattern from GLuints to GLubytes to handle big/little
1056 * endian differences.
1060 for (i
= 0; i
< 32; i
++) {
1061 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
1062 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
1063 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
1064 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
1067 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
1072 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
1073 * order with row alignment = 1 byte.
1076 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
1077 const struct gl_pixelstore_attrib
*packing
)
1079 GLint bytes
, row
, width_in_bytes
;
1080 GLubyte
*buffer
, *dst
;
1085 /* Alloc dest storage */
1086 bytes
= ((width
+ 7) / 8 * height
);
1087 buffer
= (GLubyte
*) _mesa_malloc( bytes
);
1091 width_in_bytes
= CEILING( width
, 8 );
1093 for (row
= 0; row
< height
; row
++) {
1094 const GLubyte
*src
= (const GLubyte
*)
1095 _mesa_image_address2d(packing
, pixels
, width
, height
,
1096 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1102 if ((packing
->SkipPixels
& 7) == 0) {
1103 _mesa_memcpy( dst
, src
, width_in_bytes
);
1104 if (packing
->LsbFirst
) {
1105 flip_bytes( dst
, width_in_bytes
);
1109 /* handling SkipPixels is a bit tricky (no pun intended!) */
1111 if (packing
->LsbFirst
) {
1112 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
1113 GLubyte dstMask
= 128;
1114 const GLubyte
*s
= src
;
1117 for (i
= 0; i
< width
; i
++) {
1121 if (srcMask
== 128) {
1126 srcMask
= srcMask
<< 1;
1134 dstMask
= dstMask
>> 1;
1139 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
1140 GLubyte dstMask
= 128;
1141 const GLubyte
*s
= src
;
1144 for (i
= 0; i
< width
; i
++) {
1153 srcMask
= srcMask
>> 1;
1161 dstMask
= dstMask
>> 1;
1166 dst
+= width_in_bytes
;
1177 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
1178 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
1180 GLint row
, width_in_bytes
;
1186 width_in_bytes
= CEILING( width
, 8 );
1188 for (row
= 0; row
< height
; row
++) {
1189 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
1190 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1194 if ((packing
->SkipPixels
& 7) == 0) {
1195 _mesa_memcpy( dst
, src
, width_in_bytes
);
1196 if (packing
->LsbFirst
) {
1197 flip_bytes( dst
, width_in_bytes
);
1201 /* handling SkipPixels is a bit tricky (no pun intended!) */
1203 if (packing
->LsbFirst
) {
1204 GLubyte srcMask
= 128;
1205 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
1206 const GLubyte
*s
= src
;
1209 for (i
= 0; i
< width
; i
++) {
1218 srcMask
= srcMask
>> 1;
1220 if (dstMask
== 128) {
1226 dstMask
= dstMask
<< 1;
1231 GLubyte srcMask
= 128;
1232 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
1233 const GLubyte
*s
= src
;
1236 for (i
= 0; i
< width
; i
++) {
1245 srcMask
= srcMask
>> 1;
1253 dstMask
= dstMask
>> 1;
1258 src
+= width_in_bytes
;
1264 * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1265 * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1266 * "On" bits will set texels to \p onValue.
1267 * "Off" bits will not modify texels.
1268 * \param width src bitmap width in pixels
1269 * \param height src bitmap height in pixels
1270 * \param unpack bitmap unpacking state
1271 * \param bitmap the src bitmap data
1272 * \param destBuffer start of dest buffer
1273 * \param destStride row stride in dest buffer
1274 * \param onValue if bit is 1, set destBuffer pixel to this value
1277 _mesa_expand_bitmap(GLsizei width
, GLsizei height
,
1278 const struct gl_pixelstore_attrib
*unpack
,
1279 const GLubyte
*bitmap
,
1280 GLubyte
*destBuffer
, GLint destStride
,
1283 const GLubyte
*srcRow
= (const GLubyte
*)
1284 _mesa_image_address2d(unpack
, bitmap
, width
, height
,
1285 GL_COLOR_INDEX
, GL_BITMAP
, 0, 0);
1286 const GLint srcStride
= _mesa_image_row_stride(unpack
, width
,
1287 GL_COLOR_INDEX
, GL_BITMAP
);
1290 #define SET_PIXEL(COL, ROW) \
1291 destBuffer[(ROW) * destStride + (COL)] = onValue;
1293 for (row
= 0; row
< height
; row
++) {
1294 const GLubyte
*src
= srcRow
;
1296 if (unpack
->LsbFirst
) {
1298 GLubyte mask
= 1U << (unpack
->SkipPixels
& 0x7);
1299 for (col
= 0; col
< width
; col
++) {
1302 SET_PIXEL(col
, row
);
1314 /* get ready for next row */
1320 GLubyte mask
= 128U >> (unpack
->SkipPixels
& 0x7);
1321 for (col
= 0; col
< width
; col
++) {
1324 SET_PIXEL(col
, row
);
1336 /* get ready for next row */
1341 srcRow
+= srcStride
;
1348 /**********************************************************************/
1349 /***** Pixel processing functions ******/
1350 /**********************************************************************/
1353 * Apply scale and bias factors to an array of RGBA pixels.
1356 _mesa_scale_and_bias_rgba(GLuint n
, GLfloat rgba
[][4],
1357 GLfloat rScale
, GLfloat gScale
,
1358 GLfloat bScale
, GLfloat aScale
,
1359 GLfloat rBias
, GLfloat gBias
,
1360 GLfloat bBias
, GLfloat aBias
)
1362 if (rScale
!= 1.0 || rBias
!= 0.0) {
1364 for (i
= 0; i
< n
; i
++) {
1365 rgba
[i
][RCOMP
] = rgba
[i
][RCOMP
] * rScale
+ rBias
;
1368 if (gScale
!= 1.0 || gBias
!= 0.0) {
1370 for (i
= 0; i
< n
; i
++) {
1371 rgba
[i
][GCOMP
] = rgba
[i
][GCOMP
] * gScale
+ gBias
;
1374 if (bScale
!= 1.0 || bBias
!= 0.0) {
1376 for (i
= 0; i
< n
; i
++) {
1377 rgba
[i
][BCOMP
] = rgba
[i
][BCOMP
] * bScale
+ bBias
;
1380 if (aScale
!= 1.0 || aBias
!= 0.0) {
1382 for (i
= 0; i
< n
; i
++) {
1383 rgba
[i
][ACOMP
] = rgba
[i
][ACOMP
] * aScale
+ aBias
;
1390 * Apply pixel mapping to an array of floating point RGBA pixels.
1393 _mesa_map_rgba( const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4] )
1395 const GLfloat rscale
= (GLfloat
) (ctx
->PixelMaps
.RtoR
.Size
- 1);
1396 const GLfloat gscale
= (GLfloat
) (ctx
->PixelMaps
.GtoG
.Size
- 1);
1397 const GLfloat bscale
= (GLfloat
) (ctx
->PixelMaps
.BtoB
.Size
- 1);
1398 const GLfloat ascale
= (GLfloat
) (ctx
->PixelMaps
.AtoA
.Size
- 1);
1399 const GLfloat
*rMap
= ctx
->PixelMaps
.RtoR
.Map
;
1400 const GLfloat
*gMap
= ctx
->PixelMaps
.GtoG
.Map
;
1401 const GLfloat
*bMap
= ctx
->PixelMaps
.BtoB
.Map
;
1402 const GLfloat
*aMap
= ctx
->PixelMaps
.AtoA
.Map
;
1405 GLfloat r
= CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1406 GLfloat g
= CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1407 GLfloat b
= CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1408 GLfloat a
= CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1409 rgba
[i
][RCOMP
] = rMap
[IROUND(r
* rscale
)];
1410 rgba
[i
][GCOMP
] = gMap
[IROUND(g
* gscale
)];
1411 rgba
[i
][BCOMP
] = bMap
[IROUND(b
* bscale
)];
1412 rgba
[i
][ACOMP
] = aMap
[IROUND(a
* ascale
)];
1418 * Apply the color matrix and post color matrix scaling and biasing.
1421 _mesa_transform_rgba(const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4])
1423 const GLfloat rs
= ctx
->Pixel
.PostColorMatrixScale
[0];
1424 const GLfloat rb
= ctx
->Pixel
.PostColorMatrixBias
[0];
1425 const GLfloat gs
= ctx
->Pixel
.PostColorMatrixScale
[1];
1426 const GLfloat gb
= ctx
->Pixel
.PostColorMatrixBias
[1];
1427 const GLfloat bs
= ctx
->Pixel
.PostColorMatrixScale
[2];
1428 const GLfloat bb
= ctx
->Pixel
.PostColorMatrixBias
[2];
1429 const GLfloat as
= ctx
->Pixel
.PostColorMatrixScale
[3];
1430 const GLfloat ab
= ctx
->Pixel
.PostColorMatrixBias
[3];
1431 const GLfloat
*m
= ctx
->ColorMatrixStack
.Top
->m
;
1433 for (i
= 0; i
< n
; i
++) {
1434 const GLfloat r
= rgba
[i
][RCOMP
];
1435 const GLfloat g
= rgba
[i
][GCOMP
];
1436 const GLfloat b
= rgba
[i
][BCOMP
];
1437 const GLfloat a
= rgba
[i
][ACOMP
];
1438 rgba
[i
][RCOMP
] = (m
[0] * r
+ m
[4] * g
+ m
[ 8] * b
+ m
[12] * a
) * rs
+ rb
;
1439 rgba
[i
][GCOMP
] = (m
[1] * r
+ m
[5] * g
+ m
[ 9] * b
+ m
[13] * a
) * gs
+ gb
;
1440 rgba
[i
][BCOMP
] = (m
[2] * r
+ m
[6] * g
+ m
[10] * b
+ m
[14] * a
) * bs
+ bb
;
1441 rgba
[i
][ACOMP
] = (m
[3] * r
+ m
[7] * g
+ m
[11] * b
+ m
[15] * a
) * as
+ ab
;
1447 * Apply a color table lookup to an array of floating point RGBA colors.
1450 _mesa_lookup_rgba_float(const struct gl_color_table
*table
,
1451 GLuint n
, GLfloat rgba
[][4])
1453 const GLint max
= table
->Size
- 1;
1454 const GLfloat scale
= (GLfloat
) max
;
1455 const GLfloat
*lut
= table
->TableF
;
1458 if (!table
->TableF
|| table
->Size
== 0)
1461 switch (table
->_BaseFormat
) {
1463 /* replace RGBA with I */
1464 for (i
= 0; i
< n
; i
++) {
1465 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1466 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1474 /* replace RGB with L */
1475 for (i
= 0; i
< n
; i
++) {
1476 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1477 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1484 /* replace A with A */
1485 for (i
= 0; i
< n
; i
++) {
1486 GLint j
= IROUND(rgba
[i
][ACOMP
] * scale
);
1487 rgba
[i
][ACOMP
] = lut
[CLAMP(j
, 0, max
)];
1490 case GL_LUMINANCE_ALPHA
:
1491 /* replace RGBA with LLLA */
1492 for (i
= 0; i
< n
; i
++) {
1493 GLint jL
= IROUND(rgba
[i
][RCOMP
] * scale
);
1494 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1495 GLfloat luminance
, alpha
;
1496 jL
= CLAMP(jL
, 0, max
);
1497 jA
= CLAMP(jA
, 0, max
);
1498 luminance
= lut
[jL
* 2 + 0];
1499 alpha
= lut
[jA
* 2 + 1];
1502 rgba
[i
][BCOMP
] = luminance
;
1503 rgba
[i
][ACOMP
] = alpha
;;
1507 /* replace RGB with RGB */
1508 for (i
= 0; i
< n
; i
++) {
1509 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1510 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1511 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1512 jR
= CLAMP(jR
, 0, max
);
1513 jG
= CLAMP(jG
, 0, max
);
1514 jB
= CLAMP(jB
, 0, max
);
1515 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1516 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1517 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1521 /* replace RGBA with RGBA */
1522 for (i
= 0; i
< n
; i
++) {
1523 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1524 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1525 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1526 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1527 jR
= CLAMP(jR
, 0, max
);
1528 jG
= CLAMP(jG
, 0, max
);
1529 jB
= CLAMP(jB
, 0, max
);
1530 jA
= CLAMP(jA
, 0, max
);
1531 rgba
[i
][RCOMP
] = lut
[jR
* 4 + 0];
1532 rgba
[i
][GCOMP
] = lut
[jG
* 4 + 1];
1533 rgba
[i
][BCOMP
] = lut
[jB
* 4 + 2];
1534 rgba
[i
][ACOMP
] = lut
[jA
* 4 + 3];
1538 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_float");
1546 * Apply a color table lookup to an array of ubyte/RGBA colors.
1549 _mesa_lookup_rgba_ubyte(const struct gl_color_table
*table
,
1550 GLuint n
, GLubyte rgba
[][4])
1552 const GLubyte
*lut
= table
->TableUB
;
1553 const GLfloat scale
= (GLfloat
) (table
->Size
- 1) / (GLfloat
)255.0;
1556 if (!table
->TableUB
|| table
->Size
== 0)
1559 switch (table
->_BaseFormat
) {
1561 /* replace RGBA with I */
1562 if (table
->Size
== 256) {
1563 for (i
= 0; i
< n
; i
++) {
1564 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1572 for (i
= 0; i
< n
; i
++) {
1573 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1577 rgba
[i
][ACOMP
] = lut
[j
];
1582 /* replace RGB with L */
1583 if (table
->Size
== 256) {
1584 for (i
= 0; i
< n
; i
++) {
1585 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1592 for (i
= 0; i
< n
; i
++) {
1593 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1596 rgba
[i
][BCOMP
] = lut
[j
];
1601 /* replace A with A */
1602 if (table
->Size
== 256) {
1603 for (i
= 0; i
< n
; i
++) {
1604 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
]];
1608 for (i
= 0; i
< n
; i
++) {
1609 GLint j
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1610 rgba
[i
][ACOMP
] = lut
[j
];
1614 case GL_LUMINANCE_ALPHA
:
1615 /* replace RGBA with LLLA */
1616 if (table
->Size
== 256) {
1617 for (i
= 0; i
< n
; i
++) {
1618 GLubyte l
= lut
[rgba
[i
][RCOMP
] * 2 + 0];
1619 GLubyte a
= lut
[rgba
[i
][ACOMP
] * 2 + 1];;
1627 for (i
= 0; i
< n
; i
++) {
1628 GLint jL
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1629 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1630 GLubyte luminance
= lut
[jL
* 2 + 0];
1631 GLubyte alpha
= lut
[jA
* 2 + 1];
1634 rgba
[i
][BCOMP
] = luminance
;
1635 rgba
[i
][ACOMP
] = alpha
;
1640 if (table
->Size
== 256) {
1641 for (i
= 0; i
< n
; i
++) {
1642 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 3 + 0];
1643 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 3 + 1];
1644 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 3 + 2];
1648 for (i
= 0; i
< n
; i
++) {
1649 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1650 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1651 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1652 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1653 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1654 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1659 if (table
->Size
== 256) {
1660 for (i
= 0; i
< n
; i
++) {
1661 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 4 + 0];
1662 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 4 + 1];
1663 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 4 + 2];
1664 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
] * 4 + 3];
1668 for (i
= 0; i
< n
; i
++) {
1669 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1670 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1671 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1672 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1673 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][RCOMP
], lut
[jR
* 4 + 0]);
1674 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][GCOMP
], lut
[jG
* 4 + 1]);
1675 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][BCOMP
], lut
[jB
* 4 + 2]);
1676 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][ACOMP
], lut
[jA
* 4 + 3]);
1681 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_chan");
1689 * Map color indexes to float rgba values.
1692 _mesa_map_ci_to_rgba( const GLcontext
*ctx
, GLuint n
,
1693 const GLuint index
[], GLfloat rgba
[][4] )
1695 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1696 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1697 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1698 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1699 const GLfloat
*rMap
= ctx
->PixelMaps
.ItoR
.Map
;
1700 const GLfloat
*gMap
= ctx
->PixelMaps
.ItoG
.Map
;
1701 const GLfloat
*bMap
= ctx
->PixelMaps
.ItoB
.Map
;
1702 const GLfloat
*aMap
= ctx
->PixelMaps
.ItoA
.Map
;
1705 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1706 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1707 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1708 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1714 * Map ubyte color indexes to ubyte/RGBA values.
1717 _mesa_map_ci8_to_rgba8(const GLcontext
*ctx
, GLuint n
, const GLubyte index
[],
1720 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1721 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1722 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1723 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1724 const GLubyte
*rMap
= ctx
->PixelMaps
.ItoR
.Map8
;
1725 const GLubyte
*gMap
= ctx
->PixelMaps
.ItoG
.Map8
;
1726 const GLubyte
*bMap
= ctx
->PixelMaps
.ItoB
.Map8
;
1727 const GLubyte
*aMap
= ctx
->PixelMaps
.ItoA
.Map8
;
1730 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1731 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1732 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1733 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1739 _mesa_scale_and_bias_depth(const GLcontext
*ctx
, GLuint n
,
1740 GLfloat depthValues
[])
1742 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
1743 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
1745 for (i
= 0; i
< n
; i
++) {
1746 GLfloat d
= depthValues
[i
] * scale
+ bias
;
1747 depthValues
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
1753 _mesa_scale_and_bias_depth_uint(const GLcontext
*ctx
, GLuint n
,
1754 GLuint depthValues
[])
1756 const GLdouble max
= (double) 0xffffffff;
1757 const GLdouble scale
= ctx
->Pixel
.DepthScale
;
1758 const GLdouble bias
= ctx
->Pixel
.DepthBias
* max
;
1760 for (i
= 0; i
< n
; i
++) {
1761 GLdouble d
= (GLdouble
) depthValues
[i
] * scale
+ bias
;
1762 d
= CLAMP(d
, 0.0, max
);
1763 depthValues
[i
] = (GLuint
) d
;
1770 * Update the min/max values from an array of fragment colors.
1773 update_minmax(GLcontext
*ctx
, GLuint n
, const GLfloat rgba
[][4])
1776 for (i
= 0; i
< n
; i
++) {
1778 if (rgba
[i
][RCOMP
] < ctx
->MinMax
.Min
[RCOMP
])
1779 ctx
->MinMax
.Min
[RCOMP
] = rgba
[i
][RCOMP
];
1780 if (rgba
[i
][GCOMP
] < ctx
->MinMax
.Min
[GCOMP
])
1781 ctx
->MinMax
.Min
[GCOMP
] = rgba
[i
][GCOMP
];
1782 if (rgba
[i
][BCOMP
] < ctx
->MinMax
.Min
[BCOMP
])
1783 ctx
->MinMax
.Min
[BCOMP
] = rgba
[i
][BCOMP
];
1784 if (rgba
[i
][ACOMP
] < ctx
->MinMax
.Min
[ACOMP
])
1785 ctx
->MinMax
.Min
[ACOMP
] = rgba
[i
][ACOMP
];
1788 if (rgba
[i
][RCOMP
] > ctx
->MinMax
.Max
[RCOMP
])
1789 ctx
->MinMax
.Max
[RCOMP
] = rgba
[i
][RCOMP
];
1790 if (rgba
[i
][GCOMP
] > ctx
->MinMax
.Max
[GCOMP
])
1791 ctx
->MinMax
.Max
[GCOMP
] = rgba
[i
][GCOMP
];
1792 if (rgba
[i
][BCOMP
] > ctx
->MinMax
.Max
[BCOMP
])
1793 ctx
->MinMax
.Max
[BCOMP
] = rgba
[i
][BCOMP
];
1794 if (rgba
[i
][ACOMP
] > ctx
->MinMax
.Max
[ACOMP
])
1795 ctx
->MinMax
.Max
[ACOMP
] = rgba
[i
][ACOMP
];
1801 * Update the histogram values from an array of fragment colors.
1804 update_histogram(GLcontext
*ctx
, GLuint n
, const GLfloat rgba
[][4])
1806 const GLint max
= ctx
->Histogram
.Width
- 1;
1807 GLfloat w
= (GLfloat
) max
;
1810 if (ctx
->Histogram
.Width
== 0)
1813 for (i
= 0; i
< n
; i
++) {
1814 GLint ri
= IROUND(rgba
[i
][RCOMP
] * w
);
1815 GLint gi
= IROUND(rgba
[i
][GCOMP
] * w
);
1816 GLint bi
= IROUND(rgba
[i
][BCOMP
] * w
);
1817 GLint ai
= IROUND(rgba
[i
][ACOMP
] * w
);
1818 ri
= CLAMP(ri
, 0, max
);
1819 gi
= CLAMP(gi
, 0, max
);
1820 bi
= CLAMP(bi
, 0, max
);
1821 ai
= CLAMP(ai
, 0, max
);
1822 ctx
->Histogram
.Count
[ri
][RCOMP
]++;
1823 ctx
->Histogram
.Count
[gi
][GCOMP
]++;
1824 ctx
->Histogram
.Count
[bi
][BCOMP
]++;
1825 ctx
->Histogram
.Count
[ai
][ACOMP
]++;
1831 * Apply various pixel transfer operations to an array of RGBA pixels
1832 * as indicated by the transferOps bitmask
1835 _mesa_apply_rgba_transfer_ops(GLcontext
*ctx
, GLbitfield transferOps
,
1836 GLuint n
, GLfloat rgba
[][4])
1839 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
1840 _mesa_scale_and_bias_rgba(n
, rgba
,
1841 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
1842 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
1843 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
1844 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
1846 /* color map lookup */
1847 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1848 _mesa_map_rgba( ctx
, n
, rgba
);
1850 /* GL_COLOR_TABLE lookup */
1851 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
1852 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_PRECONVOLUTION
], n
, rgba
);
1855 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
1856 /* this has to be done in the calling code */
1857 _mesa_problem(ctx
, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
1859 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
1860 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
1861 _mesa_scale_and_bias_rgba(n
, rgba
,
1862 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
1863 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
1864 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
1865 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
1866 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
1867 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
1868 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
1869 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
1871 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
1872 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
1873 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_POSTCONVOLUTION
], n
, rgba
);
1875 /* color matrix transform */
1876 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
1877 _mesa_transform_rgba(ctx
, n
, rgba
);
1879 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
1880 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
1881 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_POSTCOLORMATRIX
], n
, rgba
);
1883 /* update histogram count */
1884 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
1885 update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
1887 /* update min/max values */
1888 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
1889 update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
1891 /* clamping to [0,1] */
1892 if (transferOps
& IMAGE_CLAMP_BIT
) {
1894 for (i
= 0; i
< n
; i
++) {
1895 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1896 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1897 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1898 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1905 * Apply color index shift and offset to an array of pixels.
1908 shift_and_offset_ci( const GLcontext
*ctx
, GLuint n
, GLuint indexes
[] )
1910 GLint shift
= ctx
->Pixel
.IndexShift
;
1911 GLint offset
= ctx
->Pixel
.IndexOffset
;
1915 indexes
[i
] = (indexes
[i
] << shift
) + offset
;
1918 else if (shift
< 0) {
1921 indexes
[i
] = (indexes
[i
] >> shift
) + offset
;
1926 indexes
[i
] = indexes
[i
] + offset
;
1934 * Apply color index shift, offset and table lookup to an array
1938 _mesa_apply_ci_transfer_ops(const GLcontext
*ctx
, GLbitfield transferOps
,
1939 GLuint n
, GLuint indexes
[])
1941 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
1942 shift_and_offset_ci(ctx
, n
, indexes
);
1944 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1945 const GLuint mask
= ctx
->PixelMaps
.ItoI
.Size
- 1;
1947 for (i
= 0; i
< n
; i
++) {
1948 const GLuint j
= indexes
[i
] & mask
;
1949 indexes
[i
] = IROUND(ctx
->PixelMaps
.ItoI
.Map
[j
]);
1956 * Apply stencil index shift, offset and table lookup to an array
1957 * of stencil values.
1960 _mesa_apply_stencil_transfer_ops(const GLcontext
*ctx
, GLuint n
,
1961 GLstencil stencil
[])
1963 if (ctx
->Pixel
.IndexShift
!= 0 || ctx
->Pixel
.IndexOffset
!= 0) {
1964 const GLint offset
= ctx
->Pixel
.IndexOffset
;
1965 GLint shift
= ctx
->Pixel
.IndexShift
;
1968 for (i
= 0; i
< n
; i
++) {
1969 stencil
[i
] = (stencil
[i
] << shift
) + offset
;
1972 else if (shift
< 0) {
1974 for (i
= 0; i
< n
; i
++) {
1975 stencil
[i
] = (stencil
[i
] >> shift
) + offset
;
1979 for (i
= 0; i
< n
; i
++) {
1980 stencil
[i
] = stencil
[i
] + offset
;
1984 if (ctx
->Pixel
.MapStencilFlag
) {
1985 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
1987 for (i
= 0; i
< n
; i
++) {
1988 stencil
[i
] = (GLstencil
)ctx
->PixelMaps
.StoS
.Map
[ stencil
[i
] & mask
];
1995 * Used to pack an array [][4] of RGBA float colors as specified
1996 * by the dstFormat, dstType and dstPacking. Used by glReadPixels,
1997 * glGetConvolutionFilter(), etc.
1998 * Note: the rgba values will be modified by this function when any pixel
1999 * transfer ops are enabled.
2002 _mesa_pack_rgba_span_float(GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4],
2003 GLenum dstFormat
, GLenum dstType
,
2005 const struct gl_pixelstore_attrib
*dstPacking
,
2006 GLbitfield transferOps
)
2008 GLfloat luminance
[MAX_WIDTH
];
2009 const GLint comps
= _mesa_components_in_format(dstFormat
);
2013 * This test should probably go away. Have the caller set/clear the
2014 * IMAGE_CLAMP_BIT as needed.
2016 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
2017 /* need to clamp to [0, 1] */
2018 transferOps
|= IMAGE_CLAMP_BIT
;
2022 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
2023 if ((transferOps
& IMAGE_MIN_MAX_BIT
) && ctx
->MinMax
.Sink
) {
2028 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
2029 /* compute luminance values */
2030 if (transferOps
& IMAGE_CLAMP_BIT
) {
2031 for (i
= 0; i
< n
; i
++) {
2032 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2033 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
2037 for (i
= 0; i
< n
; i
++) {
2038 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2044 * Pack/store the pixels. Ugh! Lots of cases!!!
2047 case GL_UNSIGNED_BYTE
:
2049 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2050 switch (dstFormat
) {
2053 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2057 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2061 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2065 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2069 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
2071 case GL_LUMINANCE_ALPHA
:
2073 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
2074 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2079 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2080 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2081 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2086 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2087 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2088 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2089 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2094 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2095 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2096 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2101 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2102 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2103 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2104 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2109 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2110 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2111 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2112 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2118 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2119 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2123 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2129 GLbyte
*dst
= (GLbyte
*) dstAddr
;
2130 switch (dstFormat
) {
2133 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2137 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2141 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2145 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2149 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
2151 case GL_LUMINANCE_ALPHA
:
2153 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
2154 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2159 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2160 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2161 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2166 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2167 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2168 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2169 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2174 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2175 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2176 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2181 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2182 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2183 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2184 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2189 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2190 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2191 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2192 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2198 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2199 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2203 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2207 case GL_UNSIGNED_SHORT
:
2209 GLushort
*dst
= (GLushort
*) dstAddr
;
2210 switch (dstFormat
) {
2213 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
2217 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
2221 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
2225 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
2229 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
2231 case GL_LUMINANCE_ALPHA
:
2233 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
2234 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
2239 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
2240 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2241 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
2246 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
2247 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2248 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
2249 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2254 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
2255 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2256 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
2261 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
2262 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2263 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
2264 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2269 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
2270 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
2271 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
2272 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
2278 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
2279 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
2283 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2289 GLshort
*dst
= (GLshort
*) dstAddr
;
2290 switch (dstFormat
) {
2293 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2297 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2301 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2305 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2309 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
2311 case GL_LUMINANCE_ALPHA
:
2313 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
2314 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2319 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2320 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2321 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2326 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2327 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2328 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2329 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2334 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2335 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2336 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2341 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2342 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2343 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2344 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2349 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2350 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2351 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2352 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2358 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2359 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2363 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2367 case GL_UNSIGNED_INT
:
2369 GLuint
*dst
= (GLuint
*) dstAddr
;
2370 switch (dstFormat
) {
2373 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2377 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2381 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2385 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2389 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
2391 case GL_LUMINANCE_ALPHA
:
2393 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
2394 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2399 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2400 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2401 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2406 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2407 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2408 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2409 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2414 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2415 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2416 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2421 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2422 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2423 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2424 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2429 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2430 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2431 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2432 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2438 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2439 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2443 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2449 GLint
*dst
= (GLint
*) dstAddr
;
2450 switch (dstFormat
) {
2453 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2457 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2461 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2465 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2469 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2471 case GL_LUMINANCE_ALPHA
:
2473 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2474 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2479 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2480 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2481 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2486 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2487 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2488 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2489 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2494 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2495 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2496 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2501 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2502 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2503 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2504 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2509 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2510 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2511 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2512 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2518 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2519 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2523 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2529 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2530 switch (dstFormat
) {
2533 dst
[i
] = rgba
[i
][RCOMP
];
2537 dst
[i
] = rgba
[i
][GCOMP
];
2541 dst
[i
] = rgba
[i
][BCOMP
];
2545 dst
[i
] = rgba
[i
][ACOMP
];
2549 dst
[i
] = luminance
[i
];
2551 case GL_LUMINANCE_ALPHA
:
2553 dst
[i
*2+0] = luminance
[i
];
2554 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2559 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2560 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2561 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2566 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2567 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2568 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2569 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2574 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2575 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2576 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2581 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2582 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2583 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2584 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2589 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2590 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2591 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2592 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2598 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2599 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2603 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2607 case GL_HALF_FLOAT_ARB
:
2609 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2610 switch (dstFormat
) {
2613 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2617 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2621 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2625 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2629 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2631 case GL_LUMINANCE_ALPHA
:
2633 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2634 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2639 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2640 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2641 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2646 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2647 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2648 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2649 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2654 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2655 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2656 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2661 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2662 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2663 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2664 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2669 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2670 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2671 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2672 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2678 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2679 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2683 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2687 case GL_UNSIGNED_BYTE_3_3_2
:
2688 if (dstFormat
== GL_RGB
) {
2689 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2691 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2692 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2693 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
2697 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2698 if (dstFormat
== GL_RGB
) {
2699 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2701 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
2702 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2703 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2707 case GL_UNSIGNED_SHORT_5_6_5
:
2708 if (dstFormat
== GL_RGB
) {
2709 GLushort
*dst
= (GLushort
*) dstAddr
;
2711 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2712 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2713 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
2717 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2718 if (dstFormat
== GL_RGB
) {
2719 GLushort
*dst
= (GLushort
*) dstAddr
;
2721 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2722 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2723 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2727 case GL_UNSIGNED_SHORT_4_4_4_4
:
2728 if (dstFormat
== GL_RGBA
) {
2729 GLushort
*dst
= (GLushort
*) dstAddr
;
2731 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2732 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2733 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2734 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2737 else if (dstFormat
== GL_BGRA
) {
2738 GLushort
*dst
= (GLushort
*) dstAddr
;
2740 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2741 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2742 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2743 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2746 else if (dstFormat
== GL_ABGR_EXT
) {
2747 GLushort
*dst
= (GLushort
*) dstAddr
;
2749 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2750 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2751 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2752 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
2756 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2757 if (dstFormat
== GL_RGBA
) {
2758 GLushort
*dst
= (GLushort
*) dstAddr
;
2760 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
2761 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2762 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2763 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2766 else if (dstFormat
== GL_BGRA
) {
2767 GLushort
*dst
= (GLushort
*) dstAddr
;
2769 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
2770 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2771 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2772 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2775 else if (dstFormat
== GL_ABGR_EXT
) {
2776 GLushort
*dst
= (GLushort
*) dstAddr
;
2778 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
2779 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2780 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2781 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2785 case GL_UNSIGNED_SHORT_5_5_5_1
:
2786 if (dstFormat
== GL_RGBA
) {
2787 GLushort
*dst
= (GLushort
*) dstAddr
;
2789 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2790 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2791 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2792 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2795 else if (dstFormat
== GL_BGRA
) {
2796 GLushort
*dst
= (GLushort
*) dstAddr
;
2798 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2799 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2800 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2801 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2804 else if (dstFormat
== GL_ABGR_EXT
) {
2805 GLushort
*dst
= (GLushort
*) dstAddr
;
2807 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2808 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2809 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2810 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
2814 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2815 if (dstFormat
== GL_RGBA
) {
2816 GLushort
*dst
= (GLushort
*) dstAddr
;
2818 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2819 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2820 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2821 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2824 else if (dstFormat
== GL_BGRA
) {
2825 GLushort
*dst
= (GLushort
*) dstAddr
;
2827 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
2828 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2829 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2830 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2833 else if (dstFormat
== GL_ABGR_EXT
) {
2834 GLushort
*dst
= (GLushort
*) dstAddr
;
2836 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
2837 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2838 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2839 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2843 case GL_UNSIGNED_INT_8_8_8_8
:
2844 if (dstFormat
== GL_RGBA
) {
2845 GLuint
*dst
= (GLuint
*) dstAddr
;
2847 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
2848 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2849 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
2850 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2853 else if (dstFormat
== GL_BGRA
) {
2854 GLuint
*dst
= (GLuint
*) dstAddr
;
2856 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
2857 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2858 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
2859 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2862 else if (dstFormat
== GL_ABGR_EXT
) {
2863 GLuint
*dst
= (GLuint
*) dstAddr
;
2865 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
2866 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
2867 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
2868 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
2872 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2873 if (dstFormat
== GL_RGBA
) {
2874 GLuint
*dst
= (GLuint
*) dstAddr
;
2876 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
2877 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2878 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2879 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2882 else if (dstFormat
== GL_BGRA
) {
2883 GLuint
*dst
= (GLuint
*) dstAddr
;
2885 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
2886 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2887 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
2888 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2891 else if (dstFormat
== GL_ABGR_EXT
) {
2892 GLuint
*dst
= (GLuint
*) dstAddr
;
2894 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
2895 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
2896 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
2897 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
2901 case GL_UNSIGNED_INT_10_10_10_2
:
2902 if (dstFormat
== GL_RGBA
) {
2903 GLuint
*dst
= (GLuint
*) dstAddr
;
2905 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
2906 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2907 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
2908 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
2911 else if (dstFormat
== GL_BGRA
) {
2912 GLuint
*dst
= (GLuint
*) dstAddr
;
2914 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
2915 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2916 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
2917 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
2920 else if (dstFormat
== GL_ABGR_EXT
) {
2921 GLuint
*dst
= (GLuint
*) dstAddr
;
2923 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
2924 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
2925 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
2926 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
2930 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2931 if (dstFormat
== GL_RGBA
) {
2932 GLuint
*dst
= (GLuint
*) dstAddr
;
2934 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
2935 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2936 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
2937 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2940 else if (dstFormat
== GL_BGRA
) {
2941 GLuint
*dst
= (GLuint
*) dstAddr
;
2943 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
2944 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2945 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
2946 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2949 else if (dstFormat
== GL_ABGR_EXT
) {
2950 GLuint
*dst
= (GLuint
*) dstAddr
;
2952 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
2953 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2954 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2955 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2960 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2964 if (dstPacking
->SwapBytes
) {
2965 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2966 if (swapSize
== 2) {
2967 if (dstPacking
->SwapBytes
) {
2968 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2971 else if (swapSize
== 4) {
2972 if (dstPacking
->SwapBytes
) {
2973 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2980 #define SWAP2BYTE(VALUE) \
2982 GLubyte *bytes = (GLubyte *) &(VALUE); \
2983 GLubyte tmp = bytes[0]; \
2984 bytes[0] = bytes[1]; \
2988 #define SWAP4BYTE(VALUE) \
2990 GLubyte *bytes = (GLubyte *) &(VALUE); \
2991 GLubyte tmp = bytes[0]; \
2992 bytes[0] = bytes[3]; \
2995 bytes[1] = bytes[2]; \
3001 extract_uint_indexes(GLuint n
, GLuint indexes
[],
3002 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3003 const struct gl_pixelstore_attrib
*unpack
)
3005 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
3007 ASSERT(srcType
== GL_BITMAP
||
3008 srcType
== GL_UNSIGNED_BYTE
||
3009 srcType
== GL_BYTE
||
3010 srcType
== GL_UNSIGNED_SHORT
||
3011 srcType
== GL_SHORT
||
3012 srcType
== GL_UNSIGNED_INT
||
3013 srcType
== GL_INT
||
3014 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3015 srcType
== GL_HALF_FLOAT_ARB
||
3016 srcType
== GL_FLOAT
);
3021 GLubyte
*ubsrc
= (GLubyte
*) src
;
3022 if (unpack
->LsbFirst
) {
3023 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
3025 for (i
= 0; i
< n
; i
++) {
3026 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3037 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
3039 for (i
= 0; i
< n
; i
++) {
3040 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3052 case GL_UNSIGNED_BYTE
:
3055 const GLubyte
*s
= (const GLubyte
*) src
;
3056 for (i
= 0; i
< n
; i
++)
3063 const GLbyte
*s
= (const GLbyte
*) src
;
3064 for (i
= 0; i
< n
; i
++)
3068 case GL_UNSIGNED_SHORT
:
3071 const GLushort
*s
= (const GLushort
*) src
;
3072 if (unpack
->SwapBytes
) {
3073 for (i
= 0; i
< n
; i
++) {
3074 GLushort value
= s
[i
];
3080 for (i
= 0; i
< n
; i
++)
3088 const GLshort
*s
= (const GLshort
*) src
;
3089 if (unpack
->SwapBytes
) {
3090 for (i
= 0; i
< n
; i
++) {
3091 GLshort value
= s
[i
];
3097 for (i
= 0; i
< n
; i
++)
3102 case GL_UNSIGNED_INT
:
3105 const GLuint
*s
= (const GLuint
*) src
;
3106 if (unpack
->SwapBytes
) {
3107 for (i
= 0; i
< n
; i
++) {
3108 GLuint value
= s
[i
];
3114 for (i
= 0; i
< n
; i
++)
3122 const GLint
*s
= (const GLint
*) src
;
3123 if (unpack
->SwapBytes
) {
3124 for (i
= 0; i
< n
; i
++) {
3131 for (i
= 0; i
< n
; i
++)
3139 const GLfloat
*s
= (const GLfloat
*) src
;
3140 if (unpack
->SwapBytes
) {
3141 for (i
= 0; i
< n
; i
++) {
3142 GLfloat value
= s
[i
];
3144 indexes
[i
] = (GLuint
) value
;
3148 for (i
= 0; i
< n
; i
++)
3149 indexes
[i
] = (GLuint
) s
[i
];
3153 case GL_HALF_FLOAT_ARB
:
3156 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
3157 if (unpack
->SwapBytes
) {
3158 for (i
= 0; i
< n
; i
++) {
3159 GLhalfARB value
= s
[i
];
3161 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
3165 for (i
= 0; i
< n
; i
++)
3166 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
3170 case GL_UNSIGNED_INT_24_8_EXT
:
3173 const GLuint
*s
= (const GLuint
*) src
;
3174 if (unpack
->SwapBytes
) {
3175 for (i
= 0; i
< n
; i
++) {
3176 GLuint value
= s
[i
];
3178 indexes
[i
] = value
& 0xff; /* lower 8 bits */
3182 for (i
= 0; i
< n
; i
++)
3183 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
3189 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
3196 * This function extracts floating point RGBA values from arbitrary
3197 * image data. srcFormat and srcType are the format and type parameters
3198 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3200 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3201 * implements the "Conversion to floating point", "Conversion to RGB",
3202 * and "Final Expansion to RGBA" operations.
3204 * Args: n - number of pixels
3205 * rgba - output colors
3206 * srcFormat - format of incoming data
3207 * srcType - data type of incoming data
3208 * src - source data pointer
3209 * swapBytes - perform byteswapping of incoming data?
3212 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3213 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3214 GLboolean swapBytes
)
3216 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
3218 GLint rComp
, bComp
, gComp
, aComp
;
3220 ASSERT(srcFormat
== GL_RED
||
3221 srcFormat
== GL_GREEN
||
3222 srcFormat
== GL_BLUE
||
3223 srcFormat
== GL_ALPHA
||
3224 srcFormat
== GL_LUMINANCE
||
3225 srcFormat
== GL_LUMINANCE_ALPHA
||
3226 srcFormat
== GL_INTENSITY
||
3227 srcFormat
== GL_RGB
||
3228 srcFormat
== GL_BGR
||
3229 srcFormat
== GL_RGBA
||
3230 srcFormat
== GL_BGRA
||
3231 srcFormat
== GL_ABGR_EXT
||
3232 srcFormat
== GL_DU8DV8_ATI
||
3233 srcFormat
== GL_DUDV_ATI
);
3235 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3236 srcType
== GL_BYTE
||
3237 srcType
== GL_UNSIGNED_SHORT
||
3238 srcType
== GL_SHORT
||
3239 srcType
== GL_UNSIGNED_INT
||
3240 srcType
== GL_INT
||
3241 srcType
== GL_HALF_FLOAT_ARB
||
3242 srcType
== GL_FLOAT
||
3243 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3244 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3245 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3246 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3247 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3248 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3249 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3250 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3251 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3252 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3253 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3254 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3256 rComp
= gComp
= bComp
= aComp
= -1;
3258 switch (srcFormat
) {
3261 greenIndex
= blueIndex
= alphaIndex
= -1;
3266 redIndex
= blueIndex
= alphaIndex
= -1;
3271 redIndex
= greenIndex
= alphaIndex
= -1;
3275 redIndex
= greenIndex
= blueIndex
= -1;
3280 redIndex
= greenIndex
= blueIndex
= 0;
3284 case GL_LUMINANCE_ALPHA
:
3285 redIndex
= greenIndex
= blueIndex
= 0;
3290 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
3357 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
3358 _mesa_lookup_enum_by_nr(srcFormat
));
3363 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
3364 if ((INDEX) < 0) { \
3366 for (i = 0; i < n; i++) { \
3367 rgba[i][CHANNEL] = DEFAULT; \
3370 else if (swapBytes) { \
3371 const TYPE *s = (const TYPE *) src; \
3373 for (i = 0; i < n; i++) { \
3374 TYPE value = s[INDEX]; \
3375 if (sizeof(TYPE) == 2) { \
3378 else if (sizeof(TYPE) == 4) { \
3381 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
3386 const TYPE *s = (const TYPE *) src; \
3388 for (i = 0; i < n; i++) { \
3389 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
3395 case GL_UNSIGNED_BYTE
:
3396 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
3397 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
3398 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
3399 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
3402 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
3403 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
3404 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
3405 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
3407 case GL_UNSIGNED_SHORT
:
3408 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
3409 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
3410 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
3411 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
3414 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
3415 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
3416 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
3417 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
3419 case GL_UNSIGNED_INT
:
3420 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
3421 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
3422 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
3423 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
3426 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
3427 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
3428 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
3429 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
3432 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
3433 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
3434 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
3435 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
3437 case GL_HALF_FLOAT_ARB
:
3438 PROCESS(redIndex
, RCOMP
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3439 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3440 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3441 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3443 case GL_UNSIGNED_BYTE_3_3_2
:
3445 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3447 for (i
= 0; i
< n
; i
++) {
3448 GLubyte p
= ubsrc
[i
];
3449 rgba
[i
][rComp
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
3450 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
3451 rgba
[i
][bComp
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
3452 rgba
[i
][aComp
] = 1.0F
;
3456 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3458 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3460 for (i
= 0; i
< n
; i
++) {
3461 GLubyte p
= ubsrc
[i
];
3462 rgba
[i
][rComp
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
3463 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
3464 rgba
[i
][bComp
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
3465 rgba
[i
][aComp
] = 1.0F
;
3469 case GL_UNSIGNED_SHORT_5_6_5
:
3471 const GLushort
*ussrc
= (const GLushort
*) src
;
3473 for (i
= 0; i
< n
; i
++) {
3474 GLushort p
= ussrc
[i
];
3476 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
3477 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
3478 rgba
[i
][bComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
3479 rgba
[i
][aComp
] = 1.0F
;
3483 const GLushort
*ussrc
= (const GLushort
*) src
;
3485 for (i
= 0; i
< n
; i
++) {
3486 GLushort p
= ussrc
[i
];
3487 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
3488 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
3489 rgba
[i
][bComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
3490 rgba
[i
][aComp
] = 1.0F
;
3494 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3496 const GLushort
*ussrc
= (const GLushort
*) src
;
3498 for (i
= 0; i
< n
; i
++) {
3499 GLushort p
= ussrc
[i
];
3501 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
3502 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
3503 rgba
[i
][bComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
3504 rgba
[i
][aComp
] = 1.0F
;
3508 const GLushort
*ussrc
= (const GLushort
*) src
;
3510 for (i
= 0; i
< n
; i
++) {
3511 GLushort p
= ussrc
[i
];
3512 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
3513 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
3514 rgba
[i
][bComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
3515 rgba
[i
][aComp
] = 1.0F
;
3519 case GL_UNSIGNED_SHORT_4_4_4_4
:
3521 const GLushort
*ussrc
= (const GLushort
*) src
;
3523 for (i
= 0; i
< n
; i
++) {
3524 GLushort p
= ussrc
[i
];
3526 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
3527 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
3528 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
3529 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
3533 const GLushort
*ussrc
= (const GLushort
*) src
;
3535 for (i
= 0; i
< n
; i
++) {
3536 GLushort p
= ussrc
[i
];
3537 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
3538 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
3539 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
3540 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
3544 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3546 const GLushort
*ussrc
= (const GLushort
*) src
;
3548 for (i
= 0; i
< n
; i
++) {
3549 GLushort p
= ussrc
[i
];
3551 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
3552 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
3553 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
3554 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
3558 const GLushort
*ussrc
= (const GLushort
*) src
;
3560 for (i
= 0; i
< n
; i
++) {
3561 GLushort p
= ussrc
[i
];
3562 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
3563 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
3564 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
3565 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
3569 case GL_UNSIGNED_SHORT_5_5_5_1
:
3571 const GLushort
*ussrc
= (const GLushort
*) src
;
3573 for (i
= 0; i
< n
; i
++) {
3574 GLushort p
= ussrc
[i
];
3576 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
3577 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
3578 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
3579 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
3583 const GLushort
*ussrc
= (const GLushort
*) src
;
3585 for (i
= 0; i
< n
; i
++) {
3586 GLushort p
= ussrc
[i
];
3587 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
3588 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
3589 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
3590 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
3594 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3596 const GLushort
*ussrc
= (const GLushort
*) src
;
3598 for (i
= 0; i
< n
; i
++) {
3599 GLushort p
= ussrc
[i
];
3601 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
3602 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
3603 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
3604 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
3608 const GLushort
*ussrc
= (const GLushort
*) src
;
3610 for (i
= 0; i
< n
; i
++) {
3611 GLushort p
= ussrc
[i
];
3612 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
3613 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
3614 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
3615 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
3619 case GL_UNSIGNED_INT_8_8_8_8
:
3621 const GLuint
*uisrc
= (const GLuint
*) src
;
3623 for (i
= 0; i
< n
; i
++) {
3624 GLuint p
= uisrc
[i
];
3625 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3626 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3627 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3628 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3632 const GLuint
*uisrc
= (const GLuint
*) src
;
3634 for (i
= 0; i
< n
; i
++) {
3635 GLuint p
= uisrc
[i
];
3636 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3637 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3638 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3639 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3643 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3645 const GLuint
*uisrc
= (const GLuint
*) src
;
3647 for (i
= 0; i
< n
; i
++) {
3648 GLuint p
= uisrc
[i
];
3649 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3650 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3651 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3652 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3656 const GLuint
*uisrc
= (const GLuint
*) src
;
3658 for (i
= 0; i
< n
; i
++) {
3659 GLuint p
= uisrc
[i
];
3660 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3661 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3662 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3663 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3667 case GL_UNSIGNED_INT_10_10_10_2
:
3669 const GLuint
*uisrc
= (const GLuint
*) src
;
3671 for (i
= 0; i
< n
; i
++) {
3672 GLuint p
= uisrc
[i
];
3674 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
3675 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
3676 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
3677 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
3681 const GLuint
*uisrc
= (const GLuint
*) src
;
3683 for (i
= 0; i
< n
; i
++) {
3684 GLuint p
= uisrc
[i
];
3685 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
3686 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
3687 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
3688 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
3692 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3694 const GLuint
*uisrc
= (const GLuint
*) src
;
3696 for (i
= 0; i
< n
; i
++) {
3697 GLuint p
= uisrc
[i
];
3699 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
3700 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
3701 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
3702 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
3706 const GLuint
*uisrc
= (const GLuint
*) src
;
3708 for (i
= 0; i
< n
; i
++) {
3709 GLuint p
= uisrc
[i
];
3710 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
3711 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
3712 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
3713 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
3718 _mesa_problem(NULL
, "bad srcType in extract float data");
3725 * Unpack a row of color image data from a client buffer according to
3726 * the pixel unpacking parameters.
3727 * Return GLchan values in the specified dest image format.
3728 * This is used by glDrawPixels and glTexImage?D().
3729 * \param ctx - the context
3730 * n - number of pixels in the span
3731 * dstFormat - format of destination color array
3732 * dest - the destination color array
3733 * srcFormat - source image format
3734 * srcType - source image data type
3735 * source - source image pointer
3736 * srcPacking - pixel unpacking parameters
3737 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3739 * XXX perhaps expand this to process whole images someday.
3742 _mesa_unpack_color_span_chan( GLcontext
*ctx
,
3743 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3744 GLenum srcFormat
, GLenum srcType
,
3745 const GLvoid
*source
,
3746 const struct gl_pixelstore_attrib
*srcPacking
,
3747 GLbitfield transferOps
)
3749 ASSERT(dstFormat
== GL_ALPHA
||
3750 dstFormat
== GL_LUMINANCE
||
3751 dstFormat
== GL_LUMINANCE_ALPHA
||
3752 dstFormat
== GL_INTENSITY
||
3753 dstFormat
== GL_RGB
||
3754 dstFormat
== GL_RGBA
||
3755 dstFormat
== GL_COLOR_INDEX
);
3757 ASSERT(srcFormat
== GL_RED
||
3758 srcFormat
== GL_GREEN
||
3759 srcFormat
== GL_BLUE
||
3760 srcFormat
== GL_ALPHA
||
3761 srcFormat
== GL_LUMINANCE
||
3762 srcFormat
== GL_LUMINANCE_ALPHA
||
3763 srcFormat
== GL_INTENSITY
||
3764 srcFormat
== GL_RGB
||
3765 srcFormat
== GL_BGR
||
3766 srcFormat
== GL_RGBA
||
3767 srcFormat
== GL_BGRA
||
3768 srcFormat
== GL_ABGR_EXT
||
3769 srcFormat
== GL_COLOR_INDEX
);
3771 ASSERT(srcType
== GL_BITMAP
||
3772 srcType
== GL_UNSIGNED_BYTE
||
3773 srcType
== GL_BYTE
||
3774 srcType
== GL_UNSIGNED_SHORT
||
3775 srcType
== GL_SHORT
||
3776 srcType
== GL_UNSIGNED_INT
||
3777 srcType
== GL_INT
||
3778 srcType
== GL_HALF_FLOAT_ARB
||
3779 srcType
== GL_FLOAT
||
3780 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3781 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3782 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3783 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3784 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3785 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3786 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3787 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3788 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3789 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3790 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3791 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3793 /* Try simple cases first */
3794 if (transferOps
== 0) {
3795 if (srcType
== CHAN_TYPE
) {
3796 if (dstFormat
== GL_RGBA
) {
3797 if (srcFormat
== GL_RGBA
) {
3798 _mesa_memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3801 else if (srcFormat
== GL_RGB
) {
3803 const GLchan
*src
= (const GLchan
*) source
;
3805 for (i
= 0; i
< n
; i
++) {
3816 else if (dstFormat
== GL_RGB
) {
3817 if (srcFormat
== GL_RGB
) {
3818 _mesa_memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3821 else if (srcFormat
== GL_RGBA
) {
3823 const GLchan
*src
= (const GLchan
*) source
;
3825 for (i
= 0; i
< n
; i
++) {
3835 else if (dstFormat
== srcFormat
) {
3836 GLint comps
= _mesa_components_in_format(srcFormat
);
3838 _mesa_memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3843 * Common situation, loading 8bit RGBA/RGB source images
3844 * into 16/32 bit destination. (OSMesa16/32)
3846 else if (srcType
== GL_UNSIGNED_BYTE
) {
3847 if (dstFormat
== GL_RGBA
) {
3848 if (srcFormat
== GL_RGB
) {
3850 const GLubyte
*src
= (const GLubyte
*) source
;
3852 for (i
= 0; i
< n
; i
++) {
3853 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3854 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3855 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3862 else if (srcFormat
== GL_RGBA
) {
3864 const GLubyte
*src
= (const GLubyte
*) source
;
3866 for (i
= 0; i
< n
; i
++) {
3867 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3868 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3869 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3870 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3877 else if (dstFormat
== GL_RGB
) {
3878 if (srcFormat
== GL_RGB
) {
3880 const GLubyte
*src
= (const GLubyte
*) source
;
3882 for (i
= 0; i
< n
; i
++) {
3883 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3884 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3885 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3891 else if (srcFormat
== GL_RGBA
) {
3893 const GLubyte
*src
= (const GLubyte
*) source
;
3895 for (i
= 0; i
< n
; i
++) {
3896 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3897 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3898 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3909 /* general solution begins here */
3911 GLint dstComponents
;
3912 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
3913 GLint dstLuminanceIndex
, dstIntensityIndex
;
3914 GLfloat rgba
[MAX_WIDTH
][4];
3916 dstComponents
= _mesa_components_in_format( dstFormat
);
3917 /* source & dest image formats should have been error checked by now */
3918 assert(dstComponents
> 0);
3921 * Extract image data and convert to RGBA floats
3923 assert(n
<= MAX_WIDTH
);
3924 if (srcFormat
== GL_COLOR_INDEX
) {
3925 GLuint indexes
[MAX_WIDTH
];
3926 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3929 if (dstFormat
== GL_COLOR_INDEX
) {
3931 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3932 /* convert to GLchan and return */
3933 for (i
= 0; i
< n
; i
++) {
3934 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3939 /* Convert indexes to RGBA */
3940 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3941 shift_and_offset_ci(ctx
, n
, indexes
);
3943 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3946 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3947 * with color indexes.
3949 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3952 /* non-color index data */
3953 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3954 srcPacking
->SwapBytes
);
3957 /* Need to clamp if returning GLubytes or GLushorts */
3958 #if CHAN_TYPE != GL_FLOAT
3959 transferOps
|= IMAGE_CLAMP_BIT
;
3963 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3966 /* Now determine which color channels we need to produce.
3967 * And determine the dest index (offset) within each color tuple.
3969 switch (dstFormat
) {
3972 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3973 dstLuminanceIndex
= dstIntensityIndex
= -1;
3976 dstLuminanceIndex
= 0;
3977 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3978 dstIntensityIndex
= -1;
3980 case GL_LUMINANCE_ALPHA
:
3981 dstLuminanceIndex
= 0;
3983 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
3984 dstIntensityIndex
= -1;
3987 dstIntensityIndex
= 0;
3988 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
3989 dstLuminanceIndex
= -1;
3995 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4002 dstLuminanceIndex
= dstIntensityIndex
= -1;
4005 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
4010 /* Now return the GLchan data in the requested dstFormat */
4012 if (dstRedIndex
>= 0) {
4015 for (i
= 0; i
< n
; i
++) {
4016 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
4017 dst
+= dstComponents
;
4021 if (dstGreenIndex
>= 0) {
4024 for (i
= 0; i
< n
; i
++) {
4025 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
4026 dst
+= dstComponents
;
4030 if (dstBlueIndex
>= 0) {
4033 for (i
= 0; i
< n
; i
++) {
4034 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
4035 dst
+= dstComponents
;
4039 if (dstAlphaIndex
>= 0) {
4042 for (i
= 0; i
< n
; i
++) {
4043 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
4044 dst
+= dstComponents
;
4048 if (dstIntensityIndex
>= 0) {
4051 assert(dstIntensityIndex
== 0);
4052 assert(dstComponents
== 1);
4053 for (i
= 0; i
< n
; i
++) {
4054 /* Intensity comes from red channel */
4055 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
4059 if (dstLuminanceIndex
>= 0) {
4062 assert(dstLuminanceIndex
== 0);
4063 for (i
= 0; i
< n
; i
++) {
4064 /* Luminance comes from red channel */
4065 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
4066 dst
+= dstComponents
;
4074 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
4075 * instead of GLchan.
4078 _mesa_unpack_color_span_float( GLcontext
*ctx
,
4079 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4080 GLenum srcFormat
, GLenum srcType
,
4081 const GLvoid
*source
,
4082 const struct gl_pixelstore_attrib
*srcPacking
,
4083 GLbitfield transferOps
)
4085 ASSERT(dstFormat
== GL_ALPHA
||
4086 dstFormat
== GL_LUMINANCE
||
4087 dstFormat
== GL_LUMINANCE_ALPHA
||
4088 dstFormat
== GL_INTENSITY
||
4089 dstFormat
== GL_RGB
||
4090 dstFormat
== GL_RGBA
||
4091 dstFormat
== GL_COLOR_INDEX
);
4093 ASSERT(srcFormat
== GL_RED
||
4094 srcFormat
== GL_GREEN
||
4095 srcFormat
== GL_BLUE
||
4096 srcFormat
== GL_ALPHA
||
4097 srcFormat
== GL_LUMINANCE
||
4098 srcFormat
== GL_LUMINANCE_ALPHA
||
4099 srcFormat
== GL_INTENSITY
||
4100 srcFormat
== GL_RGB
||
4101 srcFormat
== GL_BGR
||
4102 srcFormat
== GL_RGBA
||
4103 srcFormat
== GL_BGRA
||
4104 srcFormat
== GL_ABGR_EXT
||
4105 srcFormat
== GL_COLOR_INDEX
);
4107 ASSERT(srcType
== GL_BITMAP
||
4108 srcType
== GL_UNSIGNED_BYTE
||
4109 srcType
== GL_BYTE
||
4110 srcType
== GL_UNSIGNED_SHORT
||
4111 srcType
== GL_SHORT
||
4112 srcType
== GL_UNSIGNED_INT
||
4113 srcType
== GL_INT
||
4114 srcType
== GL_HALF_FLOAT_ARB
||
4115 srcType
== GL_FLOAT
||
4116 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4117 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4118 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4119 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4120 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4121 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4122 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4123 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4124 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4125 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4126 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4127 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4129 /* general solution, no special cases, yet */
4131 GLint dstComponents
;
4132 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4133 GLint dstLuminanceIndex
, dstIntensityIndex
;
4134 GLfloat rgba
[MAX_WIDTH
][4];
4136 dstComponents
= _mesa_components_in_format( dstFormat
);
4137 /* source & dest image formats should have been error checked by now */
4138 assert(dstComponents
> 0);
4141 * Extract image data and convert to RGBA floats
4143 assert(n
<= MAX_WIDTH
);
4144 if (srcFormat
== GL_COLOR_INDEX
) {
4145 GLuint indexes
[MAX_WIDTH
];
4146 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4149 if (dstFormat
== GL_COLOR_INDEX
) {
4151 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4152 /* convert to GLchan and return */
4153 for (i
= 0; i
< n
; i
++) {
4154 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4159 /* Convert indexes to RGBA */
4160 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4161 shift_and_offset_ci(ctx
, n
, indexes
);
4163 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4166 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4167 * with color indexes.
4169 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4172 /* non-color index data */
4173 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4174 srcPacking
->SwapBytes
);
4178 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4181 /* Now determine which color channels we need to produce.
4182 * And determine the dest index (offset) within each color tuple.
4184 switch (dstFormat
) {
4187 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4188 dstLuminanceIndex
= dstIntensityIndex
= -1;
4191 dstLuminanceIndex
= 0;
4192 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4193 dstIntensityIndex
= -1;
4195 case GL_LUMINANCE_ALPHA
:
4196 dstLuminanceIndex
= 0;
4198 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4199 dstIntensityIndex
= -1;
4202 dstIntensityIndex
= 0;
4203 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4204 dstLuminanceIndex
= -1;
4210 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4217 dstLuminanceIndex
= dstIntensityIndex
= -1;
4220 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
4224 /* Now pack results in the requested dstFormat */
4225 if (dstRedIndex
>= 0) {
4226 GLfloat
*dst
= dest
;
4228 for (i
= 0; i
< n
; i
++) {
4229 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
4230 dst
+= dstComponents
;
4234 if (dstGreenIndex
>= 0) {
4235 GLfloat
*dst
= dest
;
4237 for (i
= 0; i
< n
; i
++) {
4238 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
4239 dst
+= dstComponents
;
4243 if (dstBlueIndex
>= 0) {
4244 GLfloat
*dst
= dest
;
4246 for (i
= 0; i
< n
; i
++) {
4247 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
4248 dst
+= dstComponents
;
4252 if (dstAlphaIndex
>= 0) {
4253 GLfloat
*dst
= dest
;
4255 for (i
= 0; i
< n
; i
++) {
4256 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
4257 dst
+= dstComponents
;
4261 if (dstIntensityIndex
>= 0) {
4262 GLfloat
*dst
= dest
;
4264 assert(dstIntensityIndex
== 0);
4265 assert(dstComponents
== 1);
4266 for (i
= 0; i
< n
; i
++) {
4267 /* Intensity comes from red channel */
4268 dst
[i
] = rgba
[i
][RCOMP
];
4272 if (dstLuminanceIndex
>= 0) {
4273 GLfloat
*dst
= dest
;
4275 assert(dstLuminanceIndex
== 0);
4276 for (i
= 0; i
< n
; i
++) {
4277 /* Luminance comes from red channel */
4278 dst
[0] = rgba
[i
][RCOMP
];
4279 dst
+= dstComponents
;
4286 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4287 * directly return GLbyte data, no transfer ops apply.
4290 _mesa_unpack_dudv_span_byte( GLcontext
*ctx
,
4291 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4292 GLenum srcFormat
, GLenum srcType
,
4293 const GLvoid
*source
,
4294 const struct gl_pixelstore_attrib
*srcPacking
,
4295 GLbitfield transferOps
)
4297 ASSERT(dstFormat
== GL_DUDV_ATI
);
4298 ASSERT(srcFormat
== GL_DUDV_ATI
);
4300 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4301 srcType
== GL_BYTE
||
4302 srcType
== GL_UNSIGNED_SHORT
||
4303 srcType
== GL_SHORT
||
4304 srcType
== GL_UNSIGNED_INT
||
4305 srcType
== GL_INT
||
4306 srcType
== GL_HALF_FLOAT_ARB
||
4307 srcType
== GL_FLOAT
);
4309 /* general solution */
4311 GLint dstComponents
;
4312 GLfloat rgba
[MAX_WIDTH
][4];
4316 dstComponents
= _mesa_components_in_format( dstFormat
);
4317 /* source & dest image formats should have been error checked by now */
4318 assert(dstComponents
> 0);
4321 * Extract image data and convert to RGBA floats
4323 assert(n
<= MAX_WIDTH
);
4324 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4325 srcPacking
->SwapBytes
);
4328 /* Now determine which color channels we need to produce.
4329 * And determine the dest index (offset) within each color tuple.
4332 /* Now pack results in the requested dstFormat */
4333 for (i
= 0; i
< n
; i
++) {
4334 /* not sure - need clamp[-1,1] here? */
4335 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4336 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4337 dst
+= dstComponents
;
4343 * Unpack a row of color index data from a client buffer according to
4344 * the pixel unpacking parameters.
4345 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4347 * Args: ctx - the context
4348 * n - number of pixels
4349 * dstType - destination data type
4350 * dest - destination array
4351 * srcType - source pixel type
4352 * source - source data pointer
4353 * srcPacking - pixel unpacking parameters
4354 * transferOps - the pixel transfer operations to apply
4357 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
4358 GLenum dstType
, GLvoid
*dest
,
4359 GLenum srcType
, const GLvoid
*source
,
4360 const struct gl_pixelstore_attrib
*srcPacking
,
4361 GLbitfield transferOps
)
4363 ASSERT(srcType
== GL_BITMAP
||
4364 srcType
== GL_UNSIGNED_BYTE
||
4365 srcType
== GL_BYTE
||
4366 srcType
== GL_UNSIGNED_SHORT
||
4367 srcType
== GL_SHORT
||
4368 srcType
== GL_UNSIGNED_INT
||
4369 srcType
== GL_INT
||
4370 srcType
== GL_HALF_FLOAT_ARB
||
4371 srcType
== GL_FLOAT
);
4373 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4374 dstType
== GL_UNSIGNED_SHORT
||
4375 dstType
== GL_UNSIGNED_INT
);
4378 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4381 * Try simple cases first
4383 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4384 && dstType
== GL_UNSIGNED_BYTE
) {
4385 _mesa_memcpy(dest
, source
, n
* sizeof(GLubyte
));
4387 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4388 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4389 _mesa_memcpy(dest
, source
, n
* sizeof(GLuint
));
4395 GLuint indexes
[MAX_WIDTH
];
4396 assert(n
<= MAX_WIDTH
);
4398 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4402 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4404 /* convert to dest type */
4406 case GL_UNSIGNED_BYTE
:
4408 GLubyte
*dst
= (GLubyte
*) dest
;
4410 for (i
= 0; i
< n
; i
++) {
4411 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4415 case GL_UNSIGNED_SHORT
:
4417 GLuint
*dst
= (GLuint
*) dest
;
4419 for (i
= 0; i
< n
; i
++) {
4420 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4424 case GL_UNSIGNED_INT
:
4425 _mesa_memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4428 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4435 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
4436 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4437 const struct gl_pixelstore_attrib
*dstPacking
,
4438 GLbitfield transferOps
)
4440 GLuint indexes
[MAX_WIDTH
];
4442 ASSERT(n
<= MAX_WIDTH
);
4444 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4446 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4447 /* make a copy of input */
4448 _mesa_memcpy(indexes
, source
, n
* sizeof(GLuint
));
4449 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4454 case GL_UNSIGNED_BYTE
:
4456 GLubyte
*dst
= (GLubyte
*) dest
;
4458 for (i
= 0; i
< n
; i
++) {
4459 *dst
++ = (GLubyte
) source
[i
];
4465 GLbyte
*dst
= (GLbyte
*) dest
;
4467 for (i
= 0; i
< n
; i
++) {
4468 dst
[i
] = (GLbyte
) source
[i
];
4472 case GL_UNSIGNED_SHORT
:
4474 GLushort
*dst
= (GLushort
*) dest
;
4476 for (i
= 0; i
< n
; i
++) {
4477 dst
[i
] = (GLushort
) source
[i
];
4479 if (dstPacking
->SwapBytes
) {
4480 _mesa_swap2( (GLushort
*) dst
, n
);
4486 GLshort
*dst
= (GLshort
*) dest
;
4488 for (i
= 0; i
< n
; i
++) {
4489 dst
[i
] = (GLshort
) source
[i
];
4491 if (dstPacking
->SwapBytes
) {
4492 _mesa_swap2( (GLushort
*) dst
, n
);
4496 case GL_UNSIGNED_INT
:
4498 GLuint
*dst
= (GLuint
*) dest
;
4500 for (i
= 0; i
< n
; i
++) {
4501 dst
[i
] = (GLuint
) source
[i
];
4503 if (dstPacking
->SwapBytes
) {
4504 _mesa_swap4( (GLuint
*) dst
, n
);
4510 GLint
*dst
= (GLint
*) dest
;
4512 for (i
= 0; i
< n
; i
++) {
4513 dst
[i
] = (GLint
) source
[i
];
4515 if (dstPacking
->SwapBytes
) {
4516 _mesa_swap4( (GLuint
*) dst
, n
);
4522 GLfloat
*dst
= (GLfloat
*) dest
;
4524 for (i
= 0; i
< n
; i
++) {
4525 dst
[i
] = (GLfloat
) source
[i
];
4527 if (dstPacking
->SwapBytes
) {
4528 _mesa_swap4( (GLuint
*) dst
, n
);
4532 case GL_HALF_FLOAT_ARB
:
4534 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4536 for (i
= 0; i
< n
; i
++) {
4537 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4539 if (dstPacking
->SwapBytes
) {
4540 _mesa_swap2( (GLushort
*) dst
, n
);
4545 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4551 * Unpack a row of stencil data from a client buffer according to
4552 * the pixel unpacking parameters.
4553 * This is (or will be) used by glDrawPixels
4555 * Args: ctx - the context
4556 * n - number of pixels
4557 * dstType - destination data type
4558 * dest - destination array
4559 * srcType - source pixel type
4560 * source - source data pointer
4561 * srcPacking - pixel unpacking parameters
4562 * transferOps - apply offset/bias/lookup ops?
4565 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4566 GLenum dstType
, GLvoid
*dest
,
4567 GLenum srcType
, const GLvoid
*source
,
4568 const struct gl_pixelstore_attrib
*srcPacking
,
4569 GLbitfield transferOps
)
4571 ASSERT(srcType
== GL_BITMAP
||
4572 srcType
== GL_UNSIGNED_BYTE
||
4573 srcType
== GL_BYTE
||
4574 srcType
== GL_UNSIGNED_SHORT
||
4575 srcType
== GL_SHORT
||
4576 srcType
== GL_UNSIGNED_INT
||
4577 srcType
== GL_INT
||
4578 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4579 srcType
== GL_HALF_FLOAT_ARB
||
4580 srcType
== GL_FLOAT
);
4582 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4583 dstType
== GL_UNSIGNED_SHORT
||
4584 dstType
== GL_UNSIGNED_INT
);
4586 /* only shift and offset apply to stencil */
4587 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4590 * Try simple cases first
4592 if (transferOps
== 0 &&
4593 !ctx
->Pixel
.MapStencilFlag
&&
4594 srcType
== GL_UNSIGNED_BYTE
&&
4595 dstType
== GL_UNSIGNED_BYTE
) {
4596 _mesa_memcpy(dest
, source
, n
* sizeof(GLubyte
));
4598 else if (transferOps
== 0 &&
4599 !ctx
->Pixel
.MapStencilFlag
&&
4600 srcType
== GL_UNSIGNED_INT
&&
4601 dstType
== GL_UNSIGNED_INT
&&
4602 !srcPacking
->SwapBytes
) {
4603 _mesa_memcpy(dest
, source
, n
* sizeof(GLuint
));
4609 GLuint indexes
[MAX_WIDTH
];
4610 assert(n
<= MAX_WIDTH
);
4612 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4615 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4616 /* shift and offset indexes */
4617 shift_and_offset_ci(ctx
, n
, indexes
);
4620 if (ctx
->Pixel
.MapStencilFlag
) {
4621 /* Apply stencil lookup table */
4622 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4624 for (i
= 0; i
< n
; i
++) {
4625 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4629 /* convert to dest type */
4631 case GL_UNSIGNED_BYTE
:
4633 GLubyte
*dst
= (GLubyte
*) dest
;
4635 for (i
= 0; i
< n
; i
++) {
4636 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4640 case GL_UNSIGNED_SHORT
:
4642 GLuint
*dst
= (GLuint
*) dest
;
4644 for (i
= 0; i
< n
; i
++) {
4645 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4649 case GL_UNSIGNED_INT
:
4650 _mesa_memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4653 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4660 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4661 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4662 const struct gl_pixelstore_attrib
*dstPacking
)
4664 GLstencil stencil
[MAX_WIDTH
];
4666 ASSERT(n
<= MAX_WIDTH
);
4668 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4669 ctx
->Pixel
.MapStencilFlag
) {
4670 /* make a copy of input */
4671 _mesa_memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4672 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4677 case GL_UNSIGNED_BYTE
:
4678 if (sizeof(GLstencil
) == 1) {
4679 _mesa_memcpy( dest
, source
, n
);
4682 GLubyte
*dst
= (GLubyte
*) dest
;
4685 dst
[i
] = (GLubyte
) source
[i
];
4691 GLbyte
*dst
= (GLbyte
*) dest
;
4694 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4698 case GL_UNSIGNED_SHORT
:
4700 GLushort
*dst
= (GLushort
*) dest
;
4703 dst
[i
] = (GLushort
) source
[i
];
4705 if (dstPacking
->SwapBytes
) {
4706 _mesa_swap2( (GLushort
*) dst
, n
);
4712 GLshort
*dst
= (GLshort
*) dest
;
4715 dst
[i
] = (GLshort
) source
[i
];
4717 if (dstPacking
->SwapBytes
) {
4718 _mesa_swap2( (GLushort
*) dst
, n
);
4722 case GL_UNSIGNED_INT
:
4724 GLuint
*dst
= (GLuint
*) dest
;
4727 dst
[i
] = (GLuint
) source
[i
];
4729 if (dstPacking
->SwapBytes
) {
4730 _mesa_swap4( (GLuint
*) dst
, n
);
4736 GLint
*dst
= (GLint
*) dest
;
4739 dst
[i
] = (GLint
) source
[i
];
4741 if (dstPacking
->SwapBytes
) {
4742 _mesa_swap4( (GLuint
*) dst
, n
);
4748 GLfloat
*dst
= (GLfloat
*) dest
;
4751 dst
[i
] = (GLfloat
) source
[i
];
4753 if (dstPacking
->SwapBytes
) {
4754 _mesa_swap4( (GLuint
*) dst
, n
);
4758 case GL_HALF_FLOAT_ARB
:
4760 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4763 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4765 if (dstPacking
->SwapBytes
) {
4766 _mesa_swap2( (GLushort
*) dst
, n
);
4771 if (dstPacking
->LsbFirst
) {
4772 GLubyte
*dst
= (GLubyte
*) dest
;
4775 for (i
= 0; i
< n
; i
++) {
4778 *dst
|= ((source
[i
] != 0) << shift
);
4787 GLubyte
*dst
= (GLubyte
*) dest
;
4790 for (i
= 0; i
< n
; i
++) {
4793 *dst
|= ((source
[i
] != 0) << shift
);
4803 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4807 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4810 const GLTYPE *src = (const GLTYPE *)source; \
4811 for (i = 0; i < n; i++) { \
4812 GLTYPE value = src[i]; \
4813 if (srcPacking->SwapBytes) { \
4814 if (sizeof(GLTYPE) == 2) { \
4816 } else if (sizeof(GLTYPE) == 4) { \
4820 depthValues[i] = GLTYPE2FLOAT(value); \
4826 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4827 * or GLfloat values.
4828 * The glPixelTransfer (scale/bias) params will be applied.
4830 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4831 * \param depthMax max value for returned GLushort or GLuint values
4832 * (ignored for GLfloat).
4835 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
,
4836 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4837 GLenum srcType
, const GLvoid
*source
,
4838 const struct gl_pixelstore_attrib
*srcPacking
)
4840 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
4841 GLboolean needClamp
= GL_FALSE
;
4843 /* Look for special cases first.
4844 * Not only are these faster, they're less prone to numeric conversion
4845 * problems. Otherwise, converting from an int type to a float then
4846 * back to an int type can introduce errors that will show up as
4847 * artifacts in things like depth peeling which uses glCopyTexImage.
4849 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4850 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4851 const GLuint
*src
= (const GLuint
*) source
;
4852 GLushort
*dst
= (GLushort
*) dest
;
4854 for (i
= 0; i
< n
; i
++) {
4855 dst
[i
] = src
[i
] >> 16;
4859 if (srcType
== GL_UNSIGNED_SHORT
4860 && dstType
== GL_UNSIGNED_INT
4861 && depthMax
== 0xffffffff) {
4862 const GLushort
*src
= (const GLushort
*) source
;
4863 GLuint
*dst
= (GLuint
*) dest
;
4865 for (i
= 0; i
< n
; i
++) {
4866 dst
[i
] = src
[i
] | (src
[i
] << 16);
4870 if (srcType
== GL_UNSIGNED_INT_24_8
4871 && dstType
== GL_UNSIGNED_INT
4872 && depthMax
== 0xffffff) {
4873 const GLuint
*src
= (const GLuint
*) source
;
4874 GLuint
*dst
= (GLuint
*) dest
;
4876 for (i
= 0; i
< n
; i
++) {
4877 dst
[i
] = src
[i
] >> 8;
4881 /* XXX may want to add additional cases here someday */
4884 /* general case path follows */
4886 if (dstType
== GL_FLOAT
) {
4887 depthValues
= (GLfloat
*) dest
;
4890 depthValues
= depthTemp
;
4893 /* Convert incoming values to GLfloat. Some conversions will require
4898 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4899 needClamp
= GL_TRUE
;
4901 case GL_UNSIGNED_BYTE
:
4902 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4905 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4906 needClamp
= GL_TRUE
;
4908 case GL_UNSIGNED_SHORT
:
4909 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4912 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4913 needClamp
= GL_TRUE
;
4915 case GL_UNSIGNED_INT
:
4916 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4918 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4919 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4920 depthMax
== 0xffffff &&
4921 ctx
->Pixel
.DepthScale
== 1.0 &&
4922 ctx
->Pixel
.DepthBias
== 0.0) {
4923 const GLuint
*src
= (const GLuint
*) source
;
4924 GLuint
*zValues
= (GLuint
*) dest
;
4926 for (i
= 0; i
< n
; i
++) {
4927 GLuint value
= src
[i
];
4928 if (srcPacking
->SwapBytes
) {
4931 zValues
[i
] = value
& 0xffffff00;
4936 const GLuint
*src
= (const GLuint
*) source
;
4937 const GLfloat scale
= 1.0f
/ 0xffffff;
4939 for (i
= 0; i
< n
; i
++) {
4940 GLuint value
= src
[i
];
4941 if (srcPacking
->SwapBytes
) {
4944 depthValues
[i
] = (value
>> 8) * scale
;
4949 DEPTH_VALUES(GLfloat
, 1*);
4950 needClamp
= GL_TRUE
;
4952 case GL_HALF_FLOAT_ARB
:
4955 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4956 for (i
= 0; i
< n
; i
++) {
4957 GLhalfARB value
= src
[i
];
4958 if (srcPacking
->SwapBytes
) {
4961 depthValues
[i
] = _mesa_half_to_float(value
);
4963 needClamp
= GL_TRUE
;
4967 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4971 /* apply depth scale and bias */
4973 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4974 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4975 if (scale
!= 1.0 || bias
!= 0.0) {
4977 for (i
= 0; i
< n
; i
++) {
4978 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4980 needClamp
= GL_TRUE
;
4984 /* clamp to [0, 1] */
4987 for (i
= 0; i
< n
; i
++) {
4988 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4993 * Convert values to dstType
4995 if (dstType
== GL_UNSIGNED_INT
) {
4996 GLuint
*zValues
= (GLuint
*) dest
;
4998 if (depthMax
<= 0xffffff) {
4999 /* no overflow worries */
5000 for (i
= 0; i
< n
; i
++) {
5001 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5005 /* need to use double precision to prevent overflow problems */
5006 for (i
= 0; i
< n
; i
++) {
5007 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
5008 if (z
>= (GLdouble
) 0xffffffff)
5009 zValues
[i
] = 0xffffffff;
5011 zValues
[i
] = (GLuint
) z
;
5015 else if (dstType
== GL_UNSIGNED_SHORT
) {
5016 GLushort
*zValues
= (GLushort
*) dest
;
5018 ASSERT(depthMax
<= 0xffff);
5019 for (i
= 0; i
< n
; i
++) {
5020 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5024 ASSERT(dstType
== GL_FLOAT
);
5025 /*ASSERT(depthMax == 1.0F);*/
5031 * Pack an array of depth values. The values are floats in [0,1].
5034 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
5035 GLenum dstType
, const GLfloat
*depthSpan
,
5036 const struct gl_pixelstore_attrib
*dstPacking
)
5038 GLfloat depthCopy
[MAX_WIDTH
];
5040 ASSERT(n
<= MAX_WIDTH
);
5042 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5043 _mesa_memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5044 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5045 depthSpan
= depthCopy
;
5049 case GL_UNSIGNED_BYTE
:
5051 GLubyte
*dst
= (GLubyte
*) dest
;
5053 for (i
= 0; i
< n
; i
++) {
5054 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5060 GLbyte
*dst
= (GLbyte
*) dest
;
5062 for (i
= 0; i
< n
; i
++) {
5063 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5067 case GL_UNSIGNED_SHORT
:
5069 GLushort
*dst
= (GLushort
*) dest
;
5071 for (i
= 0; i
< n
; i
++) {
5072 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5074 if (dstPacking
->SwapBytes
) {
5075 _mesa_swap2( (GLushort
*) dst
, n
);
5081 GLshort
*dst
= (GLshort
*) dest
;
5083 for (i
= 0; i
< n
; i
++) {
5084 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5086 if (dstPacking
->SwapBytes
) {
5087 _mesa_swap2( (GLushort
*) dst
, n
);
5091 case GL_UNSIGNED_INT
:
5093 GLuint
*dst
= (GLuint
*) dest
;
5095 for (i
= 0; i
< n
; i
++) {
5096 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5098 if (dstPacking
->SwapBytes
) {
5099 _mesa_swap4( (GLuint
*) dst
, n
);
5105 GLint
*dst
= (GLint
*) dest
;
5107 for (i
= 0; i
< n
; i
++) {
5108 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5110 if (dstPacking
->SwapBytes
) {
5111 _mesa_swap4( (GLuint
*) dst
, n
);
5117 GLfloat
*dst
= (GLfloat
*) dest
;
5119 for (i
= 0; i
< n
; i
++) {
5120 dst
[i
] = depthSpan
[i
];
5122 if (dstPacking
->SwapBytes
) {
5123 _mesa_swap4( (GLuint
*) dst
, n
);
5127 case GL_HALF_FLOAT_ARB
:
5129 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5131 for (i
= 0; i
< n
; i
++) {
5132 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5134 if (dstPacking
->SwapBytes
) {
5135 _mesa_swap2( (GLushort
*) dst
, n
);
5140 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5147 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5150 _mesa_pack_depth_stencil_span(const GLcontext
*ctx
, GLuint n
, GLuint
*dest
,
5151 const GLfloat
*depthVals
,
5152 const GLstencil
*stencilVals
,
5153 const struct gl_pixelstore_attrib
*dstPacking
)
5155 GLfloat depthCopy
[MAX_WIDTH
];
5156 GLstencil stencilCopy
[MAX_WIDTH
];
5159 ASSERT(n
<= MAX_WIDTH
);
5161 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5162 _mesa_memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5163 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5164 depthVals
= depthCopy
;
5167 if (ctx
->Pixel
.IndexShift
||
5168 ctx
->Pixel
.IndexOffset
||
5169 ctx
->Pixel
.MapStencilFlag
) {
5170 _mesa_memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5171 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5172 stencilVals
= stencilCopy
;
5175 for (i
= 0; i
< n
; i
++) {
5176 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5177 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5180 if (dstPacking
->SwapBytes
) {
5181 _mesa_swap4(dest
, n
);
5189 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5190 * Return all image data in a contiguous block. This is used when we
5191 * compile glDrawPixels, glTexImage, etc into a display list. We
5192 * need a copy of the data in a standard format.
5195 _mesa_unpack_image( GLuint dimensions
,
5196 GLsizei width
, GLsizei height
, GLsizei depth
,
5197 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5198 const struct gl_pixelstore_attrib
*unpack
)
5200 GLint bytesPerRow
, compsPerRow
;
5201 GLboolean flipBytes
, swap2
, swap4
;
5204 return NULL
; /* not necessarily an error */
5206 if (width
<= 0 || height
<= 0 || depth
<= 0)
5207 return NULL
; /* generate error later */
5209 if (type
== GL_BITMAP
) {
5210 bytesPerRow
= (width
+ 7) >> 3;
5211 flipBytes
= unpack
->LsbFirst
;
5212 swap2
= swap4
= GL_FALSE
;
5216 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5217 GLint components
= _mesa_components_in_format(format
);
5220 if (_mesa_type_is_packed(type
))
5223 if (bytesPerPixel
<= 0 || components
<= 0)
5224 return NULL
; /* bad format or type. generate error later */
5225 bytesPerRow
= bytesPerPixel
* width
;
5226 bytesPerComp
= bytesPerPixel
/ components
;
5227 flipBytes
= GL_FALSE
;
5228 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5229 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5230 compsPerRow
= components
* width
;
5231 assert(compsPerRow
>= width
);
5236 = (GLubyte
*) _mesa_malloc(bytesPerRow
* height
* depth
);
5240 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5243 for (img
= 0; img
< depth
; img
++) {
5244 for (row
= 0; row
< height
; row
++) {
5245 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5246 width
, height
, format
, type
, img
, row
, 0);
5248 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5250 flipBytes
= GL_FALSE
;
5251 if (unpack
->LsbFirst
) {
5252 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5253 GLubyte dstMask
= 128;
5254 const GLubyte
*s
= src
;
5257 for (i
= 0; i
< width
; i
++) {
5261 if (srcMask
== 128) {
5266 srcMask
= srcMask
<< 1;
5274 dstMask
= dstMask
>> 1;
5279 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5280 GLubyte dstMask
= 128;
5281 const GLubyte
*s
= src
;
5284 for (i
= 0; i
< width
; i
++) {
5293 srcMask
= srcMask
>> 1;
5301 dstMask
= dstMask
>> 1;
5307 _mesa_memcpy(dst
, src
, bytesPerRow
);
5310 /* byte flipping/swapping */
5312 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5315 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5318 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5327 #endif /* _HAVE_FULL_GL */
5332 * Convert an array of RGBA colors from one datatype to another.
5333 * NOTE: src may equal dst. In that case, we use a temporary buffer.
5336 _mesa_convert_colors(GLenum srcType
, const GLvoid
*src
,
5337 GLenum dstType
, GLvoid
*dst
,
5338 GLuint count
, const GLubyte mask
[])
5340 GLuint tempBuffer
[MAX_WIDTH
][4];
5341 const GLboolean useTemp
= (src
== dst
);
5343 ASSERT(srcType
!= dstType
);
5346 case GL_UNSIGNED_BYTE
:
5347 if (dstType
== GL_UNSIGNED_SHORT
) {
5348 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5349 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5351 for (i
= 0; i
< count
; i
++) {
5352 if (!mask
|| mask
[i
]) {
5353 dst2
[i
][RCOMP
] = UBYTE_TO_USHORT(src1
[i
][RCOMP
]);
5354 dst2
[i
][GCOMP
] = UBYTE_TO_USHORT(src1
[i
][GCOMP
]);
5355 dst2
[i
][BCOMP
] = UBYTE_TO_USHORT(src1
[i
][BCOMP
]);
5356 dst2
[i
][ACOMP
] = UBYTE_TO_USHORT(src1
[i
][ACOMP
]);
5360 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5363 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5364 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5366 ASSERT(dstType
== GL_FLOAT
);
5367 for (i
= 0; i
< count
; i
++) {
5368 if (!mask
|| mask
[i
]) {
5369 dst4
[i
][RCOMP
] = UBYTE_TO_FLOAT(src1
[i
][RCOMP
]);
5370 dst4
[i
][GCOMP
] = UBYTE_TO_FLOAT(src1
[i
][GCOMP
]);
5371 dst4
[i
][BCOMP
] = UBYTE_TO_FLOAT(src1
[i
][BCOMP
]);
5372 dst4
[i
][ACOMP
] = UBYTE_TO_FLOAT(src1
[i
][ACOMP
]);
5376 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5379 case GL_UNSIGNED_SHORT
:
5380 if (dstType
== GL_UNSIGNED_BYTE
) {
5381 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5382 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5384 for (i
= 0; i
< count
; i
++) {
5385 if (!mask
|| mask
[i
]) {
5386 dst1
[i
][RCOMP
] = USHORT_TO_UBYTE(src2
[i
][RCOMP
]);
5387 dst1
[i
][GCOMP
] = USHORT_TO_UBYTE(src2
[i
][GCOMP
]);
5388 dst1
[i
][BCOMP
] = USHORT_TO_UBYTE(src2
[i
][BCOMP
]);
5389 dst1
[i
][ACOMP
] = USHORT_TO_UBYTE(src2
[i
][ACOMP
]);
5393 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5396 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5397 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5399 ASSERT(dstType
== GL_FLOAT
);
5400 for (i
= 0; i
< count
; i
++) {
5401 if (!mask
|| mask
[i
]) {
5402 dst4
[i
][RCOMP
] = USHORT_TO_FLOAT(src2
[i
][RCOMP
]);
5403 dst4
[i
][GCOMP
] = USHORT_TO_FLOAT(src2
[i
][GCOMP
]);
5404 dst4
[i
][BCOMP
] = USHORT_TO_FLOAT(src2
[i
][BCOMP
]);
5405 dst4
[i
][ACOMP
] = USHORT_TO_FLOAT(src2
[i
][ACOMP
]);
5409 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5413 if (dstType
== GL_UNSIGNED_BYTE
) {
5414 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5415 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5417 for (i
= 0; i
< count
; i
++) {
5418 if (!mask
|| mask
[i
]) {
5419 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][RCOMP
], src4
[i
][RCOMP
]);
5420 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][GCOMP
], src4
[i
][GCOMP
]);
5421 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][BCOMP
], src4
[i
][BCOMP
]);
5422 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][ACOMP
], src4
[i
][ACOMP
]);
5426 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5429 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5430 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5432 ASSERT(dstType
== GL_UNSIGNED_SHORT
);
5433 for (i
= 0; i
< count
; i
++) {
5434 if (!mask
|| mask
[i
]) {
5435 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][RCOMP
], src4
[i
][RCOMP
]);
5436 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][GCOMP
], src4
[i
][GCOMP
]);
5437 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][BCOMP
], src4
[i
][BCOMP
]);
5438 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][ACOMP
], src4
[i
][ACOMP
]);
5442 _mesa_memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5446 _mesa_problem(NULL
, "Invalid datatype in _mesa_convert_colors");
5454 * Perform basic clipping for glDrawPixels. The image's position and size
5455 * and the unpack SkipPixels and SkipRows are adjusted so that the image
5456 * region is entirely within the window and scissor bounds.
5457 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
5458 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
5459 * we'll actually write. Beforehand, *destY-1 is the first drawing row.
5461 * \return GL_TRUE if image is ready for drawing or
5462 * GL_FALSE if image was completely clipped away (draw nothing)
5465 _mesa_clip_drawpixels(const GLcontext
*ctx
,
5466 GLint
*destX
, GLint
*destY
,
5467 GLsizei
*width
, GLsizei
*height
,
5468 struct gl_pixelstore_attrib
*unpack
)
5470 const GLframebuffer
*buffer
= ctx
->DrawBuffer
;
5472 if (unpack
->RowLength
== 0) {
5473 unpack
->RowLength
= *width
;
5476 ASSERT(ctx
->Pixel
.ZoomX
== 1.0F
);
5477 ASSERT(ctx
->Pixel
.ZoomY
== 1.0F
|| ctx
->Pixel
.ZoomY
== -1.0F
);
5480 if (*destX
< buffer
->_Xmin
) {
5481 unpack
->SkipPixels
+= (buffer
->_Xmin
- *destX
);
5482 *width
-= (buffer
->_Xmin
- *destX
);
5483 *destX
= buffer
->_Xmin
;
5485 /* right clipping */
5486 if (*destX
+ *width
> buffer
->_Xmax
)
5487 *width
-= (*destX
+ *width
- buffer
->_Xmax
);
5492 if (ctx
->Pixel
.ZoomY
== 1.0F
) {
5493 /* bottom clipping */
5494 if (*destY
< buffer
->_Ymin
) {
5495 unpack
->SkipRows
+= (buffer
->_Ymin
- *destY
);
5496 *height
-= (buffer
->_Ymin
- *destY
);
5497 *destY
= buffer
->_Ymin
;
5500 if (*destY
+ *height
> buffer
->_Ymax
)
5501 *height
-= (*destY
+ *height
- buffer
->_Ymax
);
5503 else { /* upside down */
5505 if (*destY
> buffer
->_Ymax
) {
5506 unpack
->SkipRows
+= (*destY
- buffer
->_Ymax
);
5507 *height
-= (*destY
- buffer
->_Ymax
);
5508 *destY
= buffer
->_Ymax
;
5510 /* bottom clipping */
5511 if (*destY
- *height
< buffer
->_Ymin
)
5512 *height
-= (buffer
->_Ymin
- (*destY
- *height
));
5513 /* adjust destY so it's the first row to write to */
5525 * Perform clipping for glReadPixels. The image's window position
5526 * and size, and the pack skipPixels, skipRows and rowLength are adjusted
5527 * so that the image region is entirely within the window bounds.
5528 * Note: this is different from _mesa_clip_drawpixels() in that the
5529 * scissor box is ignored, and we use the bounds of the current readbuffer
5532 * \return GL_TRUE if image is ready for drawing or
5533 * GL_FALSE if image was completely clipped away (draw nothing)
5536 _mesa_clip_readpixels(const GLcontext
*ctx
,
5537 GLint
*srcX
, GLint
*srcY
,
5538 GLsizei
*width
, GLsizei
*height
,
5539 struct gl_pixelstore_attrib
*pack
)
5541 const GLframebuffer
*buffer
= ctx
->ReadBuffer
;
5543 if (pack
->RowLength
== 0) {
5544 pack
->RowLength
= *width
;
5549 pack
->SkipPixels
+= (0 - *srcX
);
5550 *width
-= (0 - *srcX
);
5553 /* right clipping */
5554 if (*srcX
+ *width
> (GLsizei
) buffer
->Width
)
5555 *width
-= (*srcX
+ *width
- buffer
->Width
);
5560 /* bottom clipping */
5562 pack
->SkipRows
+= (0 - *srcY
);
5563 *height
-= (0 - *srcY
);
5567 if (*srcY
+ *height
> (GLsizei
) buffer
->Height
)
5568 *height
-= (*srcY
+ *height
- buffer
->Height
);
5578 * Do clipping for a glCopyTexSubImage call.
5579 * The framebuffer source region might extend outside the framebuffer
5580 * bounds. Clip the source region against the framebuffer bounds and
5581 * adjust the texture/dest position and size accordingly.
5583 * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
5586 _mesa_clip_copytexsubimage(const GLcontext
*ctx
,
5587 GLint
*destX
, GLint
*destY
,
5588 GLint
*srcX
, GLint
*srcY
,
5589 GLsizei
*width
, GLsizei
*height
)
5591 const struct gl_framebuffer
*fb
= ctx
->ReadBuffer
;
5592 const GLint srcX0
= *srcX
, srcY0
= *srcY
;
5594 if (_mesa_clip_to_region(0, 0, fb
->Width
, fb
->Height
,
5595 srcX
, srcY
, width
, height
)) {
5596 *destX
= *destX
+ *srcX
- srcX0
;
5597 *destY
= *destY
+ *srcY
- srcY0
;
5609 * Clip the rectangle defined by (x, y, width, height) against the bounds
5610 * specified by [xmin, xmax) and [ymin, ymax).
5611 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
5614 _mesa_clip_to_region(GLint xmin
, GLint ymin
,
5615 GLint xmax
, GLint ymax
,
5617 GLsizei
*width
, GLsizei
*height
)
5621 *width
-= (xmin
- *x
);
5625 /* right clipping */
5626 if (*x
+ *width
> xmax
)
5627 *width
-= (*x
+ *width
- xmax
);
5632 /* bottom (or top) clipping */
5634 *height
-= (ymin
- *y
);
5638 /* top (or bottom) clipping */
5639 if (*y
+ *height
> ymax
)
5640 *height
-= (*y
+ *height
- ymax
);
5650 * Clip dst coords against Xmax (or Ymax).
5653 clip_right_or_top(GLint
*srcX0
, GLint
*srcX1
,
5654 GLint
*dstX0
, GLint
*dstX1
,
5659 if (*dstX1
> maxValue
) {
5660 /* X1 outside right edge */
5661 ASSERT(*dstX0
< maxValue
); /* X0 should be inside right edge */
5662 t
= (GLfloat
) (maxValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5663 /* chop off [t, 1] part */
5664 ASSERT(t
>= 0.0 && t
<= 1.0);
5666 bias
= (*srcX0
< *srcX1
) ? 0.5 : -0.5;
5667 *srcX1
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5669 else if (*dstX0
> maxValue
) {
5670 /* X0 outside right edge */
5671 ASSERT(*dstX1
< maxValue
); /* X1 should be inside right edge */
5672 t
= (GLfloat
) (maxValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5673 /* chop off [t, 1] part */
5674 ASSERT(t
>= 0.0 && t
<= 1.0);
5676 bias
= (*srcX0
< *srcX1
) ? -0.5 : 0.5;
5677 *srcX0
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5683 * Clip dst coords against Xmin (or Ymin).
5686 clip_left_or_bottom(GLint
*srcX0
, GLint
*srcX1
,
5687 GLint
*dstX0
, GLint
*dstX1
,
5692 if (*dstX0
< minValue
) {
5693 /* X0 outside left edge */
5694 ASSERT(*dstX1
> minValue
); /* X1 should be inside left edge */
5695 t
= (GLfloat
) (minValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5696 /* chop off [0, t] part */
5697 ASSERT(t
>= 0.0 && t
<= 1.0);
5699 bias
= (*srcX0
< *srcX1
) ? 0.5 : -0.5; /* flipped??? */
5700 *srcX0
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5702 else if (*dstX1
< minValue
) {
5703 /* X1 outside left edge */
5704 ASSERT(*dstX0
> minValue
); /* X0 should be inside left edge */
5705 t
= (GLfloat
) (minValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5706 /* chop off [0, t] part */
5707 ASSERT(t
>= 0.0 && t
<= 1.0);
5709 bias
= (*srcX0
< *srcX1
) ? 0.5 : -0.5;
5710 *srcX1
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5716 * Do clipping of blit src/dest rectangles.
5717 * The dest rect is clipped against both the buffer bounds and scissor bounds.
5718 * The src rect is just clipped against the buffer bounds.
5720 * When either the src or dest rect is clipped, the other is also clipped
5723 * Note that X0 need not be less than X1 (same for Y) for either the source
5724 * and dest rects. That makes the clipping a little trickier.
5726 * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
5729 _mesa_clip_blit(GLcontext
*ctx
,
5730 GLint
*srcX0
, GLint
*srcY0
, GLint
*srcX1
, GLint
*srcY1
,
5731 GLint
*dstX0
, GLint
*dstY0
, GLint
*dstX1
, GLint
*dstY1
)
5733 const GLint srcXmin
= 0;
5734 const GLint srcXmax
= ctx
->ReadBuffer
->Width
;
5735 const GLint srcYmin
= 0;
5736 const GLint srcYmax
= ctx
->ReadBuffer
->Height
;
5738 /* these include scissor bounds */
5739 const GLint dstXmin
= ctx
->DrawBuffer
->_Xmin
;
5740 const GLint dstXmax
= ctx
->DrawBuffer
->_Xmax
;
5741 const GLint dstYmin
= ctx
->DrawBuffer
->_Ymin
;
5742 const GLint dstYmax
= ctx
->DrawBuffer
->_Ymax
;
5745 printf("PreClipX: src: %d .. %d dst: %d .. %d\n",
5746 *srcX0, *srcX1, *dstX0, *dstX1);
5747 printf("PreClipY: src: %d .. %d dst: %d .. %d\n",
5748 *srcY0, *srcY1, *dstY0, *dstY1);
5751 /* trivial rejection tests */
5752 if (*dstX0
== *dstX1
)
5753 return GL_FALSE
; /* no width */
5754 if (*dstX0
<= dstXmin
&& *dstX1
<= dstXmin
)
5755 return GL_FALSE
; /* totally out (left) of bounds */
5756 if (*dstX0
>= dstXmax
&& *dstX1
>= dstXmax
)
5757 return GL_FALSE
; /* totally out (right) of bounds */
5759 if (*dstY0
== *dstY1
)
5761 if (*dstY0
<= dstYmin
&& *dstY1
<= dstYmin
)
5763 if (*dstY0
>= dstYmax
&& *dstY1
>= dstYmax
)
5766 if (*srcX0
== *srcX1
)
5768 if (*srcX0
<= srcXmin
&& *srcX1
<= srcXmin
)
5770 if (*srcX0
>= srcXmax
&& *srcX1
>= srcXmax
)
5773 if (*srcY0
== *srcY1
)
5775 if (*srcY0
<= srcYmin
&& *srcY1
<= srcYmin
)
5777 if (*srcY0
>= srcYmax
&& *srcY1
>= srcYmax
)
5783 clip_right_or_top(srcX0
, srcX1
, dstX0
, dstX1
, dstXmax
);
5784 clip_right_or_top(srcY0
, srcY1
, dstY0
, dstY1
, dstYmax
);
5785 clip_left_or_bottom(srcX0
, srcX1
, dstX0
, dstX1
, dstXmin
);
5786 clip_left_or_bottom(srcY0
, srcY1
, dstY0
, dstY1
, dstYmin
);
5789 * src clip (just swap src/dst values from above)
5791 clip_right_or_top(dstX0
, dstX1
, srcX0
, srcX1
, srcXmax
);
5792 clip_right_or_top(dstY0
, dstY1
, srcY0
, srcY1
, srcYmax
);
5793 clip_left_or_bottom(dstX0
, dstX1
, srcX0
, srcX1
, srcXmin
);
5794 clip_left_or_bottom(dstY0
, dstY1
, srcY0
, srcY1
, srcYmin
);
5797 printf("PostClipX: src: %d .. %d dst: %d .. %d\n",
5798 *srcX0, *srcX1, *dstX0, *dstX1);
5799 printf("PostClipY: src: %d .. %d dst: %d .. %d\n",
5800 *srcY0, *srcY1, *dstY0, *dstY1);
5803 ASSERT(*dstX0
>= dstXmin
);
5804 ASSERT(*dstX0
<= dstXmax
);
5805 ASSERT(*dstX1
>= dstXmin
);
5806 ASSERT(*dstX1
<= dstXmax
);
5808 ASSERT(*dstY0
>= dstYmin
);
5809 ASSERT(*dstY0
<= dstYmax
);
5810 ASSERT(*dstY1
>= dstYmin
);
5811 ASSERT(*dstY1
<= dstYmax
);
5813 ASSERT(*srcX0
>= srcXmin
);
5814 ASSERT(*srcX0
<= srcXmax
);
5815 ASSERT(*srcX1
>= srcXmin
);
5816 ASSERT(*srcX1
<= srcXmax
);
5818 ASSERT(*srcY0
>= srcYmin
);
5819 ASSERT(*srcY0
<= srcYmax
);
5820 ASSERT(*srcY1
>= srcYmin
);
5821 ASSERT(*srcY1
<= srcYmax
);