histogram.c revision 4a49301e
17117f1b4Smrg/* 27117f1b4Smrg * Mesa 3-D graphics library 37117f1b4Smrg * Version: 6.3 47117f1b4Smrg * 57117f1b4Smrg * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. 67117f1b4Smrg * 77117f1b4Smrg * Permission is hereby granted, free of charge, to any person obtaining a 87117f1b4Smrg * copy of this software and associated documentation files (the "Software"), 97117f1b4Smrg * to deal in the Software without restriction, including without limitation 107117f1b4Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 117117f1b4Smrg * and/or sell copies of the Software, and to permit persons to whom the 127117f1b4Smrg * Software is furnished to do so, subject to the following conditions: 137117f1b4Smrg * 147117f1b4Smrg * The above copyright notice and this permission notice shall be included 157117f1b4Smrg * in all copies or substantial portions of the Software. 167117f1b4Smrg * 177117f1b4Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 187117f1b4Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 197117f1b4Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 207117f1b4Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 217117f1b4Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 227117f1b4Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 237117f1b4Smrg */ 247117f1b4Smrg 257117f1b4Smrg 267117f1b4Smrg#include "glheader.h" 277117f1b4Smrg#include "bufferobj.h" 287117f1b4Smrg#include "colormac.h" 297117f1b4Smrg#include "context.h" 307117f1b4Smrg#include "image.h" 317117f1b4Smrg#include "histogram.h" 324a49301eSmrg#include "glapi/dispatch.h" 337117f1b4Smrg 347117f1b4Smrg 354a49301eSmrg#if FEATURE_histogram 364a49301eSmrg 377117f1b4Smrg 387117f1b4Smrg/* 397117f1b4Smrg * XXX the packed pixel formats haven't been tested. 407117f1b4Smrg */ 417117f1b4Smrgstatic void 427117f1b4Smrgpack_histogram( GLcontext *ctx, 437117f1b4Smrg GLuint n, CONST GLuint rgba[][4], 447117f1b4Smrg GLenum format, GLenum type, GLvoid *destination, 457117f1b4Smrg const struct gl_pixelstore_attrib *packing ) 467117f1b4Smrg{ 477117f1b4Smrg const GLint comps = _mesa_components_in_format(format); 487117f1b4Smrg GLuint luminance[MAX_WIDTH]; 497117f1b4Smrg 507117f1b4Smrg if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) { 517117f1b4Smrg GLuint i; 527117f1b4Smrg for (i = 0; i < n; i++) { 537117f1b4Smrg luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 547117f1b4Smrg } 557117f1b4Smrg } 567117f1b4Smrg 577117f1b4Smrg#define PACK_MACRO(TYPE) \ 587117f1b4Smrg { \ 597117f1b4Smrg GLuint i; \ 607117f1b4Smrg switch (format) { \ 617117f1b4Smrg case GL_RED: \ 627117f1b4Smrg for (i=0;i<n;i++) \ 637117f1b4Smrg dst[i] = (TYPE) rgba[i][RCOMP]; \ 647117f1b4Smrg break; \ 657117f1b4Smrg case GL_GREEN: \ 667117f1b4Smrg for (i=0;i<n;i++) \ 677117f1b4Smrg dst[i] = (TYPE) rgba[i][GCOMP]; \ 687117f1b4Smrg break; \ 697117f1b4Smrg case GL_BLUE: \ 707117f1b4Smrg for (i=0;i<n;i++) \ 717117f1b4Smrg dst[i] = (TYPE) rgba[i][BCOMP]; \ 727117f1b4Smrg break; \ 737117f1b4Smrg case GL_ALPHA: \ 747117f1b4Smrg for (i=0;i<n;i++) \ 757117f1b4Smrg dst[i] = (TYPE) rgba[i][ACOMP]; \ 767117f1b4Smrg break; \ 777117f1b4Smrg case GL_LUMINANCE: \ 787117f1b4Smrg for (i=0;i<n;i++) \ 797117f1b4Smrg dst[i] = (TYPE) luminance[i]; \ 807117f1b4Smrg break; \ 817117f1b4Smrg case GL_LUMINANCE_ALPHA: \ 827117f1b4Smrg for (i=0;i<n;i++) { \ 837117f1b4Smrg dst[i*2+0] = (TYPE) luminance[i]; \ 847117f1b4Smrg dst[i*2+1] = (TYPE) rgba[i][ACOMP]; \ 857117f1b4Smrg } \ 867117f1b4Smrg break; \ 877117f1b4Smrg case GL_RGB: \ 887117f1b4Smrg for (i=0;i<n;i++) { \ 897117f1b4Smrg dst[i*3+0] = (TYPE) rgba[i][RCOMP]; \ 907117f1b4Smrg dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \ 917117f1b4Smrg dst[i*3+2] = (TYPE) rgba[i][BCOMP]; \ 927117f1b4Smrg } \ 937117f1b4Smrg break; \ 947117f1b4Smrg case GL_RGBA: \ 957117f1b4Smrg for (i=0;i<n;i++) { \ 967117f1b4Smrg dst[i*4+0] = (TYPE) rgba[i][RCOMP]; \ 977117f1b4Smrg dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \ 987117f1b4Smrg dst[i*4+2] = (TYPE) rgba[i][BCOMP]; \ 997117f1b4Smrg dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \ 1007117f1b4Smrg } \ 1017117f1b4Smrg break; \ 1027117f1b4Smrg case GL_BGR: \ 1037117f1b4Smrg for (i=0;i<n;i++) { \ 1047117f1b4Smrg dst[i*3+0] = (TYPE) rgba[i][BCOMP]; \ 1057117f1b4Smrg dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \ 1067117f1b4Smrg dst[i*3+2] = (TYPE) rgba[i][RCOMP]; \ 1077117f1b4Smrg } \ 1087117f1b4Smrg break; \ 1097117f1b4Smrg case GL_BGRA: \ 1107117f1b4Smrg for (i=0;i<n;i++) { \ 1117117f1b4Smrg dst[i*4+0] = (TYPE) rgba[i][BCOMP]; \ 1127117f1b4Smrg dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \ 1137117f1b4Smrg dst[i*4+2] = (TYPE) rgba[i][RCOMP]; \ 1147117f1b4Smrg dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \ 1157117f1b4Smrg } \ 1167117f1b4Smrg break; \ 1177117f1b4Smrg case GL_ABGR_EXT: \ 1187117f1b4Smrg for (i=0;i<n;i++) { \ 1197117f1b4Smrg dst[i*4+0] = (TYPE) rgba[i][ACOMP]; \ 1207117f1b4Smrg dst[i*4+1] = (TYPE) rgba[i][BCOMP]; \ 1217117f1b4Smrg dst[i*4+2] = (TYPE) rgba[i][GCOMP]; \ 1227117f1b4Smrg dst[i*4+3] = (TYPE) rgba[i][RCOMP]; \ 1237117f1b4Smrg } \ 1247117f1b4Smrg break; \ 1257117f1b4Smrg default: \ 1267117f1b4Smrg _mesa_problem(ctx, "bad format in pack_histogram"); \ 1277117f1b4Smrg } \ 1287117f1b4Smrg } 1297117f1b4Smrg 1307117f1b4Smrg switch (type) { 1317117f1b4Smrg case GL_UNSIGNED_BYTE: 1327117f1b4Smrg { 1337117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 1347117f1b4Smrg PACK_MACRO(GLubyte); 1357117f1b4Smrg } 1367117f1b4Smrg break; 1377117f1b4Smrg case GL_BYTE: 1387117f1b4Smrg { 1397117f1b4Smrg GLbyte *dst = (GLbyte *) destination; 1407117f1b4Smrg PACK_MACRO(GLbyte); 1417117f1b4Smrg } 1427117f1b4Smrg break; 1437117f1b4Smrg case GL_UNSIGNED_SHORT: 1447117f1b4Smrg { 1457117f1b4Smrg GLushort *dst = (GLushort *) destination; 1467117f1b4Smrg PACK_MACRO(GLushort); 1477117f1b4Smrg if (packing->SwapBytes) { 1487117f1b4Smrg _mesa_swap2(dst, n * comps); 1497117f1b4Smrg } 1507117f1b4Smrg } 1517117f1b4Smrg break; 1527117f1b4Smrg case GL_SHORT: 1537117f1b4Smrg { 1547117f1b4Smrg GLshort *dst = (GLshort *) destination; 1557117f1b4Smrg PACK_MACRO(GLshort); 1567117f1b4Smrg if (packing->SwapBytes) { 1577117f1b4Smrg _mesa_swap2((GLushort *) dst, n * comps); 1587117f1b4Smrg } 1597117f1b4Smrg } 1607117f1b4Smrg break; 1617117f1b4Smrg case GL_UNSIGNED_INT: 1627117f1b4Smrg { 1637117f1b4Smrg GLuint *dst = (GLuint *) destination; 1647117f1b4Smrg PACK_MACRO(GLuint); 1657117f1b4Smrg if (packing->SwapBytes) { 1667117f1b4Smrg _mesa_swap4(dst, n * comps); 1677117f1b4Smrg } 1687117f1b4Smrg } 1697117f1b4Smrg break; 1707117f1b4Smrg case GL_INT: 1717117f1b4Smrg { 1727117f1b4Smrg GLint *dst = (GLint *) destination; 1737117f1b4Smrg PACK_MACRO(GLint); 1747117f1b4Smrg if (packing->SwapBytes) { 1757117f1b4Smrg _mesa_swap4((GLuint *) dst, n * comps); 1767117f1b4Smrg } 1777117f1b4Smrg } 1787117f1b4Smrg break; 1797117f1b4Smrg case GL_FLOAT: 1807117f1b4Smrg { 1817117f1b4Smrg GLfloat *dst = (GLfloat *) destination; 1827117f1b4Smrg PACK_MACRO(GLfloat); 1837117f1b4Smrg if (packing->SwapBytes) { 1847117f1b4Smrg _mesa_swap4((GLuint *) dst, n * comps); 1857117f1b4Smrg } 1867117f1b4Smrg } 1877117f1b4Smrg break; 1887117f1b4Smrg case GL_HALF_FLOAT_ARB: 1897117f1b4Smrg { 1907117f1b4Smrg /* temporarily store as GLuints */ 1917117f1b4Smrg GLuint temp[4*HISTOGRAM_TABLE_SIZE]; 1924a49301eSmrg GLuint *dst = temp; 1934a49301eSmrg GLhalfARB *half = (GLhalfARB *) destination; 1947117f1b4Smrg GLuint i; 1957117f1b4Smrg /* get GLuint values */ 1967117f1b4Smrg PACK_MACRO(GLuint); 1977117f1b4Smrg /* convert to GLhalf */ 1987117f1b4Smrg for (i = 0; i < n * comps; i++) { 1994a49301eSmrg half[i] = _mesa_float_to_half((GLfloat) temp[i]); 2007117f1b4Smrg } 2017117f1b4Smrg if (packing->SwapBytes) { 2024a49301eSmrg _mesa_swap2((GLushort *) half, n * comps); 2037117f1b4Smrg } 2047117f1b4Smrg } 2057117f1b4Smrg break; 2067117f1b4Smrg case GL_UNSIGNED_BYTE_3_3_2: 2077117f1b4Smrg if (format == GL_RGB) { 2087117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2097117f1b4Smrg GLuint i; 2107117f1b4Smrg for (i = 0; i < n; i++) { 2117117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x7) << 5) 2127117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 2) 2137117f1b4Smrg | ((rgba[i][BCOMP] & 0x3) ); 2147117f1b4Smrg } 2157117f1b4Smrg } 2167117f1b4Smrg else { 2177117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2187117f1b4Smrg GLuint i; 2197117f1b4Smrg ASSERT(format == GL_BGR); 2207117f1b4Smrg for (i = 0; i < n; i++) { 2217117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x7) << 5) 2227117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 2) 2237117f1b4Smrg | ((rgba[i][RCOMP] & 0x3) ); 2247117f1b4Smrg } 2257117f1b4Smrg } 2267117f1b4Smrg break; 2277117f1b4Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 2287117f1b4Smrg if (format == GL_RGB) { 2297117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2307117f1b4Smrg GLuint i; 2317117f1b4Smrg for (i = 0; i < n; i++) { 2327117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x3) << 6) 2337117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 3) 2347117f1b4Smrg | ((rgba[i][BCOMP] & 0x7) ); 2357117f1b4Smrg } 2367117f1b4Smrg } 2377117f1b4Smrg else { 2387117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2397117f1b4Smrg GLuint i; 2407117f1b4Smrg ASSERT(format == GL_BGR); 2417117f1b4Smrg for (i = 0; i < n; i++) { 2427117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x3) << 6) 2437117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 3) 2447117f1b4Smrg | ((rgba[i][RCOMP] & 0x7) ); 2457117f1b4Smrg } 2467117f1b4Smrg } 2477117f1b4Smrg break; 2487117f1b4Smrg case GL_UNSIGNED_SHORT_5_6_5: 2497117f1b4Smrg if (format == GL_RGB) { 2507117f1b4Smrg GLushort *dst = (GLushort *) destination; 2517117f1b4Smrg GLuint i; 2527117f1b4Smrg for (i = 0; i < n; i++) { 2537117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 2547117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2557117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) ); 2567117f1b4Smrg } 2577117f1b4Smrg } 2587117f1b4Smrg else { 2597117f1b4Smrg GLushort *dst = (GLushort *) destination; 2607117f1b4Smrg GLuint i; 2617117f1b4Smrg ASSERT(format == GL_BGR); 2627117f1b4Smrg for (i = 0; i < n; i++) { 2637117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) 2647117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2657117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) ); 2667117f1b4Smrg } 2677117f1b4Smrg } 2687117f1b4Smrg break; 2697117f1b4Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 2707117f1b4Smrg if (format == GL_RGB) { 2717117f1b4Smrg GLushort *dst = (GLushort *) destination; 2727117f1b4Smrg GLuint i; 2737117f1b4Smrg for (i = 0; i < n; i++) { 2747117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) 2757117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2767117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) ); 2777117f1b4Smrg } 2787117f1b4Smrg } 2797117f1b4Smrg else { 2807117f1b4Smrg GLushort *dst = (GLushort *) destination; 2817117f1b4Smrg GLuint i; 2827117f1b4Smrg ASSERT(format == GL_BGR); 2837117f1b4Smrg for (i = 0; i < n; i++) { 2847117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 2857117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2867117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) ); 2877117f1b4Smrg } 2887117f1b4Smrg } 2897117f1b4Smrg break; 2907117f1b4Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 2917117f1b4Smrg if (format == GL_RGBA) { 2927117f1b4Smrg GLushort *dst = (GLushort *) destination; 2937117f1b4Smrg GLuint i; 2947117f1b4Smrg for (i = 0; i < n; i++) { 2957117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xf) << 12) 2967117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 8) 2977117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 4) 2987117f1b4Smrg | ((rgba[i][ACOMP] & 0xf) ); 2997117f1b4Smrg } 3007117f1b4Smrg } 3017117f1b4Smrg else if (format == GL_BGRA) { 3027117f1b4Smrg GLushort *dst = (GLushort *) destination; 3037117f1b4Smrg GLuint i; 3047117f1b4Smrg for (i = 0; i < n; i++) { 3057117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0xf) << 12) 3067117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 8) 3077117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) << 4) 3087117f1b4Smrg | ((rgba[i][ACOMP] & 0xf) ); 3097117f1b4Smrg } 3107117f1b4Smrg } 3117117f1b4Smrg else { 3127117f1b4Smrg GLushort *dst = (GLushort *) destination; 3137117f1b4Smrg GLuint i; 3147117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 3157117f1b4Smrg for (i = 0; i < n; i++) { 3167117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) 3177117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 8) 3187117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 4) 3197117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) ); 3207117f1b4Smrg } 3217117f1b4Smrg } 3227117f1b4Smrg break; 3237117f1b4Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3247117f1b4Smrg if (format == GL_RGBA) { 3257117f1b4Smrg GLushort *dst = (GLushort *) destination; 3267117f1b4Smrg GLuint i; 3277117f1b4Smrg for (i = 0; i < n; i++) { 3287117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) 3297117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 8) 3307117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 4) 3317117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) ); 3327117f1b4Smrg } 3337117f1b4Smrg } 3347117f1b4Smrg else if (format == GL_BGRA) { 3357117f1b4Smrg GLushort *dst = (GLushort *) destination; 3367117f1b4Smrg GLuint i; 3377117f1b4Smrg for (i = 0; i < n; i++) { 3387117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) 3397117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) << 8) 3407117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 4) 3417117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) ); 3427117f1b4Smrg } 3437117f1b4Smrg } 3447117f1b4Smrg else { 3457117f1b4Smrg GLushort *dst = (GLushort *) destination; 3467117f1b4Smrg GLuint i; 3477117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 3487117f1b4Smrg for (i = 0; i < n; i++) { 3497117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xf) << 12) 3507117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 8) 3517117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 4) 3527117f1b4Smrg | ((rgba[i][ACOMP] & 0xf) ); 3537117f1b4Smrg } 3547117f1b4Smrg } 3557117f1b4Smrg break; 3567117f1b4Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 3577117f1b4Smrg if (format == GL_RGBA) { 3587117f1b4Smrg GLushort *dst = (GLushort *) destination; 3597117f1b4Smrg GLuint i; 3607117f1b4Smrg for (i = 0; i < n; i++) { 3617117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 3627117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 6) 3637117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 1) 3647117f1b4Smrg | ((rgba[i][ACOMP] & 0x1) ); 3657117f1b4Smrg } 3667117f1b4Smrg } 3677117f1b4Smrg else if (format == GL_BGRA) { 3687117f1b4Smrg GLushort *dst = (GLushort *) destination; 3697117f1b4Smrg GLuint i; 3707117f1b4Smrg for (i = 0; i < n; i++) { 3717117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) 3727117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 6) 3737117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) << 1) 3747117f1b4Smrg | ((rgba[i][ACOMP] & 0x1) ); 3757117f1b4Smrg } 3767117f1b4Smrg } 3777117f1b4Smrg else { 3787117f1b4Smrg GLushort *dst = (GLushort *) destination; 3797117f1b4Smrg GLuint i; 3807117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 3817117f1b4Smrg for (i = 0; i < n; i++) { 3827117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) 3837117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 6) 3847117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 1) 3857117f1b4Smrg | ((rgba[i][RCOMP] & 0x1) ); 3867117f1b4Smrg } 3877117f1b4Smrg } 3887117f1b4Smrg break; 3897117f1b4Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3907117f1b4Smrg if (format == GL_RGBA) { 3917117f1b4Smrg GLushort *dst = (GLushort *) destination; 3927117f1b4Smrg GLuint i; 3937117f1b4Smrg for (i = 0; i < n; i++) { 3947117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) 3957117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 6) 3967117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 1) 3977117f1b4Smrg | ((rgba[i][RCOMP] & 0x1) ); 3987117f1b4Smrg } 3997117f1b4Smrg } 4007117f1b4Smrg else if (format == GL_BGRA) { 4017117f1b4Smrg GLushort *dst = (GLushort *) destination; 4027117f1b4Smrg GLuint i; 4037117f1b4Smrg for (i = 0; i < n; i++) { 4047117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) 4057117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) << 6) 4067117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 1) 4077117f1b4Smrg | ((rgba[i][BCOMP] & 0x1) ); 4087117f1b4Smrg } 4097117f1b4Smrg } 4107117f1b4Smrg else { 4117117f1b4Smrg GLushort *dst = (GLushort *) destination; 4127117f1b4Smrg GLuint i; 4137117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 4147117f1b4Smrg for (i = 0; i < n; i++) { 4157117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 4167117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 6) 4177117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 1) 4187117f1b4Smrg | ((rgba[i][ACOMP] & 0x1) ); 4197117f1b4Smrg } 4207117f1b4Smrg } 4217117f1b4Smrg break; 4227117f1b4Smrg case GL_UNSIGNED_INT_8_8_8_8: 4237117f1b4Smrg if (format == GL_RGBA) { 4247117f1b4Smrg GLuint *dst = (GLuint *) destination; 4257117f1b4Smrg GLuint i; 4267117f1b4Smrg for (i = 0; i < n; i++) { 4277117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xff) << 24) 4287117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 16) 4297117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 8) 4307117f1b4Smrg | ((rgba[i][ACOMP] & 0xff) ); 4317117f1b4Smrg } 4327117f1b4Smrg } 4337117f1b4Smrg else if (format == GL_BGRA) { 4347117f1b4Smrg GLuint *dst = (GLuint *) destination; 4357117f1b4Smrg GLuint i; 4367117f1b4Smrg for (i = 0; i < n; i++) { 4377117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0xff) << 24) 4387117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 16) 4397117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) << 8) 4407117f1b4Smrg | ((rgba[i][ACOMP] & 0xff) ); 4417117f1b4Smrg } 4427117f1b4Smrg } 4437117f1b4Smrg else { 4447117f1b4Smrg GLuint *dst = (GLuint *) destination; 4457117f1b4Smrg GLuint i; 4467117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 4477117f1b4Smrg for (i = 0; i < n; i++) { 4487117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) 4497117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 16) 4507117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 8) 4517117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) ); 4527117f1b4Smrg } 4537117f1b4Smrg } 4547117f1b4Smrg break; 4557117f1b4Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 4567117f1b4Smrg if (format == GL_RGBA) { 4577117f1b4Smrg GLuint *dst = (GLuint *) destination; 4587117f1b4Smrg GLuint i; 4597117f1b4Smrg for (i = 0; i < n; i++) { 4607117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) 4617117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 16) 4627117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 8) 4637117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) ); 4647117f1b4Smrg } 4657117f1b4Smrg } 4667117f1b4Smrg else if (format == GL_BGRA) { 4677117f1b4Smrg GLuint *dst = (GLuint *) destination; 4687117f1b4Smrg GLuint i; 4697117f1b4Smrg for (i = 0; i < n; i++) { 4707117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) 4717117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) << 16) 4727117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 8) 4737117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) ); 4747117f1b4Smrg } 4757117f1b4Smrg } 4767117f1b4Smrg else { 4777117f1b4Smrg GLuint *dst = (GLuint *) destination; 4787117f1b4Smrg GLuint i; 4797117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 4807117f1b4Smrg for (i = 0; i < n; i++) { 4817117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xff) << 24) 4827117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 16) 4837117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 8) 4847117f1b4Smrg | ((rgba[i][ACOMP] & 0xff) ); 4857117f1b4Smrg } 4867117f1b4Smrg } 4877117f1b4Smrg break; 4887117f1b4Smrg case GL_UNSIGNED_INT_10_10_10_2: 4897117f1b4Smrg if (format == GL_RGBA) { 4907117f1b4Smrg GLuint *dst = (GLuint *) destination; 4917117f1b4Smrg GLuint i; 4927117f1b4Smrg for (i = 0; i < n; i++) { 4937117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22) 4947117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 12) 4957117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 2) 4967117f1b4Smrg | ((rgba[i][ACOMP] & 0x3) ); 4977117f1b4Smrg } 4987117f1b4Smrg } 4997117f1b4Smrg else if (format == GL_BGRA) { 5007117f1b4Smrg GLuint *dst = (GLuint *) destination; 5017117f1b4Smrg GLuint i; 5027117f1b4Smrg for (i = 0; i < n; i++) { 5037117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22) 5047117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 12) 5057117f1b4Smrg | ((rgba[i][RCOMP] & 0x3ff) << 2) 5067117f1b4Smrg | ((rgba[i][ACOMP] & 0x3) ); 5077117f1b4Smrg } 5087117f1b4Smrg } 5097117f1b4Smrg else { 5107117f1b4Smrg GLuint *dst = (GLuint *) destination; 5117117f1b4Smrg GLuint i; 5127117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 5137117f1b4Smrg for (i = 0; i < n; i++) { 5147117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) 5157117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 12) 5167117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 2) 5177117f1b4Smrg | ((rgba[i][RCOMP] & 0x3) ); 5187117f1b4Smrg } 5197117f1b4Smrg } 5207117f1b4Smrg break; 5217117f1b4Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 5227117f1b4Smrg if (format == GL_RGBA) { 5237117f1b4Smrg GLuint *dst = (GLuint *) destination; 5247117f1b4Smrg GLuint i; 5257117f1b4Smrg for (i = 0; i < n; i++) { 5267117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) 5277117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 12) 5287117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 2) 5297117f1b4Smrg | ((rgba[i][RCOMP] & 0x3) ); 5307117f1b4Smrg } 5317117f1b4Smrg } 5327117f1b4Smrg else if (format == GL_BGRA) { 5337117f1b4Smrg GLuint *dst = (GLuint *) destination; 5347117f1b4Smrg GLuint i; 5357117f1b4Smrg for (i = 0; i < n; i++) { 5367117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) 5377117f1b4Smrg | ((rgba[i][RCOMP] & 0x3ff) << 12) 5387117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 2) 5397117f1b4Smrg | ((rgba[i][BCOMP] & 0x3) ); 5407117f1b4Smrg } 5417117f1b4Smrg } 5427117f1b4Smrg else { 5437117f1b4Smrg GLuint *dst = (GLuint *) destination; 5447117f1b4Smrg GLuint i; 5457117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 5467117f1b4Smrg for (i = 0; i < n; i++) { 5477117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22) 5487117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 12) 5497117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 2) 5507117f1b4Smrg | ((rgba[i][ACOMP] & 0x3) ); 5517117f1b4Smrg } 5527117f1b4Smrg } 5537117f1b4Smrg break; 5547117f1b4Smrg default: 5557117f1b4Smrg _mesa_problem(ctx, "Bad type in pack_histogram"); 5567117f1b4Smrg } 5577117f1b4Smrg 5587117f1b4Smrg#undef PACK_MACRO 5597117f1b4Smrg} 5607117f1b4Smrg 5617117f1b4Smrg 5627117f1b4Smrg/* 5637117f1b4Smrg * Given an internalFormat token passed to glHistogram or glMinMax, 5647117f1b4Smrg * return the corresponding base format. 5657117f1b4Smrg * Return -1 if invalid token. 5667117f1b4Smrg */ 5677117f1b4Smrgstatic GLint 5687117f1b4Smrgbase_histogram_format( GLenum format ) 5697117f1b4Smrg{ 5707117f1b4Smrg switch (format) { 5717117f1b4Smrg case GL_ALPHA: 5727117f1b4Smrg case GL_ALPHA4: 5737117f1b4Smrg case GL_ALPHA8: 5747117f1b4Smrg case GL_ALPHA12: 5757117f1b4Smrg case GL_ALPHA16: 5767117f1b4Smrg return GL_ALPHA; 5777117f1b4Smrg case GL_LUMINANCE: 5787117f1b4Smrg case GL_LUMINANCE4: 5797117f1b4Smrg case GL_LUMINANCE8: 5807117f1b4Smrg case GL_LUMINANCE12: 5817117f1b4Smrg case GL_LUMINANCE16: 5827117f1b4Smrg return GL_LUMINANCE; 5837117f1b4Smrg case GL_LUMINANCE_ALPHA: 5847117f1b4Smrg case GL_LUMINANCE4_ALPHA4: 5857117f1b4Smrg case GL_LUMINANCE6_ALPHA2: 5867117f1b4Smrg case GL_LUMINANCE8_ALPHA8: 5877117f1b4Smrg case GL_LUMINANCE12_ALPHA4: 5887117f1b4Smrg case GL_LUMINANCE12_ALPHA12: 5897117f1b4Smrg case GL_LUMINANCE16_ALPHA16: 5907117f1b4Smrg return GL_LUMINANCE_ALPHA; 5917117f1b4Smrg case GL_RGB: 5927117f1b4Smrg case GL_R3_G3_B2: 5937117f1b4Smrg case GL_RGB4: 5947117f1b4Smrg case GL_RGB5: 5957117f1b4Smrg case GL_RGB8: 5967117f1b4Smrg case GL_RGB10: 5977117f1b4Smrg case GL_RGB12: 5987117f1b4Smrg case GL_RGB16: 5997117f1b4Smrg return GL_RGB; 6007117f1b4Smrg case GL_RGBA: 6017117f1b4Smrg case GL_RGBA2: 6027117f1b4Smrg case GL_RGBA4: 6037117f1b4Smrg case GL_RGB5_A1: 6047117f1b4Smrg case GL_RGBA8: 6057117f1b4Smrg case GL_RGB10_A2: 6067117f1b4Smrg case GL_RGBA12: 6077117f1b4Smrg case GL_RGBA16: 6087117f1b4Smrg return GL_RGBA; 6097117f1b4Smrg default: 6107117f1b4Smrg return -1; /* error */ 6117117f1b4Smrg } 6127117f1b4Smrg} 6137117f1b4Smrg 6147117f1b4Smrg 6157117f1b4Smrg 6167117f1b4Smrg/********************************************************************** 6177117f1b4Smrg * API functions 6187117f1b4Smrg */ 6197117f1b4Smrg 6207117f1b4Smrg 6214a49301eSmrg/* this is defined below */ 6224a49301eSmrgstatic void GLAPIENTRY _mesa_ResetMinmax(GLenum target); 6234a49301eSmrg 6244a49301eSmrg 6254a49301eSmrgstatic void GLAPIENTRY 6267117f1b4Smrg_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) 6277117f1b4Smrg{ 6287117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6297117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 6307117f1b4Smrg 6317117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 6327117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax"); 6337117f1b4Smrg return; 6347117f1b4Smrg } 6357117f1b4Smrg 6367117f1b4Smrg if (target != GL_MINMAX) { 6377117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmax(target)"); 6387117f1b4Smrg return; 6397117f1b4Smrg } 6407117f1b4Smrg 6417117f1b4Smrg if (format != GL_RED && 6427117f1b4Smrg format != GL_GREEN && 6437117f1b4Smrg format != GL_BLUE && 6447117f1b4Smrg format != GL_ALPHA && 6457117f1b4Smrg format != GL_RGB && 6467117f1b4Smrg format != GL_BGR && 6477117f1b4Smrg format != GL_RGBA && 6487117f1b4Smrg format != GL_BGRA && 6497117f1b4Smrg format != GL_ABGR_EXT && 6507117f1b4Smrg format != GL_LUMINANCE && 6517117f1b4Smrg format != GL_LUMINANCE_ALPHA) { 6527117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMax(format)"); 6537117f1b4Smrg } 6547117f1b4Smrg 6557117f1b4Smrg if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 6567117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax(format or type)"); 6577117f1b4Smrg return; 6587117f1b4Smrg } 6597117f1b4Smrg 6604a49301eSmrg 6614a49301eSmrg values = _mesa_map_validate_pbo_dest(ctx, 1, &ctx->Pack, 2, 1, 1, 6624a49301eSmrg format, type, values, "glGetMinmax"); 6634a49301eSmrg if (!values) 6647117f1b4Smrg return; 6657117f1b4Smrg 6667117f1b4Smrg { 6677117f1b4Smrg GLfloat minmax[2][4]; 6687117f1b4Smrg minmax[0][RCOMP] = CLAMP(ctx->MinMax.Min[RCOMP], 0.0F, 1.0F); 6697117f1b4Smrg minmax[0][GCOMP] = CLAMP(ctx->MinMax.Min[GCOMP], 0.0F, 1.0F); 6707117f1b4Smrg minmax[0][BCOMP] = CLAMP(ctx->MinMax.Min[BCOMP], 0.0F, 1.0F); 6717117f1b4Smrg minmax[0][ACOMP] = CLAMP(ctx->MinMax.Min[ACOMP], 0.0F, 1.0F); 6727117f1b4Smrg minmax[1][RCOMP] = CLAMP(ctx->MinMax.Max[RCOMP], 0.0F, 1.0F); 6737117f1b4Smrg minmax[1][GCOMP] = CLAMP(ctx->MinMax.Max[GCOMP], 0.0F, 1.0F); 6747117f1b4Smrg minmax[1][BCOMP] = CLAMP(ctx->MinMax.Max[BCOMP], 0.0F, 1.0F); 6757117f1b4Smrg minmax[1][ACOMP] = CLAMP(ctx->MinMax.Max[ACOMP], 0.0F, 1.0F); 6767117f1b4Smrg _mesa_pack_rgba_span_float(ctx, 2, minmax, 6777117f1b4Smrg format, type, values, &ctx->Pack, 0x0); 6787117f1b4Smrg } 6797117f1b4Smrg 6804a49301eSmrg _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 6817117f1b4Smrg 6827117f1b4Smrg if (reset) { 6837117f1b4Smrg _mesa_ResetMinmax(GL_MINMAX); 6847117f1b4Smrg } 6857117f1b4Smrg} 6867117f1b4Smrg 6877117f1b4Smrg 6884a49301eSmrgstatic void GLAPIENTRY 6897117f1b4Smrg_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) 6907117f1b4Smrg{ 6917117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6927117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 6937117f1b4Smrg 6947117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 6957117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram"); 6967117f1b4Smrg return; 6977117f1b4Smrg } 6987117f1b4Smrg 6997117f1b4Smrg if (target != GL_HISTOGRAM) { 7007117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(target)"); 7017117f1b4Smrg return; 7027117f1b4Smrg } 7037117f1b4Smrg 7047117f1b4Smrg if (format != GL_RED && 7057117f1b4Smrg format != GL_GREEN && 7067117f1b4Smrg format != GL_BLUE && 7077117f1b4Smrg format != GL_ALPHA && 7087117f1b4Smrg format != GL_RGB && 7097117f1b4Smrg format != GL_BGR && 7107117f1b4Smrg format != GL_RGBA && 7117117f1b4Smrg format != GL_BGRA && 7127117f1b4Smrg format != GL_ABGR_EXT && 7137117f1b4Smrg format != GL_LUMINANCE && 7147117f1b4Smrg format != GL_LUMINANCE_ALPHA) { 7157117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(format)"); 7167117f1b4Smrg } 7177117f1b4Smrg 7187117f1b4Smrg if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 7197117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(format or type)"); 7207117f1b4Smrg return; 7217117f1b4Smrg } 7227117f1b4Smrg 7234a49301eSmrg values = _mesa_map_validate_pbo_dest(ctx, 1, &ctx->Pack, 7244a49301eSmrg ctx->Histogram.Width, 1, 1, 7254a49301eSmrg format, type, values, 7264a49301eSmrg "glGetHistogram"); 7274a49301eSmrg if (!values) 7287117f1b4Smrg return; 7297117f1b4Smrg 7307117f1b4Smrg pack_histogram(ctx, ctx->Histogram.Width, 7317117f1b4Smrg (CONST GLuint (*)[4]) ctx->Histogram.Count, 7327117f1b4Smrg format, type, values, &ctx->Pack); 7337117f1b4Smrg 7344a49301eSmrg _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 7357117f1b4Smrg 7367117f1b4Smrg if (reset) { 7377117f1b4Smrg GLuint i; 7387117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 7397117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 7407117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 7417117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 7427117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 7437117f1b4Smrg } 7447117f1b4Smrg } 7457117f1b4Smrg} 7467117f1b4Smrg 7477117f1b4Smrg 7484a49301eSmrgstatic void GLAPIENTRY 7497117f1b4Smrg_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params) 7507117f1b4Smrg{ 7517117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7527117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 7537117f1b4Smrg 7547117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 7557117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameterfv"); 7567117f1b4Smrg return; 7577117f1b4Smrg } 7587117f1b4Smrg 7597117f1b4Smrg if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { 7607117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(target)"); 7617117f1b4Smrg return; 7627117f1b4Smrg } 7637117f1b4Smrg 7647117f1b4Smrg switch (pname) { 7657117f1b4Smrg case GL_HISTOGRAM_WIDTH: 7667117f1b4Smrg *params = (GLfloat) ctx->Histogram.Width; 7677117f1b4Smrg break; 7687117f1b4Smrg case GL_HISTOGRAM_FORMAT: 7697117f1b4Smrg *params = (GLfloat) ctx->Histogram.Format; 7707117f1b4Smrg break; 7717117f1b4Smrg case GL_HISTOGRAM_RED_SIZE: 7727117f1b4Smrg *params = (GLfloat) ctx->Histogram.RedSize; 7737117f1b4Smrg break; 7747117f1b4Smrg case GL_HISTOGRAM_GREEN_SIZE: 7757117f1b4Smrg *params = (GLfloat) ctx->Histogram.GreenSize; 7767117f1b4Smrg break; 7777117f1b4Smrg case GL_HISTOGRAM_BLUE_SIZE: 7787117f1b4Smrg *params = (GLfloat) ctx->Histogram.BlueSize; 7797117f1b4Smrg break; 7807117f1b4Smrg case GL_HISTOGRAM_ALPHA_SIZE: 7817117f1b4Smrg *params = (GLfloat) ctx->Histogram.AlphaSize; 7827117f1b4Smrg break; 7837117f1b4Smrg case GL_HISTOGRAM_LUMINANCE_SIZE: 7847117f1b4Smrg *params = (GLfloat) ctx->Histogram.LuminanceSize; 7857117f1b4Smrg break; 7867117f1b4Smrg case GL_HISTOGRAM_SINK: 7877117f1b4Smrg *params = (GLfloat) ctx->Histogram.Sink; 7887117f1b4Smrg break; 7897117f1b4Smrg default: 7907117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(pname)"); 7917117f1b4Smrg } 7927117f1b4Smrg} 7937117f1b4Smrg 7947117f1b4Smrg 7954a49301eSmrgstatic void GLAPIENTRY 7967117f1b4Smrg_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params) 7977117f1b4Smrg{ 7987117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7997117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 8007117f1b4Smrg 8017117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 8027117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameteriv"); 8037117f1b4Smrg return; 8047117f1b4Smrg } 8057117f1b4Smrg 8067117f1b4Smrg if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { 8077117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(target)"); 8087117f1b4Smrg return; 8097117f1b4Smrg } 8107117f1b4Smrg 8117117f1b4Smrg switch (pname) { 8127117f1b4Smrg case GL_HISTOGRAM_WIDTH: 8137117f1b4Smrg *params = (GLint) ctx->Histogram.Width; 8147117f1b4Smrg break; 8157117f1b4Smrg case GL_HISTOGRAM_FORMAT: 8167117f1b4Smrg *params = (GLint) ctx->Histogram.Format; 8177117f1b4Smrg break; 8187117f1b4Smrg case GL_HISTOGRAM_RED_SIZE: 8197117f1b4Smrg *params = (GLint) ctx->Histogram.RedSize; 8207117f1b4Smrg break; 8217117f1b4Smrg case GL_HISTOGRAM_GREEN_SIZE: 8227117f1b4Smrg *params = (GLint) ctx->Histogram.GreenSize; 8237117f1b4Smrg break; 8247117f1b4Smrg case GL_HISTOGRAM_BLUE_SIZE: 8257117f1b4Smrg *params = (GLint) ctx->Histogram.BlueSize; 8267117f1b4Smrg break; 8277117f1b4Smrg case GL_HISTOGRAM_ALPHA_SIZE: 8287117f1b4Smrg *params = (GLint) ctx->Histogram.AlphaSize; 8297117f1b4Smrg break; 8307117f1b4Smrg case GL_HISTOGRAM_LUMINANCE_SIZE: 8317117f1b4Smrg *params = (GLint) ctx->Histogram.LuminanceSize; 8327117f1b4Smrg break; 8337117f1b4Smrg case GL_HISTOGRAM_SINK: 8347117f1b4Smrg *params = (GLint) ctx->Histogram.Sink; 8357117f1b4Smrg break; 8367117f1b4Smrg default: 8377117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(pname)"); 8387117f1b4Smrg } 8397117f1b4Smrg} 8407117f1b4Smrg 8417117f1b4Smrg 8424a49301eSmrgstatic void GLAPIENTRY 8437117f1b4Smrg_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params) 8447117f1b4Smrg{ 8457117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 8467117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 8477117f1b4Smrg 8487117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 8497117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameterfv"); 8507117f1b4Smrg return; 8517117f1b4Smrg } 8527117f1b4Smrg if (target != GL_MINMAX) { 8537117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameterfv(target)"); 8547117f1b4Smrg return; 8557117f1b4Smrg } 8567117f1b4Smrg if (pname == GL_MINMAX_FORMAT) { 8577117f1b4Smrg *params = (GLfloat) ctx->MinMax.Format; 8587117f1b4Smrg } 8597117f1b4Smrg else if (pname == GL_MINMAX_SINK) { 8607117f1b4Smrg *params = (GLfloat) ctx->MinMax.Sink; 8617117f1b4Smrg } 8627117f1b4Smrg else { 8637117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameterfv(pname)"); 8647117f1b4Smrg } 8657117f1b4Smrg} 8667117f1b4Smrg 8677117f1b4Smrg 8684a49301eSmrgstatic void GLAPIENTRY 8697117f1b4Smrg_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params) 8707117f1b4Smrg{ 8717117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 8727117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 8737117f1b4Smrg 8747117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 8757117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameteriv"); 8767117f1b4Smrg return; 8777117f1b4Smrg } 8787117f1b4Smrg if (target != GL_MINMAX) { 8797117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameteriv(target)"); 8807117f1b4Smrg return; 8817117f1b4Smrg } 8827117f1b4Smrg if (pname == GL_MINMAX_FORMAT) { 8837117f1b4Smrg *params = (GLint) ctx->MinMax.Format; 8847117f1b4Smrg } 8857117f1b4Smrg else if (pname == GL_MINMAX_SINK) { 8867117f1b4Smrg *params = (GLint) ctx->MinMax.Sink; 8877117f1b4Smrg } 8887117f1b4Smrg else { 8897117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameteriv(pname)"); 8907117f1b4Smrg } 8917117f1b4Smrg} 8927117f1b4Smrg 8937117f1b4Smrg 8944a49301eSmrgstatic void GLAPIENTRY 8957117f1b4Smrg_mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink) 8967117f1b4Smrg{ 8977117f1b4Smrg GLuint i; 8987117f1b4Smrg GLboolean error = GL_FALSE; 8997117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9007117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */ 9017117f1b4Smrg 9027117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 9037117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glHistogram"); 9047117f1b4Smrg return; 9057117f1b4Smrg } 9067117f1b4Smrg 9077117f1b4Smrg if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { 9087117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(target)"); 9097117f1b4Smrg return; 9107117f1b4Smrg } 9117117f1b4Smrg 9127117f1b4Smrg if (width < 0 || width > HISTOGRAM_TABLE_SIZE) { 9137117f1b4Smrg if (target == GL_PROXY_HISTOGRAM) { 9147117f1b4Smrg error = GL_TRUE; 9157117f1b4Smrg } 9167117f1b4Smrg else { 9177117f1b4Smrg if (width < 0) 9187117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)"); 9197117f1b4Smrg else 9207117f1b4Smrg _mesa_error(ctx, GL_TABLE_TOO_LARGE, "glHistogram(width)"); 9217117f1b4Smrg return; 9227117f1b4Smrg } 9237117f1b4Smrg } 9247117f1b4Smrg 925c1f859d4Smrg if (width != 0 && !_mesa_is_pow_two(width)) { 9267117f1b4Smrg if (target == GL_PROXY_HISTOGRAM) { 9277117f1b4Smrg error = GL_TRUE; 9287117f1b4Smrg } 9297117f1b4Smrg else { 9307117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)"); 9317117f1b4Smrg return; 9327117f1b4Smrg } 9337117f1b4Smrg } 9347117f1b4Smrg 9357117f1b4Smrg if (base_histogram_format(internalFormat) < 0) { 9367117f1b4Smrg if (target == GL_PROXY_HISTOGRAM) { 9377117f1b4Smrg error = GL_TRUE; 9387117f1b4Smrg } 9397117f1b4Smrg else { 9407117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(internalFormat)"); 9417117f1b4Smrg return; 9427117f1b4Smrg } 9437117f1b4Smrg } 9447117f1b4Smrg 9454a49301eSmrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 9464a49301eSmrg 9477117f1b4Smrg /* reset histograms */ 9487117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 9497117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 9507117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 9517117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 9527117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 9537117f1b4Smrg } 9547117f1b4Smrg 9557117f1b4Smrg if (error) { 9567117f1b4Smrg ctx->Histogram.Width = 0; 9577117f1b4Smrg ctx->Histogram.Format = 0; 9587117f1b4Smrg ctx->Histogram.RedSize = 0; 9597117f1b4Smrg ctx->Histogram.GreenSize = 0; 9607117f1b4Smrg ctx->Histogram.BlueSize = 0; 9617117f1b4Smrg ctx->Histogram.AlphaSize = 0; 9627117f1b4Smrg ctx->Histogram.LuminanceSize = 0; 9637117f1b4Smrg } 9647117f1b4Smrg else { 9657117f1b4Smrg ctx->Histogram.Width = width; 9667117f1b4Smrg ctx->Histogram.Format = internalFormat; 9677117f1b4Smrg ctx->Histogram.Sink = sink; 9687117f1b4Smrg ctx->Histogram.RedSize = 8 * sizeof(GLuint); 9697117f1b4Smrg ctx->Histogram.GreenSize = 8 * sizeof(GLuint); 9707117f1b4Smrg ctx->Histogram.BlueSize = 8 * sizeof(GLuint); 9717117f1b4Smrg ctx->Histogram.AlphaSize = 8 * sizeof(GLuint); 9727117f1b4Smrg ctx->Histogram.LuminanceSize = 8 * sizeof(GLuint); 9737117f1b4Smrg } 9747117f1b4Smrg} 9757117f1b4Smrg 9767117f1b4Smrg 9774a49301eSmrgstatic void GLAPIENTRY 9787117f1b4Smrg_mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) 9797117f1b4Smrg{ 9807117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9817117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 9827117f1b4Smrg 9837117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 9847117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glMinmax"); 9857117f1b4Smrg return; 9867117f1b4Smrg } 9877117f1b4Smrg 9887117f1b4Smrg if (target != GL_MINMAX) { 9897117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(target)"); 9907117f1b4Smrg return; 9917117f1b4Smrg } 9927117f1b4Smrg 9937117f1b4Smrg if (base_histogram_format(internalFormat) < 0) { 9947117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(internalFormat)"); 9957117f1b4Smrg return; 9967117f1b4Smrg } 9977117f1b4Smrg 9987117f1b4Smrg if (ctx->MinMax.Sink == sink) 9997117f1b4Smrg return; 10007117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 10017117f1b4Smrg ctx->MinMax.Sink = sink; 10027117f1b4Smrg} 10037117f1b4Smrg 10047117f1b4Smrg 10054a49301eSmrgstatic void GLAPIENTRY 10067117f1b4Smrg_mesa_ResetHistogram(GLenum target) 10077117f1b4Smrg{ 10087117f1b4Smrg GLuint i; 10097117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10107117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */ 10117117f1b4Smrg 10127117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 10137117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glResetHistogram"); 10147117f1b4Smrg return; 10157117f1b4Smrg } 10167117f1b4Smrg 10177117f1b4Smrg if (target != GL_HISTOGRAM) { 10187117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glResetHistogram(target)"); 10197117f1b4Smrg return; 10207117f1b4Smrg } 10217117f1b4Smrg 10227117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 10237117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 10247117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 10257117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 10267117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 10277117f1b4Smrg } 10287117f1b4Smrg} 10297117f1b4Smrg 10307117f1b4Smrg 10314a49301eSmrgstatic void GLAPIENTRY 10327117f1b4Smrg_mesa_ResetMinmax(GLenum target) 10337117f1b4Smrg{ 10347117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10357117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10367117f1b4Smrg 10377117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 10387117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glResetMinmax"); 10397117f1b4Smrg return; 10407117f1b4Smrg } 10417117f1b4Smrg 10427117f1b4Smrg if (target != GL_MINMAX) { 10437117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glResetMinMax(target)"); 10447117f1b4Smrg return; 10457117f1b4Smrg } 10467117f1b4Smrg 10477117f1b4Smrg ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000; 10487117f1b4Smrg ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000; 10497117f1b4Smrg ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000; 10507117f1b4Smrg ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000; 10517117f1b4Smrg} 10527117f1b4Smrg 10537117f1b4Smrg 10544a49301eSmrgvoid 10554a49301eSmrg_mesa_init_histogram_dispatch(struct _glapi_table *disp) 10564a49301eSmrg{ 10574a49301eSmrg SET_GetHistogram(disp, _mesa_GetHistogram); 10584a49301eSmrg SET_GetHistogramParameterfv(disp, _mesa_GetHistogramParameterfv); 10594a49301eSmrg SET_GetHistogramParameteriv(disp, _mesa_GetHistogramParameteriv); 10604a49301eSmrg SET_GetMinmax(disp, _mesa_GetMinmax); 10614a49301eSmrg SET_GetMinmaxParameterfv(disp, _mesa_GetMinmaxParameterfv); 10624a49301eSmrg SET_GetMinmaxParameteriv(disp, _mesa_GetMinmaxParameteriv); 10634a49301eSmrg SET_Histogram(disp, _mesa_Histogram); 10644a49301eSmrg SET_Minmax(disp, _mesa_Minmax); 10654a49301eSmrg SET_ResetHistogram(disp, _mesa_ResetHistogram); 10664a49301eSmrg SET_ResetMinmax(disp, _mesa_ResetMinmax); 10674a49301eSmrg} 10684a49301eSmrg 10694a49301eSmrg 10704a49301eSmrg#endif /* FEATURE_histogram */ 10714a49301eSmrg 10727117f1b4Smrg 10737117f1b4Smrg/**********************************************************************/ 10747117f1b4Smrg/***** Initialization *****/ 10757117f1b4Smrg/**********************************************************************/ 10767117f1b4Smrg 10777117f1b4Smrgvoid _mesa_init_histogram( GLcontext * ctx ) 10787117f1b4Smrg{ 10797117f1b4Smrg int i; 10807117f1b4Smrg 10817117f1b4Smrg /* Histogram group */ 10827117f1b4Smrg ctx->Histogram.Width = 0; 10837117f1b4Smrg ctx->Histogram.Format = GL_RGBA; 10847117f1b4Smrg ctx->Histogram.Sink = GL_FALSE; 10857117f1b4Smrg ctx->Histogram.RedSize = 0; 10867117f1b4Smrg ctx->Histogram.GreenSize = 0; 10877117f1b4Smrg ctx->Histogram.BlueSize = 0; 10887117f1b4Smrg ctx->Histogram.AlphaSize = 0; 10897117f1b4Smrg ctx->Histogram.LuminanceSize = 0; 10907117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 10917117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 10927117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 10937117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 10947117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 10957117f1b4Smrg } 10967117f1b4Smrg 10977117f1b4Smrg /* Min/Max group */ 10987117f1b4Smrg ctx->MinMax.Format = GL_RGBA; 10997117f1b4Smrg ctx->MinMax.Sink = GL_FALSE; 11007117f1b4Smrg ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000; 11017117f1b4Smrg ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000; 11027117f1b4Smrg ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000; 11037117f1b4Smrg ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000; 11047117f1b4Smrg} 1105