1 /* $Id: image.c,v 1.42 2000/09/26 20:53:53 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
45 * These are the image packing parameters for Mesa's internal images.
46 * That is, _mesa_unpack_image() returns image data in this format.
47 * When we execute image commands (glDrawPixels, glTexImage, etc)
48 * from within display lists we have to be sure to set the current
49 * unpacking params to these values!
51 const struct gl_pixelstore_attrib _mesa_native_packing
= {
58 GL_FALSE
, /* SwapBytes */
59 GL_FALSE
/* LsbFirst */
65 * Flip the 8 bits in each byte of the given array.
67 * XXX try this trick to flip bytes someday:
68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
73 flip_bytes( GLubyte
*p
, GLuint n
)
75 register GLuint i
, a
, b
;
78 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
79 a
= ((b
& 0x01) << 7) |
93 * Flip the order of the 2 bytes in each word in the given array.
96 _mesa_swap2( GLushort
*p
, GLuint n
)
101 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
108 * Flip the order of the 4 bytes in each word in the given array.
111 _mesa_swap4( GLuint
*p
, GLuint n
)
113 register GLuint i
, a
, b
;
118 | ((b
>> 8) & 0xff00)
119 | ((b
<< 8) & 0xff0000)
120 | ((b
<< 24) & 0xff000000);
129 * Return the size, in bytes, of the given GL datatype.
130 * Return 0 if GL_BITMAP.
131 * Return -1 if invalid type enum.
133 GLint
_mesa_sizeof_type( GLenum type
)
138 case GL_UNSIGNED_BYTE
:
139 return sizeof(GLubyte
);
141 return sizeof(GLbyte
);
142 case GL_UNSIGNED_SHORT
:
143 return sizeof(GLushort
);
145 return sizeof(GLshort
);
146 case GL_UNSIGNED_INT
:
147 return sizeof(GLuint
);
149 return sizeof(GLint
);
151 return sizeof(GLfloat
);
159 * Same as _mesa_sizeof_packed_type() but we also accept the
160 * packed pixel format datatypes.
162 GLint
_mesa_sizeof_packed_type( GLenum type
)
167 case GL_UNSIGNED_BYTE
:
168 return sizeof(GLubyte
);
170 return sizeof(GLbyte
);
171 case GL_UNSIGNED_SHORT
:
172 return sizeof(GLushort
);
174 return sizeof(GLshort
);
175 case GL_UNSIGNED_INT
:
176 return sizeof(GLuint
);
178 return sizeof(GLint
);
180 return sizeof(GLfloat
);
181 case GL_UNSIGNED_BYTE_3_3_2
:
182 return sizeof(GLubyte
);
183 case GL_UNSIGNED_BYTE_2_3_3_REV
:
184 return sizeof(GLubyte
);
185 case GL_UNSIGNED_SHORT_5_6_5
:
186 return sizeof(GLshort
);
187 case GL_UNSIGNED_SHORT_5_6_5_REV
:
188 return sizeof(GLshort
);
189 case GL_UNSIGNED_SHORT_4_4_4_4
:
190 return sizeof(GLshort
);
191 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
192 return sizeof(GLshort
);
193 case GL_UNSIGNED_SHORT_5_5_5_1
:
194 return sizeof(GLshort
);
195 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
196 return sizeof(GLshort
);
197 case GL_UNSIGNED_INT_8_8_8_8
:
198 return sizeof(GLuint
);
199 case GL_UNSIGNED_INT_8_8_8_8_REV
:
200 return sizeof(GLuint
);
201 case GL_UNSIGNED_INT_10_10_10_2
:
202 return sizeof(GLuint
);
203 case GL_UNSIGNED_INT_2_10_10_10_REV
:
204 return sizeof(GLuint
);
213 * Return the number of components in a GL enum pixel type.
214 * Return -1 if bad format.
216 GLint
_mesa_components_in_format( GLenum format
)
220 case GL_COLOR_INDEX1_EXT
:
221 case GL_COLOR_INDEX2_EXT
:
222 case GL_COLOR_INDEX4_EXT
:
223 case GL_COLOR_INDEX8_EXT
:
224 case GL_COLOR_INDEX12_EXT
:
225 case GL_COLOR_INDEX16_EXT
:
226 case GL_STENCIL_INDEX
:
227 case GL_DEPTH_COMPONENT
:
235 case GL_LUMINANCE_ALPHA
:
254 * Return bytes per pixel for given format and type
255 * Return -1 if bad format or type.
257 GLint
_mesa_bytes_per_pixel( GLenum format
, GLenum type
)
259 GLint comps
= _mesa_components_in_format( format
);
265 return 0; /* special case */
267 case GL_UNSIGNED_BYTE
:
268 return comps
* sizeof(GLubyte
);
270 case GL_UNSIGNED_SHORT
:
271 return comps
* sizeof(GLshort
);
273 case GL_UNSIGNED_INT
:
274 return comps
* sizeof(GLint
);
276 return comps
* sizeof(GLfloat
);
277 case GL_UNSIGNED_BYTE_3_3_2
:
278 case GL_UNSIGNED_BYTE_2_3_3_REV
:
279 if (format
== GL_RGB
|| format
== GL_BGR
)
280 return sizeof(GLubyte
);
282 return -1; /* error */
283 case GL_UNSIGNED_SHORT_5_6_5
:
284 case GL_UNSIGNED_SHORT_5_6_5_REV
:
285 if (format
== GL_RGB
|| format
== GL_BGR
)
286 return sizeof(GLshort
);
288 return -1; /* error */
289 case GL_UNSIGNED_SHORT_4_4_4_4
:
290 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
291 case GL_UNSIGNED_SHORT_5_5_5_1
:
292 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
293 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
294 return sizeof(GLushort
);
297 case GL_UNSIGNED_INT_8_8_8_8
:
298 case GL_UNSIGNED_INT_8_8_8_8_REV
:
299 case GL_UNSIGNED_INT_10_10_10_2
:
300 case GL_UNSIGNED_INT_2_10_10_10_REV
:
301 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
302 return sizeof(GLuint
);
312 * Test if the given pixel format and type are legal.
313 * Return GL_TRUE for legal, GL_FALSE for illegal.
316 _mesa_is_legal_format_and_type( GLenum format
, GLenum type
)
320 case GL_STENCIL_INDEX
:
324 case GL_UNSIGNED_BYTE
:
326 case GL_UNSIGNED_SHORT
:
328 case GL_UNSIGNED_INT
:
340 case GL_LUMINANCE_ALPHA
:
341 case GL_DEPTH_COMPONENT
:
345 case GL_UNSIGNED_BYTE
:
347 case GL_UNSIGNED_SHORT
:
349 case GL_UNSIGNED_INT
:
358 case GL_UNSIGNED_BYTE
:
360 case GL_UNSIGNED_SHORT
:
362 case GL_UNSIGNED_INT
:
364 case GL_UNSIGNED_BYTE_3_3_2
:
365 case GL_UNSIGNED_BYTE_2_3_3_REV
:
366 case GL_UNSIGNED_SHORT_5_6_5
:
367 case GL_UNSIGNED_SHORT_5_6_5_REV
:
377 case GL_UNSIGNED_BYTE
:
379 case GL_UNSIGNED_SHORT
:
381 case GL_UNSIGNED_INT
:
383 case GL_UNSIGNED_SHORT_4_4_4_4
:
384 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
385 case GL_UNSIGNED_SHORT_5_5_5_1
:
386 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
387 case GL_UNSIGNED_INT_8_8_8_8
:
388 case GL_UNSIGNED_INT_8_8_8_8_REV
:
389 case GL_UNSIGNED_INT_10_10_10_2
:
390 case GL_UNSIGNED_INT_2_10_10_10_REV
:
404 * Return the address of a pixel in an image (actually a volume).
405 * Pixel unpacking/packing parameters are observed according to 'packing'.
406 * Input: image - start of image data
407 * width, height - size of image
408 * format - image format
409 * type - pixel component type
410 * packing - the pixelstore attributes
411 * img - which image in the volume (0 for 1D or 2D images)
412 * row, column - location of pixel in the image
413 * Return: address of pixel at (image,row,column) in image or NULL if error.
416 _mesa_image_address( const struct gl_pixelstore_attrib
*packing
,
417 const GLvoid
*image
, GLsizei width
,
418 GLsizei height
, GLenum format
, GLenum type
,
419 GLint img
, GLint row
, GLint column
)
421 GLint alignment
; /* 1, 2 or 4 */
422 GLint pixels_per_row
;
423 GLint rows_per_image
;
426 GLint skipimages
; /* for 3-D volume images */
429 alignment
= packing
->Alignment
;
430 if (packing
->RowLength
> 0) {
431 pixels_per_row
= packing
->RowLength
;
434 pixels_per_row
= width
;
436 if (packing
->ImageHeight
> 0) {
437 rows_per_image
= packing
->ImageHeight
;
440 rows_per_image
= height
;
442 skiprows
= packing
->SkipRows
;
443 skippixels
= packing
->SkipPixels
;
444 skipimages
= packing
->SkipImages
;
446 if (type
==GL_BITMAP
) {
448 GLint comp_per_pixel
; /* components per pixel */
449 GLint bytes_per_comp
; /* bytes per component */
451 GLint bytes_per_image
;
453 /* Compute bytes per component */
454 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
455 if (bytes_per_comp
<0) {
459 /* Compute number of components per pixel */
460 comp_per_pixel
= _mesa_components_in_format( format
);
461 if (comp_per_pixel
<0 && type
!= GL_BITMAP
) {
465 bytes_per_row
= alignment
466 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
468 bytes_per_image
= bytes_per_row
* rows_per_image
;
470 pixel_addr
= (GLubyte
*) image
471 + (skipimages
+ img
) * bytes_per_image
472 + (skiprows
+ row
) * bytes_per_row
473 + (skippixels
+ column
) / 8;
476 /* Non-BITMAP data */
477 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
479 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
481 /* The pixel type and format should have been error checked earlier */
482 assert(bytes_per_pixel
> 0);
484 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
485 remainder
= bytes_per_row
% alignment
;
487 bytes_per_row
+= (alignment
- remainder
);
489 ASSERT(bytes_per_row
% alignment
== 0);
491 bytes_per_image
= bytes_per_row
* rows_per_image
;
493 /* compute final pixel address */
494 pixel_addr
= (GLubyte
*) image
495 + (skipimages
+ img
) * bytes_per_image
496 + (skiprows
+ row
) * bytes_per_row
497 + (skippixels
+ column
) * bytes_per_pixel
;
500 return (GLvoid
*) pixel_addr
;
506 * Compute the stride between image rows (in bytes) for the given
507 * pixel packing parameters and image width, format and type.
510 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
511 GLint width
, GLenum format
, GLenum type
)
514 if (type
== GL_BITMAP
) {
516 if (packing
->RowLength
== 0) {
517 GLint bytes
= (width
+ 7) / 8;
521 GLint bytes
= (packing
->RowLength
+ 7) / 8;
526 /* Non-BITMAP data */
527 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
528 GLint bytesPerRow
, remainder
;
529 if (bytesPerPixel
<= 0)
530 return -1; /* error */
531 if (packing
->RowLength
== 0) {
532 bytesPerRow
= bytesPerPixel
* width
;
535 bytesPerRow
= bytesPerPixel
* packing
->RowLength
;
537 remainder
= bytesPerRow
% packing
->Alignment
;
539 bytesPerRow
+= (packing
->Alignment
- remainder
);
547 * Unpack a 32x32 pixel polygon stipple from user memory using the
548 * current pixel unpack settings.
551 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
552 const struct gl_pixelstore_attrib
*unpacking
)
554 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap( 32, 32, pattern
, unpacking
);
556 /* Convert pattern from GLubytes to GLuints and handle big/little
561 for (i
= 0; i
< 32; i
++) {
562 dest
[i
] = (p
[0] << 24)
575 * Pack polygon stipple into user memory given current pixel packing
579 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
580 const struct gl_pixelstore_attrib
*packing
)
582 /* Convert pattern from GLuints to GLubytes to handle big/little
583 * endian differences.
587 for (i
= 0; i
< 32; i
++) {
588 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
589 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
590 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
591 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
594 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
600 * Pack the given RGBA span into client memory at 'dest' address
601 * in the given pixel format and type.
602 * Optionally apply the enabled pixel transfer ops.
603 * Pack into memory using the given packing params struct.
604 * This is used by glReadPixels and glGetTexImage?D()
605 * Input: ctx - the context
606 * n - number of pixels in the span
608 * format - dest packing format
609 * type - dest packing datatype
610 * destination - destination packing address
611 * packing - pixel packing parameters
612 * transferOps - bitmask of IMAGE_*_BIT operations to apply
615 _mesa_pack_rgba_span( GLcontext
*ctx
,
616 GLuint n
, CONST GLubyte srcRgba
[][4],
617 GLenum dstFormat
, GLenum dstType
,
619 const struct gl_pixelstore_attrib
*dstPacking
,
622 ASSERT(ctx
->ImageTransferState
!= UPDATE_IMAGE_TRANSFER_STATE
);
624 /* Test for optimized case first */
625 if (transferOps
== 0 && dstFormat
== GL_RGBA
626 && dstType
== GL_UNSIGNED_BYTE
) {
627 /* common simple case */
628 MEMCPY(dstAddr
, srcRgba
, n
* 4 * sizeof(GLubyte
));
630 else if (transferOps
== 0 && dstFormat
== GL_RGB
631 && dstType
== GL_UNSIGNED_BYTE
) {
632 /* common simple case */
634 GLubyte
*dest
= (GLubyte
*) dstAddr
;
635 for (i
= 0; i
< n
; i
++) {
636 dest
[0] = srcRgba
[i
][RCOMP
];
637 dest
[1] = srcRgba
[i
][GCOMP
];
638 dest
[2] = srcRgba
[i
][BCOMP
];
643 /* general solution */
644 GLfloat rgba
[MAX_WIDTH
][4];
645 const GLfloat rscale
= 1.0F
/ 255.0F
;
646 const GLfloat gscale
= 1.0F
/ 255.0F
;
647 const GLfloat bscale
= 1.0F
/ 255.0F
;
648 const GLfloat ascale
= 1.0F
/ 255.0F
;
650 assert(n
<= MAX_WIDTH
);
651 /* convert color components to floating point */
653 rgba
[i
][RCOMP
] = srcRgba
[i
][RCOMP
] * rscale
;
654 rgba
[i
][GCOMP
] = srcRgba
[i
][GCOMP
] * gscale
;
655 rgba
[i
][BCOMP
] = srcRgba
[i
][BCOMP
] * bscale
;
656 rgba
[i
][ACOMP
] = srcRgba
[i
][ACOMP
] * ascale
;
658 _mesa_pack_float_rgba_span(ctx
, n
, (const GLfloat (*)[4]) rgba
,
659 dstFormat
, dstType
, dstAddr
,
660 dstPacking
, transferOps
);
666 _mesa_pack_float_rgba_span( GLcontext
*ctx
,
667 GLuint n
, CONST GLfloat rgbaIn
[][4],
668 GLenum dstFormat
, GLenum dstType
,
670 const struct gl_pixelstore_attrib
*dstPacking
,
673 const GLint comps
= _mesa_components_in_format(dstFormat
);
674 GLfloat luminance
[MAX_WIDTH
];
679 /* make copy of incoming data */
680 GLfloat rgbaCopy
[MAX_WIDTH
][4];
681 for (i
= 0; i
< n
; i
++) {
682 rgbaCopy
[i
][0] = rgbaIn
[i
][0];
683 rgbaCopy
[i
][1] = rgbaIn
[i
][1];
684 rgbaCopy
[i
][2] = rgbaIn
[i
][2];
685 rgbaCopy
[i
][3] = rgbaIn
[i
][3];
688 rgba
= (GLfloat (*)[4]) rgbaCopy
;
691 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
692 _mesa_scale_and_bias_rgba( ctx
, n
, rgba
);
694 /* color map lookup */
695 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
696 _mesa_map_rgba( ctx
, n
, rgba
);
698 /* GL_COLOR_TABLE lookup */
699 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
700 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
703 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
704 /* this has to be done in the calling code */
706 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
707 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
708 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
710 /* color matrix transform */
711 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
712 _mesa_transform_rgba(ctx
, n
, rgba
);
714 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
715 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
716 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
718 /* update histogram count */
719 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
720 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
723 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
724 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
725 if (ctx
->MinMax
.Sink
)
730 /* use incoming data, not a copy */
731 rgba
= (GLfloat (*)[4]) rgbaIn
;
734 /* XXX clamp rgba to [0,1]? */
737 if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
738 for (i
= 0; i
< n
; i
++) {
739 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
740 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
745 * Pack/store the pixels. Ugh! Lots of cases!!!
748 case GL_UNSIGNED_BYTE
:
750 GLubyte
*dst
= (GLubyte
*) dstAddr
;
754 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
758 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
762 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
766 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
770 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
772 case GL_LUMINANCE_ALPHA
:
774 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
775 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
780 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
781 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
782 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
787 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
788 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
789 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
790 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
795 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
796 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
797 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
802 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
803 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
804 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
805 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
810 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
811 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
812 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
813 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
817 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
823 GLbyte
*dst
= (GLbyte
*) dstAddr
;
827 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
831 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
835 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
839 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
843 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
845 case GL_LUMINANCE_ALPHA
:
847 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
848 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
853 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
854 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
855 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
860 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
861 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
862 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
863 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
868 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
869 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
870 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
875 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
876 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
877 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
878 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
882 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
883 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
884 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
885 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
889 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
893 case GL_UNSIGNED_SHORT
:
895 GLushort
*dst
= (GLushort
*) dstAddr
;
899 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
903 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
907 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
911 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
915 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
917 case GL_LUMINANCE_ALPHA
:
919 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
920 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
925 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
926 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
927 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
932 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
933 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
934 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
935 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
940 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
941 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
942 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
947 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
948 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
949 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
950 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
955 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
956 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
957 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
958 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
962 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
964 if (dstPacking
->SwapBytes
) {
965 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
971 GLshort
*dst
= (GLshort
*) dstAddr
;
975 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
979 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
983 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
987 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
991 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
993 case GL_LUMINANCE_ALPHA
:
995 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
996 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1001 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1002 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1003 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1008 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1009 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1010 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1011 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1016 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1017 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1018 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1023 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1024 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1025 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1026 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1030 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1031 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1032 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1033 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1037 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1039 if (dstPacking
->SwapBytes
) {
1040 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1044 case GL_UNSIGNED_INT
:
1046 GLuint
*dst
= (GLuint
*) dstAddr
;
1047 switch (dstFormat
) {
1050 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1054 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1058 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1062 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1066 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1068 case GL_LUMINANCE_ALPHA
:
1070 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1071 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1076 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1077 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1078 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1083 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1084 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1085 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1086 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1091 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1092 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1093 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1098 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1099 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1100 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1101 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1106 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1107 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1108 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1109 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1113 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1115 if (dstPacking
->SwapBytes
) {
1116 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1122 GLint
*dst
= (GLint
*) dstAddr
;
1123 switch (dstFormat
) {
1126 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1130 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1134 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1138 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1142 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1144 case GL_LUMINANCE_ALPHA
:
1146 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1147 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1152 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1153 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1154 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1159 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1160 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1161 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1162 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1167 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1168 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1169 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1174 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1175 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1176 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1177 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1182 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1183 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1184 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1185 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1189 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1191 if (dstPacking
->SwapBytes
) {
1192 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1198 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1199 switch (dstFormat
) {
1202 dst
[i
] = rgba
[i
][RCOMP
];
1206 dst
[i
] = rgba
[i
][GCOMP
];
1210 dst
[i
] = rgba
[i
][BCOMP
];
1214 dst
[i
] = rgba
[i
][ACOMP
];
1218 dst
[i
] = luminance
[i
];
1220 case GL_LUMINANCE_ALPHA
:
1222 dst
[i
*2+0] = luminance
[i
];
1223 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1228 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1229 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1230 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1235 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1236 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1237 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1238 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1243 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1244 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1245 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1250 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1251 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1252 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1253 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1258 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1259 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1260 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1261 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1265 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1267 if (dstPacking
->SwapBytes
) {
1268 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1272 case GL_UNSIGNED_BYTE_3_3_2
:
1273 if (dstFormat
== GL_RGB
) {
1274 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1276 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1277 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1278 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1282 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1283 if (dstFormat
== GL_RGB
) {
1284 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1286 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1287 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1288 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1292 case GL_UNSIGNED_SHORT_5_6_5
:
1293 if (dstFormat
== GL_RGB
) {
1294 GLushort
*dst
= (GLushort
*) dstAddr
;
1296 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1297 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1298 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1302 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1303 if (dstFormat
== GL_RGB
) {
1304 GLushort
*dst
= (GLushort
*) dstAddr
;
1306 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1307 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1308 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1312 case GL_UNSIGNED_SHORT_4_4_4_4
:
1313 if (dstFormat
== GL_RGBA
) {
1314 GLushort
*dst
= (GLushort
*) dstAddr
;
1316 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1317 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1318 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1319 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1322 else if (dstFormat
== GL_BGRA
) {
1323 GLushort
*dst
= (GLushort
*) dstAddr
;
1325 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 12)
1326 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1327 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 4)
1328 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1331 else if (dstFormat
== GL_ABGR_EXT
) {
1332 GLushort
*dst
= (GLushort
*) dstAddr
;
1334 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 4)
1335 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1336 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 12)
1337 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) );
1341 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1342 if (dstFormat
== GL_RGBA
) {
1343 GLushort
*dst
= (GLushort
*) dstAddr
;
1345 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1346 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1347 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1348 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1351 else if (dstFormat
== GL_BGRA
) {
1352 GLushort
*dst
= (GLushort
*) dstAddr
;
1354 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) )
1355 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1356 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 8)
1357 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1360 else if (dstFormat
== GL_ABGR_EXT
) {
1361 GLushort
*dst
= (GLushort
*) dstAddr
;
1363 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) )
1364 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1365 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1366 | (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12);
1370 case GL_UNSIGNED_SHORT_5_5_5_1
:
1371 if (dstFormat
== GL_RGBA
) {
1372 GLushort
*dst
= (GLushort
*) dstAddr
;
1374 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1375 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1376 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1377 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1380 else if (dstFormat
== GL_BGRA
) {
1381 GLushort
*dst
= (GLushort
*) dstAddr
;
1383 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11)
1384 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1385 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 1)
1386 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1389 else if (dstFormat
== GL_ABGR_EXT
) {
1390 GLushort
*dst
= (GLushort
*) dstAddr
;
1392 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) << 11)
1393 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 6)
1394 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 1)
1395 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) );
1399 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1400 if (dstFormat
== GL_RGBA
) {
1401 GLushort
*dst
= (GLushort
*) dstAddr
;
1403 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1404 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1405 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1406 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1409 else if (dstFormat
== GL_BGRA
) {
1410 GLushort
*dst
= (GLushort
*) dstAddr
;
1412 dst
[i
] = (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) )
1413 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1414 | (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 10)
1415 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1418 else if (dstFormat
== GL_ABGR_EXT
) {
1419 GLushort
*dst
= (GLushort
*) dstAddr
;
1421 dst
[i
] = (((GLint
) (rgba
[i
][ACOMP
] * 31.0F
)) )
1422 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 5)
1423 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 10)
1424 | (((GLint
) (rgba
[i
][RCOMP
] * 1.0F
)) << 15);
1428 case GL_UNSIGNED_INT_8_8_8_8
:
1429 if (dstFormat
== GL_RGBA
) {
1430 GLuint
*dst
= (GLuint
*) dstAddr
;
1432 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1433 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1434 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1435 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1438 else if (dstFormat
== GL_BGRA
) {
1439 GLuint
*dst
= (GLuint
*) dstAddr
;
1441 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1442 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1443 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1444 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1447 else if (dstFormat
== GL_ABGR_EXT
) {
1448 GLuint
*dst
= (GLuint
*) dstAddr
;
1450 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1451 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1452 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1453 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1457 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1458 if (dstFormat
== GL_RGBA
) {
1459 GLuint
*dst
= (GLuint
*) dstAddr
;
1461 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1462 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1463 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1464 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1467 else if (dstFormat
== GL_BGRA
) {
1468 GLuint
*dst
= (GLuint
*) dstAddr
;
1470 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1471 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1472 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1473 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1476 else if (dstFormat
== GL_ABGR_EXT
) {
1477 GLuint
*dst
= (GLuint
*) dstAddr
;
1479 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1480 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1481 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1482 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1486 case GL_UNSIGNED_INT_10_10_10_2
:
1487 if (dstFormat
== GL_RGBA
) {
1488 GLuint
*dst
= (GLuint
*) dstAddr
;
1490 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1491 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1492 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1493 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1496 else if (dstFormat
== GL_BGRA
) {
1497 GLuint
*dst
= (GLuint
*) dstAddr
;
1499 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1500 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1501 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1502 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1505 else if (dstFormat
== GL_ABGR_EXT
) {
1506 GLuint
*dst
= (GLuint
*) dstAddr
;
1508 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1509 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1510 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1511 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1515 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1516 if (dstFormat
== GL_RGBA
) {
1517 GLuint
*dst
= (GLuint
*) dstAddr
;
1519 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1520 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1521 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1522 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1525 else if (dstFormat
== GL_BGRA
) {
1526 GLuint
*dst
= (GLuint
*) dstAddr
;
1528 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1529 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1530 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1531 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1534 else if (dstFormat
== GL_ABGR_EXT
) {
1535 GLuint
*dst
= (GLuint
*) dstAddr
;
1537 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1538 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1539 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1540 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1545 gl_problem(ctx
, "bad type in _mesa_pack_float_rgba_span");
1551 #define SWAP2BYTE(VALUE) \
1553 GLubyte *bytes = (GLubyte *) &(VALUE); \
1554 GLubyte tmp = bytes[0]; \
1555 bytes[0] = bytes[1]; \
1559 #define SWAP4BYTE(VALUE) \
1561 GLubyte *bytes = (GLubyte *) &(VALUE); \
1562 GLubyte tmp = bytes[0]; \
1563 bytes[0] = bytes[3]; \
1566 bytes[1] = bytes[2]; \
1572 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1573 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1574 const struct gl_pixelstore_attrib
*unpack
)
1576 assert(srcFormat
== GL_COLOR_INDEX
);
1578 ASSERT(srcType
== GL_BITMAP
||
1579 srcType
== GL_UNSIGNED_BYTE
||
1580 srcType
== GL_BYTE
||
1581 srcType
== GL_UNSIGNED_SHORT
||
1582 srcType
== GL_SHORT
||
1583 srcType
== GL_UNSIGNED_INT
||
1584 srcType
== GL_INT
||
1585 srcType
== GL_FLOAT
);
1590 GLubyte
*ubsrc
= (GLubyte
*) src
;
1591 if (unpack
->LsbFirst
) {
1592 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1594 for (i
= 0; i
< n
; i
++) {
1595 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1606 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1608 for (i
= 0; i
< n
; i
++) {
1609 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1621 case GL_UNSIGNED_BYTE
:
1624 const GLubyte
*s
= (const GLubyte
*) src
;
1625 for (i
= 0; i
< n
; i
++)
1632 const GLbyte
*s
= (const GLbyte
*) src
;
1633 for (i
= 0; i
< n
; i
++)
1637 case GL_UNSIGNED_SHORT
:
1640 const GLushort
*s
= (const GLushort
*) src
;
1641 if (unpack
->SwapBytes
) {
1642 for (i
= 0; i
< n
; i
++) {
1643 GLushort value
= s
[i
];
1649 for (i
= 0; i
< n
; i
++)
1657 const GLshort
*s
= (const GLshort
*) src
;
1658 if (unpack
->SwapBytes
) {
1659 for (i
= 0; i
< n
; i
++) {
1660 GLshort value
= s
[i
];
1666 for (i
= 0; i
< n
; i
++)
1671 case GL_UNSIGNED_INT
:
1674 const GLuint
*s
= (const GLuint
*) src
;
1675 if (unpack
->SwapBytes
) {
1676 for (i
= 0; i
< n
; i
++) {
1677 GLuint value
= s
[i
];
1683 for (i
= 0; i
< n
; i
++)
1691 const GLint
*s
= (const GLint
*) src
;
1692 if (unpack
->SwapBytes
) {
1693 for (i
= 0; i
< n
; i
++) {
1700 for (i
= 0; i
< n
; i
++)
1708 const GLfloat
*s
= (const GLfloat
*) src
;
1709 if (unpack
->SwapBytes
) {
1710 for (i
= 0; i
< n
; i
++) {
1711 GLfloat value
= s
[i
];
1713 indexes
[i
] = (GLuint
) value
;
1717 for (i
= 0; i
< n
; i
++)
1718 indexes
[i
] = (GLuint
) s
[i
];
1723 gl_problem(NULL
, "bad srcType in extract_uint_indexes");
1731 * This function extracts floating point RGBA values from arbitrary
1732 * image data. srcFormat and srcType are the format and type parameters
1733 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1735 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1736 * implements the "Conversion to floating point", "Conversion to RGB",
1737 * and "Final Expansion to RGBA" operations.
1739 * Args: n - number of pixels
1740 * rgba - output colors
1741 * srcFormat - format of incoming data
1742 * srcType - datatype of incoming data
1743 * src - source data pointer
1744 * swapBytes - perform byteswapping of incoming data?
1747 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
1748 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1749 GLboolean swapBytes
)
1751 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
1753 GLint rComp
, bComp
, gComp
, aComp
;
1755 ASSERT(srcFormat
== GL_RED
||
1756 srcFormat
== GL_GREEN
||
1757 srcFormat
== GL_BLUE
||
1758 srcFormat
== GL_ALPHA
||
1759 srcFormat
== GL_LUMINANCE
||
1760 srcFormat
== GL_LUMINANCE_ALPHA
||
1761 srcFormat
== GL_INTENSITY
||
1762 srcFormat
== GL_RGB
||
1763 srcFormat
== GL_BGR
||
1764 srcFormat
== GL_RGBA
||
1765 srcFormat
== GL_BGRA
||
1766 srcFormat
== GL_ABGR_EXT
);
1768 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
1769 srcType
== GL_BYTE
||
1770 srcType
== GL_UNSIGNED_SHORT
||
1771 srcType
== GL_SHORT
||
1772 srcType
== GL_UNSIGNED_INT
||
1773 srcType
== GL_INT
||
1774 srcType
== GL_FLOAT
||
1775 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
1776 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
1777 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
1778 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
1779 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
1780 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
1781 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
1782 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
1783 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
1784 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
1785 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
1786 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
1788 rComp
= gComp
= bComp
= aComp
= -1;
1790 switch (srcFormat
) {
1793 greenIndex
= blueIndex
= alphaIndex
= -1;
1798 redIndex
= blueIndex
= alphaIndex
= -1;
1803 redIndex
= greenIndex
= alphaIndex
= -1;
1807 redIndex
= greenIndex
= blueIndex
= -1;
1812 redIndex
= greenIndex
= blueIndex
= 0;
1816 case GL_LUMINANCE_ALPHA
:
1817 redIndex
= greenIndex
= blueIndex
= 0;
1823 greenIndex
= blueIndex
= alphaIndex
= -1;
1874 gl_problem(NULL
, "bad srcFormat in extract float data");
1879 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
1880 if ((INDEX) < 0) { \
1882 for (i = 0; i < n; i++) { \
1883 rgba[i][CHANNEL] = DEFAULT; \
1886 else if (swapBytes) { \
1887 const TYPE *s = (const TYPE *) src; \
1889 for (i = 0; i < n; i++) { \
1890 TYPE value = s[INDEX]; \
1891 if (sizeof(TYPE) == 2) { \
1894 else if (sizeof(TYPE) == 4) { \
1897 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
1902 const TYPE *s = (const TYPE *) src; \
1904 for (i = 0; i < n; i++) { \
1905 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
1911 case GL_UNSIGNED_BYTE
:
1912 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1913 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1914 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1915 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1918 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1919 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1920 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1921 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
1923 case GL_UNSIGNED_SHORT
:
1924 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1925 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1926 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1927 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
1930 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1931 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1932 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1933 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
1935 case GL_UNSIGNED_INT
:
1936 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1937 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1938 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1939 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
1942 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1943 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1944 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1945 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
1948 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1949 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1950 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1951 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
1953 case GL_UNSIGNED_BYTE_3_3_2
:
1955 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
1957 for (i
= 0; i
< n
; i
++) {
1958 GLubyte p
= ubsrc
[i
];
1959 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
1960 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
1961 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
1962 rgba
[i
][ACOMP
] = 1.0F
;
1966 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1968 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
1970 for (i
= 0; i
< n
; i
++) {
1971 GLubyte p
= ubsrc
[i
];
1972 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
1973 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
1974 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
1975 rgba
[i
][ACOMP
] = 1.0F
;
1979 case GL_UNSIGNED_SHORT_5_6_5
:
1981 const GLushort
*ussrc
= (const GLushort
*) src
;
1983 for (i
= 0; i
< n
; i
++) {
1984 GLushort p
= ussrc
[i
];
1986 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1987 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1988 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1989 rgba
[i
][ACOMP
] = 1.0F
;
1993 const GLushort
*ussrc
= (const GLushort
*) src
;
1995 for (i
= 0; i
< n
; i
++) {
1996 GLushort p
= ussrc
[i
];
1997 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1998 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1999 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2000 rgba
[i
][ACOMP
] = 1.0F
;
2004 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2006 const GLushort
*ussrc
= (const GLushort
*) src
;
2008 for (i
= 0; i
< n
; i
++) {
2009 GLushort p
= ussrc
[i
];
2011 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2012 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2013 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2014 rgba
[i
][ACOMP
] = 1.0F
;
2018 const GLushort
*ussrc
= (const GLushort
*) src
;
2020 for (i
= 0; i
< n
; i
++) {
2021 GLushort p
= ussrc
[i
];
2022 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2023 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
2024 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2025 rgba
[i
][ACOMP
] = 1.0F
;
2029 case GL_UNSIGNED_SHORT_4_4_4_4
:
2031 const GLushort
*ussrc
= (const GLushort
*) src
;
2033 for (i
= 0; i
< n
; i
++) {
2034 GLushort p
= ussrc
[i
];
2036 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2037 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2038 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2039 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2043 const GLushort
*ussrc
= (const GLushort
*) src
;
2045 for (i
= 0; i
< n
; i
++) {
2046 GLushort p
= ussrc
[i
];
2047 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2048 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2049 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2050 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2054 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2056 const GLushort
*ussrc
= (const GLushort
*) src
;
2058 for (i
= 0; i
< n
; i
++) {
2059 GLushort p
= ussrc
[i
];
2061 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2062 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2063 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2064 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2068 const GLushort
*ussrc
= (const GLushort
*) src
;
2070 for (i
= 0; i
< n
; i
++) {
2071 GLushort p
= ussrc
[i
];
2072 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
2073 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
2074 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
2075 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
2079 case GL_UNSIGNED_SHORT_5_5_5_1
:
2081 const GLushort
*ussrc
= (const GLushort
*) src
;
2083 for (i
= 0; i
< n
; i
++) {
2084 GLushort p
= ussrc
[i
];
2086 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2087 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2088 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2089 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2093 const GLushort
*ussrc
= (const GLushort
*) src
;
2095 for (i
= 0; i
< n
; i
++) {
2096 GLushort p
= ussrc
[i
];
2097 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
2098 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
2099 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
2100 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
2104 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2106 const GLushort
*ussrc
= (const GLushort
*) src
;
2108 for (i
= 0; i
< n
; i
++) {
2109 GLushort p
= ussrc
[i
];
2111 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2112 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2113 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2114 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2118 const GLushort
*ussrc
= (const GLushort
*) src
;
2120 for (i
= 0; i
< n
; i
++) {
2121 GLushort p
= ussrc
[i
];
2122 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2123 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2124 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2125 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2129 case GL_UNSIGNED_INT_8_8_8_8
:
2131 const GLuint
*uisrc
= (const GLuint
*) src
;
2133 for (i
= 0; i
< n
; i
++) {
2134 GLuint p
= uisrc
[i
];
2135 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2136 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2137 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2138 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2142 const GLuint
*uisrc
= (const GLuint
*) src
;
2144 for (i
= 0; i
< n
; i
++) {
2145 GLuint p
= uisrc
[i
];
2146 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2147 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2148 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2149 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2153 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2155 const GLuint
*uisrc
= (const GLuint
*) src
;
2157 for (i
= 0; i
< n
; i
++) {
2158 GLuint p
= uisrc
[i
];
2159 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2160 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2161 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2162 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2166 const GLuint
*uisrc
= (const GLuint
*) src
;
2168 for (i
= 0; i
< n
; i
++) {
2169 GLuint p
= uisrc
[i
];
2170 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2171 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2172 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2173 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2177 case GL_UNSIGNED_INT_10_10_10_2
:
2179 const GLuint
*uisrc
= (const GLuint
*) src
;
2181 for (i
= 0; i
< n
; i
++) {
2182 GLuint p
= uisrc
[i
];
2184 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2185 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2186 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2187 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2191 const GLuint
*uisrc
= (const GLuint
*) src
;
2193 for (i
= 0; i
< n
; i
++) {
2194 GLuint p
= uisrc
[i
];
2195 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2196 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2197 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2198 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2202 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2204 const GLuint
*uisrc
= (const GLuint
*) src
;
2206 for (i
= 0; i
< n
; i
++) {
2207 GLuint p
= uisrc
[i
];
2209 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2210 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2211 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2212 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2216 const GLuint
*uisrc
= (const GLuint
*) src
;
2218 for (i
= 0; i
< n
; i
++) {
2219 GLuint p
= uisrc
[i
];
2220 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2221 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2222 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2223 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2228 gl_problem(NULL
, "bad srcType in extract float data");
2236 * Unpack a row of color image data from a client buffer according to
2237 * the pixel unpacking parameters.
2238 * Return GLubyte values in the specified dest image format.
2239 * This is (or will be) used by glDrawPixels and glTexImage?D().
2240 * Input: ctx - the context
2241 * n - number of pixels in the span
2242 * dstFormat - format of destination color array
2243 * dest - the destination color array
2244 * srcFormat - source image format
2245 * srcType - source image datatype
2246 * source - source image pointer
2247 * srcPacking - pixel unpacking parameters
2248 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2250 * XXX perhaps expand this to process whole images someday.
2253 _mesa_unpack_ubyte_color_span( GLcontext
*ctx
,
2254 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
2255 GLenum srcFormat
, GLenum srcType
,
2256 const GLvoid
*source
,
2257 const struct gl_pixelstore_attrib
*srcPacking
,
2258 GLuint transferOps
)
2260 ASSERT(dstFormat
== GL_ALPHA
||
2261 dstFormat
== GL_LUMINANCE
||
2262 dstFormat
== GL_LUMINANCE_ALPHA
||
2263 dstFormat
== GL_INTENSITY
||
2264 dstFormat
== GL_RGB
||
2265 dstFormat
== GL_RGBA
||
2266 dstFormat
== GL_COLOR_INDEX
);
2268 ASSERT(srcFormat
== GL_RED
||
2269 srcFormat
== GL_GREEN
||
2270 srcFormat
== GL_BLUE
||
2271 srcFormat
== GL_ALPHA
||
2272 srcFormat
== GL_LUMINANCE
||
2273 srcFormat
== GL_LUMINANCE_ALPHA
||
2274 srcFormat
== GL_INTENSITY
||
2275 srcFormat
== GL_RGB
||
2276 srcFormat
== GL_BGR
||
2277 srcFormat
== GL_RGBA
||
2278 srcFormat
== GL_BGRA
||
2279 srcFormat
== GL_ABGR_EXT
||
2280 srcFormat
== GL_COLOR_INDEX
);
2282 ASSERT(srcType
== GL_BITMAP
||
2283 srcType
== GL_UNSIGNED_BYTE
||
2284 srcType
== GL_BYTE
||
2285 srcType
== GL_UNSIGNED_SHORT
||
2286 srcType
== GL_SHORT
||
2287 srcType
== GL_UNSIGNED_INT
||
2288 srcType
== GL_INT
||
2289 srcType
== GL_FLOAT
||
2290 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2291 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2292 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2293 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2294 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2295 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2296 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2297 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2298 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2299 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2300 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2301 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2303 /* this is intended for RGBA mode only */
2304 assert(ctx
->Visual
.RGBAflag
);
2306 /* Try simple cases first */
2307 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
) {
2308 if (dstFormat
== GL_RGBA
) {
2309 if (srcFormat
== GL_RGBA
) {
2310 MEMCPY( dest
, source
, n
* 4 * sizeof(GLubyte
) );
2313 else if (srcFormat
== GL_RGB
) {
2315 const GLubyte
*src
= (const GLubyte
*) source
;
2316 GLubyte
*dst
= dest
;
2317 for (i
= 0; i
< n
; i
++) {
2328 else if (dstFormat
== GL_RGB
) {
2329 if (srcFormat
== GL_RGB
) {
2330 MEMCPY( dest
, source
, n
* 3 * sizeof(GLubyte
) );
2333 else if (srcFormat
== GL_RGBA
) {
2335 const GLubyte
*src
= (const GLubyte
*) source
;
2336 GLubyte
*dst
= dest
;
2337 for (i
= 0; i
< n
; i
++) {
2347 else if (dstFormat
== srcFormat
) {
2348 GLint comps
= _mesa_components_in_format(srcFormat
);
2350 MEMCPY( dest
, source
, n
* comps
* sizeof(GLubyte
) );
2356 /* general solution begins here */
2358 GLfloat rgba
[MAX_WIDTH
][4];
2359 GLint dstComponents
;
2360 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2361 GLint dstLuminanceIndex
, dstIntensityIndex
;
2363 dstComponents
= _mesa_components_in_format( dstFormat
);
2364 /* source & dest image formats should have been error checked by now */
2365 assert(dstComponents
> 0);
2368 * Extract image data and convert to RGBA floats
2370 assert(n
<= MAX_WIDTH
);
2371 if (srcFormat
== GL_COLOR_INDEX
) {
2372 GLuint indexes
[MAX_WIDTH
];
2373 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2376 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2377 _mesa_map_ci(ctx
, n
, indexes
);
2379 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2380 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2383 if (dstFormat
== GL_COLOR_INDEX
) {
2384 /* convert to GLubyte and return */
2386 for (i
= 0; i
< n
; i
++) {
2387 dest
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2392 /* Convert indexes to RGBA */
2393 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2397 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2398 srcPacking
->SwapBytes
);
2400 /* scale and bias colors */
2401 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2402 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2404 /* color map lookup */
2405 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2406 _mesa_map_rgba(ctx
, n
, rgba
);
2411 /* GL_COLOR_TABLE lookup */
2412 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2413 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2416 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2417 /* this has to be done in the calling code */
2419 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2420 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2421 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2423 /* color matrix transform */
2424 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2425 _mesa_transform_rgba(ctx
, n
, rgba
);
2427 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2428 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2429 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2431 /* update histogram count */
2432 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2433 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2436 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2437 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2441 /* clamp to [0,1] */
2444 for (i
= 0; i
< n
; i
++) {
2445 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2446 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2447 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2448 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2452 /* Now determine which color channels we need to produce.
2453 * And determine the dest index (offset) within each color tuple.
2455 switch (dstFormat
) {
2458 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2459 dstLuminanceIndex
= dstIntensityIndex
= -1;
2462 dstLuminanceIndex
= 0;
2463 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2464 dstIntensityIndex
= -1;
2466 case GL_LUMINANCE_ALPHA
:
2467 dstLuminanceIndex
= 0;
2469 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2470 dstIntensityIndex
= -1;
2473 dstIntensityIndex
= 0;
2474 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2475 dstLuminanceIndex
= -1;
2481 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2488 dstLuminanceIndex
= dstIntensityIndex
= -1;
2491 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_ubyte_span()");
2496 /* Now return the GLubyte data in the requested dstFormat */
2498 if (dstRedIndex
>= 0) {
2499 GLubyte
*dst
= dest
;
2501 for (i
= 0; i
< n
; i
++) {
2502 dst
[dstRedIndex
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2503 dst
+= dstComponents
;
2507 if (dstGreenIndex
>= 0) {
2508 GLubyte
*dst
= dest
;
2510 for (i
= 0; i
< n
; i
++) {
2511 dst
[dstGreenIndex
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2512 dst
+= dstComponents
;
2516 if (dstBlueIndex
>= 0) {
2517 GLubyte
*dst
= dest
;
2519 for (i
= 0; i
< n
; i
++) {
2520 dst
[dstBlueIndex
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2521 dst
+= dstComponents
;
2525 if (dstAlphaIndex
>= 0) {
2526 GLubyte
*dst
= dest
;
2528 for (i
= 0; i
< n
; i
++) {
2529 dst
[dstAlphaIndex
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2530 dst
+= dstComponents
;
2534 if (dstIntensityIndex
>= 0) {
2535 GLubyte
*dst
= dest
;
2537 assert(dstIntensityIndex
== 0);
2538 assert(dstComponents
== 1);
2539 for (i
= 0; i
< n
; i
++) {
2540 /* Intensity comes from red channel */
2541 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2545 if (dstLuminanceIndex
>= 0) {
2546 GLubyte
*dst
= dest
;
2548 assert(dstLuminanceIndex
== 0);
2549 for (i
= 0; i
< n
; i
++) {
2550 /* Luminance comes from red channel */
2551 dst
[0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2552 dst
+= dstComponents
;
2560 _mesa_unpack_float_color_span( GLcontext
*ctx
,
2561 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
2562 GLenum srcFormat
, GLenum srcType
,
2563 const GLvoid
*source
,
2564 const struct gl_pixelstore_attrib
*srcPacking
,
2565 GLuint transferOps
, GLboolean clamp
)
2567 ASSERT(dstFormat
== GL_ALPHA
||
2568 dstFormat
== GL_LUMINANCE
||
2569 dstFormat
== GL_LUMINANCE_ALPHA
||
2570 dstFormat
== GL_INTENSITY
||
2571 dstFormat
== GL_RGB
||
2572 dstFormat
== GL_RGBA
||
2573 dstFormat
== GL_COLOR_INDEX
);
2575 ASSERT(srcFormat
== GL_RED
||
2576 srcFormat
== GL_GREEN
||
2577 srcFormat
== GL_BLUE
||
2578 srcFormat
== GL_ALPHA
||
2579 srcFormat
== GL_LUMINANCE
||
2580 srcFormat
== GL_LUMINANCE_ALPHA
||
2581 srcFormat
== GL_INTENSITY
||
2582 srcFormat
== GL_RGB
||
2583 srcFormat
== GL_BGR
||
2584 srcFormat
== GL_RGBA
||
2585 srcFormat
== GL_BGRA
||
2586 srcFormat
== GL_ABGR_EXT
||
2587 srcFormat
== GL_COLOR_INDEX
);
2589 ASSERT(srcType
== GL_BITMAP
||
2590 srcType
== GL_UNSIGNED_BYTE
||
2591 srcType
== GL_BYTE
||
2592 srcType
== GL_UNSIGNED_SHORT
||
2593 srcType
== GL_SHORT
||
2594 srcType
== GL_UNSIGNED_INT
||
2595 srcType
== GL_INT
||
2596 srcType
== GL_FLOAT
||
2597 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2598 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2599 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2600 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2601 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2602 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2603 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2604 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2605 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2606 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2607 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2608 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2610 /* this is intended for RGBA mode only */
2611 assert(ctx
->Visual
.RGBAflag
);
2613 /* general solution, no special cases, yet */
2615 GLfloat rgba
[MAX_WIDTH
][4];
2616 GLint dstComponents
;
2617 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2618 GLint dstLuminanceIndex
, dstIntensityIndex
;
2620 dstComponents
= _mesa_components_in_format( dstFormat
);
2621 /* source & dest image formats should have been error checked by now */
2622 assert(dstComponents
> 0);
2625 * Extract image data and convert to RGBA floats
2627 assert(n
<= MAX_WIDTH
);
2628 if (srcFormat
== GL_COLOR_INDEX
) {
2629 GLuint indexes
[MAX_WIDTH
];
2630 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2633 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2634 _mesa_map_ci(ctx
, n
, indexes
);
2636 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2637 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2640 if (dstFormat
== GL_COLOR_INDEX
) {
2641 /* convert to GLubyte and return */
2643 for (i
= 0; i
< n
; i
++) {
2644 dest
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2649 /* Convert indexes to RGBA */
2650 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2654 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2655 srcPacking
->SwapBytes
);
2657 /* scale and bias colors */
2658 if (transferOps
& IMAGE_SCALE_BIAS_BIT
) {
2659 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2661 /* color map lookup */
2662 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2663 _mesa_map_rgba(ctx
, n
, rgba
);
2668 /* GL_COLOR_TABLE lookup */
2669 if (transferOps
& IMAGE_COLOR_TABLE_BIT
) {
2670 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2673 if (transferOps
& IMAGE_CONVOLUTION_BIT
) {
2676 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2677 if (transferOps
& IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
) {
2678 _mesa_lookup_rgba(&ctx
->PostConvolutionColorTable
, n
, rgba
);
2680 /* color matrix transform */
2681 if (transferOps
& IMAGE_COLOR_MATRIX_BIT
) {
2682 _mesa_transform_rgba(ctx
, n
, rgba
);
2684 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2685 if (transferOps
& IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
) {
2686 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2688 /* update histogram count */
2689 if (transferOps
& IMAGE_HISTOGRAM_BIT
) {
2690 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2693 if (transferOps
& IMAGE_MIN_MAX_BIT
) {
2694 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2698 /* clamp to [0,1] */
2701 for (i
= 0; i
< n
; i
++) {
2702 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2703 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2704 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2705 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2709 /* Now determine which color channels we need to produce.
2710 * And determine the dest index (offset) within each color tuple.
2712 switch (dstFormat
) {
2715 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2716 dstLuminanceIndex
= dstIntensityIndex
= -1;
2719 dstLuminanceIndex
= 0;
2720 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2721 dstIntensityIndex
= -1;
2723 case GL_LUMINANCE_ALPHA
:
2724 dstLuminanceIndex
= 0;
2726 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2727 dstIntensityIndex
= -1;
2730 dstIntensityIndex
= 0;
2731 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2732 dstLuminanceIndex
= -1;
2738 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2745 dstLuminanceIndex
= dstIntensityIndex
= -1;
2748 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_float_color_span()");
2752 /* Now pack results in the requested dstFormat */
2753 if (dstRedIndex
>= 0) {
2754 GLfloat
*dst
= dest
;
2756 for (i
= 0; i
< n
; i
++) {
2757 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
2758 dst
+= dstComponents
;
2762 if (dstGreenIndex
>= 0) {
2763 GLfloat
*dst
= dest
;
2765 for (i
= 0; i
< n
; i
++) {
2766 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
2767 dst
+= dstComponents
;
2771 if (dstBlueIndex
>= 0) {
2772 GLfloat
*dst
= dest
;
2774 for (i
= 0; i
< n
; i
++) {
2775 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
2776 dst
+= dstComponents
;
2780 if (dstAlphaIndex
>= 0) {
2781 GLfloat
*dst
= dest
;
2783 for (i
= 0; i
< n
; i
++) {
2784 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
2785 dst
+= dstComponents
;
2789 if (dstIntensityIndex
>= 0) {
2790 GLfloat
*dst
= dest
;
2792 assert(dstIntensityIndex
== 0);
2793 assert(dstComponents
== 1);
2794 for (i
= 0; i
< n
; i
++) {
2795 /* Intensity comes from red channel */
2796 dst
[i
] = rgba
[i
][RCOMP
];
2800 if (dstLuminanceIndex
>= 0) {
2801 GLfloat
*dst
= dest
;
2803 assert(dstLuminanceIndex
== 0);
2804 for (i
= 0; i
< n
; i
++) {
2805 /* Luminance comes from red channel */
2806 dst
[0] = rgba
[i
][RCOMP
];
2807 dst
+= dstComponents
;
2817 * Unpack a row of color index data from a client buffer according to
2818 * the pixel unpacking parameters.
2819 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
2821 * Args: ctx - the context
2822 * n - number of pixels
2823 * dstType - destination datatype
2824 * dest - destination array
2825 * srcType - source pixel type
2826 * source - source data pointer
2827 * srcPacking - pixel unpacking parameters
2828 * transferOps - the pixel transfer operations to apply
2831 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
2832 GLenum dstType
, GLvoid
*dest
,
2833 GLenum srcType
, const GLvoid
*source
,
2834 const struct gl_pixelstore_attrib
*srcPacking
,
2835 GLuint transferOps
)
2837 ASSERT(srcType
== GL_BITMAP
||
2838 srcType
== GL_UNSIGNED_BYTE
||
2839 srcType
== GL_BYTE
||
2840 srcType
== GL_UNSIGNED_SHORT
||
2841 srcType
== GL_SHORT
||
2842 srcType
== GL_UNSIGNED_INT
||
2843 srcType
== GL_INT
||
2844 srcType
== GL_FLOAT
);
2846 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
2847 dstType
== GL_UNSIGNED_SHORT
||
2848 dstType
== GL_UNSIGNED_INT
);
2851 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
2854 * Try simple cases first
2856 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
2857 && dstType
== GL_UNSIGNED_BYTE
) {
2858 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
2860 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
2861 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
2862 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
2868 GLuint indexes
[MAX_WIDTH
];
2869 assert(n
<= MAX_WIDTH
);
2871 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
2874 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2875 /* shift and offset indexes */
2876 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2878 if (transferOps
& IMAGE_MAP_COLOR_BIT
) {
2879 /* Apply lookup table */
2880 _mesa_map_ci(ctx
, n
, indexes
);
2883 /* convert to dest type */
2885 case GL_UNSIGNED_BYTE
:
2887 GLubyte
*dst
= (GLubyte
*) dest
;
2889 for (i
= 0; i
< n
; i
++) {
2890 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2894 case GL_UNSIGNED_SHORT
:
2896 GLuint
*dst
= (GLuint
*) dest
;
2898 for (i
= 0; i
< n
; i
++) {
2899 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
2903 case GL_UNSIGNED_INT
:
2904 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
2907 gl_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
2914 * Unpack a row of stencil data from a client buffer according to
2915 * the pixel unpacking parameters.
2916 * This is (or will be) used by glDrawPixels
2918 * Args: ctx - the context
2919 * n - number of pixels
2920 * dstType - destination datatype
2921 * dest - destination array
2922 * srcType - source pixel type
2923 * source - source data pointer
2924 * srcPacking - pixel unpacking parameters
2925 * transferOps - apply offset/bias/lookup ops?
2928 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
2929 GLenum dstType
, GLvoid
*dest
,
2930 GLenum srcType
, const GLvoid
*source
,
2931 const struct gl_pixelstore_attrib
*srcPacking
,
2932 GLuint transferOps
)
2934 ASSERT(srcType
== GL_BITMAP
||
2935 srcType
== GL_UNSIGNED_BYTE
||
2936 srcType
== GL_BYTE
||
2937 srcType
== GL_UNSIGNED_SHORT
||
2938 srcType
== GL_SHORT
||
2939 srcType
== GL_UNSIGNED_INT
||
2940 srcType
== GL_INT
||
2941 srcType
== GL_FLOAT
);
2943 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
2944 dstType
== GL_UNSIGNED_SHORT
||
2945 dstType
== GL_UNSIGNED_INT
);
2947 /* only shift and offset apply to stencil */
2948 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
2951 * Try simple cases first
2953 if (transferOps
== 0 &&
2954 srcType
== GL_UNSIGNED_BYTE
&&
2955 dstType
== GL_UNSIGNED_BYTE
) {
2956 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
2958 else if (transferOps
== 0 &&
2959 srcType
== GL_UNSIGNED_INT
&&
2960 dstType
== GL_UNSIGNED_INT
&&
2961 !srcPacking
->SwapBytes
) {
2962 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
2968 GLuint indexes
[MAX_WIDTH
];
2969 assert(n
<= MAX_WIDTH
);
2971 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
2975 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
2976 /* shift and offset indexes */
2977 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2980 if (ctx
->Pixel
.MapStencilFlag
) {
2981 /* Apply stencil lookup table */
2982 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
2985 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
2990 /* convert to dest type */
2992 case GL_UNSIGNED_BYTE
:
2994 GLubyte
*dst
= (GLubyte
*) dest
;
2996 for (i
= 0; i
< n
; i
++) {
2997 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3001 case GL_UNSIGNED_SHORT
:
3003 GLuint
*dst
= (GLuint
*) dest
;
3005 for (i
= 0; i
< n
; i
++) {
3006 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3010 case GL_UNSIGNED_INT
:
3011 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
3014 gl_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
3022 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLdepth
*dest
,
3023 GLenum srcType
, const GLvoid
*source
,
3024 const struct gl_pixelstore_attrib
*srcPacking
,
3025 GLuint transferOps
)
3027 GLfloat
*depth
= MALLOC(n
* sizeof(GLfloat
));
3035 const GLubyte
*src
= (const GLubyte
*) source
;
3036 for (i
= 0; i
< n
; i
++) {
3037 depth
[i
] = BYTE_TO_FLOAT(src
[i
]);
3041 case GL_UNSIGNED_BYTE
:
3044 const GLubyte
*src
= (const GLubyte
*) source
;
3045 for (i
= 0; i
< n
; i
++) {
3046 depth
[i
] = UBYTE_TO_FLOAT(src
[i
]);
3053 const GLshort
*src
= (const GLshort
*) source
;
3054 for (i
= 0; i
< n
; i
++) {
3055 depth
[i
] = SHORT_TO_FLOAT(src
[i
]);
3059 case GL_UNSIGNED_SHORT
:
3062 const GLushort
*src
= (const GLushort
*) source
;
3063 for (i
= 0; i
< n
; i
++) {
3064 depth
[i
] = USHORT_TO_FLOAT(src
[i
]);
3071 const GLint
*src
= (const GLint
*) source
;
3072 for (i
= 0; i
< n
; i
++) {
3073 depth
[i
] = INT_TO_FLOAT(src
[i
]);
3077 case GL_UNSIGNED_INT
:
3080 const GLuint
*src
= (const GLuint
*) source
;
3081 for (i
= 0; i
< n
; i
++) {
3082 depth
[i
] = UINT_TO_FLOAT(src
[i
]);
3087 MEMCPY(depth
, source
, n
* sizeof(GLfloat
));
3090 gl_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
3096 /* apply depth scale and bias */
3097 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3099 for (i
= 0; i
< n
; i
++) {
3100 depth
[i
] = depth
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3104 /* clamp depth values to [0,1] and convert from floats to integers */
3106 const GLfloat zs
= ctx
->Visual
.DepthMaxF
;
3108 for (i
= 0; i
< n
; i
++) {
3109 dest
[i
] = (GLdepth
) (CLAMP(depth
[i
], 0.0F
, 1.0F
) * zs
);
3119 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
3120 * Return all image data in a contiguous block.
3123 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
3124 GLenum format
, GLenum type
, const GLvoid
*pixels
,
3125 const struct gl_pixelstore_attrib
*unpack
)
3127 GLint bytesPerRow
, compsPerRow
;
3128 GLboolean flipBytes
, swap2
, swap4
;
3131 return NULL
; /* not necessarily an error */
3133 if (width
<= 0 || height
<= 0 || depth
<= 0)
3134 return NULL
; /* generate error later */
3136 if (format
== GL_BITMAP
) {
3137 bytesPerRow
= (width
+ 7) >> 3;
3138 flipBytes
= !unpack
->LsbFirst
;
3139 swap2
= swap4
= GL_FALSE
;
3143 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
3144 const GLint components
= _mesa_components_in_format(format
);
3146 if (bytesPerPixel
<= 0 || components
<= 0)
3147 return NULL
; /* bad format or type. generate error later */
3148 bytesPerRow
= bytesPerPixel
* width
;
3149 bytesPerComp
= bytesPerPixel
/ components
;
3150 flipBytes
= GL_FALSE
;
3151 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
3152 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
3153 compsPerRow
= components
* width
;
3154 assert(compsPerRow
>= width
);
3158 GLubyte
*destBuffer
= MALLOC(bytesPerRow
* height
* depth
);
3162 return NULL
; /* generate GL_OUT_OF_MEMORY later */
3165 for (img
= 0; img
< depth
; img
++) {
3166 for (row
= 0; row
< height
; row
++) {
3167 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
3168 width
, height
, format
, type
, img
, row
, 0);
3169 MEMCPY(dst
, src
, bytesPerRow
);
3170 /* byte flipping/swapping */
3172 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
3175 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
3178 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
3189 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
3190 * order with row alignment = 1 byte.
3193 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
3194 const struct gl_pixelstore_attrib
*packing
)
3196 GLint bytes
, row
, width_in_bytes
;
3197 GLubyte
*buffer
, *dst
;
3202 /* Alloc dest storage */
3203 bytes
= ((width
+ 7) / 8 * height
);
3204 buffer
= (GLubyte
*) MALLOC( bytes
);
3209 width_in_bytes
= CEILING( width
, 8 );
3211 for (row
= 0; row
< height
; row
++) {
3212 GLubyte
*src
= _mesa_image_address( packing
, pixels
, width
, height
,
3213 GL_COLOR_INDEX
, GL_BITMAP
,
3220 if (packing
->SkipPixels
== 0) {
3221 MEMCPY( dst
, src
, width_in_bytes
);
3222 if (packing
->LsbFirst
) {
3223 flip_bytes( dst
, width_in_bytes
);
3227 /* handling SkipPixels is a bit tricky (no pun intended!) */
3229 if (packing
->LsbFirst
) {
3230 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
3231 GLubyte dstMask
= 128;
3235 for (i
= 0; i
< width
; i
++) {
3239 if (srcMask
== 128) {
3244 srcMask
= srcMask
<< 1;
3252 dstMask
= dstMask
>> 1;
3257 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
3258 GLubyte dstMask
= 128;
3262 for (i
= 0; i
< width
; i
++) {
3271 srcMask
= srcMask
>> 1;
3279 dstMask
= dstMask
>> 1;
3284 dst
+= width_in_bytes
;
3295 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
3296 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
3298 GLint row
, width_in_bytes
;
3304 width_in_bytes
= CEILING( width
, 8 );
3306 for (row
= 0; row
< height
; row
++) {
3307 GLubyte
*dst
= _mesa_image_address( packing
, dest
, width
, height
,
3308 GL_COLOR_INDEX
, GL_BITMAP
,
3313 if (packing
->SkipPixels
== 0) {
3314 MEMCPY( dst
, src
, width_in_bytes
);
3315 if (packing
->LsbFirst
) {
3316 flip_bytes( dst
, width_in_bytes
);
3320 /* handling SkipPixels is a bit tricky (no pun intended!) */
3322 if (packing
->LsbFirst
) {
3323 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
3324 GLubyte dstMask
= 128;
3325 const GLubyte
*s
= src
;
3328 for (i
= 0; i
< width
; i
++) {
3332 if (srcMask
== 128) {
3337 srcMask
= srcMask
<< 1;
3345 dstMask
= dstMask
>> 1;
3350 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
3351 GLubyte dstMask
= 128;
3352 const GLubyte
*s
= src
;
3355 for (i
= 0; i
< width
; i
++) {
3364 srcMask
= srcMask
>> 1;
3372 dstMask
= dstMask
>> 1;
3377 src
+= width_in_bytes
;