1 /* $Id: image.c,v 1.28 2000/04/17 15:13: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.
44 * These are the image packing parameters for Mesa's internal images.
45 * That is, _mesa_unpack_image() returns image data in this format.
46 * When we execute image commands (glDrawPixels, glTexImage, etc)
47 * from within display lists we have to be sure to set the current
48 * unpacking params to these values!
50 const struct gl_pixelstore_attrib _mesa_native_packing
= {
57 GL_FALSE
, /* SwapBytes */
58 GL_FALSE
/* LsbFirst */
64 * Flip the 8 bits in each byte of the given array.
67 flip_bytes( GLubyte
*p
, GLuint n
)
69 register GLuint i
, a
, b
;
73 a
= ((b
& 0x01) << 7) |
87 * Flip the order of the 2 bytes in each word in the given array.
90 _mesa_swap2( GLushort
*p
, GLuint n
)
95 p
[i
] = (p
[i
] >> 8) | ((p
[i
] << 8) & 0xff00);
102 * Flip the order of the 4 bytes in each word in the given array.
105 _mesa_swap4( GLuint
*p
, GLuint n
)
107 register GLuint i
, a
, b
;
112 | ((b
>> 8) & 0xff00)
113 | ((b
<< 8) & 0xff0000)
114 | ((b
<< 24) & 0xff000000);
123 * Return the size, in bytes, of the given GL datatype.
124 * Return 0 if GL_BITMAP.
125 * Return -1 if invalid type enum.
127 GLint
_mesa_sizeof_type( GLenum type
)
132 case GL_UNSIGNED_BYTE
:
133 return sizeof(GLubyte
);
135 return sizeof(GLbyte
);
136 case GL_UNSIGNED_SHORT
:
137 return sizeof(GLushort
);
139 return sizeof(GLshort
);
140 case GL_UNSIGNED_INT
:
141 return sizeof(GLuint
);
143 return sizeof(GLint
);
145 return sizeof(GLfloat
);
153 * Same as _mesa_sizeof_packed_type() but we also accept the
154 * packed pixel format datatypes.
156 GLint
_mesa_sizeof_packed_type( GLenum type
)
161 case GL_UNSIGNED_BYTE
:
162 return sizeof(GLubyte
);
164 return sizeof(GLbyte
);
165 case GL_UNSIGNED_SHORT
:
166 return sizeof(GLushort
);
168 return sizeof(GLshort
);
169 case GL_UNSIGNED_INT
:
170 return sizeof(GLuint
);
172 return sizeof(GLint
);
174 return sizeof(GLfloat
);
175 case GL_UNSIGNED_BYTE_3_3_2
:
176 return sizeof(GLubyte
);
177 case GL_UNSIGNED_BYTE_2_3_3_REV
:
178 return sizeof(GLubyte
);
179 case GL_UNSIGNED_SHORT_5_6_5
:
180 return sizeof(GLshort
);
181 case GL_UNSIGNED_SHORT_5_6_5_REV
:
182 return sizeof(GLshort
);
183 case GL_UNSIGNED_SHORT_4_4_4_4
:
184 return sizeof(GLshort
);
185 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
186 return sizeof(GLshort
);
187 case GL_UNSIGNED_SHORT_5_5_5_1
:
188 return sizeof(GLshort
);
189 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
190 return sizeof(GLshort
);
191 case GL_UNSIGNED_INT_8_8_8_8
:
192 return sizeof(GLuint
);
193 case GL_UNSIGNED_INT_8_8_8_8_REV
:
194 return sizeof(GLuint
);
195 case GL_UNSIGNED_INT_10_10_10_2
:
196 return sizeof(GLuint
);
197 case GL_UNSIGNED_INT_2_10_10_10_REV
:
198 return sizeof(GLuint
);
207 * Return the number of components in a GL enum pixel type.
208 * Return -1 if bad format.
210 GLint
_mesa_components_in_format( GLenum format
)
214 case GL_COLOR_INDEX1_EXT
:
215 case GL_COLOR_INDEX2_EXT
:
216 case GL_COLOR_INDEX4_EXT
:
217 case GL_COLOR_INDEX8_EXT
:
218 case GL_COLOR_INDEX12_EXT
:
219 case GL_COLOR_INDEX16_EXT
:
220 case GL_STENCIL_INDEX
:
221 case GL_DEPTH_COMPONENT
:
229 case GL_LUMINANCE_ALPHA
:
248 * Return bytes per pixel for given format and type
249 * Return -1 if bad format or type.
251 GLint
_mesa_bytes_per_pixel( GLenum format
, GLenum type
)
253 GLint comps
= _mesa_components_in_format( format
);
259 return 0; /* special case */
261 case GL_UNSIGNED_BYTE
:
262 return comps
* sizeof(GLubyte
);
264 case GL_UNSIGNED_SHORT
:
265 return comps
* sizeof(GLshort
);
267 case GL_UNSIGNED_INT
:
268 return comps
* sizeof(GLint
);
270 return comps
* sizeof(GLfloat
);
271 case GL_UNSIGNED_BYTE_3_3_2
:
272 case GL_UNSIGNED_BYTE_2_3_3_REV
:
273 if (format
== GL_RGB
|| format
== GL_BGR
)
274 return sizeof(GLubyte
);
276 return -1; /* error */
277 case GL_UNSIGNED_SHORT_5_6_5
:
278 case GL_UNSIGNED_SHORT_5_6_5_REV
:
279 if (format
== GL_RGB
|| format
== GL_BGR
)
280 return sizeof(GLshort
);
282 return -1; /* error */
283 case GL_UNSIGNED_SHORT_4_4_4_4
:
284 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
285 case GL_UNSIGNED_SHORT_5_5_5_1
:
286 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
287 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
288 return sizeof(GLushort
);
291 case GL_UNSIGNED_INT_8_8_8_8
:
292 case GL_UNSIGNED_INT_8_8_8_8_REV
:
293 case GL_UNSIGNED_INT_10_10_10_2
:
294 case GL_UNSIGNED_INT_2_10_10_10_REV
:
295 if (format
== GL_RGBA
|| format
== GL_BGRA
|| format
== GL_ABGR_EXT
)
296 return sizeof(GLuint
);
306 * Test if the given pixel format and type are legal.
307 * Return GL_TRUE for legal, GL_FALSE for illegal.
310 _mesa_is_legal_format_and_type( GLenum format
, GLenum type
)
314 case GL_STENCIL_INDEX
:
318 case GL_UNSIGNED_BYTE
:
320 case GL_UNSIGNED_SHORT
:
322 case GL_UNSIGNED_INT
:
333 case GL_LUMINANCE_ALPHA
:
334 case GL_DEPTH_COMPONENT
:
338 case GL_UNSIGNED_BYTE
:
340 case GL_UNSIGNED_SHORT
:
342 case GL_UNSIGNED_INT
:
351 case GL_UNSIGNED_BYTE
:
353 case GL_UNSIGNED_SHORT
:
355 case GL_UNSIGNED_INT
:
357 case GL_UNSIGNED_BYTE_3_3_2
:
358 case GL_UNSIGNED_BYTE_2_3_3_REV
:
359 case GL_UNSIGNED_SHORT_5_6_5
:
360 case GL_UNSIGNED_SHORT_5_6_5_REV
:
370 case GL_UNSIGNED_BYTE
:
372 case GL_UNSIGNED_SHORT
:
374 case GL_UNSIGNED_INT
:
376 case GL_UNSIGNED_SHORT_4_4_4_4
:
377 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
378 case GL_UNSIGNED_SHORT_5_5_5_1
:
379 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
380 case GL_UNSIGNED_INT_8_8_8_8
:
381 case GL_UNSIGNED_INT_8_8_8_8_REV
:
382 case GL_UNSIGNED_INT_10_10_10_2
:
383 case GL_UNSIGNED_INT_2_10_10_10_REV
:
397 * Return the address of a pixel in an image (actually a volume).
398 * Pixel unpacking/packing parameters are observed according to 'packing'.
399 * Input: image - start of image data
400 * width, height - size of image
401 * format - image format
402 * type - pixel component type
403 * packing - the pixelstore attributes
404 * img - which image in the volume (0 for 1D or 2D images)
405 * row, column - location of pixel in the image
406 * Return: address of pixel at (image,row,column) in image or NULL if error.
409 _mesa_image_address( const struct gl_pixelstore_attrib
*packing
,
410 const GLvoid
*image
, GLsizei width
,
411 GLsizei height
, GLenum format
, GLenum type
,
412 GLint img
, GLint row
, GLint column
)
414 GLint alignment
; /* 1, 2 or 4 */
415 GLint pixels_per_row
;
416 GLint rows_per_image
;
419 GLint skipimages
; /* for 3-D volume images */
422 alignment
= packing
->Alignment
;
423 if (packing
->RowLength
> 0) {
424 pixels_per_row
= packing
->RowLength
;
427 pixels_per_row
= width
;
429 if (packing
->ImageHeight
> 0) {
430 rows_per_image
= packing
->ImageHeight
;
433 rows_per_image
= height
;
435 skiprows
= packing
->SkipRows
;
436 skippixels
= packing
->SkipPixels
;
437 skipimages
= packing
->SkipImages
;
439 if (type
==GL_BITMAP
) {
441 GLint comp_per_pixel
; /* components per pixel */
442 GLint bytes_per_comp
; /* bytes per component */
444 GLint bytes_per_image
;
446 /* Compute bytes per component */
447 bytes_per_comp
= _mesa_sizeof_packed_type( type
);
448 if (bytes_per_comp
<0) {
452 /* Compute number of components per pixel */
453 comp_per_pixel
= _mesa_components_in_format( format
);
454 if (comp_per_pixel
<0 && type
!= GL_BITMAP
) {
458 bytes_per_row
= alignment
459 * CEILING( comp_per_pixel
*pixels_per_row
, 8*alignment
);
461 bytes_per_image
= bytes_per_row
* rows_per_image
;
463 pixel_addr
= (GLubyte
*) image
464 + (skipimages
+ img
) * bytes_per_image
465 + (skiprows
+ row
) * bytes_per_row
466 + (skippixels
+ column
) / 8;
469 /* Non-BITMAP data */
470 GLint bytes_per_pixel
, bytes_per_row
, remainder
, bytes_per_image
;
472 bytes_per_pixel
= _mesa_bytes_per_pixel( format
, type
);
474 /* The pixel type and format should have been error checked earlier */
475 assert(bytes_per_pixel
> 0);
477 bytes_per_row
= pixels_per_row
* bytes_per_pixel
;
478 remainder
= bytes_per_row
% alignment
;
480 bytes_per_row
+= (alignment
- remainder
);
482 ASSERT(bytes_per_row
% alignment
== 0);
484 bytes_per_image
= bytes_per_row
* rows_per_image
;
486 /* compute final pixel address */
487 pixel_addr
= (GLubyte
*) image
488 + (skipimages
+ img
) * bytes_per_image
489 + (skiprows
+ row
) * bytes_per_row
490 + (skippixels
+ column
) * bytes_per_pixel
;
493 return (GLvoid
*) pixel_addr
;
499 * Compute the stride between image rows (in bytes) for the given
500 * pixel packing parameters and image width, format and type.
503 _mesa_image_row_stride( const struct gl_pixelstore_attrib
*packing
,
504 GLint width
, GLenum format
, GLenum type
)
507 if (type
== GL_BITMAP
) {
509 if (packing
->RowLength
== 0) {
510 GLint bytes
= (width
+ 7) / 8;
514 GLint bytes
= (packing
->RowLength
+ 7) / 8;
519 /* Non-BITMAP data */
520 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
521 if (bytesPerPixel
<= 0)
522 return -1; /* error */
523 if (packing
->RowLength
== 0) {
524 GLint bytes
= bytesPerPixel
* width
;
528 GLint bytes
= bytesPerPixel
* packing
->RowLength
;
537 * Unpack a 32x32 pixel polygon stipple from user memory using the
538 * current pixel unpack settings.
541 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
542 const struct gl_pixelstore_attrib
*unpacking
)
544 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap( 32, 32, pattern
, unpacking
);
546 /* Convert pattern from GLubytes to GLuints and handle big/little
551 for (i
= 0; i
< 32; i
++) {
552 dest
[i
] = (p
[0] << 24)
565 * Pack polygon stipple into user memory given current pixel packing
569 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
570 const struct gl_pixelstore_attrib
*packing
)
572 /* Convert pattern from GLuints to GLubytes to handle big/little
573 * endian differences.
577 for (i
= 0; i
< 32; i
++) {
578 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
579 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
580 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
581 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
584 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
590 * Pack the given RGBA span into client memory at 'dest' address
591 * in the given pixel format and type.
592 * Optionally apply the enabled pixel transfer ops.
593 * Pack into memory using the given packing params struct.
594 * This is used by glReadPixels and glGetTexImage?D()
595 * Input: ctx - the context
596 * n - number of pixels in the span
598 * format - dest packing format
599 * type - dest packing datatype
600 * destination - destination packing address
601 * packing - pixel packing parameters
602 * applyTransferOps - apply scale/bias/lookup-table ops?
605 _mesa_pack_rgba_span( const GLcontext
*ctx
,
606 GLuint n
, CONST GLubyte srcRgba
[][4],
607 GLenum format
, GLenum type
, GLvoid
*destination
,
608 const struct gl_pixelstore_attrib
*packing
,
609 GLboolean applyTransferOps
)
611 applyTransferOps
&= (ctx
->Pixel
.ScaleOrBiasRGBA
||
612 ctx
->Pixel
.MapColorFlag
||
613 ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
614 ctx
->Pixel
.ScaleOrBiasRGBApcm
||
615 ctx
->Pixel
.ColorTableEnabled
||
616 ctx
->Pixel
.PostColorMatrixColorTableEnabled
);
618 /* Test for optimized case first */
619 if (!applyTransferOps
&& format
== GL_RGBA
&& type
== GL_UNSIGNED_BYTE
) {
620 /* common simple case */
621 MEMCPY( destination
, srcRgba
, n
* 4 * sizeof(GLubyte
) );
623 else if (!applyTransferOps
&& format
== GL_RGB
&& type
== GL_UNSIGNED_BYTE
) {
624 /* common simple case */
626 GLubyte
*dest
= (GLubyte
*) destination
;
627 for (i
= 0; i
< n
; i
++) {
628 dest
[0] = srcRgba
[i
][RCOMP
];
629 dest
[1] = srcRgba
[i
][GCOMP
];
630 dest
[2] = srcRgba
[i
][BCOMP
];
635 /* general solution */
636 GLfloat rgba
[MAX_WIDTH
][4], luminance
[MAX_WIDTH
];
637 const GLfloat rscale
= 1.0F
/ 255.0F
;
638 const GLfloat gscale
= 1.0F
/ 255.0F
;
639 const GLfloat bscale
= 1.0F
/ 255.0F
;
640 const GLfloat ascale
= 1.0F
/ 255.0F
;
641 const GLint comps
= _mesa_components_in_format(format
);
644 assert(n
<= MAX_WIDTH
);
646 /* convert color components to floating point */
648 rgba
[i
][RCOMP
] = srcRgba
[i
][RCOMP
] * rscale
;
649 rgba
[i
][GCOMP
] = srcRgba
[i
][GCOMP
] * gscale
;
650 rgba
[i
][BCOMP
] = srcRgba
[i
][BCOMP
] * bscale
;
651 rgba
[i
][ACOMP
] = srcRgba
[i
][ACOMP
] * ascale
;
655 * Apply scale, bias and lookup-tables if enabled.
657 if (applyTransferOps
) {
659 if (ctx
->Pixel
.ScaleOrBiasRGBA
) {
660 _mesa_scale_and_bias_rgba( ctx
, n
, rgba
);
662 /* color map lookup */
663 if (ctx
->Pixel
.MapColorFlag
) {
664 _mesa_map_rgba( ctx
, n
, rgba
);
666 /* GL_COLOR_TABLE lookup */
667 if (ctx
->Pixel
.ColorTableEnabled
) {
668 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
670 /* XXX convolution here */
671 /* XXX post-convolution color table look-up here */
673 if (ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
674 ctx
->Pixel
.ScaleOrBiasRGBApcm
) {
675 _mesa_transform_rgba(ctx
, n
, rgba
);
677 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
678 if (ctx
->Pixel
.PostColorMatrixColorTableEnabled
) {
679 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
681 /* XXX histogram here */
682 /* XXX min/max here */
685 if (format
==GL_LUMINANCE
|| format
==GL_LUMINANCE_ALPHA
) {
687 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
688 luminance
[i
] = CLAMP( sum
, 0.0F
, 1.0F
);
693 * Pack/store the pixels. Ugh! Lots of cases!!!
696 case GL_UNSIGNED_BYTE
:
698 GLubyte
*dst
= (GLubyte
*) destination
;
702 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
706 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
710 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
714 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
718 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
720 case GL_LUMINANCE_ALPHA
:
722 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
723 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
728 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
729 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
730 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
735 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
736 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
737 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
738 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
743 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
744 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
745 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
750 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
751 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
752 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
753 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
758 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
759 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
760 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
761 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
765 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
771 GLbyte
*dst
= (GLbyte
*) destination
;
775 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
779 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
783 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
787 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
791 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
793 case GL_LUMINANCE_ALPHA
:
795 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
796 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
801 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
802 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
803 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
808 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
809 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
810 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
811 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
816 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
817 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
818 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
823 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
824 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
825 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
826 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
830 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
831 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
832 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
833 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
837 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
841 case GL_UNSIGNED_SHORT
:
843 GLushort
*dst
= (GLushort
*) destination
;
847 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
851 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
855 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
859 dst
[i
] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
863 dst
[i
] = FLOAT_TO_USHORT(luminance
[i
]);
865 case GL_LUMINANCE_ALPHA
:
867 dst
[i
*2+0] = FLOAT_TO_USHORT(luminance
[i
]);
868 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
873 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
874 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
875 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
880 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
881 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
882 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
883 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
888 dst
[i
*3+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
889 dst
[i
*3+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
890 dst
[i
*3+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
895 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
896 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
897 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
898 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
903 dst
[i
*4+0] = FLOAT_TO_USHORT(rgba
[i
][ACOMP
]);
904 dst
[i
*4+1] = FLOAT_TO_USHORT(rgba
[i
][BCOMP
]);
905 dst
[i
*4+2] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
906 dst
[i
*4+3] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
910 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
912 if (packing
->SwapBytes
) {
913 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
919 GLshort
*dst
= (GLshort
*) destination
;
923 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
927 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
931 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
935 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
939 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
941 case GL_LUMINANCE_ALPHA
:
943 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
944 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
949 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
950 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
951 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
956 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
957 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
958 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
959 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
964 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
965 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
966 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
971 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
972 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
973 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
974 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
978 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
979 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
980 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
981 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
985 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
987 if (packing
->SwapBytes
) {
988 _mesa_swap2( (GLushort
*) dst
, n
* comps
);
992 case GL_UNSIGNED_INT
:
994 GLuint
*dst
= (GLuint
*) destination
;
998 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1002 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1006 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1010 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1014 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1016 case GL_LUMINANCE_ALPHA
:
1018 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1019 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1024 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1025 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1026 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1031 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1032 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1033 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1034 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1039 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1040 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1041 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1046 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1047 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1048 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1049 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1054 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1055 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1056 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1057 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1061 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1063 if (packing
->SwapBytes
) {
1064 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1070 GLint
*dst
= (GLint
*) destination
;
1074 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1078 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1082 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1086 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1090 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1092 case GL_LUMINANCE_ALPHA
:
1094 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1095 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1100 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1101 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1102 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1107 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1108 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1109 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1110 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1115 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1116 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1117 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1122 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1123 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1124 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1125 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1130 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1131 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1132 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1133 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1137 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1139 if (packing
->SwapBytes
) {
1140 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1146 GLfloat
*dst
= (GLfloat
*) destination
;
1150 dst
[i
] = rgba
[i
][RCOMP
];
1154 dst
[i
] = rgba
[i
][GCOMP
];
1158 dst
[i
] = rgba
[i
][BCOMP
];
1162 dst
[i
] = rgba
[i
][ACOMP
];
1166 dst
[i
] = luminance
[i
];
1168 case GL_LUMINANCE_ALPHA
:
1170 dst
[i
*2+0] = luminance
[i
];
1171 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1176 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1177 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1178 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1183 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1184 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1185 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1186 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1191 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1192 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1193 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1198 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1199 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1200 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1201 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1206 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1207 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1208 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1209 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1213 gl_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1215 if (packing
->SwapBytes
) {
1216 _mesa_swap4( (GLuint
*) dst
, n
* comps
);
1220 case GL_UNSIGNED_BYTE_3_3_2
:
1221 if (format
== GL_RGB
) {
1222 GLubyte
*dst
= (GLubyte
*) destination
;
1224 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) << 5)
1225 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 2)
1226 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) );
1230 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1231 if (format
== GL_RGB
) {
1232 GLubyte
*dst
= (GLubyte
*) destination
;
1234 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 7.0F
)) )
1235 | (((GLint
) (rgba
[i
][GCOMP
] * 7.0F
)) << 3)
1236 | (((GLint
) (rgba
[i
][BCOMP
] * 3.0F
)) << 5);
1240 case GL_UNSIGNED_SHORT_5_6_5
:
1241 if (format
== GL_RGB
) {
1242 GLushort
*dst
= (GLushort
*) destination
;
1244 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1245 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1246 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) );
1250 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1251 if (format
== GL_RGB
) {
1252 GLushort
*dst
= (GLushort
*) destination
;
1254 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1255 | (((GLint
) (rgba
[i
][GCOMP
] * 63.0F
)) << 5)
1256 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 11);
1260 case GL_UNSIGNED_SHORT_4_4_4_4
:
1261 if (format
== GL_RGB
) {
1262 GLushort
*dst
= (GLushort
*) destination
;
1264 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) << 12)
1265 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 8)
1266 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 4)
1267 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) );
1271 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1272 if (format
== GL_RGB
) {
1273 GLushort
*dst
= (GLushort
*) destination
;
1275 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 15.0F
)) )
1276 | (((GLint
) (rgba
[i
][GCOMP
] * 15.0F
)) << 4)
1277 | (((GLint
) (rgba
[i
][BCOMP
] * 15.0F
)) << 8)
1278 | (((GLint
) (rgba
[i
][ACOMP
] * 15.0F
)) << 12);
1282 case GL_UNSIGNED_SHORT_5_5_5_1
:
1283 if (format
== GL_RGB
) {
1284 GLushort
*dst
= (GLushort
*) destination
;
1286 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) << 11)
1287 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 6)
1288 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 1)
1289 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) );
1293 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1294 if (format
== GL_RGB
) {
1295 GLushort
*dst
= (GLushort
*) destination
;
1297 dst
[i
] = (((GLint
) (rgba
[i
][RCOMP
] * 31.0F
)) )
1298 | (((GLint
) (rgba
[i
][GCOMP
] * 31.0F
)) << 5)
1299 | (((GLint
) (rgba
[i
][BCOMP
] * 31.0F
)) << 10)
1300 | (((GLint
) (rgba
[i
][ACOMP
] * 1.0F
)) << 15);
1304 case GL_UNSIGNED_INT_8_8_8_8
:
1305 if (format
== GL_RGBA
) {
1306 GLuint
*dst
= (GLuint
*) destination
;
1308 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24)
1309 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1310 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1311 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1314 else if (format
== GL_BGRA
) {
1315 GLuint
*dst
= (GLuint
*) destination
;
1317 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 24)
1318 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1319 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 8)
1320 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) );
1323 else if (format
== GL_ABGR_EXT
) {
1324 GLuint
*dst
= (GLuint
*) destination
;
1326 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24)
1327 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1328 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1329 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) );
1333 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1334 if (format
== GL_RGBA
) {
1335 GLuint
*dst
= (GLuint
*) destination
;
1337 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) )
1338 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1339 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 16)
1340 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1343 else if (format
== GL_BGRA
) {
1344 GLuint
*dst
= (GLuint
*) destination
;
1346 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) )
1347 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 8)
1348 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 16)
1349 | (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) << 24);
1352 else if (format
== GL_ABGR_EXT
) {
1353 GLuint
*dst
= (GLuint
*) destination
;
1355 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 255.0F
)) )
1356 | (((GLuint
) (rgba
[i
][BCOMP
] * 255.0F
)) << 8)
1357 | (((GLuint
) (rgba
[i
][GCOMP
] * 255.0F
)) << 16)
1358 | (((GLuint
) (rgba
[i
][RCOMP
] * 255.0F
)) << 24);
1362 case GL_UNSIGNED_INT_10_10_10_2
:
1363 if (format
== GL_RGBA
) {
1364 GLuint
*dst
= (GLuint
*) destination
;
1366 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 22)
1367 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1368 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 2)
1369 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1372 else if (format
== GL_BGRA
) {
1373 GLuint
*dst
= (GLuint
*) destination
;
1375 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 22)
1376 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 12)
1377 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 2)
1378 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) );
1381 else if (format
== GL_ABGR_EXT
) {
1382 GLuint
*dst
= (GLuint
*) destination
;
1384 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) << 22)
1385 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 12)
1386 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 2)
1387 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) );
1391 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1392 if (format
== GL_RGBA
) {
1393 GLuint
*dst
= (GLuint
*) destination
;
1395 dst
[i
] = (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) )
1396 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1397 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 20)
1398 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1401 else if (format
== GL_BGRA
) {
1402 GLuint
*dst
= (GLuint
*) destination
;
1404 dst
[i
] = (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) )
1405 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 10)
1406 | (((GLuint
) (rgba
[i
][RCOMP
] * 1023.0F
)) << 20)
1407 | (((GLuint
) (rgba
[i
][ACOMP
] * 3.0F
)) << 30);
1410 else if (format
== GL_ABGR_EXT
) {
1411 GLuint
*dst
= (GLuint
*) destination
;
1413 dst
[i
] = (((GLuint
) (rgba
[i
][ACOMP
] * 1023.0F
)) )
1414 | (((GLuint
) (rgba
[i
][BCOMP
] * 1023.0F
)) << 10)
1415 | (((GLuint
) (rgba
[i
][GCOMP
] * 1023.0F
)) << 20)
1416 | (((GLuint
) (rgba
[i
][RCOMP
] * 3.0F
)) << 30);
1421 gl_problem( ctx
, "bad type in _mesa_pack_rgba_span" );
1428 #define SWAP2BYTE(VALUE) \
1430 GLubyte *bytes = (GLubyte *) &(VALUE); \
1431 GLubyte tmp = bytes[0]; \
1432 bytes[0] = bytes[1]; \
1436 #define SWAP4BYTE(VALUE) \
1438 GLubyte *bytes = (GLubyte *) &(VALUE); \
1439 GLubyte tmp = bytes[0]; \
1440 bytes[0] = bytes[3]; \
1443 bytes[1] = bytes[2]; \
1449 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1450 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1451 const struct gl_pixelstore_attrib
*unpack
)
1453 assert(srcFormat
== GL_COLOR_INDEX
);
1455 ASSERT(srcType
== GL_BITMAP
||
1456 srcType
== GL_UNSIGNED_BYTE
||
1457 srcType
== GL_BYTE
||
1458 srcType
== GL_UNSIGNED_SHORT
||
1459 srcType
== GL_SHORT
||
1460 srcType
== GL_UNSIGNED_INT
||
1461 srcType
== GL_INT
||
1462 srcType
== GL_FLOAT
);
1467 GLubyte
*ubsrc
= (GLubyte
*) src
;
1468 if (unpack
->LsbFirst
) {
1469 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1471 for (i
= 0; i
< n
; i
++) {
1472 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1483 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1485 for (i
= 0; i
< n
; i
++) {
1486 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1498 case GL_UNSIGNED_BYTE
:
1501 const GLubyte
*s
= (const GLubyte
*) src
;
1502 for (i
= 0; i
< n
; i
++)
1509 const GLbyte
*s
= (const GLbyte
*) src
;
1510 for (i
= 0; i
< n
; i
++)
1514 case GL_UNSIGNED_SHORT
:
1517 const GLushort
*s
= (const GLushort
*) src
;
1518 if (unpack
->SwapBytes
) {
1519 for (i
= 0; i
< n
; i
++) {
1520 GLushort value
= s
[i
];
1526 for (i
= 0; i
< n
; i
++)
1534 const GLshort
*s
= (const GLshort
*) src
;
1535 if (unpack
->SwapBytes
) {
1536 for (i
= 0; i
< n
; i
++) {
1537 GLshort value
= s
[i
];
1543 for (i
= 0; i
< n
; i
++)
1548 case GL_UNSIGNED_INT
:
1551 const GLuint
*s
= (const GLuint
*) src
;
1552 if (unpack
->SwapBytes
) {
1553 for (i
= 0; i
< n
; i
++) {
1554 GLuint value
= s
[i
];
1560 for (i
= 0; i
< n
; i
++)
1568 const GLint
*s
= (const GLint
*) src
;
1569 if (unpack
->SwapBytes
) {
1570 for (i
= 0; i
< n
; i
++) {
1577 for (i
= 0; i
< n
; i
++)
1585 const GLfloat
*s
= (const GLfloat
*) src
;
1586 if (unpack
->SwapBytes
) {
1587 for (i
= 0; i
< n
; i
++) {
1588 GLfloat value
= s
[i
];
1590 indexes
[i
] = (GLuint
) value
;
1594 for (i
= 0; i
< n
; i
++)
1595 indexes
[i
] = (GLuint
) s
[i
];
1600 gl_problem(NULL
, "bad srcType in extract_uint_indexes");
1608 * This function extracts floating point RGBA values from arbitrary
1609 * image data. srcFormat and srcType are the format and type parameters
1610 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1612 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1613 * implements the "Conversion to floating point", "Conversion to RGB",
1614 * and "Final Expansion to RGBA" operations.
1616 * Args: n - number of pixels
1617 * rgba - output colors
1618 * srcFormat - format of incoming data
1619 * srcType - datatype of incoming data
1620 * src - source data pointer
1621 * swapBytes - perform byteswapping of incoming data?
1624 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
1625 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1626 GLboolean swapBytes
)
1628 GLint redIndex
, greenIndex
, blueIndex
, alphaIndex
;
1630 GLint rComp
, bComp
, gComp
, aComp
;
1632 ASSERT(srcFormat
== GL_RED
||
1633 srcFormat
== GL_GREEN
||
1634 srcFormat
== GL_BLUE
||
1635 srcFormat
== GL_ALPHA
||
1636 srcFormat
== GL_LUMINANCE
||
1637 srcFormat
== GL_LUMINANCE_ALPHA
||
1638 srcFormat
== GL_INTENSITY
||
1639 srcFormat
== GL_RGB
||
1640 srcFormat
== GL_BGR
||
1641 srcFormat
== GL_RGBA
||
1642 srcFormat
== GL_BGRA
||
1643 srcFormat
== GL_ABGR_EXT
);
1645 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
1646 srcType
== GL_BYTE
||
1647 srcType
== GL_UNSIGNED_SHORT
||
1648 srcType
== GL_SHORT
||
1649 srcType
== GL_UNSIGNED_INT
||
1650 srcType
== GL_INT
||
1651 srcType
== GL_FLOAT
||
1652 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
1653 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
1654 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
1655 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
1656 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
1657 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
1658 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
1659 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
1660 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
1661 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
1662 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
1663 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
1665 rComp
= gComp
= bComp
= aComp
= -1;
1667 switch (srcFormat
) {
1670 greenIndex
= blueIndex
= alphaIndex
= -1;
1675 redIndex
= blueIndex
= alphaIndex
= -1;
1680 redIndex
= greenIndex
= alphaIndex
= -1;
1684 redIndex
= greenIndex
= blueIndex
= -1;
1689 redIndex
= greenIndex
= blueIndex
= 0;
1693 case GL_LUMINANCE_ALPHA
:
1694 redIndex
= greenIndex
= blueIndex
= 0;
1700 greenIndex
= blueIndex
= alphaIndex
= -1;
1751 gl_problem(NULL
, "bad srcFormat in extract float data");
1756 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
1757 if ((INDEX) < 0) { \
1759 for (i = 0; i < n; i++) { \
1760 rgba[i][CHANNEL] = DEFAULT; \
1763 else if (swapBytes) { \
1764 const TYPE *s = (const TYPE *) src; \
1766 for (i = 0; i < n; i++) { \
1767 TYPE value = s[INDEX]; \
1768 if (sizeof(TYPE) == 2) { \
1771 else if (sizeof(TYPE) == 4) { \
1774 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
1779 const TYPE *s = (const TYPE *) src; \
1781 for (i = 0; i < n; i++) { \
1782 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
1788 case GL_UNSIGNED_BYTE
:
1789 PROCESS(redIndex
, RCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1790 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1791 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1792 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLubyte
, UBYTE_TO_FLOAT
);
1795 PROCESS(redIndex
, RCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1796 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1797 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLbyte
, BYTE_TO_FLOAT
);
1798 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLbyte
, BYTE_TO_FLOAT
);
1800 case GL_UNSIGNED_SHORT
:
1801 PROCESS(redIndex
, RCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1802 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1803 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLushort
, USHORT_TO_FLOAT
);
1804 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLushort
, USHORT_TO_FLOAT
);
1807 PROCESS(redIndex
, RCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1808 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1809 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLshort
, SHORT_TO_FLOAT
);
1810 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLshort
, SHORT_TO_FLOAT
);
1812 case GL_UNSIGNED_INT
:
1813 PROCESS(redIndex
, RCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1814 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1815 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLuint
, UINT_TO_FLOAT
);
1816 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLuint
, UINT_TO_FLOAT
);
1819 PROCESS(redIndex
, RCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1820 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1821 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLint
, INT_TO_FLOAT
);
1822 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLint
, INT_TO_FLOAT
);
1825 PROCESS(redIndex
, RCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1826 PROCESS(greenIndex
, GCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1827 PROCESS(blueIndex
, BCOMP
, 0.0F
, GLfloat
, (GLfloat
));
1828 PROCESS(alphaIndex
, ACOMP
, 1.0F
, GLfloat
, (GLfloat
));
1830 case GL_UNSIGNED_BYTE_3_3_2
:
1832 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
1834 for (i
= 0; i
< n
; i
++) {
1835 GLubyte p
= ubsrc
[i
];
1836 rgba
[i
][RCOMP
] = ((p
>> 5) ) * (1.0F
/ 7.0F
);
1837 rgba
[i
][GCOMP
] = ((p
>> 2) & 0x7) * (1.0F
/ 7.0F
);
1838 rgba
[i
][BCOMP
] = ((p
) & 0x3) * (1.0F
/ 3.0F
);
1839 rgba
[i
][ACOMP
] = 1.0F
;
1843 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1845 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
1847 for (i
= 0; i
< n
; i
++) {
1848 GLubyte p
= ubsrc
[i
];
1849 rgba
[i
][RCOMP
] = ((p
) & 0x7) * (1.0F
/ 7.0F
);
1850 rgba
[i
][GCOMP
] = ((p
>> 3) & 0x7) * (1.0F
/ 7.0F
);
1851 rgba
[i
][BCOMP
] = ((p
>> 6) ) * (1.0F
/ 3.0F
);
1852 rgba
[i
][ACOMP
] = 1.0F
;
1856 case GL_UNSIGNED_SHORT_5_6_5
:
1858 const GLushort
*ussrc
= (const GLushort
*) src
;
1860 for (i
= 0; i
< n
; i
++) {
1861 GLushort p
= ussrc
[i
];
1863 rgba
[i
][RCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1864 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1865 rgba
[i
][BCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1866 rgba
[i
][ACOMP
] = 1.0F
;
1870 const GLushort
*ussrc
= (const GLushort
*) src
;
1872 for (i
= 0; i
< n
; i
++) {
1873 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 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1883 const GLushort
*ussrc
= (const GLushort
*) src
;
1885 for (i
= 0; i
< n
; i
++) {
1886 GLushort p
= ussrc
[i
];
1888 rgba
[i
][RCOMP
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1889 rgba
[i
][GCOMP
] = ((p
>> 5) & 0x3f) * (1.0F
/ 63.0F
);
1890 rgba
[i
][BCOMP
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1891 rgba
[i
][ACOMP
] = 1.0F
;
1895 const GLushort
*ussrc
= (const GLushort
*) src
;
1897 for (i
= 0; i
< n
; i
++) {
1898 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 case GL_UNSIGNED_SHORT_4_4_4_4
:
1908 const GLushort
*ussrc
= (const GLushort
*) src
;
1910 for (i
= 0; i
< n
; i
++) {
1911 GLushort p
= ussrc
[i
];
1913 rgba
[i
][rComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
1914 rgba
[i
][gComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
1915 rgba
[i
][bComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
1916 rgba
[i
][aComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
1920 const GLushort
*ussrc
= (const GLushort
*) src
;
1922 for (i
= 0; i
< n
; i
++) {
1923 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 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1933 const GLushort
*ussrc
= (const GLushort
*) src
;
1935 for (i
= 0; i
< n
; i
++) {
1936 GLushort p
= ussrc
[i
];
1938 rgba
[i
][rComp
] = ((p
) & 0xf) * (1.0F
/ 15.0F
);
1939 rgba
[i
][gComp
] = ((p
>> 4) & 0xf) * (1.0F
/ 15.0F
);
1940 rgba
[i
][bComp
] = ((p
>> 8) & 0xf) * (1.0F
/ 15.0F
);
1941 rgba
[i
][aComp
] = ((p
>> 12) ) * (1.0F
/ 15.0F
);
1945 const GLushort
*ussrc
= (const GLushort
*) src
;
1947 for (i
= 0; i
< n
; i
++) {
1948 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 case GL_UNSIGNED_SHORT_5_5_5_1
:
1958 const GLushort
*ussrc
= (const GLushort
*) src
;
1960 for (i
= 0; i
< n
; i
++) {
1961 GLushort p
= ussrc
[i
];
1963 rgba
[i
][rComp
] = ((p
>> 11) ) * (1.0F
/ 31.0F
);
1964 rgba
[i
][gComp
] = ((p
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
1965 rgba
[i
][bComp
] = ((p
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
1966 rgba
[i
][aComp
] = ((p
) & 0x1) * (1.0F
/ 1.0F
);
1970 const GLushort
*ussrc
= (const GLushort
*) src
;
1972 for (i
= 0; i
< n
; i
++) {
1973 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 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1983 const GLushort
*ussrc
= (const GLushort
*) src
;
1985 for (i
= 0; i
< n
; i
++) {
1986 GLushort p
= ussrc
[i
];
1988 rgba
[i
][rComp
] = ((p
) & 0x1f) * (1.0F
/ 31.0F
);
1989 rgba
[i
][gComp
] = ((p
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
1990 rgba
[i
][bComp
] = ((p
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
1991 rgba
[i
][aComp
] = ((p
>> 15) ) * (1.0F
/ 1.0F
);
1995 const GLushort
*ussrc
= (const GLushort
*) src
;
1997 for (i
= 0; i
< n
; i
++) {
1998 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 case GL_UNSIGNED_INT_8_8_8_8
:
2008 const GLuint
*uisrc
= (const GLuint
*) src
;
2010 for (i
= 0; i
< n
; i
++) {
2011 GLuint p
= uisrc
[i
];
2012 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2013 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2014 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2015 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
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
>> 24) );
2024 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2025 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2026 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
2030 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2032 const GLuint
*uisrc
= (const GLuint
*) src
;
2034 for (i
= 0; i
< n
; i
++) {
2035 GLuint p
= uisrc
[i
];
2036 rgba
[i
][rComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2037 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2038 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2039 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
) & 0xff);
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
) & 0xff);
2048 rgba
[i
][gComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 8) & 0xff);
2049 rgba
[i
][bComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 16) & 0xff);
2050 rgba
[i
][aComp
] = UBYTE_COLOR_TO_FLOAT_COLOR((p
>> 24) );
2054 case GL_UNSIGNED_INT_10_10_10_2
:
2056 const GLuint
*uisrc
= (const GLuint
*) src
;
2058 for (i
= 0; i
< n
; i
++) {
2059 GLuint p
= uisrc
[i
];
2061 rgba
[i
][rComp
] = ((p
>> 22) ) * (1.0F
/ 1023.0F
);
2062 rgba
[i
][gComp
] = ((p
>> 12) & 0x3ff) * (1.0F
/ 1023.0F
);
2063 rgba
[i
][bComp
] = ((p
>> 2) & 0x3ff) * (1.0F
/ 1023.0F
);
2064 rgba
[i
][aComp
] = ((p
) & 0x3 ) * (1.0F
/ 3.0F
);
2068 const GLuint
*uisrc
= (const GLuint
*) src
;
2070 for (i
= 0; i
< n
; i
++) {
2071 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 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2081 const GLuint
*uisrc
= (const GLuint
*) src
;
2083 for (i
= 0; i
< n
; i
++) {
2084 GLuint p
= uisrc
[i
];
2086 rgba
[i
][rComp
] = ((p
) & 0x3ff) * (1.0F
/ 1023.0F
);
2087 rgba
[i
][gComp
] = ((p
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
2088 rgba
[i
][bComp
] = ((p
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
2089 rgba
[i
][aComp
] = ((p
>> 30) ) * (1.0F
/ 3.0F
);
2093 const GLuint
*uisrc
= (const GLuint
*) src
;
2095 for (i
= 0; i
< n
; i
++) {
2096 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
);
2105 gl_problem(NULL
, "bad srcType in extract float data");
2113 * Unpack a row of color image data from a client buffer according to
2114 * the pixel unpacking parameters. Apply any enabled pixel transfer
2115 * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled.
2116 * Return GLubyte values in the specified dest image format.
2117 * This is (or will be) used by glDrawPixels and glTexImage?D().
2118 * Input: ctx - the context
2119 * n - number of pixels in the span
2120 * dstFormat - format of destination color array
2121 * dest - the destination color array
2122 * srcFormat - source image format
2123 * srcType - source image datatype
2124 * source - source image pointer
2125 * unpacking - pixel unpacking parameters
2126 * applyTransferOps - apply scale/bias/lookup-table ops?
2128 * XXX perhaps expand this to process whole images someday.
2131 _mesa_unpack_ubyte_color_span( const GLcontext
*ctx
,
2132 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
2133 GLenum srcFormat
, GLenum srcType
,
2134 const GLvoid
*source
,
2135 const struct gl_pixelstore_attrib
*unpacking
,
2136 GLboolean applyTransferOps
)
2138 ASSERT(dstFormat
== GL_ALPHA
||
2139 dstFormat
== GL_LUMINANCE
||
2140 dstFormat
== GL_LUMINANCE_ALPHA
||
2141 dstFormat
== GL_INTENSITY
||
2142 dstFormat
== GL_RGB
||
2143 dstFormat
== GL_RGBA
||
2144 dstFormat
== GL_COLOR_INDEX
);
2146 ASSERT(srcFormat
== GL_RED
||
2147 srcFormat
== GL_GREEN
||
2148 srcFormat
== GL_BLUE
||
2149 srcFormat
== GL_ALPHA
||
2150 srcFormat
== GL_LUMINANCE
||
2151 srcFormat
== GL_LUMINANCE_ALPHA
||
2152 srcFormat
== GL_INTENSITY
||
2153 srcFormat
== GL_RGB
||
2154 srcFormat
== GL_BGR
||
2155 srcFormat
== GL_RGBA
||
2156 srcFormat
== GL_BGRA
||
2157 srcFormat
== GL_ABGR_EXT
||
2158 srcFormat
== GL_COLOR_INDEX
);
2160 ASSERT(srcType
== GL_BITMAP
||
2161 srcType
== GL_UNSIGNED_BYTE
||
2162 srcType
== GL_BYTE
||
2163 srcType
== GL_UNSIGNED_SHORT
||
2164 srcType
== GL_SHORT
||
2165 srcType
== GL_UNSIGNED_INT
||
2166 srcType
== GL_INT
||
2167 srcType
== GL_FLOAT
||
2168 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2169 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2170 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2171 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2172 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2173 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2174 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2175 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2176 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2177 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2178 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2179 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2181 /* this is intended for RGBA mode only */
2182 assert(ctx
->Visual
->RGBAflag
);
2184 applyTransferOps
&= (ctx
->Pixel
.ScaleOrBiasRGBA
||
2185 ctx
->Pixel
.MapColorFlag
||
2186 ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
2187 ctx
->Pixel
.ScaleOrBiasRGBApcm
||
2188 ctx
->Pixel
.ColorTableEnabled
||
2189 ctx
->Pixel
.PostColorMatrixColorTableEnabled
);
2191 /* Try simple cases first */
2192 if (!applyTransferOps
&& srcType
== GL_UNSIGNED_BYTE
) {
2193 if (dstFormat
== GL_RGBA
) {
2194 if (srcFormat
== GL_RGBA
) {
2195 MEMCPY( dest
, source
, n
* 4 * sizeof(GLubyte
) );
2198 else if (srcFormat
== GL_RGB
) {
2200 const GLubyte
*src
= (const GLubyte
*) source
;
2201 GLubyte
*dst
= dest
;
2202 for (i
= 0; i
< n
; i
++) {
2213 else if (dstFormat
== GL_RGB
) {
2214 if (srcFormat
== GL_RGB
) {
2215 MEMCPY( dest
, source
, n
* 3 * sizeof(GLubyte
) );
2218 else if (srcFormat
== GL_RGBA
) {
2220 const GLubyte
*src
= (const GLubyte
*) source
;
2221 GLubyte
*dst
= dest
;
2222 for (i
= 0; i
< n
; i
++) {
2232 else if (dstFormat
== srcFormat
) {
2233 GLint comps
= _mesa_components_in_format(srcFormat
);
2235 MEMCPY( dest
, source
, n
* comps
* sizeof(GLubyte
) );
2241 /* general solution begins here */
2243 GLfloat rgba
[MAX_WIDTH
][4];
2244 GLint dstComponents
;
2245 GLint dstRedIndex
, dstGreenIndex
, dstBlueIndex
, dstAlphaIndex
;
2246 GLint dstLuminanceIndex
, dstIntensityIndex
;
2248 dstComponents
= _mesa_components_in_format( dstFormat
);
2249 /* source & dest image formats should have been error checked by now */
2250 assert(dstComponents
> 0);
2253 * Extract image data and convert to RGBA floats
2255 assert(n
<= MAX_WIDTH
);
2256 if (srcFormat
== GL_COLOR_INDEX
) {
2257 GLuint indexes
[MAX_WIDTH
];
2258 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
2261 /* shift and offset indexes */
2262 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2264 if (dstFormat
== GL_COLOR_INDEX
) {
2265 if (applyTransferOps
) {
2266 if (ctx
->Pixel
.MapColorFlag
) {
2267 /* Apply lookup table */
2268 _mesa_map_ci(ctx
, n
, indexes
);
2270 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2271 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2274 /* convert to GLubyte and return */
2277 for (i
= 0; i
< n
; i
++) {
2278 dest
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2283 /* Convert indexes to RGBA */
2284 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
2288 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
2289 unpacking
->SwapBytes
);
2291 if (applyTransferOps
) {
2292 /* scale and bias colors */
2293 _mesa_scale_and_bias_rgba(ctx
, n
, rgba
);
2294 /* color map lookup */
2295 if (ctx
->Pixel
.MapColorFlag
) {
2296 _mesa_map_rgba(ctx
, n
, rgba
);
2298 /* GL_COLOR_TABLE lookup */
2299 if (ctx
->Pixel
.ColorTableEnabled
) {
2300 _mesa_lookup_rgba(&ctx
->ColorTable
, n
, rgba
);
2302 /* XXX convolution here */
2303 /* XXX post-convolution color table look-up here */
2304 /* color matrix transform */
2305 if (ctx
->ColorMatrix
.type
!= MATRIX_IDENTITY
||
2306 ctx
->Pixel
.ScaleOrBiasRGBApcm
) {
2307 _mesa_transform_rgba(ctx
, n
, rgba
);
2309 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2310 if (ctx
->Pixel
.PostColorMatrixColorTableEnabled
) {
2311 _mesa_lookup_rgba(&ctx
->PostColorMatrixColorTable
, n
, rgba
);
2313 /* XXX histogram here */
2314 /* XXX min/max here */
2318 /* clamp to [0,1] */
2321 for (i
= 0; i
< n
; i
++) {
2322 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], 0.0F
, 1.0F
);
2323 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], 0.0F
, 1.0F
);
2324 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], 0.0F
, 1.0F
);
2325 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], 0.0F
, 1.0F
);
2329 /* Now determine which color channels we need to produce.
2330 * And determine the dest index (offset) within each color tuple.
2332 switch (dstFormat
) {
2335 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2336 dstLuminanceIndex
= dstIntensityIndex
= -1;
2339 dstLuminanceIndex
= 0;
2340 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2341 dstIntensityIndex
= -1;
2343 case GL_LUMINANCE_ALPHA
:
2344 dstLuminanceIndex
= 0;
2346 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= -1;
2347 dstIntensityIndex
= -1;
2350 dstIntensityIndex
= 0;
2351 dstRedIndex
= dstGreenIndex
= dstBlueIndex
= dstAlphaIndex
= -1;
2352 dstLuminanceIndex
= -1;
2358 dstAlphaIndex
= dstLuminanceIndex
= dstIntensityIndex
= -1;
2365 dstLuminanceIndex
= dstIntensityIndex
= -1;
2368 gl_problem(ctx
, "bad dstFormat in _mesa_unpack_ubyte_span()");
2373 /* Now return the GLubyte data in the requested dstFormat */
2375 if (dstRedIndex
>= 0) {
2376 GLubyte
*dst
= dest
;
2378 for (i
= 0; i
< n
; i
++) {
2379 dst
[dstRedIndex
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2380 dst
+= dstComponents
;
2384 if (dstGreenIndex
>= 0) {
2385 GLubyte
*dst
= dest
;
2387 for (i
= 0; i
< n
; i
++) {
2388 dst
[dstGreenIndex
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
2389 dst
+= dstComponents
;
2393 if (dstBlueIndex
>= 0) {
2394 GLubyte
*dst
= dest
;
2396 for (i
= 0; i
< n
; i
++) {
2397 dst
[dstBlueIndex
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
2398 dst
+= dstComponents
;
2402 if (dstAlphaIndex
>= 0) {
2403 GLubyte
*dst
= dest
;
2405 for (i
= 0; i
< n
; i
++) {
2406 dst
[dstAlphaIndex
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
2407 dst
+= dstComponents
;
2411 if (dstIntensityIndex
>= 0) {
2412 GLubyte
*dst
= dest
;
2414 assert(dstIntensityIndex
== 0);
2415 assert(dstComponents
== 1);
2416 for (i
= 0; i
< n
; i
++) {
2417 /* Intensity comes from red channel */
2418 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2422 if (dstLuminanceIndex
>= 0) {
2423 GLubyte
*dst
= dest
;
2425 assert(dstLuminanceIndex
== 0);
2426 for (i
= 0; i
< n
; i
++) {
2427 /* Luminance comes from red channel */
2428 dst
[0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
2429 dst
+= dstComponents
;
2438 * Unpack a row of color index data from a client buffer according to
2439 * the pixel unpacking parameters. Apply pixel transfer ops if enabled
2440 * and applyTransferOps is true.
2441 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
2443 * Args: ctx - the context
2444 * n - number of pixels
2445 * dstType - destination datatype
2446 * dest - destination array
2447 * srcType - source pixel type
2448 * source - source data pointer
2449 * unpacking - pixel unpacking parameters
2450 * applyTransferOps - apply offset/bias/lookup ops?
2453 _mesa_unpack_index_span( const GLcontext
*ctx
, GLuint n
,
2454 GLenum dstType
, GLvoid
*dest
,
2455 GLenum srcType
, const GLvoid
*source
,
2456 const struct gl_pixelstore_attrib
*unpacking
,
2457 GLboolean applyTransferOps
)
2459 ASSERT(srcType
== GL_BITMAP
||
2460 srcType
== GL_UNSIGNED_BYTE
||
2461 srcType
== GL_BYTE
||
2462 srcType
== GL_UNSIGNED_SHORT
||
2463 srcType
== GL_SHORT
||
2464 srcType
== GL_UNSIGNED_INT
||
2465 srcType
== GL_INT
||
2466 srcType
== GL_FLOAT
);
2468 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
2469 dstType
== GL_UNSIGNED_SHORT
||
2470 dstType
== GL_UNSIGNED_INT
);
2472 applyTransferOps
&= (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
|| ctx
->Pixel
.MapColorFlag
);
2475 * Try simple cases first
2477 if (!applyTransferOps
&& srcType
== GL_UNSIGNED_BYTE
2478 && dstType
== GL_UNSIGNED_BYTE
) {
2479 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
2481 else if (!applyTransferOps
&& srcType
== GL_UNSIGNED_INT
2482 && dstType
== GL_UNSIGNED_INT
&& !unpacking
->SwapBytes
) {
2483 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
2489 GLuint indexes
[MAX_WIDTH
];
2490 assert(n
<= MAX_WIDTH
);
2492 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
2495 if (applyTransferOps
) {
2496 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2497 /* shift and offset indexes */
2498 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2500 if (ctx
->Pixel
.MapColorFlag
) {
2501 /* Apply lookup table */
2502 _mesa_map_ci(ctx
, n
, indexes
);
2506 /* convert to dest type */
2508 case GL_UNSIGNED_BYTE
:
2510 GLubyte
*dst
= (GLubyte
*) dest
;
2512 for (i
= 0; i
< n
; i
++) {
2513 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2517 case GL_UNSIGNED_SHORT
:
2519 GLuint
*dst
= (GLuint
*) dest
;
2521 for (i
= 0; i
< n
; i
++) {
2522 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
2526 case GL_UNSIGNED_INT
:
2527 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
2530 gl_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
2537 * Unpack a row of stencil data from a client buffer according to
2538 * the pixel unpacking parameters. Apply pixel transfer ops if enabled
2539 * and applyTransferOps is true.
2540 * This is (or will be) used by glDrawPixels
2542 * Args: ctx - the context
2543 * n - number of pixels
2544 * dstType - destination datatype
2545 * dest - destination array
2546 * srcType - source pixel type
2547 * source - source data pointer
2548 * unpacking - pixel unpacking parameters
2549 * applyTransferOps - apply offset/bias/lookup ops?
2552 _mesa_unpack_stencil_span( const GLcontext
*ctx
, GLuint n
,
2553 GLenum dstType
, GLvoid
*dest
,
2554 GLenum srcType
, const GLvoid
*source
,
2555 const struct gl_pixelstore_attrib
*unpacking
,
2556 GLboolean applyTransferOps
)
2558 ASSERT(srcType
== GL_BITMAP
||
2559 srcType
== GL_UNSIGNED_BYTE
||
2560 srcType
== GL_BYTE
||
2561 srcType
== GL_UNSIGNED_SHORT
||
2562 srcType
== GL_SHORT
||
2563 srcType
== GL_UNSIGNED_INT
||
2564 srcType
== GL_INT
||
2565 srcType
== GL_FLOAT
);
2567 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
2568 dstType
== GL_UNSIGNED_SHORT
||
2569 dstType
== GL_UNSIGNED_INT
);
2571 applyTransferOps
&= (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
|| ctx
->Pixel
.MapColorFlag
);
2574 * Try simple cases first
2576 if (!applyTransferOps
&& srcType
== GL_UNSIGNED_BYTE
2577 && dstType
== GL_UNSIGNED_BYTE
) {
2578 MEMCPY(dest
, source
, n
* sizeof(GLubyte
));
2580 else if (!applyTransferOps
&& srcType
== GL_UNSIGNED_INT
2581 && dstType
== GL_UNSIGNED_INT
&& !unpacking
->SwapBytes
) {
2582 MEMCPY(dest
, source
, n
* sizeof(GLuint
));
2588 GLuint indexes
[MAX_WIDTH
];
2589 assert(n
<= MAX_WIDTH
);
2591 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
2594 if (applyTransferOps
) {
2595 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
) {
2596 /* shift and offset indexes */
2597 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
2600 if (ctx
->Pixel
.MapStencilFlag
) {
2601 /* Apply stencil lookup table */
2602 GLuint mask
= ctx
->Pixel
.MapStoSsize
- 1;
2605 indexes
[i
] = ctx
->Pixel
.MapStoS
[ indexes
[i
] & mask
];
2610 /* convert to dest type */
2612 case GL_UNSIGNED_BYTE
:
2614 GLubyte
*dst
= (GLubyte
*) dest
;
2616 for (i
= 0; i
< n
; i
++) {
2617 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
2621 case GL_UNSIGNED_SHORT
:
2623 GLuint
*dst
= (GLuint
*) dest
;
2625 for (i
= 0; i
< n
; i
++) {
2626 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
2630 case GL_UNSIGNED_INT
:
2631 MEMCPY(dest
, indexes
, n
* sizeof(GLuint
));
2634 gl_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
2642 _mesa_unpack_depth_span( const GLcontext
*ctx
, GLuint n
, GLdepth
*dest
,
2643 GLenum srcType
, const GLvoid
*source
,
2644 const struct gl_pixelstore_attrib
*unpacking
,
2645 GLboolean applyTransferOps
)
2647 GLfloat
*depth
= MALLOC(n
* sizeof(GLfloat
));
2655 const GLubyte
*src
= (const GLubyte
*) source
;
2656 for (i
= 0; i
< n
; i
++) {
2657 depth
[i
] = BYTE_TO_FLOAT(src
[i
]);
2661 case GL_UNSIGNED_BYTE
:
2664 const GLubyte
*src
= (const GLubyte
*) source
;
2665 for (i
= 0; i
< n
; i
++) {
2666 depth
[i
] = UBYTE_TO_FLOAT(src
[i
]);
2673 const GLshort
*src
= (const GLshort
*) source
;
2674 for (i
= 0; i
< n
; i
++) {
2675 depth
[i
] = SHORT_TO_FLOAT(src
[i
]);
2679 case GL_UNSIGNED_SHORT
:
2682 const GLushort
*src
= (const GLushort
*) source
;
2683 for (i
= 0; i
< n
; i
++) {
2684 depth
[i
] = USHORT_TO_FLOAT(src
[i
]);
2691 const GLint
*src
= (const GLint
*) source
;
2692 for (i
= 0; i
< n
; i
++) {
2693 depth
[i
] = INT_TO_FLOAT(src
[i
]);
2697 case GL_UNSIGNED_INT
:
2700 const GLuint
*src
= (const GLuint
*) source
;
2701 for (i
= 0; i
< n
; i
++) {
2702 depth
[i
] = UINT_TO_FLOAT(src
[i
]);
2707 MEMCPY(depth
, source
, n
* sizeof(GLfloat
));
2710 gl_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
2715 /* apply depth scale and bias */
2716 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
2718 for (i
= 0; i
< n
; i
++) {
2719 depth
[i
] = depth
[i
] * ctx
->Pixel
.DepthScale
+ ctx
->Pixel
.DepthBias
;
2723 /* clamp depth values to [0,1] and convert from floats to integers */
2725 const GLfloat zs
= ctx
->Visual
->DepthMaxF
;
2727 for (i
= 0; i
< n
; i
++) {
2728 dest
[i
] = (GLdepth
) (CLAMP(depth
[i
], 0.0F
, 1.0F
) * zs
);
2738 * Unpack image data. Apply byteswapping, byte flipping (bitmap).
2739 * Return all image data in a contiguous block.
2742 _mesa_unpack_image( GLsizei width
, GLsizei height
, GLsizei depth
,
2743 GLenum format
, GLenum type
, const GLvoid
*pixels
,
2744 const struct gl_pixelstore_attrib
*unpack
)
2746 GLint bytesPerRow
, compsPerRow
;
2747 GLboolean flipBytes
, swap2
, swap4
;
2750 return NULL
; /* not necessarily an error */
2752 if (width
<= 0 || height
<= 0 || depth
<= 0)
2753 return NULL
; /* generate error later */
2755 if (format
== GL_BITMAP
) {
2756 bytesPerRow
= (width
+ 7) >> 3;
2757 flipBytes
= !unpack
->LsbFirst
;
2758 swap2
= swap4
= GL_FALSE
;
2762 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
2763 const GLint components
= _mesa_components_in_format(format
);
2765 if (bytesPerPixel
<= 0 || components
<= 0)
2766 return NULL
; /* bad format or type. generate error later */
2767 bytesPerRow
= bytesPerPixel
* width
;
2768 bytesPerComp
= bytesPerPixel
/ components
;
2769 flipBytes
= GL_FALSE
;
2770 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
2771 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
2772 compsPerRow
= components
* width
;
2773 assert(compsPerRow
>= width
);
2777 GLubyte
*destBuffer
= MALLOC(bytesPerRow
* height
* depth
);
2781 return NULL
; /* generate GL_OUT_OF_MEMORY later */
2784 for (img
= 0; img
< depth
; img
++) {
2785 for (row
= 0; row
< height
; row
++) {
2786 const GLvoid
*src
= _mesa_image_address(unpack
, pixels
,
2787 width
, height
, format
, type
, img
, row
, 0);
2788 MEMCPY(dst
, src
, bytesPerRow
);
2789 /* byte flipping/swapping */
2791 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
2794 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
2797 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
2808 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
2809 * order with row alignment = 1 byte.
2812 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
2813 const struct gl_pixelstore_attrib
*packing
)
2815 GLint bytes
, row
, width_in_bytes
;
2816 GLubyte
*buffer
, *dst
;
2821 /* Alloc dest storage */
2822 bytes
= ((width
+ 7) / 8 * height
);
2823 buffer
= (GLubyte
*) MALLOC( bytes
);
2828 width_in_bytes
= CEILING( width
, 8 );
2830 for (row
= 0; row
< height
; row
++) {
2831 GLubyte
*src
= _mesa_image_address( packing
, pixels
, width
, height
,
2832 GL_COLOR_INDEX
, GL_BITMAP
,
2839 if (packing
->SkipPixels
== 0) {
2840 MEMCPY( dst
, src
, width_in_bytes
);
2841 if (packing
->LsbFirst
) {
2842 flip_bytes( dst
, width_in_bytes
);
2846 /* handling SkipPixels is a bit tricky (no pun intended!) */
2848 if (packing
->LsbFirst
) {
2849 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
2850 GLubyte dstMask
= 128;
2854 for (i
= 0; i
< width
; i
++) {
2858 if (srcMask
== 128) {
2863 srcMask
= srcMask
<< 1;
2871 dstMask
= dstMask
>> 1;
2876 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
2877 GLubyte dstMask
= 128;
2881 for (i
= 0; i
< width
; i
++) {
2890 srcMask
= srcMask
>> 1;
2898 dstMask
= dstMask
>> 1;
2903 dst
+= width_in_bytes
;
2914 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
2915 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
2917 GLint row
, width_in_bytes
;
2923 width_in_bytes
= CEILING( width
, 8 );
2925 for (row
= 0; row
< height
; row
++) {
2926 GLubyte
*dst
= _mesa_image_address( packing
, dest
, width
, height
,
2927 GL_COLOR_INDEX
, GL_BITMAP
,
2932 if (packing
->SkipPixels
== 0) {
2933 MEMCPY( dst
, src
, width_in_bytes
);
2934 if (packing
->LsbFirst
) {
2935 flip_bytes( dst
, width_in_bytes
);
2939 /* handling SkipPixels is a bit tricky (no pun intended!) */
2941 if (packing
->LsbFirst
) {
2942 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
2943 GLubyte dstMask
= 128;
2944 const GLubyte
*s
= src
;
2947 for (i
= 0; i
< width
; i
++) {
2951 if (srcMask
== 128) {
2956 srcMask
= srcMask
<< 1;
2964 dstMask
= dstMask
>> 1;
2969 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
2970 GLubyte dstMask
= 128;
2971 const GLubyte
*s
= src
;
2974 for (i
= 0; i
< width
; i
++) {
2983 srcMask
= srcMask
>> 1;
2991 dstMask
= dstMask
>> 1;
2996 src
+= width_in_bytes
;