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