2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
43 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
44 * we later convert the float to a packed integer value (such as for
45 * GL_RGB5_A1) because we'll wind up with a non-zero value.
47 * We redefine the macros here so zero is handled correctly.
50 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
53 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
57 /** Compute ceiling of integer quotient of A divided by B. */
58 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
62 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
65 _mesa_type_is_packed(GLenum type
)
68 case GL_UNSIGNED_BYTE_3_3_2
:
69 case GL_UNSIGNED_BYTE_2_3_3_REV
:
70 case GL_UNSIGNED_SHORT_5_6_5
:
71 case GL_UNSIGNED_SHORT_5_6_5_REV
:
72 case GL_UNSIGNED_SHORT_4_4_4_4
:
73 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
74 case GL_UNSIGNED_SHORT_5_5_5_1
:
75 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
76 case GL_UNSIGNED_INT_8_8_8_8
:
77 case GL_UNSIGNED_INT_8_8_8_8_REV
:
78 case GL_UNSIGNED_INT_10_10_10_2
:
79 case GL_UNSIGNED_INT_2_10_10_10_REV
:
80 case GL_UNSIGNED_SHORT_8_8_MESA
:
81 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
82 case GL_UNSIGNED_INT_24_8_EXT
:
90 * Flip the 8 bits in each byte of the given array.
93 * \param n number of bytes.
95 * \todo try this trick to flip bytes someday:
97 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
98 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
99 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
103 flip_bytes( GLubyte
*p
, GLuint n
)
106 for (i
= 0; i
< n
; i
++) {
107 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
108 a
= ((b
& 0x01) << 7) |
122 * Flip the order of the 2 bytes in each word in the given array.
125 * \param n number of words.
128 _mesa_swap2( GLushort
*p
, GLuint n
)
131 for (i
= 0; i
< n
; i
++) {
132 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
139 * Flip the order of the 4 bytes in each word in the given array.
142 _mesa_swap4( GLuint
*p
, GLuint n
)
145 for (i
= 0; i
< n
; i
++) {
148 | ((b
>> 8) & 0xff00)
149 | ((b
<< 8) & 0xff0000)
150 | ((b
<< 24) & 0xff000000);
157 * Get the size of a GL data type.
159 * \param type GL data type.
161 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
162 * if an invalid type enum.
165 _mesa_sizeof_type( GLenum type
)
170 case GL_UNSIGNED_BYTE
:
171 return sizeof(GLubyte
);
173 return sizeof(GLbyte
);
174 case GL_UNSIGNED_SHORT
:
175 return sizeof(GLushort
);
177 return sizeof(GLshort
);
178 case GL_UNSIGNED_INT
:
179 return sizeof(GLuint
);
181 return sizeof(GLint
);
183 return sizeof(GLfloat
);
185 return sizeof(GLdouble
);
186 case GL_HALF_FLOAT_ARB
:
187 return sizeof(GLhalfARB
);
195 * Same as _mesa_sizeof_type() but also accepting the packed pixel
199 _mesa_sizeof_packed_type( GLenum type
)
204 case GL_UNSIGNED_BYTE
:
205 return sizeof(GLubyte
);
207 return sizeof(GLbyte
);
208 case GL_UNSIGNED_SHORT
:
209 return sizeof(GLushort
);
211 return sizeof(GLshort
);
212 case GL_UNSIGNED_INT
:
213 return sizeof(GLuint
);
215 return sizeof(GLint
);
216 case GL_HALF_FLOAT_ARB
:
217 return sizeof(GLhalfARB
);
219 return sizeof(GLfloat
);
220 case GL_UNSIGNED_BYTE_3_3_2
:
221 return sizeof(GLubyte
);
222 case GL_UNSIGNED_BYTE_2_3_3_REV
:
223 return sizeof(GLubyte
);
224 case GL_UNSIGNED_SHORT_5_6_5
:
225 return sizeof(GLushort
);
226 case GL_UNSIGNED_SHORT_5_6_5_REV
:
227 return sizeof(GLushort
);
228 case GL_UNSIGNED_SHORT_4_4_4_4
:
229 return sizeof(GLushort
);
230 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
231 return sizeof(GLushort
);
232 case GL_UNSIGNED_SHORT_5_5_5_1
:
233 return sizeof(GLushort
);
234 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
235 return sizeof(GLushort
);
236 case GL_UNSIGNED_INT_8_8_8_8
:
237 return sizeof(GLuint
);
238 case GL_UNSIGNED_INT_8_8_8_8_REV
:
239 return sizeof(GLuint
);
240 case GL_UNSIGNED_INT_10_10_10_2
:
241 return sizeof(GLuint
);
242 case GL_UNSIGNED_INT_2_10_10_10_REV
:
243 return sizeof(GLuint
);
244 case GL_UNSIGNED_SHORT_8_8_MESA
:
245 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
246 return sizeof(GLushort
);
247 case GL_UNSIGNED_INT_24_8_EXT
:
248 return sizeof(GLuint
);
256 * Get the number of components in a pixel format.
258 * \param format pixel format.
260 * \return the number of components in the given format, or -1 if a bad format.
263 _mesa_components_in_format( GLenum format
)
267 case GL_COLOR_INDEX1_EXT
:
268 case GL_COLOR_INDEX2_EXT
:
269 case GL_COLOR_INDEX4_EXT
:
270 case GL_COLOR_INDEX8_EXT
:
271 case GL_COLOR_INDEX12_EXT
:
272 case GL_COLOR_INDEX16_EXT
:
273 case GL_STENCIL_INDEX
:
274 case GL_DEPTH_COMPONENT
:
276 case GL_RED_INTEGER_EXT
:
278 case GL_GREEN_INTEGER_EXT
:
280 case GL_BLUE_INTEGER_EXT
:
282 case GL_ALPHA_INTEGER_EXT
:
284 case GL_LUMINANCE_INTEGER_EXT
:
287 case GL_LUMINANCE_ALPHA
:
288 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
291 case GL_RGB_INTEGER_EXT
:
294 case GL_RGBA_INTEGER_EXT
:
304 case GL_DEPTH_STENCIL_EXT
:
316 * Get the bytes per pixel of pixel format type pair.
318 * \param format pixel format.
319 * \param type pixel type.
321 * \return bytes per pixel, or -1 if a bad format or type was given.
324 _mesa_bytes_per_pixel( GLenum format
, GLenum type
)
326 GLint comps
= _mesa_components_in_format( format
);
332 return 0; /* special case */
334 case GL_UNSIGNED_BYTE
:
335 return comps
* sizeof(GLubyte
);
337 case GL_UNSIGNED_SHORT
:
338 return comps
* sizeof(GLshort
);
340 case GL_UNSIGNED_INT
:
341 return comps
* sizeof(GLint
);
343 return comps
* sizeof(GLfloat
);
344 case GL_HALF_FLOAT_ARB
:
345 return comps
* sizeof(GLhalfARB
);
346 case GL_UNSIGNED_BYTE_3_3_2
:
347 case GL_UNSIGNED_BYTE_2_3_3_REV
:
348 if (format
== GL_RGB
|| format
== GL_BGR
)
349 return sizeof(GLubyte
);
351 return -1; /* error */
352 case GL_UNSIGNED_SHORT_5_6_5
:
353 case GL_UNSIGNED_SHORT_5_6_5_REV
:
354 if (format
== GL_RGB
|| format
== GL_BGR
)
355 return sizeof(GLushort
);
357 return -1; /* error */
358 case GL_UNSIGNED_SHORT_4_4_4_4
:
359 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
360 case GL_UNSIGNED_SHORT_5_5_5_1
:
361 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
362 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
363 return sizeof(GLushort
);
366 case GL_UNSIGNED_INT_8_8_8_8
:
367 case GL_UNSIGNED_INT_8_8_8_8_REV
:
368 case GL_UNSIGNED_INT_10_10_10_2
:
369 case GL_UNSIGNED_INT_2_10_10_10_REV
:
370 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
371 return sizeof(GLuint
);
374 case GL_UNSIGNED_SHORT_8_8_MESA
:
375 case GL_UNSIGNED_SHORT_8_8_REV_MESA
:
376 if (format
== GL_YCBCR_MESA
)
377 return sizeof(GLushort
);
380 case GL_UNSIGNED_INT_24_8_EXT
:
381 if (format
== GL_DEPTH_STENCIL_EXT
)
382 return sizeof(GLuint
);
392 * Test for a legal pixel format and type.
394 * \param format pixel format.
395 * \param type pixel type.
397 * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
401 _mesa_is_legal_format_and_type( GLcontext
*ctx
, GLenum format
, GLenum type
)
405 case GL_STENCIL_INDEX
:
409 case GL_UNSIGNED_BYTE
:
411 case GL_UNSIGNED_SHORT
:
413 case GL_UNSIGNED_INT
:
416 case GL_HALF_FLOAT_ARB
:
417 return ctx
->Extensions
.ARB_half_float_pixel
;
425 #if 0 /* not legal! see table 3.6 of the 1.5 spec */
429 case GL_LUMINANCE_ALPHA
:
430 case GL_DEPTH_COMPONENT
:
433 case GL_UNSIGNED_BYTE
:
435 case GL_UNSIGNED_SHORT
:
437 case GL_UNSIGNED_INT
:
440 case GL_HALF_FLOAT_ARB
:
441 return ctx
->Extensions
.ARB_half_float_pixel
;
448 case GL_UNSIGNED_BYTE
:
450 case GL_UNSIGNED_SHORT
:
452 case GL_UNSIGNED_INT
:
454 case GL_UNSIGNED_BYTE_3_3_2
:
455 case GL_UNSIGNED_BYTE_2_3_3_REV
:
456 case GL_UNSIGNED_SHORT_5_6_5
:
457 case GL_UNSIGNED_SHORT_5_6_5_REV
:
459 case GL_HALF_FLOAT_ARB
:
460 return ctx
->Extensions
.ARB_half_float_pixel
;
466 /* NOTE: no packed types are supported with BGR. That's
467 * intentional, according to the GL spec.
470 case GL_UNSIGNED_BYTE
:
472 case GL_UNSIGNED_SHORT
:
474 case GL_UNSIGNED_INT
:
477 case GL_HALF_FLOAT_ARB
:
478 return ctx
->Extensions
.ARB_half_float_pixel
;
487 case GL_UNSIGNED_BYTE
:
489 case GL_UNSIGNED_SHORT
:
491 case GL_UNSIGNED_INT
:
493 case GL_UNSIGNED_SHORT_4_4_4_4
:
494 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
495 case GL_UNSIGNED_SHORT_5_5_5_1
:
496 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
497 case GL_UNSIGNED_INT_8_8_8_8
:
498 case GL_UNSIGNED_INT_8_8_8_8_REV
:
499 case GL_UNSIGNED_INT_10_10_10_2
:
500 case GL_UNSIGNED_INT_2_10_10_10_REV
:
502 case GL_HALF_FLOAT_ARB
:
503 return ctx
->Extensions
.ARB_half_float_pixel
;
508 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
||
509 type
== GL_UNSIGNED_SHORT_8_8_REV_MESA
)
513 case GL_DEPTH_STENCIL_EXT
:
514 if (ctx
->Extensions
.EXT_packed_depth_stencil
515 && type
== GL_UNSIGNED_INT_24_8_EXT
)
523 case GL_UNSIGNED_BYTE
:
525 case GL_UNSIGNED_SHORT
:
527 case GL_UNSIGNED_INT
:
533 case GL_RED_INTEGER_EXT
:
534 case GL_GREEN_INTEGER_EXT
:
535 case GL_BLUE_INTEGER_EXT
:
536 case GL_ALPHA_INTEGER_EXT
:
537 case GL_RGB_INTEGER_EXT
:
538 case GL_RGBA_INTEGER_EXT
:
539 case GL_BGR_INTEGER_EXT
:
540 case GL_BGRA_INTEGER_EXT
:
541 case GL_LUMINANCE_INTEGER_EXT
:
542 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
545 case GL_UNSIGNED_BYTE
:
547 case GL_UNSIGNED_SHORT
:
549 case GL_UNSIGNED_INT
:
550 return ctx
->Extensions
.EXT_texture_integer
;
563 * Test if the given image format is a color/RGBA format (i.e., not color
564 * index, depth, stencil, etc).
565 * \param format the image format value (may by an internal texture format)
566 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
569 _mesa_is_color_format(GLenum format
)
587 case GL_LUMINANCE_ALPHA
:
588 case GL_LUMINANCE4_ALPHA4
:
589 case GL_LUMINANCE6_ALPHA2
:
590 case GL_LUMINANCE8_ALPHA8
:
591 case GL_LUMINANCE12_ALPHA4
:
592 case GL_LUMINANCE12_ALPHA12
:
593 case GL_LUMINANCE16_ALPHA16
:
620 /* float texture formats */
621 case GL_ALPHA16F_ARB
:
622 case GL_ALPHA32F_ARB
:
623 case GL_LUMINANCE16F_ARB
:
624 case GL_LUMINANCE32F_ARB
:
625 case GL_LUMINANCE_ALPHA16F_ARB
:
626 case GL_LUMINANCE_ALPHA32F_ARB
:
627 case GL_INTENSITY16F_ARB
:
628 case GL_INTENSITY32F_ARB
:
633 /* compressed formats */
634 case GL_COMPRESSED_ALPHA
:
635 case GL_COMPRESSED_LUMINANCE
:
636 case GL_COMPRESSED_LUMINANCE_ALPHA
:
637 case GL_COMPRESSED_INTENSITY
:
638 case GL_COMPRESSED_RGB
:
639 case GL_COMPRESSED_RGBA
:
644 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
645 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
646 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
647 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
648 case GL_COMPRESSED_RGB_FXT1_3DFX
:
649 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
650 #if FEATURE_EXT_texture_sRGB
653 case GL_SRGB_ALPHA_EXT
:
654 case GL_SRGB8_ALPHA8_EXT
:
655 case GL_SLUMINANCE_ALPHA_EXT
:
656 case GL_SLUMINANCE8_ALPHA8_EXT
:
657 case GL_SLUMINANCE_EXT
:
658 case GL_SLUMINANCE8_EXT
:
659 case GL_COMPRESSED_SRGB_EXT
:
660 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
661 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
662 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
663 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
664 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
665 case GL_COMPRESSED_SLUMINANCE_EXT
:
666 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
667 #endif /* FEATURE_EXT_texture_sRGB */
669 /* signed texture formats */
673 case GL_YCBCR_MESA
: /* not considered to be RGB */
682 * Test if the given image format is a color index format.
685 _mesa_is_index_format(GLenum format
)
689 case GL_COLOR_INDEX1_EXT
:
690 case GL_COLOR_INDEX2_EXT
:
691 case GL_COLOR_INDEX4_EXT
:
692 case GL_COLOR_INDEX8_EXT
:
693 case GL_COLOR_INDEX12_EXT
:
694 case GL_COLOR_INDEX16_EXT
:
703 * Test if the given image format is a depth component format.
706 _mesa_is_depth_format(GLenum format
)
709 case GL_DEPTH_COMPONENT
:
710 case GL_DEPTH_COMPONENT16
:
711 case GL_DEPTH_COMPONENT24
:
712 case GL_DEPTH_COMPONENT32
:
721 * Test if the given image format is a stencil format.
724 _mesa_is_stencil_format(GLenum format
)
727 case GL_STENCIL_INDEX
:
728 case GL_DEPTH_STENCIL
:
737 * Test if the given image format is a YCbCr format.
740 _mesa_is_ycbcr_format(GLenum format
)
752 * Test if the given image format is a depth+stencil format.
755 _mesa_is_depthstencil_format(GLenum format
)
758 case GL_DEPTH24_STENCIL8_EXT
:
759 case GL_DEPTH_STENCIL_EXT
:
768 * Test if the given image format is a depth or stencil format.
771 _mesa_is_depth_or_stencil_format(GLenum format
)
774 case GL_DEPTH_COMPONENT
:
775 case GL_DEPTH_COMPONENT16
:
776 case GL_DEPTH_COMPONENT24
:
777 case GL_DEPTH_COMPONENT32
:
778 case GL_STENCIL_INDEX
:
779 case GL_STENCIL_INDEX1_EXT
:
780 case GL_STENCIL_INDEX4_EXT
:
781 case GL_STENCIL_INDEX8_EXT
:
782 case GL_STENCIL_INDEX16_EXT
:
783 case GL_DEPTH_STENCIL_EXT
:
784 case GL_DEPTH24_STENCIL8_EXT
:
793 * Test if the given image format is a dudv format.
796 _mesa_is_dudv_format(GLenum format
)
809 * Test if the given format is an integer (non-normalized) format.
812 _mesa_is_integer_format(GLenum format
)
815 case GL_RED_INTEGER_EXT
:
816 case GL_GREEN_INTEGER_EXT
:
817 case GL_BLUE_INTEGER_EXT
:
818 case GL_ALPHA_INTEGER_EXT
:
819 case GL_RGB_INTEGER_EXT
:
820 case GL_RGBA_INTEGER_EXT
:
821 case GL_BGR_INTEGER_EXT
:
822 case GL_BGRA_INTEGER_EXT
:
823 case GL_LUMINANCE_INTEGER_EXT
:
824 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
833 * Test if an image format is a supported compressed format.
834 * \param format the internal format token provided by the user.
835 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
838 _mesa_is_compressed_format(GLcontext
*ctx
, GLenum format
)
841 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
842 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
843 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
844 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
845 return ctx
->Extensions
.EXT_texture_compression_s3tc
;
850 return ctx
->Extensions
.S3_s3tc
;
851 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
852 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
853 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
854 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
855 return ctx
->Extensions
.EXT_texture_sRGB
856 && ctx
->Extensions
.EXT_texture_compression_s3tc
;
857 case GL_COMPRESSED_RGB_FXT1_3DFX
:
858 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
859 return ctx
->Extensions
.TDFX_texture_compression_FXT1
;
867 * Return the address of a specific pixel in an image (1D, 2D or 3D).
869 * Pixel unpacking/packing parameters are observed according to \p packing.
871 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
872 * \param image starting address of image data
873 * \param width the image width
874 * \param height theimage height
875 * \param format the pixel format
876 * \param type the pixel data type
877 * \param packing the pixelstore attributes
878 * \param img which image in the volume (0 for 1D or 2D images)
879 * \param row row of pixel in the image (0 for 1D images)
880 * \param column column of pixel in the image
882 * \return address of pixel on success, or NULL on error.
884 * \sa gl_pixelstore_attrib.
887 _mesa_image_address( GLuint dimensions
,
888 const struct gl_pixelstore_attrib
*packing
,
890 GLsizei width
, GLsizei height
,
891 GLenum format
, GLenum type
,
892 GLint img
, GLint row
, GLint column
)
894 GLint alignment
; /* 1, 2 or 4 */
895 GLint pixels_per_row
;
896 GLint rows_per_image
;
899 GLint skipimages
; /* for 3-D volume images */
902 ASSERT(dimensions
>= 1 && dimensions
<= 3);
904 alignment
= packing
->Alignment
;
905 if (packing
->RowLength
> 0) {
906 pixels_per_row
= packing
->RowLength
;
909 pixels_per_row
= width
;
911 if (packing
->ImageHeight
> 0) {
912 rows_per_image
= packing
->ImageHeight
;
915 rows_per_image
= height
;
918 skippixels
= packing
->SkipPixels
;
919 /* Note: SKIP_ROWS _is_ used for 1D images */
920 skiprows
= packing
->SkipRows
;
921 /* Note: SKIP_IMAGES is only used for 3D images */
922 skipimages
= (dimensions
== 3) ? packing
->SkipImages
: 0;
924 if (type
== GL_BITMAP
) {
926 GLint comp_per_pixel
; /* components per pixel */
927 GLint bytes_per_comp
; /* bytes per component */
929 GLint bytes_per_image
;
931 /* Compute bytes per component */
932 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
933 if (bytes_per_comp
< 0) {
937 /* Compute number of components per pixel */
938 comp_per_pixel
= _mesa_components_in_format( format
);
939 if (comp_per_pixel
< 0) {
943 bytes_per_row
= alignment
944 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
946 bytes_per_image
= bytes_per_row
* rows_per_image
;
948 pixel_addr
= (GLubyte
*) image
949 + (skipimages
+ img
) * bytes_per_image
950 + (skiprows
+ row
) * bytes_per_row
951 + (skippixels
+ column
) / 8;
954 /* Non-BITMAP data */
955 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
958 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
960 /* The pixel type and format should have been error checked earlier */
961 assert(bytes_per_pixel
> 0);
963 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
964 remainder
= bytes_per_row
% alignment
;
966 bytes_per_row
+= (alignment
- remainder
);
968 ASSERT(bytes_per_row
% alignment
== 0);
970 bytes_per_image
= bytes_per_row
* rows_per_image
;
972 if (packing
->Invert
) {
973 /* set pixel_addr to the last row */
974 topOfImage
= bytes_per_row
* (height
- 1);
975 bytes_per_row
= -bytes_per_row
;
981 /* compute final pixel address */
982 pixel_addr
= (GLubyte
*) image
983 + (skipimages
+ img
) * bytes_per_image
985 + (skiprows
+ row
) * bytes_per_row
986 + (skippixels
+ column
) * bytes_per_pixel
;
989 return (GLvoid
*) pixel_addr
;
994 _mesa_image_address1d( const struct gl_pixelstore_attrib
*packing
,
997 GLenum format
, GLenum type
,
1000 return _mesa_image_address(1, packing
, image
, width
, 1,
1001 format
, type
, 0, 0, column
);
1006 _mesa_image_address2d( const struct gl_pixelstore_attrib
*packing
,
1007 const GLvoid
*image
,
1008 GLsizei width
, GLsizei height
,
1009 GLenum format
, GLenum type
,
1010 GLint row
, GLint column
)
1012 return _mesa_image_address(2, packing
, image
, width
, height
,
1013 format
, type
, 0, row
, column
);
1018 _mesa_image_address3d( const struct gl_pixelstore_attrib
*packing
,
1019 const GLvoid
*image
,
1020 GLsizei width
, GLsizei height
,
1021 GLenum format
, GLenum type
,
1022 GLint img
, GLint row
, GLint column
)
1024 return _mesa_image_address(3, packing
, image
, width
, height
,
1025 format
, type
, img
, row
, column
);
1031 * Compute the stride (in bytes) between image rows.
1033 * \param packing the pixelstore attributes
1034 * \param width image width.
1035 * \param format pixel format.
1036 * \param type pixel data type.
1038 * \return the stride in bytes for the given parameters, or -1 if error
1041 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
1042 GLint width
, GLenum format
, GLenum type
)
1044 GLint bytesPerRow
, remainder
;
1048 if (type
== GL_BITMAP
) {
1049 if (packing
->RowLength
== 0) {
1050 bytesPerRow
= (width
+ 7) / 8;
1053 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1057 /* Non-BITMAP data */
1058 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1059 if (bytesPerPixel
<= 0)
1060 return -1; /* error */
1061 if (packing
->RowLength
== 0) {
1062 bytesPerRow
= bytesPerPixel
* width
;
1065 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1069 remainder
= bytesPerRow
% packing
->Alignment
;
1070 if (remainder
> 0) {
1071 bytesPerRow
+= (packing
->Alignment
- remainder
);
1074 if (packing
->Invert
) {
1075 /* negate the bytes per row (negative row stride) */
1076 bytesPerRow
= -bytesPerRow
;
1086 * Compute the stride between images in a 3D texture (in bytes) for the given
1087 * pixel packing parameters and image width, format and type.
1090 _mesa_image_image_stride( const struct gl_pixelstore_attrib
*packing
,
1091 GLint width
, GLint height
,
1092 GLenum format
, GLenum type
)
1094 GLint bytesPerRow
, bytesPerImage
, remainder
;
1098 if (type
== GL_BITMAP
) {
1099 if (packing
->RowLength
== 0) {
1100 bytesPerRow
= (width
+ 7) / 8;
1103 bytesPerRow
= (packing
->RowLength
+ 7) / 8;
1107 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
1109 if (bytesPerPixel
<= 0)
1110 return -1; /* error */
1111 if (packing
->RowLength
== 0) {
1112 bytesPerRow
= bytesPerPixel
* width
;
1115 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
1119 remainder
= bytesPerRow
% packing
->Alignment
;
1121 bytesPerRow
+= (packing
->Alignment
- remainder
);
1123 if (packing
->ImageHeight
== 0)
1124 bytesPerImage
= bytesPerRow
* height
;
1126 bytesPerImage
= bytesPerRow
* packing
->ImageHeight
;
1128 return bytesPerImage
;
1133 * Unpack a 32x32 pixel polygon stipple from user memory using the
1134 * current pixel unpack settings.
1137 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
1138 const struct gl_pixelstore_attrib
*unpacking
)
1140 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
1142 /* Convert pattern from GLubytes to GLuints and handle big/little
1143 * endian differences
1147 for (i
= 0; i
< 32; i
++) {
1148 dest
[i
] = (p
[0] << 24)
1160 * Pack polygon stipple into user memory given current pixel packing
1164 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
1165 const struct gl_pixelstore_attrib
*packing
)
1167 /* Convert pattern from GLuints to GLubytes to handle big/little
1168 * endian differences.
1172 for (i
= 0; i
< 32; i
++) {
1173 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
1174 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
1175 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
1176 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
1179 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
1184 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
1185 * order with row alignment = 1 byte.
1188 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
1189 const struct gl_pixelstore_attrib
*packing
)
1191 GLint bytes
, row
, width_in_bytes
;
1192 GLubyte
*buffer
, *dst
;
1197 /* Alloc dest storage */
1198 bytes
= ((width
+ 7) / 8 * height
);
1199 buffer
= (GLubyte
*) malloc( bytes
);
1203 width_in_bytes
= CEILING( width
, 8 );
1205 for (row
= 0; row
< height
; row
++) {
1206 const GLubyte
*src
= (const GLubyte
*)
1207 _mesa_image_address2d(packing
, pixels
, width
, height
,
1208 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1214 if ((packing
->SkipPixels
& 7) == 0) {
1215 memcpy( dst
, src
, width_in_bytes
);
1216 if (packing
->LsbFirst
) {
1217 flip_bytes( dst
, width_in_bytes
);
1221 /* handling SkipPixels is a bit tricky (no pun intended!) */
1223 if (packing
->LsbFirst
) {
1224 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
1225 GLubyte dstMask
= 128;
1226 const GLubyte
*s
= src
;
1229 for (i
= 0; i
< width
; i
++) {
1233 if (srcMask
== 128) {
1238 srcMask
= srcMask
<< 1;
1246 dstMask
= dstMask
>> 1;
1251 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
1252 GLubyte dstMask
= 128;
1253 const GLubyte
*s
= src
;
1256 for (i
= 0; i
< width
; i
++) {
1265 srcMask
= srcMask
>> 1;
1273 dstMask
= dstMask
>> 1;
1278 dst
+= width_in_bytes
;
1289 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
1290 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
1292 GLint row
, width_in_bytes
;
1298 width_in_bytes
= CEILING( width
, 8 );
1300 for (row
= 0; row
< height
; row
++) {
1301 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
1302 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
1306 if ((packing
->SkipPixels
& 7) == 0) {
1307 memcpy( dst
, src
, width_in_bytes
);
1308 if (packing
->LsbFirst
) {
1309 flip_bytes( dst
, width_in_bytes
);
1313 /* handling SkipPixels is a bit tricky (no pun intended!) */
1315 if (packing
->LsbFirst
) {
1316 GLubyte srcMask
= 128;
1317 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
1318 const GLubyte
*s
= src
;
1321 for (i
= 0; i
< width
; i
++) {
1330 srcMask
= srcMask
>> 1;
1332 if (dstMask
== 128) {
1338 dstMask
= dstMask
<< 1;
1343 GLubyte srcMask
= 128;
1344 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
1345 const GLubyte
*s
= src
;
1348 for (i
= 0; i
< width
; i
++) {
1357 srcMask
= srcMask
>> 1;
1365 dstMask
= dstMask
>> 1;
1370 src
+= width_in_bytes
;
1376 * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1377 * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1378 * "On" bits will set texels to \p onValue.
1379 * "Off" bits will not modify texels.
1380 * \param width src bitmap width in pixels
1381 * \param height src bitmap height in pixels
1382 * \param unpack bitmap unpacking state
1383 * \param bitmap the src bitmap data
1384 * \param destBuffer start of dest buffer
1385 * \param destStride row stride in dest buffer
1386 * \param onValue if bit is 1, set destBuffer pixel to this value
1389 _mesa_expand_bitmap(GLsizei width
, GLsizei height
,
1390 const struct gl_pixelstore_attrib
*unpack
,
1391 const GLubyte
*bitmap
,
1392 GLubyte
*destBuffer
, GLint destStride
,
1395 const GLubyte
*srcRow
= (const GLubyte
*)
1396 _mesa_image_address2d(unpack
, bitmap
, width
, height
,
1397 GL_COLOR_INDEX
, GL_BITMAP
, 0, 0);
1398 const GLint srcStride
= _mesa_image_row_stride(unpack
, width
,
1399 GL_COLOR_INDEX
, GL_BITMAP
);
1402 #define SET_PIXEL(COL, ROW) \
1403 destBuffer[(ROW) * destStride + (COL)] = onValue;
1405 for (row
= 0; row
< height
; row
++) {
1406 const GLubyte
*src
= srcRow
;
1408 if (unpack
->LsbFirst
) {
1410 GLubyte mask
= 1U << (unpack
->SkipPixels
& 0x7);
1411 for (col
= 0; col
< width
; col
++) {
1414 SET_PIXEL(col
, row
);
1426 /* get ready for next row */
1432 GLubyte mask
= 128U >> (unpack
->SkipPixels
& 0x7);
1433 for (col
= 0; col
< width
; col
++) {
1436 SET_PIXEL(col
, row
);
1448 /* get ready for next row */
1453 srcRow
+= srcStride
;
1460 /**********************************************************************/
1461 /***** Pixel processing functions ******/
1462 /**********************************************************************/
1465 * Apply scale and bias factors to an array of RGBA pixels.
1468 _mesa_scale_and_bias_rgba(GLuint n
, GLfloat rgba
[][4],
1469 GLfloat rScale
, GLfloat gScale
,
1470 GLfloat bScale
, GLfloat aScale
,
1471 GLfloat rBias
, GLfloat gBias
,
1472 GLfloat bBias
, GLfloat aBias
)
1474 if (rScale
!= 1.0 || rBias
!= 0.0) {
1476 for (i
= 0; i
< n
; i
++) {
1477 rgba
[i
][RCOMP
] = rgba
[i
][RCOMP
] * rScale
+ rBias
;
1480 if (gScale
!= 1.0 || gBias
!= 0.0) {
1482 for (i
= 0; i
< n
; i
++) {
1483 rgba
[i
][GCOMP
] = rgba
[i
][GCOMP
] * gScale
+ gBias
;
1486 if (bScale
!= 1.0 || bBias
!= 0.0) {
1488 for (i
= 0; i
< n
; i
++) {
1489 rgba
[i
][BCOMP
] = rgba
[i
][BCOMP
] * bScale
+ bBias
;
1492 if (aScale
!= 1.0 || aBias
!= 0.0) {
1494 for (i
= 0; i
< n
; i
++) {
1495 rgba
[i
][ACOMP
] = rgba
[i
][ACOMP
] * aScale
+ aBias
;
1502 * Apply pixel mapping to an array of floating point RGBA pixels.
1505 _mesa_map_rgba( const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4] )
1507 const GLfloat rscale
= (GLfloat
) (ctx
->PixelMaps
.RtoR
.Size
- 1);
1508 const GLfloat gscale
= (GLfloat
) (ctx
->PixelMaps
.GtoG
.Size
- 1);
1509 const GLfloat bscale
= (GLfloat
) (ctx
->PixelMaps
.BtoB
.Size
- 1);
1510 const GLfloat ascale
= (GLfloat
) (ctx
->PixelMaps
.AtoA
.Size
- 1);
1511 const GLfloat
*rMap
= ctx
->PixelMaps
.RtoR
.Map
;
1512 const GLfloat
*gMap
= ctx
->PixelMaps
.GtoG
.Map
;
1513 const GLfloat
*bMap
= ctx
->PixelMaps
.BtoB
.Map
;
1514 const GLfloat
*aMap
= ctx
->PixelMaps
.AtoA
.Map
;
1517 GLfloat r
= CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
1518 GLfloat g
= CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
1519 GLfloat b
= CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
1520 GLfloat a
= CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
1521 rgba
[i
][RCOMP
] = rMap
[IROUND(r
* rscale
)];
1522 rgba
[i
][GCOMP
] = gMap
[IROUND(g
* gscale
)];
1523 rgba
[i
][BCOMP
] = bMap
[IROUND(b
* bscale
)];
1524 rgba
[i
][ACOMP
] = aMap
[IROUND(a
* ascale
)];
1530 * Apply the color matrix and post color matrix scaling and biasing.
1533 _mesa_transform_rgba(const GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4])
1535 const GLfloat rs
= ctx
->Pixel
.PostColorMatrixScale
[0];
1536 const GLfloat rb
= ctx
->Pixel
.PostColorMatrixBias
[0];
1537 const GLfloat gs
= ctx
->Pixel
.PostColorMatrixScale
[1];
1538 const GLfloat gb
= ctx
->Pixel
.PostColorMatrixBias
[1];
1539 const GLfloat bs
= ctx
->Pixel
.PostColorMatrixScale
[2];
1540 const GLfloat bb
= ctx
->Pixel
.PostColorMatrixBias
[2];
1541 const GLfloat as
= ctx
->Pixel
.PostColorMatrixScale
[3];
1542 const GLfloat ab
= ctx
->Pixel
.PostColorMatrixBias
[3];
1543 const GLfloat
*m
= ctx
->ColorMatrixStack
.Top
->m
;
1545 for (i
= 0; i
< n
; i
++) {
1546 const GLfloat r
= rgba
[i
][RCOMP
];
1547 const GLfloat g
= rgba
[i
][GCOMP
];
1548 const GLfloat b
= rgba
[i
][BCOMP
];
1549 const GLfloat a
= rgba
[i
][ACOMP
];
1550 rgba
[i
][RCOMP
] = (m
[0] * r
+ m
[4] * g
+ m
[ 8] * b
+ m
[12] * a
) * rs
+ rb
;
1551 rgba
[i
][GCOMP
] = (m
[1] * r
+ m
[5] * g
+ m
[ 9] * b
+ m
[13] * a
) * gs
+ gb
;
1552 rgba
[i
][BCOMP
] = (m
[2] * r
+ m
[6] * g
+ m
[10] * b
+ m
[14] * a
) * bs
+ bb
;
1553 rgba
[i
][ACOMP
] = (m
[3] * r
+ m
[7] * g
+ m
[11] * b
+ m
[15] * a
) * as
+ ab
;
1559 * Apply a color table lookup to an array of floating point RGBA colors.
1562 _mesa_lookup_rgba_float(const struct gl_color_table
*table
,
1563 GLuint n
, GLfloat rgba
[][4])
1565 const GLint max
= table
->Size
- 1;
1566 const GLfloat scale
= (GLfloat
) max
;
1567 const GLfloat
*lut
= table
->TableF
;
1570 if (!table
->TableF
|| table
->Size
== 0)
1573 switch (table
->_BaseFormat
) {
1575 /* replace RGBA with I */
1576 for (i
= 0; i
< n
; i
++) {
1577 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1578 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1586 /* replace RGB with L */
1587 for (i
= 0; i
< n
; i
++) {
1588 GLint j
= IROUND(rgba
[i
][RCOMP
] * scale
);
1589 GLfloat c
= lut
[CLAMP(j
, 0, max
)];
1596 /* replace A with A */
1597 for (i
= 0; i
< n
; i
++) {
1598 GLint j
= IROUND(rgba
[i
][ACOMP
] * scale
);
1599 rgba
[i
][ACOMP
] = lut
[CLAMP(j
, 0, max
)];
1602 case GL_LUMINANCE_ALPHA
:
1603 /* replace RGBA with LLLA */
1604 for (i
= 0; i
< n
; i
++) {
1605 GLint jL
= IROUND(rgba
[i
][RCOMP
] * scale
);
1606 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1607 GLfloat luminance
, alpha
;
1608 jL
= CLAMP(jL
, 0, max
);
1609 jA
= CLAMP(jA
, 0, max
);
1610 luminance
= lut
[jL
* 2 + 0];
1611 alpha
= lut
[jA
* 2 + 1];
1614 rgba
[i
][BCOMP
] = luminance
;
1615 rgba
[i
][ACOMP
] = alpha
;;
1619 /* replace RGB with RGB */
1620 for (i
= 0; i
< n
; i
++) {
1621 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1622 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1623 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1624 jR
= CLAMP(jR
, 0, max
);
1625 jG
= CLAMP(jG
, 0, max
);
1626 jB
= CLAMP(jB
, 0, max
);
1627 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1628 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1629 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1633 /* replace RGBA with RGBA */
1634 for (i
= 0; i
< n
; i
++) {
1635 GLint jR
= IROUND(rgba
[i
][RCOMP
] * scale
);
1636 GLint jG
= IROUND(rgba
[i
][GCOMP
] * scale
);
1637 GLint jB
= IROUND(rgba
[i
][BCOMP
] * scale
);
1638 GLint jA
= IROUND(rgba
[i
][ACOMP
] * scale
);
1639 jR
= CLAMP(jR
, 0, max
);
1640 jG
= CLAMP(jG
, 0, max
);
1641 jB
= CLAMP(jB
, 0, max
);
1642 jA
= CLAMP(jA
, 0, max
);
1643 rgba
[i
][RCOMP
] = lut
[jR
* 4 + 0];
1644 rgba
[i
][GCOMP
] = lut
[jG
* 4 + 1];
1645 rgba
[i
][BCOMP
] = lut
[jB
* 4 + 2];
1646 rgba
[i
][ACOMP
] = lut
[jA
* 4 + 3];
1650 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_float");
1658 * Apply a color table lookup to an array of ubyte/RGBA colors.
1661 _mesa_lookup_rgba_ubyte(const struct gl_color_table
*table
,
1662 GLuint n
, GLubyte rgba
[][4])
1664 const GLubyte
*lut
= table
->TableUB
;
1665 const GLfloat scale
= (GLfloat
) (table
->Size
- 1) / (GLfloat
)255.0;
1668 if (!table
->TableUB
|| table
->Size
== 0)
1671 switch (table
->_BaseFormat
) {
1673 /* replace RGBA with I */
1674 if (table
->Size
== 256) {
1675 for (i
= 0; i
< n
; i
++) {
1676 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1684 for (i
= 0; i
< n
; i
++) {
1685 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1689 rgba
[i
][ACOMP
] = lut
[j
];
1694 /* replace RGB with L */
1695 if (table
->Size
== 256) {
1696 for (i
= 0; i
< n
; i
++) {
1697 const GLubyte c
= lut
[rgba
[i
][RCOMP
]];
1704 for (i
= 0; i
< n
; i
++) {
1705 GLint j
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1708 rgba
[i
][BCOMP
] = lut
[j
];
1713 /* replace A with A */
1714 if (table
->Size
== 256) {
1715 for (i
= 0; i
< n
; i
++) {
1716 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
]];
1720 for (i
= 0; i
< n
; i
++) {
1721 GLint j
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1722 rgba
[i
][ACOMP
] = lut
[j
];
1726 case GL_LUMINANCE_ALPHA
:
1727 /* replace RGBA with LLLA */
1728 if (table
->Size
== 256) {
1729 for (i
= 0; i
< n
; i
++) {
1730 GLubyte l
= lut
[rgba
[i
][RCOMP
] * 2 + 0];
1731 GLubyte a
= lut
[rgba
[i
][ACOMP
] * 2 + 1];;
1739 for (i
= 0; i
< n
; i
++) {
1740 GLint jL
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1741 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1742 GLubyte luminance
= lut
[jL
* 2 + 0];
1743 GLubyte alpha
= lut
[jA
* 2 + 1];
1746 rgba
[i
][BCOMP
] = luminance
;
1747 rgba
[i
][ACOMP
] = alpha
;
1752 if (table
->Size
== 256) {
1753 for (i
= 0; i
< n
; i
++) {
1754 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 3 + 0];
1755 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 3 + 1];
1756 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 3 + 2];
1760 for (i
= 0; i
< n
; i
++) {
1761 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1762 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1763 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1764 rgba
[i
][RCOMP
] = lut
[jR
* 3 + 0];
1765 rgba
[i
][GCOMP
] = lut
[jG
* 3 + 1];
1766 rgba
[i
][BCOMP
] = lut
[jB
* 3 + 2];
1771 if (table
->Size
== 256) {
1772 for (i
= 0; i
< n
; i
++) {
1773 rgba
[i
][RCOMP
] = lut
[rgba
[i
][RCOMP
] * 4 + 0];
1774 rgba
[i
][GCOMP
] = lut
[rgba
[i
][GCOMP
] * 4 + 1];
1775 rgba
[i
][BCOMP
] = lut
[rgba
[i
][BCOMP
] * 4 + 2];
1776 rgba
[i
][ACOMP
] = lut
[rgba
[i
][ACOMP
] * 4 + 3];
1780 for (i
= 0; i
< n
; i
++) {
1781 GLint jR
= IROUND((GLfloat
) rgba
[i
][RCOMP
] * scale
);
1782 GLint jG
= IROUND((GLfloat
) rgba
[i
][GCOMP
] * scale
);
1783 GLint jB
= IROUND((GLfloat
) rgba
[i
][BCOMP
] * scale
);
1784 GLint jA
= IROUND((GLfloat
) rgba
[i
][ACOMP
] * scale
);
1785 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][RCOMP
], lut
[jR
* 4 + 0]);
1786 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][GCOMP
], lut
[jG
* 4 + 1]);
1787 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][BCOMP
], lut
[jB
* 4 + 2]);
1788 CLAMPED_FLOAT_TO_CHAN(rgba
[i
][ACOMP
], lut
[jA
* 4 + 3]);
1793 _mesa_problem(NULL
, "Bad format in _mesa_lookup_rgba_chan");
1801 * Map color indexes to float rgba values.
1804 _mesa_map_ci_to_rgba( const GLcontext
*ctx
, GLuint n
,
1805 const GLuint index
[], GLfloat rgba
[][4] )
1807 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1808 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1809 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1810 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1811 const GLfloat
*rMap
= ctx
->PixelMaps
.ItoR
.Map
;
1812 const GLfloat
*gMap
= ctx
->PixelMaps
.ItoG
.Map
;
1813 const GLfloat
*bMap
= ctx
->PixelMaps
.ItoB
.Map
;
1814 const GLfloat
*aMap
= ctx
->PixelMaps
.ItoA
.Map
;
1817 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1818 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1819 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1820 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1826 * Map ubyte color indexes to ubyte/RGBA values.
1829 _mesa_map_ci8_to_rgba8(const GLcontext
*ctx
, GLuint n
, const GLubyte index
[],
1832 GLuint rmask
= ctx
->PixelMaps
.ItoR
.Size
- 1;
1833 GLuint gmask
= ctx
->PixelMaps
.ItoG
.Size
- 1;
1834 GLuint bmask
= ctx
->PixelMaps
.ItoB
.Size
- 1;
1835 GLuint amask
= ctx
->PixelMaps
.ItoA
.Size
- 1;
1836 const GLubyte
*rMap
= ctx
->PixelMaps
.ItoR
.Map8
;
1837 const GLubyte
*gMap
= ctx
->PixelMaps
.ItoG
.Map8
;
1838 const GLubyte
*bMap
= ctx
->PixelMaps
.ItoB
.Map8
;
1839 const GLubyte
*aMap
= ctx
->PixelMaps
.ItoA
.Map8
;
1842 rgba
[i
][RCOMP
] = rMap
[index
[i
] & rmask
];
1843 rgba
[i
][GCOMP
] = gMap
[index
[i
] & gmask
];
1844 rgba
[i
][BCOMP
] = bMap
[index
[i
] & bmask
];
1845 rgba
[i
][ACOMP
] = aMap
[index
[i
] & amask
];
1851 _mesa_scale_and_bias_depth(const GLcontext
*ctx
, GLuint n
,
1852 GLfloat depthValues
[])
1854 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
1855 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
1857 for (i
= 0; i
< n
; i
++) {
1858 GLfloat d
= depthValues
[i
] * scale
+ bias
;
1859 depthValues
[i
] = CLAMP(d
, 0.0F
, 1.0F
);
1865 _mesa_scale_and_bias_depth_uint(const GLcontext
*ctx
, GLuint n
,
1866 GLuint depthValues
[])
1868 const GLdouble max
= (double) 0xffffffff;
1869 const GLdouble scale
= ctx
->Pixel
.DepthScale
;
1870 const GLdouble bias
= ctx
->Pixel
.DepthBias
* max
;
1872 for (i
= 0; i
< n
; i
++) {
1873 GLdouble d
= (GLdouble
) depthValues
[i
] * scale
+ bias
;
1874 d
= CLAMP(d
, 0.0, max
);
1875 depthValues
[i
] = (GLuint
) d
;
1882 * Update the min/max values from an array of fragment colors.
1885 update_minmax(GLcontext
*ctx
, GLuint n
, const GLfloat rgba
[][4])
1888 for (i
= 0; i
< n
; i
++) {
1890 if (rgba
[i
][RCOMP
] < ctx
->MinMax
.Min
[RCOMP
])
1891 ctx
->MinMax
.Min
[RCOMP
] = rgba
[i
][RCOMP
];
1892 if (rgba
[i
][GCOMP
] < ctx
->MinMax
.Min
[GCOMP
])
1893 ctx
->MinMax
.Min
[GCOMP
] = rgba
[i
][GCOMP
];
1894 if (rgba
[i
][BCOMP
] < ctx
->MinMax
.Min
[BCOMP
])
1895 ctx
->MinMax
.Min
[BCOMP
] = rgba
[i
][BCOMP
];
1896 if (rgba
[i
][ACOMP
] < ctx
->MinMax
.Min
[ACOMP
])
1897 ctx
->MinMax
.Min
[ACOMP
] = rgba
[i
][ACOMP
];
1900 if (rgba
[i
][RCOMP
] > ctx
->MinMax
.Max
[RCOMP
])
1901 ctx
->MinMax
.Max
[RCOMP
] = rgba
[i
][RCOMP
];
1902 if (rgba
[i
][GCOMP
] > ctx
->MinMax
.Max
[GCOMP
])
1903 ctx
->MinMax
.Max
[GCOMP
] = rgba
[i
][GCOMP
];
1904 if (rgba
[i
][BCOMP
] > ctx
->MinMax
.Max
[BCOMP
])
1905 ctx
->MinMax
.Max
[BCOMP
] = rgba
[i
][BCOMP
];
1906 if (rgba
[i
][ACOMP
] > ctx
->MinMax
.Max
[ACOMP
])
1907 ctx
->MinMax
.Max
[ACOMP
] = rgba
[i
][ACOMP
];
1913 * Update the histogram values from an array of fragment colors.
1916 update_histogram(GLcontext
*ctx
, GLuint n
, const GLfloat rgba
[][4])
1918 const GLint max
= ctx
->Histogram
.Width
- 1;
1919 GLfloat w
= (GLfloat
) max
;
1922 if (ctx
->Histogram
.Width
== 0)
1925 for (i
= 0; i
< n
; i
++) {
1926 GLint ri
= IROUND(rgba
[i
][RCOMP
] * w
);
1927 GLint gi
= IROUND(rgba
[i
][GCOMP
] * w
);
1928 GLint bi
= IROUND(rgba
[i
][BCOMP
] * w
);
1929 GLint ai
= IROUND(rgba
[i
][ACOMP
] * w
);
1930 ri
= CLAMP(ri
, 0, max
);
1931 gi
= CLAMP(gi
, 0, max
);
1932 bi
= CLAMP(bi
, 0, max
);
1933 ai
= CLAMP(ai
, 0, max
);
1934 ctx
->Histogram
.Count
[ri
][RCOMP
]++;
1935 ctx
->Histogram
.Count
[gi
][GCOMP
]++;
1936 ctx
->Histogram
.Count
[bi
][BCOMP
]++;
1937 ctx
->Histogram
.Count
[ai
][ACOMP
]++;
1943 * Apply various pixel transfer operations to an array of RGBA pixels
1944 * as indicated by the transferOps bitmask
1947 _mesa_apply_rgba_transfer_ops(GLcontext
*ctx
, GLbitfield transferOps
,
1948 GLuint n
, GLfloat rgba
[][4])
1951 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
1952 _mesa_scale_and_bias_rgba(n
, rgba
,
1953 ctx
->Pixel
.RedScale
, ctx
->Pixel
.GreenScale
,
1954 ctx
->Pixel
.BlueScale
, ctx
->Pixel
.AlphaScale
,
1955 ctx
->Pixel
.RedBias
, ctx
->Pixel
.GreenBias
,
1956 ctx
->Pixel
.BlueBias
, ctx
->Pixel
.AlphaBias
);
1958 /* color map lookup */
1959 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
1960 _mesa_map_rgba( ctx
, n
, rgba
);
1962 /* GL_COLOR_TABLE lookup */
1963 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
1964 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_PRECONVOLUTION
], n
, rgba
);
1967 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
1968 /* this has to be done in the calling code */
1969 _mesa_problem(ctx
, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
1971 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
1972 if (transferOps
& IMAGE_POST_CONVOLUTION_SCALE_BIAS
) {
1973 _mesa_scale_and_bias_rgba(n
, rgba
,
1974 ctx
->Pixel
.PostConvolutionScale
[RCOMP
],
1975 ctx
->Pixel
.PostConvolutionScale
[GCOMP
],
1976 ctx
->Pixel
.PostConvolutionScale
[BCOMP
],
1977 ctx
->Pixel
.PostConvolutionScale
[ACOMP
],
1978 ctx
->Pixel
.PostConvolutionBias
[RCOMP
],
1979 ctx
->Pixel
.PostConvolutionBias
[GCOMP
],
1980 ctx
->Pixel
.PostConvolutionBias
[BCOMP
],
1981 ctx
->Pixel
.PostConvolutionBias
[ACOMP
]);
1983 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
1984 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
1985 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_POSTCONVOLUTION
], n
, rgba
);
1987 /* color matrix transform */
1988 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
1989 _mesa_transform_rgba(ctx
, n
, rgba
);
1991 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
1992 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
1993 _mesa_lookup_rgba_float(&ctx
->ColorTable
[COLORTABLE_POSTCOLORMATRIX
], n
, rgba
);
1995 /* update histogram count */
1996 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
1997 update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
1999 /* update min/max values */
2000 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2001 update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2003 /* clamping to [0,1] */
2004 if (transferOps
& IMAGE_CLAMP_BIT
) {
2006 for (i
= 0; i
< n
; i
++) {
2007 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2008 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2009 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2010 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2017 * Apply color index shift and offset to an array of pixels.
2020 shift_and_offset_ci( const GLcontext
*ctx
, GLuint n
, GLuint indexes
[] )
2022 GLint shift
= ctx
->Pixel
.IndexShift
;
2023 GLint offset
= ctx
->Pixel
.IndexOffset
;
2027 indexes
[i
] = (indexes
[i
] << shift
) + offset
;
2030 else if (shift
< 0) {
2033 indexes
[i
] = (indexes
[i
] >> shift
) + offset
;
2038 indexes
[i
] = indexes
[i
] + offset
;
2046 * Apply color index shift, offset and table lookup to an array
2050 _mesa_apply_ci_transfer_ops(const GLcontext
*ctx
, GLbitfield transferOps
,
2051 GLuint n
, GLuint indexes
[])
2053 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2054 shift_and_offset_ci(ctx
, n
, indexes
);
2056 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2057 const GLuint mask
= ctx
->PixelMaps
.ItoI
.Size
- 1;
2059 for (i
= 0; i
< n
; i
++) {
2060 const GLuint j
= indexes
[i
] & mask
;
2061 indexes
[i
] = IROUND(ctx
->PixelMaps
.ItoI
.Map
[j
]);
2068 * Apply stencil index shift, offset and table lookup to an array
2069 * of stencil values.
2072 _mesa_apply_stencil_transfer_ops(const GLcontext
*ctx
, GLuint n
,
2073 GLstencil stencil
[])
2075 if (ctx
->Pixel
.IndexShift
!= 0 || ctx
->Pixel
.IndexOffset
!= 0) {
2076 const GLint offset
= ctx
->Pixel
.IndexOffset
;
2077 GLint shift
= ctx
->Pixel
.IndexShift
;
2080 for (i
= 0; i
< n
; i
++) {
2081 stencil
[i
] = (stencil
[i
] << shift
) + offset
;
2084 else if (shift
< 0) {
2086 for (i
= 0; i
< n
; i
++) {
2087 stencil
[i
] = (stencil
[i
] >> shift
) + offset
;
2091 for (i
= 0; i
< n
; i
++) {
2092 stencil
[i
] = stencil
[i
] + offset
;
2096 if (ctx
->Pixel
.MapStencilFlag
) {
2097 GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
2099 for (i
= 0; i
< n
; i
++) {
2100 stencil
[i
] = (GLstencil
)ctx
->PixelMaps
.StoS
.Map
[ stencil
[i
] & mask
];
2107 * Used to pack an array [][4] of RGBA float colors as specified
2108 * by the dstFormat, dstType and dstPacking. Used by glReadPixels,
2109 * glGetConvolutionFilter(), etc.
2110 * Note: the rgba values will be modified by this function when any pixel
2111 * transfer ops are enabled.
2114 _mesa_pack_rgba_span_float(GLcontext
*ctx
, GLuint n
, GLfloat rgba
[][4],
2115 GLenum dstFormat
, GLenum dstType
,
2117 const struct gl_pixelstore_attrib
*dstPacking
,
2118 GLbitfield transferOps
)
2120 GLfloat luminance
[MAX_WIDTH
];
2121 const GLint comps
= _mesa_components_in_format(dstFormat
);
2125 * This test should probably go away. Have the caller set/clear the
2126 * IMAGE_CLAMP_BIT as needed.
2128 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
2129 /* need to clamp to [0, 1] */
2130 transferOps
|= IMAGE_CLAMP_BIT
;
2134 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
2135 if ((transferOps
& IMAGE_MIN_MAX_BIT
) && ctx
->MinMax
.Sink
) {
2140 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
2141 /* compute luminance values */
2142 if (transferOps
& IMAGE_CLAMP_BIT
) {
2143 for (i
= 0; i
< n
; i
++) {
2144 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2145 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
2149 for (i
= 0; i
< n
; i
++) {
2150 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
2156 * Pack/store the pixels. Ugh! Lots of cases!!!
2159 case GL_UNSIGNED_BYTE
:
2161 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2162 switch (dstFormat
) {
2165 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2169 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2173 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2177 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2181 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
2183 case GL_LUMINANCE_ALPHA
:
2185 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
2186 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2191 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2192 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2193 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2198 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2199 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2200 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2201 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2206 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2207 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2208 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2213 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2214 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2215 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2216 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2221 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2222 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2223 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2224 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2230 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2231 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2235 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2241 GLbyte
*dst
= (GLbyte
*) dstAddr
;
2242 switch (dstFormat
) {
2245 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2249 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2253 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2257 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2261 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
2263 case GL_LUMINANCE_ALPHA
:
2265 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
2266 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2271 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2272 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2273 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2278 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2279 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2280 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2281 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2286 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2287 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2288 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2293 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2294 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2295 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2296 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2301 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
2302 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
2303 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2304 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2310 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
2311 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
2315 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2319 case GL_UNSIGNED_SHORT
:
2321 GLushort
*dst
= (GLushort
*) dstAddr
;
2322 switch (dstFormat
) {
2325 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
2329 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
2333 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
2337 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
2341 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
2343 case GL_LUMINANCE_ALPHA
:
2345 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
2346 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
2351 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
2352 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2353 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
2358 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
2359 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2360 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
2361 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2366 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
2367 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
2368 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
2373 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
2374 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
2375 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
2376 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
2381 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
2382 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
2383 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
2384 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
2390 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
2391 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
2395 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2401 GLshort
*dst
= (GLshort
*) dstAddr
;
2402 switch (dstFormat
) {
2405 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2409 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2413 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2417 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2421 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
2423 case GL_LUMINANCE_ALPHA
:
2425 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
2426 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2431 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2432 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2433 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2438 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2439 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2440 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2441 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2446 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2447 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2448 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2453 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2454 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2455 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2456 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2461 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
2462 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
2463 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2464 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2470 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
2471 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
2475 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2479 case GL_UNSIGNED_INT
:
2481 GLuint
*dst
= (GLuint
*) dstAddr
;
2482 switch (dstFormat
) {
2485 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2489 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2493 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2497 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2501 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
2503 case GL_LUMINANCE_ALPHA
:
2505 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
2506 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2511 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2512 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2513 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2518 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2519 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2520 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2521 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2526 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2527 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2528 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2533 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2534 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2535 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2536 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2541 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2542 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2543 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2544 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2550 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2551 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2555 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2561 GLint
*dst
= (GLint
*) dstAddr
;
2562 switch (dstFormat
) {
2565 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2569 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2573 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2577 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2581 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2583 case GL_LUMINANCE_ALPHA
:
2585 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2586 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2591 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2592 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2593 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2598 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2599 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2600 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2601 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2606 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2607 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2608 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2613 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2614 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2615 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2616 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2621 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2622 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2623 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2624 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2630 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2631 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2635 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2641 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2642 switch (dstFormat
) {
2645 dst
[i
] = rgba
[i
][RCOMP
];
2649 dst
[i
] = rgba
[i
][GCOMP
];
2653 dst
[i
] = rgba
[i
][BCOMP
];
2657 dst
[i
] = rgba
[i
][ACOMP
];
2661 dst
[i
] = luminance
[i
];
2663 case GL_LUMINANCE_ALPHA
:
2665 dst
[i
*2+0] = luminance
[i
];
2666 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2671 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2672 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2673 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2678 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2679 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2680 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2681 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2686 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2687 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2688 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2693 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2694 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2695 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2696 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2701 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2702 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2703 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2704 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2710 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2711 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2715 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2719 case GL_HALF_FLOAT_ARB
:
2721 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2722 switch (dstFormat
) {
2725 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2729 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2733 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2737 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2741 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2743 case GL_LUMINANCE_ALPHA
:
2745 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2746 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2751 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2752 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2753 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2758 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2759 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2760 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2761 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2766 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2767 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2768 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2773 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2774 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2775 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2776 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2781 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2782 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2783 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2784 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2790 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2791 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2795 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2799 case GL_UNSIGNED_BYTE_3_3_2
:
2800 if (dstFormat
== GL_RGB
) {
2801 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2803 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2804 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2805 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
2809 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2810 if (dstFormat
== GL_RGB
) {
2811 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2813 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
2814 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2815 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2819 case GL_UNSIGNED_SHORT_5_6_5
:
2820 if (dstFormat
== GL_RGB
) {
2821 GLushort
*dst
= (GLushort
*) dstAddr
;
2823 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2824 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2825 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
2829 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2830 if (dstFormat
== GL_RGB
) {
2831 GLushort
*dst
= (GLushort
*) dstAddr
;
2833 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2834 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2835 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2839 case GL_UNSIGNED_SHORT_4_4_4_4
:
2840 if (dstFormat
== GL_RGBA
) {
2841 GLushort
*dst
= (GLushort
*) dstAddr
;
2843 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2844 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2845 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2846 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2849 else if (dstFormat
== GL_BGRA
) {
2850 GLushort
*dst
= (GLushort
*) dstAddr
;
2852 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2853 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2854 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2855 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
2858 else if (dstFormat
== GL_ABGR_EXT
) {
2859 GLushort
*dst
= (GLushort
*) dstAddr
;
2861 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2862 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2863 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2864 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
2868 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2869 if (dstFormat
== GL_RGBA
) {
2870 GLushort
*dst
= (GLushort
*) dstAddr
;
2872 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
2873 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2874 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2875 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2878 else if (dstFormat
== GL_BGRA
) {
2879 GLushort
*dst
= (GLushort
*) dstAddr
;
2881 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
2882 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2883 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2884 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2887 else if (dstFormat
== GL_ABGR_EXT
) {
2888 GLushort
*dst
= (GLushort
*) dstAddr
;
2890 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
2891 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2892 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2893 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2897 case GL_UNSIGNED_SHORT_5_5_5_1
:
2898 if (dstFormat
== GL_RGBA
) {
2899 GLushort
*dst
= (GLushort
*) dstAddr
;
2901 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2902 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2903 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2904 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2907 else if (dstFormat
== GL_BGRA
) {
2908 GLushort
*dst
= (GLushort
*) dstAddr
;
2910 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2911 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2912 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2913 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
2916 else if (dstFormat
== GL_ABGR_EXT
) {
2917 GLushort
*dst
= (GLushort
*) dstAddr
;
2919 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2920 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2921 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2922 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
2926 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2927 if (dstFormat
== GL_RGBA
) {
2928 GLushort
*dst
= (GLushort
*) dstAddr
;
2930 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
2931 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2932 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2933 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2936 else if (dstFormat
== GL_BGRA
) {
2937 GLushort
*dst
= (GLushort
*) dstAddr
;
2939 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
2940 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2941 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2942 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2945 else if (dstFormat
== GL_ABGR_EXT
) {
2946 GLushort
*dst
= (GLushort
*) dstAddr
;
2948 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
2949 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2950 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2951 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2955 case GL_UNSIGNED_INT_8_8_8_8
:
2956 if (dstFormat
== GL_RGBA
) {
2957 GLuint
*dst
= (GLuint
*) dstAddr
;
2959 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
2960 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2961 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
2962 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2965 else if (dstFormat
== GL_BGRA
) {
2966 GLuint
*dst
= (GLuint
*) dstAddr
;
2968 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
2969 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
2970 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
2971 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
2974 else if (dstFormat
== GL_ABGR_EXT
) {
2975 GLuint
*dst
= (GLuint
*) dstAddr
;
2977 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
2978 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
2979 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
2980 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
2984 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2985 if (dstFormat
== GL_RGBA
) {
2986 GLuint
*dst
= (GLuint
*) dstAddr
;
2988 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
2989 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2990 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2991 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2994 else if (dstFormat
== GL_BGRA
) {
2995 GLuint
*dst
= (GLuint
*) dstAddr
;
2997 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
2998 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2999 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
3000 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
3003 else if (dstFormat
== GL_ABGR_EXT
) {
3004 GLuint
*dst
= (GLuint
*) dstAddr
;
3006 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
3007 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
3008 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
3009 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
3013 case GL_UNSIGNED_INT_10_10_10_2
:
3014 if (dstFormat
== GL_RGBA
) {
3015 GLuint
*dst
= (GLuint
*) dstAddr
;
3017 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
3018 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
3019 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
3020 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
3023 else if (dstFormat
== GL_BGRA
) {
3024 GLuint
*dst
= (GLuint
*) dstAddr
;
3026 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
3027 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
3028 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
3029 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
3032 else if (dstFormat
== GL_ABGR_EXT
) {
3033 GLuint
*dst
= (GLuint
*) dstAddr
;
3035 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
3036 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
3037 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
3038 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
3042 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3043 if (dstFormat
== GL_RGBA
) {
3044 GLuint
*dst
= (GLuint
*) dstAddr
;
3046 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
3047 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
3048 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
3049 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
3052 else if (dstFormat
== GL_BGRA
) {
3053 GLuint
*dst
= (GLuint
*) dstAddr
;
3055 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
3056 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
3057 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
3058 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
3061 else if (dstFormat
== GL_ABGR_EXT
) {
3062 GLuint
*dst
= (GLuint
*) dstAddr
;
3064 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
3065 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
3066 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
3067 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
3072 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
3076 if (dstPacking
->SwapBytes
) {
3077 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
3078 if (swapSize
== 2) {
3079 if (dstPacking
->SwapBytes
) {
3080 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
3083 else if (swapSize
== 4) {
3084 if (dstPacking
->SwapBytes
) {
3085 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
3092 #define SWAP2BYTE(VALUE) \
3094 GLubyte *bytes = (GLubyte *) &(VALUE); \
3095 GLubyte tmp = bytes[0]; \
3096 bytes[0] = bytes[1]; \
3100 #define SWAP4BYTE(VALUE) \
3102 GLubyte *bytes = (GLubyte *) &(VALUE); \
3103 GLubyte tmp = bytes[0]; \
3104 bytes[0] = bytes[3]; \
3107 bytes[1] = bytes[2]; \
3113 extract_uint_indexes(GLuint n
, GLuint indexes
[],
3114 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3115 const struct gl_pixelstore_attrib
*unpack
)
3117 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
3119 ASSERT(srcType
== GL_BITMAP
||
3120 srcType
== GL_UNSIGNED_BYTE
||
3121 srcType
== GL_BYTE
||
3122 srcType
== GL_UNSIGNED_SHORT
||
3123 srcType
== GL_SHORT
||
3124 srcType
== GL_UNSIGNED_INT
||
3125 srcType
== GL_INT
||
3126 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
3127 srcType
== GL_HALF_FLOAT_ARB
||
3128 srcType
== GL_FLOAT
);
3133 GLubyte
*ubsrc
= (GLubyte
*) src
;
3134 if (unpack
->LsbFirst
) {
3135 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
3137 for (i
= 0; i
< n
; i
++) {
3138 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3149 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
3151 for (i
= 0; i
< n
; i
++) {
3152 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
3164 case GL_UNSIGNED_BYTE
:
3167 const GLubyte
*s
= (const GLubyte
*) src
;
3168 for (i
= 0; i
< n
; i
++)
3175 const GLbyte
*s
= (const GLbyte
*) src
;
3176 for (i
= 0; i
< n
; i
++)
3180 case GL_UNSIGNED_SHORT
:
3183 const GLushort
*s
= (const GLushort
*) src
;
3184 if (unpack
->SwapBytes
) {
3185 for (i
= 0; i
< n
; i
++) {
3186 GLushort value
= s
[i
];
3192 for (i
= 0; i
< n
; i
++)
3200 const GLshort
*s
= (const GLshort
*) src
;
3201 if (unpack
->SwapBytes
) {
3202 for (i
= 0; i
< n
; i
++) {
3203 GLshort value
= s
[i
];
3209 for (i
= 0; i
< n
; i
++)
3214 case GL_UNSIGNED_INT
:
3217 const GLuint
*s
= (const GLuint
*) src
;
3218 if (unpack
->SwapBytes
) {
3219 for (i
= 0; i
< n
; i
++) {
3220 GLuint value
= s
[i
];
3226 for (i
= 0; i
< n
; i
++)
3234 const GLint
*s
= (const GLint
*) src
;
3235 if (unpack
->SwapBytes
) {
3236 for (i
= 0; i
< n
; i
++) {
3243 for (i
= 0; i
< n
; i
++)
3251 const GLfloat
*s
= (const GLfloat
*) src
;
3252 if (unpack
->SwapBytes
) {
3253 for (i
= 0; i
< n
; i
++) {
3254 GLfloat value
= s
[i
];
3256 indexes
[i
] = (GLuint
) value
;
3260 for (i
= 0; i
< n
; i
++)
3261 indexes
[i
] = (GLuint
) s
[i
];
3265 case GL_HALF_FLOAT_ARB
:
3268 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
3269 if (unpack
->SwapBytes
) {
3270 for (i
= 0; i
< n
; i
++) {
3271 GLhalfARB value
= s
[i
];
3273 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
3277 for (i
= 0; i
< n
; i
++)
3278 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
3282 case GL_UNSIGNED_INT_24_8_EXT
:
3285 const GLuint
*s
= (const GLuint
*) src
;
3286 if (unpack
->SwapBytes
) {
3287 for (i
= 0; i
< n
; i
++) {
3288 GLuint value
= s
[i
];
3290 indexes
[i
] = value
& 0xff; /* lower 8 bits */
3294 for (i
= 0; i
< n
; i
++)
3295 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
3301 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
3308 * This function extracts floating point RGBA values from arbitrary
3309 * image data. srcFormat and srcType are the format and type parameters
3310 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3312 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3313 * implements the "Conversion to floating point", "Conversion to RGB",
3314 * and "Final Expansion to RGBA" operations.
3316 * Args: n - number of pixels
3317 * rgba - output colors
3318 * srcFormat - format of incoming data
3319 * srcType - data type of incoming data
3320 * src - source data pointer
3321 * swapBytes - perform byteswapping of incoming data?
3324 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3325 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3326 GLboolean swapBytes
)
3328 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
3330 GLint rComp
, bComp
, gComp
, aComp
;
3331 GLboolean intFormat
;
3332 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
3334 ASSERT(srcFormat
== GL_RED
||
3335 srcFormat
== GL_GREEN
||
3336 srcFormat
== GL_BLUE
||
3337 srcFormat
== GL_ALPHA
||
3338 srcFormat
== GL_LUMINANCE
||
3339 srcFormat
== GL_LUMINANCE_ALPHA
||
3340 srcFormat
== GL_INTENSITY
||
3341 srcFormat
== GL_RGB
||
3342 srcFormat
== GL_BGR
||
3343 srcFormat
== GL_RGBA
||
3344 srcFormat
== GL_BGRA
||
3345 srcFormat
== GL_ABGR_EXT
||
3346 srcFormat
== GL_DU8DV8_ATI
||
3347 srcFormat
== GL_DUDV_ATI
||
3348 srcFormat
== GL_RED_INTEGER_EXT
||
3349 srcFormat
== GL_GREEN_INTEGER_EXT
||
3350 srcFormat
== GL_BLUE_INTEGER_EXT
||
3351 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3352 srcFormat
== GL_RGB_INTEGER_EXT
||
3353 srcFormat
== GL_RGBA_INTEGER_EXT
||
3354 srcFormat
== GL_BGR_INTEGER_EXT
||
3355 srcFormat
== GL_BGRA_INTEGER_EXT
||
3356 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3357 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3359 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3360 srcType
== GL_BYTE
||
3361 srcType
== GL_UNSIGNED_SHORT
||
3362 srcType
== GL_SHORT
||
3363 srcType
== GL_UNSIGNED_INT
||
3364 srcType
== GL_INT
||
3365 srcType
== GL_HALF_FLOAT_ARB
||
3366 srcType
== GL_FLOAT
||
3367 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3368 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3369 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3370 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3371 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3372 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3373 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3374 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3375 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3376 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3377 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3378 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3380 rComp
= gComp
= bComp
= aComp
= -1;
3382 switch (srcFormat
) {
3384 case GL_RED_INTEGER_EXT
:
3386 greenIndex
= blueIndex
= alphaIndex
= -1;
3390 case GL_GREEN_INTEGER_EXT
:
3392 redIndex
= blueIndex
= alphaIndex
= -1;
3396 case GL_BLUE_INTEGER_EXT
:
3398 redIndex
= greenIndex
= alphaIndex
= -1;
3402 case GL_ALPHA_INTEGER_EXT
:
3403 redIndex
= greenIndex
= blueIndex
= -1;
3408 case GL_LUMINANCE_INTEGER_EXT
:
3409 redIndex
= greenIndex
= blueIndex
= 0;
3413 case GL_LUMINANCE_ALPHA
:
3414 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
3415 redIndex
= greenIndex
= blueIndex
= 0;
3420 redIndex
= greenIndex
= blueIndex
= alphaIndex
= 0;
3424 case GL_RGB_INTEGER
:
3447 case GL_RGBA_INTEGER
:
3489 _mesa_problem(NULL
, "bad srcFormat %s in extract float data",
3490 _mesa_lookup_enum_by_nr(srcFormat
));
3494 intFormat
= _mesa_is_integer_format(srcFormat
);
3496 #define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
3497 if ((INDEX) < 0) { \
3500 for (i = 0; i < n; i++) { \
3501 rgba[i][CHANNEL] = DEFAULT_INT; \
3505 for (i = 0; i < n; i++) { \
3506 rgba[i][CHANNEL] = DEFAULT; \
3510 else if (swapBytes) { \
3511 const TYPE *s = (const TYPE *) src; \
3513 for (i = 0; i < n; i++) { \
3514 TYPE value = s[INDEX]; \
3515 if (sizeof(TYPE) == 2) { \
3518 else if (sizeof(TYPE) == 4) { \
3522 rgba[i][CHANNEL] = (GLfloat) value; \
3524 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
3529 const TYPE *s = (const TYPE *) src; \
3532 for (i = 0; i < n; i++) { \
3533 rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
3538 for (i = 0; i < n; i++) { \
3539 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
3546 case GL_UNSIGNED_BYTE
:
3547 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3548 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3549 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3550 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
3553 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3554 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3555 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
3556 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
3558 case GL_UNSIGNED_SHORT
:
3559 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3560 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3561 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3562 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
3565 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3566 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3567 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
3568 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
3570 case GL_UNSIGNED_INT
:
3571 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3572 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3573 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3574 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
3577 PROCESS(redIndex
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3578 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3579 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3580 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
3583 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3584 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3585 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3586 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
3588 case GL_HALF_FLOAT_ARB
:
3589 PROCESS(redIndex
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3590 PROCESS(greenIndex
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3591 PROCESS(blueIndex
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3592 PROCESS(alphaIndex
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3594 case GL_UNSIGNED_BYTE_3_3_2
:
3596 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3603 for (i
= 0; i
< n
; i
++) {
3604 GLubyte p
= ubsrc
[i
];
3605 rgba
[i
][rComp
] = ((p
>> 5) ) * rs
;
3606 rgba
[i
][gComp
] = ((p
>> 2) & 0x7) * gs
;
3607 rgba
[i
][bComp
] = ((p
) & 0x3) * bs
;
3608 rgba
[i
][aComp
] = 1.0F
;
3612 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3614 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3621 for (i
= 0; i
< n
; i
++) {
3622 GLubyte p
= ubsrc
[i
];
3623 rgba
[i
][rComp
] = ((p
) & 0x7) * rs
;
3624 rgba
[i
][gComp
] = ((p
>> 3) & 0x7) * gs
;
3625 rgba
[i
][bComp
] = ((p
>> 6) ) * bs
;
3626 rgba
[i
][aComp
] = 1.0F
;
3630 case GL_UNSIGNED_SHORT_5_6_5
:
3637 const GLushort
*ussrc
= (const GLushort
*) src
;
3639 for (i
= 0; i
< n
; i
++) {
3640 GLushort p
= ussrc
[i
];
3642 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3643 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3644 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3645 rgba
[i
][aComp
] = 1.0F
;
3649 const GLushort
*ussrc
= (const GLushort
*) src
;
3651 for (i
= 0; i
< n
; i
++) {
3652 GLushort p
= ussrc
[i
];
3653 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3654 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3655 rgba
[i
][bComp
] = ((p
) & 0x1f) * bs
;
3656 rgba
[i
][aComp
] = 1.0F
;
3660 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3667 const GLushort
*ussrc
= (const GLushort
*) src
;
3669 for (i
= 0; i
< n
; i
++) {
3670 GLushort p
= ussrc
[i
];
3672 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3673 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3674 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3675 rgba
[i
][aComp
] = 1.0F
;
3679 const GLushort
*ussrc
= (const GLushort
*) src
;
3681 for (i
= 0; i
< n
; i
++) {
3682 GLushort p
= ussrc
[i
];
3683 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3684 rgba
[i
][gComp
] = ((p
>> 5) & 0x3f) * gs
;
3685 rgba
[i
][bComp
] = ((p
>> 11) ) * bs
;
3686 rgba
[i
][aComp
] = 1.0F
;
3690 case GL_UNSIGNED_SHORT_4_4_4_4
:
3692 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3695 const GLushort
*ussrc
= (const GLushort
*) src
;
3697 for (i
= 0; i
< n
; i
++) {
3698 GLushort p
= ussrc
[i
];
3700 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3701 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3702 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3703 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3707 const GLushort
*ussrc
= (const GLushort
*) src
;
3709 for (i
= 0; i
< n
; i
++) {
3710 GLushort p
= ussrc
[i
];
3711 rgba
[i
][rComp
] = ((p
>> 12) ) * rs
;
3712 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * gs
;
3713 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * bs
;
3714 rgba
[i
][aComp
] = ((p
) & 0xf) * as
;
3718 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3720 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3723 const GLushort
*ussrc
= (const GLushort
*) src
;
3725 for (i
= 0; i
< n
; i
++) {
3726 GLushort p
= ussrc
[i
];
3728 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3729 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3730 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3731 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3735 const GLushort
*ussrc
= (const GLushort
*) src
;
3737 for (i
= 0; i
< n
; i
++) {
3738 GLushort p
= ussrc
[i
];
3739 rgba
[i
][rComp
] = ((p
) & 0xf) * rs
;
3740 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * gs
;
3741 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * bs
;
3742 rgba
[i
][aComp
] = ((p
>> 12) ) * as
;
3746 case GL_UNSIGNED_SHORT_5_5_5_1
:
3748 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3751 const GLushort
*ussrc
= (const GLushort
*) src
;
3753 for (i
= 0; i
< n
; i
++) {
3754 GLushort p
= ussrc
[i
];
3756 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3757 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3758 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3759 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3763 const GLushort
*ussrc
= (const GLushort
*) src
;
3765 for (i
= 0; i
< n
; i
++) {
3766 GLushort p
= ussrc
[i
];
3767 rgba
[i
][rComp
] = ((p
>> 11) ) * rs
;
3768 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * gs
;
3769 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * bs
;
3770 rgba
[i
][aComp
] = ((p
) & 0x1) * as
;
3774 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3776 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3779 const GLushort
*ussrc
= (const GLushort
*) src
;
3781 for (i
= 0; i
< n
; i
++) {
3782 GLushort p
= ussrc
[i
];
3784 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3785 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3786 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3787 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3791 const GLushort
*ussrc
= (const GLushort
*) src
;
3793 for (i
= 0; i
< n
; i
++) {
3794 GLushort p
= ussrc
[i
];
3795 rgba
[i
][rComp
] = ((p
) & 0x1f) * rs
;
3796 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * gs
;
3797 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * bs
;
3798 rgba
[i
][aComp
] = ((p
>> 15) ) * as
;
3802 case GL_UNSIGNED_INT_8_8_8_8
:
3804 const GLuint
*uisrc
= (const GLuint
*) src
;
3807 for (i
= 0; i
< n
; i
++) {
3808 GLuint p
= uisrc
[i
];
3809 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3810 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3811 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3812 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3816 for (i
= 0; i
< n
; i
++) {
3817 GLuint p
= uisrc
[i
];
3818 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3819 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3820 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3821 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3826 const GLuint
*uisrc
= (const GLuint
*) src
;
3829 for (i
= 0; i
< n
; i
++) {
3830 GLuint p
= uisrc
[i
];
3831 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3832 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3833 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3834 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3838 for (i
= 0; i
< n
; i
++) {
3839 GLuint p
= uisrc
[i
];
3840 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3841 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3842 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3843 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3848 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3850 const GLuint
*uisrc
= (const GLuint
*) src
;
3853 for (i
= 0; i
< n
; i
++) {
3854 GLuint p
= uisrc
[i
];
3855 rgba
[i
][rComp
] = (GLfloat
) ((p
>> 24) );
3856 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3857 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3858 rgba
[i
][aComp
] = (GLfloat
) ((p
) & 0xff);
3862 for (i
= 0; i
< n
; i
++) {
3863 GLuint p
= uisrc
[i
];
3864 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3865 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3866 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3867 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3872 const GLuint
*uisrc
= (const GLuint
*) src
;
3875 for (i
= 0; i
< n
; i
++) {
3876 GLuint p
= uisrc
[i
];
3877 rgba
[i
][rComp
] = (GLfloat
) ((p
) & 0xff);
3878 rgba
[i
][gComp
] = (GLfloat
) ((p
>> 8) & 0xff);
3879 rgba
[i
][bComp
] = (GLfloat
) ((p
>> 16) & 0xff);
3880 rgba
[i
][aComp
] = (GLfloat
) ((p
>> 24) );
3884 for (i
= 0; i
< n
; i
++) {
3885 GLuint p
= uisrc
[i
];
3886 rgba
[i
][rComp
] = UBYTE_TO_FLOAT((p
) & 0xff);
3887 rgba
[i
][gComp
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3888 rgba
[i
][bComp
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3889 rgba
[i
][aComp
] = UBYTE_TO_FLOAT((p
>> 24) );
3894 case GL_UNSIGNED_INT_10_10_10_2
:
3896 rs
= 1.0F
/ 1023.0F
;
3897 gs
= 1.0F
/ 1023.0F
;
3898 bs
= 1.0F
/ 1023.0F
;
3902 const GLuint
*uisrc
= (const GLuint
*) src
;
3904 for (i
= 0; i
< n
; i
++) {
3905 GLuint p
= uisrc
[i
];
3907 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3908 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3909 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3910 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3914 const GLuint
*uisrc
= (const GLuint
*) src
;
3916 for (i
= 0; i
< n
; i
++) {
3917 GLuint p
= uisrc
[i
];
3918 rgba
[i
][rComp
] = ((p
>> 22) ) * rs
;
3919 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * gs
;
3920 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * bs
;
3921 rgba
[i
][aComp
] = ((p
) & 0x3 ) * as
;
3925 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3927 rs
= 1.0F
/ 1023.0F
;
3928 gs
= 1.0F
/ 1023.0F
;
3929 bs
= 1.0F
/ 1023.0F
;
3933 const GLuint
*uisrc
= (const GLuint
*) src
;
3935 for (i
= 0; i
< n
; i
++) {
3936 GLuint p
= uisrc
[i
];
3938 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3939 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3940 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3941 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3945 const GLuint
*uisrc
= (const GLuint
*) src
;
3947 for (i
= 0; i
< n
; i
++) {
3948 GLuint p
= uisrc
[i
];
3949 rgba
[i
][rComp
] = ((p
) & 0x3ff) * rs
;
3950 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * gs
;
3951 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * bs
;
3952 rgba
[i
][aComp
] = ((p
>> 30) ) * as
;
3957 _mesa_problem(NULL
, "bad srcType in extract float data");
3964 * Unpack a row of color image data from a client buffer according to
3965 * the pixel unpacking parameters.
3966 * Return GLchan values in the specified dest image format.
3967 * This is used by glDrawPixels and glTexImage?D().
3968 * \param ctx - the context
3969 * n - number of pixels in the span
3970 * dstFormat - format of destination color array
3971 * dest - the destination color array
3972 * srcFormat - source image format
3973 * srcType - source image data type
3974 * source - source image pointer
3975 * srcPacking - pixel unpacking parameters
3976 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3978 * XXX perhaps expand this to process whole images someday.
3981 _mesa_unpack_color_span_chan( GLcontext
*ctx
,
3982 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3983 GLenum srcFormat
, GLenum srcType
,
3984 const GLvoid
*source
,
3985 const struct gl_pixelstore_attrib
*srcPacking
,
3986 GLbitfield transferOps
)
3988 ASSERT(dstFormat
== GL_ALPHA
||
3989 dstFormat
== GL_LUMINANCE
||
3990 dstFormat
== GL_LUMINANCE_ALPHA
||
3991 dstFormat
== GL_INTENSITY
||
3992 dstFormat
== GL_RGB
||
3993 dstFormat
== GL_RGBA
||
3994 dstFormat
== GL_COLOR_INDEX
);
3996 ASSERT(srcFormat
== GL_RED
||
3997 srcFormat
== GL_GREEN
||
3998 srcFormat
== GL_BLUE
||
3999 srcFormat
== GL_ALPHA
||
4000 srcFormat
== GL_LUMINANCE
||
4001 srcFormat
== GL_LUMINANCE_ALPHA
||
4002 srcFormat
== GL_INTENSITY
||
4003 srcFormat
== GL_RGB
||
4004 srcFormat
== GL_BGR
||
4005 srcFormat
== GL_RGBA
||
4006 srcFormat
== GL_BGRA
||
4007 srcFormat
== GL_ABGR_EXT
||
4008 srcFormat
== GL_COLOR_INDEX
);
4010 ASSERT(srcType
== GL_BITMAP
||
4011 srcType
== GL_UNSIGNED_BYTE
||
4012 srcType
== GL_BYTE
||
4013 srcType
== GL_UNSIGNED_SHORT
||
4014 srcType
== GL_SHORT
||
4015 srcType
== GL_UNSIGNED_INT
||
4016 srcType
== GL_INT
||
4017 srcType
== GL_HALF_FLOAT_ARB
||
4018 srcType
== GL_FLOAT
||
4019 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4020 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4021 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4022 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4023 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4024 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4025 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4026 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4027 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4028 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4029 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4030 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4032 /* Try simple cases first */
4033 if (transferOps
== 0) {
4034 if (srcType
== CHAN_TYPE
) {
4035 if (dstFormat
== GL_RGBA
) {
4036 if (srcFormat
== GL_RGBA
) {
4037 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
4040 else if (srcFormat
== GL_RGB
) {
4042 const GLchan
*src
= (const GLchan
*) source
;
4044 for (i
= 0; i
< n
; i
++) {
4055 else if (dstFormat
== GL_RGB
) {
4056 if (srcFormat
== GL_RGB
) {
4057 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
4060 else if (srcFormat
== GL_RGBA
) {
4062 const GLchan
*src
= (const GLchan
*) source
;
4064 for (i
= 0; i
< n
; i
++) {
4074 else if (dstFormat
== srcFormat
) {
4075 GLint comps
= _mesa_components_in_format(srcFormat
);
4077 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
4082 * Common situation, loading 8bit RGBA/RGB source images
4083 * into 16/32 bit destination. (OSMesa16/32)
4085 else if (srcType
== GL_UNSIGNED_BYTE
) {
4086 if (dstFormat
== GL_RGBA
) {
4087 if (srcFormat
== GL_RGB
) {
4089 const GLubyte
*src
= (const GLubyte
*) source
;
4091 for (i
= 0; i
< n
; i
++) {
4092 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4093 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4094 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4101 else if (srcFormat
== GL_RGBA
) {
4103 const GLubyte
*src
= (const GLubyte
*) source
;
4105 for (i
= 0; i
< n
; i
++) {
4106 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4107 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4108 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4109 dst
[3] = UBYTE_TO_CHAN(src
[3]);
4116 else if (dstFormat
== GL_RGB
) {
4117 if (srcFormat
== GL_RGB
) {
4119 const GLubyte
*src
= (const GLubyte
*) source
;
4121 for (i
= 0; i
< n
; i
++) {
4122 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4123 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4124 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4130 else if (srcFormat
== GL_RGBA
) {
4132 const GLubyte
*src
= (const GLubyte
*) source
;
4134 for (i
= 0; i
< n
; i
++) {
4135 dst
[0] = UBYTE_TO_CHAN(src
[0]);
4136 dst
[1] = UBYTE_TO_CHAN(src
[1]);
4137 dst
[2] = UBYTE_TO_CHAN(src
[2]);
4148 /* general solution begins here */
4150 GLint dstComponents
;
4151 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4152 GLint dstLuminanceIndex
, dstIntensityIndex
;
4153 GLfloat rgba
[MAX_WIDTH
][4];
4155 dstComponents
= _mesa_components_in_format( dstFormat
);
4156 /* source & dest image formats should have been error checked by now */
4157 assert(dstComponents
> 0);
4160 * Extract image data and convert to RGBA floats
4162 assert(n
<= MAX_WIDTH
);
4163 if (srcFormat
== GL_COLOR_INDEX
) {
4164 GLuint indexes
[MAX_WIDTH
];
4165 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4168 if (dstFormat
== GL_COLOR_INDEX
) {
4170 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4171 /* convert to GLchan and return */
4172 for (i
= 0; i
< n
; i
++) {
4173 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4178 /* Convert indexes to RGBA */
4179 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4180 shift_and_offset_ci(ctx
, n
, indexes
);
4182 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4185 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4186 * with color indexes.
4188 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4191 /* non-color index data */
4192 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4193 srcPacking
->SwapBytes
);
4196 /* Need to clamp if returning GLubytes or GLushorts */
4197 #if CHAN_TYPE != GL_FLOAT
4198 transferOps
|= IMAGE_CLAMP_BIT
;
4202 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4205 /* Now determine which color channels we need to produce.
4206 * And determine the dest index (offset) within each color tuple.
4208 switch (dstFormat
) {
4211 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4212 dstLuminanceIndex
= dstIntensityIndex
= -1;
4215 dstLuminanceIndex
= 0;
4216 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4217 dstIntensityIndex
= -1;
4219 case GL_LUMINANCE_ALPHA
:
4220 dstLuminanceIndex
= 0;
4222 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4223 dstIntensityIndex
= -1;
4226 dstIntensityIndex
= 0;
4227 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4228 dstLuminanceIndex
= -1;
4234 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4241 dstLuminanceIndex
= dstIntensityIndex
= -1;
4244 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_chan_span()");
4249 /* Now return the GLchan data in the requested dstFormat */
4251 if (dstRedIndex
>= 0) {
4254 for (i
= 0; i
< n
; i
++) {
4255 CLAMPED_FLOAT_TO_CHAN(dst
[dstRedIndex
], rgba
[i
][RCOMP
]);
4256 dst
+= dstComponents
;
4260 if (dstGreenIndex
>= 0) {
4263 for (i
= 0; i
< n
; i
++) {
4264 CLAMPED_FLOAT_TO_CHAN(dst
[dstGreenIndex
], rgba
[i
][GCOMP
]);
4265 dst
+= dstComponents
;
4269 if (dstBlueIndex
>= 0) {
4272 for (i
= 0; i
< n
; i
++) {
4273 CLAMPED_FLOAT_TO_CHAN(dst
[dstBlueIndex
], rgba
[i
][BCOMP
]);
4274 dst
+= dstComponents
;
4278 if (dstAlphaIndex
>= 0) {
4281 for (i
= 0; i
< n
; i
++) {
4282 CLAMPED_FLOAT_TO_CHAN(dst
[dstAlphaIndex
], rgba
[i
][ACOMP
]);
4283 dst
+= dstComponents
;
4287 if (dstIntensityIndex
>= 0) {
4290 assert(dstIntensityIndex
== 0);
4291 assert(dstComponents
== 1);
4292 for (i
= 0; i
< n
; i
++) {
4293 /* Intensity comes from red channel */
4294 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
4298 if (dstLuminanceIndex
>= 0) {
4301 assert(dstLuminanceIndex
== 0);
4302 for (i
= 0; i
< n
; i
++) {
4303 /* Luminance comes from red channel */
4304 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
4305 dst
+= dstComponents
;
4313 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
4314 * instead of GLchan.
4317 _mesa_unpack_color_span_float( GLcontext
*ctx
,
4318 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4319 GLenum srcFormat
, GLenum srcType
,
4320 const GLvoid
*source
,
4321 const struct gl_pixelstore_attrib
*srcPacking
,
4322 GLbitfield transferOps
)
4324 ASSERT(dstFormat
== GL_ALPHA
||
4325 dstFormat
== GL_LUMINANCE
||
4326 dstFormat
== GL_LUMINANCE_ALPHA
||
4327 dstFormat
== GL_INTENSITY
||
4328 dstFormat
== GL_RGB
||
4329 dstFormat
== GL_RGBA
||
4330 dstFormat
== GL_COLOR_INDEX
);
4332 ASSERT(srcFormat
== GL_RED
||
4333 srcFormat
== GL_GREEN
||
4334 srcFormat
== GL_BLUE
||
4335 srcFormat
== GL_ALPHA
||
4336 srcFormat
== GL_LUMINANCE
||
4337 srcFormat
== GL_LUMINANCE_ALPHA
||
4338 srcFormat
== GL_INTENSITY
||
4339 srcFormat
== GL_RGB
||
4340 srcFormat
== GL_BGR
||
4341 srcFormat
== GL_RGBA
||
4342 srcFormat
== GL_BGRA
||
4343 srcFormat
== GL_ABGR_EXT
||
4344 srcFormat
== GL_RED_INTEGER_EXT
||
4345 srcFormat
== GL_GREEN_INTEGER_EXT
||
4346 srcFormat
== GL_BLUE_INTEGER_EXT
||
4347 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4348 srcFormat
== GL_RGB_INTEGER_EXT
||
4349 srcFormat
== GL_RGBA_INTEGER_EXT
||
4350 srcFormat
== GL_BGR_INTEGER_EXT
||
4351 srcFormat
== GL_BGRA_INTEGER_EXT
||
4352 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4353 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4354 srcFormat
== GL_COLOR_INDEX
);
4356 ASSERT(srcType
== GL_BITMAP
||
4357 srcType
== GL_UNSIGNED_BYTE
||
4358 srcType
== GL_BYTE
||
4359 srcType
== GL_UNSIGNED_SHORT
||
4360 srcType
== GL_SHORT
||
4361 srcType
== GL_UNSIGNED_INT
||
4362 srcType
== GL_INT
||
4363 srcType
== GL_HALF_FLOAT_ARB
||
4364 srcType
== GL_FLOAT
||
4365 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4366 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4367 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4368 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4369 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4370 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4371 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4372 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4373 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4374 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4375 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4376 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
4378 /* general solution, no special cases, yet */
4380 GLint dstComponents
;
4381 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
4382 GLint dstLuminanceIndex
, dstIntensityIndex
;
4383 GLfloat rgba
[MAX_WIDTH
][4];
4385 dstComponents
= _mesa_components_in_format( dstFormat
);
4386 /* source & dest image formats should have been error checked by now */
4387 assert(dstComponents
> 0);
4390 * Extract image data and convert to RGBA floats
4392 assert(n
<= MAX_WIDTH
);
4393 if (srcFormat
== GL_COLOR_INDEX
) {
4394 GLuint indexes
[MAX_WIDTH
];
4395 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4398 if (dstFormat
== GL_COLOR_INDEX
) {
4400 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4401 /* convert to GLchan and return */
4402 for (i
= 0; i
< n
; i
++) {
4403 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
4408 /* Convert indexes to RGBA */
4409 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4410 shift_and_offset_ci(ctx
, n
, indexes
);
4412 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4415 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4416 * with color indexes.
4418 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4421 /* non-color index data */
4422 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4423 srcPacking
->SwapBytes
);
4427 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4430 /* Now determine which color channels we need to produce.
4431 * And determine the dest index (offset) within each color tuple.
4433 switch (dstFormat
) {
4436 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4437 dstLuminanceIndex
= dstIntensityIndex
= -1;
4440 dstLuminanceIndex
= 0;
4441 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4442 dstIntensityIndex
= -1;
4444 case GL_LUMINANCE_ALPHA
:
4445 dstLuminanceIndex
= 0;
4447 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
4448 dstIntensityIndex
= -1;
4451 dstIntensityIndex
= 0;
4452 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
4453 dstLuminanceIndex
= -1;
4459 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
4466 dstLuminanceIndex
= dstIntensityIndex
= -1;
4469 _mesa_problem(ctx
, "bad dstFormat in _mesa_unpack_color_span_float()");
4473 /* Now pack results in the requested dstFormat */
4474 if (dstRedIndex
>= 0) {
4475 GLfloat
*dst
= dest
;
4477 for (i
= 0; i
< n
; i
++) {
4478 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
4479 dst
+= dstComponents
;
4483 if (dstGreenIndex
>= 0) {
4484 GLfloat
*dst
= dest
;
4486 for (i
= 0; i
< n
; i
++) {
4487 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
4488 dst
+= dstComponents
;
4492 if (dstBlueIndex
>= 0) {
4493 GLfloat
*dst
= dest
;
4495 for (i
= 0; i
< n
; i
++) {
4496 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
4497 dst
+= dstComponents
;
4501 if (dstAlphaIndex
>= 0) {
4502 GLfloat
*dst
= dest
;
4504 for (i
= 0; i
< n
; i
++) {
4505 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
4506 dst
+= dstComponents
;
4510 if (dstIntensityIndex
>= 0) {
4511 GLfloat
*dst
= dest
;
4513 assert(dstIntensityIndex
== 0);
4514 assert(dstComponents
== 1);
4515 for (i
= 0; i
< n
; i
++) {
4516 /* Intensity comes from red channel */
4517 dst
[i
] = rgba
[i
][RCOMP
];
4521 if (dstLuminanceIndex
>= 0) {
4522 GLfloat
*dst
= dest
;
4524 assert(dstLuminanceIndex
== 0);
4525 for (i
= 0; i
< n
; i
++) {
4526 /* Luminance comes from red channel */
4527 dst
[0] = rgba
[i
][RCOMP
];
4528 dst
+= dstComponents
;
4535 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4536 * directly return GLbyte data, no transfer ops apply.
4539 _mesa_unpack_dudv_span_byte( GLcontext
*ctx
,
4540 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4541 GLenum srcFormat
, GLenum srcType
,
4542 const GLvoid
*source
,
4543 const struct gl_pixelstore_attrib
*srcPacking
,
4544 GLbitfield transferOps
)
4546 ASSERT(dstFormat
== GL_DUDV_ATI
);
4547 ASSERT(srcFormat
== GL_DUDV_ATI
);
4549 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4550 srcType
== GL_BYTE
||
4551 srcType
== GL_UNSIGNED_SHORT
||
4552 srcType
== GL_SHORT
||
4553 srcType
== GL_UNSIGNED_INT
||
4554 srcType
== GL_INT
||
4555 srcType
== GL_HALF_FLOAT_ARB
||
4556 srcType
== GL_FLOAT
);
4558 /* general solution */
4560 GLint dstComponents
;
4561 GLfloat rgba
[MAX_WIDTH
][4];
4565 dstComponents
= _mesa_components_in_format( dstFormat
);
4566 /* source & dest image formats should have been error checked by now */
4567 assert(dstComponents
> 0);
4570 * Extract image data and convert to RGBA floats
4572 assert(n
<= MAX_WIDTH
);
4573 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4574 srcPacking
->SwapBytes
);
4577 /* Now determine which color channels we need to produce.
4578 * And determine the dest index (offset) within each color tuple.
4581 /* Now pack results in the requested dstFormat */
4582 for (i
= 0; i
< n
; i
++) {
4583 /* not sure - need clamp[-1,1] here? */
4584 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4585 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4586 dst
+= dstComponents
;
4592 * Unpack a row of color index data from a client buffer according to
4593 * the pixel unpacking parameters.
4594 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4596 * Args: ctx - the context
4597 * n - number of pixels
4598 * dstType - destination data type
4599 * dest - destination array
4600 * srcType - source pixel type
4601 * source - source data pointer
4602 * srcPacking - pixel unpacking parameters
4603 * transferOps - the pixel transfer operations to apply
4606 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
4607 GLenum dstType
, GLvoid
*dest
,
4608 GLenum srcType
, const GLvoid
*source
,
4609 const struct gl_pixelstore_attrib
*srcPacking
,
4610 GLbitfield transferOps
)
4612 ASSERT(srcType
== GL_BITMAP
||
4613 srcType
== GL_UNSIGNED_BYTE
||
4614 srcType
== GL_BYTE
||
4615 srcType
== GL_UNSIGNED_SHORT
||
4616 srcType
== GL_SHORT
||
4617 srcType
== GL_UNSIGNED_INT
||
4618 srcType
== GL_INT
||
4619 srcType
== GL_HALF_FLOAT_ARB
||
4620 srcType
== GL_FLOAT
);
4622 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4623 dstType
== GL_UNSIGNED_SHORT
||
4624 dstType
== GL_UNSIGNED_INT
);
4627 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4630 * Try simple cases first
4632 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4633 && dstType
== GL_UNSIGNED_BYTE
) {
4634 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4636 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4637 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4638 memcpy(dest
, source
, n
* sizeof(GLuint
));
4644 GLuint indexes
[MAX_WIDTH
];
4645 assert(n
<= MAX_WIDTH
);
4647 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4651 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4653 /* convert to dest type */
4655 case GL_UNSIGNED_BYTE
:
4657 GLubyte
*dst
= (GLubyte
*) dest
;
4659 for (i
= 0; i
< n
; i
++) {
4660 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4664 case GL_UNSIGNED_SHORT
:
4666 GLuint
*dst
= (GLuint
*) dest
;
4668 for (i
= 0; i
< n
; i
++) {
4669 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4673 case GL_UNSIGNED_INT
:
4674 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4677 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4684 _mesa_pack_index_span( const GLcontext
*ctx
, GLuint n
,
4685 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4686 const struct gl_pixelstore_attrib
*dstPacking
,
4687 GLbitfield transferOps
)
4689 GLuint indexes
[MAX_WIDTH
];
4691 ASSERT(n
<= MAX_WIDTH
);
4693 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4695 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4696 /* make a copy of input */
4697 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4698 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4703 case GL_UNSIGNED_BYTE
:
4705 GLubyte
*dst
= (GLubyte
*) dest
;
4707 for (i
= 0; i
< n
; i
++) {
4708 *dst
++ = (GLubyte
) source
[i
];
4714 GLbyte
*dst
= (GLbyte
*) dest
;
4716 for (i
= 0; i
< n
; i
++) {
4717 dst
[i
] = (GLbyte
) source
[i
];
4721 case GL_UNSIGNED_SHORT
:
4723 GLushort
*dst
= (GLushort
*) dest
;
4725 for (i
= 0; i
< n
; i
++) {
4726 dst
[i
] = (GLushort
) source
[i
];
4728 if (dstPacking
->SwapBytes
) {
4729 _mesa_swap2( (GLushort
*) dst
, n
);
4735 GLshort
*dst
= (GLshort
*) dest
;
4737 for (i
= 0; i
< n
; i
++) {
4738 dst
[i
] = (GLshort
) source
[i
];
4740 if (dstPacking
->SwapBytes
) {
4741 _mesa_swap2( (GLushort
*) dst
, n
);
4745 case GL_UNSIGNED_INT
:
4747 GLuint
*dst
= (GLuint
*) dest
;
4749 for (i
= 0; i
< n
; i
++) {
4750 dst
[i
] = (GLuint
) source
[i
];
4752 if (dstPacking
->SwapBytes
) {
4753 _mesa_swap4( (GLuint
*) dst
, n
);
4759 GLint
*dst
= (GLint
*) dest
;
4761 for (i
= 0; i
< n
; i
++) {
4762 dst
[i
] = (GLint
) source
[i
];
4764 if (dstPacking
->SwapBytes
) {
4765 _mesa_swap4( (GLuint
*) dst
, n
);
4771 GLfloat
*dst
= (GLfloat
*) dest
;
4773 for (i
= 0; i
< n
; i
++) {
4774 dst
[i
] = (GLfloat
) source
[i
];
4776 if (dstPacking
->SwapBytes
) {
4777 _mesa_swap4( (GLuint
*) dst
, n
);
4781 case GL_HALF_FLOAT_ARB
:
4783 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4785 for (i
= 0; i
< n
; i
++) {
4786 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4788 if (dstPacking
->SwapBytes
) {
4789 _mesa_swap2( (GLushort
*) dst
, n
);
4794 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4800 * Unpack a row of stencil data from a client buffer according to
4801 * the pixel unpacking parameters.
4802 * This is (or will be) used by glDrawPixels
4804 * Args: ctx - the context
4805 * n - number of pixels
4806 * dstType - destination data type
4807 * dest - destination array
4808 * srcType - source pixel type
4809 * source - source data pointer
4810 * srcPacking - pixel unpacking parameters
4811 * transferOps - apply offset/bias/lookup ops?
4814 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4815 GLenum dstType
, GLvoid
*dest
,
4816 GLenum srcType
, const GLvoid
*source
,
4817 const struct gl_pixelstore_attrib
*srcPacking
,
4818 GLbitfield transferOps
)
4820 ASSERT(srcType
== GL_BITMAP
||
4821 srcType
== GL_UNSIGNED_BYTE
||
4822 srcType
== GL_BYTE
||
4823 srcType
== GL_UNSIGNED_SHORT
||
4824 srcType
== GL_SHORT
||
4825 srcType
== GL_UNSIGNED_INT
||
4826 srcType
== GL_INT
||
4827 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4828 srcType
== GL_HALF_FLOAT_ARB
||
4829 srcType
== GL_FLOAT
);
4831 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4832 dstType
== GL_UNSIGNED_SHORT
||
4833 dstType
== GL_UNSIGNED_INT
);
4835 /* only shift and offset apply to stencil */
4836 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4839 * Try simple cases first
4841 if (transferOps
== 0 &&
4842 !ctx
->Pixel
.MapStencilFlag
&&
4843 srcType
== GL_UNSIGNED_BYTE
&&
4844 dstType
== GL_UNSIGNED_BYTE
) {
4845 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4847 else if (transferOps
== 0 &&
4848 !ctx
->Pixel
.MapStencilFlag
&&
4849 srcType
== GL_UNSIGNED_INT
&&
4850 dstType
== GL_UNSIGNED_INT
&&
4851 !srcPacking
->SwapBytes
) {
4852 memcpy(dest
, source
, n
* sizeof(GLuint
));
4858 GLuint indexes
[MAX_WIDTH
];
4859 assert(n
<= MAX_WIDTH
);
4861 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4864 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4865 /* shift and offset indexes */
4866 shift_and_offset_ci(ctx
, n
, indexes
);
4869 if (ctx
->Pixel
.MapStencilFlag
) {
4870 /* Apply stencil lookup table */
4871 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4873 for (i
= 0; i
< n
; i
++) {
4874 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4878 /* convert to dest type */
4880 case GL_UNSIGNED_BYTE
:
4882 GLubyte
*dst
= (GLubyte
*) dest
;
4884 for (i
= 0; i
< n
; i
++) {
4885 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4889 case GL_UNSIGNED_SHORT
:
4891 GLuint
*dst
= (GLuint
*) dest
;
4893 for (i
= 0; i
< n
; i
++) {
4894 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4898 case GL_UNSIGNED_INT
:
4899 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4902 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4909 _mesa_pack_stencil_span( const GLcontext
*ctx
, GLuint n
,
4910 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4911 const struct gl_pixelstore_attrib
*dstPacking
)
4913 GLstencil stencil
[MAX_WIDTH
];
4915 ASSERT(n
<= MAX_WIDTH
);
4917 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4918 ctx
->Pixel
.MapStencilFlag
) {
4919 /* make a copy of input */
4920 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4921 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4926 case GL_UNSIGNED_BYTE
:
4927 if (sizeof(GLstencil
) == 1) {
4928 memcpy( dest
, source
, n
);
4931 GLubyte
*dst
= (GLubyte
*) dest
;
4934 dst
[i
] = (GLubyte
) source
[i
];
4940 GLbyte
*dst
= (GLbyte
*) dest
;
4943 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4947 case GL_UNSIGNED_SHORT
:
4949 GLushort
*dst
= (GLushort
*) dest
;
4952 dst
[i
] = (GLushort
) source
[i
];
4954 if (dstPacking
->SwapBytes
) {
4955 _mesa_swap2( (GLushort
*) dst
, n
);
4961 GLshort
*dst
= (GLshort
*) dest
;
4964 dst
[i
] = (GLshort
) source
[i
];
4966 if (dstPacking
->SwapBytes
) {
4967 _mesa_swap2( (GLushort
*) dst
, n
);
4971 case GL_UNSIGNED_INT
:
4973 GLuint
*dst
= (GLuint
*) dest
;
4976 dst
[i
] = (GLuint
) source
[i
];
4978 if (dstPacking
->SwapBytes
) {
4979 _mesa_swap4( (GLuint
*) dst
, n
);
4985 GLint
*dst
= (GLint
*) dest
;
4988 dst
[i
] = (GLint
) source
[i
];
4990 if (dstPacking
->SwapBytes
) {
4991 _mesa_swap4( (GLuint
*) dst
, n
);
4997 GLfloat
*dst
= (GLfloat
*) dest
;
5000 dst
[i
] = (GLfloat
) source
[i
];
5002 if (dstPacking
->SwapBytes
) {
5003 _mesa_swap4( (GLuint
*) dst
, n
);
5007 case GL_HALF_FLOAT_ARB
:
5009 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5012 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
5014 if (dstPacking
->SwapBytes
) {
5015 _mesa_swap2( (GLushort
*) dst
, n
);
5020 if (dstPacking
->LsbFirst
) {
5021 GLubyte
*dst
= (GLubyte
*) dest
;
5024 for (i
= 0; i
< n
; i
++) {
5027 *dst
|= ((source
[i
] != 0) << shift
);
5036 GLubyte
*dst
= (GLubyte
*) dest
;
5039 for (i
= 0; i
< n
; i
++) {
5042 *dst
|= ((source
[i
] != 0) << shift
);
5052 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5056 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5059 const GLTYPE *src = (const GLTYPE *)source; \
5060 for (i = 0; i < n; i++) { \
5061 GLTYPE value = src[i]; \
5062 if (srcPacking->SwapBytes) { \
5063 if (sizeof(GLTYPE) == 2) { \
5065 } else if (sizeof(GLTYPE) == 4) { \
5069 depthValues[i] = GLTYPE2FLOAT(value); \
5075 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5076 * or GLfloat values.
5077 * The glPixelTransfer (scale/bias) params will be applied.
5079 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5080 * \param depthMax max value for returned GLushort or GLuint values
5081 * (ignored for GLfloat).
5084 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
,
5085 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5086 GLenum srcType
, const GLvoid
*source
,
5087 const struct gl_pixelstore_attrib
*srcPacking
)
5089 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
5090 GLboolean needClamp
= GL_FALSE
;
5092 /* Look for special cases first.
5093 * Not only are these faster, they're less prone to numeric conversion
5094 * problems. Otherwise, converting from an int type to a float then
5095 * back to an int type can introduce errors that will show up as
5096 * artifacts in things like depth peeling which uses glCopyTexImage.
5098 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5099 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5100 const GLuint
*src
= (const GLuint
*) source
;
5101 GLushort
*dst
= (GLushort
*) dest
;
5103 for (i
= 0; i
< n
; i
++) {
5104 dst
[i
] = src
[i
] >> 16;
5108 if (srcType
== GL_UNSIGNED_SHORT
5109 && dstType
== GL_UNSIGNED_INT
5110 && depthMax
== 0xffffffff) {
5111 const GLushort
*src
= (const GLushort
*) source
;
5112 GLuint
*dst
= (GLuint
*) dest
;
5114 for (i
= 0; i
< n
; i
++) {
5115 dst
[i
] = src
[i
] | (src
[i
] << 16);
5119 if (srcType
== GL_UNSIGNED_INT_24_8
5120 && dstType
== GL_UNSIGNED_INT
5121 && depthMax
== 0xffffff) {
5122 const GLuint
*src
= (const GLuint
*) source
;
5123 GLuint
*dst
= (GLuint
*) dest
;
5125 for (i
= 0; i
< n
; i
++) {
5126 dst
[i
] = src
[i
] >> 8;
5130 /* XXX may want to add additional cases here someday */
5133 /* general case path follows */
5135 if (dstType
== GL_FLOAT
) {
5136 depthValues
= (GLfloat
*) dest
;
5139 depthValues
= depthTemp
;
5142 /* Convert incoming values to GLfloat. Some conversions will require
5147 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
5148 needClamp
= GL_TRUE
;
5150 case GL_UNSIGNED_BYTE
:
5151 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5154 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
5155 needClamp
= GL_TRUE
;
5157 case GL_UNSIGNED_SHORT
:
5158 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5161 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5162 needClamp
= GL_TRUE
;
5164 case GL_UNSIGNED_INT
:
5165 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5167 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5168 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5169 depthMax
== 0xffffff &&
5170 ctx
->Pixel
.DepthScale
== 1.0 &&
5171 ctx
->Pixel
.DepthBias
== 0.0) {
5172 const GLuint
*src
= (const GLuint
*) source
;
5173 GLuint
*zValues
= (GLuint
*) dest
;
5175 for (i
= 0; i
< n
; i
++) {
5176 GLuint value
= src
[i
];
5177 if (srcPacking
->SwapBytes
) {
5180 zValues
[i
] = value
& 0xffffff00;
5185 const GLuint
*src
= (const GLuint
*) source
;
5186 const GLfloat scale
= 1.0f
/ 0xffffff;
5188 for (i
= 0; i
< n
; i
++) {
5189 GLuint value
= src
[i
];
5190 if (srcPacking
->SwapBytes
) {
5193 depthValues
[i
] = (value
>> 8) * scale
;
5198 DEPTH_VALUES(GLfloat
, 1*);
5199 needClamp
= GL_TRUE
;
5201 case GL_HALF_FLOAT_ARB
:
5204 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5205 for (i
= 0; i
< n
; i
++) {
5206 GLhalfARB value
= src
[i
];
5207 if (srcPacking
->SwapBytes
) {
5210 depthValues
[i
] = _mesa_half_to_float(value
);
5212 needClamp
= GL_TRUE
;
5216 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5220 /* apply depth scale and bias */
5222 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5223 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5224 if (scale
!= 1.0 || bias
!= 0.0) {
5226 for (i
= 0; i
< n
; i
++) {
5227 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5229 needClamp
= GL_TRUE
;
5233 /* clamp to [0, 1] */
5236 for (i
= 0; i
< n
; i
++) {
5237 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5242 * Convert values to dstType
5244 if (dstType
== GL_UNSIGNED_INT
) {
5245 GLuint
*zValues
= (GLuint
*) dest
;
5247 if (depthMax
<= 0xffffff) {
5248 /* no overflow worries */
5249 for (i
= 0; i
< n
; i
++) {
5250 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5254 /* need to use double precision to prevent overflow problems */
5255 for (i
= 0; i
< n
; i
++) {
5256 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
5257 if (z
>= (GLdouble
) 0xffffffff)
5258 zValues
[i
] = 0xffffffff;
5260 zValues
[i
] = (GLuint
) z
;
5264 else if (dstType
== GL_UNSIGNED_SHORT
) {
5265 GLushort
*zValues
= (GLushort
*) dest
;
5267 ASSERT(depthMax
<= 0xffff);
5268 for (i
= 0; i
< n
; i
++) {
5269 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5273 ASSERT(dstType
== GL_FLOAT
);
5274 /*ASSERT(depthMax == 1.0F);*/
5280 * Pack an array of depth values. The values are floats in [0,1].
5283 _mesa_pack_depth_span( const GLcontext
*ctx
, GLuint n
, GLvoid
*dest
,
5284 GLenum dstType
, const GLfloat
*depthSpan
,
5285 const struct gl_pixelstore_attrib
*dstPacking
)
5287 GLfloat depthCopy
[MAX_WIDTH
];
5289 ASSERT(n
<= MAX_WIDTH
);
5291 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5292 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5293 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5294 depthSpan
= depthCopy
;
5298 case GL_UNSIGNED_BYTE
:
5300 GLubyte
*dst
= (GLubyte
*) dest
;
5302 for (i
= 0; i
< n
; i
++) {
5303 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5309 GLbyte
*dst
= (GLbyte
*) dest
;
5311 for (i
= 0; i
< n
; i
++) {
5312 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5316 case GL_UNSIGNED_SHORT
:
5318 GLushort
*dst
= (GLushort
*) dest
;
5320 for (i
= 0; i
< n
; i
++) {
5321 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5323 if (dstPacking
->SwapBytes
) {
5324 _mesa_swap2( (GLushort
*) dst
, n
);
5330 GLshort
*dst
= (GLshort
*) dest
;
5332 for (i
= 0; i
< n
; i
++) {
5333 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5335 if (dstPacking
->SwapBytes
) {
5336 _mesa_swap2( (GLushort
*) dst
, n
);
5340 case GL_UNSIGNED_INT
:
5342 GLuint
*dst
= (GLuint
*) dest
;
5344 for (i
= 0; i
< n
; i
++) {
5345 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5347 if (dstPacking
->SwapBytes
) {
5348 _mesa_swap4( (GLuint
*) dst
, n
);
5354 GLint
*dst
= (GLint
*) dest
;
5356 for (i
= 0; i
< n
; i
++) {
5357 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5359 if (dstPacking
->SwapBytes
) {
5360 _mesa_swap4( (GLuint
*) dst
, n
);
5366 GLfloat
*dst
= (GLfloat
*) dest
;
5368 for (i
= 0; i
< n
; i
++) {
5369 dst
[i
] = depthSpan
[i
];
5371 if (dstPacking
->SwapBytes
) {
5372 _mesa_swap4( (GLuint
*) dst
, n
);
5376 case GL_HALF_FLOAT_ARB
:
5378 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5380 for (i
= 0; i
< n
; i
++) {
5381 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5383 if (dstPacking
->SwapBytes
) {
5384 _mesa_swap2( (GLushort
*) dst
, n
);
5389 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5396 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5399 _mesa_pack_depth_stencil_span(const GLcontext
*ctx
, GLuint n
, GLuint
*dest
,
5400 const GLfloat
*depthVals
,
5401 const GLstencil
*stencilVals
,
5402 const struct gl_pixelstore_attrib
*dstPacking
)
5404 GLfloat depthCopy
[MAX_WIDTH
];
5405 GLstencil stencilCopy
[MAX_WIDTH
];
5408 ASSERT(n
<= MAX_WIDTH
);
5410 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5411 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5412 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5413 depthVals
= depthCopy
;
5416 if (ctx
->Pixel
.IndexShift
||
5417 ctx
->Pixel
.IndexOffset
||
5418 ctx
->Pixel
.MapStencilFlag
) {
5419 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5420 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5421 stencilVals
= stencilCopy
;
5424 for (i
= 0; i
< n
; i
++) {
5425 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5426 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5429 if (dstPacking
->SwapBytes
) {
5430 _mesa_swap4(dest
, n
);
5438 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5439 * Return all image data in a contiguous block. This is used when we
5440 * compile glDrawPixels, glTexImage, etc into a display list. We
5441 * need a copy of the data in a standard format.
5444 _mesa_unpack_image( GLuint dimensions
,
5445 GLsizei width
, GLsizei height
, GLsizei depth
,
5446 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5447 const struct gl_pixelstore_attrib
*unpack
)
5449 GLint bytesPerRow
, compsPerRow
;
5450 GLboolean flipBytes
, swap2
, swap4
;
5453 return NULL
; /* not necessarily an error */
5455 if (width
<= 0 || height
<= 0 || depth
<= 0)
5456 return NULL
; /* generate error later */
5458 if (type
== GL_BITMAP
) {
5459 bytesPerRow
= (width
+ 7) >> 3;
5460 flipBytes
= unpack
->LsbFirst
;
5461 swap2
= swap4
= GL_FALSE
;
5465 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5466 GLint components
= _mesa_components_in_format(format
);
5469 if (_mesa_type_is_packed(type
))
5472 if (bytesPerPixel
<= 0 || components
<= 0)
5473 return NULL
; /* bad format or type. generate error later */
5474 bytesPerRow
= bytesPerPixel
* width
;
5475 bytesPerComp
= bytesPerPixel
/ components
;
5476 flipBytes
= GL_FALSE
;
5477 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5478 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5479 compsPerRow
= components
* width
;
5480 assert(compsPerRow
>= width
);
5485 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5489 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5492 for (img
= 0; img
< depth
; img
++) {
5493 for (row
= 0; row
< height
; row
++) {
5494 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5495 width
, height
, format
, type
, img
, row
, 0);
5497 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5499 flipBytes
= GL_FALSE
;
5500 if (unpack
->LsbFirst
) {
5501 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5502 GLubyte dstMask
= 128;
5503 const GLubyte
*s
= src
;
5506 for (i
= 0; i
< width
; i
++) {
5510 if (srcMask
== 128) {
5515 srcMask
= srcMask
<< 1;
5523 dstMask
= dstMask
>> 1;
5528 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5529 GLubyte dstMask
= 128;
5530 const GLubyte
*s
= src
;
5533 for (i
= 0; i
< width
; i
++) {
5542 srcMask
= srcMask
>> 1;
5550 dstMask
= dstMask
>> 1;
5556 memcpy(dst
, src
, bytesPerRow
);
5559 /* byte flipping/swapping */
5561 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5564 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5567 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5576 #endif /* _HAVE_FULL_GL */
5581 * Convert an array of RGBA colors from one datatype to another.
5582 * NOTE: src may equal dst. In that case, we use a temporary buffer.
5585 _mesa_convert_colors(GLenum srcType
, const GLvoid
*src
,
5586 GLenum dstType
, GLvoid
*dst
,
5587 GLuint count
, const GLubyte mask
[])
5589 GLuint tempBuffer
[MAX_WIDTH
][4];
5590 const GLboolean useTemp
= (src
== dst
);
5592 ASSERT(srcType
!= dstType
);
5595 case GL_UNSIGNED_BYTE
:
5596 if (dstType
== GL_UNSIGNED_SHORT
) {
5597 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5598 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5600 for (i
= 0; i
< count
; i
++) {
5601 if (!mask
|| mask
[i
]) {
5602 dst2
[i
][RCOMP
] = UBYTE_TO_USHORT(src1
[i
][RCOMP
]);
5603 dst2
[i
][GCOMP
] = UBYTE_TO_USHORT(src1
[i
][GCOMP
]);
5604 dst2
[i
][BCOMP
] = UBYTE_TO_USHORT(src1
[i
][BCOMP
]);
5605 dst2
[i
][ACOMP
] = UBYTE_TO_USHORT(src1
[i
][ACOMP
]);
5609 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5612 const GLubyte (*src1
)[4] = (const GLubyte (*)[4]) src
;
5613 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5615 ASSERT(dstType
== GL_FLOAT
);
5616 for (i
= 0; i
< count
; i
++) {
5617 if (!mask
|| mask
[i
]) {
5618 dst4
[i
][RCOMP
] = UBYTE_TO_FLOAT(src1
[i
][RCOMP
]);
5619 dst4
[i
][GCOMP
] = UBYTE_TO_FLOAT(src1
[i
][GCOMP
]);
5620 dst4
[i
][BCOMP
] = UBYTE_TO_FLOAT(src1
[i
][BCOMP
]);
5621 dst4
[i
][ACOMP
] = UBYTE_TO_FLOAT(src1
[i
][ACOMP
]);
5625 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5628 case GL_UNSIGNED_SHORT
:
5629 if (dstType
== GL_UNSIGNED_BYTE
) {
5630 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5631 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5633 for (i
= 0; i
< count
; i
++) {
5634 if (!mask
|| mask
[i
]) {
5635 dst1
[i
][RCOMP
] = USHORT_TO_UBYTE(src2
[i
][RCOMP
]);
5636 dst1
[i
][GCOMP
] = USHORT_TO_UBYTE(src2
[i
][GCOMP
]);
5637 dst1
[i
][BCOMP
] = USHORT_TO_UBYTE(src2
[i
][BCOMP
]);
5638 dst1
[i
][ACOMP
] = USHORT_TO_UBYTE(src2
[i
][ACOMP
]);
5642 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5645 const GLushort (*src2
)[4] = (const GLushort (*)[4]) src
;
5646 GLfloat (*dst4
)[4] = (GLfloat (*)[4]) (useTemp
? tempBuffer
: dst
);
5648 ASSERT(dstType
== GL_FLOAT
);
5649 for (i
= 0; i
< count
; i
++) {
5650 if (!mask
|| mask
[i
]) {
5651 dst4
[i
][RCOMP
] = USHORT_TO_FLOAT(src2
[i
][RCOMP
]);
5652 dst4
[i
][GCOMP
] = USHORT_TO_FLOAT(src2
[i
][GCOMP
]);
5653 dst4
[i
][BCOMP
] = USHORT_TO_FLOAT(src2
[i
][BCOMP
]);
5654 dst4
[i
][ACOMP
] = USHORT_TO_FLOAT(src2
[i
][ACOMP
]);
5658 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLfloat
));
5662 if (dstType
== GL_UNSIGNED_BYTE
) {
5663 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5664 GLubyte (*dst1
)[4] = (GLubyte (*)[4]) (useTemp
? tempBuffer
: dst
);
5666 for (i
= 0; i
< count
; i
++) {
5667 if (!mask
|| mask
[i
]) {
5668 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][RCOMP
], src4
[i
][RCOMP
]);
5669 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][GCOMP
], src4
[i
][GCOMP
]);
5670 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][BCOMP
], src4
[i
][BCOMP
]);
5671 UNCLAMPED_FLOAT_TO_UBYTE(dst1
[i
][ACOMP
], src4
[i
][ACOMP
]);
5675 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLubyte
));
5678 const GLfloat (*src4
)[4] = (const GLfloat (*)[4]) src
;
5679 GLushort (*dst2
)[4] = (GLushort (*)[4]) (useTemp
? tempBuffer
: dst
);
5681 ASSERT(dstType
== GL_UNSIGNED_SHORT
);
5682 for (i
= 0; i
< count
; i
++) {
5683 if (!mask
|| mask
[i
]) {
5684 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][RCOMP
], src4
[i
][RCOMP
]);
5685 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][GCOMP
], src4
[i
][GCOMP
]);
5686 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][BCOMP
], src4
[i
][BCOMP
]);
5687 UNCLAMPED_FLOAT_TO_USHORT(dst2
[i
][ACOMP
], src4
[i
][ACOMP
]);
5691 memcpy(dst
, tempBuffer
, count
* 4 * sizeof(GLushort
));
5695 _mesa_problem(NULL
, "Invalid datatype in _mesa_convert_colors");
5703 * Perform basic clipping for glDrawPixels. The image's position and size
5704 * and the unpack SkipPixels and SkipRows are adjusted so that the image
5705 * region is entirely within the window and scissor bounds.
5706 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
5707 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
5708 * we'll actually write. Beforehand, *destY-1 is the first drawing row.
5710 * \return GL_TRUE if image is ready for drawing or
5711 * GL_FALSE if image was completely clipped away (draw nothing)
5714 _mesa_clip_drawpixels(const GLcontext
*ctx
,
5715 GLint
*destX
, GLint
*destY
,
5716 GLsizei
*width
, GLsizei
*height
,
5717 struct gl_pixelstore_attrib
*unpack
)
5719 const GLframebuffer
*buffer
= ctx
->DrawBuffer
;
5721 if (unpack
->RowLength
== 0) {
5722 unpack
->RowLength
= *width
;
5725 ASSERT(ctx
->Pixel
.ZoomX
== 1.0F
);
5726 ASSERT(ctx
->Pixel
.ZoomY
== 1.0F
|| ctx
->Pixel
.ZoomY
== -1.0F
);
5729 if (*destX
< buffer
->_Xmin
) {
5730 unpack
->SkipPixels
+= (buffer
->_Xmin
- *destX
);
5731 *width
-= (buffer
->_Xmin
- *destX
);
5732 *destX
= buffer
->_Xmin
;
5734 /* right clipping */
5735 if (*destX
+ *width
> buffer
->_Xmax
)
5736 *width
-= (*destX
+ *width
- buffer
->_Xmax
);
5741 if (ctx
->Pixel
.ZoomY
== 1.0F
) {
5742 /* bottom clipping */
5743 if (*destY
< buffer
->_Ymin
) {
5744 unpack
->SkipRows
+= (buffer
->_Ymin
- *destY
);
5745 *height
-= (buffer
->_Ymin
- *destY
);
5746 *destY
= buffer
->_Ymin
;
5749 if (*destY
+ *height
> buffer
->_Ymax
)
5750 *height
-= (*destY
+ *height
- buffer
->_Ymax
);
5752 else { /* upside down */
5754 if (*destY
> buffer
->_Ymax
) {
5755 unpack
->SkipRows
+= (*destY
- buffer
->_Ymax
);
5756 *height
-= (*destY
- buffer
->_Ymax
);
5757 *destY
= buffer
->_Ymax
;
5759 /* bottom clipping */
5760 if (*destY
- *height
< buffer
->_Ymin
)
5761 *height
-= (buffer
->_Ymin
- (*destY
- *height
));
5762 /* adjust destY so it's the first row to write to */
5774 * Perform clipping for glReadPixels. The image's window position
5775 * and size, and the pack skipPixels, skipRows and rowLength are adjusted
5776 * so that the image region is entirely within the window bounds.
5777 * Note: this is different from _mesa_clip_drawpixels() in that the
5778 * scissor box is ignored, and we use the bounds of the current readbuffer
5781 * \return GL_TRUE if image is ready for drawing or
5782 * GL_FALSE if image was completely clipped away (draw nothing)
5785 _mesa_clip_readpixels(const GLcontext
*ctx
,
5786 GLint
*srcX
, GLint
*srcY
,
5787 GLsizei
*width
, GLsizei
*height
,
5788 struct gl_pixelstore_attrib
*pack
)
5790 const GLframebuffer
*buffer
= ctx
->ReadBuffer
;
5792 if (pack
->RowLength
== 0) {
5793 pack
->RowLength
= *width
;
5798 pack
->SkipPixels
+= (0 - *srcX
);
5799 *width
-= (0 - *srcX
);
5802 /* right clipping */
5803 if (*srcX
+ *width
> (GLsizei
) buffer
->Width
)
5804 *width
-= (*srcX
+ *width
- buffer
->Width
);
5809 /* bottom clipping */
5811 pack
->SkipRows
+= (0 - *srcY
);
5812 *height
-= (0 - *srcY
);
5816 if (*srcY
+ *height
> (GLsizei
) buffer
->Height
)
5817 *height
-= (*srcY
+ *height
- buffer
->Height
);
5827 * Do clipping for a glCopyTexSubImage call.
5828 * The framebuffer source region might extend outside the framebuffer
5829 * bounds. Clip the source region against the framebuffer bounds and
5830 * adjust the texture/dest position and size accordingly.
5832 * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
5835 _mesa_clip_copytexsubimage(const GLcontext
*ctx
,
5836 GLint
*destX
, GLint
*destY
,
5837 GLint
*srcX
, GLint
*srcY
,
5838 GLsizei
*width
, GLsizei
*height
)
5840 const struct gl_framebuffer
*fb
= ctx
->ReadBuffer
;
5841 const GLint srcX0
= *srcX
, srcY0
= *srcY
;
5843 if (_mesa_clip_to_region(0, 0, fb
->Width
, fb
->Height
,
5844 srcX
, srcY
, width
, height
)) {
5845 *destX
= *destX
+ *srcX
- srcX0
;
5846 *destY
= *destY
+ *srcY
- srcY0
;
5858 * Clip the rectangle defined by (x, y, width, height) against the bounds
5859 * specified by [xmin, xmax) and [ymin, ymax).
5860 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
5863 _mesa_clip_to_region(GLint xmin
, GLint ymin
,
5864 GLint xmax
, GLint ymax
,
5866 GLsizei
*width
, GLsizei
*height
)
5870 *width
-= (xmin
- *x
);
5874 /* right clipping */
5875 if (*x
+ *width
> xmax
)
5876 *width
-= (*x
+ *width
- xmax
);
5881 /* bottom (or top) clipping */
5883 *height
-= (ymin
- *y
);
5887 /* top (or bottom) clipping */
5888 if (*y
+ *height
> ymax
)
5889 *height
-= (*y
+ *height
- ymax
);
5899 * Clip dst coords against Xmax (or Ymax).
5902 clip_right_or_top(GLint
*srcX0
, GLint
*srcX1
,
5903 GLint
*dstX0
, GLint
*dstX1
,
5908 if (*dstX1
> maxValue
) {
5909 /* X1 outside right edge */
5910 ASSERT(*dstX0
< maxValue
); /* X0 should be inside right edge */
5911 t
= (GLfloat
) (maxValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5912 /* chop off [t, 1] part */
5913 ASSERT(t
>= 0.0 && t
<= 1.0);
5915 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5916 *srcX1
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5918 else if (*dstX0
> maxValue
) {
5919 /* X0 outside right edge */
5920 ASSERT(*dstX1
< maxValue
); /* X1 should be inside right edge */
5921 t
= (GLfloat
) (maxValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5922 /* chop off [t, 1] part */
5923 ASSERT(t
>= 0.0 && t
<= 1.0);
5925 bias
= (*srcX0
< *srcX1
) ? -0.5F
: 0.5F
;
5926 *srcX0
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5932 * Clip dst coords against Xmin (or Ymin).
5935 clip_left_or_bottom(GLint
*srcX0
, GLint
*srcX1
,
5936 GLint
*dstX0
, GLint
*dstX1
,
5941 if (*dstX0
< minValue
) {
5942 /* X0 outside left edge */
5943 ASSERT(*dstX1
> minValue
); /* X1 should be inside left edge */
5944 t
= (GLfloat
) (minValue
- *dstX0
) / (GLfloat
) (*dstX1
- *dstX0
);
5945 /* chop off [0, t] part */
5946 ASSERT(t
>= 0.0 && t
<= 1.0);
5948 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
; /* flipped??? */
5949 *srcX0
= *srcX0
+ (GLint
) (t
* (*srcX1
- *srcX0
) + bias
);
5951 else if (*dstX1
< minValue
) {
5952 /* X1 outside left edge */
5953 ASSERT(*dstX0
> minValue
); /* X0 should be inside left edge */
5954 t
= (GLfloat
) (minValue
- *dstX1
) / (GLfloat
) (*dstX0
- *dstX1
);
5955 /* chop off [0, t] part */
5956 ASSERT(t
>= 0.0 && t
<= 1.0);
5958 bias
= (*srcX0
< *srcX1
) ? 0.5F
: -0.5F
;
5959 *srcX1
= *srcX1
+ (GLint
) (t
* (*srcX0
- *srcX1
) + bias
);
5965 * Do clipping of blit src/dest rectangles.
5966 * The dest rect is clipped against both the buffer bounds and scissor bounds.
5967 * The src rect is just clipped against the buffer bounds.
5969 * When either the src or dest rect is clipped, the other is also clipped
5972 * Note that X0 need not be less than X1 (same for Y) for either the source
5973 * and dest rects. That makes the clipping a little trickier.
5975 * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
5978 _mesa_clip_blit(GLcontext
*ctx
,
5979 GLint
*srcX0
, GLint
*srcY0
, GLint
*srcX1
, GLint
*srcY1
,
5980 GLint
*dstX0
, GLint
*dstY0
, GLint
*dstX1
, GLint
*dstY1
)
5982 const GLint srcXmin
= 0;
5983 const GLint srcXmax
= ctx
->ReadBuffer
->Width
;
5984 const GLint srcYmin
= 0;
5985 const GLint srcYmax
= ctx
->ReadBuffer
->Height
;
5987 /* these include scissor bounds */
5988 const GLint dstXmin
= ctx
->DrawBuffer
->_Xmin
;
5989 const GLint dstXmax
= ctx
->DrawBuffer
->_Xmax
;
5990 const GLint dstYmin
= ctx
->DrawBuffer
->_Ymin
;
5991 const GLint dstYmax
= ctx
->DrawBuffer
->_Ymax
;
5994 printf("PreClipX: src: %d .. %d dst: %d .. %d\n",
5995 *srcX0, *srcX1, *dstX0, *dstX1);
5996 printf("PreClipY: src: %d .. %d dst: %d .. %d\n",
5997 *srcY0, *srcY1, *dstY0, *dstY1);
6000 /* trivial rejection tests */
6001 if (*dstX0
== *dstX1
)
6002 return GL_FALSE
; /* no width */
6003 if (*dstX0
<= dstXmin
&& *dstX1
<= dstXmin
)
6004 return GL_FALSE
; /* totally out (left) of bounds */
6005 if (*dstX0
>= dstXmax
&& *dstX1
>= dstXmax
)
6006 return GL_FALSE
; /* totally out (right) of bounds */
6008 if (*dstY0
== *dstY1
)
6010 if (*dstY0
<= dstYmin
&& *dstY1
<= dstYmin
)
6012 if (*dstY0
>= dstYmax
&& *dstY1
>= dstYmax
)
6015 if (*srcX0
== *srcX1
)
6017 if (*srcX0
<= srcXmin
&& *srcX1
<= srcXmin
)
6019 if (*srcX0
>= srcXmax
&& *srcX1
>= srcXmax
)
6022 if (*srcY0
== *srcY1
)
6024 if (*srcY0
<= srcYmin
&& *srcY1
<= srcYmin
)
6026 if (*srcY0
>= srcYmax
&& *srcY1
>= srcYmax
)
6032 clip_right_or_top(srcX0
, srcX1
, dstX0
, dstX1
, dstXmax
);
6033 clip_right_or_top(srcY0
, srcY1
, dstY0
, dstY1
, dstYmax
);
6034 clip_left_or_bottom(srcX0
, srcX1
, dstX0
, dstX1
, dstXmin
);
6035 clip_left_or_bottom(srcY0
, srcY1
, dstY0
, dstY1
, dstYmin
);
6038 * src clip (just swap src/dst values from above)
6040 clip_right_or_top(dstX0
, dstX1
, srcX0
, srcX1
, srcXmax
);
6041 clip_right_or_top(dstY0
, dstY1
, srcY0
, srcY1
, srcYmax
);
6042 clip_left_or_bottom(dstX0
, dstX1
, srcX0
, srcX1
, srcXmin
);
6043 clip_left_or_bottom(dstY0
, dstY1
, srcY0
, srcY1
, srcYmin
);
6046 printf("PostClipX: src: %d .. %d dst: %d .. %d\n",
6047 *srcX0, *srcX1, *dstX0, *dstX1);
6048 printf("PostClipY: src: %d .. %d dst: %d .. %d\n",
6049 *srcY0, *srcY1, *dstY0, *dstY1);
6052 ASSERT(*dstX0
>= dstXmin
);
6053 ASSERT(*dstX0
<= dstXmax
);
6054 ASSERT(*dstX1
>= dstXmin
);
6055 ASSERT(*dstX1
<= dstXmax
);
6057 ASSERT(*dstY0
>= dstYmin
);
6058 ASSERT(*dstY0
<= dstYmax
);
6059 ASSERT(*dstY1
>= dstYmin
);
6060 ASSERT(*dstY1
<= dstYmax
);
6062 ASSERT(*srcX0
>= srcXmin
);
6063 ASSERT(*srcX0
<= srcXmax
);
6064 ASSERT(*srcX1
>= srcXmin
);
6065 ASSERT(*srcX1
<= srcXmax
);
6067 ASSERT(*srcY0
>= srcYmin
);
6068 ASSERT(*srcY0
<= srcYmax
);
6069 ASSERT(*srcY1
>= srcYmin
);
6070 ASSERT(*srcY1
<= srcYmax
);