sync with tizen_2.2
[sdk/emulator/qemu.git] / gl / mesa / src / mesa / main / image.c
1 /*
2  * Mesa 3-D graphics library
3  * Version:  7.5
4  *
5  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25
26
27 /**
28  * \file image.c
29  * Image handling.
30  */
31
32
33 #include "glheader.h"
34 #include "colormac.h"
35 #include "image.h"
36 #include "imports.h"
37 #include "macros.h"
38 #include "mfeatures.h"
39 #include "mtypes.h"
40
41
42
43 /**
44  * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
45  */
46 GLboolean
47 _mesa_type_is_packed(GLenum type)
48 {
49    switch (type) {
50    case GL_UNSIGNED_BYTE_3_3_2:
51    case GL_UNSIGNED_BYTE_2_3_3_REV:
52    case MESA_UNSIGNED_BYTE_4_4:
53    case GL_UNSIGNED_SHORT_5_6_5:
54    case GL_UNSIGNED_SHORT_5_6_5_REV:
55    case GL_UNSIGNED_SHORT_4_4_4_4:
56    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
57    case GL_UNSIGNED_SHORT_5_5_5_1:
58    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
59    case GL_UNSIGNED_INT_8_8_8_8:
60    case GL_UNSIGNED_INT_8_8_8_8_REV:
61    case GL_UNSIGNED_INT_10_10_10_2:
62    case GL_UNSIGNED_INT_2_10_10_10_REV:
63    case GL_UNSIGNED_SHORT_8_8_MESA:
64    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
65    case GL_UNSIGNED_INT_24_8_EXT:
66    case GL_UNSIGNED_INT_5_9_9_9_REV:
67    case GL_UNSIGNED_INT_10F_11F_11F_REV:
68    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
69       return GL_TRUE;
70    }
71
72    return GL_FALSE;
73 }
74
75
76
77 /**
78  * Flip the order of the 2 bytes in each word in the given array.
79  *
80  * \param p array.
81  * \param n number of words.
82  */
83 void
84 _mesa_swap2( GLushort *p, GLuint n )
85 {
86    GLuint i;
87    for (i = 0; i < n; i++) {
88       p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
89    }
90 }
91
92
93
94 /*
95  * Flip the order of the 4 bytes in each word in the given array.
96  */
97 void
98 _mesa_swap4( GLuint *p, GLuint n )
99 {
100    GLuint i, a, b;
101    for (i = 0; i < n; i++) {
102       b = p[i];
103       a =  (b >> 24)
104         | ((b >> 8) & 0xff00)
105         | ((b << 8) & 0xff0000)
106         | ((b << 24) & 0xff000000);
107       p[i] = a;
108    }
109 }
110
111
112 /**
113  * Get the size of a GL data type.
114  *
115  * \param type GL data type.
116  *
117  * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
118  * if an invalid type enum.
119  */
120 GLint
121 _mesa_sizeof_type( GLenum type )
122 {
123    switch (type) {
124       case GL_BITMAP:
125          return 0;
126       case GL_UNSIGNED_BYTE:
127          return sizeof(GLubyte);
128       case GL_BYTE:
129          return sizeof(GLbyte);
130       case GL_UNSIGNED_SHORT:
131          return sizeof(GLushort);
132       case GL_SHORT:
133          return sizeof(GLshort);
134       case GL_UNSIGNED_INT:
135          return sizeof(GLuint);
136       case GL_INT:
137          return sizeof(GLint);
138       case GL_FLOAT:
139          return sizeof(GLfloat);
140       case GL_DOUBLE:
141          return sizeof(GLdouble);
142       case GL_HALF_FLOAT_ARB:
143          return sizeof(GLhalfARB);
144       case GL_FIXED:
145          return sizeof(GLfixed);
146       default:
147          return -1;
148    }
149 }
150
151
152 /**
153  * Same as _mesa_sizeof_type() but also accepting the packed pixel
154  * format data types.
155  */
156 GLint
157 _mesa_sizeof_packed_type( GLenum type )
158 {
159    switch (type) {
160       case GL_BITMAP:
161          return 0;
162       case GL_UNSIGNED_BYTE:
163          return sizeof(GLubyte);
164       case GL_BYTE:
165          return sizeof(GLbyte);
166       case GL_UNSIGNED_SHORT:
167          return sizeof(GLushort);
168       case GL_SHORT:
169          return sizeof(GLshort);
170       case GL_UNSIGNED_INT:
171          return sizeof(GLuint);
172       case GL_INT:
173          return sizeof(GLint);
174       case GL_HALF_FLOAT_ARB:
175          return sizeof(GLhalfARB);
176       case GL_FLOAT:
177          return sizeof(GLfloat);
178       case GL_UNSIGNED_BYTE_3_3_2:
179       case GL_UNSIGNED_BYTE_2_3_3_REV:
180       case MESA_UNSIGNED_BYTE_4_4:
181          return sizeof(GLubyte);
182       case GL_UNSIGNED_SHORT_5_6_5:
183       case GL_UNSIGNED_SHORT_5_6_5_REV:
184       case GL_UNSIGNED_SHORT_4_4_4_4:
185       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
186       case GL_UNSIGNED_SHORT_5_5_5_1:
187       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
188       case GL_UNSIGNED_SHORT_8_8_MESA:
189       case GL_UNSIGNED_SHORT_8_8_REV_MESA:
190          return sizeof(GLushort);
191       case GL_UNSIGNED_INT_8_8_8_8:
192       case GL_UNSIGNED_INT_8_8_8_8_REV:
193       case GL_UNSIGNED_INT_10_10_10_2:
194       case GL_UNSIGNED_INT_2_10_10_10_REV:
195       case GL_UNSIGNED_INT_24_8_EXT:
196       case GL_UNSIGNED_INT_5_9_9_9_REV:
197       case GL_UNSIGNED_INT_10F_11F_11F_REV:
198          return sizeof(GLuint);
199       case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
200          return 8;
201       default:
202          return -1;
203    }
204 }
205
206
207 /**
208  * Get the number of components in a pixel format.
209  *
210  * \param format pixel format.
211  *
212  * \return the number of components in the given format, or -1 if a bad format.
213  */
214 GLint
215 _mesa_components_in_format( GLenum format )
216 {
217    switch (format) {
218       case GL_COLOR_INDEX:
219       case GL_STENCIL_INDEX:
220       case GL_DEPTH_COMPONENT:
221       case GL_RED:
222       case GL_RED_INTEGER_EXT:
223       case GL_GREEN:
224       case GL_GREEN_INTEGER_EXT:
225       case GL_BLUE:
226       case GL_BLUE_INTEGER_EXT:
227       case GL_ALPHA:
228       case GL_ALPHA_INTEGER_EXT:
229       case GL_LUMINANCE:
230       case GL_LUMINANCE_INTEGER_EXT:
231       case GL_INTENSITY:
232          return 1;
233
234       case GL_LUMINANCE_ALPHA:
235       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
236       case GL_RG:
237       case GL_YCBCR_MESA:
238       case GL_DEPTH_STENCIL_EXT:
239       case GL_DUDV_ATI:
240       case GL_DU8DV8_ATI:
241       case GL_RG_INTEGER:
242          return 2;
243
244       case GL_RGB:
245       case GL_BGR:
246       case GL_RGB_INTEGER_EXT:
247       case GL_BGR_INTEGER_EXT:
248          return 3;
249
250       case GL_RGBA:
251       case GL_BGRA:
252       case GL_ABGR_EXT:
253       case GL_RGBA_INTEGER_EXT:
254       case GL_BGRA_INTEGER_EXT:
255          return 4;
256
257       default:
258          return -1;
259    }
260 }
261
262
263 /**
264  * Get the bytes per pixel of pixel format type pair.
265  *
266  * \param format pixel format.
267  * \param type pixel type.
268  *
269  * \return bytes per pixel, or -1 if a bad format or type was given.
270  */
271 GLint
272 _mesa_bytes_per_pixel( GLenum format, GLenum type )
273 {
274    GLint comps = _mesa_components_in_format( format );
275    if (comps < 0)
276       return -1;
277
278    switch (type) {
279       case GL_BITMAP:
280          return 0;  /* special case */
281       case GL_BYTE:
282       case GL_UNSIGNED_BYTE:
283          return comps * sizeof(GLubyte);
284       case GL_SHORT:
285       case GL_UNSIGNED_SHORT:
286          return comps * sizeof(GLshort);
287       case GL_INT:
288       case GL_UNSIGNED_INT:
289          return comps * sizeof(GLint);
290       case GL_FLOAT:
291          return comps * sizeof(GLfloat);
292       case GL_HALF_FLOAT_ARB:
293          return comps * sizeof(GLhalfARB);
294       case GL_UNSIGNED_BYTE_3_3_2:
295       case GL_UNSIGNED_BYTE_2_3_3_REV:
296          if (format == GL_RGB || format == GL_BGR ||
297              format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
298             return sizeof(GLubyte);
299          else
300             return -1;  /* error */
301       case GL_UNSIGNED_SHORT_5_6_5:
302       case GL_UNSIGNED_SHORT_5_6_5_REV:
303          if (format == GL_RGB || format == GL_BGR ||
304              format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
305             return sizeof(GLushort);
306          else
307             return -1;  /* error */
308       case GL_UNSIGNED_SHORT_4_4_4_4:
309       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
310       case GL_UNSIGNED_SHORT_5_5_5_1:
311       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
312          if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
313              format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
314             return sizeof(GLushort);
315          else
316             return -1;
317       case GL_UNSIGNED_INT_8_8_8_8:
318       case GL_UNSIGNED_INT_8_8_8_8_REV:
319       case GL_UNSIGNED_INT_10_10_10_2:
320       case GL_UNSIGNED_INT_2_10_10_10_REV:
321          if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
322              format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
323             return sizeof(GLuint);
324          else
325             return -1;
326       case GL_UNSIGNED_SHORT_8_8_MESA:
327       case GL_UNSIGNED_SHORT_8_8_REV_MESA:
328          if (format == GL_YCBCR_MESA)
329             return sizeof(GLushort);
330          else
331             return -1;
332       case GL_UNSIGNED_INT_24_8_EXT:
333          if (format == GL_DEPTH_STENCIL_EXT)
334             return sizeof(GLuint);
335          else
336             return -1;
337       case GL_UNSIGNED_INT_5_9_9_9_REV:
338          if (format == GL_RGB)
339             return sizeof(GLuint);
340          else
341             return -1;
342       case GL_UNSIGNED_INT_10F_11F_11F_REV:
343          if (format == GL_RGB)
344             return sizeof(GLuint);
345          else
346             return -1;
347       case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
348          if (format == GL_DEPTH_STENCIL)
349             return 8;
350          else
351             return -1;
352       default:
353          return -1;
354    }
355 }
356
357
358 /**
359  * Test for a legal pixel format and type.
360  *
361  * \param format pixel format.
362  * \param type pixel type.
363  *
364  * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
365  * otherwise.
366  */
367 GLboolean
368 _mesa_is_legal_format_and_type(const struct gl_context *ctx,
369                                GLenum format, GLenum type)
370 {
371    switch (format) {
372       case GL_COLOR_INDEX:
373       case GL_STENCIL_INDEX:
374          switch (type) {
375             case GL_BITMAP:
376             case GL_BYTE:
377             case GL_UNSIGNED_BYTE:
378             case GL_SHORT:
379             case GL_UNSIGNED_SHORT:
380             case GL_INT:
381             case GL_UNSIGNED_INT:
382             case GL_FLOAT:
383                return GL_TRUE;
384             case GL_HALF_FLOAT_ARB:
385                return ctx->Extensions.ARB_half_float_pixel;
386             default:
387                return GL_FALSE;
388          }
389       case GL_RED:
390       case GL_GREEN:
391       case GL_BLUE:
392       case GL_ALPHA:
393 #if 0 /* not legal!  see table 3.6 of the 1.5 spec */
394       case GL_INTENSITY:
395 #endif
396       case GL_LUMINANCE:
397       case GL_LUMINANCE_ALPHA:
398       case GL_DEPTH_COMPONENT:
399          switch (type) {
400             case GL_BYTE:
401             case GL_UNSIGNED_BYTE:
402             case GL_SHORT:
403             case GL_UNSIGNED_SHORT:
404             case GL_INT:
405             case GL_UNSIGNED_INT:
406             case GL_FLOAT:
407                return GL_TRUE;
408             case GL_HALF_FLOAT_ARB:
409                return ctx->Extensions.ARB_half_float_pixel;
410             default:
411                return GL_FALSE;
412          }
413       case GL_RG:
414          if (!ctx->Extensions.ARB_texture_rg)
415             return GL_FALSE;
416
417          switch (type) {
418             case GL_BYTE:
419             case GL_UNSIGNED_BYTE:
420             case GL_SHORT:
421             case GL_UNSIGNED_SHORT:
422             case GL_INT:
423             case GL_UNSIGNED_INT:
424             case GL_FLOAT:
425                return GL_TRUE;
426             case GL_HALF_FLOAT_ARB:
427                return ctx->Extensions.ARB_half_float_pixel;
428             default:
429                return GL_FALSE;
430          }
431       case GL_RGB:
432          switch (type) {
433             case GL_BYTE:
434             case GL_UNSIGNED_BYTE:
435             case GL_SHORT:
436             case GL_UNSIGNED_SHORT:
437             case GL_INT:
438             case GL_UNSIGNED_INT:
439             case GL_FLOAT:
440             case GL_UNSIGNED_BYTE_3_3_2:
441             case GL_UNSIGNED_BYTE_2_3_3_REV:
442             case GL_UNSIGNED_SHORT_5_6_5:
443             case GL_UNSIGNED_SHORT_5_6_5_REV:
444                return GL_TRUE;
445             case GL_HALF_FLOAT_ARB:
446                return ctx->Extensions.ARB_half_float_pixel;
447             case GL_UNSIGNED_INT_5_9_9_9_REV:
448                return ctx->Extensions.EXT_texture_shared_exponent;
449             case GL_UNSIGNED_INT_10F_11F_11F_REV:
450                return ctx->Extensions.EXT_packed_float;
451             default:
452                return GL_FALSE;
453          }
454       case GL_BGR:
455          switch (type) {
456             /* NOTE: no packed types are supported with BGR.  That's
457              * intentional, according to the GL spec.
458              */
459             case GL_BYTE:
460             case GL_UNSIGNED_BYTE:
461             case GL_SHORT:
462             case GL_UNSIGNED_SHORT:
463             case GL_INT:
464             case GL_UNSIGNED_INT:
465             case GL_FLOAT:
466                return GL_TRUE;
467             case GL_HALF_FLOAT_ARB:
468                return ctx->Extensions.ARB_half_float_pixel;
469             default:
470                return GL_FALSE;
471          }
472       case GL_RGBA:
473       case GL_BGRA:
474       case GL_ABGR_EXT:
475          switch (type) {
476             case GL_BYTE:
477             case GL_UNSIGNED_BYTE:
478             case GL_SHORT:
479             case GL_UNSIGNED_SHORT:
480             case GL_INT:
481             case GL_UNSIGNED_INT:
482             case GL_FLOAT:
483             case GL_UNSIGNED_SHORT_4_4_4_4:
484             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
485             case GL_UNSIGNED_SHORT_5_5_5_1:
486             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
487             case GL_UNSIGNED_INT_8_8_8_8:
488             case GL_UNSIGNED_INT_8_8_8_8_REV:
489             case GL_UNSIGNED_INT_10_10_10_2:
490             case GL_UNSIGNED_INT_2_10_10_10_REV:
491                return GL_TRUE;
492             case GL_HALF_FLOAT_ARB:
493                return ctx->Extensions.ARB_half_float_pixel;
494             default:
495                return GL_FALSE;
496          }
497       case GL_YCBCR_MESA:
498          if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
499              type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
500             return GL_TRUE;
501          else
502             return GL_FALSE;
503       case GL_DEPTH_STENCIL_EXT:
504          if ((ctx->Extensions.EXT_packed_depth_stencil &&
505               type == GL_UNSIGNED_INT_24_8_EXT) ||
506              (ctx->Extensions.ARB_depth_buffer_float &&
507               type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV))
508             return GL_TRUE;
509          else
510             return GL_FALSE;
511       case GL_DUDV_ATI:
512       case GL_DU8DV8_ATI:
513          switch (type) {
514             case GL_BYTE:
515             case GL_UNSIGNED_BYTE:
516             case GL_SHORT:
517             case GL_UNSIGNED_SHORT:
518             case GL_INT:
519             case GL_UNSIGNED_INT:
520             case GL_FLOAT:
521                return GL_TRUE;
522             default:
523                return GL_FALSE;
524          }
525
526       /* integer-valued formats */
527       case GL_RED_INTEGER_EXT:
528       case GL_GREEN_INTEGER_EXT:
529       case GL_BLUE_INTEGER_EXT:
530       case GL_ALPHA_INTEGER_EXT:
531       case GL_RG_INTEGER:
532          switch (type) {
533             case GL_BYTE:
534             case GL_UNSIGNED_BYTE:
535             case GL_SHORT:
536             case GL_UNSIGNED_SHORT:
537             case GL_INT:
538             case GL_UNSIGNED_INT:
539                return ctx->Extensions.EXT_texture_integer;
540             default:
541                return GL_FALSE;
542          }
543
544       case GL_RGB_INTEGER_EXT:
545          switch (type) {
546             case GL_BYTE:
547             case GL_UNSIGNED_BYTE:
548             case GL_SHORT:
549             case GL_UNSIGNED_SHORT:
550             case GL_INT:
551             case GL_UNSIGNED_INT:
552                return ctx->Extensions.EXT_texture_integer;
553             case GL_UNSIGNED_BYTE_3_3_2:
554             case GL_UNSIGNED_BYTE_2_3_3_REV:
555             case GL_UNSIGNED_SHORT_5_6_5:
556             case GL_UNSIGNED_SHORT_5_6_5_REV:
557                return ctx->Extensions.ARB_texture_rgb10_a2ui;
558             default:
559                return GL_FALSE;
560          }
561
562       case GL_BGR_INTEGER_EXT:
563          switch (type) {
564             case GL_BYTE:
565             case GL_UNSIGNED_BYTE:
566             case GL_SHORT:
567             case GL_UNSIGNED_SHORT:
568             case GL_INT:
569             case GL_UNSIGNED_INT:
570             /* NOTE: no packed formats w/ BGR format */
571                return ctx->Extensions.EXT_texture_integer;
572             default:
573                return GL_FALSE;
574          }
575
576       case GL_RGBA_INTEGER_EXT:
577       case GL_BGRA_INTEGER_EXT:
578          switch (type) {
579             case GL_BYTE:
580             case GL_UNSIGNED_BYTE:
581             case GL_SHORT:
582             case GL_UNSIGNED_SHORT:
583             case GL_INT:
584             case GL_UNSIGNED_INT:
585                return ctx->Extensions.EXT_texture_integer;
586             case GL_UNSIGNED_SHORT_4_4_4_4:
587             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
588             case GL_UNSIGNED_SHORT_5_5_5_1:
589             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
590             case GL_UNSIGNED_INT_8_8_8_8:
591             case GL_UNSIGNED_INT_8_8_8_8_REV:
592             case GL_UNSIGNED_INT_10_10_10_2:
593             case GL_UNSIGNED_INT_2_10_10_10_REV:
594                return ctx->Extensions.ARB_texture_rgb10_a2ui;
595             default:
596                return GL_FALSE;
597          }
598
599       case GL_LUMINANCE_INTEGER_EXT:
600       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
601          switch (type) {
602             case GL_BYTE:
603             case GL_UNSIGNED_BYTE:
604             case GL_SHORT:
605             case GL_UNSIGNED_SHORT:
606             case GL_INT:
607             case GL_UNSIGNED_INT:
608                return ctx->Extensions.EXT_texture_integer;
609             default:
610                return GL_FALSE;
611          }
612
613       default:
614          ; /* fall-through */
615    }
616    return GL_FALSE;
617 }
618
619
620 /**
621  * Test if the given image format is a color/RGBA format (i.e., not color
622  * index, depth, stencil, etc).
623  * \param format  the image format value (may by an internal texture format)
624  * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
625  */
626 GLboolean
627 _mesa_is_color_format(GLenum format)
628 {
629    switch (format) {
630       case GL_RED:
631       case GL_GREEN:
632       case GL_BLUE:
633       case GL_ALPHA:
634       case GL_ALPHA4:
635       case GL_ALPHA8:
636       case GL_ALPHA12:
637       case GL_ALPHA16:
638       case 1:
639       case GL_LUMINANCE:
640       case GL_LUMINANCE4:
641       case GL_LUMINANCE8:
642       case GL_LUMINANCE12:
643       case GL_LUMINANCE16:
644       case 2:
645       case GL_LUMINANCE_ALPHA:
646       case GL_LUMINANCE4_ALPHA4:
647       case GL_LUMINANCE6_ALPHA2:
648       case GL_LUMINANCE8_ALPHA8:
649       case GL_LUMINANCE12_ALPHA4:
650       case GL_LUMINANCE12_ALPHA12:
651       case GL_LUMINANCE16_ALPHA16:
652       case GL_INTENSITY:
653       case GL_INTENSITY4:
654       case GL_INTENSITY8:
655       case GL_INTENSITY12:
656       case GL_INTENSITY16:
657       case GL_R8:
658       case GL_R16:
659       case GL_RG:
660       case GL_RG8:
661       case GL_RG16:
662       case 3:
663       case GL_RGB:
664       case GL_BGR:
665       case GL_R3_G3_B2:
666       case GL_RGB4:
667       case GL_RGB5:
668       case GL_RGB8:
669       case GL_RGB10:
670       case GL_RGB12:
671       case GL_RGB16:
672       case 4:
673       case GL_ABGR_EXT:
674       case GL_RGBA:
675       case GL_BGRA:
676       case GL_RGBA2:
677       case GL_RGBA4:
678       case GL_RGB5_A1:
679       case GL_RGBA8:
680       case GL_RGB10_A2:
681       case GL_RGBA12:
682       case GL_RGBA16:
683       /* float texture formats */
684       case GL_ALPHA16F_ARB:
685       case GL_ALPHA32F_ARB:
686       case GL_LUMINANCE16F_ARB:
687       case GL_LUMINANCE32F_ARB:
688       case GL_LUMINANCE_ALPHA16F_ARB:
689       case GL_LUMINANCE_ALPHA32F_ARB:
690       case GL_INTENSITY16F_ARB:
691       case GL_INTENSITY32F_ARB:
692       case GL_R16F:
693       case GL_R32F:
694       case GL_RG16F:
695       case GL_RG32F:
696       case GL_RGB16F_ARB:
697       case GL_RGB32F_ARB:
698       case GL_RGBA16F_ARB:
699       case GL_RGBA32F_ARB:
700       /* compressed formats */
701       case GL_COMPRESSED_ALPHA:
702       case GL_COMPRESSED_LUMINANCE:
703       case GL_COMPRESSED_LUMINANCE_ALPHA:
704       case GL_COMPRESSED_INTENSITY:
705       case GL_COMPRESSED_RED:
706       case GL_COMPRESSED_RG:
707       case GL_COMPRESSED_RGB:
708       case GL_COMPRESSED_RGBA:
709       case GL_RGB_S3TC:
710       case GL_RGB4_S3TC:
711       case GL_RGBA_S3TC:
712       case GL_RGBA4_S3TC:
713       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
714       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
715       case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
716       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
717       case GL_COMPRESSED_RGB_FXT1_3DFX:
718       case GL_COMPRESSED_RGBA_FXT1_3DFX:
719 #if FEATURE_EXT_texture_sRGB
720       case GL_SRGB_EXT:
721       case GL_SRGB8_EXT:
722       case GL_SRGB_ALPHA_EXT:
723       case GL_SRGB8_ALPHA8_EXT:
724       case GL_SLUMINANCE_ALPHA_EXT:
725       case GL_SLUMINANCE8_ALPHA8_EXT:
726       case GL_SLUMINANCE_EXT:
727       case GL_SLUMINANCE8_EXT:
728       case GL_COMPRESSED_SRGB_EXT:
729       case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
730       case GL_COMPRESSED_SRGB_ALPHA_EXT:
731       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
732       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
733       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
734       case GL_COMPRESSED_SLUMINANCE_EXT:
735       case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
736 #endif /* FEATURE_EXT_texture_sRGB */
737       case GL_COMPRESSED_RED_RGTC1:
738       case GL_COMPRESSED_SIGNED_RED_RGTC1:
739       case GL_COMPRESSED_RG_RGTC2:
740       case GL_COMPRESSED_SIGNED_RG_RGTC2:
741       case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
742       case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
743       case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
744       case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
745       case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
746       case GL_ETC1_RGB8_OES:
747       /* generic integer formats */
748       case GL_RED_INTEGER_EXT:
749       case GL_GREEN_INTEGER_EXT:
750       case GL_BLUE_INTEGER_EXT:
751       case GL_ALPHA_INTEGER_EXT:
752       case GL_RGB_INTEGER_EXT:
753       case GL_RGBA_INTEGER_EXT:
754       case GL_BGR_INTEGER_EXT:
755       case GL_BGRA_INTEGER_EXT:
756       case GL_RG_INTEGER:
757       case GL_LUMINANCE_INTEGER_EXT:
758       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
759       /* sized integer formats */
760       case GL_RGBA32UI_EXT:
761       case GL_RGB32UI_EXT:
762       case GL_RG32UI:
763       case GL_R32UI:
764       case GL_ALPHA32UI_EXT:
765       case GL_INTENSITY32UI_EXT:
766       case GL_LUMINANCE32UI_EXT:
767       case GL_LUMINANCE_ALPHA32UI_EXT:
768       case GL_RGBA16UI_EXT:
769       case GL_RGB16UI_EXT:
770       case GL_RG16UI:
771       case GL_R16UI:
772       case GL_ALPHA16UI_EXT:
773       case GL_INTENSITY16UI_EXT:
774       case GL_LUMINANCE16UI_EXT:
775       case GL_LUMINANCE_ALPHA16UI_EXT:
776       case GL_RGBA8UI_EXT:
777       case GL_RGB8UI_EXT:
778       case GL_RG8UI:
779       case GL_R8UI:
780       case GL_ALPHA8UI_EXT:
781       case GL_INTENSITY8UI_EXT:
782       case GL_LUMINANCE8UI_EXT:
783       case GL_LUMINANCE_ALPHA8UI_EXT:
784       case GL_RGBA32I_EXT:
785       case GL_RGB32I_EXT:
786       case GL_RG32I:
787       case GL_R32I:
788       case GL_ALPHA32I_EXT:
789       case GL_INTENSITY32I_EXT:
790       case GL_LUMINANCE32I_EXT:
791       case GL_LUMINANCE_ALPHA32I_EXT:
792       case GL_RGBA16I_EXT:
793       case GL_RGB16I_EXT:
794       case GL_RG16I:
795       case GL_R16I:
796       case GL_ALPHA16I_EXT:
797       case GL_INTENSITY16I_EXT:
798       case GL_LUMINANCE16I_EXT:
799       case GL_LUMINANCE_ALPHA16I_EXT:
800       case GL_RGBA8I_EXT:
801       case GL_RGB8I_EXT:
802       case GL_RG8I:
803       case GL_R8I:
804       case GL_ALPHA8I_EXT:
805       case GL_INTENSITY8I_EXT:
806       case GL_LUMINANCE8I_EXT:
807       case GL_LUMINANCE_ALPHA8I_EXT:
808       /* signed, normalized texture formats */
809       case GL_RED_SNORM:
810       case GL_R8_SNORM:
811       case GL_R16_SNORM:
812       case GL_RG_SNORM:
813       case GL_RG8_SNORM:
814       case GL_RG16_SNORM:
815       case GL_RGB_SNORM:
816       case GL_RGB8_SNORM:
817       case GL_RGB16_SNORM:
818       case GL_RGBA_SNORM:
819       case GL_RGBA8_SNORM:
820       case GL_RGBA16_SNORM:
821       case GL_ALPHA_SNORM:
822       case GL_ALPHA8_SNORM:
823       case GL_ALPHA16_SNORM:
824       case GL_LUMINANCE_SNORM:
825       case GL_LUMINANCE8_SNORM:
826       case GL_LUMINANCE16_SNORM:
827       case GL_LUMINANCE_ALPHA_SNORM:
828       case GL_LUMINANCE8_ALPHA8_SNORM:
829       case GL_LUMINANCE16_ALPHA16_SNORM:
830       case GL_INTENSITY_SNORM:
831       case GL_INTENSITY8_SNORM:
832       case GL_INTENSITY16_SNORM:
833       case GL_RGB9_E5:
834       case GL_R11F_G11F_B10F:
835       case GL_RGB10_A2UI:
836          return GL_TRUE;
837       case GL_YCBCR_MESA:  /* not considered to be RGB */
838          /* fall-through */
839       default:
840          return GL_FALSE;
841    }
842 }
843
844
845 /**
846  * Test if the given image format is a depth component format.
847  */
848 GLboolean
849 _mesa_is_depth_format(GLenum format)
850 {
851    switch (format) {
852       case GL_DEPTH_COMPONENT:
853       case GL_DEPTH_COMPONENT16:
854       case GL_DEPTH_COMPONENT24:
855       case GL_DEPTH_COMPONENT32:
856       case GL_DEPTH_COMPONENT32F:
857          return GL_TRUE;
858       default:
859          return GL_FALSE;
860    }
861 }
862
863
864 /**
865  * Test if the given image format is a stencil format.
866  */
867 GLboolean
868 _mesa_is_stencil_format(GLenum format)
869 {
870    switch (format) {
871       case GL_STENCIL_INDEX:
872          return GL_TRUE;
873       default:
874          return GL_FALSE;
875    }
876 }
877
878
879 /**
880  * Test if the given image format is a YCbCr format.
881  */
882 GLboolean
883 _mesa_is_ycbcr_format(GLenum format)
884 {
885    switch (format) {
886       case GL_YCBCR_MESA:
887          return GL_TRUE;
888       default:
889          return GL_FALSE;
890    }
891 }
892
893
894 /**
895  * Test if the given image format is a depth+stencil format.
896  */
897 GLboolean
898 _mesa_is_depthstencil_format(GLenum format)
899 {
900    switch (format) {
901       case GL_DEPTH24_STENCIL8_EXT:
902       case GL_DEPTH_STENCIL_EXT:
903       case GL_DEPTH32F_STENCIL8:
904          return GL_TRUE;
905       default:
906          return GL_FALSE;
907    }
908 }
909
910
911 /**
912  * Test if the given image format is a depth or stencil format.
913  */
914 GLboolean
915 _mesa_is_depth_or_stencil_format(GLenum format)
916 {
917    switch (format) {
918       case GL_DEPTH_COMPONENT:
919       case GL_DEPTH_COMPONENT16:
920       case GL_DEPTH_COMPONENT24:
921       case GL_DEPTH_COMPONENT32:
922       case GL_STENCIL_INDEX:
923       case GL_STENCIL_INDEX1_EXT:
924       case GL_STENCIL_INDEX4_EXT:
925       case GL_STENCIL_INDEX8_EXT:
926       case GL_STENCIL_INDEX16_EXT:
927       case GL_DEPTH_STENCIL_EXT:
928       case GL_DEPTH24_STENCIL8_EXT:
929       case GL_DEPTH_COMPONENT32F:
930       case GL_DEPTH32F_STENCIL8:
931          return GL_TRUE;
932       default:
933          return GL_FALSE;
934    }
935 }
936
937
938 /**
939  * Test if the given image format is a dudv format.
940  */
941 GLboolean
942 _mesa_is_dudv_format(GLenum format)
943 {
944    switch (format) {
945       case GL_DUDV_ATI:
946       case GL_DU8DV8_ATI:
947          return GL_TRUE;
948       default:
949          return GL_FALSE;
950    }
951 }
952
953
954 /**
955  * Test if the given format is an integer (non-normalized) format.
956  */
957 GLboolean
958 _mesa_is_integer_format(GLenum format)
959 {
960    switch (format) {
961    /* generic integer formats */
962    case GL_RED_INTEGER_EXT:
963    case GL_GREEN_INTEGER_EXT:
964    case GL_BLUE_INTEGER_EXT:
965    case GL_ALPHA_INTEGER_EXT:
966    case GL_RGB_INTEGER_EXT:
967    case GL_RGBA_INTEGER_EXT:
968    case GL_BGR_INTEGER_EXT:
969    case GL_BGRA_INTEGER_EXT:
970    case GL_LUMINANCE_INTEGER_EXT:
971    case GL_LUMINANCE_ALPHA_INTEGER_EXT:
972    case GL_RG_INTEGER:
973    /* specific integer formats */
974    case GL_RGBA32UI_EXT:
975    case GL_RGB32UI_EXT:
976    case GL_RG32UI:
977    case GL_R32UI:
978    case GL_ALPHA32UI_EXT:
979    case GL_INTENSITY32UI_EXT:
980    case GL_LUMINANCE32UI_EXT:
981    case GL_LUMINANCE_ALPHA32UI_EXT:
982    case GL_RGBA16UI_EXT:
983    case GL_RGB16UI_EXT:
984    case GL_RG16UI:
985    case GL_R16UI:
986    case GL_ALPHA16UI_EXT:
987    case GL_INTENSITY16UI_EXT:
988    case GL_LUMINANCE16UI_EXT:
989    case GL_LUMINANCE_ALPHA16UI_EXT:
990    case GL_RGBA8UI_EXT:
991    case GL_RGB8UI_EXT:
992    case GL_RG8UI:
993    case GL_R8UI:
994    case GL_ALPHA8UI_EXT:
995    case GL_INTENSITY8UI_EXT:
996    case GL_LUMINANCE8UI_EXT:
997    case GL_LUMINANCE_ALPHA8UI_EXT:
998    case GL_RGBA32I_EXT:
999    case GL_RGB32I_EXT:
1000    case GL_RG32I:
1001    case GL_R32I:
1002    case GL_ALPHA32I_EXT:
1003    case GL_INTENSITY32I_EXT:
1004    case GL_LUMINANCE32I_EXT:
1005    case GL_LUMINANCE_ALPHA32I_EXT:
1006    case GL_RGBA16I_EXT:
1007    case GL_RGB16I_EXT:
1008    case GL_RG16I:
1009    case GL_R16I:
1010    case GL_ALPHA16I_EXT:
1011    case GL_INTENSITY16I_EXT:
1012    case GL_LUMINANCE16I_EXT:
1013    case GL_LUMINANCE_ALPHA16I_EXT:
1014    case GL_RGBA8I_EXT:
1015    case GL_RGB8I_EXT:
1016    case GL_RG8I:
1017    case GL_R8I:
1018    case GL_ALPHA8I_EXT:
1019    case GL_INTENSITY8I_EXT:
1020    case GL_LUMINANCE8I_EXT:
1021    case GL_LUMINANCE_ALPHA8I_EXT:
1022    case GL_RGB10_A2UI:
1023       return GL_TRUE;
1024    default:
1025       return GL_FALSE;
1026    }
1027 }
1028
1029
1030 /**
1031  * Test if an image format is a supported compressed format.
1032  * \param format the internal format token provided by the user.
1033  * \return GL_TRUE if compressed, GL_FALSE if uncompressed
1034  */
1035 GLboolean
1036 _mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
1037 {
1038    switch (format) {
1039    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1040    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1041    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
1042    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
1043       return ctx->Extensions.EXT_texture_compression_s3tc;
1044    case GL_RGB_S3TC:
1045    case GL_RGB4_S3TC:
1046    case GL_RGBA_S3TC:
1047    case GL_RGBA4_S3TC:
1048       return ctx->Extensions.S3_s3tc;
1049    case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
1050    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
1051    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
1052    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
1053       return ctx->Extensions.EXT_texture_sRGB
1054          && ctx->Extensions.EXT_texture_compression_s3tc;
1055    case GL_COMPRESSED_RGB_FXT1_3DFX:
1056    case GL_COMPRESSED_RGBA_FXT1_3DFX:
1057       return ctx->Extensions.TDFX_texture_compression_FXT1;
1058    case GL_COMPRESSED_RED_RGTC1:
1059    case GL_COMPRESSED_SIGNED_RED_RGTC1:
1060    case GL_COMPRESSED_RG_RGTC2:
1061    case GL_COMPRESSED_SIGNED_RG_RGTC2:
1062       return ctx->Extensions.ARB_texture_compression_rgtc;
1063    case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
1064    case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
1065    case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
1066    case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
1067       return ctx->Extensions.EXT_texture_compression_latc;
1068    case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
1069       return ctx->Extensions.ATI_texture_compression_3dc;
1070    case GL_ETC1_RGB8_OES:
1071       return ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
1072 #if FEATURE_ES
1073    case GL_PALETTE4_RGB8_OES:
1074    case GL_PALETTE4_RGBA8_OES:
1075    case GL_PALETTE4_R5_G6_B5_OES:
1076    case GL_PALETTE4_RGBA4_OES:
1077    case GL_PALETTE4_RGB5_A1_OES:
1078    case GL_PALETTE8_RGB8_OES:
1079    case GL_PALETTE8_RGBA8_OES:
1080    case GL_PALETTE8_R5_G6_B5_OES:
1081    case GL_PALETTE8_RGBA4_OES:
1082    case GL_PALETTE8_RGB5_A1_OES:
1083       return ctx->API == API_OPENGLES;
1084 #endif
1085    default:
1086       return GL_FALSE;
1087    }
1088 }
1089
1090
1091 /**
1092  * Does the given base texture/renderbuffer format have the channel
1093  * named by 'pname'?
1094  */
1095 GLboolean
1096 _mesa_base_format_has_channel(GLenum base_format, GLenum pname)
1097 {
1098    switch (pname) {
1099    case GL_TEXTURE_RED_SIZE:
1100    case GL_TEXTURE_RED_TYPE:
1101    case GL_RENDERBUFFER_RED_SIZE_EXT:
1102    case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
1103       if (base_format == GL_RED ||
1104           base_format == GL_RG ||
1105           base_format == GL_RGB ||
1106           base_format == GL_RGBA) {
1107          return GL_TRUE;
1108       }
1109       return GL_FALSE;
1110    case GL_TEXTURE_GREEN_SIZE:
1111    case GL_TEXTURE_GREEN_TYPE:
1112    case GL_RENDERBUFFER_GREEN_SIZE_EXT:
1113    case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
1114       if (base_format == GL_RG ||
1115           base_format == GL_RGB ||
1116           base_format == GL_RGBA) {
1117          return GL_TRUE;
1118       }
1119       return GL_FALSE;
1120    case GL_TEXTURE_BLUE_SIZE:
1121    case GL_TEXTURE_BLUE_TYPE:
1122    case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1123    case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1124       if (base_format == GL_RGB ||
1125           base_format == GL_RGBA) {
1126          return GL_TRUE;
1127       }
1128       return GL_FALSE;
1129    case GL_TEXTURE_ALPHA_SIZE:
1130    case GL_TEXTURE_ALPHA_TYPE:
1131    case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1132    case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1133       if (base_format == GL_RGBA ||
1134           base_format == GL_ALPHA ||
1135           base_format == GL_LUMINANCE_ALPHA) {
1136          return GL_TRUE;
1137       }
1138       return GL_FALSE;
1139    case GL_TEXTURE_LUMINANCE_SIZE:
1140    case GL_TEXTURE_LUMINANCE_TYPE:
1141       if (base_format == GL_LUMINANCE ||
1142           base_format == GL_LUMINANCE_ALPHA) {
1143          return GL_TRUE;
1144       }
1145       return GL_FALSE;
1146    case GL_TEXTURE_INTENSITY_SIZE:
1147    case GL_TEXTURE_INTENSITY_TYPE:
1148       if (base_format == GL_INTENSITY) {
1149          return GL_TRUE;
1150       }
1151       return GL_FALSE;
1152    case GL_TEXTURE_DEPTH_SIZE:
1153    case GL_TEXTURE_DEPTH_TYPE:
1154    case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1155    case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1156       if (base_format == GL_DEPTH_STENCIL ||
1157           base_format == GL_DEPTH_COMPONENT) {
1158          return GL_TRUE;
1159       }
1160       return GL_FALSE;
1161    case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1162    case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1163       if (base_format == GL_DEPTH_STENCIL ||
1164           base_format == GL_STENCIL_INDEX) {
1165          return GL_TRUE;
1166       }
1167       return GL_FALSE;
1168    default:
1169       _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
1170                     __FUNCTION__, pname);
1171       return GL_FALSE;
1172    }
1173
1174    return GL_FALSE;
1175 }
1176
1177
1178 /**
1179  * Return the byte offset of a specific pixel in an image (1D, 2D or 3D).
1180  *
1181  * Pixel unpacking/packing parameters are observed according to \p packing.
1182  *
1183  * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
1184  * \param packing  the pixelstore attributes
1185  * \param width  the image width
1186  * \param height  the image height
1187  * \param format  the pixel format (must be validated beforehand)
1188  * \param type  the pixel data type (must be validated beforehand)
1189  * \param img  which image in the volume (0 for 1D or 2D images)
1190  * \param row  row of pixel in the image (0 for 1D images)
1191  * \param column column of pixel in the image
1192  *
1193  * \return offset of pixel.
1194  *
1195  * \sa gl_pixelstore_attrib.
1196  */
1197 GLintptr
1198 _mesa_image_offset( GLuint dimensions,
1199                     const struct gl_pixelstore_attrib *packing,
1200                     GLsizei width, GLsizei height,
1201                     GLenum format, GLenum type,
1202                     GLint img, GLint row, GLint column )
1203 {
1204    GLint alignment;        /* 1, 2 or 4 */
1205    GLint pixels_per_row;
1206    GLint rows_per_image;
1207    GLint skiprows;
1208    GLint skippixels;
1209    GLint skipimages;       /* for 3-D volume images */
1210    GLintptr offset;
1211
1212    ASSERT(dimensions >= 1 && dimensions <= 3);
1213
1214    alignment = packing->Alignment;
1215    if (packing->RowLength > 0) {
1216       pixels_per_row = packing->RowLength;
1217    }
1218    else {
1219       pixels_per_row = width;
1220    }
1221    if (packing->ImageHeight > 0) {
1222       rows_per_image = packing->ImageHeight;
1223    }
1224    else {
1225       rows_per_image = height;
1226    }
1227
1228    skippixels = packing->SkipPixels;
1229    /* Note: SKIP_ROWS _is_ used for 1D images */
1230    skiprows = packing->SkipRows;
1231    /* Note: SKIP_IMAGES is only used for 3D images */
1232    skipimages = (dimensions == 3) ? packing->SkipImages : 0;
1233
1234    if (type == GL_BITMAP) {
1235       /* BITMAP data */
1236       GLint bytes_per_row;
1237       GLint bytes_per_image;
1238       /* components per pixel for color or stencil index: */
1239       const GLint comp_per_pixel = 1;
1240
1241       /* The pixel type and format should have been error checked earlier */
1242       assert(format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX);
1243
1244       bytes_per_row = alignment
1245                     * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
1246
1247       bytes_per_image = bytes_per_row * rows_per_image;
1248
1249       offset = (skipimages + img) * bytes_per_image
1250                  + (skiprows + row) * bytes_per_row
1251                  + (skippixels + column) / 8;
1252    }
1253    else {
1254       /* Non-BITMAP data */
1255       GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
1256       GLint topOfImage;
1257
1258       bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
1259
1260       /* The pixel type and format should have been error checked earlier */
1261       assert(bytes_per_pixel > 0);
1262
1263       bytes_per_row = pixels_per_row * bytes_per_pixel;
1264       remainder = bytes_per_row % alignment;
1265       if (remainder > 0)
1266          bytes_per_row += (alignment - remainder);
1267
1268       ASSERT(bytes_per_row % alignment == 0);
1269
1270       bytes_per_image = bytes_per_row * rows_per_image;
1271
1272       if (packing->Invert) {
1273          /* set pixel_addr to the last row */
1274          topOfImage = bytes_per_row * (height - 1);
1275          bytes_per_row = -bytes_per_row;
1276       }
1277       else {
1278          topOfImage = 0;
1279       }
1280
1281       /* compute final pixel address */
1282       offset = (skipimages + img) * bytes_per_image
1283                  + topOfImage
1284                  + (skiprows + row) * bytes_per_row
1285                  + (skippixels + column) * bytes_per_pixel;
1286    }
1287
1288    return offset;
1289 }
1290
1291
1292 /**
1293  * Return the address of a specific pixel in an image (1D, 2D or 3D).
1294  *
1295  * Pixel unpacking/packing parameters are observed according to \p packing.
1296  *
1297  * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
1298  * \param packing  the pixelstore attributes
1299  * \param image  starting address of image data
1300  * \param width  the image width
1301  * \param height  the image height
1302  * \param format  the pixel format (must be validated beforehand)
1303  * \param type  the pixel data type (must be validated beforehand)
1304  * \param img  which image in the volume (0 for 1D or 2D images)
1305  * \param row  row of pixel in the image (0 for 1D images)
1306  * \param column column of pixel in the image
1307  *
1308  * \return address of pixel.
1309  *
1310  * \sa gl_pixelstore_attrib.
1311  */
1312 GLvoid *
1313 _mesa_image_address( GLuint dimensions,
1314                      const struct gl_pixelstore_attrib *packing,
1315                      const GLvoid *image,
1316                      GLsizei width, GLsizei height,
1317                      GLenum format, GLenum type,
1318                      GLint img, GLint row, GLint column )
1319 {
1320    const GLubyte *addr = (const GLubyte *) image;
1321
1322    addr += _mesa_image_offset(dimensions, packing, width, height,
1323                               format, type, img, row, column);
1324
1325    return (GLvoid *) addr;
1326 }
1327
1328
1329 GLvoid *
1330 _mesa_image_address1d( const struct gl_pixelstore_attrib *packing,
1331                        const GLvoid *image,
1332                        GLsizei width,
1333                        GLenum format, GLenum type,
1334                        GLint column )
1335 {
1336    return _mesa_image_address(1, packing, image, width, 1,
1337                               format, type, 0, 0, column);
1338 }
1339
1340
1341 GLvoid *
1342 _mesa_image_address2d( const struct gl_pixelstore_attrib *packing,
1343                        const GLvoid *image,
1344                        GLsizei width, GLsizei height,
1345                        GLenum format, GLenum type,
1346                        GLint row, GLint column )
1347 {
1348    return _mesa_image_address(2, packing, image, width, height,
1349                               format, type, 0, row, column);
1350 }
1351
1352
1353 GLvoid *
1354 _mesa_image_address3d( const struct gl_pixelstore_attrib *packing,
1355                        const GLvoid *image,
1356                        GLsizei width, GLsizei height,
1357                        GLenum format, GLenum type,
1358                        GLint img, GLint row, GLint column )
1359 {
1360    return _mesa_image_address(3, packing, image, width, height,
1361                               format, type, img, row, column);
1362 }
1363
1364
1365
1366 /**
1367  * Compute the stride (in bytes) between image rows.
1368  *
1369  * \param packing the pixelstore attributes
1370  * \param width image width.
1371  * \param format pixel format.
1372  * \param type pixel data type.
1373  * 
1374  * \return the stride in bytes for the given parameters, or -1 if error
1375  */
1376 GLint
1377 _mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
1378                         GLint width, GLenum format, GLenum type )
1379 {
1380    GLint bytesPerRow, remainder;
1381
1382    ASSERT(packing);
1383
1384    if (type == GL_BITMAP) {
1385       if (packing->RowLength == 0) {
1386          bytesPerRow = (width + 7) / 8;
1387       }
1388       else {
1389          bytesPerRow = (packing->RowLength + 7) / 8;
1390       }
1391    }
1392    else {
1393       /* Non-BITMAP data */
1394       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
1395       if (bytesPerPixel <= 0)
1396          return -1;  /* error */
1397       if (packing->RowLength == 0) {
1398          bytesPerRow = bytesPerPixel * width;
1399       }
1400       else {
1401          bytesPerRow = bytesPerPixel * packing->RowLength;
1402       }
1403    }
1404
1405    remainder = bytesPerRow % packing->Alignment;
1406    if (remainder > 0) {
1407       bytesPerRow += (packing->Alignment - remainder);
1408    }
1409
1410    if (packing->Invert) {
1411       /* negate the bytes per row (negative row stride) */
1412       bytesPerRow = -bytesPerRow;
1413    }
1414
1415    return bytesPerRow;
1416 }
1417
1418
1419 /*
1420  * Compute the stride between images in a 3D texture (in bytes) for the given
1421  * pixel packing parameters and image width, format and type.
1422  */
1423 GLint
1424 _mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
1425                           GLint width, GLint height,
1426                           GLenum format, GLenum type )
1427 {
1428    GLint bytesPerRow, bytesPerImage, remainder;
1429
1430    ASSERT(packing);
1431
1432    if (type == GL_BITMAP) {
1433       if (packing->RowLength == 0) {
1434          bytesPerRow = (width + 7) / 8;
1435       }
1436       else {
1437          bytesPerRow = (packing->RowLength + 7) / 8;
1438       }
1439    }
1440    else {
1441       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
1442
1443       if (bytesPerPixel <= 0)
1444          return -1;  /* error */
1445       if (packing->RowLength == 0) {
1446          bytesPerRow = bytesPerPixel * width;
1447       }
1448       else {
1449          bytesPerRow = bytesPerPixel * packing->RowLength;
1450       }
1451    }
1452
1453    remainder = bytesPerRow % packing->Alignment;
1454    if (remainder > 0)
1455       bytesPerRow += (packing->Alignment - remainder);
1456
1457    if (packing->ImageHeight == 0)
1458       bytesPerImage = bytesPerRow * height;
1459    else
1460       bytesPerImage = bytesPerRow * packing->ImageHeight;
1461
1462    return bytesPerImage;
1463 }
1464
1465
1466
1467 /**
1468  * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1469  * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1470  * "On" bits will set texels to \p onValue.
1471  * "Off" bits will not modify texels.
1472  * \param width  src bitmap width in pixels
1473  * \param height  src bitmap height in pixels
1474  * \param unpack  bitmap unpacking state
1475  * \param bitmap  the src bitmap data
1476  * \param destBuffer  start of dest buffer
1477  * \param destStride  row stride in dest buffer
1478  * \param onValue  if bit is 1, set destBuffer pixel to this value
1479  */
1480 void
1481 _mesa_expand_bitmap(GLsizei width, GLsizei height,
1482                     const struct gl_pixelstore_attrib *unpack,
1483                     const GLubyte *bitmap,
1484                     GLubyte *destBuffer, GLint destStride,
1485                     GLubyte onValue)
1486 {
1487    const GLubyte *srcRow = (const GLubyte *)
1488       _mesa_image_address2d(unpack, bitmap, width, height,
1489                             GL_COLOR_INDEX, GL_BITMAP, 0, 0);
1490    const GLint srcStride = _mesa_image_row_stride(unpack, width,
1491                                                   GL_COLOR_INDEX, GL_BITMAP);
1492    GLint row, col;
1493
1494 #define SET_PIXEL(COL, ROW) \
1495    destBuffer[(ROW) * destStride + (COL)] = onValue;
1496
1497    for (row = 0; row < height; row++) {
1498       const GLubyte *src = srcRow;
1499
1500       if (unpack->LsbFirst) {
1501          /* Lsb first */
1502          GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
1503          for (col = 0; col < width; col++) {
1504
1505             if (*src & mask) {
1506                SET_PIXEL(col, row);
1507             }
1508
1509             if (mask == 128U) {
1510                src++;
1511                mask = 1U;
1512             }
1513             else {
1514                mask = mask << 1;
1515             }
1516          }
1517
1518          /* get ready for next row */
1519          if (mask != 1)
1520             src++;
1521       }
1522       else {
1523          /* Msb first */
1524          GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
1525          for (col = 0; col < width; col++) {
1526
1527             if (*src & mask) {
1528                SET_PIXEL(col, row);
1529             }
1530
1531             if (mask == 1U) {
1532                src++;
1533                mask = 128U;
1534             }
1535             else {
1536                mask = mask >> 1;
1537             }
1538          }
1539
1540          /* get ready for next row */
1541          if (mask != 128)
1542             src++;
1543       }
1544
1545       srcRow += srcStride;
1546    } /* row */
1547
1548 #undef SET_PIXEL
1549 }
1550
1551
1552
1553
1554 /**
1555  * Convert an array of RGBA colors from one datatype to another.
1556  * NOTE: src may equal dst.  In that case, we use a temporary buffer.
1557  */
1558 void
1559 _mesa_convert_colors(GLenum srcType, const GLvoid *src,
1560                      GLenum dstType, GLvoid *dst,
1561                      GLuint count, const GLubyte mask[])
1562 {
1563    GLuint *tempBuffer;
1564    const GLboolean useTemp = (src == dst);
1565
1566    tempBuffer = malloc(count * MAX_PIXEL_BYTES);
1567    if (!tempBuffer)
1568       return;
1569
1570    ASSERT(srcType != dstType);
1571
1572    switch (srcType) {
1573    case GL_UNSIGNED_BYTE:
1574       if (dstType == GL_UNSIGNED_SHORT) {
1575          const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
1576          GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
1577          GLuint i;
1578          for (i = 0; i < count; i++) {
1579             if (!mask || mask[i]) {
1580                dst2[i][RCOMP] = UBYTE_TO_USHORT(src1[i][RCOMP]);
1581                dst2[i][GCOMP] = UBYTE_TO_USHORT(src1[i][GCOMP]);
1582                dst2[i][BCOMP] = UBYTE_TO_USHORT(src1[i][BCOMP]);
1583                dst2[i][ACOMP] = UBYTE_TO_USHORT(src1[i][ACOMP]);
1584             }
1585          }
1586          if (useTemp)
1587             memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
1588       }
1589       else {
1590          const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
1591          GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
1592          GLuint i;
1593          ASSERT(dstType == GL_FLOAT);
1594          for (i = 0; i < count; i++) {
1595             if (!mask || mask[i]) {
1596                dst4[i][RCOMP] = UBYTE_TO_FLOAT(src1[i][RCOMP]);
1597                dst4[i][GCOMP] = UBYTE_TO_FLOAT(src1[i][GCOMP]);
1598                dst4[i][BCOMP] = UBYTE_TO_FLOAT(src1[i][BCOMP]);
1599                dst4[i][ACOMP] = UBYTE_TO_FLOAT(src1[i][ACOMP]);
1600             }
1601          }
1602          if (useTemp)
1603             memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
1604       }
1605       break;
1606    case GL_UNSIGNED_SHORT:
1607       if (dstType == GL_UNSIGNED_BYTE) {
1608          const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
1609          GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
1610          GLuint i;
1611          for (i = 0; i < count; i++) {
1612             if (!mask || mask[i]) {
1613                dst1[i][RCOMP] = USHORT_TO_UBYTE(src2[i][RCOMP]);
1614                dst1[i][GCOMP] = USHORT_TO_UBYTE(src2[i][GCOMP]);
1615                dst1[i][BCOMP] = USHORT_TO_UBYTE(src2[i][BCOMP]);
1616                dst1[i][ACOMP] = USHORT_TO_UBYTE(src2[i][ACOMP]);
1617             }
1618          }
1619          if (useTemp)
1620             memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
1621       }
1622       else {
1623          const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
1624          GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
1625          GLuint i;
1626          ASSERT(dstType == GL_FLOAT);
1627          for (i = 0; i < count; i++) {
1628             if (!mask || mask[i]) {
1629                dst4[i][RCOMP] = USHORT_TO_FLOAT(src2[i][RCOMP]);
1630                dst4[i][GCOMP] = USHORT_TO_FLOAT(src2[i][GCOMP]);
1631                dst4[i][BCOMP] = USHORT_TO_FLOAT(src2[i][BCOMP]);
1632                dst4[i][ACOMP] = USHORT_TO_FLOAT(src2[i][ACOMP]);
1633             }
1634          }
1635          if (useTemp)
1636             memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
1637       }
1638       break;
1639    case GL_FLOAT:
1640       if (dstType == GL_UNSIGNED_BYTE) {
1641          const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
1642          GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
1643          GLuint i;
1644          for (i = 0; i < count; i++) {
1645             if (!mask || mask[i])
1646                _mesa_unclamped_float_rgba_to_ubyte(dst1[i], src4[i]);
1647          }
1648          if (useTemp)
1649             memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
1650       }
1651       else {
1652          const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
1653          GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
1654          GLuint i;
1655          ASSERT(dstType == GL_UNSIGNED_SHORT);
1656          for (i = 0; i < count; i++) {
1657             if (!mask || mask[i]) {
1658                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][RCOMP], src4[i][RCOMP]);
1659                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][GCOMP], src4[i][GCOMP]);
1660                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][BCOMP], src4[i][BCOMP]);
1661                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][ACOMP], src4[i][ACOMP]);
1662             }
1663          }
1664          if (useTemp)
1665             memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
1666       }
1667       break;
1668    default:
1669       _mesa_problem(NULL, "Invalid datatype in _mesa_convert_colors");
1670    }
1671
1672    free(tempBuffer);
1673 }
1674
1675
1676
1677
1678 /**
1679  * Perform basic clipping for glDrawPixels.  The image's position and size
1680  * and the unpack SkipPixels and SkipRows are adjusted so that the image
1681  * region is entirely within the window and scissor bounds.
1682  * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
1683  * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
1684  * we'll actually write.  Beforehand, *destY-1 is the first drawing row.
1685  *
1686  * \return  GL_TRUE if image is ready for drawing or
1687  *          GL_FALSE if image was completely clipped away (draw nothing)
1688  */
1689 GLboolean
1690 _mesa_clip_drawpixels(const struct gl_context *ctx,
1691                       GLint *destX, GLint *destY,
1692                       GLsizei *width, GLsizei *height,
1693                       struct gl_pixelstore_attrib *unpack)
1694 {
1695    const struct gl_framebuffer *buffer = ctx->DrawBuffer;
1696
1697    if (unpack->RowLength == 0) {
1698       unpack->RowLength = *width;
1699    }
1700
1701    ASSERT(ctx->Pixel.ZoomX == 1.0F);
1702    ASSERT(ctx->Pixel.ZoomY == 1.0F || ctx->Pixel.ZoomY == -1.0F);
1703
1704    /* left clipping */
1705    if (*destX < buffer->_Xmin) {
1706       unpack->SkipPixels += (buffer->_Xmin - *destX);
1707       *width -= (buffer->_Xmin - *destX);
1708       *destX = buffer->_Xmin;
1709    }
1710    /* right clipping */
1711    if (*destX + *width > buffer->_Xmax)
1712       *width -= (*destX + *width - buffer->_Xmax);
1713
1714    if (*width <= 0)
1715       return GL_FALSE;
1716
1717    if (ctx->Pixel.ZoomY == 1.0F) {
1718       /* bottom clipping */
1719       if (*destY < buffer->_Ymin) {
1720          unpack->SkipRows += (buffer->_Ymin - *destY);
1721          *height -= (buffer->_Ymin - *destY);
1722          *destY = buffer->_Ymin;
1723       }
1724       /* top clipping */
1725       if (*destY + *height > buffer->_Ymax)
1726          *height -= (*destY + *height - buffer->_Ymax);
1727    }
1728    else { /* upside down */
1729       /* top clipping */
1730       if (*destY > buffer->_Ymax) {
1731          unpack->SkipRows += (*destY - buffer->_Ymax);
1732          *height -= (*destY - buffer->_Ymax);
1733          *destY = buffer->_Ymax;
1734       }
1735       /* bottom clipping */
1736       if (*destY - *height < buffer->_Ymin)
1737          *height -= (buffer->_Ymin - (*destY - *height));
1738       /* adjust destY so it's the first row to write to */
1739       (*destY)--;
1740    }
1741
1742    if (*height <= 0)
1743       return GL_FALSE;
1744
1745    return GL_TRUE;
1746 }
1747
1748
1749 /**
1750  * Perform clipping for glReadPixels.  The image's window position
1751  * and size, and the pack skipPixels, skipRows and rowLength are adjusted
1752  * so that the image region is entirely within the window bounds.
1753  * Note: this is different from _mesa_clip_drawpixels() in that the
1754  * scissor box is ignored, and we use the bounds of the current readbuffer
1755  * surface.
1756  *
1757  * \return  GL_TRUE if region to read is in bounds
1758  *          GL_FALSE if region is completely out of bounds (nothing to read)
1759  */
1760 GLboolean
1761 _mesa_clip_readpixels(const struct gl_context *ctx,
1762                       GLint *srcX, GLint *srcY,
1763                       GLsizei *width, GLsizei *height,
1764                       struct gl_pixelstore_attrib *pack)
1765 {
1766    const struct gl_framebuffer *buffer = ctx->ReadBuffer;
1767
1768    if (pack->RowLength == 0) {
1769       pack->RowLength = *width;
1770    }
1771
1772    /* left clipping */
1773    if (*srcX < 0) {
1774       pack->SkipPixels += (0 - *srcX);
1775       *width -= (0 - *srcX);
1776       *srcX = 0;
1777    }
1778    /* right clipping */
1779    if (*srcX + *width > (GLsizei) buffer->Width)
1780       *width -= (*srcX + *width - buffer->Width);
1781
1782    if (*width <= 0)
1783       return GL_FALSE;
1784
1785    /* bottom clipping */
1786    if (*srcY < 0) {
1787       pack->SkipRows += (0 - *srcY);
1788       *height -= (0 - *srcY);
1789       *srcY = 0;
1790    }
1791    /* top clipping */
1792    if (*srcY + *height > (GLsizei) buffer->Height)
1793       *height -= (*srcY + *height - buffer->Height);
1794
1795    if (*height <= 0)
1796       return GL_FALSE;
1797
1798    return GL_TRUE;
1799 }
1800
1801
1802 /**
1803  * Do clipping for a glCopyTexSubImage call.
1804  * The framebuffer source region might extend outside the framebuffer
1805  * bounds.  Clip the source region against the framebuffer bounds and
1806  * adjust the texture/dest position and size accordingly.
1807  *
1808  * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
1809  */
1810 GLboolean
1811 _mesa_clip_copytexsubimage(const struct gl_context *ctx,
1812                            GLint *destX, GLint *destY,
1813                            GLint *srcX, GLint *srcY,
1814                            GLsizei *width, GLsizei *height)
1815 {
1816    const struct gl_framebuffer *fb = ctx->ReadBuffer;
1817    const GLint srcX0 = *srcX, srcY0 = *srcY;
1818
1819    if (_mesa_clip_to_region(0, 0, fb->Width, fb->Height,
1820                             srcX, srcY, width, height)) {
1821       *destX = *destX + *srcX - srcX0;
1822       *destY = *destY + *srcY - srcY0;
1823
1824       return GL_TRUE;
1825    }
1826    else {
1827       return GL_FALSE;
1828    }
1829 }
1830
1831
1832
1833 /**
1834  * Clip the rectangle defined by (x, y, width, height) against the bounds
1835  * specified by [xmin, xmax) and [ymin, ymax).
1836  * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
1837  */
1838 GLboolean
1839 _mesa_clip_to_region(GLint xmin, GLint ymin,
1840                      GLint xmax, GLint ymax,
1841                      GLint *x, GLint *y,
1842                      GLsizei *width, GLsizei *height )
1843 {
1844    /* left clipping */
1845    if (*x < xmin) {
1846       *width -= (xmin - *x);
1847       *x = xmin;
1848    }
1849
1850    /* right clipping */
1851    if (*x + *width > xmax)
1852       *width -= (*x + *width - xmax);
1853
1854    if (*width <= 0)
1855       return GL_FALSE;
1856
1857    /* bottom (or top) clipping */
1858    if (*y < ymin) {
1859       *height -= (ymin - *y);
1860       *y = ymin;
1861    }
1862
1863    /* top (or bottom) clipping */
1864    if (*y + *height > ymax)
1865       *height -= (*y + *height - ymax);
1866
1867    if (*height <= 0)
1868       return GL_FALSE;
1869
1870    return GL_TRUE;
1871 }
1872
1873
1874 /**
1875  * Clip dst coords against Xmax (or Ymax).
1876  */
1877 static inline void
1878 clip_right_or_top(GLint *srcX0, GLint *srcX1,
1879                   GLint *dstX0, GLint *dstX1,
1880                   GLint maxValue)
1881 {
1882    GLfloat t, bias;
1883
1884    if (*dstX1 > maxValue) {
1885       /* X1 outside right edge */
1886       ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */
1887       t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
1888       /* chop off [t, 1] part */
1889       ASSERT(t >= 0.0 && t <= 1.0);
1890       *dstX1 = maxValue;
1891       bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F;
1892       *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
1893    }
1894    else if (*dstX0 > maxValue) {
1895       /* X0 outside right edge */
1896       ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */
1897       t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
1898       /* chop off [t, 1] part */
1899       ASSERT(t >= 0.0 && t <= 1.0);
1900       *dstX0 = maxValue;
1901       bias = (*srcX0 < *srcX1) ? -0.5F : 0.5F;
1902       *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
1903    }
1904 }
1905
1906
1907 /**
1908  * Clip dst coords against Xmin (or Ymin).
1909  */
1910 static inline void
1911 clip_left_or_bottom(GLint *srcX0, GLint *srcX1,
1912                     GLint *dstX0, GLint *dstX1,
1913                     GLint minValue)
1914 {
1915    GLfloat t, bias;
1916
1917    if (*dstX0 < minValue) {
1918       /* X0 outside left edge */
1919       ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */
1920       t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
1921       /* chop off [0, t] part */
1922       ASSERT(t >= 0.0 && t <= 1.0);
1923       *dstX0 = minValue;
1924       bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; /* flipped??? */
1925       *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
1926    }
1927    else if (*dstX1 < minValue) {
1928       /* X1 outside left edge */
1929       ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */
1930       t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
1931       /* chop off [0, t] part */
1932       ASSERT(t >= 0.0 && t <= 1.0);
1933       *dstX1 = minValue;
1934       bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F;
1935       *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
1936    }
1937 }
1938
1939
1940 /**
1941  * Do clipping of blit src/dest rectangles.
1942  * The dest rect is clipped against both the buffer bounds and scissor bounds.
1943  * The src rect is just clipped against the buffer bounds.
1944  *
1945  * When either the src or dest rect is clipped, the other is also clipped
1946  * proportionately!
1947  *
1948  * Note that X0 need not be less than X1 (same for Y) for either the source
1949  * and dest rects.  That makes the clipping a little trickier.
1950  *
1951  * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
1952  */
1953 GLboolean
1954 _mesa_clip_blit(struct gl_context *ctx,
1955                 GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
1956                 GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1)
1957 {
1958    const GLint srcXmin = 0;
1959    const GLint srcXmax = ctx->ReadBuffer->Width;
1960    const GLint srcYmin = 0;
1961    const GLint srcYmax = ctx->ReadBuffer->Height;
1962
1963    /* these include scissor bounds */
1964    const GLint dstXmin = ctx->DrawBuffer->_Xmin;
1965    const GLint dstXmax = ctx->DrawBuffer->_Xmax;
1966    const GLint dstYmin = ctx->DrawBuffer->_Ymin;
1967    const GLint dstYmax = ctx->DrawBuffer->_Ymax;
1968
1969    /*
1970    printf("PreClipX:  src: %d .. %d  dst: %d .. %d\n",
1971           *srcX0, *srcX1, *dstX0, *dstX1);
1972    printf("PreClipY:  src: %d .. %d  dst: %d .. %d\n",
1973           *srcY0, *srcY1, *dstY0, *dstY1);
1974    */
1975
1976    /* trivial rejection tests */
1977    if (*dstX0 == *dstX1)
1978       return GL_FALSE; /* no width */
1979    if (*dstX0 <= dstXmin && *dstX1 <= dstXmin)
1980       return GL_FALSE; /* totally out (left) of bounds */
1981    if (*dstX0 >= dstXmax && *dstX1 >= dstXmax)
1982       return GL_FALSE; /* totally out (right) of bounds */
1983
1984    if (*dstY0 == *dstY1)
1985       return GL_FALSE;
1986    if (*dstY0 <= dstYmin && *dstY1 <= dstYmin)
1987       return GL_FALSE;
1988    if (*dstY0 >= dstYmax && *dstY1 >= dstYmax)
1989       return GL_FALSE;
1990
1991    if (*srcX0 == *srcX1)
1992       return GL_FALSE;
1993    if (*srcX0 <= srcXmin && *srcX1 <= srcXmin)
1994       return GL_FALSE;
1995    if (*srcX0 >= srcXmax && *srcX1 >= srcXmax)
1996       return GL_FALSE;
1997
1998    if (*srcY0 == *srcY1)
1999       return GL_FALSE;
2000    if (*srcY0 <= srcYmin && *srcY1 <= srcYmin)
2001       return GL_FALSE;
2002    if (*srcY0 >= srcYmax && *srcY1 >= srcYmax)
2003       return GL_FALSE;
2004
2005    /*
2006     * dest clip
2007     */
2008    clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax);
2009    clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax);
2010    clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin);
2011    clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin);
2012
2013    /*
2014     * src clip (just swap src/dst values from above)
2015     */
2016    clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax);
2017    clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax);
2018    clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin);
2019    clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin);
2020
2021    /*
2022    printf("PostClipX: src: %d .. %d  dst: %d .. %d\n",
2023           *srcX0, *srcX1, *dstX0, *dstX1);
2024    printf("PostClipY: src: %d .. %d  dst: %d .. %d\n",
2025           *srcY0, *srcY1, *dstY0, *dstY1);
2026    */
2027
2028    ASSERT(*dstX0 >= dstXmin);
2029    ASSERT(*dstX0 <= dstXmax);
2030    ASSERT(*dstX1 >= dstXmin);
2031    ASSERT(*dstX1 <= dstXmax);
2032
2033    ASSERT(*dstY0 >= dstYmin);
2034    ASSERT(*dstY0 <= dstYmax);
2035    ASSERT(*dstY1 >= dstYmin);
2036    ASSERT(*dstY1 <= dstYmax);
2037
2038    ASSERT(*srcX0 >= srcXmin);
2039    ASSERT(*srcX0 <= srcXmax);
2040    ASSERT(*srcX1 >= srcXmin);
2041    ASSERT(*srcX1 <= srcXmax);
2042
2043    ASSERT(*srcY0 >= srcYmin);
2044    ASSERT(*srcY0 <= srcYmax);
2045    ASSERT(*srcY1 >= srcYmin);
2046    ASSERT(*srcY1 <= srcYmax);
2047
2048    return GL_TRUE;
2049 }