1 /* $Id: image.c,v 1.31 2000/05/10 14:39: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.
68 flip_bytes( GLubyte
*p
, GLuint n
)
70 register GLuint i
, a
, b
;
74 a
= ((b
& 0x01) << 7) |
88 * Flip the order of the 2 bytes in each word in the given array.
91 _mesa_swap2( GLushort
*p
, GLuint n
)
96 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
103 * Flip the order of the 4 bytes in each word in the given array.
106 _mesa_swap4( GLuint
*p
, GLuint n
)
108 register GLuint i
, a
, b
;
113 | ((b
>> 8) & 0xff00)
114 | ((b
<< 8) & 0xff0000)
115 | ((b
<< 24) & 0xff000000);
124 * Return the size, in bytes, of the given GL datatype.
125 * Return 0 if GL_BITMAP.
126 * Return -1 if invalid type enum.
128 GLint
_mesa_sizeof_type( GLenum type
)
133 case GL_UNSIGNED_BYTE
:
134 return sizeof(GLubyte
);
136 return sizeof(GLbyte
);
137 case GL_UNSIGNED_SHORT
:
138 return sizeof(GLushort
);
140 return sizeof(GLshort
);
141 case GL_UNSIGNED_INT
:
142 return sizeof(GLuint
);
144 return sizeof(GLint
);
146 return sizeof(GLfloat
);
154 * Same as _mesa_sizeof_packed_type() but we also accept the
155 * packed pixel format datatypes.
157 GLint
_mesa_sizeof_packed_type( GLenum type
)
162 case GL_UNSIGNED_BYTE
:
163 return sizeof(GLubyte
);
165 return sizeof(GLbyte
);
166 case GL_UNSIGNED_SHORT
:
167 return sizeof(GLushort
);
169 return sizeof(GLshort
);
170 case GL_UNSIGNED_INT
:
171 return sizeof(GLuint
);
173 return sizeof(GLint
);
175 return sizeof(GLfloat
);
176 case GL_UNSIGNED_BYTE_3_3_2
:
177 return sizeof(GLubyte
);
178 case GL_UNSIGNED_BYTE_2_3_3_REV
:
179 return sizeof(GLubyte
);
180 case GL_UNSIGNED_SHORT_5_6_5
:
181 return sizeof(GLshort
);
182 case GL_UNSIGNED_SHORT_5_6_5_REV
:
183 return sizeof(GLshort
);
184 case GL_UNSIGNED_SHORT_4_4_4_4
:
185 return sizeof(GLshort
);
186 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
187 return sizeof(GLshort
);
188 case GL_UNSIGNED_SHORT_5_5_5_1
:
189 return sizeof(GLshort
);
190 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
191 return sizeof(GLshort
);
192 case GL_UNSIGNED_INT_8_8_8_8
:
193 return sizeof(GLuint
);
194 case GL_UNSIGNED_INT_8_8_8_8_REV
:
195 return sizeof(GLuint
);
196 case GL_UNSIGNED_INT_10_10_10_2
:
197 return sizeof(GLuint
);
198 case GL_UNSIGNED_INT_2_10_10_10_REV
:
199 return sizeof(GLuint
);
208 * Return the number of components in a GL enum pixel type.
209 * Return -1 if bad format.
211 GLint
_mesa_components_in_format( GLenum format
)
215 case GL_COLOR_INDEX1_EXT
:
216 case GL_COLOR_INDEX2_EXT
:
217 case GL_COLOR_INDEX4_EXT
:
218 case GL_COLOR_INDEX8_EXT
:
219 case GL_COLOR_INDEX12_EXT
:
220 case GL_COLOR_INDEX16_EXT
:
221 case GL_STENCIL_INDEX
:
222 case GL_DEPTH_COMPONENT
:
230 case GL_LUMINANCE_ALPHA
:
249 * Return bytes per pixel for given format and type
250 * Return -1 if bad format or type.
252 GLint
_mesa_bytes_per_pixel( GLenum format
, GLenum type
)
254 GLint comps
= _mesa_components_in_format( format
);
260 return 0; /* special case */
262 case GL_UNSIGNED_BYTE
:
263 return comps
* sizeof(GLubyte
);
265 case GL_UNSIGNED_SHORT
:
266 return comps
* sizeof(GLshort
);
268 case GL_UNSIGNED_INT
:
269 return comps
* sizeof(GLint
);
271 return comps
* sizeof(GLfloat
);
272 case GL_UNSIGNED_BYTE_3_3_2
:
273 case GL_UNSIGNED_BYTE_2_3_3_REV
:
274 if (format
== GL_RGB
|| format
== GL_BGR
)
275 return sizeof(GLubyte
);
277 return -1; /* error */
278 case GL_UNSIGNED_SHORT_5_6_5
:
279 case GL_UNSIGNED_SHORT_5_6_5_REV
:
280 if (format
== GL_RGB
|| format
== GL_BGR
)
281 return sizeof(GLshort
);
283 return -1; /* error */
284 case GL_UNSIGNED_SHORT_4_4_4_4
:
285 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
286 case GL_UNSIGNED_SHORT_5_5_5_1
:
287 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
288 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
289 return sizeof(GLushort
);
292 case GL_UNSIGNED_INT_8_8_8_8
:
293 case GL_UNSIGNED_INT_8_8_8_8_REV
:
294 case GL_UNSIGNED_INT_10_10_10_2
:
295 case GL_UNSIGNED_INT_2_10_10_10_REV
:
296 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
297 return sizeof(GLuint
);
307 * Test if the given pixel format and type are legal.
308 * Return GL_TRUE for legal, GL_FALSE for illegal.
311 _mesa_is_legal_format_and_type( GLenum format
, GLenum type
)
315 case GL_STENCIL_INDEX
:
319 case GL_UNSIGNED_BYTE
:
321 case GL_UNSIGNED_SHORT
:
323 case GL_UNSIGNED_INT
:
334 case GL_LUMINANCE_ALPHA
:
335 case GL_DEPTH_COMPONENT
:
339 case GL_UNSIGNED_BYTE
:
341 case GL_UNSIGNED_SHORT
:
343 case GL_UNSIGNED_INT
:
352 case GL_UNSIGNED_BYTE
:
354 case GL_UNSIGNED_SHORT
:
356 case GL_UNSIGNED_INT
:
358 case GL_UNSIGNED_BYTE_3_3_2
:
359 case GL_UNSIGNED_BYTE_2_3_3_REV
:
360 case GL_UNSIGNED_SHORT_5_6_5
:
361 case GL_UNSIGNED_SHORT_5_6_5_REV
:
371 case GL_UNSIGNED_BYTE
:
373 case GL_UNSIGNED_SHORT
:
375 case GL_UNSIGNED_INT
:
377 case GL_UNSIGNED_SHORT_4_4_4_4
:
378 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
379 case GL_UNSIGNED_SHORT_5_5_5_1
:
380 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
381 case GL_UNSIGNED_INT_8_8_8_8
:
382 case GL_UNSIGNED_INT_8_8_8_8_REV
:
383 case GL_UNSIGNED_INT_10_10_10_2
:
384 case GL_UNSIGNED_INT_2_10_10_10_REV
:
398 * Return the address of a pixel in an image (actually a volume).
399 * Pixel unpacking/packing parameters are observed according to 'packing'.
400 * Input: image - start of image data
401 * width, height - size of image
402 * format - image format
403 * type - pixel component type
404 * packing - the pixelstore attributes
405 * img - which image in the volume (0 for 1D or 2D images)
406 * row, column - location of pixel in the image
407 * Return: address of pixel at (image,row,column) in image or NULL if error.
410 _mesa_image_address( const struct gl_pixelstore_attrib
*packing
,
411 const GLvoid
*image
, GLsizei width
,
412 GLsizei height
, GLenum format
, GLenum type
,
413 GLint img
, GLint row
, GLint column
)
415 GLint alignment
; /* 1, 2 or 4 */
416 GLint pixels_per_row
;
417 GLint rows_per_image
;
420 GLint skipimages
; /* for 3-D volume images */
423 alignment
= packing
->Alignment
;
424 if (packing
->RowLength
> 0) {
425 pixels_per_row
= packing
->RowLength
;
428 pixels_per_row
= width
;
430 if (packing
->ImageHeight
> 0) {
431 rows_per_image
= packing
->ImageHeight
;
434 rows_per_image
= height
;
436 skiprows
= packing
->SkipRows
;
437 skippixels
= packing
->SkipPixels
;
438 skipimages
= packing
->SkipImages
;
440 if (type
==GL_BITMAP
) {
442 GLint comp_per_pixel
; /* components per pixel */
443 GLint bytes_per_comp
; /* bytes per component */
445 GLint bytes_per_image
;
447 /* Compute bytes per component */
448 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
449 if (bytes_per_comp
<0) {
453 /* Compute number of components per pixel */
454 comp_per_pixel
= _mesa_components_in_format( format
);
455 if (comp_per_pixel
<0 && type
!= GL_BITMAP
) {
459 bytes_per_row
= alignment
460 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
462 bytes_per_image
= bytes_per_row
* rows_per_image
;
464 pixel_addr
= (GLubyte
*) image
465 + (skipimages
+ img
) * bytes_per_image
466 + (skiprows
+ row
) * bytes_per_row
467 + (skippixels
+ column
) / 8;
470 /* Non-BITMAP data */
471 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
473 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
475 /* The pixel type and format should have been error checked earlier */
476 assert(bytes_per_pixel
> 0);
478 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
479 remainder
= bytes_per_row
% alignment
;
481 bytes_per_row
+= (alignment
- remainder
);
483 ASSERT(bytes_per_row
% alignment
== 0);
485 bytes_per_image
= bytes_per_row
* rows_per_image
;
487 /* compute final pixel address */
488 pixel_addr
= (GLubyte
*) image
489 + (skipimages
+ img
) * bytes_per_image
490 + (skiprows
+ row
) * bytes_per_row
491 + (skippixels
+ column
) * bytes_per_pixel
;
494 return (GLvoid
*) pixel_addr
;
500 * Compute the stride between image rows (in bytes) for the given
501 * pixel packing parameters and image width, format and type.
504 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
505 GLint width
, GLenum format
, GLenum type
)
508 if (type
== GL_BITMAP
) {
510 if (packing
->RowLength
== 0) {
511 GLint bytes
= (width
+ 7) / 8;
515 GLint bytes
= (packing
->RowLength
+ 7) / 8;
520 /* Non-BITMAP data */
521 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
522 if (bytesPerPixel
<= 0)
523 return -1; /* error */
524 if (packing
->RowLength
== 0) {
525 GLint bytes
= bytesPerPixel
* width
;
529 GLint bytes
= bytesPerPixel
* packing
->RowLength
;
538 * Unpack a 32x32 pixel polygon stipple from user memory using the
539 * current pixel unpack settings.
542 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
543 const struct gl_pixelstore_attrib
*unpacking
)
545 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap( 32, 32, pattern
, unpacking
);
547 /* Convert pattern from GLubytes to GLuints and handle big/little
552 for (i
= 0; i
< 32; i
++) {
553 dest
[i
] = (p
[0] << 24)
566 * Pack polygon stipple into user memory given current pixel packing
570 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
571 const struct gl_pixelstore_attrib
*packing
)
573 /* Convert pattern from GLuints to GLubytes to handle big/little
574 * endian differences.
578 for (i
= 0; i
< 32; i
++) {
579 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
580 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
581 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
582 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
585 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
591 * Pack the given RGBA span into client memory at 'dest' address
592 * in the given pixel format and type.
593 * Optionally apply the enabled pixel transfer ops.
594 * Pack into memory using the given packing params struct.
595 * This is used by glReadPixels and glGetTexImage?D()
596 * Input: ctx - the context
597 * n - number of pixels in the span
599 * format - dest packing format
600 * type - dest packing datatype
601 * destination - destination packing address
602 * packing - pixel packing parameters
603 * applyTransferOps - apply scale/bias/lookup-table ops?
606 _mesa_pack_rgba_span( GLcontext
*ctx
,
607 GLuint n
, CONST GLubyte srcRgba
[][4],
608 GLenum format
, GLenum type
, GLvoid
*destination
,
609 const struct gl_pixelstore_attrib
*packing
,
610 GLboolean applyTransferOps
)
612 applyTransferOps
&= (ctx
->Pixel
.ScaleOrBiasRGBA
||
613 ctx
->Pixel
.MapColorFlag
||
614 ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
615 ctx
->Pixel
.ScaleOrBiasRGBApcm
||
616 ctx
->Pixel
.ColorTableEnabled
||
617 ctx
->Pixel
.PostColorMatrixColorTableEnabled
||
618 ctx
->Pixel
.MinMaxEnabled
||
619 ctx
->Pixel
.HistogramEnabled
);
621 /* Test for optimized case first */
622 if (!applyTransferOps
&& format
== GL_RGBA
&& type
== GL_UNSIGNED_BYTE
) {
623 /* common simple case */
624 MEMCPY( destination
, srcRgba
, n
* 4 * sizeof(GLubyte
) );
626 else if (!applyTransferOps
&& format
== GL_RGB
&& type
== GL_UNSIGNED_BYTE
) {
627 /* common simple case */
629 GLubyte
*dest
= (GLubyte
*) destination
;
630 for (i
= 0; i
< n
; i
++) {
631 dest
[0] = srcRgba
[i
][RCOMP
];
632 dest
[1] = srcRgba
[i
][GCOMP
];
633 dest
[2] = srcRgba
[i
][BCOMP
];
638 /* general solution */
639 GLfloat rgba
[MAX_WIDTH
][4], luminance
[MAX_WIDTH
];
640 const GLfloat rscale
= 1.0F
/ 255.0F
;
641 const GLfloat gscale
= 1.0F
/ 255.0F
;
642 const GLfloat bscale
= 1.0F
/ 255.0F
;
643 const GLfloat ascale
= 1.0F
/ 255.0F
;
644 const GLint comps
= _mesa_components_in_format(format
);
647 assert(n
<= MAX_WIDTH
);
649 /* convert color components to floating point */
651 rgba
[i
][RCOMP
] = srcRgba
[i
][RCOMP
] * rscale
;
652 rgba
[i
][GCOMP
] = srcRgba
[i
][GCOMP
] * gscale
;
653 rgba
[i
][BCOMP
] = srcRgba
[i
][BCOMP
] * bscale
;
654 rgba
[i
][ACOMP
] = srcRgba
[i
][ACOMP
] * ascale
;
658 * Apply scale, bias and lookup-tables if enabled.
660 if (applyTransferOps
) {
662 if (ctx
->Pixel
.ScaleOrBiasRGBA
) {
663 _mesa_scale_and_bias_rgba( ctx
, n
, rgba
);
665 /* color map lookup */
666 if (ctx
->Pixel
.MapColorFlag
) {
667 _mesa_map_rgba( ctx
, n
, rgba
);
669 /* GL_COLOR_TABLE lookup */
670 if (ctx
->Pixel
.ColorTableEnabled
) {
671 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
673 /* XXX convolution here */
674 /* XXX post-convolution color table look-up here */
676 if (ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
677 ctx
->Pixel
.ScaleOrBiasRGBApcm
) {
678 _mesa_transform_rgba(ctx
, n
, rgba
);
680 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
681 if (ctx
->Pixel
.PostColorMatrixColorTableEnabled
) {
682 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
684 /* update histogram count */
685 if (ctx
->Pixel
.HistogramEnabled
) {
686 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
688 /* XXX min/max here */
689 if (ctx
->Pixel
.MinMaxEnabled
) {
690 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
691 if (ctx
->MinMax
.Sink
)
696 if (format
==GL_LUMINANCE
|| format
==GL_LUMINANCE_ALPHA
) {
698 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
699 luminance
[i
] = CLAMP( sum
, 0.0F
, 1.0F
);
704 * Pack/store the pixels. Ugh! Lots of cases!!!
707 case GL_UNSIGNED_BYTE
:
709 GLubyte
*dst
= (GLubyte
*) destination
;
713 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
717 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
721 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
725 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
729 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
731 case GL_LUMINANCE_ALPHA
:
733 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
734 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
739 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
740 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
741 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
746 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
747 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
748 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
749 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
754 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
755 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
756 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
761 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
762 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
763 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
764 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
769 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
770 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
771 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
772 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
776 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
782 GLbyte
*dst
= (GLbyte
*) destination
;
786 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
790 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
794 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
798 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
802 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
804 case GL_LUMINANCE_ALPHA
:
806 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
807 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
812 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
813 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
814 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
819 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
820 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
821 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
822 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
827 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
828 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
829 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
834 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
835 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
836 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
837 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
841 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
842 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
843 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
844 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
848 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
852 case GL_UNSIGNED_SHORT
:
854 GLushort
*dst
= (GLushort
*) destination
;
858 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
862 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
866 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
870 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
874 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
876 case GL_LUMINANCE_ALPHA
:
878 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
879 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
884 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
885 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
886 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
891 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
892 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
893 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
894 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
899 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
900 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
901 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
906 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
907 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
908 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
909 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
914 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
915 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
916 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
917 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
921 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
923 if (packing
->SwapBytes
) {
924 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
930 GLshort
*dst
= (GLshort
*) destination
;
934 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
938 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
942 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
946 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
950 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
952 case GL_LUMINANCE_ALPHA
:
954 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
955 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
960 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
961 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
962 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
967 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
968 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
969 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
970 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
975 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
976 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
977 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
982 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
983 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
984 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
985 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
989 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
990 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
991 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
992 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
996 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
998 if (packing
->SwapBytes
) {
999 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
1003 case GL_UNSIGNED_INT
:
1005 GLuint
*dst
= (GLuint
*) destination
;
1009 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1013 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1017 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1021 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1025 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1027 case GL_LUMINANCE_ALPHA
:
1029 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1030 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1035 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1036 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1037 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1042 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1043 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1044 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1045 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1050 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1051 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1052 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1057 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1058 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1059 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1060 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1065 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1066 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1067 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1068 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1072 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1074 if (packing
->SwapBytes
) {
1075 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1081 GLint
*dst
= (GLint
*) destination
;
1085 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1089 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1093 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1097 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1101 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1103 case GL_LUMINANCE_ALPHA
:
1105 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1106 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1111 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1112 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1113 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1118 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1119 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1120 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1121 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1126 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1127 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1128 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1133 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1134 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1135 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1136 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1141 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1142 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1143 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1144 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1148 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1150 if (packing
->SwapBytes
) {
1151 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1157 GLfloat
*dst
= (GLfloat
*) destination
;
1161 dst
[i
] = rgba
[i
][RCOMP
];
1165 dst
[i
] = rgba
[i
][GCOMP
];
1169 dst
[i
] = rgba
[i
][BCOMP
];
1173 dst
[i
] = rgba
[i
][ACOMP
];
1177 dst
[i
] = luminance
[i
];
1179 case GL_LUMINANCE_ALPHA
:
1181 dst
[i
*2+0] = luminance
[i
];
1182 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1187 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1188 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1189 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1194 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1195 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1196 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1197 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1202 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1203 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1204 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1209 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1210 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1211 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1212 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1217 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1218 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1219 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1220 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1224 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1226 if (packing
->SwapBytes
) {
1227 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1231 case GL_UNSIGNED_BYTE_3_3_2
:
1232 if (format
== GL_RGB
) {
1233 GLubyte
*dst
= (GLubyte
*) destination
;
1235 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1236 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1237 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1241 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1242 if (format
== GL_RGB
) {
1243 GLubyte
*dst
= (GLubyte
*) destination
;
1245 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1246 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1247 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1251 case GL_UNSIGNED_SHORT_5_6_5
:
1252 if (format
== GL_RGB
) {
1253 GLushort
*dst
= (GLushort
*) destination
;
1255 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1256 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1257 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1261 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1262 if (format
== GL_RGB
) {
1263 GLushort
*dst
= (GLushort
*) destination
;
1265 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1266 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1267 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1271 case GL_UNSIGNED_SHORT_4_4_4_4
:
1272 if (format
== GL_RGB
) {
1273 GLushort
*dst
= (GLushort
*) destination
;
1275 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1276 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1277 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1278 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1282 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1283 if (format
== GL_RGB
) {
1284 GLushort
*dst
= (GLushort
*) destination
;
1286 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1287 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1288 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1289 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1293 case GL_UNSIGNED_SHORT_5_5_5_1
:
1294 if (format
== GL_RGB
) {
1295 GLushort
*dst
= (GLushort
*) destination
;
1297 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1298 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1299 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1300 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1304 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1305 if (format
== GL_RGB
) {
1306 GLushort
*dst
= (GLushort
*) destination
;
1308 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1309 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1310 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1311 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1315 case GL_UNSIGNED_INT_8_8_8_8
:
1316 if (format
== GL_RGBA
) {
1317 GLuint
*dst
= (GLuint
*) destination
;
1319 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1320 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1321 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1322 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1325 else if (format
== GL_BGRA
) {
1326 GLuint
*dst
= (GLuint
*) destination
;
1328 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1329 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1330 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1331 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1334 else if (format
== GL_ABGR_EXT
) {
1335 GLuint
*dst
= (GLuint
*) destination
;
1337 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1338 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1339 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1340 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1344 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1345 if (format
== GL_RGBA
) {
1346 GLuint
*dst
= (GLuint
*) destination
;
1348 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1349 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1350 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1351 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1354 else if (format
== GL_BGRA
) {
1355 GLuint
*dst
= (GLuint
*) destination
;
1357 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1358 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1359 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1360 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1363 else if (format
== GL_ABGR_EXT
) {
1364 GLuint
*dst
= (GLuint
*) destination
;
1366 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1367 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1368 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1369 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1373 case GL_UNSIGNED_INT_10_10_10_2
:
1374 if (format
== GL_RGBA
) {
1375 GLuint
*dst
= (GLuint
*) destination
;
1377 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1378 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1379 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1380 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1383 else if (format
== GL_BGRA
) {
1384 GLuint
*dst
= (GLuint
*) destination
;
1386 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1387 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1388 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1389 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1392 else if (format
== GL_ABGR_EXT
) {
1393 GLuint
*dst
= (GLuint
*) destination
;
1395 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1396 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1397 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1398 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1402 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1403 if (format
== GL_RGBA
) {
1404 GLuint
*dst
= (GLuint
*) destination
;
1406 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1407 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1408 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1409 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1412 else if (format
== GL_BGRA
) {
1413 GLuint
*dst
= (GLuint
*) destination
;
1415 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1416 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1417 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1418 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1421 else if (format
== GL_ABGR_EXT
) {
1422 GLuint
*dst
= (GLuint
*) destination
;
1424 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1425 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1426 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1427 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1432 gl_problem( ctx
, "bad type in _mesa_pack_rgba_span" );
1439 #define SWAP2BYTE(VALUE) \
1441 GLubyte *bytes = (GLubyte *) &(VALUE); \
1442 GLubyte tmp = bytes[0]; \
1443 bytes[0] = bytes[1]; \
1447 #define SWAP4BYTE(VALUE) \
1449 GLubyte *bytes = (GLubyte *) &(VALUE); \
1450 GLubyte tmp = bytes[0]; \
1451 bytes[0] = bytes[3]; \
1454 bytes[1] = bytes[2]; \
1460 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1461 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1462 const struct gl_pixelstore_attrib
*unpack
)
1464 assert(srcFormat
== GL_COLOR_INDEX
);
1466 ASSERT(srcType
== GL_BITMAP
||
1467 srcType
== GL_UNSIGNED_BYTE
||
1468 srcType
== GL_BYTE
||
1469 srcType
== GL_UNSIGNED_SHORT
||
1470 srcType
== GL_SHORT
||
1471 srcType
== GL_UNSIGNED_INT
||
1472 srcType
== GL_INT
||
1473 srcType
== GL_FLOAT
);
1478 GLubyte
*ubsrc
= (GLubyte
*) src
;
1479 if (unpack
->LsbFirst
) {
1480 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1482 for (i
= 0; i
< n
; i
++) {
1483 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1494 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1496 for (i
= 0; i
< n
; i
++) {
1497 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1509 case GL_UNSIGNED_BYTE
:
1512 const GLubyte
*s
= (const GLubyte
*) src
;
1513 for (i
= 0; i
< n
; i
++)
1520 const GLbyte
*s
= (const GLbyte
*) src
;
1521 for (i
= 0; i
< n
; i
++)
1525 case GL_UNSIGNED_SHORT
:
1528 const GLushort
*s
= (const GLushort
*) src
;
1529 if (unpack
->SwapBytes
) {
1530 for (i
= 0; i
< n
; i
++) {
1531 GLushort value
= s
[i
];
1537 for (i
= 0; i
< n
; i
++)
1545 const GLshort
*s
= (const GLshort
*) src
;
1546 if (unpack
->SwapBytes
) {
1547 for (i
= 0; i
< n
; i
++) {
1548 GLshort value
= s
[i
];
1554 for (i
= 0; i
< n
; i
++)
1559 case GL_UNSIGNED_INT
:
1562 const GLuint
*s
= (const GLuint
*) src
;
1563 if (unpack
->SwapBytes
) {
1564 for (i
= 0; i
< n
; i
++) {
1565 GLuint value
= s
[i
];
1571 for (i
= 0; i
< n
; i
++)
1579 const GLint
*s
= (const GLint
*) src
;
1580 if (unpack
->SwapBytes
) {
1581 for (i
= 0; i
< n
; i
++) {
1588 for (i
= 0; i
< n
; i
++)
1596 const GLfloat
*s
= (const GLfloat
*) src
;
1597 if (unpack
->SwapBytes
) {
1598 for (i
= 0; i
< n
; i
++) {
1599 GLfloat value
= s
[i
];
1601 indexes
[i
] = (GLuint
) value
;
1605 for (i
= 0; i
< n
; i
++)
1606 indexes
[i
] = (GLuint
) s
[i
];
1611 gl_problem(NULL
, "bad srcType in extract_uint_indexes");
1619 * This function extracts floating point RGBA values from arbitrary
1620 * image data. srcFormat and srcType are the format and type parameters
1621 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1623 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1624 * implements the "Conversion to floating point", "Conversion to RGB",
1625 * and "Final Expansion to RGBA" operations.
1627 * Args: n - number of pixels
1628 * rgba - output colors
1629 * srcFormat - format of incoming data
1630 * srcType - datatype of incoming data
1631 * src - source data pointer
1632 * swapBytes - perform byteswapping of incoming data?
1635 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
1636 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1637 GLboolean swapBytes
)
1639 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
1641 GLint rComp
, bComp
, gComp
, aComp
;
1643 ASSERT(srcFormat
== GL_RED
||
1644 srcFormat
== GL_GREEN
||
1645 srcFormat
== GL_BLUE
||
1646 srcFormat
== GL_ALPHA
||
1647 srcFormat
== GL_LUMINANCE
||
1648 srcFormat
== GL_LUMINANCE_ALPHA
||
1649 srcFormat
== GL_INTENSITY
||
1650 srcFormat
== GL_RGB
||
1651 srcFormat
== GL_BGR
||
1652 srcFormat
== GL_RGBA
||
1653 srcFormat
== GL_BGRA
||
1654 srcFormat
== GL_ABGR_EXT
);
1656 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
1657 srcType
== GL_BYTE
||
1658 srcType
== GL_UNSIGNED_SHORT
||
1659 srcType
== GL_SHORT
||
1660 srcType
== GL_UNSIGNED_INT
||
1661 srcType
== GL_INT
||
1662 srcType
== GL_FLOAT
||
1663 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
1664 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
1665 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
1666 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
1667 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
1668 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
1669 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
1670 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
1671 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
1672 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
1673 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
1674 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
1676 rComp
= gComp
= bComp
= aComp
= -1;
1678 switch (srcFormat
) {
1681 greenIndex
= blueIndex
= alphaIndex
= -1;
1686 redIndex
= blueIndex
= alphaIndex
= -1;
1691 redIndex
= greenIndex
= alphaIndex
= -1;
1695 redIndex
= greenIndex
= blueIndex
= -1;
1700 redIndex
= greenIndex
= blueIndex
= 0;
1704 case GL_LUMINANCE_ALPHA
:
1705 redIndex
= greenIndex
= blueIndex
= 0;
1711 greenIndex
= blueIndex
= alphaIndex
= -1;
1762 gl_problem(NULL
, "bad srcFormat in extract float data");
1767 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
1768 if ((INDEX) < 0) { \
1770 for (i = 0; i < n; i++) { \
1771 rgba[i][CHANNEL] = DEFAULT; \
1774 else if (swapBytes) { \
1775 const TYPE *s = (const TYPE *) src; \
1777 for (i = 0; i < n; i++) { \
1778 TYPE value = s[INDEX]; \
1779 if (sizeof(TYPE) == 2) { \
1782 else if (sizeof(TYPE) == 4) { \
1785 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
1790 const TYPE *s = (const TYPE *) src; \
1792 for (i = 0; i < n; i++) { \
1793 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
1799 case GL_UNSIGNED_BYTE
:
1800 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1801 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1802 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1803 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1806 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1807 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1808 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1809 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
1811 case GL_UNSIGNED_SHORT
:
1812 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1813 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1814 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1815 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
1818 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1819 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1820 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1821 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
1823 case GL_UNSIGNED_INT
:
1824 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1825 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1826 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1827 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
1830 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1831 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1832 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1833 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
1836 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1837 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1838 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1839 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
1841 case GL_UNSIGNED_BYTE_3_3_2
:
1843 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
1845 for (i
= 0; i
< n
; i
++) {
1846 GLubyte p
= ubsrc
[i
];
1847 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
1848 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
1849 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
1850 rgba
[i
][ACOMP
] = 1.0F
;
1854 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1856 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
1858 for (i
= 0; i
< n
; i
++) {
1859 GLubyte p
= ubsrc
[i
];
1860 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
1861 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
1862 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
1863 rgba
[i
][ACOMP
] = 1.0F
;
1867 case GL_UNSIGNED_SHORT_5_6_5
:
1869 const GLushort
*ussrc
= (const GLushort
*) src
;
1871 for (i
= 0; i
< n
; i
++) {
1872 GLushort p
= ussrc
[i
];
1874 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1875 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1876 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1877 rgba
[i
][ACOMP
] = 1.0F
;
1881 const GLushort
*ussrc
= (const GLushort
*) src
;
1883 for (i
= 0; i
< n
; i
++) {
1884 GLushort p
= ussrc
[i
];
1885 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1886 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1887 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1888 rgba
[i
][ACOMP
] = 1.0F
;
1892 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1894 const GLushort
*ussrc
= (const GLushort
*) src
;
1896 for (i
= 0; i
< n
; i
++) {
1897 GLushort p
= ussrc
[i
];
1899 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1900 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1901 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1902 rgba
[i
][ACOMP
] = 1.0F
;
1906 const GLushort
*ussrc
= (const GLushort
*) src
;
1908 for (i
= 0; i
< n
; i
++) {
1909 GLushort p
= ussrc
[i
];
1910 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1911 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1912 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1913 rgba
[i
][ACOMP
] = 1.0F
;
1917 case GL_UNSIGNED_SHORT_4_4_4_4
:
1919 const GLushort
*ussrc
= (const GLushort
*) src
;
1921 for (i
= 0; i
< n
; i
++) {
1922 GLushort p
= ussrc
[i
];
1924 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
1925 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
1926 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
1927 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
1931 const GLushort
*ussrc
= (const GLushort
*) src
;
1933 for (i
= 0; i
< n
; i
++) {
1934 GLushort p
= ussrc
[i
];
1935 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
1936 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
1937 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
1938 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
1942 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1944 const GLushort
*ussrc
= (const GLushort
*) src
;
1946 for (i
= 0; i
< n
; i
++) {
1947 GLushort p
= ussrc
[i
];
1949 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
1950 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
1951 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
1952 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
1956 const GLushort
*ussrc
= (const GLushort
*) src
;
1958 for (i
= 0; i
< n
; i
++) {
1959 GLushort p
= ussrc
[i
];
1960 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
1961 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
1962 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
1963 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
1967 case GL_UNSIGNED_SHORT_5_5_5_1
:
1969 const GLushort
*ussrc
= (const GLushort
*) src
;
1971 for (i
= 0; i
< n
; i
++) {
1972 GLushort p
= ussrc
[i
];
1974 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1975 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
1976 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
1977 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
1981 const GLushort
*ussrc
= (const GLushort
*) src
;
1983 for (i
= 0; i
< n
; i
++) {
1984 GLushort p
= ussrc
[i
];
1985 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1986 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
1987 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
1988 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
1992 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1994 const GLushort
*ussrc
= (const GLushort
*) src
;
1996 for (i
= 0; i
< n
; i
++) {
1997 GLushort p
= ussrc
[i
];
1999 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2000 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2001 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2002 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2006 const GLushort
*ussrc
= (const GLushort
*) src
;
2008 for (i
= 0; i
< n
; i
++) {
2009 GLushort p
= ussrc
[i
];
2010 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
2011 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
2012 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
2013 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
2017 case GL_UNSIGNED_INT_8_8_8_8
:
2019 const GLuint
*uisrc
= (const GLuint
*) src
;
2021 for (i
= 0; i
< n
; i
++) {
2022 GLuint p
= uisrc
[i
];
2023 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2024 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2025 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2026 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2030 const GLuint
*uisrc
= (const GLuint
*) src
;
2032 for (i
= 0; i
< n
; i
++) {
2033 GLuint p
= uisrc
[i
];
2034 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2035 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2036 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2037 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2041 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2043 const GLuint
*uisrc
= (const GLuint
*) src
;
2045 for (i
= 0; i
< n
; i
++) {
2046 GLuint p
= uisrc
[i
];
2047 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2048 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2049 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2050 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2054 const GLuint
*uisrc
= (const GLuint
*) src
;
2056 for (i
= 0; i
< n
; i
++) {
2057 GLuint p
= uisrc
[i
];
2058 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2059 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2060 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2061 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2065 case GL_UNSIGNED_INT_10_10_10_2
:
2067 const GLuint
*uisrc
= (const GLuint
*) src
;
2069 for (i
= 0; i
< n
; i
++) {
2070 GLuint p
= uisrc
[i
];
2072 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2073 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2074 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2075 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2079 const GLuint
*uisrc
= (const GLuint
*) src
;
2081 for (i
= 0; i
< n
; i
++) {
2082 GLuint p
= uisrc
[i
];
2083 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2084 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2085 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2086 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2090 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2092 const GLuint
*uisrc
= (const GLuint
*) src
;
2094 for (i
= 0; i
< n
; i
++) {
2095 GLuint p
= uisrc
[i
];
2097 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2098 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2099 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2100 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2104 const GLuint
*uisrc
= (const GLuint
*) src
;
2106 for (i
= 0; i
< n
; i
++) {
2107 GLuint p
= uisrc
[i
];
2108 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2109 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2110 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2111 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2116 gl_problem(NULL
, "bad srcType in extract float data");
2124 * Unpack a row of color image data from a client buffer according to
2125 * the pixel unpacking parameters. Apply any enabled pixel transfer
2126 * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled.
2127 * Return GLubyte values in the specified dest image format.
2128 * This is (or will be) used by glDrawPixels and glTexImage?D().
2129 * Input: ctx - the context
2130 * n - number of pixels in the span
2131 * dstFormat - format of destination color array
2132 * dest - the destination color array
2133 * srcFormat - source image format
2134 * srcType - source image datatype
2135 * source - source image pointer
2136 * unpacking - pixel unpacking parameters
2137 * applyTransferOps - apply scale/bias/lookup-table ops?
2139 * XXX perhaps expand this to process whole images someday.
2142 _mesa_unpack_ubyte_color_span( GLcontext
*ctx
,
2143 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
2144 GLenum srcFormat
, GLenum srcType
,
2145 const GLvoid
*source
,
2146 const struct gl_pixelstore_attrib
*unpacking
,
2147 GLboolean applyTransferOps
)
2149 ASSERT(dstFormat
== GL_ALPHA
||
2150 dstFormat
== GL_LUMINANCE
||
2151 dstFormat
== GL_LUMINANCE_ALPHA
||
2152 dstFormat
== GL_INTENSITY
||
2153 dstFormat
== GL_RGB
||
2154 dstFormat
== GL_RGBA
||
2155 dstFormat
== GL_COLOR_INDEX
);
2157 ASSERT(srcFormat
== GL_RED
||
2158 srcFormat
== GL_GREEN
||
2159 srcFormat
== GL_BLUE
||
2160 srcFormat
== GL_ALPHA
||
2161 srcFormat
== GL_LUMINANCE
||
2162 srcFormat
== GL_LUMINANCE_ALPHA
||
2163 srcFormat
== GL_INTENSITY
||
2164 srcFormat
== GL_RGB
||
2165 srcFormat
== GL_BGR
||
2166 srcFormat
== GL_RGBA
||
2167 srcFormat
== GL_BGRA
||
2168 srcFormat
== GL_ABGR_EXT
||
2169 srcFormat
== GL_COLOR_INDEX
);
2171 ASSERT(srcType
== GL_BITMAP
||
2172 srcType
== GL_UNSIGNED_BYTE
||
2173 srcType
== GL_BYTE
||
2174 srcType
== GL_UNSIGNED_SHORT
||
2175 srcType
== GL_SHORT
||
2176 srcType
== GL_UNSIGNED_INT
||
2177 srcType
== GL_INT
||
2178 srcType
== GL_FLOAT
||
2179 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2180 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2181 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2182 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2183 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2184 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2185 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2186 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2187 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2188 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2189 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2190 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2192 /* this is intended for RGBA mode only */
2193 assert(ctx
->Visual
->RGBAflag
);
2195 applyTransferOps
&= (ctx
->Pixel
.ScaleOrBiasRGBA
||
2196 ctx
->Pixel
.MapColorFlag
||
2197 ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
2198 ctx
->Pixel
.ScaleOrBiasRGBApcm
||
2199 ctx
->Pixel
.ColorTableEnabled
||
2200 ctx
->Pixel
.PostColorMatrixColorTableEnabled
||
2201 ctx
->Pixel
.MinMaxEnabled
||
2202 ctx
->Pixel
.HistogramEnabled
);
2204 /* Try simple cases first */
2205 if (!applyTransferOps
&& srcType
== GL_UNSIGNED_BYTE
) {
2206 if (dstFormat
== GL_RGBA
) {
2207 if (srcFormat
== GL_RGBA
) {
2208 MEMCPY( dest
, source
, n
* 4 * sizeof(GLubyte
) );
2211 else if (srcFormat
== GL_RGB
) {
2213 const GLubyte
*src
= (const GLubyte
*) source
;
2214 GLubyte
*dst
= dest
;
2215 for (i
= 0; i
< n
; i
++) {
2226 else if (dstFormat
== GL_RGB
) {
2227 if (srcFormat
== GL_RGB
) {
2228 MEMCPY( dest
, source
, n
* 3 * sizeof(GLubyte
) );
2231 else if (srcFormat
== GL_RGBA
) {
2233 const GLubyte
*src
= (const GLubyte
*) source
;
2234 GLubyte
*dst
= dest
;
2235 for (i
= 0; i
< n
; i
++) {
2245 else if (dstFormat
== srcFormat
) {
2246 GLint comps
= _mesa_components_in_format(srcFormat
);
2248 MEMCPY( dest
, source
, n
* comps
* sizeof(GLubyte
) );
2254 /* general solution begins here */
2256 GLfloat rgba
[MAX_WIDTH
][4];
2257 GLint dstComponents
;
2258 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2259 GLint dstLuminanceIndex
, dstIntensityIndex
;
2261 dstComponents
= _mesa_components_in_format( dstFormat
);
2262 /* source & dest image formats should have been error checked by now */
2263 assert(dstComponents
> 0);
2266 * Extract image data and convert to RGBA floats
2268 assert(n
<= MAX_WIDTH
);
2269 if (srcFormat
== GL_COLOR_INDEX
) {
2270 GLuint indexes
[MAX_WIDTH
];
2271 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2274 if (applyTransferOps
) {
2275 if (ctx
->Pixel
.MapColorFlag
) {
2276 _mesa_map_ci(ctx
, n
, indexes
);
2278 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2279 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2283 if (dstFormat
== GL_COLOR_INDEX
) {
2284 /* convert to GLubyte and return */
2286 for (i
= 0; i
< n
; i
++) {
2287 dest
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2292 /* Convert indexes to RGBA */
2293 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2297 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2298 unpacking
->SwapBytes
);
2300 if (applyTransferOps
) {
2301 /* scale and bias colors */
2302 if (ctx
->Pixel
.ScaleOrBiasRGBA
) {
2303 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2305 /* color map lookup */
2306 if (ctx
->Pixel
.MapColorFlag
) {
2307 _mesa_map_rgba(ctx
, n
, rgba
);
2312 if (applyTransferOps
) {
2313 /* GL_COLOR_TABLE lookup */
2314 if (ctx
->Pixel
.ColorTableEnabled
) {
2315 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2317 /* XXX convolution here */
2318 /* XXX post-convolution color table look-up here */
2319 /* color matrix transform */
2320 if (ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
2321 ctx
->Pixel
.ScaleOrBiasRGBApcm
) {
2322 _mesa_transform_rgba(ctx
, n
, rgba
);
2324 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2325 if (ctx
->Pixel
.PostColorMatrixColorTableEnabled
) {
2326 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2328 /* update histogram count */
2329 if (ctx
->Pixel
.HistogramEnabled
) {
2330 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2332 /* XXX min/max here */
2333 if (ctx
->Pixel
.MinMaxEnabled
) {
2334 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2338 /* clamp to [0,1] */
2341 for (i
= 0; i
< n
; i
++) {
2342 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2343 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2344 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2345 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2349 /* Now determine which color channels we need to produce.
2350 * And determine the dest index (offset) within each color tuple.
2352 switch (dstFormat
) {
2355 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2356 dstLuminanceIndex
= dstIntensityIndex
= -1;
2359 dstLuminanceIndex
= 0;
2360 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2361 dstIntensityIndex
= -1;
2363 case GL_LUMINANCE_ALPHA
:
2364 dstLuminanceIndex
= 0;
2366 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2367 dstIntensityIndex
= -1;
2370 dstIntensityIndex
= 0;
2371 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2372 dstLuminanceIndex
= -1;
2378 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2385 dstLuminanceIndex
= dstIntensityIndex
= -1;
2388 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_ubyte_span()");
2393 /* Now return the GLubyte data in the requested dstFormat */
2395 if (dstRedIndex
>= 0) {
2396 GLubyte
*dst
= dest
;
2398 for (i
= 0; i
< n
; i
++) {
2399 dst
[dstRedIndex
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2400 dst
+= dstComponents
;
2404 if (dstGreenIndex
>= 0) {
2405 GLubyte
*dst
= dest
;
2407 for (i
= 0; i
< n
; i
++) {
2408 dst
[dstGreenIndex
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2409 dst
+= dstComponents
;
2413 if (dstBlueIndex
>= 0) {
2414 GLubyte
*dst
= dest
;
2416 for (i
= 0; i
< n
; i
++) {
2417 dst
[dstBlueIndex
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2418 dst
+= dstComponents
;
2422 if (dstAlphaIndex
>= 0) {
2423 GLubyte
*dst
= dest
;
2425 for (i
= 0; i
< n
; i
++) {
2426 dst
[dstAlphaIndex
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2427 dst
+= dstComponents
;
2431 if (dstIntensityIndex
>= 0) {
2432 GLubyte
*dst
= dest
;
2434 assert(dstIntensityIndex
== 0);
2435 assert(dstComponents
== 1);
2436 for (i
= 0; i
< n
; i
++) {
2437 /* Intensity comes from red channel */
2438 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2442 if (dstLuminanceIndex
>= 0) {
2443 GLubyte
*dst
= dest
;
2445 assert(dstLuminanceIndex
== 0);
2446 for (i
= 0; i
< n
; i
++) {
2447 /* Luminance comes from red channel */
2448 dst
[0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2449 dst
+= dstComponents
;
2457 _mesa_unpack_float_color_span( GLcontext
*ctx
,
2458 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
2459 GLenum srcFormat
, GLenum srcType
,
2460 const GLvoid
*source
,
2461 const struct gl_pixelstore_attrib
*unpacking
,
2462 GLboolean applyTransferOps
, GLboolean clamp
)
2464 ASSERT(dstFormat
== GL_ALPHA
||
2465 dstFormat
== GL_LUMINANCE
||
2466 dstFormat
== GL_LUMINANCE_ALPHA
||
2467 dstFormat
== GL_INTENSITY
||
2468 dstFormat
== GL_RGB
||
2469 dstFormat
== GL_RGBA
||
2470 dstFormat
== GL_COLOR_INDEX
);
2472 ASSERT(srcFormat
== GL_RED
||
2473 srcFormat
== GL_GREEN
||
2474 srcFormat
== GL_BLUE
||
2475 srcFormat
== GL_ALPHA
||
2476 srcFormat
== GL_LUMINANCE
||
2477 srcFormat
== GL_LUMINANCE_ALPHA
||
2478 srcFormat
== GL_INTENSITY
||
2479 srcFormat
== GL_RGB
||
2480 srcFormat
== GL_BGR
||
2481 srcFormat
== GL_RGBA
||
2482 srcFormat
== GL_BGRA
||
2483 srcFormat
== GL_ABGR_EXT
||
2484 srcFormat
== GL_COLOR_INDEX
);
2486 ASSERT(srcType
== GL_BITMAP
||
2487 srcType
== GL_UNSIGNED_BYTE
||
2488 srcType
== GL_BYTE
||
2489 srcType
== GL_UNSIGNED_SHORT
||
2490 srcType
== GL_SHORT
||
2491 srcType
== GL_UNSIGNED_INT
||
2492 srcType
== GL_INT
||
2493 srcType
== GL_FLOAT
||
2494 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2495 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2496 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2497 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2498 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2499 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2500 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2501 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2502 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2503 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2504 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2505 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2507 /* this is intended for RGBA mode only */
2508 assert(ctx
->Visual
->RGBAflag
);
2510 applyTransferOps
&= (ctx
->Pixel
.ScaleOrBiasRGBA
||
2511 ctx
->Pixel
.MapColorFlag
||
2512 ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
2513 ctx
->Pixel
.ScaleOrBiasRGBApcm
||
2514 ctx
->Pixel
.ColorTableEnabled
||
2515 ctx
->Pixel
.PostColorMatrixColorTableEnabled
||
2516 ctx
->Pixel
.MinMaxEnabled
||
2517 ctx
->Pixel
.HistogramEnabled
);
2519 /* general solution, no special cases, yet */
2521 GLfloat rgba
[MAX_WIDTH
][4];
2522 GLint dstComponents
;
2523 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2524 GLint dstLuminanceIndex
, dstIntensityIndex
;
2526 dstComponents
= _mesa_components_in_format( dstFormat
);
2527 /* source & dest image formats should have been error checked by now */
2528 assert(dstComponents
> 0);
2531 * Extract image data and convert to RGBA floats
2533 assert(n
<= MAX_WIDTH
);
2534 if (srcFormat
== GL_COLOR_INDEX
) {
2535 GLuint indexes
[MAX_WIDTH
];
2536 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2539 if (applyTransferOps
) {
2540 if (ctx
->Pixel
.MapColorFlag
) {
2541 _mesa_map_ci(ctx
, n
, indexes
);
2543 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2544 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2548 if (dstFormat
== GL_COLOR_INDEX
) {
2549 /* convert to GLubyte and return */
2551 for (i
= 0; i
< n
; i
++) {
2552 dest
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2557 /* Convert indexes to RGBA */
2558 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2562 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2563 unpacking
->SwapBytes
);
2565 if (applyTransferOps
) {
2566 /* scale and bias colors */
2567 if (ctx
->Pixel
.ScaleOrBiasRGBA
) {
2568 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2570 /* color map lookup */
2571 if (ctx
->Pixel
.MapColorFlag
) {
2572 _mesa_map_rgba(ctx
, n
, rgba
);
2577 if (applyTransferOps
) {
2578 /* GL_COLOR_TABLE lookup */
2579 if (ctx
->Pixel
.ColorTableEnabled
) {
2580 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2582 /* XXX convolution here */
2583 /* XXX post-convolution color table look-up here */
2584 /* color matrix transform */
2585 if (ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
2586 ctx
->Pixel
.ScaleOrBiasRGBApcm
) {
2587 _mesa_transform_rgba(ctx
, n
, rgba
);
2589 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2590 if (ctx
->Pixel
.PostColorMatrixColorTableEnabled
) {
2591 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2593 /* update histogram count */
2594 if (ctx
->Pixel
.HistogramEnabled
) {
2595 _mesa_update_histogram(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2597 /* XXX min/max here */
2598 if (ctx
->Pixel
.MinMaxEnabled
) {
2599 _mesa_update_minmax(ctx
, n
, (CONST
GLfloat (*)[4]) rgba
);
2603 /* clamp to [0,1] */
2606 for (i
= 0; i
< n
; i
++) {
2607 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2608 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2609 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2610 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2614 /* Now determine which color channels we need to produce.
2615 * And determine the dest index (offset) within each color tuple.
2617 switch (dstFormat
) {
2620 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2621 dstLuminanceIndex
= dstIntensityIndex
= -1;
2624 dstLuminanceIndex
= 0;
2625 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2626 dstIntensityIndex
= -1;
2628 case GL_LUMINANCE_ALPHA
:
2629 dstLuminanceIndex
= 0;
2631 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2632 dstIntensityIndex
= -1;
2635 dstIntensityIndex
= 0;
2636 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2637 dstLuminanceIndex
= -1;
2643 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2650 dstLuminanceIndex
= dstIntensityIndex
= -1;
2653 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_float_span()");
2657 /* Now pack results in teh requested dstFormat */
2658 if (dstRedIndex
>= 0) {
2659 GLfloat
*dst
= dest
;
2661 for (i
= 0; i
< n
; i
++) {
2662 dst
[dstRedIndex
] = rgba
[i
][RCOMP
];
2663 dst
+= dstComponents
;
2667 if (dstGreenIndex
>= 0) {
2668 GLfloat
*dst
= dest
;
2670 for (i
= 0; i
< n
; i
++) {
2671 dst
[dstGreenIndex
] = rgba
[i
][GCOMP
];
2672 dst
+= dstComponents
;
2676 if (dstBlueIndex
>= 0) {
2677 GLfloat
*dst
= dest
;
2679 for (i
= 0; i
< n
; i
++) {
2680 dst
[dstBlueIndex
] = rgba
[i
][BCOMP
];
2681 dst
+= dstComponents
;
2685 if (dstAlphaIndex
>= 0) {
2686 GLfloat
*dst
= dest
;
2688 for (i
= 0; i
< n
; i
++) {
2689 dst
[dstAlphaIndex
] = rgba
[i
][ACOMP
];
2690 dst
+= dstComponents
;
2694 if (dstIntensityIndex
>= 0) {
2695 GLfloat
*dst
= dest
;
2697 assert(dstIntensityIndex
== 0);
2698 assert(dstComponents
== 1);
2699 for (i
= 0; i
< n
; i
++) {
2700 /* Intensity comes from red channel */
2701 dst
[i
] = rgba
[i
][RCOMP
];
2705 if (dstLuminanceIndex
>= 0) {
2706 GLfloat
*dst
= dest
;
2708 assert(dstLuminanceIndex
== 0);
2709 for (i
= 0; i
< n
; i
++) {
2710 /* Luminance comes from red channel */
2711 dst
[0] = rgba
[i
][RCOMP
];
2712 dst
+= dstComponents
;
2722 * Unpack a row of color index data from a client buffer according to
2723 * the pixel unpacking parameters. Apply pixel transfer ops if enabled
2724 * and applyTransferOps is true.
2725 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
2727 * Args: ctx - the context
2728 * n - number of pixels
2729 * dstType - destination datatype
2730 * dest - destination array
2731 * srcType - source pixel type
2732 * source - source data pointer
2733 * unpacking - pixel unpacking parameters
2734 * applyTransferOps - apply offset/bias/lookup ops?
2737 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
2738 GLenum dstType
, GLvoid
*dest
,
2739 GLenum srcType
, const GLvoid
*source
,
2740 const struct gl_pixelstore_attrib
*unpacking
,
2741 GLboolean applyTransferOps
)
2743 ASSERT(srcType
== GL_BITMAP
||
2744 srcType
== GL_UNSIGNED_BYTE
||
2745 srcType
== GL_BYTE
||
2746 srcType
== GL_UNSIGNED_SHORT
||
2747 srcType
== GL_SHORT
||
2748 srcType
== GL_UNSIGNED_INT
||
2749 srcType
== GL_INT
||
2750 srcType
== GL_FLOAT
);
2752 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
2753 dstType
== GL_UNSIGNED_SHORT
||
2754 dstType
== GL_UNSIGNED_INT
);
2756 applyTransferOps
&= (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
|| ctx
->Pixel
.MapColorFlag
);
2759 * Try simple cases first
2761 if (!applyTransferOps
&& srcType
== GL_UNSIGNED_BYTE
2762 && dstType
== GL_UNSIGNED_BYTE
) {
2763 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
2765 else if (!applyTransferOps
&& srcType
== GL_UNSIGNED_INT
2766 && dstType
== GL_UNSIGNED_INT
&& !unpacking
->SwapBytes
) {
2767 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
2773 GLuint indexes
[MAX_WIDTH
];
2774 assert(n
<= MAX_WIDTH
);
2776 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
2779 if (applyTransferOps
) {
2780 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2781 /* shift and offset indexes */
2782 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2784 if (ctx
->Pixel
.MapColorFlag
) {
2785 /* Apply lookup table */
2786 _mesa_map_ci(ctx
, n
, indexes
);
2790 /* convert to dest type */
2792 case GL_UNSIGNED_BYTE
:
2794 GLubyte
*dst
= (GLubyte
*) dest
;
2796 for (i
= 0; i
< n
; i
++) {
2797 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2801 case GL_UNSIGNED_SHORT
:
2803 GLuint
*dst
= (GLuint
*) dest
;
2805 for (i
= 0; i
< n
; i
++) {
2806 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
2810 case GL_UNSIGNED_INT
:
2811 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
2814 gl_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
2821 * Unpack a row of stencil data from a client buffer according to
2822 * the pixel unpacking parameters. Apply pixel transfer ops if enabled
2823 * and applyTransferOps is true.
2824 * This is (or will be) used by glDrawPixels
2826 * Args: ctx - the context
2827 * n - number of pixels
2828 * dstType - destination datatype
2829 * dest - destination array
2830 * srcType - source pixel type
2831 * source - source data pointer
2832 * unpacking - pixel unpacking parameters
2833 * applyTransferOps - apply offset/bias/lookup ops?
2836 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
2837 GLenum dstType
, GLvoid
*dest
,
2838 GLenum srcType
, const GLvoid
*source
,
2839 const struct gl_pixelstore_attrib
*unpacking
,
2840 GLboolean applyTransferOps
)
2842 ASSERT(srcType
== GL_BITMAP
||
2843 srcType
== GL_UNSIGNED_BYTE
||
2844 srcType
== GL_BYTE
||
2845 srcType
== GL_UNSIGNED_SHORT
||
2846 srcType
== GL_SHORT
||
2847 srcType
== GL_UNSIGNED_INT
||
2848 srcType
== GL_INT
||
2849 srcType
== GL_FLOAT
);
2851 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
2852 dstType
== GL_UNSIGNED_SHORT
||
2853 dstType
== GL_UNSIGNED_INT
);
2855 applyTransferOps
&= (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
|| ctx
->Pixel
.MapColorFlag
);
2858 * Try simple cases first
2860 if (!applyTransferOps
&& srcType
== GL_UNSIGNED_BYTE
2861 && dstType
== GL_UNSIGNED_BYTE
) {
2862 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
2864 else if (!applyTransferOps
&& srcType
== GL_UNSIGNED_INT
2865 && dstType
== GL_UNSIGNED_INT
&& !unpacking
->SwapBytes
) {
2866 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
2872 GLuint indexes
[MAX_WIDTH
];
2873 assert(n
<= MAX_WIDTH
);
2875 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
2878 if (applyTransferOps
) {
2879 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2880 /* shift and offset indexes */
2881 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2884 if (ctx
->Pixel
.MapStencilFlag
) {
2885 /* Apply stencil lookup table */
2886 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
2889 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
2894 /* convert to dest type */
2896 case GL_UNSIGNED_BYTE
:
2898 GLubyte
*dst
= (GLubyte
*) dest
;
2900 for (i
= 0; i
< n
; i
++) {
2901 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2905 case GL_UNSIGNED_SHORT
:
2907 GLuint
*dst
= (GLuint
*) dest
;
2909 for (i
= 0; i
< n
; i
++) {
2910 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
2914 case GL_UNSIGNED_INT
:
2915 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
2918 gl_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
2926 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLdepth
*dest
,
2927 GLenum srcType
, const GLvoid
*source
,
2928 const struct gl_pixelstore_attrib
*unpacking
,
2929 GLboolean applyTransferOps
)
2931 GLfloat
*depth
= MALLOC(n
* sizeof(GLfloat
));
2939 const GLubyte
*src
= (const GLubyte
*) source
;
2940 for (i
= 0; i
< n
; i
++) {
2941 depth
[i
] = BYTE_TO_FLOAT(src
[i
]);
2945 case GL_UNSIGNED_BYTE
:
2948 const GLubyte
*src
= (const GLubyte
*) source
;
2949 for (i
= 0; i
< n
; i
++) {
2950 depth
[i
] = UBYTE_TO_FLOAT(src
[i
]);
2957 const GLshort
*src
= (const GLshort
*) source
;
2958 for (i
= 0; i
< n
; i
++) {
2959 depth
[i
] = SHORT_TO_FLOAT(src
[i
]);
2963 case GL_UNSIGNED_SHORT
:
2966 const GLushort
*src
= (const GLushort
*) source
;
2967 for (i
= 0; i
< n
; i
++) {
2968 depth
[i
] = USHORT_TO_FLOAT(src
[i
]);
2975 const GLint
*src
= (const GLint
*) source
;
2976 for (i
= 0; i
< n
; i
++) {
2977 depth
[i
] = INT_TO_FLOAT(src
[i
]);
2981 case GL_UNSIGNED_INT
:
2984 const GLuint
*src
= (const GLuint
*) source
;
2985 for (i
= 0; i
< n
; i
++) {
2986 depth
[i
] = UINT_TO_FLOAT(src
[i
]);
2991 MEMCPY(depth
, source
, n
* sizeof(GLfloat
));
2994 gl_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
2999 /* apply depth scale and bias */
3000 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
3002 for (i
= 0; i
< n
; i
++) {
3003 depth
[i
] = depth
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
3007 /* clamp depth values to [0,1] and convert from floats to integers */
3009 const GLfloat zs
= ctx
->Visual
->DepthMaxF
;
3011 for (i
= 0; i
< n
; i
++) {
3012 dest
[i
] = (GLdepth
) (CLAMP(depth
[i
], 0.0F
, 1.0F
) * zs
);
3022 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
3023 * Return all image data in a contiguous block.
3026 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
3027 GLenum format
, GLenum type
, const GLvoid
*pixels
,
3028 const struct gl_pixelstore_attrib
*unpack
)
3030 GLint bytesPerRow
, compsPerRow
;
3031 GLboolean flipBytes
, swap2
, swap4
;
3034 return NULL
; /* not necessarily an error */
3036 if (width
<= 0 || height
<= 0 || depth
<= 0)
3037 return NULL
; /* generate error later */
3039 if (format
== GL_BITMAP
) {
3040 bytesPerRow
= (width
+ 7) >> 3;
3041 flipBytes
= !unpack
->LsbFirst
;
3042 swap2
= swap4
= GL_FALSE
;
3046 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
3047 const GLint components
= _mesa_components_in_format(format
);
3049 if (bytesPerPixel
<= 0 || components
<= 0)
3050 return NULL
; /* bad format or type. generate error later */
3051 bytesPerRow
= bytesPerPixel
* width
;
3052 bytesPerComp
= bytesPerPixel
/ components
;
3053 flipBytes
= GL_FALSE
;
3054 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
3055 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
3056 compsPerRow
= components
* width
;
3057 assert(compsPerRow
>= width
);
3061 GLubyte
*destBuffer
= MALLOC(bytesPerRow
* height
* depth
);
3065 return NULL
; /* generate GL_OUT_OF_MEMORY later */
3068 for (img
= 0; img
< depth
; img
++) {
3069 for (row
= 0; row
< height
; row
++) {
3070 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
3071 width
, height
, format
, type
, img
, row
, 0);
3072 MEMCPY(dst
, src
, bytesPerRow
);
3073 /* byte flipping/swapping */
3075 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
3078 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
3081 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
3092 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
3093 * order with row alignment = 1 byte.
3096 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
3097 const struct gl_pixelstore_attrib
*packing
)
3099 GLint bytes
, row
, width_in_bytes
;
3100 GLubyte
*buffer
, *dst
;
3105 /* Alloc dest storage */
3106 bytes
= ((width
+ 7) / 8 * height
);
3107 buffer
= (GLubyte
*) MALLOC( bytes
);
3112 width_in_bytes
= CEILING( width
, 8 );
3114 for (row
= 0; row
< height
; row
++) {
3115 GLubyte
*src
= _mesa_image_address( packing
, pixels
, width
, height
,
3116 GL_COLOR_INDEX
, GL_BITMAP
,
3123 if (packing
->SkipPixels
== 0) {
3124 MEMCPY( dst
, src
, width_in_bytes
);
3125 if (packing
->LsbFirst
) {
3126 flip_bytes( dst
, width_in_bytes
);
3130 /* handling SkipPixels is a bit tricky (no pun intended!) */
3132 if (packing
->LsbFirst
) {
3133 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
3134 GLubyte dstMask
= 128;
3138 for (i
= 0; i
< width
; i
++) {
3142 if (srcMask
== 128) {
3147 srcMask
= srcMask
<< 1;
3155 dstMask
= dstMask
>> 1;
3160 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
3161 GLubyte dstMask
= 128;
3165 for (i
= 0; i
< width
; i
++) {
3174 srcMask
= srcMask
>> 1;
3182 dstMask
= dstMask
>> 1;
3187 dst
+= width_in_bytes
;
3198 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
3199 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
3201 GLint row
, width_in_bytes
;
3207 width_in_bytes
= CEILING( width
, 8 );
3209 for (row
= 0; row
< height
; row
++) {
3210 GLubyte
*dst
= _mesa_image_address( packing
, dest
, width
, height
,
3211 GL_COLOR_INDEX
, GL_BITMAP
,
3216 if (packing
->SkipPixels
== 0) {
3217 MEMCPY( dst
, src
, width_in_bytes
);
3218 if (packing
->LsbFirst
) {
3219 flip_bytes( dst
, width_in_bytes
);
3223 /* handling SkipPixels is a bit tricky (no pun intended!) */
3225 if (packing
->LsbFirst
) {
3226 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
3227 GLubyte dstMask
= 128;
3228 const GLubyte
*s
= src
;
3231 for (i
= 0; i
< width
; i
++) {
3235 if (srcMask
== 128) {
3240 srcMask
= srcMask
<< 1;
3248 dstMask
= dstMask
>> 1;
3253 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
3254 GLubyte dstMask
= 128;
3255 const GLubyte
*s
= src
;
3258 for (i
= 0; i
< width
; i
++) {
3267 srcMask
= srcMask
>> 1;
3275 dstMask
= dstMask
>> 1;
3280 src
+= width_in_bytes
;