histogram.c revision f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97
18a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul/*
28a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Mesa 3-D graphics library
3f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Version:  6.1
48a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
5f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
68a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
78a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
88a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * copy of this software and associated documentation files (the "Software"),
98a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * to deal in the Software without restriction, including without limitation
108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Software is furnished to do so, subject to the following conditions:
138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * The above copyright notice and this permission notice shall be included
158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * in all copies or substantial portions of the Software.
168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul *
178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul */
248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "glheader.h"
278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "colormac.h"
288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "context.h"
298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "image.h"
308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h"
318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
33a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul/**********************************************************************
34a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul * Internal functions
35a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul */
36a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
37a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
38a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul/*
39a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul * Update the min/max values from an array of fragment colors.
40a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul */
41a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paulvoid
42a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul_mesa_update_minmax(GLcontext *ctx, GLuint n, const GLfloat rgba[][4])
43a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul{
44a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   GLuint i;
45a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   for (i = 0; i < n; i++) {
46a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      /* update mins */
47a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][RCOMP] < ctx->MinMax.Min[RCOMP])
48a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Min[RCOMP] = rgba[i][RCOMP];
49a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][GCOMP] < ctx->MinMax.Min[GCOMP])
50a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Min[GCOMP] = rgba[i][GCOMP];
51a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][BCOMP] < ctx->MinMax.Min[BCOMP])
52a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Min[BCOMP] = rgba[i][BCOMP];
53a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][ACOMP] < ctx->MinMax.Min[ACOMP])
54a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Min[ACOMP] = rgba[i][ACOMP];
55a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
56a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      /* update maxs */
57a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][RCOMP] > ctx->MinMax.Max[RCOMP])
58a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Max[RCOMP] = rgba[i][RCOMP];
59a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][GCOMP] > ctx->MinMax.Max[GCOMP])
60a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Max[GCOMP] = rgba[i][GCOMP];
61a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][BCOMP] > ctx->MinMax.Max[BCOMP])
62a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Max[BCOMP] = rgba[i][BCOMP];
63a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      if (rgba[i][ACOMP] > ctx->MinMax.Max[ACOMP])
64a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul         ctx->MinMax.Max[ACOMP] = rgba[i][ACOMP];
65a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   }
66a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul}
67a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
68a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
69a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul/*
70a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul * Update the histogram values from an array of fragment colors.
71a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul */
72a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paulvoid
73a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul_mesa_update_histogram(GLcontext *ctx, GLuint n, const GLfloat rgba[][4])
74a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul{
75a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   const GLint max = ctx->Histogram.Width - 1;
76a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   GLfloat w = (GLfloat) max;
77a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   GLuint i;
78a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
79a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   if (ctx->Histogram.Width == 0)
80a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      return;
81a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
82a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   for (i = 0; i < n; i++) {
83a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      GLint ri = IROUND(rgba[i][RCOMP] * w);
84a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      GLint gi = IROUND(rgba[i][GCOMP] * w);
85a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      GLint bi = IROUND(rgba[i][BCOMP] * w);
86a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      GLint ai = IROUND(rgba[i][ACOMP] * w);
87a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      ri = CLAMP(ri, 0, max);
88a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      gi = CLAMP(gi, 0, max);
89a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      bi = CLAMP(bi, 0, max);
90a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      ai = CLAMP(ai, 0, max);
91a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      ctx->Histogram.Count[ri][RCOMP]++;
92a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      ctx->Histogram.Count[gi][GCOMP]++;
93a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      ctx->Histogram.Count[bi][BCOMP]++;
94a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul      ctx->Histogram.Count[ai][ACOMP]++;
95a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul   }
96a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul}
97a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
98a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
9990f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul/*
100a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul * XXX the packed pixel formats haven't been tested.
10190f042ae8dbc00ecedab5cc68dbc6abae4228af5Brian Paul */
1028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulstatic void
1038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulpack_histogram( GLcontext *ctx,
1048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                GLuint n, CONST GLuint rgba[][4],
1058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                GLenum format, GLenum type, GLvoid *destination,
1068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                const struct gl_pixelstore_attrib *packing )
1078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
1088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   const GLint comps = _mesa_components_in_format(format);
1098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLuint luminance[MAX_WIDTH];
1108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) {
1128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLuint i;
1138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      for (i = 0; i < n; i++) {
1148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
1158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
1168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
1178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#define PACK_MACRO(TYPE)					\
1198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   {								\
1208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLuint i;							\
1218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      switch (format) {						\
1228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_RED:						\
1238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
1248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][RCOMP];			\
1258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_GREEN:						\
1278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
1288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][GCOMP];			\
1298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_BLUE:						\
1318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
1328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][BCOMP];			\
1338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_ALPHA:						\
1358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
1368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) rgba[i][ACOMP];			\
1378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_LUMINANCE:					\
1398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++)					\
1408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i] = (TYPE) luminance[i];			\
1418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_LUMINANCE_ALPHA:				\
1438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*2+0] = (TYPE) luminance[i];		\
1458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*2+1] = (TYPE) rgba[i][ACOMP];		\
1468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_RGB:						\
1498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+0] = (TYPE) rgba[i][RCOMP];		\
1518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+1] = (TYPE) rgba[i][GCOMP];		\
1528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+2] = (TYPE) rgba[i][BCOMP];		\
1538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_RGBA:						\
1568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+0] = (TYPE) rgba[i][RCOMP];		\
1588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+1] = (TYPE) rgba[i][GCOMP];		\
1598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+2] = (TYPE) rgba[i][BCOMP];		\
1608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+3] = (TYPE) rgba[i][ACOMP];		\
1618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_BGR:						\
1648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+0] = (TYPE) rgba[i][BCOMP];		\
1668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+1] = (TYPE) rgba[i][GCOMP];		\
1678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*3+2] = (TYPE) rgba[i][RCOMP];		\
1688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_BGRA:						\
1718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+0] = (TYPE) rgba[i][BCOMP];		\
1738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+1] = (TYPE) rgba[i][GCOMP];		\
1748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+2] = (TYPE) rgba[i][RCOMP];		\
1758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+3] = (TYPE) rgba[i][ACOMP];		\
1768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         case GL_ABGR_EXT:					\
1798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            for (i=0;i<n;i++) {					\
1808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+0] = (TYPE) rgba[i][ACOMP];		\
1818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+1] = (TYPE) rgba[i][BCOMP];		\
1828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+2] = (TYPE) rgba[i][GCOMP];		\
1838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               dst[i*4+3] = (TYPE) rgba[i][RCOMP];		\
1848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }							\
1858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            break;						\
1868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         default:						\
18708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad format in pack_histogram");	\
1888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }								\
1898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
1908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (type) {
1928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_UNSIGNED_BYTE:
1938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
1948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLubyte *dst = (GLubyte *) destination;
1958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLubyte);
1968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
1978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
1988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_BYTE:
1998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
2008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLbyte *dst = (GLbyte *) destination;
2018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLbyte);
2028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
2048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_UNSIGNED_SHORT:
2058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
2068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLushort *dst = (GLushort *) destination;
2078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLushort);
2088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
2098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap2(dst, n * comps);
2108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
2138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_SHORT:
2148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
2158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLshort *dst = (GLshort *) destination;
2168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLshort);
2178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
2188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap2((GLushort *) dst, n * comps);
2198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
2228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_UNSIGNED_INT:
2238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
2248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLuint *dst = (GLuint *) destination;
2258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLuint);
2268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
2278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap4(dst, n * comps);
2288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
2318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_INT:
2328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
2338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLint *dst = (GLint *) destination;
2348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLint);
2358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
2368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap4((GLuint *) dst, n * comps);
2378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
2408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_FLOAT:
2418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         {
2428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLfloat *dst = (GLfloat *) destination;
2438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            PACK_MACRO(GLfloat);
2448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            if (packing->SwapBytes) {
2458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul               _mesa_swap4((GLuint *) dst, n * comps);
2468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
2478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         {
251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            /* temporarily store as GLuints */
252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLuint temp[4*HISTOGRAM_TABLE_SIZE];
253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dst = (GLhalfARB *) destination;
254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLuint i;
255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            /* get GLuint values */
256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            PACK_MACRO(GLuint);
257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            /* convert to GLhalf */
258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            for (i = 0; i < n * comps; i++) {
259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               dst[i] = _mesa_float_to_half((GLfloat) temp[i]);
260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            if (packing->SwapBytes) {
262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               _mesa_swap2((GLushort *) dst, n * comps);
263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            }
264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         }
265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         break;
266a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
267a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
268a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLubyte *dst = (GLubyte *) destination;
269a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
270a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
271a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x7) << 5)
272a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 2)
273a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3)     );
274a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
275a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
276a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
2778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLubyte *dst = (GLubyte *) destination;
278a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
279a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
280a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
281a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x7) << 5)
282a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 2)
283a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3)     );
284a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
2858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
2868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
287a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
288a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
289a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLubyte *dst = (GLubyte *) destination;
290a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
291a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
292a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x3) << 6)
293a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 3)
294a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x7)     );
295a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
296a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
297a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
298a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLubyte *dst = (GLubyte *) destination;
299a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
300a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
301a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
302a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x3) << 6)
303a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x7) << 3)
304a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x7)     );
305a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
3068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
3078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
308a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
309a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
3108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLushort *dst = (GLushort *) destination;
311a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
312a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
313a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
314a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
315a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f)      );
316a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
317a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
318a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
319a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
320a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
321a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
322a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
323a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
324a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
325a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f)      );
3268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
3278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
3288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
329a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
330a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGB) {
331a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
332a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
333a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
334a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
335a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
336a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f)      );
337a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
338a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
339a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
340a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
341a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
342a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_BGR);
343a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
344a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
345a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3f) <<  5)
346a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f)      );
3478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
3488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
3498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
350a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
351a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
352a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
353a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
354a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
355a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
356a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  8)
357a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  4)
358a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xf)      );
359a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
360a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
361a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
362a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
363a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
364a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
365a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0xf) << 12)
366a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  8)
367a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf) <<  4)
368a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xf)      );
369a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
370a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
371a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
372a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
373a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
374a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
375a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
376a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
377a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  8)
378a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  4)
379a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf)      );
380a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
381a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
382a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
383a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
384a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
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] & 0xf) << 12)
389a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  8)
390a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  4)
391a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf)      );
392a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
393a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
394a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
395a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
396a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
397a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
398a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
399a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xf) <<  8)
400a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  4)
401a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf)      );
402a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
403a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
404a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
405a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
406a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
407a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
408a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
409a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
410a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xf) <<  8)
411a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xf) <<  4)
412a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xf)      );
413a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
414a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
415a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
416a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
417a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
418a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
419a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
420a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
421a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
422a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  6)
423a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  1)
424a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x1)       );
425a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
426a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
427a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
428a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
429a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
430a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
431a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
432a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  6)
433a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f) <<  1)
434a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x1)       );
435a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
436a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
437a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
438a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
439a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
440a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
441a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
442a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
443a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  6)
444a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  1)
445a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1)       );
446a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
447a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
448a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
449a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
450a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
451a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
452a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
453a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
454a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
455a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  6)
456a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  1)
457a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1)       );
458a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
459a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
460a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
461a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
462a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
463a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
464a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
465a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x1f) <<  6)
466a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  1)
467a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1)       );
468a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
469a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
470a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
471a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLushort *dst = (GLushort *) destination;
472a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
473a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
474a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
475a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
476a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x1f) <<  6)
477a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x1f) <<  1)
478a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x1)       );
479a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
480a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
481a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
482a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
483a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
4848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            GLuint *dst = (GLuint *) destination;
485a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
486a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
487a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
488a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) << 16)
489a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) <<  8)
490a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xff)      );
491a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
492a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
493a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
494a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
495a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
496a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
497a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0xff) << 24)
498a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) << 16)
499a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff) <<  8)
500a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xff)      );
501a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
502a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
503a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
504a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
505a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
506a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
507a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
508a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
509a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) << 16)
510a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) <<  8)
511a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff)      );
5128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
5138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
5148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
515a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
516a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
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] & 0xff) << 24)
521a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) << 16)
522a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) <<  8)
523a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff)      );
524a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
525a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
526a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
527a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
528a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
529a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
530a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
531a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0xff) << 16)
532a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) <<  8)
533a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff)      );
534a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
535a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
536a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
537a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
538a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
539a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
540a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
541a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
542a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0xff) << 16)
543a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0xff) <<  8)
544a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0xff)      );
5458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
5468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
5478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
548a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
549a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
550a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
551a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
552a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
553a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
554a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) << 12)
555a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) <<  2)
556a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x3)        );
557a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
558a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
559a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
560a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
561a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
562a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
563a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22)
564a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) << 12)
565a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3ff) <<  2)
566a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x3)        );
567a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
568a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
569a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
570a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
571a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
572a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
573a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
574a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
575a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) << 12)
576a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) <<  2)
577a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3)        );
578a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
579a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
580a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         break;
581a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
582a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         if (format == GL_RGBA) {
583a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
584a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
585a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
586a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
587a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) << 12)
588a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) <<  2)
589a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3)        );
590a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
591a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
592a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else if (format == GL_BGRA) {
593a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
594a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
595a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
596a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
597a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][RCOMP] & 0x3ff) << 12)
598a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) <<  2)
599a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3)        );
600a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            }
601a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         }
602a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul         else {
603a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint *dst = (GLuint *) destination;
604a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            GLuint i;
605a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            ASSERT(format == GL_ABGR_EXT);
606a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul            for (i = 0; i < n; i++) {
607a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul               dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
608a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][GCOMP] & 0x3ff) << 12)
609a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][BCOMP] & 0x3ff) <<  2)
610a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                      | ((rgba[i][ACOMP] & 0x3)        );
6118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul            }
6128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         }
6138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
6148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
61508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(ctx, "Bad type in pack_histogram");
6168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#undef PACK_MACRO
6198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
6208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul/*
6238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Given an internalFormat token passed to glHistogram or glMinMax,
6248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * return the corresponding base format.
6258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul * Return -1 if invalid token.
6268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul */
6278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulstatic GLint
6288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paulbase_histogram_format( GLenum format )
6298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
6308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (format) {
6318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA:
6328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA4:
6338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA8:
6348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA12:
6358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_ALPHA16:
6368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_ALPHA;
6378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE:
6388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE4:
6398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE8:
6408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE12:
6418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE16:
6428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_LUMINANCE;
6438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE_ALPHA:
6448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE4_ALPHA4:
6458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE6_ALPHA2:
6468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE8_ALPHA8:
6478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE12_ALPHA4:
6488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE12_ALPHA12:
6498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_LUMINANCE16_ALPHA16:
6508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_LUMINANCE_ALPHA;
6518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB:
6528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_R3_G3_B2:
6538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB4:
6548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB5:
6558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB8:
6568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB10:
6578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB12:
6588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB16:
6598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_RGB;
6608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA:
6618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA2:
6628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA4:
6638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB5_A1:
6648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA8:
6658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGB10_A2:
6668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA12:
6678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_RGBA16:
6688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return GL_RGBA;
6698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
6708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return -1;  /* error */
6718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
6738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
675a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
676a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul/**********************************************************************
677a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul * API functions
678a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul */
679a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
680a46bd6f96a78525dc98bcb2176494e6d6dce5dceBrian Paul
681c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
6828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
6838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
6848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
685cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
6868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6876a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
68808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax");
6898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
6928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
69308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmax(target)");
6948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
6958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
6968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (format != GL_RED &&
698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_GREEN &&
699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_BLUE &&
700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_ALPHA &&
701f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_RGB &&
702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_BGR &&
703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_RGBA &&
704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_BGRA &&
705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_ABGR_EXT &&
706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_LUMINANCE &&
707f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_LUMINANCE_ALPHA) {
708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(format)");
7098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
712f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax(format or type)");
713cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
714cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
715cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
7168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!values)
7178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   {
7208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLfloat minmax[2][4];
7218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][RCOMP] = CLAMP(ctx->MinMax.Min[RCOMP], 0.0F, 1.0F);
7228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][GCOMP] = CLAMP(ctx->MinMax.Min[GCOMP], 0.0F, 1.0F);
7238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][BCOMP] = CLAMP(ctx->MinMax.Min[BCOMP], 0.0F, 1.0F);
7248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[0][ACOMP] = CLAMP(ctx->MinMax.Min[ACOMP], 0.0F, 1.0F);
7258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][RCOMP] = CLAMP(ctx->MinMax.Max[RCOMP], 0.0F, 1.0F);
7268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][GCOMP] = CLAMP(ctx->MinMax.Max[GCOMP], 0.0F, 1.0F);
7278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][BCOMP] = CLAMP(ctx->MinMax.Max[BCOMP], 0.0F, 1.0F);
7288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      minmax[1][ACOMP] = CLAMP(ctx->MinMax.Max[ACOMP], 0.0F, 1.0F);
7298cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul      _mesa_pack_rgba_span_float(ctx, 2, (CONST GLfloat (*)[4]) minmax,
730a2003c2895b2231ff47ae5fa870887f1ef66ad29Brian Paul                                 format, type, values, &ctx->Pack, 0);
7318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (reset) {
7348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      _mesa_ResetMinmax(GL_MINMAX);
7358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
7378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
739c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
7418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
7428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
743cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
7448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7456a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
74608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram");
7478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM) {
75108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(target)");
7528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
755f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (format != GL_RED &&
756f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_GREEN &&
757f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_BLUE &&
758f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_ALPHA &&
759f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_RGB &&
760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_BGR &&
761f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_RGBA &&
762f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_BGRA &&
763f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_ABGR_EXT &&
764f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_LUMINANCE &&
765f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul       format != GL_LUMINANCE_ALPHA) {
766f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(format)");
7678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(format or type)");
771cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
772cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
773cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
7748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (!values)
7758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
7768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   pack_histogram(ctx, ctx->Histogram.Width,
7788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                  (CONST GLuint (*)[4]) ctx->Histogram.Count,
7798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul                  format, type, values, &ctx->Pack);
7808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (reset) {
7828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      GLuint i;
7838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
7848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][0] = 0;
7858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][1] = 0;
7868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][2] = 0;
7878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         ctx->Histogram.Count[i][3] = 0;
7888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
7898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
7908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
7918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
793c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
7958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
7968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
797cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
7988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
7996a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
80008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameterfv");
8018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
80508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(target)");
8068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (pname) {
8108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_WIDTH:
8118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.Width;
8128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8138a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_FORMAT:
8148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.Format;
8158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_RED_SIZE:
8178a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.RedSize;
8188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_GREEN_SIZE:
8208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.GreenSize;
8218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_BLUE_SIZE:
8238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.BlueSize;
8248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_ALPHA_SIZE:
8268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.AlphaSize;
8278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_LUMINANCE_SIZE:
8298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.LuminanceSize;
8308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_SINK:
8328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLfloat) ctx->Histogram.Sink;
8338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8348a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
83508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(pname)");
8368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
8388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8398a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
840c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
8428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
8438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
844cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
8458a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8466a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
84708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameteriv");
8488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
85208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(target)");
8538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   switch (pname) {
8578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_WIDTH:
8588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.Width;
8598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_FORMAT:
8618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.Format;
8628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8638a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_RED_SIZE:
8648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.RedSize;
8658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_GREEN_SIZE:
8678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.GreenSize;
8688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_BLUE_SIZE:
8708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.BlueSize;
8718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_ALPHA_SIZE:
8738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.AlphaSize;
8748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_LUMINANCE_SIZE:
8768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.LuminanceSize;
8778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      case GL_HISTOGRAM_SINK:
8798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         *params = (GLint) ctx->Histogram.Sink;
8808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         break;
8818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      default:
88208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(pname)");
8838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
8858a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
887c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
8898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
8908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
891cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
8928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
8936a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
89408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameterfv");
8958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
8968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
8978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
89808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameterfv(target)");
8998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (pname == GL_MINMAX_FORMAT) {
9028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLfloat) ctx->MinMax.Format;
9038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else if (pname == GL_MINMAX_SINK) {
9058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLfloat) ctx->MinMax.Sink;
9068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else {
90808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameterfv(pname)");
9098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
9118a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9128a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
913c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
9148a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
9158a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
9168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
917cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
9188a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9196a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
92008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameteriv");
9218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9228a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
92408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameteriv(target)");
9258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9268a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (pname == GL_MINMAX_FORMAT) {
9288a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLint) ctx->MinMax.Format;
9298a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else if (pname == GL_MINMAX_SINK) {
9318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      *params = (GLint) ctx->MinMax.Sink;
9328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else {
93408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameteriv(pname)");
9358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
9378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
939c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
9408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink)
9418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
9428a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLuint i;
9438a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLboolean error = GL_FALSE;
9448a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
945cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */
9468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9476a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
94808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glHistogram");
9498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9508a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
95308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(target)");
9548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
9558a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9578a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (width < 0 || width > HISTOGRAM_TABLE_SIZE) {
9588a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      if (target == GL_PROXY_HISTOGRAM) {
9598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         error = GL_TRUE;
9608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      else {
9628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         if (width < 0)
96308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)");
9648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         else
96508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_error(ctx, GL_TABLE_TOO_LARGE, "glHistogram(width)");
9668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return;
9678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (width != 0 && _mesa_bitcount(width) != 1) {
9718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      if (target == GL_PROXY_HISTOGRAM) {
9728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         error = GL_TRUE;
9738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9748a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      else {
97508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)");
9768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return;
9778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9788a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (base_histogram_format(internalFormat) < 0) {
9818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      if (target == GL_PROXY_HISTOGRAM) {
9828a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         error = GL_TRUE;
9838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9848a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      else {
98508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(internalFormat)");
9868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul         return;
9878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      }
9888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9908a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   /* reset histograms */
9918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
9928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][0] = 0;
9938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][1] = 0;
9948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][2] = 0;
9958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][3] = 0;
9968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
9978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
9988a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (error) {
9998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Width = 0;
10008a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Format = 0;
10018a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.RedSize       = 0;
10028a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.GreenSize     = 0;
10038a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.BlueSize      = 0;
10048a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.AlphaSize     = 0;
10058a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.LuminanceSize = 0;
10068a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10078a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   else {
10088a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Width = width;
10098a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Format = internalFormat;
10108a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Sink = sink;
1011e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul      ctx->Histogram.RedSize       = 8 * sizeof(GLuint);
1012e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul      ctx->Histogram.GreenSize     = 8 * sizeof(GLuint);
1013e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul      ctx->Histogram.BlueSize      = 8 * sizeof(GLuint);
1014e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul      ctx->Histogram.AlphaSize     = 8 * sizeof(GLuint);
1015e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul      ctx->Histogram.LuminanceSize = 8 * sizeof(GLuint);
10168a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
101722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
1018b5012e1ee1b0172dda3921bcf12e3605b1be589bBrian Paul   ctx->NewState |= _NEW_PIXEL;
10198a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
10208a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10218a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1022c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10238a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink)
10248a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
10258a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
1026cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
10278a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10286a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
102908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glMinmax");
10308a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10318a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10328a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10338a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
103408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(target)");
10358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10368a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (base_histogram_format(internalFormat) < 0) {
103908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(internalFormat)");
10408a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10418a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
104222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
1043cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->MinMax.Sink == sink)
1044cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
1045cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_PIXEL);
10468a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Sink = sink;
10478a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
10488a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10498a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1050c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10518a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_ResetHistogram(GLenum target)
10528a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
10538a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GLuint i;
10548a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
1055cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */
10568a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10576a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
105808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glResetHistogram");
10598a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10608a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10618a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10628a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_HISTOGRAM) {
106308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glResetHistogram(target)");
10648a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10658a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10668a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10678a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
10688a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][0] = 0;
10698a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][1] = 0;
10708a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][2] = 0;
10718a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      ctx->Histogram.Count[i][3] = 0;
10728a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10738a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1074b5012e1ee1b0172dda3921bcf12e3605b1be589bBrian Paul   ctx->NewState |= _NEW_PIXEL;
10758a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
10768a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10778a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
1078c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10798a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul_mesa_ResetMinmax(GLenum target)
10808a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul{
10818a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   GET_CURRENT_CONTEXT(ctx);
1082cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10838a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10846a9851d72d6cf9f5a6b0e3bd5bbb05706e071387Brian Paul   if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
108508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glResetMinmax");
10868a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10878a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10888a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10898a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   if (target != GL_MINMAX) {
109008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glResetMinMax(target)");
10918a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul      return;
10928a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   }
10938a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul
10948a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[RCOMP] = 1000;    ctx->MinMax.Max[RCOMP] = -1000;
10958a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[GCOMP] = 1000;    ctx->MinMax.Max[GCOMP] = -1000;
10968a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[BCOMP] = 1000;    ctx->MinMax.Max[BCOMP] = -1000;
10978a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul   ctx->MinMax.Min[ACOMP] = 1000;    ctx->MinMax.Max[ACOMP] = -1000;
1098b5012e1ee1b0172dda3921bcf12e3605b1be589bBrian Paul   ctx->NewState |= _NEW_PIXEL;
10998a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul}
11006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
11016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
11026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
11036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
11046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*****                      Initialization                        *****/
11056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
11066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
11076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellvoid _mesa_init_histogram( GLcontext * ctx )
11086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
11096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   int i;
11106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
11116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Histogram group */
11126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.Width = 0;
11136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.Format = GL_RGBA;
11146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.Sink = GL_FALSE;
11156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.RedSize       = 0;
11166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.GreenSize     = 0;
11176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.BlueSize      = 0;
11186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.AlphaSize     = 0;
11196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Histogram.LuminanceSize = 0;
11206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
11216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      ctx->Histogram.Count[i][0] = 0;
11226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      ctx->Histogram.Count[i][1] = 0;
11236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      ctx->Histogram.Count[i][2] = 0;
11246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      ctx->Histogram.Count[i][3] = 0;
11256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   }
11266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
11276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Min/Max group */
11286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->MinMax.Format = GL_RGBA;
11296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->MinMax.Sink = GL_FALSE;
11306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->MinMax.Min[RCOMP] = 1000;    ctx->MinMax.Max[RCOMP] = -1000;
11316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->MinMax.Min[GCOMP] = 1000;    ctx->MinMax.Max[GCOMP] = -1000;
11326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->MinMax.Min[BCOMP] = 1000;    ctx->MinMax.Max[BCOMP] = -1000;
11336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->MinMax.Min[ACOMP] = 1000;    ctx->MinMax.Max[ACOMP] = -1000;
11346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
1135