Merge branch 'master' into asm-shader-rework-1
[profile/ivi/mesa.git] / src / mesa / main / image.c
1 /*
2  * Mesa 3-D graphics library
3  * Version:  7.5
4  *
5  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25
26
27 /**
28  * \file image.c
29  * Image handling.
30  */
31
32
33 #include "glheader.h"
34 #include "colormac.h"
35 #include "context.h"
36 #include "image.h"
37 #include "imports.h"
38 #include "macros.h"
39 #include "pixel.h"
40
41
42 /**
43  * NOTE:
44  * Normally, BYTE_TO_FLOAT(0) returns 0.00392  That causes problems when
45  * we later convert the float to a packed integer value (such as for
46  * GL_RGB5_A1) because we'll wind up with a non-zero value.
47  *
48  * We redefine the macros here so zero is handled correctly.
49  */
50 #undef BYTE_TO_FLOAT
51 #define BYTE_TO_FLOAT(B)    ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
52
53 #undef SHORT_TO_FLOAT
54 #define SHORT_TO_FLOAT(S)   ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
55
56
57
58 /** Compute ceiling of integer quotient of A divided by B. */
59 #define CEILING( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
60
61
62 /**
63  * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
64  */
65 GLboolean
66 _mesa_type_is_packed(GLenum type)
67 {
68    switch (type) {
69    case GL_UNSIGNED_BYTE_3_3_2:
70    case GL_UNSIGNED_BYTE_2_3_3_REV:
71    case GL_UNSIGNED_SHORT_5_6_5:
72    case GL_UNSIGNED_SHORT_5_6_5_REV:
73    case GL_UNSIGNED_SHORT_4_4_4_4:
74    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
75    case GL_UNSIGNED_SHORT_5_5_5_1:
76    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
77    case GL_UNSIGNED_INT_8_8_8_8:
78    case GL_UNSIGNED_INT_8_8_8_8_REV:
79    case GL_UNSIGNED_INT_10_10_10_2:
80    case GL_UNSIGNED_INT_2_10_10_10_REV:
81    case GL_UNSIGNED_SHORT_8_8_MESA:
82    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
83    case GL_UNSIGNED_INT_24_8_EXT:
84       return GL_TRUE;
85    }
86
87    return GL_FALSE;
88 }
89
90 /**
91  * Flip the 8 bits in each byte of the given array.
92  *
93  * \param p array.
94  * \param n number of bytes.
95  *
96  * \todo try this trick to flip bytes someday:
97  * \code
98  *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
99  *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
100  *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
101  * \endcode
102  */
103 static void
104 flip_bytes( GLubyte *p, GLuint n )
105 {
106    GLuint i, a, b;
107    for (i = 0; i < n; i++) {
108       b = (GLuint) p[i];        /* words are often faster than bytes */
109       a = ((b & 0x01) << 7) |
110           ((b & 0x02) << 5) |
111           ((b & 0x04) << 3) |
112           ((b & 0x08) << 1) |
113           ((b & 0x10) >> 1) |
114           ((b & 0x20) >> 3) |
115           ((b & 0x40) >> 5) |
116           ((b & 0x80) >> 7);
117       p[i] = (GLubyte) a;
118    }
119 }
120
121
122 /**
123  * Flip the order of the 2 bytes in each word in the given array.
124  *
125  * \param p array.
126  * \param n number of words.
127  */
128 void
129 _mesa_swap2( GLushort *p, GLuint n )
130 {
131    GLuint i;
132    for (i = 0; i < n; i++) {
133       p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
134    }
135 }
136
137
138
139 /*
140  * Flip the order of the 4 bytes in each word in the given array.
141  */
142 void
143 _mesa_swap4( GLuint *p, GLuint n )
144 {
145    GLuint i, a, b;
146    for (i = 0; i < n; i++) {
147       b = p[i];
148       a =  (b >> 24)
149         | ((b >> 8) & 0xff00)
150         | ((b << 8) & 0xff0000)
151         | ((b << 24) & 0xff000000);
152       p[i] = a;
153    }
154 }
155
156
157 /**
158  * Get the size of a GL data type.
159  *
160  * \param type GL data type.
161  *
162  * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
163  * if an invalid type enum.
164  */
165 GLint
166 _mesa_sizeof_type( GLenum type )
167 {
168    switch (type) {
169       case GL_BITMAP:
170          return 0;
171       case GL_UNSIGNED_BYTE:
172          return sizeof(GLubyte);
173       case GL_BYTE:
174          return sizeof(GLbyte);
175       case GL_UNSIGNED_SHORT:
176          return sizeof(GLushort);
177       case GL_SHORT:
178          return sizeof(GLshort);
179       case GL_UNSIGNED_INT:
180          return sizeof(GLuint);
181       case GL_INT:
182          return sizeof(GLint);
183       case GL_FLOAT:
184          return sizeof(GLfloat);
185       case GL_DOUBLE:
186          return sizeof(GLdouble);
187       case GL_HALF_FLOAT_ARB:
188          return sizeof(GLhalfARB);
189       default:
190          return -1;
191    }
192 }
193
194
195 /**
196  * Same as _mesa_sizeof_type() but also accepting the packed pixel
197  * format data types.
198  */
199 GLint
200 _mesa_sizeof_packed_type( GLenum type )
201 {
202    switch (type) {
203       case GL_BITMAP:
204          return 0;
205       case GL_UNSIGNED_BYTE:
206          return sizeof(GLubyte);
207       case GL_BYTE:
208          return sizeof(GLbyte);
209       case GL_UNSIGNED_SHORT:
210          return sizeof(GLushort);
211       case GL_SHORT:
212          return sizeof(GLshort);
213       case GL_UNSIGNED_INT:
214          return sizeof(GLuint);
215       case GL_INT:
216          return sizeof(GLint);
217       case GL_HALF_FLOAT_ARB:
218          return sizeof(GLhalfARB);
219       case GL_FLOAT:
220          return sizeof(GLfloat);
221       case GL_UNSIGNED_BYTE_3_3_2:
222          return sizeof(GLubyte);
223       case GL_UNSIGNED_BYTE_2_3_3_REV:
224          return sizeof(GLubyte);
225       case GL_UNSIGNED_SHORT_5_6_5:
226          return sizeof(GLushort);
227       case GL_UNSIGNED_SHORT_5_6_5_REV:
228          return sizeof(GLushort);
229       case GL_UNSIGNED_SHORT_4_4_4_4:
230          return sizeof(GLushort);
231       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
232          return sizeof(GLushort);
233       case GL_UNSIGNED_SHORT_5_5_5_1:
234          return sizeof(GLushort);
235       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
236          return sizeof(GLushort);
237       case GL_UNSIGNED_INT_8_8_8_8:
238          return sizeof(GLuint);
239       case GL_UNSIGNED_INT_8_8_8_8_REV:
240          return sizeof(GLuint);
241       case GL_UNSIGNED_INT_10_10_10_2:
242          return sizeof(GLuint);
243       case GL_UNSIGNED_INT_2_10_10_10_REV:
244          return sizeof(GLuint);
245       case GL_UNSIGNED_SHORT_8_8_MESA:
246       case GL_UNSIGNED_SHORT_8_8_REV_MESA:
247          return sizeof(GLushort);      
248       case GL_UNSIGNED_INT_24_8_EXT:
249          return sizeof(GLuint);
250       default:
251          return -1;
252    }
253 }
254
255
256 /**
257  * Get the number of components in a pixel format.
258  *
259  * \param format pixel format.
260  *
261  * \return the number of components in the given format, or -1 if a bad format.
262  */
263 GLint
264 _mesa_components_in_format( GLenum format )
265 {
266    switch (format) {
267       case GL_COLOR_INDEX:
268       case GL_COLOR_INDEX1_EXT:
269       case GL_COLOR_INDEX2_EXT:
270       case GL_COLOR_INDEX4_EXT:
271       case GL_COLOR_INDEX8_EXT:
272       case GL_COLOR_INDEX12_EXT:
273       case GL_COLOR_INDEX16_EXT:
274       case GL_STENCIL_INDEX:
275       case GL_DEPTH_COMPONENT:
276       case GL_RED:
277       case GL_GREEN:
278       case GL_BLUE:
279       case GL_ALPHA:
280       case GL_LUMINANCE:
281       case GL_INTENSITY:
282          return 1;
283       case GL_LUMINANCE_ALPHA:
284          return 2;
285       case GL_RGB:
286          return 3;
287       case GL_RGBA:
288          return 4;
289       case GL_BGR:
290          return 3;
291       case GL_BGRA:
292          return 4;
293       case GL_ABGR_EXT:
294          return 4;
295       case GL_YCBCR_MESA:
296          return 2;
297       case GL_DEPTH_STENCIL_EXT:
298          return 2;
299       case GL_DUDV_ATI:
300       case GL_DU8DV8_ATI:
301          return 2;
302       default:
303          return -1;
304    }
305 }
306
307
308 /**
309  * Get the bytes per pixel of pixel format type pair.
310  *
311  * \param format pixel format.
312  * \param type pixel type.
313  *
314  * \return bytes per pixel, or -1 if a bad format or type was given.
315  */
316 GLint
317 _mesa_bytes_per_pixel( GLenum format, GLenum type )
318 {
319    GLint comps = _mesa_components_in_format( format );
320    if (comps < 0)
321       return -1;
322
323    switch (type) {
324       case GL_BITMAP:
325          return 0;  /* special case */
326       case GL_BYTE:
327       case GL_UNSIGNED_BYTE:
328          return comps * sizeof(GLubyte);
329       case GL_SHORT:
330       case GL_UNSIGNED_SHORT:
331          return comps * sizeof(GLshort);
332       case GL_INT:
333       case GL_UNSIGNED_INT:
334          return comps * sizeof(GLint);
335       case GL_FLOAT:
336          return comps * sizeof(GLfloat);
337       case GL_HALF_FLOAT_ARB:
338          return comps * sizeof(GLhalfARB);
339       case GL_UNSIGNED_BYTE_3_3_2:
340       case GL_UNSIGNED_BYTE_2_3_3_REV:
341          if (format == GL_RGB || format == GL_BGR)
342             return sizeof(GLubyte);
343          else
344             return -1;  /* error */
345       case GL_UNSIGNED_SHORT_5_6_5:
346       case GL_UNSIGNED_SHORT_5_6_5_REV:
347          if (format == GL_RGB || format == GL_BGR)
348             return sizeof(GLushort);
349          else
350             return -1;  /* error */
351       case GL_UNSIGNED_SHORT_4_4_4_4:
352       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
353       case GL_UNSIGNED_SHORT_5_5_5_1:
354       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
355          if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
356             return sizeof(GLushort);
357          else
358             return -1;
359       case GL_UNSIGNED_INT_8_8_8_8:
360       case GL_UNSIGNED_INT_8_8_8_8_REV:
361       case GL_UNSIGNED_INT_10_10_10_2:
362       case GL_UNSIGNED_INT_2_10_10_10_REV:
363          if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
364             return sizeof(GLuint);
365          else
366             return -1;
367       case GL_UNSIGNED_SHORT_8_8_MESA:
368       case GL_UNSIGNED_SHORT_8_8_REV_MESA:
369          if (format == GL_YCBCR_MESA)
370             return sizeof(GLushort);
371          else
372             return -1;
373       case GL_UNSIGNED_INT_24_8_EXT:
374          if (format == GL_DEPTH_STENCIL_EXT)
375             return sizeof(GLuint);
376          else
377             return -1;
378       default:
379          return -1;
380    }
381 }
382
383
384 /**
385  * Test for a legal pixel format and type.
386  *
387  * \param format pixel format.
388  * \param type pixel type.
389  *
390  * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
391  * otherwise.
392  */
393 GLboolean
394 _mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type )
395 {
396    switch (format) {
397       case GL_COLOR_INDEX:
398       case GL_STENCIL_INDEX:
399          switch (type) {
400             case GL_BITMAP:
401             case GL_BYTE:
402             case GL_UNSIGNED_BYTE:
403             case GL_SHORT:
404             case GL_UNSIGNED_SHORT:
405             case GL_INT:
406             case GL_UNSIGNED_INT:
407             case GL_FLOAT:
408                return GL_TRUE;
409             case GL_HALF_FLOAT_ARB:
410                return ctx->Extensions.ARB_half_float_pixel;
411             default:
412                return GL_FALSE;
413          }
414       case GL_RED:
415       case GL_GREEN:
416       case GL_BLUE:
417       case GL_ALPHA:
418 #if 0 /* not legal!  see table 3.6 of the 1.5 spec */
419       case GL_INTENSITY:
420 #endif
421       case GL_LUMINANCE:
422       case GL_LUMINANCE_ALPHA:
423       case GL_DEPTH_COMPONENT:
424          switch (type) {
425             case GL_BYTE:
426             case GL_UNSIGNED_BYTE:
427             case GL_SHORT:
428             case GL_UNSIGNED_SHORT:
429             case GL_INT:
430             case GL_UNSIGNED_INT:
431             case GL_FLOAT:
432                return GL_TRUE;
433             case GL_HALF_FLOAT_ARB:
434                return ctx->Extensions.ARB_half_float_pixel;
435             default:
436                return GL_FALSE;
437          }
438       case GL_RGB:
439          switch (type) {
440             case GL_BYTE:
441             case GL_UNSIGNED_BYTE:
442             case GL_SHORT:
443             case GL_UNSIGNED_SHORT:
444             case GL_INT:
445             case GL_UNSIGNED_INT:
446             case GL_FLOAT:
447             case GL_UNSIGNED_BYTE_3_3_2:
448             case GL_UNSIGNED_BYTE_2_3_3_REV:
449             case GL_UNSIGNED_SHORT_5_6_5:
450             case GL_UNSIGNED_SHORT_5_6_5_REV:
451                return GL_TRUE;
452             case GL_HALF_FLOAT_ARB:
453                return ctx->Extensions.ARB_half_float_pixel;
454             default:
455                return GL_FALSE;
456          }
457       case GL_BGR:
458          switch (type) {
459             /* NOTE: no packed types are supported with BGR.  That's
460              * intentional, according to the GL spec.
461              */
462             case GL_BYTE:
463             case GL_UNSIGNED_BYTE:
464             case GL_SHORT:
465             case GL_UNSIGNED_SHORT:
466             case GL_INT:
467             case GL_UNSIGNED_INT:
468             case GL_FLOAT:
469                return GL_TRUE;
470             case GL_HALF_FLOAT_ARB:
471                return ctx->Extensions.ARB_half_float_pixel;
472             default:
473                return GL_FALSE;
474          }
475       case GL_RGBA:
476       case GL_BGRA:
477       case GL_ABGR_EXT:
478          switch (type) {
479             case GL_BYTE:
480             case GL_UNSIGNED_BYTE:
481             case GL_SHORT:
482             case GL_UNSIGNED_SHORT:
483             case GL_INT:
484             case GL_UNSIGNED_INT:
485             case GL_FLOAT:
486             case GL_UNSIGNED_SHORT_4_4_4_4:
487             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
488             case GL_UNSIGNED_SHORT_5_5_5_1:
489             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
490             case GL_UNSIGNED_INT_8_8_8_8:
491             case GL_UNSIGNED_INT_8_8_8_8_REV:
492             case GL_UNSIGNED_INT_10_10_10_2:
493             case GL_UNSIGNED_INT_2_10_10_10_REV:
494                return GL_TRUE;
495             case GL_HALF_FLOAT_ARB:
496                return ctx->Extensions.ARB_half_float_pixel;
497             default:
498                return GL_FALSE;
499          }
500       case GL_YCBCR_MESA:
501          if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
502              type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
503             return GL_TRUE;
504          else
505             return GL_FALSE;
506       case GL_DEPTH_STENCIL_EXT:
507          if (ctx->Extensions.EXT_packed_depth_stencil
508              && type == GL_UNSIGNED_INT_24_8_EXT)
509             return GL_TRUE;
510          else
511             return GL_FALSE;
512       case GL_DUDV_ATI:
513       case GL_DU8DV8_ATI:
514          switch (type) {
515             case GL_BYTE:
516             case GL_UNSIGNED_BYTE:
517             case GL_SHORT:
518             case GL_UNSIGNED_SHORT:
519             case GL_INT:
520             case GL_UNSIGNED_INT:
521             case GL_FLOAT:
522                return GL_TRUE;
523             default:
524                return GL_FALSE;
525          }
526       default:
527          ; /* fall-through */
528    }
529    return GL_FALSE;
530 }
531
532
533 /**
534  * Test if the given image format is a color/RGBA format (i.e., not color
535  * index, depth, stencil, etc).
536  * \param format  the image format value (may by an internal texture format)
537  * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
538  */
539 GLboolean
540 _mesa_is_color_format(GLenum format)
541 {
542    switch (format) {
543       case GL_RED:
544       case GL_GREEN:
545       case GL_BLUE:
546       case GL_ALPHA:
547       case GL_ALPHA4:
548       case GL_ALPHA8:
549       case GL_ALPHA12:
550       case GL_ALPHA16:
551       case 1:
552       case GL_LUMINANCE:
553       case GL_LUMINANCE4:
554       case GL_LUMINANCE8:
555       case GL_LUMINANCE12:
556       case GL_LUMINANCE16:
557       case 2:
558       case GL_LUMINANCE_ALPHA:
559       case GL_LUMINANCE4_ALPHA4:
560       case GL_LUMINANCE6_ALPHA2:
561       case GL_LUMINANCE8_ALPHA8:
562       case GL_LUMINANCE12_ALPHA4:
563       case GL_LUMINANCE12_ALPHA12:
564       case GL_LUMINANCE16_ALPHA16:
565       case GL_INTENSITY:
566       case GL_INTENSITY4:
567       case GL_INTENSITY8:
568       case GL_INTENSITY12:
569       case GL_INTENSITY16:
570       case 3:
571       case GL_RGB:
572       case GL_BGR:
573       case GL_R3_G3_B2:
574       case GL_RGB4:
575       case GL_RGB5:
576       case GL_RGB8:
577       case GL_RGB10:
578       case GL_RGB12:
579       case GL_RGB16:
580       case 4:
581       case GL_ABGR_EXT:
582       case GL_RGBA:
583       case GL_BGRA:
584       case GL_RGBA2:
585       case GL_RGBA4:
586       case GL_RGB5_A1:
587       case GL_RGBA8:
588       case GL_RGB10_A2:
589       case GL_RGBA12:
590       case GL_RGBA16:
591       /* float texture formats */
592       case GL_ALPHA16F_ARB:
593       case GL_ALPHA32F_ARB:
594       case GL_LUMINANCE16F_ARB:
595       case GL_LUMINANCE32F_ARB:
596       case GL_LUMINANCE_ALPHA16F_ARB:
597       case GL_LUMINANCE_ALPHA32F_ARB:
598       case GL_INTENSITY16F_ARB:
599       case GL_INTENSITY32F_ARB:
600       case GL_RGB16F_ARB:
601       case GL_RGB32F_ARB:
602       case GL_RGBA16F_ARB:
603       case GL_RGBA32F_ARB:
604       /* compressed formats */
605       case GL_COMPRESSED_ALPHA:
606       case GL_COMPRESSED_LUMINANCE:
607       case GL_COMPRESSED_LUMINANCE_ALPHA:
608       case GL_COMPRESSED_INTENSITY:
609       case GL_COMPRESSED_RGB:
610       case GL_COMPRESSED_RGBA:
611       case GL_RGB_S3TC:
612       case GL_RGB4_S3TC:
613       case GL_RGBA_S3TC:
614       case GL_RGBA4_S3TC:
615       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
616       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
617       case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
618       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
619       case GL_COMPRESSED_RGB_FXT1_3DFX:
620       case GL_COMPRESSED_RGBA_FXT1_3DFX:
621 #if FEATURE_EXT_texture_sRGB
622       case GL_SRGB_EXT:
623       case GL_SRGB8_EXT:
624       case GL_SRGB_ALPHA_EXT:
625       case GL_SRGB8_ALPHA8_EXT:
626       case GL_SLUMINANCE_ALPHA_EXT:
627       case GL_SLUMINANCE8_ALPHA8_EXT:
628       case GL_SLUMINANCE_EXT:
629       case GL_SLUMINANCE8_EXT:
630       case GL_COMPRESSED_SRGB_EXT:
631       case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
632       case GL_COMPRESSED_SRGB_ALPHA_EXT:
633       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
634       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
635       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
636       case GL_COMPRESSED_SLUMINANCE_EXT:
637       case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
638 #endif /* FEATURE_EXT_texture_sRGB */
639          return GL_TRUE;
640       /* signed texture formats */
641       case GL_RGBA_SNORM:
642       case GL_RGBA8_SNORM:
643          return GL_TRUE;
644       case GL_YCBCR_MESA:  /* not considered to be RGB */
645          /* fall-through */
646       default:
647          return GL_FALSE;
648    }
649 }
650
651
652 /**
653  * Test if the given image format is a color index format.
654  */
655 GLboolean
656 _mesa_is_index_format(GLenum format)
657 {
658    switch (format) {
659       case GL_COLOR_INDEX:
660       case GL_COLOR_INDEX1_EXT:
661       case GL_COLOR_INDEX2_EXT:
662       case GL_COLOR_INDEX4_EXT:
663       case GL_COLOR_INDEX8_EXT:
664       case GL_COLOR_INDEX12_EXT:
665       case GL_COLOR_INDEX16_EXT:
666          return GL_TRUE;
667       default:
668          return GL_FALSE;
669    }
670 }
671
672
673 /**
674  * Test if the given image format is a depth component format.
675  */
676 GLboolean
677 _mesa_is_depth_format(GLenum format)
678 {
679    switch (format) {
680       case GL_DEPTH_COMPONENT:
681       case GL_DEPTH_COMPONENT16:
682       case GL_DEPTH_COMPONENT24:
683       case GL_DEPTH_COMPONENT32:
684          return GL_TRUE;
685       default:
686          return GL_FALSE;
687    }
688 }
689
690
691 /**
692  * Test if the given image format is a YCbCr format.
693  */
694 GLboolean
695 _mesa_is_ycbcr_format(GLenum format)
696 {
697    switch (format) {
698       case GL_YCBCR_MESA:
699          return GL_TRUE;
700       default:
701          return GL_FALSE;
702    }
703 }
704
705
706 /**
707  * Test if the given image format is a depth+stencil format.
708  */
709 GLboolean
710 _mesa_is_depthstencil_format(GLenum format)
711 {
712    switch (format) {
713       case GL_DEPTH24_STENCIL8_EXT:
714       case GL_DEPTH_STENCIL_EXT:
715          return GL_TRUE;
716       default:
717          return GL_FALSE;
718    }
719 }
720
721 /**
722  * Test if the given image format is a dudv format.
723  */
724 GLboolean
725 _mesa_is_dudv_format(GLenum format)
726 {
727    switch (format) {
728       case GL_DUDV_ATI:
729       case GL_DU8DV8_ATI:
730          return GL_TRUE;
731       default:
732          return GL_FALSE;
733    }
734 }
735
736
737 /**
738  * Return the address of a specific pixel in an image (1D, 2D or 3D).
739  *
740  * Pixel unpacking/packing parameters are observed according to \p packing.
741  *
742  * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
743  * \param image  starting address of image data
744  * \param width  the image width
745  * \param height  theimage height
746  * \param format  the pixel format
747  * \param type  the pixel data type
748  * \param packing  the pixelstore attributes
749  * \param img  which image in the volume (0 for 1D or 2D images)
750  * \param row  row of pixel in the image (0 for 1D images)
751  * \param column column of pixel in the image
752  * 
753  * \return address of pixel on success, or NULL on error.
754  *
755  * \sa gl_pixelstore_attrib.
756  */
757 GLvoid *
758 _mesa_image_address( GLuint dimensions,
759                      const struct gl_pixelstore_attrib *packing,
760                      const GLvoid *image,
761                      GLsizei width, GLsizei height,
762                      GLenum format, GLenum type,
763                      GLint img, GLint row, GLint column )
764 {
765    GLint alignment;        /* 1, 2 or 4 */
766    GLint pixels_per_row;
767    GLint rows_per_image;
768    GLint skiprows;
769    GLint skippixels;
770    GLint skipimages;       /* for 3-D volume images */
771    GLubyte *pixel_addr;
772
773    ASSERT(dimensions >= 1 && dimensions <= 3);
774
775    alignment = packing->Alignment;
776    if (packing->RowLength > 0) {
777       pixels_per_row = packing->RowLength;
778    }
779    else {
780       pixels_per_row = width;
781    }
782    if (packing->ImageHeight > 0) {
783       rows_per_image = packing->ImageHeight;
784    }
785    else {
786       rows_per_image = height;
787    }
788
789    skippixels = packing->SkipPixels;
790    /* Note: SKIP_ROWS _is_ used for 1D images */
791    skiprows = packing->SkipRows;
792    /* Note: SKIP_IMAGES is only used for 3D images */
793    skipimages = (dimensions == 3) ? packing->SkipImages : 0;
794
795    if (type == GL_BITMAP) {
796       /* BITMAP data */
797       GLint comp_per_pixel;   /* components per pixel */
798       GLint bytes_per_comp;   /* bytes per component */
799       GLint bytes_per_row;
800       GLint bytes_per_image;
801
802       /* Compute bytes per component */
803       bytes_per_comp = _mesa_sizeof_packed_type( type );
804       if (bytes_per_comp < 0) {
805          return NULL;
806       }
807
808       /* Compute number of components per pixel */
809       comp_per_pixel = _mesa_components_in_format( format );
810       if (comp_per_pixel < 0) {
811          return NULL;
812       }
813
814       bytes_per_row = alignment
815                     * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
816
817       bytes_per_image = bytes_per_row * rows_per_image;
818
819       pixel_addr = (GLubyte *) image
820                  + (skipimages + img) * bytes_per_image
821                  + (skiprows + row) * bytes_per_row
822                  + (skippixels + column) / 8;
823    }
824    else {
825       /* Non-BITMAP data */
826       GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
827       GLint topOfImage;
828
829       bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
830
831       /* The pixel type and format should have been error checked earlier */
832       assert(bytes_per_pixel > 0);
833
834       bytes_per_row = pixels_per_row * bytes_per_pixel;
835       remainder = bytes_per_row % alignment;
836       if (remainder > 0)
837          bytes_per_row += (alignment - remainder);
838
839       ASSERT(bytes_per_row % alignment == 0);
840
841       bytes_per_image = bytes_per_row * rows_per_image;
842
843       if (packing->Invert) {
844          /* set pixel_addr to the last row */
845          topOfImage = bytes_per_row * (height - 1);
846          bytes_per_row = -bytes_per_row;
847       }
848       else {
849          topOfImage = 0;
850       }
851
852       /* compute final pixel address */
853       pixel_addr = (GLubyte *) image
854                  + (skipimages + img) * bytes_per_image
855                  + topOfImage
856                  + (skiprows + row) * bytes_per_row
857                  + (skippixels + column) * bytes_per_pixel;
858    }
859
860    return (GLvoid *) pixel_addr;
861 }
862
863
864 GLvoid *
865 _mesa_image_address1d( const struct gl_pixelstore_attrib *packing,
866                        const GLvoid *image,
867                        GLsizei width,
868                        GLenum format, GLenum type,
869                        GLint column )
870 {
871    return _mesa_image_address(1, packing, image, width, 1,
872                               format, type, 0, 0, column);
873 }
874
875
876 GLvoid *
877 _mesa_image_address2d( const struct gl_pixelstore_attrib *packing,
878                        const GLvoid *image,
879                        GLsizei width, GLsizei height,
880                        GLenum format, GLenum type,
881                        GLint row, GLint column )
882 {
883    return _mesa_image_address(2, packing, image, width, height,
884                               format, type, 0, row, column);
885 }
886
887
888 GLvoid *
889 _mesa_image_address3d( const struct gl_pixelstore_attrib *packing,
890                        const GLvoid *image,
891                        GLsizei width, GLsizei height,
892                        GLenum format, GLenum type,
893                        GLint img, GLint row, GLint column )
894 {
895    return _mesa_image_address(3, packing, image, width, height,
896                               format, type, img, row, column);
897 }
898
899
900
901 /**
902  * Compute the stride (in bytes) between image rows.
903  *
904  * \param packing the pixelstore attributes
905  * \param width image width.
906  * \param format pixel format.
907  * \param type pixel data type.
908  * 
909  * \return the stride in bytes for the given parameters, or -1 if error
910  */
911 GLint
912 _mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
913                         GLint width, GLenum format, GLenum type )
914 {
915    GLint bytesPerRow, remainder;
916
917    ASSERT(packing);
918
919    if (type == GL_BITMAP) {
920       if (packing->RowLength == 0) {
921          bytesPerRow = (width + 7) / 8;
922       }
923       else {
924          bytesPerRow = (packing->RowLength + 7) / 8;
925       }
926    }
927    else {
928       /* Non-BITMAP data */
929       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
930       if (bytesPerPixel <= 0)
931          return -1;  /* error */
932       if (packing->RowLength == 0) {
933          bytesPerRow = bytesPerPixel * width;
934       }
935       else {
936          bytesPerRow = bytesPerPixel * packing->RowLength;
937       }
938    }
939
940    remainder = bytesPerRow % packing->Alignment;
941    if (remainder > 0) {
942       bytesPerRow += (packing->Alignment - remainder);
943    }
944
945    if (packing->Invert) {
946       /* negate the bytes per row (negative row stride) */
947       bytesPerRow = -bytesPerRow;
948    }
949
950    return bytesPerRow;
951 }
952
953
954 #if _HAVE_FULL_GL
955
956 /*
957  * Compute the stride between images in a 3D texture (in bytes) for the given
958  * pixel packing parameters and image width, format and type.
959  */
960 GLint
961 _mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
962                           GLint width, GLint height,
963                           GLenum format, GLenum type )
964 {
965    GLint bytesPerRow, bytesPerImage, remainder;
966
967    ASSERT(packing);
968
969    if (type == GL_BITMAP) {
970       if (packing->RowLength == 0) {
971          bytesPerRow = (width + 7) / 8;
972       }
973       else {
974          bytesPerRow = (packing->RowLength + 7) / 8;
975       }
976    }
977    else {
978       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
979
980       if (bytesPerPixel <= 0)
981          return -1;  /* error */
982       if (packing->RowLength == 0) {
983          bytesPerRow = bytesPerPixel * width;
984       }
985       else {
986          bytesPerRow = bytesPerPixel * packing->RowLength;
987       }
988    }
989
990    remainder = bytesPerRow % packing->Alignment;
991    if (remainder > 0)
992       bytesPerRow += (packing->Alignment - remainder);
993
994    if (packing->ImageHeight == 0)
995       bytesPerImage = bytesPerRow * height;
996    else
997       bytesPerImage = bytesPerRow * packing->ImageHeight;
998
999    return bytesPerImage;
1000 }
1001
1002
1003 /*
1004  * Unpack a 32x32 pixel polygon stipple from user memory using the
1005  * current pixel unpack settings.
1006  */
1007 void
1008 _mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
1009                               const struct gl_pixelstore_attrib *unpacking )
1010 {
1011    GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
1012    if (ptrn) {
1013       /* Convert pattern from GLubytes to GLuints and handle big/little
1014        * endian differences
1015        */
1016       GLubyte *p = ptrn;
1017       GLint i;
1018       for (i = 0; i < 32; i++) {
1019          dest[i] = (p[0] << 24)
1020                  | (p[1] << 16)
1021                  | (p[2] <<  8)
1022                  | (p[3]      );
1023          p += 4;
1024       }
1025       _mesa_free(ptrn);
1026    }
1027 }
1028
1029
1030 /*
1031  * Pack polygon stipple into user memory given current pixel packing
1032  * settings.
1033  */
1034 void
1035 _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
1036                             const struct gl_pixelstore_attrib *packing )
1037 {
1038    /* Convert pattern from GLuints to GLubytes to handle big/little
1039     * endian differences.
1040     */
1041    GLubyte ptrn[32*4];
1042    GLint i;
1043    for (i = 0; i < 32; i++) {
1044       ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
1045       ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
1046       ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
1047       ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
1048    }
1049
1050    _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
1051 }
1052
1053
1054 /*
1055  * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
1056  * order with row alignment = 1 byte.
1057  */
1058 GLvoid *
1059 _mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
1060                      const struct gl_pixelstore_attrib *packing )
1061 {
1062    GLint bytes, row, width_in_bytes;
1063    GLubyte *buffer, *dst;
1064
1065    if (!pixels)
1066       return NULL;
1067
1068    /* Alloc dest storage */
1069    bytes = ((width + 7) / 8 * height);
1070    buffer = (GLubyte *) _mesa_malloc( bytes );
1071    if (!buffer)
1072       return NULL;
1073
1074    width_in_bytes = CEILING( width, 8 );
1075    dst = buffer;
1076    for (row = 0; row < height; row++) {
1077       const GLubyte *src = (const GLubyte *)
1078          _mesa_image_address2d(packing, pixels, width, height,
1079                                GL_COLOR_INDEX, GL_BITMAP, row, 0);
1080       if (!src) {
1081          _mesa_free(buffer);
1082          return NULL;
1083       }
1084
1085       if ((packing->SkipPixels & 7) == 0) {
1086          _mesa_memcpy( dst, src, width_in_bytes );
1087          if (packing->LsbFirst) {
1088             flip_bytes( dst, width_in_bytes );
1089          }
1090       }
1091       else {
1092          /* handling SkipPixels is a bit tricky (no pun intended!) */
1093          GLint i;
1094          if (packing->LsbFirst) {
1095             GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
1096             GLubyte dstMask = 128;
1097             const GLubyte *s = src;
1098             GLubyte *d = dst;
1099             *d = 0;
1100             for (i = 0; i < width; i++) {
1101                if (*s & srcMask) {
1102                   *d |= dstMask;
1103                }
1104                if (srcMask == 128) {
1105                   srcMask = 1;
1106                   s++;
1107                }
1108                else {
1109                   srcMask = srcMask << 1;
1110                }
1111                if (dstMask == 1) {
1112                   dstMask = 128;
1113                   d++;
1114                   *d = 0;
1115                }
1116                else {
1117                   dstMask = dstMask >> 1;
1118                }
1119             }
1120          }
1121          else {
1122             GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
1123             GLubyte dstMask = 128;
1124             const GLubyte *s = src;
1125             GLubyte *d = dst;
1126             *d = 0;
1127             for (i = 0; i < width; i++) {
1128                if (*s & srcMask) {
1129                   *d |= dstMask;
1130                }
1131                if (srcMask == 1) {
1132                   srcMask = 128;
1133                   s++;
1134                }
1135                else {
1136                   srcMask = srcMask >> 1;
1137                }
1138                if (dstMask == 1) {
1139                   dstMask = 128;
1140                   d++;
1141                   *d = 0;
1142                }
1143                else {
1144                   dstMask = dstMask >> 1;
1145                }
1146             }
1147          }
1148       }
1149       dst += width_in_bytes;
1150    }
1151
1152    return buffer;
1153 }
1154
1155
1156 /*
1157  * Pack bitmap data.
1158  */
1159 void
1160 _mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
1161                    GLubyte *dest, const struct gl_pixelstore_attrib *packing )
1162 {
1163    GLint row, width_in_bytes;
1164    const GLubyte *src;
1165
1166    if (!source)
1167       return;
1168
1169    width_in_bytes = CEILING( width, 8 );
1170    src = source;
1171    for (row = 0; row < height; row++) {
1172       GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
1173                        width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
1174       if (!dst)
1175          return;
1176
1177       if ((packing->SkipPixels & 7) == 0) {
1178          _mesa_memcpy( dst, src, width_in_bytes );
1179          if (packing->LsbFirst) {
1180             flip_bytes( dst, width_in_bytes );
1181          }
1182       }
1183       else {
1184          /* handling SkipPixels is a bit tricky (no pun intended!) */
1185          GLint i;
1186          if (packing->LsbFirst) {
1187             GLubyte srcMask = 128;
1188             GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
1189             const GLubyte *s = src;
1190             GLubyte *d = dst;
1191             *d = 0;
1192             for (i = 0; i < width; i++) {
1193                if (*s & srcMask) {
1194                   *d |= dstMask;
1195                }
1196                if (srcMask == 1) {
1197                   srcMask = 128;
1198                   s++;
1199                }
1200                else {
1201                   srcMask = srcMask >> 1;
1202                }
1203                if (dstMask == 128) {
1204                   dstMask = 1;
1205                   d++;
1206                   *d = 0;
1207                }
1208                else {
1209                   dstMask = dstMask << 1;
1210                }
1211             }
1212          }
1213          else {
1214             GLubyte srcMask = 128;
1215             GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
1216             const GLubyte *s = src;
1217             GLubyte *d = dst;
1218             *d = 0;
1219             for (i = 0; i < width; i++) {
1220                if (*s & srcMask) {
1221                   *d |= dstMask;
1222                }
1223                if (srcMask == 1) {
1224                   srcMask = 128;
1225                   s++;
1226                }
1227                else {
1228                   srcMask = srcMask >> 1;
1229                }
1230                if (dstMask == 1) {
1231                   dstMask = 128;
1232                   d++;
1233                   *d = 0;
1234                }
1235                else {
1236                   dstMask = dstMask >> 1;
1237                }
1238             }
1239          }
1240       }
1241       src += width_in_bytes;
1242    }
1243 }
1244
1245
1246 /**********************************************************************/
1247 /*****                  Pixel processing functions               ******/
1248 /**********************************************************************/
1249
1250 /*
1251  * Apply scale and bias factors to an array of RGBA pixels.
1252  */
1253 void
1254 _mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4],
1255                           GLfloat rScale, GLfloat gScale,
1256                           GLfloat bScale, GLfloat aScale,
1257                           GLfloat rBias, GLfloat gBias,
1258                           GLfloat bBias, GLfloat aBias)
1259 {
1260    if (rScale != 1.0 || rBias != 0.0) {
1261       GLuint i;
1262       for (i = 0; i < n; i++) {
1263          rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias;
1264       }
1265    }
1266    if (gScale != 1.0 || gBias != 0.0) {
1267       GLuint i;
1268       for (i = 0; i < n; i++) {
1269          rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias;
1270       }
1271    }
1272    if (bScale != 1.0 || bBias != 0.0) {
1273       GLuint i;
1274       for (i = 0; i < n; i++) {
1275          rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias;
1276       }
1277    }
1278    if (aScale != 1.0 || aBias != 0.0) {
1279       GLuint i;
1280       for (i = 0; i < n; i++) {
1281          rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias;
1282       }
1283    }
1284 }
1285
1286
1287 /*
1288  * Apply pixel mapping to an array of floating point RGBA pixels.
1289  */
1290 void
1291 _mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
1292 {
1293    const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1);
1294    const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1);
1295    const GLfloat bscale = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1);
1296    const GLfloat ascale = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1);
1297    const GLfloat *rMap = ctx->PixelMaps.RtoR.Map;
1298    const GLfloat *gMap = ctx->PixelMaps.GtoG.Map;
1299    const GLfloat *bMap = ctx->PixelMaps.BtoB.Map;
1300    const GLfloat *aMap = ctx->PixelMaps.AtoA.Map;
1301    GLuint i;
1302    for (i=0;i<n;i++) {
1303       GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
1304       GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
1305       GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
1306       GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
1307       rgba[i][RCOMP] = rMap[IROUND(r * rscale)];
1308       rgba[i][GCOMP] = gMap[IROUND(g * gscale)];
1309       rgba[i][BCOMP] = bMap[IROUND(b * bscale)];
1310       rgba[i][ACOMP] = aMap[IROUND(a * ascale)];
1311    }
1312 }
1313
1314
1315 /*
1316  * Apply the color matrix and post color matrix scaling and biasing.
1317  */
1318 void
1319 _mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
1320 {
1321    const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0];
1322    const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0];
1323    const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1];
1324    const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1];
1325    const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2];
1326    const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
1327    const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
1328    const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
1329    const GLfloat *m = ctx->ColorMatrixStack.Top->m;
1330    GLuint i;
1331    for (i = 0; i < n; i++) {
1332       const GLfloat r = rgba[i][RCOMP];
1333       const GLfloat g = rgba[i][GCOMP];
1334       const GLfloat b = rgba[i][BCOMP];
1335       const GLfloat a = rgba[i][ACOMP];
1336       rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
1337       rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
1338       rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
1339       rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
1340    }
1341 }
1342
1343
1344 /**
1345  * Apply a color table lookup to an array of floating point RGBA colors.
1346  */
1347 void
1348 _mesa_lookup_rgba_float(const struct gl_color_table *table,
1349                         GLuint n, GLfloat rgba[][4])
1350 {
1351    const GLint max = table->Size - 1;
1352    const GLfloat scale = (GLfloat) max;
1353    const GLfloat *lut = table->TableF;
1354    GLuint i;
1355
1356    if (!table->TableF || table->Size == 0)
1357       return;
1358
1359    switch (table->_BaseFormat) {
1360       case GL_INTENSITY:
1361          /* replace RGBA with I */
1362          for (i = 0; i < n; i++) {
1363             GLint j = IROUND(rgba[i][RCOMP] * scale);
1364             GLfloat c = lut[CLAMP(j, 0, max)];
1365             rgba[i][RCOMP] =
1366             rgba[i][GCOMP] =
1367             rgba[i][BCOMP] =
1368             rgba[i][ACOMP] = c;
1369          }
1370          break;
1371       case GL_LUMINANCE:
1372          /* replace RGB with L */
1373          for (i = 0; i < n; i++) {
1374             GLint j = IROUND(rgba[i][RCOMP] * scale);
1375             GLfloat c = lut[CLAMP(j, 0, max)];
1376             rgba[i][RCOMP] =
1377             rgba[i][GCOMP] =
1378             rgba[i][BCOMP] = c;
1379          }
1380          break;
1381       case GL_ALPHA:
1382          /* replace A with A */
1383          for (i = 0; i < n; i++) {
1384             GLint j = IROUND(rgba[i][ACOMP] * scale);
1385             rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
1386          }
1387          break;
1388       case GL_LUMINANCE_ALPHA:
1389          /* replace RGBA with LLLA */
1390          for (i = 0; i < n; i++) {
1391             GLint jL = IROUND(rgba[i][RCOMP] * scale);
1392             GLint jA = IROUND(rgba[i][ACOMP] * scale);
1393             GLfloat luminance, alpha;
1394             jL = CLAMP(jL, 0, max);
1395             jA = CLAMP(jA, 0, max);
1396             luminance = lut[jL * 2 + 0];
1397             alpha     = lut[jA * 2 + 1];
1398             rgba[i][RCOMP] =
1399             rgba[i][GCOMP] =
1400             rgba[i][BCOMP] = luminance;
1401             rgba[i][ACOMP] = alpha;;
1402          }
1403          break;
1404       case GL_RGB:
1405          /* replace RGB with RGB */
1406          for (i = 0; i < n; i++) {
1407             GLint jR = IROUND(rgba[i][RCOMP] * scale);
1408             GLint jG = IROUND(rgba[i][GCOMP] * scale);
1409             GLint jB = IROUND(rgba[i][BCOMP] * scale);
1410             jR = CLAMP(jR, 0, max);
1411             jG = CLAMP(jG, 0, max);
1412             jB = CLAMP(jB, 0, max);
1413             rgba[i][RCOMP] = lut[jR * 3 + 0];
1414             rgba[i][GCOMP] = lut[jG * 3 + 1];
1415             rgba[i][BCOMP] = lut[jB * 3 + 2];
1416          }
1417          break;
1418       case GL_RGBA:
1419          /* replace RGBA with RGBA */
1420          for (i = 0; i < n; i++) {
1421             GLint jR = IROUND(rgba[i][RCOMP] * scale);
1422             GLint jG = IROUND(rgba[i][GCOMP] * scale);
1423             GLint jB = IROUND(rgba[i][BCOMP] * scale);
1424             GLint jA = IROUND(rgba[i][ACOMP] * scale);
1425             jR = CLAMP(jR, 0, max);
1426             jG = CLAMP(jG, 0, max);
1427             jB = CLAMP(jB, 0, max);
1428             jA = CLAMP(jA, 0, max);
1429             rgba[i][RCOMP] = lut[jR * 4 + 0];
1430             rgba[i][GCOMP] = lut[jG * 4 + 1];
1431             rgba[i][BCOMP] = lut[jB * 4 + 2];
1432             rgba[i][ACOMP] = lut[jA * 4 + 3];
1433          }
1434          break;
1435       default:
1436          _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_float");
1437          return;
1438    }
1439 }
1440
1441
1442
1443 /**
1444  * Apply a color table lookup to an array of ubyte/RGBA colors.
1445  */
1446 void
1447 _mesa_lookup_rgba_ubyte(const struct gl_color_table *table,
1448                         GLuint n, GLubyte rgba[][4])
1449 {
1450    const GLubyte *lut = table->TableUB;
1451    const GLfloat scale = (GLfloat) (table->Size - 1) / (GLfloat)255.0;
1452    GLuint i;
1453
1454    if (!table->TableUB || table->Size == 0)
1455       return;
1456
1457    switch (table->_BaseFormat) {
1458    case GL_INTENSITY:
1459       /* replace RGBA with I */
1460       if (table->Size == 256) {
1461          for (i = 0; i < n; i++) {
1462             const GLubyte c = lut[rgba[i][RCOMP]];
1463             rgba[i][RCOMP] =
1464             rgba[i][GCOMP] =
1465             rgba[i][BCOMP] =
1466             rgba[i][ACOMP] = c;
1467          }
1468       }
1469       else {
1470          for (i = 0; i < n; i++) {
1471             GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
1472             rgba[i][RCOMP] =
1473             rgba[i][GCOMP] =
1474             rgba[i][BCOMP] =
1475             rgba[i][ACOMP] = lut[j];
1476          }
1477       }
1478       break;
1479    case GL_LUMINANCE:
1480       /* replace RGB with L */
1481       if (table->Size == 256) {
1482          for (i = 0; i < n; i++) {
1483             const GLubyte c = lut[rgba[i][RCOMP]];
1484             rgba[i][RCOMP] =
1485             rgba[i][GCOMP] =
1486             rgba[i][BCOMP] = c;
1487          }
1488       }
1489       else {
1490          for (i = 0; i < n; i++) {
1491             GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
1492             rgba[i][RCOMP] =
1493             rgba[i][GCOMP] =
1494             rgba[i][BCOMP] = lut[j];
1495          }
1496       }
1497       break;
1498    case GL_ALPHA:
1499       /* replace A with A */
1500       if (table->Size == 256) {
1501          for (i = 0; i < n; i++) {
1502             rgba[i][ACOMP] = lut[rgba[i][ACOMP]];
1503          }
1504       }
1505       else {
1506          for (i = 0; i < n; i++) {
1507             GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
1508             rgba[i][ACOMP] = lut[j];
1509          }
1510       }
1511       break;
1512    case GL_LUMINANCE_ALPHA:
1513       /* replace RGBA with LLLA */
1514       if (table->Size == 256) {
1515          for (i = 0; i < n; i++) {
1516             GLubyte l = lut[rgba[i][RCOMP] * 2 + 0];
1517             GLubyte a = lut[rgba[i][ACOMP] * 2 + 1];;
1518             rgba[i][RCOMP] =
1519             rgba[i][GCOMP] =
1520             rgba[i][BCOMP] = l;
1521             rgba[i][ACOMP] = a;
1522          }
1523       }
1524       else {
1525          for (i = 0; i < n; i++) {
1526             GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
1527             GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
1528             GLubyte luminance = lut[jL * 2 + 0];
1529             GLubyte alpha     = lut[jA * 2 + 1];
1530             rgba[i][RCOMP] =
1531             rgba[i][GCOMP] =
1532             rgba[i][BCOMP] = luminance;
1533             rgba[i][ACOMP] = alpha;
1534          }
1535       }
1536       break;
1537    case GL_RGB:
1538       if (table->Size == 256) {
1539          for (i = 0; i < n; i++) {
1540             rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0];
1541             rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1];
1542             rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2];
1543          }
1544       }
1545       else {
1546          for (i = 0; i < n; i++) {
1547             GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
1548             GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
1549             GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
1550             rgba[i][RCOMP] = lut[jR * 3 + 0];
1551             rgba[i][GCOMP] = lut[jG * 3 + 1];
1552             rgba[i][BCOMP] = lut[jB * 3 + 2];
1553          }
1554       }
1555       break;
1556    case GL_RGBA:
1557       if (table->Size == 256) {
1558          for (i = 0; i < n; i++) {
1559             rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0];
1560             rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1];
1561             rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2];
1562             rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3];
1563          }
1564       }
1565       else {
1566          for (i = 0; i < n; i++) {
1567             GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
1568             GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
1569             GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
1570             GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
1571             CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
1572             CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
1573             CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
1574             CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
1575          }
1576       }
1577       break;
1578    default:
1579       _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan");
1580       return;
1581    }
1582 }
1583
1584
1585
1586 /*
1587  * Map color indexes to float rgba values.
1588  */
1589 void
1590 _mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
1591                       const GLuint index[], GLfloat rgba[][4] )
1592 {
1593    GLuint rmask = ctx->PixelMaps.ItoR.Size - 1;
1594    GLuint gmask = ctx->PixelMaps.ItoG.Size - 1;
1595    GLuint bmask = ctx->PixelMaps.ItoB.Size - 1;
1596    GLuint amask = ctx->PixelMaps.ItoA.Size - 1;
1597    const GLfloat *rMap = ctx->PixelMaps.ItoR.Map;
1598    const GLfloat *gMap = ctx->PixelMaps.ItoG.Map;
1599    const GLfloat *bMap = ctx->PixelMaps.ItoB.Map;
1600    const GLfloat *aMap = ctx->PixelMaps.ItoA.Map;
1601    GLuint i;
1602    for (i=0;i<n;i++) {
1603       rgba[i][RCOMP] = rMap[index[i] & rmask];
1604       rgba[i][GCOMP] = gMap[index[i] & gmask];
1605       rgba[i][BCOMP] = bMap[index[i] & bmask];
1606       rgba[i][ACOMP] = aMap[index[i] & amask];
1607    }
1608 }
1609
1610
1611 /**
1612  * Map ubyte color indexes to ubyte/RGBA values.
1613  */
1614 void
1615 _mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[],
1616                        GLubyte rgba[][4])
1617 {
1618    GLuint rmask = ctx->PixelMaps.ItoR.Size - 1;
1619    GLuint gmask = ctx->PixelMaps.ItoG.Size - 1;
1620    GLuint bmask = ctx->PixelMaps.ItoB.Size - 1;
1621    GLuint amask = ctx->PixelMaps.ItoA.Size - 1;
1622    const GLubyte *rMap = ctx->PixelMaps.ItoR.Map8;
1623    const GLubyte *gMap = ctx->PixelMaps.ItoG.Map8;
1624    const GLubyte *bMap = ctx->PixelMaps.ItoB.Map8;
1625    const GLubyte *aMap = ctx->PixelMaps.ItoA.Map8;
1626    GLuint i;
1627    for (i=0;i<n;i++) {
1628       rgba[i][RCOMP] = rMap[index[i] & rmask];
1629       rgba[i][GCOMP] = gMap[index[i] & gmask];
1630       rgba[i][BCOMP] = bMap[index[i] & bmask];
1631       rgba[i][ACOMP] = aMap[index[i] & amask];
1632    }
1633 }
1634
1635
1636 void
1637 _mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n,
1638                            GLfloat depthValues[])
1639 {
1640    const GLfloat scale = ctx->Pixel.DepthScale;
1641    const GLfloat bias = ctx->Pixel.DepthBias;
1642    GLuint i;
1643    for (i = 0; i < n; i++) {
1644       GLfloat d = depthValues[i] * scale + bias;
1645       depthValues[i] = CLAMP(d, 0.0F, 1.0F);
1646    }
1647 }
1648
1649
1650 void
1651 _mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n,
1652                                 GLuint depthValues[])
1653 {
1654    const GLdouble max = (double) 0xffffffff;
1655    const GLdouble scale = ctx->Pixel.DepthScale;
1656    const GLdouble bias = ctx->Pixel.DepthBias * max;
1657    GLuint i;
1658    for (i = 0; i < n; i++) {
1659       GLdouble d = (GLdouble) depthValues[i] * scale + bias;
1660       d = CLAMP(d, 0.0, max);
1661       depthValues[i] = (GLuint) d;
1662    }
1663 }
1664
1665
1666
1667 /*
1668  * Update the min/max values from an array of fragment colors.
1669  */
1670 static void
1671 update_minmax(GLcontext *ctx, GLuint n, const GLfloat rgba[][4])
1672 {
1673    GLuint i;
1674    for (i = 0; i < n; i++) {
1675       /* update mins */
1676       if (rgba[i][RCOMP] < ctx->MinMax.Min[RCOMP])
1677          ctx->MinMax.Min[RCOMP] = rgba[i][RCOMP];
1678       if (rgba[i][GCOMP] < ctx->MinMax.Min[GCOMP])
1679          ctx->MinMax.Min[GCOMP] = rgba[i][GCOMP];
1680       if (rgba[i][BCOMP] < ctx->MinMax.Min[BCOMP])
1681          ctx->MinMax.Min[BCOMP] = rgba[i][BCOMP];
1682       if (rgba[i][ACOMP] < ctx->MinMax.Min[ACOMP])
1683          ctx->MinMax.Min[ACOMP] = rgba[i][ACOMP];
1684
1685       /* update maxs */
1686       if (rgba[i][RCOMP] > ctx->MinMax.Max[RCOMP])
1687          ctx->MinMax.Max[RCOMP] = rgba[i][RCOMP];
1688       if (rgba[i][GCOMP] > ctx->MinMax.Max[GCOMP])
1689          ctx->MinMax.Max[GCOMP] = rgba[i][GCOMP];
1690       if (rgba[i][BCOMP] > ctx->MinMax.Max[BCOMP])
1691          ctx->MinMax.Max[BCOMP] = rgba[i][BCOMP];
1692       if (rgba[i][ACOMP] > ctx->MinMax.Max[ACOMP])
1693          ctx->MinMax.Max[ACOMP] = rgba[i][ACOMP];
1694    }
1695 }
1696
1697
1698 /*
1699  * Update the histogram values from an array of fragment colors.
1700  */
1701 static void
1702 update_histogram(GLcontext *ctx, GLuint n, const GLfloat rgba[][4])
1703 {
1704    const GLint max = ctx->Histogram.Width - 1;
1705    GLfloat w = (GLfloat) max;
1706    GLuint i;
1707
1708    if (ctx->Histogram.Width == 0)
1709       return;
1710
1711    for (i = 0; i < n; i++) {
1712       GLint ri = IROUND(rgba[i][RCOMP] * w);
1713       GLint gi = IROUND(rgba[i][GCOMP] * w);
1714       GLint bi = IROUND(rgba[i][BCOMP] * w);
1715       GLint ai = IROUND(rgba[i][ACOMP] * w);
1716       ri = CLAMP(ri, 0, max);
1717       gi = CLAMP(gi, 0, max);
1718       bi = CLAMP(bi, 0, max);
1719       ai = CLAMP(ai, 0, max);
1720       ctx->Histogram.Count[ri][RCOMP]++;
1721       ctx->Histogram.Count[gi][GCOMP]++;
1722       ctx->Histogram.Count[bi][BCOMP]++;
1723       ctx->Histogram.Count[ai][ACOMP]++;
1724    }
1725 }
1726
1727
1728 /**
1729  * Apply various pixel transfer operations to an array of RGBA pixels
1730  * as indicated by the transferOps bitmask
1731  */
1732 void
1733 _mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLbitfield transferOps,
1734                               GLuint n, GLfloat rgba[][4])
1735 {
1736    /* scale & bias */
1737    if (transferOps & IMAGE_SCALE_BIAS_BIT) {
1738       _mesa_scale_and_bias_rgba(n, rgba,
1739                                 ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
1740                                 ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
1741                                 ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
1742                                 ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
1743    }
1744    /* color map lookup */
1745    if (transferOps & IMAGE_MAP_COLOR_BIT) {
1746       _mesa_map_rgba( ctx, n, rgba );
1747    }
1748    /* GL_COLOR_TABLE lookup */
1749    if (transferOps & IMAGE_COLOR_TABLE_BIT) {
1750       _mesa_lookup_rgba_float(&ctx->ColorTable[COLORTABLE_PRECONVOLUTION], n, rgba);
1751    }
1752    /* convolution */
1753    if (transferOps & IMAGE_CONVOLUTION_BIT) {
1754       /* this has to be done in the calling code */
1755       _mesa_problem(ctx, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
1756    }
1757    /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
1758    if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
1759       _mesa_scale_and_bias_rgba(n, rgba,
1760                                 ctx->Pixel.PostConvolutionScale[RCOMP],
1761                                 ctx->Pixel.PostConvolutionScale[GCOMP],
1762                                 ctx->Pixel.PostConvolutionScale[BCOMP],
1763                                 ctx->Pixel.PostConvolutionScale[ACOMP],
1764                                 ctx->Pixel.PostConvolutionBias[RCOMP],
1765                                 ctx->Pixel.PostConvolutionBias[GCOMP],
1766                                 ctx->Pixel.PostConvolutionBias[BCOMP],
1767                                 ctx->Pixel.PostConvolutionBias[ACOMP]);
1768    }
1769    /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
1770    if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
1771       _mesa_lookup_rgba_float(&ctx->ColorTable[COLORTABLE_POSTCONVOLUTION], n, rgba);
1772    }
1773    /* color matrix transform */
1774    if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
1775       _mesa_transform_rgba(ctx, n, rgba);
1776    }
1777    /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
1778    if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
1779       _mesa_lookup_rgba_float(&ctx->ColorTable[COLORTABLE_POSTCOLORMATRIX], n, rgba);
1780    }
1781    /* update histogram count */
1782    if (transferOps & IMAGE_HISTOGRAM_BIT) {
1783       update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
1784    }
1785    /* update min/max values */
1786    if (transferOps & IMAGE_MIN_MAX_BIT) {
1787       update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
1788    }
1789    /* clamping to [0,1] */
1790    if (transferOps & IMAGE_CLAMP_BIT) {
1791       GLuint i;
1792       for (i = 0; i < n; i++) {
1793          rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
1794          rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
1795          rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
1796          rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
1797       }
1798    }
1799 }
1800
1801
1802 /*
1803  * Apply color index shift and offset to an array of pixels.
1804  */
1805 static void
1806 shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
1807 {
1808    GLint shift = ctx->Pixel.IndexShift;
1809    GLint offset = ctx->Pixel.IndexOffset;
1810    GLuint i;
1811    if (shift > 0) {
1812       for (i=0;i<n;i++) {
1813          indexes[i] = (indexes[i] << shift) + offset;
1814       }
1815    }
1816    else if (shift < 0) {
1817       shift = -shift;
1818       for (i=0;i<n;i++) {
1819          indexes[i] = (indexes[i] >> shift) + offset;
1820       }
1821    }
1822    else {
1823       for (i=0;i<n;i++) {
1824          indexes[i] = indexes[i] + offset;
1825       }
1826    }
1827 }
1828
1829
1830
1831 /**
1832  * Apply color index shift, offset and table lookup to an array
1833  * of color indexes;
1834  */
1835 void
1836 _mesa_apply_ci_transfer_ops(const GLcontext *ctx, GLbitfield transferOps,
1837                             GLuint n, GLuint indexes[])
1838 {
1839    if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
1840       shift_and_offset_ci(ctx, n, indexes);
1841    }
1842    if (transferOps & IMAGE_MAP_COLOR_BIT) {
1843       const GLuint mask = ctx->PixelMaps.ItoI.Size - 1;
1844       GLuint i;
1845       for (i = 0; i < n; i++) {
1846          const GLuint j = indexes[i] & mask;
1847          indexes[i] = IROUND(ctx->PixelMaps.ItoI.Map[j]);
1848       }
1849    }
1850 }
1851
1852
1853 /**
1854  * Apply stencil index shift, offset and table lookup to an array
1855  * of stencil values.
1856  */
1857 void
1858 _mesa_apply_stencil_transfer_ops(const GLcontext *ctx, GLuint n,
1859                                  GLstencil stencil[])
1860 {
1861    if (ctx->Pixel.IndexShift != 0 || ctx->Pixel.IndexOffset != 0) {
1862       const GLint offset = ctx->Pixel.IndexOffset;
1863       GLint shift = ctx->Pixel.IndexShift;
1864       GLuint i;
1865       if (shift > 0) {
1866          for (i = 0; i < n; i++) {
1867             stencil[i] = (stencil[i] << shift) + offset;
1868          }
1869       }
1870       else if (shift < 0) {
1871          shift = -shift;
1872          for (i = 0; i < n; i++) {
1873             stencil[i] = (stencil[i] >> shift) + offset;
1874          }
1875       }
1876       else {
1877          for (i = 0; i < n; i++) {
1878             stencil[i] = stencil[i] + offset;
1879          }
1880       }
1881    }
1882    if (ctx->Pixel.MapStencilFlag) {
1883       GLuint mask = ctx->PixelMaps.StoS.Size - 1;
1884       GLuint i;
1885       for (i = 0; i < n; i++) {
1886          stencil[i] = (GLstencil)ctx->PixelMaps.StoS.Map[ stencil[i] & mask ];
1887       }
1888    }
1889 }
1890
1891
1892 /**
1893  * Used to pack an array [][4] of RGBA float colors as specified
1894  * by the dstFormat, dstType and dstPacking.  Used by glReadPixels,
1895  * glGetConvolutionFilter(), etc.
1896  * Note: the rgba values will be modified by this function when any pixel
1897  * transfer ops are enabled.
1898  */
1899 void
1900 _mesa_pack_rgba_span_float(GLcontext *ctx, GLuint n, GLfloat rgba[][4],
1901                            GLenum dstFormat, GLenum dstType,
1902                            GLvoid *dstAddr,
1903                            const struct gl_pixelstore_attrib *dstPacking,
1904                            GLbitfield transferOps)
1905 {
1906    GLfloat luminance[MAX_WIDTH];
1907    const GLint comps = _mesa_components_in_format(dstFormat);
1908    GLuint i;
1909
1910    /* XXX
1911     * This test should probably go away.  Have the caller set/clear the
1912     * IMAGE_CLAMP_BIT as needed.
1913     */
1914    if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) {
1915       /* need to clamp to [0, 1] */
1916       transferOps |= IMAGE_CLAMP_BIT;
1917    }
1918
1919    if (transferOps) {
1920       _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
1921       if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) {
1922          return;
1923       }
1924    }
1925
1926    if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
1927       /* compute luminance values */
1928       if (transferOps & IMAGE_CLAMP_BIT) {
1929          for (i = 0; i < n; i++) {
1930             GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
1931             luminance[i] = CLAMP(sum, 0.0F, 1.0F);
1932          }
1933       }
1934       else {
1935          for (i = 0; i < n; i++) {
1936             luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
1937          }
1938       }
1939    }
1940
1941    /*
1942     * Pack/store the pixels.  Ugh!  Lots of cases!!!
1943     */
1944    switch (dstType) {
1945       case GL_UNSIGNED_BYTE:
1946          {
1947             GLubyte *dst = (GLubyte *) dstAddr;
1948             switch (dstFormat) {
1949                case GL_RED:
1950                   for (i=0;i<n;i++)
1951                      dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1952                   break;
1953                case GL_GREEN:
1954                   for (i=0;i<n;i++)
1955                      dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1956                   break;
1957                case GL_BLUE:
1958                   for (i=0;i<n;i++)
1959                      dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1960                   break;
1961                case GL_ALPHA:
1962                   for (i=0;i<n;i++)
1963                      dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1964                   break;
1965                case GL_LUMINANCE:
1966                   for (i=0;i<n;i++)
1967                      dst[i] = FLOAT_TO_UBYTE(luminance[i]);
1968                   break;
1969                case GL_LUMINANCE_ALPHA:
1970                   for (i=0;i<n;i++) {
1971                      dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
1972                      dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1973                   }
1974                   break;
1975                case GL_RGB:
1976                   for (i=0;i<n;i++) {
1977                      dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1978                      dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1979                      dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1980                   }
1981                   break;
1982                case GL_RGBA:
1983                   for (i=0;i<n;i++) {
1984                      dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1985                      dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1986                      dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1987                      dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1988                   }
1989                   break;
1990                case GL_BGR:
1991                   for (i=0;i<n;i++) {
1992                      dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1993                      dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1994                      dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1995                   }
1996                   break;
1997                case GL_BGRA:
1998                   for (i=0;i<n;i++) {
1999                      dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
2000                      dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
2001                      dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2002                      dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
2003                   }
2004                   break;
2005                case GL_ABGR_EXT:
2006                   for (i=0;i<n;i++) {
2007                      dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
2008                      dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
2009                      dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
2010                      dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2011                   }
2012                   break;
2013                case GL_DUDV_ATI:
2014                case GL_DU8DV8_ATI:
2015                   for (i=0;i<n;i++) {
2016                      dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2017                      dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
2018                   }
2019                   break;
2020                default:
2021                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2022             }
2023          }
2024          break;
2025       case GL_BYTE:
2026          {
2027             GLbyte *dst = (GLbyte *) dstAddr;
2028             switch (dstFormat) {
2029                case GL_RED:
2030                   for (i=0;i<n;i++)
2031                      dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2032                   break;
2033                case GL_GREEN:
2034                   for (i=0;i<n;i++)
2035                      dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2036                   break;
2037                case GL_BLUE:
2038                   for (i=0;i<n;i++)
2039                      dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
2040                   break;
2041                case GL_ALPHA:
2042                   for (i=0;i<n;i++)
2043                      dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
2044                   break;
2045                case GL_LUMINANCE:
2046                   for (i=0;i<n;i++)
2047                      dst[i] = FLOAT_TO_BYTE(luminance[i]);
2048                   break;
2049                case GL_LUMINANCE_ALPHA:
2050                   for (i=0;i<n;i++) {
2051                      dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
2052                      dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
2053                   }
2054                   break;
2055                case GL_RGB:
2056                   for (i=0;i<n;i++) {
2057                      dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2058                      dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2059                      dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
2060                   }
2061                   break;
2062                case GL_RGBA:
2063                   for (i=0;i<n;i++) {
2064                      dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2065                      dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2066                      dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
2067                      dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
2068                   }
2069                   break;
2070                case GL_BGR:
2071                   for (i=0;i<n;i++) {
2072                      dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
2073                      dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2074                      dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2075                   }
2076                   break;
2077                case GL_BGRA:
2078                   for (i=0;i<n;i++) {
2079                      dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
2080                      dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2081                      dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2082                      dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
2083                   }
2084                   break;
2085                case GL_ABGR_EXT:
2086                   for (i=0;i<n;i++) {
2087                      dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
2088                      dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
2089                      dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2090                      dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2091                   }
2092                   break;
2093                case GL_DUDV_ATI:
2094                case GL_DU8DV8_ATI:
2095                   for (i=0;i<n;i++) {
2096                      dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
2097                      dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
2098                   }
2099                   break;
2100                default:
2101                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2102             }
2103          }
2104          break;
2105       case GL_UNSIGNED_SHORT:
2106          {
2107             GLushort *dst = (GLushort *) dstAddr;
2108             switch (dstFormat) {
2109                case GL_RED:
2110                   for (i=0;i<n;i++)
2111                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
2112                   break;
2113                case GL_GREEN:
2114                   for (i=0;i<n;i++)
2115                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
2116                   break;
2117                case GL_BLUE:
2118                   for (i=0;i<n;i++)
2119                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
2120                   break;
2121                case GL_ALPHA:
2122                   for (i=0;i<n;i++)
2123                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
2124                   break;
2125                case GL_LUMINANCE:
2126                   for (i=0;i<n;i++)
2127                      UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
2128                   break;
2129                case GL_LUMINANCE_ALPHA:
2130                   for (i=0;i<n;i++) {
2131                      UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
2132                      CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
2133                   }
2134                   break;
2135                case GL_RGB:
2136                   for (i=0;i<n;i++) {
2137                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
2138                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
2139                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
2140                   }
2141                   break;
2142                case GL_RGBA:
2143                   for (i=0;i<n;i++) {
2144                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
2145                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
2146                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
2147                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
2148                   }
2149                   break;
2150                case GL_BGR:
2151                   for (i=0;i<n;i++) {
2152                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
2153                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
2154                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
2155                   }
2156                   break;
2157                case GL_BGRA:
2158                   for (i=0;i<n;i++) {
2159                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
2160                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
2161                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
2162                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
2163                   }
2164                   break;
2165                case GL_ABGR_EXT:
2166                   for (i=0;i<n;i++) {
2167                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
2168                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
2169                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
2170                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
2171                   }
2172                   break;
2173                case GL_DUDV_ATI:
2174                case GL_DU8DV8_ATI:
2175                   for (i=0;i<n;i++) {
2176                      dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
2177                      dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
2178                   }
2179                   break;
2180                default:
2181                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2182             }
2183          }
2184          break;
2185       case GL_SHORT:
2186          {
2187             GLshort *dst = (GLshort *) dstAddr;
2188             switch (dstFormat) {
2189                case GL_RED:
2190                   for (i=0;i<n;i++)
2191                      dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2192                   break;
2193                case GL_GREEN:
2194                   for (i=0;i<n;i++)
2195                      dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2196                   break;
2197                case GL_BLUE:
2198                   for (i=0;i<n;i++)
2199                      dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
2200                   break;
2201                case GL_ALPHA:
2202                   for (i=0;i<n;i++)
2203                      dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
2204                   break;
2205                case GL_LUMINANCE:
2206                   for (i=0;i<n;i++)
2207                      dst[i] = FLOAT_TO_SHORT(luminance[i]);
2208                   break;
2209                case GL_LUMINANCE_ALPHA:
2210                   for (i=0;i<n;i++) {
2211                      dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
2212                      dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
2213                   }
2214                   break;
2215                case GL_RGB:
2216                   for (i=0;i<n;i++) {
2217                      dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2218                      dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2219                      dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
2220                   }
2221                   break;
2222                case GL_RGBA:
2223                   for (i=0;i<n;i++) {
2224                      dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2225                      dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2226                      dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
2227                      dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
2228                   }
2229                   break;
2230                case GL_BGR:
2231                   for (i=0;i<n;i++) {
2232                      dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
2233                      dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2234                      dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2235                   }
2236                   break;
2237                case GL_BGRA:
2238                   for (i=0;i<n;i++) {
2239                      dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
2240                      dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2241                      dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2242                      dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
2243                   }
2244                   break;
2245                case GL_ABGR_EXT:
2246                   for (i=0;i<n;i++) {
2247                      dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
2248                      dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
2249                      dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2250                      dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2251                   }
2252                   break;
2253                case GL_DUDV_ATI:
2254                case GL_DU8DV8_ATI:
2255                   for (i=0;i<n;i++) {
2256                      dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
2257                      dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
2258                   }
2259                   break;
2260                default:
2261                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2262             }
2263          }
2264          break;
2265       case GL_UNSIGNED_INT:
2266          {
2267             GLuint *dst = (GLuint *) dstAddr;
2268             switch (dstFormat) {
2269                case GL_RED:
2270                   for (i=0;i<n;i++)
2271                      dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2272                   break;
2273                case GL_GREEN:
2274                   for (i=0;i<n;i++)
2275                      dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2276                   break;
2277                case GL_BLUE:
2278                   for (i=0;i<n;i++)
2279                      dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
2280                   break;
2281                case GL_ALPHA:
2282                   for (i=0;i<n;i++)
2283                      dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
2284                   break;
2285                case GL_LUMINANCE:
2286                   for (i=0;i<n;i++)
2287                      dst[i] = FLOAT_TO_UINT(luminance[i]);
2288                   break;
2289                case GL_LUMINANCE_ALPHA:
2290                   for (i=0;i<n;i++) {
2291                      dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
2292                      dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
2293                   }
2294                   break;
2295                case GL_RGB:
2296                   for (i=0;i<n;i++) {
2297                      dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2298                      dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2299                      dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
2300                   }
2301                   break;
2302                case GL_RGBA:
2303                   for (i=0;i<n;i++) {
2304                      dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2305                      dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2306                      dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
2307                      dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
2308                   }
2309                   break;
2310                case GL_BGR:
2311                   for (i=0;i<n;i++) {
2312                      dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
2313                      dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2314                      dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2315                   }
2316                   break;
2317                case GL_BGRA:
2318                   for (i=0;i<n;i++) {
2319                      dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
2320                      dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2321                      dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2322                      dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
2323                   }
2324                   break;
2325                case GL_ABGR_EXT:
2326                   for (i=0;i<n;i++) {
2327                      dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
2328                      dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
2329                      dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2330                      dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2331                   }
2332                   break;
2333                case GL_DUDV_ATI:
2334                case GL_DU8DV8_ATI:
2335                   for (i=0;i<n;i++) {
2336                      dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
2337                      dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
2338                   }
2339                   break;
2340                default:
2341                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2342             }
2343          }
2344          break;
2345       case GL_INT:
2346          {
2347             GLint *dst = (GLint *) dstAddr;
2348             switch (dstFormat) {
2349                case GL_RED:
2350                   for (i=0;i<n;i++)
2351                      dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
2352                   break;
2353                case GL_GREEN:
2354                   for (i=0;i<n;i++)
2355                      dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
2356                   break;
2357                case GL_BLUE:
2358                   for (i=0;i<n;i++)
2359                      dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
2360                   break;
2361                case GL_ALPHA:
2362                   for (i=0;i<n;i++)
2363                      dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
2364                   break;
2365                case GL_LUMINANCE:
2366                   for (i=0;i<n;i++)
2367                      dst[i] = FLOAT_TO_INT(luminance[i]);
2368                   break;
2369                case GL_LUMINANCE_ALPHA:
2370                   for (i=0;i<n;i++) {
2371                      dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
2372                      dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
2373                   }
2374                   break;
2375                case GL_RGB:
2376                   for (i=0;i<n;i++) {
2377                      dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2378                      dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2379                      dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
2380                   }
2381                   break;
2382                case GL_RGBA:
2383                   for (i=0;i<n;i++) {
2384                      dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2385                      dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2386                      dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
2387                      dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
2388                   }
2389                   break;
2390                case GL_BGR:
2391                   for (i=0;i<n;i++) {
2392                      dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
2393                      dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2394                      dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
2395                   }
2396                   break;
2397                case GL_BGRA:
2398                   for (i=0;i<n;i++) {
2399                      dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
2400                      dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2401                      dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
2402                      dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
2403                   }
2404                   break;
2405                case GL_ABGR_EXT:
2406                   for (i=0;i<n;i++) {
2407                      dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
2408                      dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
2409                      dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
2410                      dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
2411                   }
2412                   break;
2413                case GL_DUDV_ATI:
2414                case GL_DU8DV8_ATI:
2415                   for (i=0;i<n;i++) {
2416                      dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2417                      dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2418                   }
2419                   break;
2420                default:
2421                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2422             }
2423          }
2424          break;
2425       case GL_FLOAT:
2426          {
2427             GLfloat *dst = (GLfloat *) dstAddr;
2428             switch (dstFormat) {
2429                case GL_RED:
2430                   for (i=0;i<n;i++)
2431                      dst[i] = rgba[i][RCOMP];
2432                   break;
2433                case GL_GREEN:
2434                   for (i=0;i<n;i++)
2435                      dst[i] = rgba[i][GCOMP];
2436                   break;
2437                case GL_BLUE:
2438                   for (i=0;i<n;i++)
2439                      dst[i] = rgba[i][BCOMP];
2440                   break;
2441                case GL_ALPHA:
2442                   for (i=0;i<n;i++)
2443                      dst[i] = rgba[i][ACOMP];
2444                   break;
2445                case GL_LUMINANCE:
2446                   for (i=0;i<n;i++)
2447                      dst[i] = luminance[i];
2448                   break;
2449                case GL_LUMINANCE_ALPHA:
2450                   for (i=0;i<n;i++) {
2451                      dst[i*2+0] = luminance[i];
2452                      dst[i*2+1] = rgba[i][ACOMP];
2453                   }
2454                   break;
2455                case GL_RGB:
2456                   for (i=0;i<n;i++) {
2457                      dst[i*3+0] = rgba[i][RCOMP];
2458                      dst[i*3+1] = rgba[i][GCOMP];
2459                      dst[i*3+2] = rgba[i][BCOMP];
2460                   }
2461                   break;
2462                case GL_RGBA:
2463                   for (i=0;i<n;i++) {
2464                      dst[i*4+0] = rgba[i][RCOMP];
2465                      dst[i*4+1] = rgba[i][GCOMP];
2466                      dst[i*4+2] = rgba[i][BCOMP];
2467                      dst[i*4+3] = rgba[i][ACOMP];
2468                   }
2469                   break;
2470                case GL_BGR:
2471                   for (i=0;i<n;i++) {
2472                      dst[i*3+0] = rgba[i][BCOMP];
2473                      dst[i*3+1] = rgba[i][GCOMP];
2474                      dst[i*3+2] = rgba[i][RCOMP];
2475                   }
2476                   break;
2477                case GL_BGRA:
2478                   for (i=0;i<n;i++) {
2479                      dst[i*4+0] = rgba[i][BCOMP];
2480                      dst[i*4+1] = rgba[i][GCOMP];
2481                      dst[i*4+2] = rgba[i][RCOMP];
2482                      dst[i*4+3] = rgba[i][ACOMP];
2483                   }
2484                   break;
2485                case GL_ABGR_EXT:
2486                   for (i=0;i<n;i++) {
2487                      dst[i*4+0] = rgba[i][ACOMP];
2488                      dst[i*4+1] = rgba[i][BCOMP];
2489                      dst[i*4+2] = rgba[i][GCOMP];
2490                      dst[i*4+3] = rgba[i][RCOMP];
2491                   }
2492                   break;
2493                case GL_DUDV_ATI:
2494                case GL_DU8DV8_ATI:
2495                   for (i=0;i<n;i++) {
2496                      dst[i*2+0] = rgba[i][RCOMP];
2497                      dst[i*2+1] = rgba[i][GCOMP];
2498                   }
2499                   break;
2500                default:
2501                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2502             }
2503          }
2504          break;
2505       case GL_HALF_FLOAT_ARB:
2506          {
2507             GLhalfARB *dst = (GLhalfARB *) dstAddr;
2508             switch (dstFormat) {
2509                case GL_RED:
2510                   for (i=0;i<n;i++)
2511                      dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
2512                   break;
2513                case GL_GREEN:
2514                   for (i=0;i<n;i++)
2515                      dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
2516                   break;
2517                case GL_BLUE:
2518                   for (i=0;i<n;i++)
2519                      dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
2520                   break;
2521                case GL_ALPHA:
2522                   for (i=0;i<n;i++)
2523                      dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
2524                   break;
2525                case GL_LUMINANCE:
2526                   for (i=0;i<n;i++)
2527                      dst[i] = _mesa_float_to_half(luminance[i]);
2528                   break;
2529                case GL_LUMINANCE_ALPHA:
2530                   for (i=0;i<n;i++) {
2531                      dst[i*2+0] = _mesa_float_to_half(luminance[i]);
2532                      dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
2533                   }
2534                   break;
2535                case GL_RGB:
2536                   for (i=0;i<n;i++) {
2537                      dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2538                      dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2539                      dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
2540                   }
2541                   break;
2542                case GL_RGBA:
2543                   for (i=0;i<n;i++) {
2544                      dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2545                      dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2546                      dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
2547                      dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
2548                   }
2549                   break;
2550                case GL_BGR:
2551                   for (i=0;i<n;i++) {
2552                      dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
2553                      dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2554                      dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
2555                   }
2556                   break;
2557                case GL_BGRA:
2558                   for (i=0;i<n;i++) {
2559                      dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
2560                      dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2561                      dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
2562                      dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
2563                   }
2564                   break;
2565                case GL_ABGR_EXT:
2566                   for (i=0;i<n;i++) {
2567                      dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
2568                      dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
2569                      dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
2570                      dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
2571                   }
2572                   break;
2573                case GL_DUDV_ATI:
2574                case GL_DU8DV8_ATI:
2575                   for (i=0;i<n;i++) {
2576                      dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2577                      dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2578                   }
2579                   break;
2580                default:
2581                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2582             }
2583          }
2584          break;
2585       case GL_UNSIGNED_BYTE_3_3_2:
2586          if (dstFormat == GL_RGB) {
2587             GLubyte *dst = (GLubyte *) dstAddr;
2588             for (i=0;i<n;i++) {
2589                dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5)
2590                       | (IROUND(rgba[i][GCOMP] * 7.0F) << 2)
2591                       | (IROUND(rgba[i][BCOMP] * 3.0F)     );
2592             }
2593          }
2594          break;
2595       case GL_UNSIGNED_BYTE_2_3_3_REV:
2596          if (dstFormat == GL_RGB) {
2597             GLubyte *dst = (GLubyte *) dstAddr;
2598             for (i=0;i<n;i++) {
2599                dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F)     )
2600                       | (IROUND(rgba[i][GCOMP] * 7.0F) << 3)
2601                       | (IROUND(rgba[i][BCOMP] * 3.0F) << 6);
2602             }
2603          }
2604          break;
2605       case GL_UNSIGNED_SHORT_5_6_5:
2606          if (dstFormat == GL_RGB) {
2607             GLushort *dst = (GLushort *) dstAddr;
2608             for (i=0;i<n;i++) {
2609                dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
2610                       | (IROUND(rgba[i][GCOMP] * 63.0F) <<  5)
2611                       | (IROUND(rgba[i][BCOMP] * 31.0F)      );
2612             }
2613          }
2614          break;
2615       case GL_UNSIGNED_SHORT_5_6_5_REV:
2616          if (dstFormat == GL_RGB) {
2617             GLushort *dst = (GLushort *) dstAddr;
2618             for (i=0;i<n;i++) {
2619                dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F)      )
2620                       | (IROUND(rgba[i][GCOMP] * 63.0F) <<  5)
2621                       | (IROUND(rgba[i][BCOMP] * 31.0F) << 11);
2622             }
2623          }
2624          break;
2625       case GL_UNSIGNED_SHORT_4_4_4_4:
2626          if (dstFormat == GL_RGBA) {
2627             GLushort *dst = (GLushort *) dstAddr;
2628             for (i=0;i<n;i++) {
2629                dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12)
2630                       | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
2631                       | (IROUND(rgba[i][BCOMP] * 15.0F) <<  4)
2632                       | (IROUND(rgba[i][ACOMP] * 15.0F)      );
2633             }
2634          }
2635          else if (dstFormat == GL_BGRA) {
2636             GLushort *dst = (GLushort *) dstAddr;
2637             for (i=0;i<n;i++) {
2638                dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12)
2639                       | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
2640                       | (IROUND(rgba[i][RCOMP] * 15.0F) <<  4)
2641                       | (IROUND(rgba[i][ACOMP] * 15.0F)      );
2642             }
2643          }
2644          else if (dstFormat == GL_ABGR_EXT) {
2645             GLushort *dst = (GLushort *) dstAddr;
2646             for (i=0;i<n;i++) {
2647                dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12)
2648                       | (IROUND(rgba[i][BCOMP] * 15.0F) <<  8)
2649                       | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
2650                       | (IROUND(rgba[i][RCOMP] * 15.0F)      );
2651             }
2652          }
2653          break;
2654       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2655          if (dstFormat == GL_RGBA) {
2656             GLushort *dst = (GLushort *) dstAddr;
2657             for (i=0;i<n;i++) {
2658                dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F)      )
2659                       | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
2660                       | (IROUND(rgba[i][BCOMP] * 15.0F) <<  8)
2661                       | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
2662             }
2663          }
2664          else if (dstFormat == GL_BGRA) {
2665             GLushort *dst = (GLushort *) dstAddr;
2666             for (i=0;i<n;i++) {
2667                dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F)      )
2668                       | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
2669                       | (IROUND(rgba[i][RCOMP] * 15.0F) <<  8)
2670                       | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
2671             }
2672          }
2673          else if (dstFormat == GL_ABGR_EXT) {
2674             GLushort *dst = (GLushort *) dstAddr;
2675             for (i=0;i<n;i++) {
2676                dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F)      )
2677                       | (IROUND(rgba[i][BCOMP] * 15.0F) <<  4)
2678                       | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
2679                       | (IROUND(rgba[i][RCOMP] * 15.0F) << 12);
2680             }
2681          }
2682          break;
2683       case GL_UNSIGNED_SHORT_5_5_5_1:
2684          if (dstFormat == GL_RGBA) {
2685             GLushort *dst = (GLushort *) dstAddr;
2686             for (i=0;i<n;i++) {
2687                dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
2688                       | (IROUND(rgba[i][GCOMP] * 31.0F) <<  6)
2689                       | (IROUND(rgba[i][BCOMP] * 31.0F) <<  1)
2690                       | (IROUND(rgba[i][ACOMP] *  1.0F)      );
2691             }
2692          }
2693          else if (dstFormat == GL_BGRA) {
2694             GLushort *dst = (GLushort *) dstAddr;
2695             for (i=0;i<n;i++) {
2696                dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11)
2697                       | (IROUND(rgba[i][GCOMP] * 31.0F) <<  6)
2698                       | (IROUND(rgba[i][RCOMP] * 31.0F) <<  1)
2699                       | (IROUND(rgba[i][ACOMP] *  1.0F)      );
2700             }
2701          }
2702          else if (dstFormat == GL_ABGR_EXT) {
2703             GLushort *dst = (GLushort *) dstAddr;
2704             for (i=0;i<n;i++) {
2705                dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11)
2706                       | (IROUND(rgba[i][BCOMP] * 31.0F) <<  6)
2707                       | (IROUND(rgba[i][GCOMP] * 31.0F) <<  1)
2708                       | (IROUND(rgba[i][RCOMP] *  1.0F)      );
2709             }
2710          }
2711          break;
2712       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2713          if (dstFormat == GL_RGBA) {
2714             GLushort *dst = (GLushort *) dstAddr;
2715             for (i=0;i<n;i++) {
2716                dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F)      )
2717                       | (IROUND(rgba[i][GCOMP] * 31.0F) <<  5)
2718                       | (IROUND(rgba[i][BCOMP] * 31.0F) << 10)
2719                       | (IROUND(rgba[i][ACOMP] *  1.0F) << 15);
2720             }
2721          }
2722          else if (dstFormat == GL_BGRA) {
2723             GLushort *dst = (GLushort *) dstAddr;
2724             for (i=0;i<n;i++) {
2725                dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F)      )
2726                       | (IROUND(rgba[i][GCOMP] * 31.0F) <<  5)
2727                       | (IROUND(rgba[i][RCOMP] * 31.0F) << 10)
2728                       | (IROUND(rgba[i][ACOMP] *  1.0F) << 15);
2729             }
2730          }
2731          else if (dstFormat == GL_ABGR_EXT) {
2732             GLushort *dst = (GLushort *) dstAddr;
2733             for (i=0;i<n;i++) {
2734                dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F)      )
2735                       | (IROUND(rgba[i][BCOMP] * 31.0F) <<  5)
2736                       | (IROUND(rgba[i][GCOMP] * 31.0F) << 10)
2737                       | (IROUND(rgba[i][RCOMP] *  1.0F) << 15);
2738             }
2739          }
2740          break;
2741       case GL_UNSIGNED_INT_8_8_8_8:
2742          if (dstFormat == GL_RGBA) {
2743             GLuint *dst = (GLuint *) dstAddr;
2744             for (i=0;i<n;i++) {
2745                dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24)
2746                       | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
2747                       | (IROUND(rgba[i][BCOMP] * 255.F) <<  8)
2748                       | (IROUND(rgba[i][ACOMP] * 255.F)      );
2749             }
2750          }
2751          else if (dstFormat == GL_BGRA) {
2752             GLuint *dst = (GLuint *) dstAddr;
2753             for (i=0;i<n;i++) {
2754                dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24)
2755                       | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
2756                       | (IROUND(rgba[i][RCOMP] * 255.F) <<  8)
2757                       | (IROUND(rgba[i][ACOMP] * 255.F)      );
2758             }
2759          }
2760          else if (dstFormat == GL_ABGR_EXT) {
2761             GLuint *dst = (GLuint *) dstAddr;
2762             for (i=0;i<n;i++) {
2763                dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24)
2764                       | (IROUND(rgba[i][BCOMP] * 255.F) << 16)
2765                       | (IROUND(rgba[i][GCOMP] * 255.F) <<  8)
2766                       | (IROUND(rgba[i][RCOMP] * 255.F)      );
2767             }
2768          }
2769          break;
2770       case GL_UNSIGNED_INT_8_8_8_8_REV:
2771          if (dstFormat == GL_RGBA) {
2772             GLuint *dst = (GLuint *) dstAddr;
2773             for (i=0;i<n;i++) {
2774                dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F)      )
2775                       | (IROUND(rgba[i][GCOMP] * 255.0F) <<  8)
2776                       | (IROUND(rgba[i][BCOMP] * 255.0F) << 16)
2777                       | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
2778             }
2779          }
2780          else if (dstFormat == GL_BGRA) {
2781             GLuint *dst = (GLuint *) dstAddr;
2782             for (i=0;i<n;i++) {
2783                dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F)      )
2784                       | (IROUND(rgba[i][GCOMP] * 255.0F) <<  8)
2785                       | (IROUND(rgba[i][RCOMP] * 255.0F) << 16)
2786                       | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
2787             }
2788          }
2789          else if (dstFormat == GL_ABGR_EXT) {
2790             GLuint *dst = (GLuint *) dstAddr;
2791             for (i=0;i<n;i++) {
2792                dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F)      )
2793                       | (IROUND(rgba[i][BCOMP] * 255.0F) <<  8)
2794                       | (IROUND(rgba[i][GCOMP] * 255.0F) << 16)
2795                       | (IROUND(rgba[i][RCOMP] * 255.0F) << 24);
2796             }
2797          }
2798          break;
2799       case GL_UNSIGNED_INT_10_10_10_2:
2800          if (dstFormat == GL_RGBA) {
2801             GLuint *dst = (GLuint *) dstAddr;
2802             for (i=0;i<n;i++) {
2803                dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22)
2804                       | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
2805                       | (IROUND(rgba[i][BCOMP] * 1023.0F) <<  2)
2806                       | (IROUND(rgba[i][ACOMP] *    3.0F)      );
2807             }
2808          }
2809          else if (dstFormat == GL_BGRA) {
2810             GLuint *dst = (GLuint *) dstAddr;
2811             for (i=0;i<n;i++) {
2812                dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22)
2813                       | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
2814                       | (IROUND(rgba[i][RCOMP] * 1023.0F) <<  2)
2815                       | (IROUND(rgba[i][ACOMP] *    3.0F)      );
2816             }
2817          }
2818          else if (dstFormat == GL_ABGR_EXT) {
2819             GLuint *dst = (GLuint *) dstAddr;
2820             for (i=0;i<n;i++) {
2821                dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22)
2822                       | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12)
2823                       | (IROUND(rgba[i][GCOMP] * 1023.0F) <<  2)
2824                       | (IROUND(rgba[i][RCOMP] *    3.0F)      );
2825             }
2826          }
2827          break;
2828       case GL_UNSIGNED_INT_2_10_10_10_REV:
2829          if (dstFormat == GL_RGBA) {
2830             GLuint *dst = (GLuint *) dstAddr;
2831             for (i=0;i<n;i++) {
2832                dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F)      )
2833                       | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
2834                       | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20)
2835                       | (IROUND(rgba[i][ACOMP] *    3.0F) << 30);
2836             }
2837          }
2838          else if (dstFormat == GL_BGRA) {
2839             GLuint *dst = (GLuint *) dstAddr;
2840             for (i=0;i<n;i++) {
2841                dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F)      )
2842                       | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
2843                       | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20)
2844                       | (IROUND(rgba[i][ACOMP] *    3.0F) << 30);
2845             }
2846          }
2847          else if (dstFormat == GL_ABGR_EXT) {
2848             GLuint *dst = (GLuint *) dstAddr;
2849             for (i=0;i<n;i++) {
2850                dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F)      )
2851                       | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10)
2852                       | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20)
2853                       | (IROUND(rgba[i][RCOMP] *    3.0F) << 30);
2854             }
2855          }
2856          break;
2857       default:
2858          _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
2859          return;
2860    }
2861
2862    if (dstPacking->SwapBytes) {
2863       GLint swapSize = _mesa_sizeof_packed_type(dstType);
2864       if (swapSize == 2) {
2865          if (dstPacking->SwapBytes) {
2866             _mesa_swap2((GLushort *) dstAddr, n * comps);
2867          }
2868       }
2869       else if (swapSize == 4) {
2870          if (dstPacking->SwapBytes) {
2871             _mesa_swap4((GLuint *) dstAddr, n * comps);
2872          }
2873       }
2874    }
2875 }
2876
2877
2878 #define SWAP2BYTE(VALUE)                        \
2879    {                                            \
2880       GLubyte *bytes = (GLubyte *) &(VALUE);    \
2881       GLubyte tmp = bytes[0];                   \
2882       bytes[0] = bytes[1];                      \
2883       bytes[1] = tmp;                           \
2884    }
2885
2886 #define SWAP4BYTE(VALUE)                        \
2887    {                                            \
2888       GLubyte *bytes = (GLubyte *) &(VALUE);    \
2889       GLubyte tmp = bytes[0];                   \
2890       bytes[0] = bytes[3];                      \
2891       bytes[3] = tmp;                           \
2892       tmp = bytes[1];                           \
2893       bytes[1] = bytes[2];                      \
2894       bytes[2] = tmp;                           \
2895    }
2896
2897
2898 static void
2899 extract_uint_indexes(GLuint n, GLuint indexes[],
2900                      GLenum srcFormat, GLenum srcType, const GLvoid *src,
2901                      const struct gl_pixelstore_attrib *unpack )
2902 {
2903    ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
2904
2905    ASSERT(srcType == GL_BITMAP ||
2906           srcType == GL_UNSIGNED_BYTE ||
2907           srcType == GL_BYTE ||
2908           srcType == GL_UNSIGNED_SHORT ||
2909           srcType == GL_SHORT ||
2910           srcType == GL_UNSIGNED_INT ||
2911           srcType == GL_INT ||
2912           srcType == GL_UNSIGNED_INT_24_8_EXT ||
2913           srcType == GL_HALF_FLOAT_ARB ||
2914           srcType == GL_FLOAT);
2915
2916    switch (srcType) {
2917       case GL_BITMAP:
2918          {
2919             GLubyte *ubsrc = (GLubyte *) src;
2920             if (unpack->LsbFirst) {
2921                GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
2922                GLuint i;
2923                for (i = 0; i < n; i++) {
2924                   indexes[i] = (*ubsrc & mask) ? 1 : 0;
2925                   if (mask == 128) {
2926                      mask = 1;
2927                      ubsrc++;
2928                   }
2929                   else {
2930                      mask = mask << 1;
2931                   }
2932                }
2933             }
2934             else {
2935                GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
2936                GLuint i;
2937                for (i = 0; i < n; i++) {
2938                   indexes[i] = (*ubsrc & mask) ? 1 : 0;
2939                   if (mask == 1) {
2940                      mask = 128;
2941                      ubsrc++;
2942                   }
2943                   else {
2944                      mask = mask >> 1;
2945                   }
2946                }
2947             }
2948          }
2949          break;
2950       case GL_UNSIGNED_BYTE:
2951          {
2952             GLuint i;
2953             const GLubyte *s = (const GLubyte *) src;
2954             for (i = 0; i < n; i++)
2955                indexes[i] = s[i];
2956          }
2957          break;
2958       case GL_BYTE:
2959          {
2960             GLuint i;
2961             const GLbyte *s = (const GLbyte *) src;
2962             for (i = 0; i < n; i++)
2963                indexes[i] = s[i];
2964          }
2965          break;
2966       case GL_UNSIGNED_SHORT:
2967          {
2968             GLuint i;
2969             const GLushort *s = (const GLushort *) src;
2970             if (unpack->SwapBytes) {
2971                for (i = 0; i < n; i++) {
2972                   GLushort value = s[i];
2973                   SWAP2BYTE(value);
2974                   indexes[i] = value;
2975                }
2976             }
2977             else {
2978                for (i = 0; i < n; i++)
2979                   indexes[i] = s[i];
2980             }
2981          }
2982          break;
2983       case GL_SHORT:
2984          {
2985             GLuint i;
2986             const GLshort *s = (const GLshort *) src;
2987             if (unpack->SwapBytes) {
2988                for (i = 0; i < n; i++) {
2989                   GLshort value = s[i];
2990                   SWAP2BYTE(value);
2991                   indexes[i] = value;
2992                }
2993             }
2994             else {
2995                for (i = 0; i < n; i++)
2996                   indexes[i] = s[i];
2997             }
2998          }
2999          break;
3000       case GL_UNSIGNED_INT:
3001          {
3002             GLuint i;
3003             const GLuint *s = (const GLuint *) src;
3004             if (unpack->SwapBytes) {
3005                for (i = 0; i < n; i++) {
3006                   GLuint value = s[i];
3007                   SWAP4BYTE(value);
3008                   indexes[i] = value;
3009                }
3010             }
3011             else {
3012                for (i = 0; i < n; i++)
3013                   indexes[i] = s[i];
3014             }
3015          }
3016          break;
3017       case GL_INT:
3018          {
3019             GLuint i;
3020             const GLint *s = (const GLint *) src;
3021             if (unpack->SwapBytes) {
3022                for (i = 0; i < n; i++) {
3023                   GLint value = s[i];
3024                   SWAP4BYTE(value);
3025                   indexes[i] = value;
3026                }
3027             }
3028             else {
3029                for (i = 0; i < n; i++)
3030                   indexes[i] = s[i];
3031             }
3032          }
3033          break;
3034       case GL_FLOAT:
3035          {
3036             GLuint i;
3037             const GLfloat *s = (const GLfloat *) src;
3038             if (unpack->SwapBytes) {
3039                for (i = 0; i < n; i++) {
3040                   GLfloat value = s[i];
3041                   SWAP4BYTE(value);
3042                   indexes[i] = (GLuint) value;
3043                }
3044             }
3045             else {
3046                for (i = 0; i < n; i++)
3047                   indexes[i] = (GLuint) s[i];
3048             }
3049          }
3050          break;
3051       case GL_HALF_FLOAT_ARB:
3052          {
3053             GLuint i;
3054             const GLhalfARB *s = (const GLhalfARB *) src;
3055             if (unpack->SwapBytes) {
3056                for (i = 0; i < n; i++) {
3057                   GLhalfARB value = s[i];
3058                   SWAP2BYTE(value);
3059                   indexes[i] = (GLuint) _mesa_half_to_float(value);
3060                }
3061             }
3062             else {
3063                for (i = 0; i < n; i++)
3064                   indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
3065             }
3066          }
3067          break;
3068       case GL_UNSIGNED_INT_24_8_EXT:
3069          {
3070             GLuint i;
3071             const GLuint *s = (const GLuint *) src;
3072             if (unpack->SwapBytes) {
3073                for (i = 0; i < n; i++) {
3074                   GLuint value = s[i];
3075                   SWAP4BYTE(value);
3076                   indexes[i] = value & 0xff;  /* lower 8 bits */
3077                }
3078             }
3079             else {
3080                for (i = 0; i < n; i++)
3081                   indexes[i] = s[i] & 0xff;  /* lower 8 bits */
3082             }
3083          }
3084          break;
3085
3086       default:
3087          _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
3088          return;
3089    }
3090 }
3091
3092
3093 /*
3094  * This function extracts floating point RGBA values from arbitrary
3095  * image data.  srcFormat and srcType are the format and type parameters
3096  * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3097  *
3098  * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3099  * implements the "Conversion to floating point", "Conversion to RGB",
3100  * and "Final Expansion to RGBA" operations.
3101  *
3102  * Args:  n - number of pixels
3103  *        rgba - output colors
3104  *        srcFormat - format of incoming data
3105  *        srcType - data type of incoming data
3106  *        src - source data pointer
3107  *        swapBytes - perform byteswapping of incoming data?
3108  */
3109 static void
3110 extract_float_rgba(GLuint n, GLfloat rgba[][4],
3111                    GLenum srcFormat, GLenum srcType, const GLvoid *src,
3112                    GLboolean swapBytes)
3113 {
3114    GLint redIndex, greenIndex, blueIndex, alphaIndex;
3115    GLint stride;
3116    GLint rComp, bComp, gComp, aComp;
3117
3118    ASSERT(srcFormat == GL_RED ||
3119           srcFormat == GL_GREEN ||
3120           srcFormat == GL_BLUE ||
3121           srcFormat == GL_ALPHA ||
3122           srcFormat == GL_LUMINANCE ||
3123           srcFormat == GL_LUMINANCE_ALPHA ||
3124           srcFormat == GL_INTENSITY ||
3125           srcFormat == GL_RGB ||
3126           srcFormat == GL_BGR ||
3127           srcFormat == GL_RGBA ||
3128           srcFormat == GL_BGRA ||
3129           srcFormat == GL_ABGR_EXT ||
3130           srcFormat == GL_DUDV_ATI);
3131
3132    ASSERT(srcType == GL_UNSIGNED_BYTE ||
3133           srcType == GL_BYTE ||
3134           srcType == GL_UNSIGNED_SHORT ||
3135           srcType == GL_SHORT ||
3136           srcType == GL_UNSIGNED_INT ||
3137           srcType == GL_INT ||
3138           srcType == GL_HALF_FLOAT_ARB ||
3139           srcType == GL_FLOAT ||
3140           srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3141           srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3142           srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3143           srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3144           srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3145           srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3146           srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3147           srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3148           srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3149           srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3150           srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3151           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
3152
3153    rComp = gComp = bComp = aComp = -1;
3154
3155    switch (srcFormat) {
3156       case GL_RED:
3157          redIndex = 0;
3158          greenIndex = blueIndex = alphaIndex = -1;
3159          stride = 1;
3160          break;
3161       case GL_GREEN:
3162          greenIndex = 0;
3163          redIndex = blueIndex = alphaIndex = -1;
3164          stride = 1;
3165          break;
3166       case GL_BLUE:
3167          blueIndex = 0;
3168          redIndex = greenIndex = alphaIndex = -1;
3169          stride = 1;
3170          break;
3171       case GL_ALPHA:
3172          redIndex = greenIndex = blueIndex = -1;
3173          alphaIndex = 0;
3174          stride = 1;
3175          break;
3176       case GL_LUMINANCE:
3177          redIndex = greenIndex = blueIndex = 0;
3178          alphaIndex = -1;
3179          stride = 1;
3180          break;
3181       case GL_LUMINANCE_ALPHA:
3182          redIndex = greenIndex = blueIndex = 0;
3183          alphaIndex = 1;
3184          stride = 2;
3185          break;
3186       case GL_INTENSITY:
3187          redIndex = greenIndex = blueIndex = alphaIndex = 0;
3188          stride = 1;
3189          break;
3190       case GL_RGB:
3191          redIndex = 0;
3192          greenIndex = 1;
3193          blueIndex = 2;
3194          alphaIndex = -1;
3195          rComp = 0;
3196          gComp = 1;
3197          bComp = 2;
3198          aComp = 3;
3199          stride = 3;
3200          break;
3201       case GL_BGR:
3202          redIndex = 2;
3203          greenIndex = 1;
3204          blueIndex = 0;
3205          alphaIndex = -1;
3206          rComp = 2;
3207          gComp = 1;
3208          bComp = 0;
3209          aComp = 3;
3210          stride = 3;
3211          break;
3212       case GL_RGBA:
3213          redIndex = 0;
3214          greenIndex = 1;
3215          blueIndex = 2;
3216          alphaIndex = 3;
3217          rComp = 0;
3218          gComp = 1;
3219          bComp = 2;
3220          aComp = 3;
3221          stride = 4;
3222          break;
3223       case GL_BGRA:
3224          redIndex = 2;
3225          greenIndex = 1;
3226          blueIndex = 0;
3227          alphaIndex = 3;
3228          rComp = 2;
3229          gComp = 1;
3230          bComp = 0;
3231          aComp = 3;
3232          stride = 4;
3233          break;
3234       case GL_ABGR_EXT:
3235          redIndex = 3;
3236          greenIndex = 2;
3237          blueIndex = 1;
3238          alphaIndex = 0;
3239          rComp = 3;
3240          gComp = 2;
3241          bComp = 1;
3242          aComp = 0;
3243          stride = 4;
3244          break;
3245       case GL_DUDV_ATI:
3246          redIndex = 0;
3247          greenIndex = 1;
3248          blueIndex = -1;
3249          alphaIndex = -1;
3250          stride = 2;
3251          break;
3252       default:
3253          _mesa_problem(NULL, "bad srcFormat in extract float data");
3254          return;
3255    }
3256
3257
3258 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)              \
3259    if ((INDEX) < 0) {                                                   \
3260       GLuint i;                                                         \
3261       for (i = 0; i < n; i++) {                                         \
3262          rgba[i][CHANNEL] = DEFAULT;                                    \
3263       }                                                                 \
3264    }                                                                    \
3265    else if (swapBytes) {                                                \
3266       const TYPE *s = (const TYPE *) src;                               \
3267       GLuint i;                                                         \
3268       for (i = 0; i < n; i++) {                                         \
3269          TYPE value = s[INDEX];                                         \
3270          if (sizeof(TYPE) == 2) {                                       \
3271             SWAP2BYTE(value);                                           \
3272          }                                                              \
3273          else if (sizeof(TYPE) == 4) {                                  \
3274             SWAP4BYTE(value);                                           \
3275          }                                                              \
3276          rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);                \
3277          s += stride;                                                   \
3278       }                                                                 \
3279    }                                                                    \
3280    else {                                                               \
3281       const TYPE *s = (const TYPE *) src;                               \
3282       GLuint i;                                                         \
3283       for (i = 0; i < n; i++) {                                         \
3284          rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);             \
3285          s += stride;                                                   \
3286       }                                                                 \
3287    }
3288
3289    switch (srcType) {
3290       case GL_UNSIGNED_BYTE:
3291          PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
3292          PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
3293          PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
3294          PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
3295          break;
3296       case GL_BYTE:
3297          PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
3298          PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
3299          PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
3300          PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
3301          break;
3302       case GL_UNSIGNED_SHORT:
3303          PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
3304          PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
3305          PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
3306          PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
3307          break;
3308       case GL_SHORT:
3309          PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
3310          PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
3311          PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
3312          PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
3313          break;
3314       case GL_UNSIGNED_INT:
3315          PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
3316          PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
3317          PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
3318          PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
3319          break;
3320       case GL_INT:
3321          PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
3322          PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
3323          PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
3324          PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
3325          break;
3326       case GL_FLOAT:
3327          PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
3328          PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
3329          PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
3330          PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
3331          break;
3332       case GL_HALF_FLOAT_ARB:
3333          PROCESS(redIndex,   RCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
3334          PROCESS(greenIndex, GCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
3335          PROCESS(blueIndex,  BCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
3336          PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfARB, _mesa_half_to_float);
3337          break;
3338       case GL_UNSIGNED_BYTE_3_3_2:
3339          {
3340             const GLubyte *ubsrc = (const GLubyte *) src;
3341             GLuint i;
3342             for (i = 0; i < n; i ++) {
3343                GLubyte p = ubsrc[i];
3344                rgba[i][rComp] = ((p >> 5)      ) * (1.0F / 7.0F);
3345                rgba[i][gComp] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
3346                rgba[i][bComp] = ((p     ) & 0x3) * (1.0F / 3.0F);
3347                rgba[i][aComp] = 1.0F;
3348             }
3349          }
3350          break;
3351       case GL_UNSIGNED_BYTE_2_3_3_REV:
3352          {
3353             const GLubyte *ubsrc = (const GLubyte *) src;
3354             GLuint i;
3355             for (i = 0; i < n; i ++) {
3356                GLubyte p = ubsrc[i];
3357                rgba[i][rComp] = ((p     ) & 0x7) * (1.0F / 7.0F);
3358                rgba[i][gComp] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
3359                rgba[i][bComp] = ((p >> 6)      ) * (1.0F / 3.0F);
3360                rgba[i][aComp] = 1.0F;
3361             }
3362          }
3363          break;
3364       case GL_UNSIGNED_SHORT_5_6_5:
3365          if (swapBytes) {
3366             const GLushort *ussrc = (const GLushort *) src;
3367             GLuint i;
3368             for (i = 0; i < n; i ++) {
3369                GLushort p = ussrc[i];
3370                SWAP2BYTE(p);
3371                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
3372                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
3373                rgba[i][bComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
3374                rgba[i][aComp] = 1.0F;
3375             }
3376          }
3377          else {
3378             const GLushort *ussrc = (const GLushort *) src;
3379             GLuint i;
3380             for (i = 0; i < n; i ++) {
3381                GLushort p = ussrc[i];
3382                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
3383                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
3384                rgba[i][bComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
3385                rgba[i][aComp] = 1.0F;
3386             }
3387          }
3388          break;
3389       case GL_UNSIGNED_SHORT_5_6_5_REV:
3390          if (swapBytes) {
3391             const GLushort *ussrc = (const GLushort *) src;
3392             GLuint i;
3393             for (i = 0; i < n; i ++) {
3394                GLushort p = ussrc[i];
3395                SWAP2BYTE(p);
3396                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
3397                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
3398                rgba[i][bComp] = ((p >> 11)       ) * (1.0F / 31.0F);
3399                rgba[i][aComp] = 1.0F;
3400             }
3401          }
3402          else {
3403             const GLushort *ussrc = (const GLushort *) src;
3404             GLuint i;
3405             for (i = 0; i < n; i ++) {
3406                GLushort p = ussrc[i];
3407                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
3408                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
3409                rgba[i][bComp] = ((p >> 11)       ) * (1.0F / 31.0F);
3410                rgba[i][aComp] = 1.0F;
3411             }
3412          }
3413          break;
3414       case GL_UNSIGNED_SHORT_4_4_4_4:
3415          if (swapBytes) {
3416             const GLushort *ussrc = (const GLushort *) src;
3417             GLuint i;
3418             for (i = 0; i < n; i ++) {
3419                GLushort p = ussrc[i];
3420                SWAP2BYTE(p);
3421                rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
3422                rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
3423                rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
3424                rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
3425             }
3426          }
3427          else {
3428             const GLushort *ussrc = (const GLushort *) src;
3429             GLuint i;
3430             for (i = 0; i < n; i ++) {
3431                GLushort p = ussrc[i];
3432                rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
3433                rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
3434                rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
3435                rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
3436             }
3437          }
3438          break;
3439       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3440          if (swapBytes) {
3441             const GLushort *ussrc = (const GLushort *) src;
3442             GLuint i;
3443             for (i = 0; i < n; i ++) {
3444                GLushort p = ussrc[i];
3445                SWAP2BYTE(p);
3446                rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
3447                rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
3448                rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
3449                rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
3450             }
3451          }
3452          else {
3453             const GLushort *ussrc = (const GLushort *) src;
3454             GLuint i;
3455             for (i = 0; i < n; i ++) {
3456                GLushort p = ussrc[i];
3457                rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
3458                rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
3459                rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
3460                rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
3461             }
3462          }
3463          break;
3464       case GL_UNSIGNED_SHORT_5_5_5_1:
3465          if (swapBytes) {
3466             const GLushort *ussrc = (const GLushort *) src;
3467             GLuint i;
3468             for (i = 0; i < n; i ++) {
3469                GLushort p = ussrc[i];
3470                SWAP2BYTE(p);
3471                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
3472                rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
3473                rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
3474                rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
3475             }
3476          }
3477          else {
3478             const GLushort *ussrc = (const GLushort *) src;
3479             GLuint i;
3480             for (i = 0; i < n; i ++) {
3481                GLushort p = ussrc[i];
3482                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
3483                rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
3484                rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
3485                rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
3486             }
3487          }
3488          break;
3489       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3490          if (swapBytes) {
3491             const GLushort *ussrc = (const GLushort *) src;
3492             GLuint i;
3493             for (i = 0; i < n; i ++) {
3494                GLushort p = ussrc[i];
3495                SWAP2BYTE(p);
3496                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
3497                rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
3498                rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
3499                rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
3500             }
3501          }
3502          else {
3503             const GLushort *ussrc = (const GLushort *) src;
3504             GLuint i;
3505             for (i = 0; i < n; i ++) {
3506                GLushort p = ussrc[i];
3507                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
3508                rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
3509                rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
3510                rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
3511             }
3512          }
3513          break;
3514       case GL_UNSIGNED_INT_8_8_8_8:
3515          if (swapBytes) {
3516             const GLuint *uisrc = (const GLuint *) src;
3517             GLuint i;
3518             for (i = 0; i < n; i ++) {
3519                GLuint p = uisrc[i];
3520                rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
3521                rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3522                rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3523                rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
3524             }
3525          }
3526          else {
3527             const GLuint *uisrc = (const GLuint *) src;
3528             GLuint i;
3529             for (i = 0; i < n; i ++) {
3530                GLuint p = uisrc[i];
3531                rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
3532                rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3533                rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3534                rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
3535             }
3536          }
3537          break;
3538       case GL_UNSIGNED_INT_8_8_8_8_REV:
3539          if (swapBytes) {
3540             const GLuint *uisrc = (const GLuint *) src;
3541             GLuint i;
3542             for (i = 0; i < n; i ++) {
3543                GLuint p = uisrc[i];
3544                rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
3545                rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3546                rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3547                rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
3548             }
3549          }
3550          else {
3551             const GLuint *uisrc = (const GLuint *) src;
3552             GLuint i;
3553             for (i = 0; i < n; i ++) {
3554                GLuint p = uisrc[i];
3555                rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
3556                rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3557                rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3558                rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
3559             }
3560          }
3561          break;
3562       case GL_UNSIGNED_INT_10_10_10_2:
3563          if (swapBytes) {
3564             const GLuint *uisrc = (const GLuint *) src;
3565             GLuint i;
3566             for (i = 0; i < n; i ++) {
3567                GLuint p = uisrc[i];
3568                SWAP4BYTE(p);
3569                rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
3570                rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
3571                rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
3572                rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
3573             }
3574          }
3575          else {
3576             const GLuint *uisrc = (const GLuint *) src;
3577             GLuint i;
3578             for (i = 0; i < n; i ++) {
3579                GLuint p = uisrc[i];
3580                rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
3581                rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
3582                rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
3583                rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
3584             }
3585          }
3586          break;
3587       case GL_UNSIGNED_INT_2_10_10_10_REV:
3588          if (swapBytes) {
3589             const GLuint *uisrc = (const GLuint *) src;
3590             GLuint i;
3591             for (i = 0; i < n; i ++) {
3592                GLuint p = uisrc[i];
3593                SWAP4BYTE(p);
3594                rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
3595                rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
3596                rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
3597                rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
3598             }
3599          }
3600          else {
3601             const GLuint *uisrc = (const GLuint *) src;
3602             GLuint i;
3603             for (i = 0; i < n; i ++) {
3604                GLuint p = uisrc[i];
3605                rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
3606                rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
3607                rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
3608                rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
3609             }
3610          }
3611          break;
3612       default:
3613          _mesa_problem(NULL, "bad srcType in extract float data");
3614          break;
3615    }
3616 }
3617
3618
3619 /*
3620  * Unpack a row of color image data from a client buffer according to
3621  * the pixel unpacking parameters.
3622  * Return GLchan values in the specified dest image format.
3623  * This is used by glDrawPixels and glTexImage?D().
3624  * \param ctx - the context
3625  *         n - number of pixels in the span
3626  *         dstFormat - format of destination color array
3627  *         dest - the destination color array
3628  *         srcFormat - source image format
3629  *         srcType - source image  data type
3630  *         source - source image pointer
3631  *         srcPacking - pixel unpacking parameters
3632  *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3633  *
3634  * XXX perhaps expand this to process whole images someday.
3635  */
3636 void
3637 _mesa_unpack_color_span_chan( GLcontext *ctx,
3638                               GLuint n, GLenum dstFormat, GLchan dest[],
3639                               GLenum srcFormat, GLenum srcType,
3640                               const GLvoid *source,
3641                               const struct gl_pixelstore_attrib *srcPacking,
3642                               GLbitfield transferOps )
3643 {
3644    ASSERT(dstFormat == GL_ALPHA ||
3645           dstFormat == GL_LUMINANCE ||
3646           dstFormat == GL_LUMINANCE_ALPHA ||
3647           dstFormat == GL_INTENSITY ||
3648           dstFormat == GL_RGB ||
3649           dstFormat == GL_RGBA ||
3650           dstFormat == GL_COLOR_INDEX);
3651
3652    ASSERT(srcFormat == GL_RED ||
3653           srcFormat == GL_GREEN ||
3654           srcFormat == GL_BLUE ||
3655           srcFormat == GL_ALPHA ||
3656           srcFormat == GL_LUMINANCE ||
3657           srcFormat == GL_LUMINANCE_ALPHA ||
3658           srcFormat == GL_INTENSITY ||
3659           srcFormat == GL_RGB ||
3660           srcFormat == GL_BGR ||
3661           srcFormat == GL_RGBA ||
3662           srcFormat == GL_BGRA ||
3663           srcFormat == GL_ABGR_EXT ||
3664           srcFormat == GL_COLOR_INDEX);
3665
3666    ASSERT(srcType == GL_BITMAP ||
3667           srcType == GL_UNSIGNED_BYTE ||
3668           srcType == GL_BYTE ||
3669           srcType == GL_UNSIGNED_SHORT ||
3670           srcType == GL_SHORT ||
3671           srcType == GL_UNSIGNED_INT ||
3672           srcType == GL_INT ||
3673           srcType == GL_HALF_FLOAT_ARB ||
3674           srcType == GL_FLOAT ||
3675           srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3676           srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3677           srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3678           srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3679           srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3680           srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3681           srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3682           srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3683           srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3684           srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3685           srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3686           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
3687
3688    /* Try simple cases first */
3689    if (transferOps == 0) {
3690       if (srcType == CHAN_TYPE) {
3691          if (dstFormat == GL_RGBA) {
3692             if (srcFormat == GL_RGBA) {
3693                _mesa_memcpy( dest, source, n * 4 * sizeof(GLchan) );
3694                return;
3695             }
3696             else if (srcFormat == GL_RGB) {
3697                GLuint i;
3698                const GLchan *src = (const GLchan *) source;
3699                GLchan *dst = dest;
3700                for (i = 0; i < n; i++) {
3701                   dst[0] = src[0];
3702                   dst[1] = src[1];
3703                   dst[2] = src[2];
3704                   dst[3] = CHAN_MAX;
3705                   src += 3;
3706                   dst += 4;
3707                }
3708                return;
3709             }
3710          }
3711          else if (dstFormat == GL_RGB) {
3712             if (srcFormat == GL_RGB) {
3713                _mesa_memcpy( dest, source, n * 3 * sizeof(GLchan) );
3714                return;
3715             }
3716             else if (srcFormat == GL_RGBA) {
3717                GLuint i;
3718                const GLchan *src = (const GLchan *) source;
3719                GLchan *dst = dest;
3720                for (i = 0; i < n; i++) {
3721                   dst[0] = src[0];
3722                   dst[1] = src[1];
3723                   dst[2] = src[2];
3724                   src += 4;
3725                   dst += 3;
3726                }
3727                return;
3728             }
3729          }
3730          else if (dstFormat == srcFormat) {
3731             GLint comps = _mesa_components_in_format(srcFormat);
3732             assert(comps > 0);
3733             _mesa_memcpy( dest, source, n * comps * sizeof(GLchan) );
3734             return;
3735          }
3736       }
3737       /*
3738        * Common situation, loading 8bit RGBA/RGB source images
3739        * into 16/32 bit destination. (OSMesa16/32)
3740        */
3741       else if (srcType == GL_UNSIGNED_BYTE) {
3742          if (dstFormat == GL_RGBA) {
3743             if (srcFormat == GL_RGB) {
3744                GLuint i;
3745                const GLubyte *src = (const GLubyte *) source;
3746                GLchan *dst = dest;
3747                for (i = 0; i < n; i++) {
3748                   dst[0] = UBYTE_TO_CHAN(src[0]);
3749                   dst[1] = UBYTE_TO_CHAN(src[1]);
3750                   dst[2] = UBYTE_TO_CHAN(src[2]);
3751                   dst[3] = CHAN_MAX;
3752                   src += 3;
3753                   dst += 4;
3754                }
3755                return;
3756             }
3757             else if (srcFormat == GL_RGBA) {
3758                GLuint i;
3759                const GLubyte *src = (const GLubyte *) source;
3760                GLchan *dst = dest;
3761                for (i = 0; i < n; i++) {
3762                   dst[0] = UBYTE_TO_CHAN(src[0]);
3763                   dst[1] = UBYTE_TO_CHAN(src[1]);
3764                   dst[2] = UBYTE_TO_CHAN(src[2]);
3765                   dst[3] = UBYTE_TO_CHAN(src[3]);
3766                   src += 4;
3767                   dst += 4;
3768                }
3769                return;
3770              }
3771          }
3772          else if (dstFormat == GL_RGB) {
3773             if (srcFormat == GL_RGB) {
3774                GLuint i;
3775                const GLubyte *src = (const GLubyte *) source;
3776                GLchan *dst = dest;
3777                for (i = 0; i < n; i++) {
3778                   dst[0] = UBYTE_TO_CHAN(src[0]);
3779                   dst[1] = UBYTE_TO_CHAN(src[1]);
3780                   dst[2] = UBYTE_TO_CHAN(src[2]);
3781                   src += 3;
3782                   dst += 3;
3783                }
3784                return;
3785             }
3786             else if (srcFormat == GL_RGBA) {
3787                GLuint i;
3788                const GLubyte *src = (const GLubyte *) source;
3789                GLchan *dst = dest;
3790                for (i = 0; i < n; i++) {
3791                   dst[0] = UBYTE_TO_CHAN(src[0]);
3792                   dst[1] = UBYTE_TO_CHAN(src[1]);
3793                   dst[2] = UBYTE_TO_CHAN(src[2]);
3794                   src += 4;
3795                   dst += 3;
3796                }
3797                return;
3798             }
3799          }
3800       }
3801    }
3802
3803
3804    /* general solution begins here */
3805    {
3806       GLint dstComponents;
3807       GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
3808       GLint dstLuminanceIndex, dstIntensityIndex;
3809       GLfloat rgba[MAX_WIDTH][4];
3810
3811       dstComponents = _mesa_components_in_format( dstFormat );
3812       /* source & dest image formats should have been error checked by now */
3813       assert(dstComponents > 0);
3814
3815       /*
3816        * Extract image data and convert to RGBA floats
3817        */
3818       assert(n <= MAX_WIDTH);
3819       if (srcFormat == GL_COLOR_INDEX) {
3820          GLuint indexes[MAX_WIDTH];
3821          extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3822                               srcPacking);
3823
3824          if (dstFormat == GL_COLOR_INDEX) {
3825             GLuint i;
3826             _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
3827             /* convert to GLchan and return */
3828             for (i = 0; i < n; i++) {
3829                dest[i] = (GLchan) (indexes[i] & 0xff);
3830             }
3831             return;
3832          }
3833          else {
3834             /* Convert indexes to RGBA */
3835             if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3836                shift_and_offset_ci(ctx, n, indexes);
3837             }
3838             _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3839          }
3840
3841          /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3842           * with color indexes.
3843           */
3844          transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3845       }
3846       else {
3847          /* non-color index data */
3848          extract_float_rgba(n, rgba, srcFormat, srcType, source,
3849                             srcPacking->SwapBytes);
3850       }
3851
3852       /* Need to clamp if returning GLubytes or GLushorts */
3853 #if CHAN_TYPE != GL_FLOAT
3854       transferOps |= IMAGE_CLAMP_BIT;
3855 #endif
3856
3857       if (transferOps) {
3858          _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3859       }
3860
3861       /* Now determine which color channels we need to produce.
3862        * And determine the dest index (offset) within each color tuple.
3863        */
3864       switch (dstFormat) {
3865          case GL_ALPHA:
3866             dstAlphaIndex = 0;
3867             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3868             dstLuminanceIndex = dstIntensityIndex = -1;
3869             break;
3870          case GL_LUMINANCE:
3871             dstLuminanceIndex = 0;
3872             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3873             dstIntensityIndex = -1;
3874             break;
3875          case GL_LUMINANCE_ALPHA:
3876             dstLuminanceIndex = 0;
3877             dstAlphaIndex = 1;
3878             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3879             dstIntensityIndex = -1;
3880             break;
3881          case GL_INTENSITY:
3882             dstIntensityIndex = 0;
3883             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3884             dstLuminanceIndex = -1;
3885             break;
3886          case GL_RGB:
3887             dstRedIndex = 0;
3888             dstGreenIndex = 1;
3889             dstBlueIndex = 2;
3890             dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
3891             break;
3892          case GL_RGBA:
3893             dstRedIndex = 0;
3894             dstGreenIndex = 1;
3895             dstBlueIndex = 2;
3896             dstAlphaIndex = 3;
3897             dstLuminanceIndex = dstIntensityIndex = -1;
3898             break;
3899          default:
3900             _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
3901             return;
3902       }
3903
3904
3905       /* Now return the GLchan data in the requested dstFormat */
3906
3907       if (dstRedIndex >= 0) {
3908          GLchan *dst = dest;
3909          GLuint i;
3910          for (i = 0; i < n; i++) {
3911             CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
3912             dst += dstComponents;
3913          }
3914       }
3915
3916       if (dstGreenIndex >= 0) {
3917          GLchan *dst = dest;
3918          GLuint i;
3919          for (i = 0; i < n; i++) {
3920             CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
3921             dst += dstComponents;
3922          }
3923       }
3924
3925       if (dstBlueIndex >= 0) {
3926          GLchan *dst = dest;
3927          GLuint i;
3928          for (i = 0; i < n; i++) {
3929             CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
3930             dst += dstComponents;
3931          }
3932       }
3933
3934       if (dstAlphaIndex >= 0) {
3935          GLchan *dst = dest;
3936          GLuint i;
3937          for (i = 0; i < n; i++) {
3938             CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
3939             dst += dstComponents;
3940          }
3941       }
3942
3943       if (dstIntensityIndex >= 0) {
3944          GLchan *dst = dest;
3945          GLuint i;
3946          assert(dstIntensityIndex == 0);
3947          assert(dstComponents == 1);
3948          for (i = 0; i < n; i++) {
3949             /* Intensity comes from red channel */
3950             CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
3951          }
3952       }
3953
3954       if (dstLuminanceIndex >= 0) {
3955          GLchan *dst = dest;
3956          GLuint i;
3957          assert(dstLuminanceIndex == 0);
3958          for (i = 0; i < n; i++) {
3959             /* Luminance comes from red channel */
3960             CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
3961             dst += dstComponents;
3962          }
3963       }
3964    }
3965 }
3966
3967
3968 /**
3969  * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3970  * instead of GLchan.
3971  */
3972 void
3973 _mesa_unpack_color_span_float( GLcontext *ctx,
3974                                GLuint n, GLenum dstFormat, GLfloat dest[],
3975                                GLenum srcFormat, GLenum srcType,
3976                                const GLvoid *source,
3977                                const struct gl_pixelstore_attrib *srcPacking,
3978                                GLbitfield transferOps )
3979 {
3980    ASSERT(dstFormat == GL_ALPHA ||
3981           dstFormat == GL_LUMINANCE ||
3982           dstFormat == GL_LUMINANCE_ALPHA ||
3983           dstFormat == GL_INTENSITY ||
3984           dstFormat == GL_RGB ||
3985           dstFormat == GL_RGBA ||
3986           dstFormat == GL_COLOR_INDEX);
3987
3988    ASSERT(srcFormat == GL_RED ||
3989           srcFormat == GL_GREEN ||
3990           srcFormat == GL_BLUE ||
3991           srcFormat == GL_ALPHA ||
3992           srcFormat == GL_LUMINANCE ||
3993           srcFormat == GL_LUMINANCE_ALPHA ||
3994           srcFormat == GL_INTENSITY ||
3995           srcFormat == GL_RGB ||
3996           srcFormat == GL_BGR ||
3997           srcFormat == GL_RGBA ||
3998           srcFormat == GL_BGRA ||
3999           srcFormat == GL_ABGR_EXT ||
4000           srcFormat == GL_COLOR_INDEX);
4001
4002    ASSERT(srcType == GL_BITMAP ||
4003           srcType == GL_UNSIGNED_BYTE ||
4004           srcType == GL_BYTE ||
4005           srcType == GL_UNSIGNED_SHORT ||
4006           srcType == GL_SHORT ||
4007           srcType == GL_UNSIGNED_INT ||
4008           srcType == GL_INT ||
4009           srcType == GL_HALF_FLOAT_ARB ||
4010           srcType == GL_FLOAT ||
4011           srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4012           srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4013           srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4014           srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4015           srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4016           srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4017           srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4018           srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4019           srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4020           srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4021           srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4022           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
4023
4024    /* general solution, no special cases, yet */
4025    {
4026       GLint dstComponents;
4027       GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
4028       GLint dstLuminanceIndex, dstIntensityIndex;
4029       GLfloat rgba[MAX_WIDTH][4];
4030
4031       dstComponents = _mesa_components_in_format( dstFormat );
4032       /* source & dest image formats should have been error checked by now */
4033       assert(dstComponents > 0);
4034
4035       /*
4036        * Extract image data and convert to RGBA floats
4037        */
4038       assert(n <= MAX_WIDTH);
4039       if (srcFormat == GL_COLOR_INDEX) {
4040          GLuint indexes[MAX_WIDTH];
4041          extract_uint_indexes(n, indexes, srcFormat, srcType, source,
4042                               srcPacking);
4043
4044          if (dstFormat == GL_COLOR_INDEX) {
4045             GLuint i;
4046             _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4047             /* convert to GLchan and return */
4048             for (i = 0; i < n; i++) {
4049                dest[i] = (GLchan) (indexes[i] & 0xff);
4050             }
4051             return;
4052          }
4053          else {
4054             /* Convert indexes to RGBA */
4055             if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4056                shift_and_offset_ci(ctx, n, indexes);
4057             }
4058             _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
4059          }
4060
4061          /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4062           * with color indexes.
4063           */
4064          transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
4065       }
4066       else {
4067          /* non-color index data */
4068          extract_float_rgba(n, rgba, srcFormat, srcType, source,
4069                             srcPacking->SwapBytes);
4070       }
4071
4072       if (transferOps) {
4073          _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
4074       }
4075
4076       /* Now determine which color channels we need to produce.
4077        * And determine the dest index (offset) within each color tuple.
4078        */
4079       switch (dstFormat) {
4080          case GL_ALPHA:
4081             dstAlphaIndex = 0;
4082             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
4083             dstLuminanceIndex = dstIntensityIndex = -1;
4084             break;
4085          case GL_LUMINANCE:
4086             dstLuminanceIndex = 0;
4087             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
4088             dstIntensityIndex = -1;
4089             break;
4090          case GL_LUMINANCE_ALPHA:
4091             dstLuminanceIndex = 0;
4092             dstAlphaIndex = 1;
4093             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
4094             dstIntensityIndex = -1;
4095             break;
4096          case GL_INTENSITY:
4097             dstIntensityIndex = 0;
4098             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
4099             dstLuminanceIndex = -1;
4100             break;
4101          case GL_RGB:
4102             dstRedIndex = 0;
4103             dstGreenIndex = 1;
4104             dstBlueIndex = 2;
4105             dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
4106             break;
4107          case GL_RGBA:
4108             dstRedIndex = 0;
4109             dstGreenIndex = 1;
4110             dstBlueIndex = 2;
4111             dstAlphaIndex = 3;
4112             dstLuminanceIndex = dstIntensityIndex = -1;
4113             break;
4114          default:
4115             _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_color_span_float()");
4116             return;
4117       }
4118
4119       /* Now pack results in the requested dstFormat */
4120       if (dstRedIndex >= 0) {
4121          GLfloat *dst = dest;
4122          GLuint i;
4123          for (i = 0; i < n; i++) {
4124             dst[dstRedIndex] = rgba[i][RCOMP];
4125             dst += dstComponents;
4126          }
4127       }
4128
4129       if (dstGreenIndex >= 0) {
4130          GLfloat *dst = dest;
4131          GLuint i;
4132          for (i = 0; i < n; i++) {
4133             dst[dstGreenIndex] = rgba[i][GCOMP];
4134             dst += dstComponents;
4135          }
4136       }
4137
4138       if (dstBlueIndex >= 0) {
4139          GLfloat *dst = dest;
4140          GLuint i;
4141          for (i = 0; i < n; i++) {
4142             dst[dstBlueIndex] = rgba[i][BCOMP];
4143             dst += dstComponents;
4144          }
4145       }
4146
4147       if (dstAlphaIndex >= 0) {
4148          GLfloat *dst = dest;
4149          GLuint i;
4150          for (i = 0; i < n; i++) {
4151             dst[dstAlphaIndex] = rgba[i][ACOMP];
4152             dst += dstComponents;
4153          }
4154       }
4155
4156       if (dstIntensityIndex >= 0) {
4157          GLfloat *dst = dest;
4158          GLuint i;
4159          assert(dstIntensityIndex == 0);
4160          assert(dstComponents == 1);
4161          for (i = 0; i < n; i++) {
4162             /* Intensity comes from red channel */
4163             dst[i] = rgba[i][RCOMP];
4164          }
4165       }
4166
4167       if (dstLuminanceIndex >= 0) {
4168          GLfloat *dst = dest;
4169          GLuint i;
4170          assert(dstLuminanceIndex == 0);
4171          for (i = 0; i < n; i++) {
4172             /* Luminance comes from red channel */
4173             dst[0] = rgba[i][RCOMP];
4174             dst += dstComponents;
4175          }
4176       }
4177    }
4178 }
4179
4180 /**
4181  * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4182  * directly return GLbyte data, no transfer ops apply.
4183  */
4184 void
4185 _mesa_unpack_dudv_span_byte( GLcontext *ctx,
4186                              GLuint n, GLenum dstFormat, GLbyte dest[],
4187                              GLenum srcFormat, GLenum srcType,
4188                              const GLvoid *source,
4189                              const struct gl_pixelstore_attrib *srcPacking,
4190                              GLbitfield transferOps )
4191 {
4192    ASSERT(dstFormat == GL_DUDV_ATI);
4193    ASSERT(srcFormat == GL_DUDV_ATI);
4194
4195    ASSERT(srcType == GL_UNSIGNED_BYTE ||
4196           srcType == GL_BYTE ||
4197           srcType == GL_UNSIGNED_SHORT ||
4198           srcType == GL_SHORT ||
4199           srcType == GL_UNSIGNED_INT ||
4200           srcType == GL_INT ||
4201           srcType == GL_HALF_FLOAT_ARB ||
4202           srcType == GL_FLOAT);
4203
4204    /* general solution */
4205    {
4206       GLint dstComponents;
4207       GLfloat rgba[MAX_WIDTH][4];
4208       GLbyte *dst = dest;
4209       GLuint i;
4210
4211       dstComponents = _mesa_components_in_format( dstFormat );
4212       /* source & dest image formats should have been error checked by now */
4213       assert(dstComponents > 0);
4214
4215       /*
4216        * Extract image data and convert to RGBA floats
4217        */
4218       assert(n <= MAX_WIDTH);
4219       extract_float_rgba(n, rgba, srcFormat, srcType, source,
4220                          srcPacking->SwapBytes);
4221
4222
4223       /* Now determine which color channels we need to produce.
4224        * And determine the dest index (offset) within each color tuple.
4225        */
4226
4227       /* Now pack results in the requested dstFormat */
4228       for (i = 0; i < n; i++) {
4229          /* not sure - need clamp[-1,1] here? */
4230          dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
4231          dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
4232          dst += dstComponents;
4233       }
4234    }
4235 }
4236
4237 /*
4238  * Unpack a row of color index data from a client buffer according to
4239  * the pixel unpacking parameters.
4240  * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4241  *
4242  * Args:  ctx - the context
4243  *        n - number of pixels
4244  *        dstType - destination data type
4245  *        dest - destination array
4246  *        srcType - source pixel type
4247  *        source - source data pointer
4248  *        srcPacking - pixel unpacking parameters
4249  *        transferOps - the pixel transfer operations to apply
4250  */
4251 void
4252 _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
4253                          GLenum dstType, GLvoid *dest,
4254                          GLenum srcType, const GLvoid *source,
4255                          const struct gl_pixelstore_attrib *srcPacking,
4256                          GLbitfield transferOps )
4257 {
4258    ASSERT(srcType == GL_BITMAP ||
4259           srcType == GL_UNSIGNED_BYTE ||
4260           srcType == GL_BYTE ||
4261           srcType == GL_UNSIGNED_SHORT ||
4262           srcType == GL_SHORT ||
4263           srcType == GL_UNSIGNED_INT ||
4264           srcType == GL_INT ||
4265           srcType == GL_HALF_FLOAT_ARB ||
4266           srcType == GL_FLOAT);
4267
4268    ASSERT(dstType == GL_UNSIGNED_BYTE ||
4269           dstType == GL_UNSIGNED_SHORT ||
4270           dstType == GL_UNSIGNED_INT);
4271
4272
4273    transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4274
4275    /*
4276     * Try simple cases first
4277     */
4278    if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
4279        && dstType == GL_UNSIGNED_BYTE) {
4280       _mesa_memcpy(dest, source, n * sizeof(GLubyte));
4281    }
4282    else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
4283             && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
4284       _mesa_memcpy(dest, source, n * sizeof(GLuint));
4285    }
4286    else {
4287       /*
4288        * general solution
4289        */
4290       GLuint indexes[MAX_WIDTH];
4291       assert(n <= MAX_WIDTH);
4292
4293       extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
4294                            srcPacking);
4295
4296       if (transferOps)
4297          _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4298
4299       /* convert to dest type */
4300       switch (dstType) {
4301          case GL_UNSIGNED_BYTE:
4302             {
4303                GLubyte *dst = (GLubyte *) dest;
4304                GLuint i;
4305                for (i = 0; i < n; i++) {
4306                   dst[i] = (GLubyte) (indexes[i] & 0xff);
4307                }
4308             }
4309             break;
4310          case GL_UNSIGNED_SHORT:
4311             {
4312                GLuint *dst = (GLuint *) dest;
4313                GLuint i;
4314                for (i = 0; i < n; i++) {
4315                   dst[i] = (GLushort) (indexes[i] & 0xffff);
4316                }
4317             }
4318             break;
4319          case GL_UNSIGNED_INT:
4320             _mesa_memcpy(dest, indexes, n * sizeof(GLuint));
4321             break;
4322          default:
4323             _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
4324       }
4325    }
4326 }
4327
4328
4329 void
4330 _mesa_pack_index_span( const GLcontext *ctx, GLuint n,
4331                        GLenum dstType, GLvoid *dest, const GLuint *source,
4332                        const struct gl_pixelstore_attrib *dstPacking,
4333                        GLbitfield transferOps )
4334 {
4335    GLuint indexes[MAX_WIDTH];
4336
4337    ASSERT(n <= MAX_WIDTH);
4338
4339    transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4340
4341    if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
4342       /* make a copy of input */
4343       _mesa_memcpy(indexes, source, n * sizeof(GLuint));
4344       _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4345       source = indexes;
4346    }
4347
4348    switch (dstType) {
4349    case GL_UNSIGNED_BYTE:
4350       {
4351          GLubyte *dst = (GLubyte *) dest;
4352          GLuint i;
4353          for (i = 0; i < n; i++) {
4354             *dst++ = (GLubyte) source[i];
4355          }
4356       }
4357       break;
4358    case GL_BYTE:
4359       {
4360          GLbyte *dst = (GLbyte *) dest;
4361          GLuint i;
4362          for (i = 0; i < n; i++) {
4363             dst[i] = (GLbyte) source[i];
4364          }
4365       }
4366       break;
4367    case GL_UNSIGNED_SHORT:
4368       {
4369          GLushort *dst = (GLushort *) dest;
4370          GLuint i;
4371          for (i = 0; i < n; i++) {
4372             dst[i] = (GLushort) source[i];
4373          }
4374          if (dstPacking->SwapBytes) {
4375             _mesa_swap2( (GLushort *) dst, n );
4376          }
4377       }
4378       break;
4379    case GL_SHORT:
4380       {
4381          GLshort *dst = (GLshort *) dest;
4382          GLuint i;
4383          for (i = 0; i < n; i++) {
4384             dst[i] = (GLshort) source[i];
4385          }
4386          if (dstPacking->SwapBytes) {
4387             _mesa_swap2( (GLushort *) dst, n );
4388          }
4389       }
4390       break;
4391    case GL_UNSIGNED_INT:
4392       {
4393          GLuint *dst = (GLuint *) dest;
4394          GLuint i;
4395          for (i = 0; i < n; i++) {
4396             dst[i] = (GLuint) source[i];
4397          }
4398          if (dstPacking->SwapBytes) {
4399             _mesa_swap4( (GLuint *) dst, n );
4400          }
4401       }
4402       break;
4403    case GL_INT:
4404       {
4405          GLint *dst = (GLint *) dest;
4406          GLuint i;
4407          for (i = 0; i < n; i++) {
4408             dst[i] = (GLint) source[i];
4409          }
4410          if (dstPacking->SwapBytes) {
4411             _mesa_swap4( (GLuint *) dst, n );
4412          }
4413       }
4414       break;
4415    case GL_FLOAT:
4416       {
4417          GLfloat *dst = (GLfloat *) dest;
4418          GLuint i;
4419          for (i = 0; i < n; i++) {
4420             dst[i] = (GLfloat) source[i];
4421          }
4422          if (dstPacking->SwapBytes) {
4423             _mesa_swap4( (GLuint *) dst, n );
4424          }
4425       }
4426       break;
4427    case GL_HALF_FLOAT_ARB:
4428       {
4429          GLhalfARB *dst = (GLhalfARB *) dest;
4430          GLuint i;
4431          for (i = 0; i < n; i++) {
4432             dst[i] = _mesa_float_to_half((GLfloat) source[i]);
4433          }
4434          if (dstPacking->SwapBytes) {
4435             _mesa_swap2( (GLushort *) dst, n );
4436          }
4437       }
4438       break;
4439    default:
4440       _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4441    }
4442 }
4443
4444
4445 /*
4446  * Unpack a row of stencil data from a client buffer according to
4447  * the pixel unpacking parameters.
4448  * This is (or will be) used by glDrawPixels
4449  *
4450  * Args:  ctx - the context
4451  *        n - number of pixels
4452  *        dstType - destination data type
4453  *        dest - destination array
4454  *        srcType - source pixel type
4455  *        source - source data pointer
4456  *        srcPacking - pixel unpacking parameters
4457  *        transferOps - apply offset/bias/lookup ops?
4458  */
4459 void
4460 _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
4461                            GLenum dstType, GLvoid *dest,
4462                            GLenum srcType, const GLvoid *source,
4463                            const struct gl_pixelstore_attrib *srcPacking,
4464                            GLbitfield transferOps )
4465 {
4466    ASSERT(srcType == GL_BITMAP ||
4467           srcType == GL_UNSIGNED_BYTE ||
4468           srcType == GL_BYTE ||
4469           srcType == GL_UNSIGNED_SHORT ||
4470           srcType == GL_SHORT ||
4471           srcType == GL_UNSIGNED_INT ||
4472           srcType == GL_INT ||
4473           srcType == GL_UNSIGNED_INT_24_8_EXT ||
4474           srcType == GL_HALF_FLOAT_ARB ||
4475           srcType == GL_FLOAT);
4476
4477    ASSERT(dstType == GL_UNSIGNED_BYTE ||
4478           dstType == GL_UNSIGNED_SHORT ||
4479           dstType == GL_UNSIGNED_INT);
4480
4481    /* only shift and offset apply to stencil */
4482    transferOps &= IMAGE_SHIFT_OFFSET_BIT;
4483
4484    /*
4485     * Try simple cases first
4486     */
4487    if (transferOps == 0 &&
4488        !ctx->Pixel.MapStencilFlag &&
4489        srcType == GL_UNSIGNED_BYTE &&
4490        dstType == GL_UNSIGNED_BYTE) {
4491       _mesa_memcpy(dest, source, n * sizeof(GLubyte));
4492    }
4493    else if (transferOps == 0 &&
4494             !ctx->Pixel.MapStencilFlag &&
4495             srcType == GL_UNSIGNED_INT &&
4496             dstType == GL_UNSIGNED_INT &&
4497             !srcPacking->SwapBytes) {
4498       _mesa_memcpy(dest, source, n * sizeof(GLuint));
4499    }
4500    else {
4501       /*
4502        * general solution
4503        */
4504       GLuint indexes[MAX_WIDTH];
4505       assert(n <= MAX_WIDTH);
4506
4507       extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
4508                            srcPacking);
4509
4510       if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4511          /* shift and offset indexes */
4512          shift_and_offset_ci(ctx, n, indexes);
4513       }
4514
4515       if (ctx->Pixel.MapStencilFlag) {
4516          /* Apply stencil lookup table */
4517          const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
4518          GLuint i;
4519          for (i = 0; i < n; i++) {
4520             indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
4521          }
4522       }
4523
4524       /* convert to dest type */
4525       switch (dstType) {
4526          case GL_UNSIGNED_BYTE:
4527             {
4528                GLubyte *dst = (GLubyte *) dest;
4529                GLuint i;
4530                for (i = 0; i < n; i++) {
4531                   dst[i] = (GLubyte) (indexes[i] & 0xff);
4532                }
4533             }
4534             break;
4535          case GL_UNSIGNED_SHORT:
4536             {
4537                GLuint *dst = (GLuint *) dest;
4538                GLuint i;
4539                for (i = 0; i < n; i++) {
4540                   dst[i] = (GLushort) (indexes[i] & 0xffff);
4541                }
4542             }
4543             break;
4544          case GL_UNSIGNED_INT:
4545             _mesa_memcpy(dest, indexes, n * sizeof(GLuint));
4546             break;
4547          default:
4548             _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
4549       }
4550    }
4551 }
4552
4553
4554 void
4555 _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
4556                          GLenum dstType, GLvoid *dest, const GLstencil *source,
4557                          const struct gl_pixelstore_attrib *dstPacking )
4558 {
4559    GLstencil stencil[MAX_WIDTH];
4560
4561    ASSERT(n <= MAX_WIDTH);
4562
4563    if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
4564        ctx->Pixel.MapStencilFlag) {
4565       /* make a copy of input */
4566       _mesa_memcpy(stencil, source, n * sizeof(GLstencil));
4567       _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
4568       source = stencil;
4569    }
4570
4571    switch (dstType) {
4572    case GL_UNSIGNED_BYTE:
4573       if (sizeof(GLstencil) == 1) {
4574          _mesa_memcpy( dest, source, n );
4575       }
4576       else {
4577          GLubyte *dst = (GLubyte *) dest;
4578          GLuint i;
4579          for (i=0;i<n;i++) {
4580             dst[i] = (GLubyte) source[i];
4581          }
4582       }
4583       break;
4584    case GL_BYTE:
4585       {
4586          GLbyte *dst = (GLbyte *) dest;
4587          GLuint i;
4588          for (i=0;i<n;i++) {
4589             dst[i] = (GLbyte) (source[i] & 0x7f);
4590          }
4591       }
4592       break;
4593    case GL_UNSIGNED_SHORT:
4594       {
4595          GLushort *dst = (GLushort *) dest;
4596          GLuint i;
4597          for (i=0;i<n;i++) {
4598             dst[i] = (GLushort) source[i];
4599          }
4600          if (dstPacking->SwapBytes) {
4601             _mesa_swap2( (GLushort *) dst, n );
4602          }
4603       }
4604       break;
4605    case GL_SHORT:
4606       {
4607          GLshort *dst = (GLshort *) dest;
4608          GLuint i;
4609          for (i=0;i<n;i++) {
4610             dst[i] = (GLshort) source[i];
4611          }
4612          if (dstPacking->SwapBytes) {
4613             _mesa_swap2( (GLushort *) dst, n );
4614          }
4615       }
4616       break;
4617    case GL_UNSIGNED_INT:
4618       {
4619          GLuint *dst = (GLuint *) dest;
4620          GLuint i;
4621          for (i=0;i<n;i++) {
4622             dst[i] = (GLuint) source[i];
4623          }
4624          if (dstPacking->SwapBytes) {
4625             _mesa_swap4( (GLuint *) dst, n );
4626          }
4627       }
4628       break;
4629    case GL_INT:
4630       {
4631          GLint *dst = (GLint *) dest;
4632          GLuint i;
4633          for (i=0;i<n;i++) {
4634             dst[i] = (GLint) source[i];
4635          }
4636          if (dstPacking->SwapBytes) {
4637             _mesa_swap4( (GLuint *) dst, n );
4638          }
4639       }
4640       break;
4641    case GL_FLOAT:
4642       {
4643          GLfloat *dst = (GLfloat *) dest;
4644          GLuint i;
4645          for (i=0;i<n;i++) {
4646             dst[i] = (GLfloat) source[i];
4647          }
4648          if (dstPacking->SwapBytes) {
4649             _mesa_swap4( (GLuint *) dst, n );
4650          }
4651       }
4652       break;
4653    case GL_HALF_FLOAT_ARB:
4654       {
4655          GLhalfARB *dst = (GLhalfARB *) dest;
4656          GLuint i;
4657          for (i=0;i<n;i++) {
4658             dst[i] = _mesa_float_to_half( (float) source[i] );
4659          }
4660          if (dstPacking->SwapBytes) {
4661             _mesa_swap2( (GLushort *) dst, n );
4662          }
4663       }
4664       break;
4665    case GL_BITMAP:
4666       if (dstPacking->LsbFirst) {
4667          GLubyte *dst = (GLubyte *) dest;
4668          GLint shift = 0;
4669          GLuint i;
4670          for (i = 0; i < n; i++) {
4671             if (shift == 0)
4672                *dst = 0;
4673             *dst |= ((source[i] != 0) << shift);
4674             shift++;
4675             if (shift == 8) {
4676                shift = 0;
4677                dst++;
4678             }
4679          }
4680       }
4681       else {
4682          GLubyte *dst = (GLubyte *) dest;
4683          GLint shift = 7;
4684          GLuint i;
4685          for (i = 0; i < n; i++) {
4686             if (shift == 7)
4687                *dst = 0;
4688             *dst |= ((source[i] != 0) << shift);
4689             shift--;
4690             if (shift < 0) {
4691                shift = 7;
4692                dst++;
4693             }
4694          }
4695       }
4696       break;
4697    default:
4698       _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4699    }
4700 }
4701
4702 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \
4703     do {                                                                \
4704         GLuint i;                                                       \
4705         const GLTYPE *src = (const GLTYPE *)source;                     \
4706         for (i = 0; i < n; i++) {                                       \
4707             GLTYPE value = src[i];                                      \
4708             if (srcPacking->SwapBytes) {                                \
4709                 if (sizeof(GLTYPE) == 2) {                              \
4710                     SWAP2BYTE(value);                                   \
4711                 } else if (sizeof(GLTYPE) == 4) {                       \
4712                     SWAP4BYTE(value);                                   \
4713                 }                                                       \
4714             }                                                           \
4715             depthValues[i] = GLTYPE2FLOAT(value);                       \
4716         }                                                               \
4717     } while (0)
4718
4719
4720 /**
4721  * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4722  * or GLfloat values.
4723  * The glPixelTransfer (scale/bias) params will be applied.
4724  *
4725  * \param dstType  one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4726  * \param depthMax  max value for returned GLushort or GLuint values
4727  *                  (ignored for GLfloat).
4728  */
4729 void
4730 _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
4731                          GLenum dstType, GLvoid *dest, GLuint depthMax,
4732                          GLenum srcType, const GLvoid *source,
4733                          const struct gl_pixelstore_attrib *srcPacking )
4734 {
4735    GLfloat depthTemp[MAX_WIDTH], *depthValues;
4736    GLboolean needClamp = GL_FALSE;
4737
4738    /* Look for special cases first.
4739     * Not only are these faster, they're less prone to numeric conversion
4740     * problems.  Otherwise, converting from an int type to a float then
4741     * back to an int type can introduce errors that will show up as
4742     * artifacts in things like depth peeling which uses glCopyTexImage.
4743     */
4744    if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
4745       if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
4746          const GLuint *src = (const GLuint *) source;
4747          GLushort *dst = (GLushort *) dest;
4748          GLuint i;
4749          for (i = 0; i < n; i++) {
4750             dst[i] = src[i] >> 16;
4751          }
4752          return;
4753       }
4754       if (srcType == GL_UNSIGNED_SHORT
4755           && dstType == GL_UNSIGNED_INT
4756           && depthMax == 0xffffffff) {
4757          const GLushort *src = (const GLushort *) source;
4758          GLuint *dst = (GLuint *) dest;
4759          GLuint i;
4760          for (i = 0; i < n; i++) {
4761             dst[i] = src[i] | (src[i] << 16);
4762          }
4763          return;
4764       }
4765       if (srcType == GL_UNSIGNED_INT_24_8
4766           && dstType == GL_UNSIGNED_INT
4767           && depthMax == 0xffffff) {
4768          const GLuint *src = (const GLuint *) source;
4769          GLuint *dst = (GLuint *) dest;
4770          GLuint i;
4771          for (i = 0; i < n; i++) {
4772             dst[i] = src[i] >> 8;
4773          }
4774          return;
4775       }
4776       /* XXX may want to add additional cases here someday */
4777    }
4778
4779    /* general case path follows */
4780
4781    if (dstType == GL_FLOAT) {
4782       depthValues = (GLfloat *) dest;
4783    }
4784    else {
4785       depthValues = depthTemp;
4786    }
4787
4788    /* Convert incoming values to GLfloat.  Some conversions will require
4789     * clamping, below.
4790     */
4791    switch (srcType) {
4792       case GL_BYTE:
4793          DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT);
4794          needClamp = GL_TRUE;
4795          break;
4796       case GL_UNSIGNED_BYTE:
4797          DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
4798          break;
4799       case GL_SHORT:
4800          DEPTH_VALUES(GLshort, SHORT_TO_FLOAT);
4801          needClamp = GL_TRUE;
4802          break;
4803       case GL_UNSIGNED_SHORT:
4804          DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
4805          break;
4806       case GL_INT:
4807          DEPTH_VALUES(GLint, INT_TO_FLOAT);
4808          needClamp = GL_TRUE;
4809          break;
4810       case GL_UNSIGNED_INT:
4811          DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
4812          break;
4813       case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
4814          if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
4815              depthMax == 0xffffff &&
4816              ctx->Pixel.DepthScale == 1.0 &&
4817              ctx->Pixel.DepthBias == 0.0) {
4818             const GLuint *src = (const GLuint *) source;
4819             GLuint *zValues = (GLuint *) dest;
4820             GLuint i;
4821             for (i = 0; i < n; i++) {
4822                 GLuint value = src[i];
4823                 if (srcPacking->SwapBytes) {
4824                     SWAP4BYTE(value);
4825                 }
4826                 zValues[i] = value & 0xffffff00;
4827             }
4828             return;
4829          }
4830          else {
4831             const GLuint *src = (const GLuint *) source;
4832             const GLfloat scale = 1.0f / 0xffffff;
4833             GLuint i;
4834             for (i = 0; i < n; i++) {
4835                 GLuint value = src[i];
4836                 if (srcPacking->SwapBytes) {
4837                     SWAP4BYTE(value);
4838                 }
4839                 depthValues[i] = (value >> 8) * scale;
4840             }
4841          }
4842          break;
4843       case GL_FLOAT:
4844          DEPTH_VALUES(GLfloat, 1*);
4845          needClamp = GL_TRUE;
4846          break;
4847       case GL_HALF_FLOAT_ARB:
4848          {
4849             GLuint i;
4850             const GLhalfARB *src = (const GLhalfARB *) source;
4851             for (i = 0; i < n; i++) {
4852                GLhalfARB value = src[i];
4853                if (srcPacking->SwapBytes) {
4854                   SWAP2BYTE(value);
4855                }
4856                depthValues[i] = _mesa_half_to_float(value);
4857             }
4858             needClamp = GL_TRUE;
4859          }
4860          break;
4861       default:
4862          _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
4863          return;
4864    }
4865
4866    /* apply depth scale and bias */
4867    {
4868       const GLfloat scale = ctx->Pixel.DepthScale;
4869       const GLfloat bias = ctx->Pixel.DepthBias;
4870       if (scale != 1.0 || bias != 0.0) {
4871          GLuint i;
4872          for (i = 0; i < n; i++) {
4873             depthValues[i] = depthValues[i] * scale + bias;
4874          }
4875          needClamp = GL_TRUE;
4876       }
4877    }
4878
4879    /* clamp to [0, 1] */
4880    if (needClamp) {
4881       GLuint i;
4882       for (i = 0; i < n; i++) {
4883          depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
4884       }
4885    }
4886
4887    /*
4888     * Convert values to dstType
4889     */
4890    if (dstType == GL_UNSIGNED_INT) {
4891       GLuint *zValues = (GLuint *) dest;
4892       GLuint i;
4893       if (depthMax <= 0xffffff) {
4894          /* no overflow worries */
4895          for (i = 0; i < n; i++) {
4896             zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
4897          }
4898       }
4899       else {
4900          /* need to use double precision to prevent overflow problems */
4901          for (i = 0; i < n; i++) {
4902             GLdouble z = depthValues[i] * (GLfloat) depthMax;
4903             if (z >= (GLdouble) 0xffffffff)
4904                zValues[i] = 0xffffffff;
4905             else
4906                zValues[i] = (GLuint) z;
4907          }
4908       }
4909    }
4910    else if (dstType == GL_UNSIGNED_SHORT) {
4911       GLushort *zValues = (GLushort *) dest;
4912       GLuint i;
4913       ASSERT(depthMax <= 0xffff);
4914       for (i = 0; i < n; i++) {
4915          zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
4916       }
4917    }
4918    else {
4919       ASSERT(dstType == GL_FLOAT);
4920       /*ASSERT(depthMax == 1.0F);*/
4921    }
4922 }
4923
4924
4925 /*
4926  * Pack an array of depth values.  The values are floats in [0,1].
4927  */
4928 void
4929 _mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
4930                        GLenum dstType, const GLfloat *depthSpan,
4931                        const struct gl_pixelstore_attrib *dstPacking )
4932 {
4933    GLfloat depthCopy[MAX_WIDTH];
4934
4935    ASSERT(n <= MAX_WIDTH);
4936
4937    if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
4938       _mesa_memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
4939       _mesa_scale_and_bias_depth(ctx, n, depthCopy);
4940       depthSpan = depthCopy;
4941    }
4942
4943    switch (dstType) {
4944    case GL_UNSIGNED_BYTE:
4945       {
4946          GLubyte *dst = (GLubyte *) dest;
4947          GLuint i;
4948          for (i = 0; i < n; i++) {
4949             dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
4950          }
4951       }
4952       break;
4953    case GL_BYTE:
4954       {
4955          GLbyte *dst = (GLbyte *) dest;
4956          GLuint i;
4957          for (i = 0; i < n; i++) {
4958             dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
4959          }
4960       }
4961       break;
4962    case GL_UNSIGNED_SHORT:
4963       {
4964          GLushort *dst = (GLushort *) dest;
4965          GLuint i;
4966          for (i = 0; i < n; i++) {
4967             CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
4968          }
4969          if (dstPacking->SwapBytes) {
4970             _mesa_swap2( (GLushort *) dst, n );
4971          }
4972       }
4973       break;
4974    case GL_SHORT:
4975       {
4976          GLshort *dst = (GLshort *) dest;
4977          GLuint i;
4978          for (i = 0; i < n; i++) {
4979             dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
4980          }
4981          if (dstPacking->SwapBytes) {
4982             _mesa_swap2( (GLushort *) dst, n );
4983          }
4984       }
4985       break;
4986    case GL_UNSIGNED_INT:
4987       {
4988          GLuint *dst = (GLuint *) dest;
4989          GLuint i;
4990          for (i = 0; i < n; i++) {
4991             dst[i] = FLOAT_TO_UINT( depthSpan[i] );
4992          }
4993          if (dstPacking->SwapBytes) {
4994             _mesa_swap4( (GLuint *) dst, n );
4995          }
4996       }
4997       break;
4998    case GL_INT:
4999       {
5000          GLint *dst = (GLint *) dest;
5001          GLuint i;
5002          for (i = 0; i < n; i++) {
5003             dst[i] = FLOAT_TO_INT( depthSpan[i] );
5004          }
5005          if (dstPacking->SwapBytes) {
5006             _mesa_swap4( (GLuint *) dst, n );
5007          }
5008       }
5009       break;
5010    case GL_FLOAT:
5011       {
5012          GLfloat *dst = (GLfloat *) dest;
5013          GLuint i;
5014          for (i = 0; i < n; i++) {
5015             dst[i] = depthSpan[i];
5016          }
5017          if (dstPacking->SwapBytes) {
5018             _mesa_swap4( (GLuint *) dst, n );
5019          }
5020       }
5021       break;
5022    case GL_HALF_FLOAT_ARB:
5023       {
5024          GLhalfARB *dst = (GLhalfARB *) dest;
5025          GLuint i;
5026          for (i = 0; i < n; i++) {
5027             dst[i] = _mesa_float_to_half(depthSpan[i]);
5028          }
5029          if (dstPacking->SwapBytes) {
5030             _mesa_swap2( (GLushort *) dst, n );
5031          }
5032       }
5033       break;
5034    default:
5035       _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
5036    }
5037 }
5038
5039
5040
5041 /**
5042  * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5043  */
5044 void
5045 _mesa_pack_depth_stencil_span(const GLcontext *ctx, GLuint n, GLuint *dest,
5046                               const GLfloat *depthVals,
5047                               const GLstencil *stencilVals,
5048                               const struct gl_pixelstore_attrib *dstPacking)
5049 {
5050    GLfloat depthCopy[MAX_WIDTH];
5051    GLstencil stencilCopy[MAX_WIDTH];
5052    GLuint i;
5053
5054    ASSERT(n <= MAX_WIDTH);
5055
5056    if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
5057       _mesa_memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
5058       _mesa_scale_and_bias_depth(ctx, n, depthCopy);
5059       depthVals = depthCopy;
5060    }
5061
5062    if (ctx->Pixel.IndexShift ||
5063        ctx->Pixel.IndexOffset ||
5064        ctx->Pixel.MapStencilFlag) {
5065       _mesa_memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
5066       _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
5067       stencilVals = stencilCopy;
5068    }
5069
5070    for (i = 0; i < n; i++) {
5071       GLuint z = (GLuint) (depthVals[i] * 0xffffff);
5072       dest[i] = (z << 8) | (stencilVals[i] & 0xff);
5073    }
5074
5075    if (dstPacking->SwapBytes) {
5076       _mesa_swap4(dest, n);
5077    }
5078 }
5079
5080
5081
5082
5083 /**
5084  * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
5085  * Return all image data in a contiguous block.  This is used when we
5086  * compile glDrawPixels, glTexImage, etc into a display list.  We
5087  * need a copy of the data in a standard format.
5088  */
5089 void *
5090 _mesa_unpack_image( GLuint dimensions,
5091                     GLsizei width, GLsizei height, GLsizei depth,
5092                     GLenum format, GLenum type, const GLvoid *pixels,
5093                     const struct gl_pixelstore_attrib *unpack )
5094 {
5095    GLint bytesPerRow, compsPerRow;
5096    GLboolean flipBytes, swap2, swap4;
5097
5098    if (!pixels)
5099       return NULL;  /* not necessarily an error */
5100
5101    if (width <= 0 || height <= 0 || depth <= 0)
5102       return NULL;  /* generate error later */
5103
5104    if (type == GL_BITMAP) {
5105       bytesPerRow = (width + 7) >> 3;
5106       flipBytes = unpack->LsbFirst;
5107       swap2 = swap4 = GL_FALSE;
5108       compsPerRow = 0;
5109    }
5110    else {
5111       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
5112       GLint components = _mesa_components_in_format(format);
5113       GLint bytesPerComp;
5114
5115       if (_mesa_type_is_packed(type))
5116           components = 1;
5117
5118       if (bytesPerPixel <= 0 || components <= 0)
5119          return NULL;   /* bad format or type.  generate error later */
5120       bytesPerRow = bytesPerPixel * width;
5121       bytesPerComp = bytesPerPixel / components;
5122       flipBytes = GL_FALSE;
5123       swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
5124       swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
5125       compsPerRow = components * width;
5126       assert(compsPerRow >= width);
5127    }
5128
5129    {
5130       GLubyte *destBuffer
5131          = (GLubyte *) _mesa_malloc(bytesPerRow * height * depth);
5132       GLubyte *dst;
5133       GLint img, row;
5134       if (!destBuffer)
5135          return NULL;   /* generate GL_OUT_OF_MEMORY later */
5136
5137       dst = destBuffer;
5138       for (img = 0; img < depth; img++) {
5139          for (row = 0; row < height; row++) {
5140             const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
5141                                width, height, format, type, img, row, 0);
5142
5143             if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
5144                GLint i;
5145                flipBytes = GL_FALSE;
5146                if (unpack->LsbFirst) {
5147                   GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
5148                   GLubyte dstMask = 128;
5149                   const GLubyte *s = src;
5150                   GLubyte *d = dst;
5151                   *d = 0;
5152                   for (i = 0; i < width; i++) {
5153                      if (*s & srcMask) {
5154                         *d |= dstMask;
5155                      }      
5156                      if (srcMask == 128) {
5157                         srcMask = 1;
5158                         s++;
5159                      }
5160                      else {
5161                         srcMask = srcMask << 1;
5162                      }
5163                      if (dstMask == 1) {
5164                         dstMask = 128;
5165                         d++;
5166                         *d = 0;
5167                      }
5168                      else {
5169                         dstMask = dstMask >> 1;
5170                      }
5171                   }
5172                }
5173                else {
5174                   GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
5175                   GLubyte dstMask = 128;
5176                   const GLubyte *s = src;
5177                   GLubyte *d = dst;
5178                   *d = 0;
5179                   for (i = 0; i < width; i++) {
5180                      if (*s & srcMask) {
5181                         *d |= dstMask;
5182                      }
5183                      if (srcMask == 1) {
5184                         srcMask = 128;
5185                         s++;
5186                      }
5187                      else {
5188                         srcMask = srcMask >> 1;
5189                      }
5190                      if (dstMask == 1) {
5191                         dstMask = 128;
5192                         d++;
5193                         *d = 0;
5194                      }
5195                      else {
5196                         dstMask = dstMask >> 1;
5197                      }      
5198                   }
5199                }
5200             }
5201             else {
5202                _mesa_memcpy(dst, src, bytesPerRow);
5203             }
5204
5205             /* byte flipping/swapping */
5206             if (flipBytes) {
5207                flip_bytes((GLubyte *) dst, bytesPerRow);
5208             }
5209             else if (swap2) {
5210                _mesa_swap2((GLushort*) dst, compsPerRow);
5211             }
5212             else if (swap4) {
5213                _mesa_swap4((GLuint*) dst, compsPerRow);
5214             }
5215             dst += bytesPerRow;
5216          }
5217       }
5218       return destBuffer;
5219    }
5220 }
5221
5222 #endif /* _HAVE_FULL_GL */
5223
5224
5225
5226 /**
5227  * Convert an array of RGBA colors from one datatype to another.
5228  * NOTE: src may equal dst.  In that case, we use a temporary buffer.
5229  */
5230 void
5231 _mesa_convert_colors(GLenum srcType, const GLvoid *src,
5232                      GLenum dstType, GLvoid *dst,
5233                      GLuint count, const GLubyte mask[])
5234 {
5235    GLuint tempBuffer[MAX_WIDTH][4];
5236    const GLboolean useTemp = (src == dst);
5237
5238    ASSERT(srcType != dstType);
5239
5240    switch (srcType) {
5241    case GL_UNSIGNED_BYTE:
5242       if (dstType == GL_UNSIGNED_SHORT) {
5243          const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
5244          GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
5245          GLuint i;
5246          for (i = 0; i < count; i++) {
5247             if (!mask || mask[i]) {
5248                dst2[i][RCOMP] = UBYTE_TO_USHORT(src1[i][RCOMP]);
5249                dst2[i][GCOMP] = UBYTE_TO_USHORT(src1[i][GCOMP]);
5250                dst2[i][BCOMP] = UBYTE_TO_USHORT(src1[i][BCOMP]);
5251                dst2[i][ACOMP] = UBYTE_TO_USHORT(src1[i][ACOMP]);
5252             }
5253          }
5254          if (useTemp)
5255             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
5256       }
5257       else {
5258          const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
5259          GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
5260          GLuint i;
5261          ASSERT(dstType == GL_FLOAT);
5262          for (i = 0; i < count; i++) {
5263             if (!mask || mask[i]) {
5264                dst4[i][RCOMP] = UBYTE_TO_FLOAT(src1[i][RCOMP]);
5265                dst4[i][GCOMP] = UBYTE_TO_FLOAT(src1[i][GCOMP]);
5266                dst4[i][BCOMP] = UBYTE_TO_FLOAT(src1[i][BCOMP]);
5267                dst4[i][ACOMP] = UBYTE_TO_FLOAT(src1[i][ACOMP]);
5268             }
5269          }
5270          if (useTemp)
5271             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
5272       }
5273       break;
5274    case GL_UNSIGNED_SHORT:
5275       if (dstType == GL_UNSIGNED_BYTE) {
5276          const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
5277          GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
5278          GLuint i;
5279          for (i = 0; i < count; i++) {
5280             if (!mask || mask[i]) {
5281                dst1[i][RCOMP] = USHORT_TO_UBYTE(src2[i][RCOMP]);
5282                dst1[i][GCOMP] = USHORT_TO_UBYTE(src2[i][GCOMP]);
5283                dst1[i][BCOMP] = USHORT_TO_UBYTE(src2[i][BCOMP]);
5284                dst1[i][ACOMP] = USHORT_TO_UBYTE(src2[i][ACOMP]);
5285             }
5286          }
5287          if (useTemp)
5288             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
5289       }
5290       else {
5291          const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
5292          GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
5293          GLuint i;
5294          ASSERT(dstType == GL_FLOAT);
5295          for (i = 0; i < count; i++) {
5296             if (!mask || mask[i]) {
5297                dst4[i][RCOMP] = USHORT_TO_FLOAT(src2[i][RCOMP]);
5298                dst4[i][GCOMP] = USHORT_TO_FLOAT(src2[i][GCOMP]);
5299                dst4[i][BCOMP] = USHORT_TO_FLOAT(src2[i][BCOMP]);
5300                dst4[i][ACOMP] = USHORT_TO_FLOAT(src2[i][ACOMP]);
5301             }
5302          }
5303          if (useTemp)
5304             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
5305       }
5306       break;
5307    case GL_FLOAT:
5308       if (dstType == GL_UNSIGNED_BYTE) {
5309          const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
5310          GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
5311          GLuint i;
5312          for (i = 0; i < count; i++) {
5313             if (!mask || mask[i]) {
5314                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][RCOMP], src4[i][RCOMP]);
5315                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][GCOMP], src4[i][GCOMP]);
5316                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][BCOMP], src4[i][BCOMP]);
5317                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][ACOMP], src4[i][ACOMP]);
5318             }
5319          }
5320          if (useTemp)
5321             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
5322       }
5323       else {
5324          const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
5325          GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
5326          GLuint i;
5327          ASSERT(dstType == GL_UNSIGNED_SHORT);
5328          for (i = 0; i < count; i++) {
5329             if (!mask || mask[i]) {
5330                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][RCOMP], src4[i][RCOMP]);
5331                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][GCOMP], src4[i][GCOMP]);
5332                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][BCOMP], src4[i][BCOMP]);
5333                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][ACOMP], src4[i][ACOMP]);
5334             }
5335          }
5336          if (useTemp)
5337             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
5338       }
5339       break;
5340    default:
5341       _mesa_problem(NULL, "Invalid datatype in _mesa_convert_colors");
5342    }
5343 }
5344
5345
5346
5347
5348 /**
5349  * Perform basic clipping for glDrawPixels.  The image's position and size
5350  * and the unpack SkipPixels and SkipRows are adjusted so that the image
5351  * region is entirely within the window and scissor bounds.
5352  * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
5353  * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
5354  * we'll actually write.  Beforehand, *destY-1 is the first drawing row.
5355  *
5356  * \return  GL_TRUE if image is ready for drawing or
5357  *          GL_FALSE if image was completely clipped away (draw nothing)
5358  */
5359 GLboolean
5360 _mesa_clip_drawpixels(const GLcontext *ctx,
5361                       GLint *destX, GLint *destY,
5362                       GLsizei *width, GLsizei *height,
5363                       struct gl_pixelstore_attrib *unpack)
5364 {
5365    const GLframebuffer *buffer = ctx->DrawBuffer;
5366
5367    if (unpack->RowLength == 0) {
5368       unpack->RowLength = *width;
5369    }
5370
5371    ASSERT(ctx->Pixel.ZoomX == 1.0F);
5372    ASSERT(ctx->Pixel.ZoomY == 1.0F || ctx->Pixel.ZoomY == -1.0F);
5373
5374    /* left clipping */
5375    if (*destX < buffer->_Xmin) {
5376       unpack->SkipPixels += (buffer->_Xmin - *destX);
5377       *width -= (buffer->_Xmin - *destX);
5378       *destX = buffer->_Xmin;
5379    }
5380    /* right clipping */
5381    if (*destX + *width > buffer->_Xmax)
5382       *width -= (*destX + *width - buffer->_Xmax);
5383
5384    if (*width <= 0)
5385       return GL_FALSE;
5386
5387    if (ctx->Pixel.ZoomY == 1.0F) {
5388       /* bottom clipping */
5389       if (*destY < buffer->_Ymin) {
5390          unpack->SkipRows += (buffer->_Ymin - *destY);
5391          *height -= (buffer->_Ymin - *destY);
5392          *destY = buffer->_Ymin;
5393       }
5394       /* top clipping */
5395       if (*destY + *height > buffer->_Ymax)
5396          *height -= (*destY + *height - buffer->_Ymax);
5397    }
5398    else { /* upside down */
5399       /* top clipping */
5400       if (*destY > buffer->_Ymax) {
5401          unpack->SkipRows += (*destY - buffer->_Ymax);
5402          *height -= (*destY - buffer->_Ymax);
5403          *destY = buffer->_Ymax;
5404       }
5405       /* bottom clipping */
5406       if (*destY - *height < buffer->_Ymin)
5407          *height -= (buffer->_Ymin - (*destY - *height));
5408       /* adjust destY so it's the first row to write to */
5409       (*destY)--;
5410    }
5411
5412    if (*height <= 0)
5413       return GL_TRUE;
5414
5415    return GL_TRUE;
5416 }
5417
5418
5419 /**
5420  * Perform clipping for glReadPixels.  The image's window position
5421  * and size, and the pack skipPixels, skipRows and rowLength are adjusted
5422  * so that the image region is entirely within the window bounds.
5423  * Note: this is different from _mesa_clip_drawpixels() in that the
5424  * scissor box is ignored, and we use the bounds of the current readbuffer
5425  * surface.
5426  *
5427  * \return  GL_TRUE if image is ready for drawing or
5428  *          GL_FALSE if image was completely clipped away (draw nothing)
5429  */
5430 GLboolean
5431 _mesa_clip_readpixels(const GLcontext *ctx,
5432                       GLint *srcX, GLint *srcY,
5433                       GLsizei *width, GLsizei *height,
5434                       struct gl_pixelstore_attrib *pack)
5435 {
5436    const GLframebuffer *buffer = ctx->ReadBuffer;
5437
5438    if (pack->RowLength == 0) {
5439       pack->RowLength = *width;
5440    }
5441
5442    /* left clipping */
5443    if (*srcX < 0) {
5444       pack->SkipPixels += (0 - *srcX);
5445       *width -= (0 - *srcX);
5446       *srcX = 0;
5447    }
5448    /* right clipping */
5449    if (*srcX + *width > (GLsizei) buffer->Width)
5450       *width -= (*srcX + *width - buffer->Width);
5451
5452    if (*width <= 0)
5453       return GL_FALSE;
5454
5455    /* bottom clipping */
5456    if (*srcY < 0) {
5457       pack->SkipRows += (0 - *srcY);
5458       *height -= (0 - *srcY);
5459       *srcY = 0;
5460    }
5461    /* top clipping */
5462    if (*srcY + *height > (GLsizei) buffer->Height)
5463       *height -= (*srcY + *height - buffer->Height);
5464
5465    if (*height <= 0)
5466       return GL_TRUE;
5467
5468    return GL_TRUE;
5469 }
5470
5471
5472 /**
5473  * Do clipping for a glCopyTexSubImage call.
5474  * The framebuffer source region might extend outside the framebuffer
5475  * bounds.  Clip the source region against the framebuffer bounds and
5476  * adjust the texture/dest position and size accordingly.
5477  *
5478  * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
5479  */
5480 GLboolean
5481 _mesa_clip_copytexsubimage(const GLcontext *ctx,
5482                            GLint *destX, GLint *destY,
5483                            GLint *srcX, GLint *srcY,
5484                            GLsizei *width, GLsizei *height)
5485 {
5486    const struct gl_framebuffer *fb = ctx->ReadBuffer;
5487    const GLint srcX0 = *srcX, srcY0 = *srcY;
5488
5489    if (_mesa_clip_to_region(0, 0, fb->Width, fb->Height,
5490                             srcX, srcY, width, height)) {
5491       *destX = *destX + *srcX - srcX0;
5492       *destY = *destY + *srcY - srcY0;
5493
5494       return GL_TRUE;
5495    }
5496    else {
5497       return GL_FALSE;
5498    }
5499 }
5500
5501
5502
5503 /**
5504  * Clip the rectangle defined by (x, y, width, height) against the bounds
5505  * specified by [xmin, xmax) and [ymin, ymax).
5506  * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
5507  */
5508 GLboolean
5509 _mesa_clip_to_region(GLint xmin, GLint ymin,
5510                      GLint xmax, GLint ymax,
5511                      GLint *x, GLint *y,
5512                      GLsizei *width, GLsizei *height )
5513 {
5514    /* left clipping */
5515    if (*x < xmin) {
5516       *width -= (xmin - *x);
5517       *x = xmin;
5518    }
5519
5520    /* right clipping */
5521    if (*x + *width > xmax)
5522       *width -= (*x + *width - xmax);
5523
5524    if (*width <= 0)
5525       return GL_FALSE;
5526
5527    /* bottom (or top) clipping */
5528    if (*y < ymin) {
5529       *height -= (ymin - *y);
5530       *y = ymin;
5531    }
5532
5533    /* top (or bottom) clipping */
5534    if (*y + *height > ymax)
5535       *height -= (*y + *height - ymax);
5536
5537    if (*height <= 0)
5538       return GL_FALSE;
5539
5540    return GL_TRUE;
5541 }
5542
5543
5544 /**
5545  * Clip dst coords against Xmax (or Ymax).
5546  */
5547 static INLINE void
5548 clip_right_or_top(GLint *srcX0, GLint *srcX1,
5549                   GLint *dstX0, GLint *dstX1,
5550                   GLint maxValue)
5551 {
5552    GLfloat t, bias;
5553
5554    if (*dstX1 > maxValue) {
5555       /* X1 outside right edge */
5556       ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */
5557       t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
5558       /* chop off [t, 1] part */
5559       ASSERT(t >= 0.0 && t <= 1.0);
5560       *dstX1 = maxValue;
5561       bias = (*srcX0 < *srcX1) ? 0.5 : -0.5;
5562       *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
5563    }
5564    else if (*dstX0 > maxValue) {
5565       /* X0 outside right edge */
5566       ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */
5567       t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
5568       /* chop off [t, 1] part */
5569       ASSERT(t >= 0.0 && t <= 1.0);
5570       *dstX0 = maxValue;
5571       bias = (*srcX0 < *srcX1) ? -0.5 : 0.5;
5572       *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
5573    }
5574 }
5575
5576
5577 /**
5578  * Clip dst coords against Xmin (or Ymin).
5579  */
5580 static INLINE void
5581 clip_left_or_bottom(GLint *srcX0, GLint *srcX1,
5582                     GLint *dstX0, GLint *dstX1,
5583                     GLint minValue)
5584 {
5585    GLfloat t, bias;
5586
5587    if (*dstX0 < minValue) {
5588       /* X0 outside left edge */
5589       ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */
5590       t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
5591       /* chop off [0, t] part */
5592       ASSERT(t >= 0.0 && t <= 1.0);
5593       *dstX0 = minValue;
5594       bias = (*srcX0 < *srcX1) ? 0.5 : -0.5; /* flipped??? */
5595       *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
5596    }
5597    else if (*dstX1 < minValue) {
5598       /* X1 outside left edge */
5599       ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */
5600       t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
5601       /* chop off [0, t] part */
5602       ASSERT(t >= 0.0 && t <= 1.0);
5603       *dstX1 = minValue;
5604       bias = (*srcX0 < *srcX1) ? 0.5 : -0.5;
5605       *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
5606    }
5607 }
5608
5609
5610 /**
5611  * Do clipping of blit src/dest rectangles.
5612  * The dest rect is clipped against both the buffer bounds and scissor bounds.
5613  * The src rect is just clipped against the buffer bounds.
5614  *
5615  * When either the src or dest rect is clipped, the other is also clipped
5616  * proportionately!
5617  *
5618  * Note that X0 need not be less than X1 (same for Y) for either the source
5619  * and dest rects.  That makes the clipping a little trickier.
5620  *
5621  * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
5622  */
5623 GLboolean
5624 _mesa_clip_blit(GLcontext *ctx,
5625                 GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
5626                 GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1)
5627 {
5628    const GLint srcXmin = 0;
5629    const GLint srcXmax = ctx->ReadBuffer->Width;
5630    const GLint srcYmin = 0;
5631    const GLint srcYmax = ctx->ReadBuffer->Height;
5632
5633    /* these include scissor bounds */
5634    const GLint dstXmin = ctx->DrawBuffer->_Xmin;
5635    const GLint dstXmax = ctx->DrawBuffer->_Xmax;
5636    const GLint dstYmin = ctx->DrawBuffer->_Ymin;
5637    const GLint dstYmax = ctx->DrawBuffer->_Ymax;
5638
5639    /*
5640    printf("PreClipX:  src: %d .. %d  dst: %d .. %d\n",
5641           *srcX0, *srcX1, *dstX0, *dstX1);
5642    printf("PreClipY:  src: %d .. %d  dst: %d .. %d\n",
5643           *srcY0, *srcY1, *dstY0, *dstY1);
5644    */
5645
5646    /* trivial rejection tests */
5647    if (*dstX0 == *dstX1)
5648       return GL_FALSE; /* no width */
5649    if (*dstX0 <= dstXmin && *dstX1 <= dstXmin)
5650       return GL_FALSE; /* totally out (left) of bounds */
5651    if (*dstX0 >= dstXmax && *dstX1 >= dstXmax)
5652       return GL_FALSE; /* totally out (right) of bounds */
5653
5654    if (*dstY0 == *dstY1)
5655       return GL_FALSE;
5656    if (*dstY0 <= dstYmin && *dstY1 <= dstYmin)
5657       return GL_FALSE;
5658    if (*dstY0 >= dstYmax && *dstY1 >= dstYmax)
5659       return GL_FALSE;
5660
5661    if (*srcX0 == *srcX1)
5662       return GL_FALSE;
5663    if (*srcX0 <= srcXmin && *srcX1 <= srcXmin)
5664       return GL_FALSE;
5665    if (*srcX0 >= srcXmax && *srcX1 >= srcXmax)
5666       return GL_FALSE;
5667
5668    if (*srcY0 == *srcY1)
5669       return GL_FALSE;
5670    if (*srcY0 <= srcYmin && *srcY1 <= srcYmin)
5671       return GL_FALSE;
5672    if (*srcY0 >= srcYmax && *srcY1 >= srcYmax)
5673       return GL_FALSE;
5674
5675    /*
5676     * dest clip
5677     */
5678    clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax);
5679    clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax);
5680    clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin);
5681    clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin);
5682
5683    /*
5684     * src clip (just swap src/dst values from above)
5685     */
5686    clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax);
5687    clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax);
5688    clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin);
5689    clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin);
5690
5691    /*
5692    printf("PostClipX: src: %d .. %d  dst: %d .. %d\n",
5693           *srcX0, *srcX1, *dstX0, *dstX1);
5694    printf("PostClipY: src: %d .. %d  dst: %d .. %d\n",
5695           *srcY0, *srcY1, *dstY0, *dstY1);
5696    */
5697
5698    ASSERT(*dstX0 >= dstXmin);
5699    ASSERT(*dstX0 <= dstXmax);
5700    ASSERT(*dstX1 >= dstXmin);
5701    ASSERT(*dstX1 <= dstXmax);
5702
5703    ASSERT(*dstY0 >= dstYmin);
5704    ASSERT(*dstY0 <= dstYmax);
5705    ASSERT(*dstY1 >= dstYmin);
5706    ASSERT(*dstY1 <= dstYmax);
5707
5708    ASSERT(*srcX0 >= srcXmin);
5709    ASSERT(*srcX0 <= srcXmax);
5710    ASSERT(*srcX1 >= srcXmin);
5711    ASSERT(*srcX1 <= srcXmax);
5712
5713    ASSERT(*srcY0 >= srcYmin);
5714    ASSERT(*srcY0 <= srcYmax);
5715    ASSERT(*srcY1 >= srcYmin);
5716    ASSERT(*srcY1 <= srcYmax);
5717
5718    return GL_TRUE;
5719 }