histogram.c revision cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290
1cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* $Id: histogram.c,v 1.5 2000/12/26 05:09:28 keithw Exp $ */
28a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
38a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul/*
48a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Mesa 3-D graphics library
58a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Version:  3.5
68a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
78a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
88a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
98a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * copy of this software and associated documentation files (the "Software"),
118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * to deal in the Software without restriction, including without limitation
128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Software is furnished to do so, subject to the following conditions:
158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * The above copyright notice and this permission notice shall be included
178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * in all copies or substantial portions of the Software.
188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul */
268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#ifdef PC_HEADER
298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "all.h"
308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#else
318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "glheader.h"
328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "colormac.h"
338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "context.h"
348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "image.h"
358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h"
368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "mmath.h"
378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#endif
388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
4090f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul/*
41a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul * XXX the packed pixel formats haven't been tested.
4290f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul */
438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulstatic void
448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulpack_histogram( GLcontext *ctx,
458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                GLuint n, CONST GLuint rgba[][4],
468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                GLenum format, GLenum type, GLvoid *destination,
478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                const struct gl_pixelstore_attrib *packing )
488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   const GLint comps = _mesa_components_in_format(format);
508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLuint luminance[MAX_WIDTH];
518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) {
538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLuint i;
548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      for (i = 0; i < n; i++) {
558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#define PACK_MACRO(TYPE)					\
608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   {								\
618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLuint i;							\
628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      switch (format) {						\
638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_RED:						\
648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][RCOMP];			\
668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_GREEN:						\
688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][GCOMP];			\
708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_BLUE:						\
728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][BCOMP];			\
748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_ALPHA:						\
768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][ACOMP];			\
788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_LUMINANCE:					\
808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) luminance[i];			\
828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_LUMINANCE_ALPHA:				\
848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*2+0] = (TYPE) luminance[i];		\
868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*2+1] = (TYPE) rgba[i][ACOMP];		\
878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_RGB:						\
908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+0] = (TYPE) rgba[i][RCOMP];		\
928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+1] = (TYPE) rgba[i][GCOMP];		\
938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+2] = (TYPE) rgba[i][BCOMP];		\
948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_RGBA:						\
978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+0] = (TYPE) rgba[i][RCOMP];		\
998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+1] = (TYPE) rgba[i][GCOMP];		\
1008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+2] = (TYPE) rgba[i][BCOMP];		\
1018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+3] = (TYPE) rgba[i][ACOMP];		\
1028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_BGR:						\
1058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+0] = (TYPE) rgba[i][BCOMP];		\
1078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+1] = (TYPE) rgba[i][GCOMP];		\
1088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+2] = (TYPE) rgba[i][RCOMP];		\
1098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_BGRA:						\
1128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+0] = (TYPE) rgba[i][BCOMP];		\
1148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+1] = (TYPE) rgba[i][GCOMP];		\
1158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+2] = (TYPE) rgba[i][RCOMP];		\
1168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+3] = (TYPE) rgba[i][ACOMP];		\
1178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_ABGR_EXT:					\
1208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+0] = (TYPE) rgba[i][ACOMP];		\
1228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+1] = (TYPE) rgba[i][BCOMP];		\
1238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+2] = (TYPE) rgba[i][GCOMP];		\
1248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+3] = (TYPE) rgba[i][RCOMP];		\
1258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         default:						\
1288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            gl_problem(ctx, "bad format in pack_histogram");	\
1298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }								\
1308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
1318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (type) {
1338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_UNSIGNED_BYTE:
1348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLubyte *dst = (GLubyte *) destination;
1368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLubyte);
1378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_BYTE:
1408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLbyte *dst = (GLbyte *) destination;
1428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLbyte);
1438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_UNSIGNED_SHORT:
1468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLushort *dst = (GLushort *) destination;
1488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLushort);
1498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
1508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap2(dst, n * comps);
1518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
1528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_SHORT:
1558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLshort *dst = (GLshort *) destination;
1578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLshort);
1588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
1598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap2((GLushort *) dst, n * comps);
1608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
1618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_UNSIGNED_INT:
1648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLuint *dst = (GLuint *) destination;
1668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLuint);
1678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
1688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap4(dst, n * comps);
1698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
1708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_INT:
1738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLint *dst = (GLint *) destination;
1758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLint);
1768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
1778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap4((GLuint *) dst, n * comps);
1788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
1798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_FLOAT:
1828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLfloat *dst = (GLfloat *) destination;
1848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLfloat);
1858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
1868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap4((GLuint *) dst, n * comps);
1878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
1888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
190a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
191a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
192a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLubyte *dst = (GLubyte *) destination;
193a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
194a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
195a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x7) << 5)
196a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 2)
197a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3)     );
198a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
199a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
200a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
2018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLubyte *dst = (GLubyte *) destination;
202a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
203a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
204a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
205a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x7) << 5)
206a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 2)
207a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3)     );
208a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
2098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
211a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
212a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
213a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLubyte *dst = (GLubyte *) destination;
214a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
215a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
216a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x3) << 6)
217a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 3)
218a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x7)     );
219a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
220a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
221a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
222a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLubyte *dst = (GLubyte *) destination;
223a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
224a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
225a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
226a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x3) << 6)
227a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 3)
228a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x7)     );
229a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
2308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
232a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
233a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
2348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLushort *dst = (GLushort *) destination;
235a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
236a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
237a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
238a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
239a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f)      );
240a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
241a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
242a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
243a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
244a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
245a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
246a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
247a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
248a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
249a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f)      );
2508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
253a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
254a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
255a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
256a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
257a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
258a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
259a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
260a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f)      );
261a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
262a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
263a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
264a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
265a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
266a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
267a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
268a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
269a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
270a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f)      );
2718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
274a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
275a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
276a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
277a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
278a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
279a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
280a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  8)
281a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  4)
282a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xf)      );
283a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
284a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
285a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
286a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
287a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
288a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
289a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0xf) << 12)
290a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  8)
291a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf) <<  4)
292a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xf)      );
293a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
294a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
295a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
296a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
297a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
298a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
299a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
300a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
301a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  8)
302a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  4)
303a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf)      );
304a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
305a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
306a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
307a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
308a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
309a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
310a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
311a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
312a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
313a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  8)
314a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  4)
315a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf)      );
316a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
317a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
318a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
319a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
320a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
321a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
322a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
323a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf) <<  8)
324a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  4)
325a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf)      );
326a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
327a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
328a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
329a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
330a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
331a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
332a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
333a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
334a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  8)
335a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  4)
336a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xf)      );
337a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
338a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
339a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
340a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
341a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
342a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
343a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
344a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
345a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
346a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  6)
347a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  1)
348a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x1)       );
349a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
350a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
351a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
352a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
353a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
354a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
355a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
356a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  6)
357a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f) <<  1)
358a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x1)       );
359a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
360a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
361a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
362a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
363a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
364a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
365a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
366a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
367a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  6)
368a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  1)
369a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1)       );
370a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
371a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
372a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
373a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
374a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
375a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
376a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
377a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
378a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
379a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  6)
380a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  1)
381a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1)       );
382a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
383a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
384a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
385a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
386a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
387a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
388a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
389a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f) <<  6)
390a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  1)
391a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1)       );
392a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
393a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
394a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
395a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
396a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
397a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
398a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
399a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
400a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  6)
401a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  1)
402a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x1)       );
403a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
404a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
405a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
406a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
407a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
4088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLuint *dst = (GLuint *) destination;
409a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
410a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
411a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
412a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) << 16)
413a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) <<  8)
414a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xff)      );
415a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
416a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
417a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
418a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
419a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
420a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
421a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0xff) << 24)
422a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) << 16)
423a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff) <<  8)
424a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xff)      );
425a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
426a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
427a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
428a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
429a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
430a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
431a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
432a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
433a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) << 16)
434a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) <<  8)
435a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff)      );
4368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
4378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
4388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
439a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
440a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
441a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
442a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
443a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
444a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
445a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) << 16)
446a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) <<  8)
447a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff)      );
448a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
449a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
450a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
451a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
452a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
453a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
454a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
455a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff) << 16)
456a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) <<  8)
457a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff)      );
458a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
459a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
460a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
461a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
462a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
463a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
464a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
465a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
466a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) << 16)
467a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) <<  8)
468a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xff)      );
4698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
4708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
4718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
472a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
473a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
474a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
475a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
476a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
477a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
478a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) << 12)
479a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) <<  2)
480a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x3)        );
481a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
482a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
483a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
484a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
485a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
486a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
487a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22)
488a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) << 12)
489a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3ff) <<  2)
490a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x3)        );
491a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
492a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
493a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
494a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
495a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
496a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
497a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
498a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
499a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) << 12)
500a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) <<  2)
501a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3)        );
502a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
503a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
504a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
505a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
506a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
507a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
508a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
509a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
510a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
511a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) << 12)
512a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) <<  2)
513a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3)        );
514a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
515a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
516a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
517a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
518a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
519a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
520a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
521a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3ff) << 12)
522a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) <<  2)
523a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3)        );
524a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
525a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
526a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
527a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
528a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
529a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
530a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
531a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
532a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) << 12)
533a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) <<  2)
534a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x3)        );
5358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
5368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
5378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
5388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
539a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         gl_problem(ctx, "Bad type in pack_histogram");
5408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
5418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
5428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#undef PACK_MACRO
5438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
5448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
5458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
5468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul/*
5478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Given an internalFormat token passed to glHistogram or glMinMax,
5488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * return the corresponding base format.
5498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Return -1 if invalid token.
5508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul */
5518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulstatic GLint
5528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulbase_histogram_format( GLenum format )
5538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
5548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (format) {
5558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA:
5568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA4:
5578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA8:
5588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA12:
5598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA16:
5608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_ALPHA;
5618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE:
5628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE4:
5638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE8:
5648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE12:
5658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE16:
5668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_LUMINANCE;
5678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE_ALPHA:
5688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE4_ALPHA4:
5698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE6_ALPHA2:
5708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE8_ALPHA8:
5718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE12_ALPHA4:
5728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE12_ALPHA12:
5738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE16_ALPHA16:
5748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_LUMINANCE_ALPHA;
5758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB:
5768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_R3_G3_B2:
5778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB4:
5788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB5:
5798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB8:
5808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB10:
5818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB12:
5828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB16:
5838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_RGB;
5848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA:
5858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA2:
5868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA4:
5878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB5_A1:
5888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA8:
5898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB10_A2:
5908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA12:
5918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA16:
5928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_RGBA;
5938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
5948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return -1;  /* error */
5958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
5968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
5978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
5988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
5998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
6008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
6018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
6028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
603cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
6048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
6068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetMinmax");
6078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
6118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetMinmax(target)");
6128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
61590f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul   if (!_mesa_is_legal_format_and_type(format, type)) {
61690f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetMinmax(format or type)");
6178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
620cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (type != GL_UNSIGNED_BYTE &&
621cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_BYTE &&
622cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_UNSIGNED_SHORT &&
623cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_SHORT &&
624cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_UNSIGNED_INT &&
625cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_INT &&
626cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_FLOAT) {
627cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      gl_error(ctx, GL_INVALID_ENUM, "glGetMinmax(type)");
628cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
629cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
630cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
6318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!values)
6328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   {
6358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLfloat minmax[2][4];
6368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][RCOMP] = CLAMP(ctx->MinMax.Min[RCOMP], 0.0F, 1.0F);
6378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][GCOMP] = CLAMP(ctx->MinMax.Min[GCOMP], 0.0F, 1.0F);
6388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][BCOMP] = CLAMP(ctx->MinMax.Min[BCOMP], 0.0F, 1.0F);
6398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][ACOMP] = CLAMP(ctx->MinMax.Min[ACOMP], 0.0F, 1.0F);
6408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][RCOMP] = CLAMP(ctx->MinMax.Max[RCOMP], 0.0F, 1.0F);
6418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][GCOMP] = CLAMP(ctx->MinMax.Max[GCOMP], 0.0F, 1.0F);
6428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][BCOMP] = CLAMP(ctx->MinMax.Max[BCOMP], 0.0F, 1.0F);
6438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][ACOMP] = CLAMP(ctx->MinMax.Max[ACOMP], 0.0F, 1.0F);
644a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      _mesa_pack_float_rgba_span(ctx, 2, (CONST GLfloat (*)[4]) minmax,
645a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                                 format, type, values, &ctx->Pack, 0);
6468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (reset) {
6498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      _mesa_ResetMinmax(GL_MINMAX);
6508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
6528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
6558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
6568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
6578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
658cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
6598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
6618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetHistogram");
6628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM) {
6668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetHistogram(target)");
6678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
67090f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul   if (!_mesa_is_legal_format_and_type(format, type)) {
67190f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(format or type)");
6728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
675cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (type != GL_UNSIGNED_BYTE &&
676cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_BYTE &&
677cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_UNSIGNED_SHORT &&
678cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_SHORT &&
679cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_UNSIGNED_INT &&
680cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_INT &&
681cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       type != GL_FLOAT) {
682cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      gl_error(ctx, GL_INVALID_ENUM, "glGetHistogram(type)");
683cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
684cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
685cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
6868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!values)
6878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   pack_histogram(ctx, ctx->Histogram.Width,
6908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                  (CONST GLuint (*)[4]) ctx->Histogram.Count,
6918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                  format, type, values, &ctx->Pack);
6928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (reset) {
6948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLuint i;
6958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
6968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][0] = 0;
6978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][1] = 0;
6988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][2] = 0;
6998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][3] = 0;
7008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
7018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
7038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
7068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
7078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
7088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
709cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
7108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
7128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameterfv");
7138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
7178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(target)");
7188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (pname) {
7228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_WIDTH:
7238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.Width;
7248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_FORMAT:
7268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.Format;
7278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_RED_SIZE:
7298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.RedSize;
7308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_GREEN_SIZE:
7328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.GreenSize;
7338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_BLUE_SIZE:
7358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.BlueSize;
7368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_ALPHA_SIZE:
7388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.AlphaSize;
7398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_LUMINANCE_SIZE:
7418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.LuminanceSize;
7428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_SINK:
7448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.Sink;
7458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
7478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         gl_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(pname)");
7488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
7508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
7538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
7548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
7558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
756cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
7578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
7598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameteriv");
7608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
7648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(target)");
7658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (pname) {
7698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_WIDTH:
7708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.Width;
7718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_FORMAT:
7738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.Format;
7748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_RED_SIZE:
7768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.RedSize;
7778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_GREEN_SIZE:
7798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.GreenSize;
7808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_BLUE_SIZE:
7828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.BlueSize;
7838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_ALPHA_SIZE:
7858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.AlphaSize;
7868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_LUMINANCE_SIZE:
7888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.LuminanceSize;
7898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_SINK:
7918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.Sink;
7928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
7938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
7948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         gl_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(pname)");
7958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
7978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
8008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
8018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
8028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
803cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
8048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
8068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameterfv");
8078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
8108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameterfv(target)");
8118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (pname == GL_MINMAX_FORMAT) {
8148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLfloat) ctx->MinMax.Format;
8158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else if (pname == GL_MINMAX_SINK) {
8178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLfloat) ctx->MinMax.Sink;
8188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else {
8208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameterfv(pname)");
8218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
8238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
8268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
8278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
8288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
829cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
8308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
8328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameteriv");
8338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
8368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameteriv(target)");
8378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (pname == GL_MINMAX_FORMAT) {
8408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLint) ctx->MinMax.Format;
8418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else if (pname == GL_MINMAX_SINK) {
8438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLint) ctx->MinMax.Sink;
8448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else {
8468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameteriv(pname)");
8478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
8498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
8528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink)
8538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
8548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLuint i;
8558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLboolean error = GL_FALSE;
8568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
857cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */
8588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
8608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glHistogram");
8618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
8658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glHistogram(target)");
8668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (width < 0 || width > HISTOGRAM_TABLE_SIZE) {
8708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      if (target == GL_PROXY_HISTOGRAM) {
8718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         error = GL_TRUE;
8728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
8738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      else {
8748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         if (width < 0)
8758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            gl_error(ctx, GL_INVALID_VALUE, "glHistogram(width)");
8768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         else
8778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            gl_error(ctx, GL_TABLE_TOO_LARGE, "glHistogram(width)");
8788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return;
8798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
8808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (width != 0 && _mesa_bitcount(width) != 1) {
8838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      if (target == GL_PROXY_HISTOGRAM) {
8848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         error = GL_TRUE;
8858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
8868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      else {
8878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         gl_error(ctx, GL_INVALID_VALUE, "glHistogram(width)");
8888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return;
8898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
8908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (base_histogram_format(internalFormat) < 0) {
8938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      if (target == GL_PROXY_HISTOGRAM) {
8948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         error = GL_TRUE;
8958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
8968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      else {
8978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         gl_error(ctx, GL_INVALID_ENUM, "glHistogram(internalFormat)");
8988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return;
8998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   /* reset histograms */
9038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
9048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][0] = 0;
9058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][1] = 0;
9068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][2] = 0;
9078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][3] = 0;
9088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (error) {
9118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Width = 0;
9128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Format = 0;
9138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.RedSize       = 0;
9148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.GreenSize     = 0;
9158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.BlueSize      = 0;
9168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.AlphaSize     = 0;
9178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.LuminanceSize = 0;
9188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else {
9208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Width = width;
9218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Format = internalFormat;
9228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Sink = sink;
9238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.RedSize       = 0xffffffff;
9248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.GreenSize     = 0xffffffff;
9258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.BlueSize      = 0xffffffff;
9268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.AlphaSize     = 0xffffffff;
9278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.LuminanceSize = 0xffffffff;
9288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
930b5012e1ee1b0172dda3921bcf12e3605b1be589bBrian Paul   ctx->NewState |= _NEW_PIXEL;
9318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
9328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
9358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink)
9368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
9378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
938cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
9398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
9418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glMinmax");
9428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
9468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glMinMax(target)");
9478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (base_histogram_format(internalFormat) < 0) {
9518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glMinMax(internalFormat)");
9528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
954cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
955cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->MinMax.Sink == sink)
956cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
957cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_PIXEL);
9588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Sink = sink;
9598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
9608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
9638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_ResetHistogram(GLenum target)
9648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
9658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLuint i;
9668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
967cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */
9688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
9708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glResetHistogram");
9718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM) {
9758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glResetHistogram(target)");
9768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
9808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][0] = 0;
9818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][1] = 0;
9828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][2] = 0;
9838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][3] = 0;
9848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
986b5012e1ee1b0172dda3921bcf12e3605b1be589bBrian Paul   ctx->NewState |= _NEW_PIXEL;
9878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
9888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulvoid
9918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_ResetMinmax(GLenum target)
9928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
9938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
994cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
9958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!ctx->Extensions.EXT_histogram) {
9978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_OPERATION, "glResetMinmax");
9988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
10028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      gl_error(ctx, GL_INVALID_ENUM, "glResetMinMax(target)");
10038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[RCOMP] = 1000;    ctx->MinMax.Max[RCOMP] = -1000;
10078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[GCOMP] = 1000;    ctx->MinMax.Max[GCOMP] = -1000;
10088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[BCOMP] = 1000;    ctx->MinMax.Max[BCOMP] = -1000;
10098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[ACOMP] = 1000;    ctx->MinMax.Max[ACOMP] = -1000;
1010b5012e1ee1b0172dda3921bcf12e3605b1be589bBrian Paul   ctx->NewState |= _NEW_PIXEL;
10118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
1012