histogram.c revision c1f859d4
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" 327117f1b4Smrg 337117f1b4Smrg 347117f1b4Smrg 357117f1b4Smrg/* 367117f1b4Smrg * XXX the packed pixel formats haven't been tested. 377117f1b4Smrg */ 387117f1b4Smrgstatic void 397117f1b4Smrgpack_histogram( GLcontext *ctx, 407117f1b4Smrg GLuint n, CONST GLuint rgba[][4], 417117f1b4Smrg GLenum format, GLenum type, GLvoid *destination, 427117f1b4Smrg const struct gl_pixelstore_attrib *packing ) 437117f1b4Smrg{ 447117f1b4Smrg const GLint comps = _mesa_components_in_format(format); 457117f1b4Smrg GLuint luminance[MAX_WIDTH]; 467117f1b4Smrg 477117f1b4Smrg if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) { 487117f1b4Smrg GLuint i; 497117f1b4Smrg for (i = 0; i < n; i++) { 507117f1b4Smrg luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 517117f1b4Smrg } 527117f1b4Smrg } 537117f1b4Smrg 547117f1b4Smrg#define PACK_MACRO(TYPE) \ 557117f1b4Smrg { \ 567117f1b4Smrg GLuint i; \ 577117f1b4Smrg switch (format) { \ 587117f1b4Smrg case GL_RED: \ 597117f1b4Smrg for (i=0;i<n;i++) \ 607117f1b4Smrg dst[i] = (TYPE) rgba[i][RCOMP]; \ 617117f1b4Smrg break; \ 627117f1b4Smrg case GL_GREEN: \ 637117f1b4Smrg for (i=0;i<n;i++) \ 647117f1b4Smrg dst[i] = (TYPE) rgba[i][GCOMP]; \ 657117f1b4Smrg break; \ 667117f1b4Smrg case GL_BLUE: \ 677117f1b4Smrg for (i=0;i<n;i++) \ 687117f1b4Smrg dst[i] = (TYPE) rgba[i][BCOMP]; \ 697117f1b4Smrg break; \ 707117f1b4Smrg case GL_ALPHA: \ 717117f1b4Smrg for (i=0;i<n;i++) \ 727117f1b4Smrg dst[i] = (TYPE) rgba[i][ACOMP]; \ 737117f1b4Smrg break; \ 747117f1b4Smrg case GL_LUMINANCE: \ 757117f1b4Smrg for (i=0;i<n;i++) \ 767117f1b4Smrg dst[i] = (TYPE) luminance[i]; \ 777117f1b4Smrg break; \ 787117f1b4Smrg case GL_LUMINANCE_ALPHA: \ 797117f1b4Smrg for (i=0;i<n;i++) { \ 807117f1b4Smrg dst[i*2+0] = (TYPE) luminance[i]; \ 817117f1b4Smrg dst[i*2+1] = (TYPE) rgba[i][ACOMP]; \ 827117f1b4Smrg } \ 837117f1b4Smrg break; \ 847117f1b4Smrg case GL_RGB: \ 857117f1b4Smrg for (i=0;i<n;i++) { \ 867117f1b4Smrg dst[i*3+0] = (TYPE) rgba[i][RCOMP]; \ 877117f1b4Smrg dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \ 887117f1b4Smrg dst[i*3+2] = (TYPE) rgba[i][BCOMP]; \ 897117f1b4Smrg } \ 907117f1b4Smrg break; \ 917117f1b4Smrg case GL_RGBA: \ 927117f1b4Smrg for (i=0;i<n;i++) { \ 937117f1b4Smrg dst[i*4+0] = (TYPE) rgba[i][RCOMP]; \ 947117f1b4Smrg dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \ 957117f1b4Smrg dst[i*4+2] = (TYPE) rgba[i][BCOMP]; \ 967117f1b4Smrg dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \ 977117f1b4Smrg } \ 987117f1b4Smrg break; \ 997117f1b4Smrg case GL_BGR: \ 1007117f1b4Smrg for (i=0;i<n;i++) { \ 1017117f1b4Smrg dst[i*3+0] = (TYPE) rgba[i][BCOMP]; \ 1027117f1b4Smrg dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \ 1037117f1b4Smrg dst[i*3+2] = (TYPE) rgba[i][RCOMP]; \ 1047117f1b4Smrg } \ 1057117f1b4Smrg break; \ 1067117f1b4Smrg case GL_BGRA: \ 1077117f1b4Smrg for (i=0;i<n;i++) { \ 1087117f1b4Smrg dst[i*4+0] = (TYPE) rgba[i][BCOMP]; \ 1097117f1b4Smrg dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \ 1107117f1b4Smrg dst[i*4+2] = (TYPE) rgba[i][RCOMP]; \ 1117117f1b4Smrg dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \ 1127117f1b4Smrg } \ 1137117f1b4Smrg break; \ 1147117f1b4Smrg case GL_ABGR_EXT: \ 1157117f1b4Smrg for (i=0;i<n;i++) { \ 1167117f1b4Smrg dst[i*4+0] = (TYPE) rgba[i][ACOMP]; \ 1177117f1b4Smrg dst[i*4+1] = (TYPE) rgba[i][BCOMP]; \ 1187117f1b4Smrg dst[i*4+2] = (TYPE) rgba[i][GCOMP]; \ 1197117f1b4Smrg dst[i*4+3] = (TYPE) rgba[i][RCOMP]; \ 1207117f1b4Smrg } \ 1217117f1b4Smrg break; \ 1227117f1b4Smrg default: \ 1237117f1b4Smrg _mesa_problem(ctx, "bad format in pack_histogram"); \ 1247117f1b4Smrg } \ 1257117f1b4Smrg } 1267117f1b4Smrg 1277117f1b4Smrg switch (type) { 1287117f1b4Smrg case GL_UNSIGNED_BYTE: 1297117f1b4Smrg { 1307117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 1317117f1b4Smrg PACK_MACRO(GLubyte); 1327117f1b4Smrg } 1337117f1b4Smrg break; 1347117f1b4Smrg case GL_BYTE: 1357117f1b4Smrg { 1367117f1b4Smrg GLbyte *dst = (GLbyte *) destination; 1377117f1b4Smrg PACK_MACRO(GLbyte); 1387117f1b4Smrg } 1397117f1b4Smrg break; 1407117f1b4Smrg case GL_UNSIGNED_SHORT: 1417117f1b4Smrg { 1427117f1b4Smrg GLushort *dst = (GLushort *) destination; 1437117f1b4Smrg PACK_MACRO(GLushort); 1447117f1b4Smrg if (packing->SwapBytes) { 1457117f1b4Smrg _mesa_swap2(dst, n * comps); 1467117f1b4Smrg } 1477117f1b4Smrg } 1487117f1b4Smrg break; 1497117f1b4Smrg case GL_SHORT: 1507117f1b4Smrg { 1517117f1b4Smrg GLshort *dst = (GLshort *) destination; 1527117f1b4Smrg PACK_MACRO(GLshort); 1537117f1b4Smrg if (packing->SwapBytes) { 1547117f1b4Smrg _mesa_swap2((GLushort *) dst, n * comps); 1557117f1b4Smrg } 1567117f1b4Smrg } 1577117f1b4Smrg break; 1587117f1b4Smrg case GL_UNSIGNED_INT: 1597117f1b4Smrg { 1607117f1b4Smrg GLuint *dst = (GLuint *) destination; 1617117f1b4Smrg PACK_MACRO(GLuint); 1627117f1b4Smrg if (packing->SwapBytes) { 1637117f1b4Smrg _mesa_swap4(dst, n * comps); 1647117f1b4Smrg } 1657117f1b4Smrg } 1667117f1b4Smrg break; 1677117f1b4Smrg case GL_INT: 1687117f1b4Smrg { 1697117f1b4Smrg GLint *dst = (GLint *) destination; 1707117f1b4Smrg PACK_MACRO(GLint); 1717117f1b4Smrg if (packing->SwapBytes) { 1727117f1b4Smrg _mesa_swap4((GLuint *) dst, n * comps); 1737117f1b4Smrg } 1747117f1b4Smrg } 1757117f1b4Smrg break; 1767117f1b4Smrg case GL_FLOAT: 1777117f1b4Smrg { 1787117f1b4Smrg GLfloat *dst = (GLfloat *) destination; 1797117f1b4Smrg PACK_MACRO(GLfloat); 1807117f1b4Smrg if (packing->SwapBytes) { 1817117f1b4Smrg _mesa_swap4((GLuint *) dst, n * comps); 1827117f1b4Smrg } 1837117f1b4Smrg } 1847117f1b4Smrg break; 1857117f1b4Smrg case GL_HALF_FLOAT_ARB: 1867117f1b4Smrg { 1877117f1b4Smrg /* temporarily store as GLuints */ 1887117f1b4Smrg GLuint temp[4*HISTOGRAM_TABLE_SIZE]; 1897117f1b4Smrg GLhalfARB *dst = (GLhalfARB *) destination; 1907117f1b4Smrg GLuint i; 1917117f1b4Smrg /* get GLuint values */ 1927117f1b4Smrg PACK_MACRO(GLuint); 1937117f1b4Smrg /* convert to GLhalf */ 1947117f1b4Smrg for (i = 0; i < n * comps; i++) { 1957117f1b4Smrg dst[i] = _mesa_float_to_half((GLfloat) temp[i]); 1967117f1b4Smrg } 1977117f1b4Smrg if (packing->SwapBytes) { 1987117f1b4Smrg _mesa_swap2((GLushort *) dst, n * comps); 1997117f1b4Smrg } 2007117f1b4Smrg } 2017117f1b4Smrg break; 2027117f1b4Smrg case GL_UNSIGNED_BYTE_3_3_2: 2037117f1b4Smrg if (format == GL_RGB) { 2047117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2057117f1b4Smrg GLuint i; 2067117f1b4Smrg for (i = 0; i < n; i++) { 2077117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x7) << 5) 2087117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 2) 2097117f1b4Smrg | ((rgba[i][BCOMP] & 0x3) ); 2107117f1b4Smrg } 2117117f1b4Smrg } 2127117f1b4Smrg else { 2137117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2147117f1b4Smrg GLuint i; 2157117f1b4Smrg ASSERT(format == GL_BGR); 2167117f1b4Smrg for (i = 0; i < n; i++) { 2177117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x7) << 5) 2187117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 2) 2197117f1b4Smrg | ((rgba[i][RCOMP] & 0x3) ); 2207117f1b4Smrg } 2217117f1b4Smrg } 2227117f1b4Smrg break; 2237117f1b4Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 2247117f1b4Smrg if (format == GL_RGB) { 2257117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2267117f1b4Smrg GLuint i; 2277117f1b4Smrg for (i = 0; i < n; i++) { 2287117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x3) << 6) 2297117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 3) 2307117f1b4Smrg | ((rgba[i][BCOMP] & 0x7) ); 2317117f1b4Smrg } 2327117f1b4Smrg } 2337117f1b4Smrg else { 2347117f1b4Smrg GLubyte *dst = (GLubyte *) destination; 2357117f1b4Smrg GLuint i; 2367117f1b4Smrg ASSERT(format == GL_BGR); 2377117f1b4Smrg for (i = 0; i < n; i++) { 2387117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x3) << 6) 2397117f1b4Smrg | ((rgba[i][GCOMP] & 0x7) << 3) 2407117f1b4Smrg | ((rgba[i][RCOMP] & 0x7) ); 2417117f1b4Smrg } 2427117f1b4Smrg } 2437117f1b4Smrg break; 2447117f1b4Smrg case GL_UNSIGNED_SHORT_5_6_5: 2457117f1b4Smrg if (format == GL_RGB) { 2467117f1b4Smrg GLushort *dst = (GLushort *) destination; 2477117f1b4Smrg GLuint i; 2487117f1b4Smrg for (i = 0; i < n; i++) { 2497117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 2507117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2517117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) ); 2527117f1b4Smrg } 2537117f1b4Smrg } 2547117f1b4Smrg else { 2557117f1b4Smrg GLushort *dst = (GLushort *) destination; 2567117f1b4Smrg GLuint i; 2577117f1b4Smrg ASSERT(format == GL_BGR); 2587117f1b4Smrg for (i = 0; i < n; i++) { 2597117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) 2607117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2617117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) ); 2627117f1b4Smrg } 2637117f1b4Smrg } 2647117f1b4Smrg break; 2657117f1b4Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 2667117f1b4Smrg if (format == GL_RGB) { 2677117f1b4Smrg GLushort *dst = (GLushort *) destination; 2687117f1b4Smrg GLuint i; 2697117f1b4Smrg for (i = 0; i < n; i++) { 2707117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) 2717117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2727117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) ); 2737117f1b4Smrg } 2747117f1b4Smrg } 2757117f1b4Smrg else { 2767117f1b4Smrg GLushort *dst = (GLushort *) destination; 2777117f1b4Smrg GLuint i; 2787117f1b4Smrg ASSERT(format == GL_BGR); 2797117f1b4Smrg for (i = 0; i < n; i++) { 2807117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 2817117f1b4Smrg | ((rgba[i][GCOMP] & 0x3f) << 5) 2827117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) ); 2837117f1b4Smrg } 2847117f1b4Smrg } 2857117f1b4Smrg break; 2867117f1b4Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 2877117f1b4Smrg if (format == GL_RGBA) { 2887117f1b4Smrg GLushort *dst = (GLushort *) destination; 2897117f1b4Smrg GLuint i; 2907117f1b4Smrg for (i = 0; i < n; i++) { 2917117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xf) << 12) 2927117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 8) 2937117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 4) 2947117f1b4Smrg | ((rgba[i][ACOMP] & 0xf) ); 2957117f1b4Smrg } 2967117f1b4Smrg } 2977117f1b4Smrg else if (format == GL_BGRA) { 2987117f1b4Smrg GLushort *dst = (GLushort *) destination; 2997117f1b4Smrg GLuint i; 3007117f1b4Smrg for (i = 0; i < n; i++) { 3017117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0xf) << 12) 3027117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 8) 3037117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) << 4) 3047117f1b4Smrg | ((rgba[i][ACOMP] & 0xf) ); 3057117f1b4Smrg } 3067117f1b4Smrg } 3077117f1b4Smrg else { 3087117f1b4Smrg GLushort *dst = (GLushort *) destination; 3097117f1b4Smrg GLuint i; 3107117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 3117117f1b4Smrg for (i = 0; i < n; i++) { 3127117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) 3137117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 8) 3147117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 4) 3157117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) ); 3167117f1b4Smrg } 3177117f1b4Smrg } 3187117f1b4Smrg break; 3197117f1b4Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3207117f1b4Smrg if (format == GL_RGBA) { 3217117f1b4Smrg GLushort *dst = (GLushort *) destination; 3227117f1b4Smrg GLuint i; 3237117f1b4Smrg for (i = 0; i < n; i++) { 3247117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) 3257117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 8) 3267117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 4) 3277117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) ); 3287117f1b4Smrg } 3297117f1b4Smrg } 3307117f1b4Smrg else if (format == GL_BGRA) { 3317117f1b4Smrg GLushort *dst = (GLushort *) destination; 3327117f1b4Smrg GLuint i; 3337117f1b4Smrg for (i = 0; i < n; i++) { 3347117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) 3357117f1b4Smrg | ((rgba[i][RCOMP] & 0xf) << 8) 3367117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 4) 3377117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) ); 3387117f1b4Smrg } 3397117f1b4Smrg } 3407117f1b4Smrg else { 3417117f1b4Smrg GLushort *dst = (GLushort *) destination; 3427117f1b4Smrg GLuint i; 3437117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 3447117f1b4Smrg for (i = 0; i < n; i++) { 3457117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xf) << 12) 3467117f1b4Smrg | ((rgba[i][GCOMP] & 0xf) << 8) 3477117f1b4Smrg | ((rgba[i][BCOMP] & 0xf) << 4) 3487117f1b4Smrg | ((rgba[i][ACOMP] & 0xf) ); 3497117f1b4Smrg } 3507117f1b4Smrg } 3517117f1b4Smrg break; 3527117f1b4Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 3537117f1b4Smrg if (format == GL_RGBA) { 3547117f1b4Smrg GLushort *dst = (GLushort *) destination; 3557117f1b4Smrg GLuint i; 3567117f1b4Smrg for (i = 0; i < n; i++) { 3577117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 3587117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 6) 3597117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 1) 3607117f1b4Smrg | ((rgba[i][ACOMP] & 0x1) ); 3617117f1b4Smrg } 3627117f1b4Smrg } 3637117f1b4Smrg else if (format == GL_BGRA) { 3647117f1b4Smrg GLushort *dst = (GLushort *) destination; 3657117f1b4Smrg GLuint i; 3667117f1b4Smrg for (i = 0; i < n; i++) { 3677117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) 3687117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 6) 3697117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) << 1) 3707117f1b4Smrg | ((rgba[i][ACOMP] & 0x1) ); 3717117f1b4Smrg } 3727117f1b4Smrg } 3737117f1b4Smrg else { 3747117f1b4Smrg GLushort *dst = (GLushort *) destination; 3757117f1b4Smrg GLuint i; 3767117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 3777117f1b4Smrg for (i = 0; i < n; i++) { 3787117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) 3797117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 6) 3807117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 1) 3817117f1b4Smrg | ((rgba[i][RCOMP] & 0x1) ); 3827117f1b4Smrg } 3837117f1b4Smrg } 3847117f1b4Smrg break; 3857117f1b4Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3867117f1b4Smrg if (format == GL_RGBA) { 3877117f1b4Smrg GLushort *dst = (GLushort *) destination; 3887117f1b4Smrg GLuint i; 3897117f1b4Smrg for (i = 0; i < n; i++) { 3907117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) 3917117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 6) 3927117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 1) 3937117f1b4Smrg | ((rgba[i][RCOMP] & 0x1) ); 3947117f1b4Smrg } 3957117f1b4Smrg } 3967117f1b4Smrg else if (format == GL_BGRA) { 3977117f1b4Smrg GLushort *dst = (GLushort *) destination; 3987117f1b4Smrg GLuint i; 3997117f1b4Smrg for (i = 0; i < n; i++) { 4007117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) 4017117f1b4Smrg | ((rgba[i][RCOMP] & 0x1f) << 6) 4027117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 1) 4037117f1b4Smrg | ((rgba[i][BCOMP] & 0x1) ); 4047117f1b4Smrg } 4057117f1b4Smrg } 4067117f1b4Smrg else { 4077117f1b4Smrg GLushort *dst = (GLushort *) destination; 4087117f1b4Smrg GLuint i; 4097117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 4107117f1b4Smrg for (i = 0; i < n; i++) { 4117117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) 4127117f1b4Smrg | ((rgba[i][GCOMP] & 0x1f) << 6) 4137117f1b4Smrg | ((rgba[i][BCOMP] & 0x1f) << 1) 4147117f1b4Smrg | ((rgba[i][ACOMP] & 0x1) ); 4157117f1b4Smrg } 4167117f1b4Smrg } 4177117f1b4Smrg break; 4187117f1b4Smrg case GL_UNSIGNED_INT_8_8_8_8: 4197117f1b4Smrg if (format == GL_RGBA) { 4207117f1b4Smrg GLuint *dst = (GLuint *) destination; 4217117f1b4Smrg GLuint i; 4227117f1b4Smrg for (i = 0; i < n; i++) { 4237117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xff) << 24) 4247117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 16) 4257117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 8) 4267117f1b4Smrg | ((rgba[i][ACOMP] & 0xff) ); 4277117f1b4Smrg } 4287117f1b4Smrg } 4297117f1b4Smrg else if (format == GL_BGRA) { 4307117f1b4Smrg GLuint *dst = (GLuint *) destination; 4317117f1b4Smrg GLuint i; 4327117f1b4Smrg for (i = 0; i < n; i++) { 4337117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0xff) << 24) 4347117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 16) 4357117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) << 8) 4367117f1b4Smrg | ((rgba[i][ACOMP] & 0xff) ); 4377117f1b4Smrg } 4387117f1b4Smrg } 4397117f1b4Smrg else { 4407117f1b4Smrg GLuint *dst = (GLuint *) destination; 4417117f1b4Smrg GLuint i; 4427117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 4437117f1b4Smrg for (i = 0; i < n; i++) { 4447117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) 4457117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 16) 4467117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 8) 4477117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) ); 4487117f1b4Smrg } 4497117f1b4Smrg } 4507117f1b4Smrg break; 4517117f1b4Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 4527117f1b4Smrg if (format == GL_RGBA) { 4537117f1b4Smrg GLuint *dst = (GLuint *) destination; 4547117f1b4Smrg GLuint i; 4557117f1b4Smrg for (i = 0; i < n; i++) { 4567117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) 4577117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 16) 4587117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 8) 4597117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) ); 4607117f1b4Smrg } 4617117f1b4Smrg } 4627117f1b4Smrg else if (format == GL_BGRA) { 4637117f1b4Smrg GLuint *dst = (GLuint *) destination; 4647117f1b4Smrg GLuint i; 4657117f1b4Smrg for (i = 0; i < n; i++) { 4667117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) 4677117f1b4Smrg | ((rgba[i][RCOMP] & 0xff) << 16) 4687117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 8) 4697117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) ); 4707117f1b4Smrg } 4717117f1b4Smrg } 4727117f1b4Smrg else { 4737117f1b4Smrg GLuint *dst = (GLuint *) destination; 4747117f1b4Smrg GLuint i; 4757117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 4767117f1b4Smrg for (i = 0; i < n; i++) { 4777117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0xff) << 24) 4787117f1b4Smrg | ((rgba[i][GCOMP] & 0xff) << 16) 4797117f1b4Smrg | ((rgba[i][BCOMP] & 0xff) << 8) 4807117f1b4Smrg | ((rgba[i][ACOMP] & 0xff) ); 4817117f1b4Smrg } 4827117f1b4Smrg } 4837117f1b4Smrg break; 4847117f1b4Smrg case GL_UNSIGNED_INT_10_10_10_2: 4857117f1b4Smrg if (format == GL_RGBA) { 4867117f1b4Smrg GLuint *dst = (GLuint *) destination; 4877117f1b4Smrg GLuint i; 4887117f1b4Smrg for (i = 0; i < n; i++) { 4897117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22) 4907117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 12) 4917117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 2) 4927117f1b4Smrg | ((rgba[i][ACOMP] & 0x3) ); 4937117f1b4Smrg } 4947117f1b4Smrg } 4957117f1b4Smrg else if (format == GL_BGRA) { 4967117f1b4Smrg GLuint *dst = (GLuint *) destination; 4977117f1b4Smrg GLuint i; 4987117f1b4Smrg for (i = 0; i < n; i++) { 4997117f1b4Smrg dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22) 5007117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 12) 5017117f1b4Smrg | ((rgba[i][RCOMP] & 0x3ff) << 2) 5027117f1b4Smrg | ((rgba[i][ACOMP] & 0x3) ); 5037117f1b4Smrg } 5047117f1b4Smrg } 5057117f1b4Smrg else { 5067117f1b4Smrg GLuint *dst = (GLuint *) destination; 5077117f1b4Smrg GLuint i; 5087117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 5097117f1b4Smrg for (i = 0; i < n; i++) { 5107117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) 5117117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 12) 5127117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 2) 5137117f1b4Smrg | ((rgba[i][RCOMP] & 0x3) ); 5147117f1b4Smrg } 5157117f1b4Smrg } 5167117f1b4Smrg break; 5177117f1b4Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 5187117f1b4Smrg if (format == GL_RGBA) { 5197117f1b4Smrg GLuint *dst = (GLuint *) destination; 5207117f1b4Smrg GLuint i; 5217117f1b4Smrg for (i = 0; i < n; i++) { 5227117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) 5237117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 12) 5247117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 2) 5257117f1b4Smrg | ((rgba[i][RCOMP] & 0x3) ); 5267117f1b4Smrg } 5277117f1b4Smrg } 5287117f1b4Smrg else if (format == GL_BGRA) { 5297117f1b4Smrg GLuint *dst = (GLuint *) destination; 5307117f1b4Smrg GLuint i; 5317117f1b4Smrg for (i = 0; i < n; i++) { 5327117f1b4Smrg dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) 5337117f1b4Smrg | ((rgba[i][RCOMP] & 0x3ff) << 12) 5347117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 2) 5357117f1b4Smrg | ((rgba[i][BCOMP] & 0x3) ); 5367117f1b4Smrg } 5377117f1b4Smrg } 5387117f1b4Smrg else { 5397117f1b4Smrg GLuint *dst = (GLuint *) destination; 5407117f1b4Smrg GLuint i; 5417117f1b4Smrg ASSERT(format == GL_ABGR_EXT); 5427117f1b4Smrg for (i = 0; i < n; i++) { 5437117f1b4Smrg dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22) 5447117f1b4Smrg | ((rgba[i][GCOMP] & 0x3ff) << 12) 5457117f1b4Smrg | ((rgba[i][BCOMP] & 0x3ff) << 2) 5467117f1b4Smrg | ((rgba[i][ACOMP] & 0x3) ); 5477117f1b4Smrg } 5487117f1b4Smrg } 5497117f1b4Smrg break; 5507117f1b4Smrg default: 5517117f1b4Smrg _mesa_problem(ctx, "Bad type in pack_histogram"); 5527117f1b4Smrg } 5537117f1b4Smrg 5547117f1b4Smrg#undef PACK_MACRO 5557117f1b4Smrg} 5567117f1b4Smrg 5577117f1b4Smrg 5587117f1b4Smrg/* 5597117f1b4Smrg * Given an internalFormat token passed to glHistogram or glMinMax, 5607117f1b4Smrg * return the corresponding base format. 5617117f1b4Smrg * Return -1 if invalid token. 5627117f1b4Smrg */ 5637117f1b4Smrgstatic GLint 5647117f1b4Smrgbase_histogram_format( GLenum format ) 5657117f1b4Smrg{ 5667117f1b4Smrg switch (format) { 5677117f1b4Smrg case GL_ALPHA: 5687117f1b4Smrg case GL_ALPHA4: 5697117f1b4Smrg case GL_ALPHA8: 5707117f1b4Smrg case GL_ALPHA12: 5717117f1b4Smrg case GL_ALPHA16: 5727117f1b4Smrg return GL_ALPHA; 5737117f1b4Smrg case GL_LUMINANCE: 5747117f1b4Smrg case GL_LUMINANCE4: 5757117f1b4Smrg case GL_LUMINANCE8: 5767117f1b4Smrg case GL_LUMINANCE12: 5777117f1b4Smrg case GL_LUMINANCE16: 5787117f1b4Smrg return GL_LUMINANCE; 5797117f1b4Smrg case GL_LUMINANCE_ALPHA: 5807117f1b4Smrg case GL_LUMINANCE4_ALPHA4: 5817117f1b4Smrg case GL_LUMINANCE6_ALPHA2: 5827117f1b4Smrg case GL_LUMINANCE8_ALPHA8: 5837117f1b4Smrg case GL_LUMINANCE12_ALPHA4: 5847117f1b4Smrg case GL_LUMINANCE12_ALPHA12: 5857117f1b4Smrg case GL_LUMINANCE16_ALPHA16: 5867117f1b4Smrg return GL_LUMINANCE_ALPHA; 5877117f1b4Smrg case GL_RGB: 5887117f1b4Smrg case GL_R3_G3_B2: 5897117f1b4Smrg case GL_RGB4: 5907117f1b4Smrg case GL_RGB5: 5917117f1b4Smrg case GL_RGB8: 5927117f1b4Smrg case GL_RGB10: 5937117f1b4Smrg case GL_RGB12: 5947117f1b4Smrg case GL_RGB16: 5957117f1b4Smrg return GL_RGB; 5967117f1b4Smrg case GL_RGBA: 5977117f1b4Smrg case GL_RGBA2: 5987117f1b4Smrg case GL_RGBA4: 5997117f1b4Smrg case GL_RGB5_A1: 6007117f1b4Smrg case GL_RGBA8: 6017117f1b4Smrg case GL_RGB10_A2: 6027117f1b4Smrg case GL_RGBA12: 6037117f1b4Smrg case GL_RGBA16: 6047117f1b4Smrg return GL_RGBA; 6057117f1b4Smrg default: 6067117f1b4Smrg return -1; /* error */ 6077117f1b4Smrg } 6087117f1b4Smrg} 6097117f1b4Smrg 6107117f1b4Smrg 6117117f1b4Smrg 6127117f1b4Smrg/********************************************************************** 6137117f1b4Smrg * API functions 6147117f1b4Smrg */ 6157117f1b4Smrg 6167117f1b4Smrg 6177117f1b4Smrgvoid GLAPIENTRY 6187117f1b4Smrg_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) 6197117f1b4Smrg{ 6207117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6217117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 6227117f1b4Smrg 6237117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 6247117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax"); 6257117f1b4Smrg return; 6267117f1b4Smrg } 6277117f1b4Smrg 6287117f1b4Smrg if (target != GL_MINMAX) { 6297117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmax(target)"); 6307117f1b4Smrg return; 6317117f1b4Smrg } 6327117f1b4Smrg 6337117f1b4Smrg if (format != GL_RED && 6347117f1b4Smrg format != GL_GREEN && 6357117f1b4Smrg format != GL_BLUE && 6367117f1b4Smrg format != GL_ALPHA && 6377117f1b4Smrg format != GL_RGB && 6387117f1b4Smrg format != GL_BGR && 6397117f1b4Smrg format != GL_RGBA && 6407117f1b4Smrg format != GL_BGRA && 6417117f1b4Smrg format != GL_ABGR_EXT && 6427117f1b4Smrg format != GL_LUMINANCE && 6437117f1b4Smrg format != GL_LUMINANCE_ALPHA) { 6447117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMax(format)"); 6457117f1b4Smrg } 6467117f1b4Smrg 6477117f1b4Smrg if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 6487117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax(format or type)"); 6497117f1b4Smrg return; 6507117f1b4Smrg } 6517117f1b4Smrg 6527117f1b4Smrg if (ctx->Pack.BufferObj->Name) { 6537117f1b4Smrg /* pack min/max values into a PBO */ 6547117f1b4Smrg GLubyte *buf; 6557117f1b4Smrg if (!_mesa_validate_pbo_access(1, &ctx->Pack, 2, 1, 1, 6567117f1b4Smrg format, type, values)) { 6577117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, 6587117f1b4Smrg "glGetMinMax(invalid PBO access)"); 6597117f1b4Smrg return; 6607117f1b4Smrg } 6617117f1b4Smrg buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, 6627117f1b4Smrg GL_WRITE_ONLY_ARB, 6637117f1b4Smrg ctx->Pack.BufferObj); 6647117f1b4Smrg if (!buf) { 6657117f1b4Smrg /* buffer is already mapped - that's an error */ 6667117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION,"glGetMinMax(PBO is mapped)"); 6677117f1b4Smrg return; 6687117f1b4Smrg } 6697117f1b4Smrg values = ADD_POINTERS(buf, values); 6707117f1b4Smrg } 6717117f1b4Smrg else if (!values) { 6727117f1b4Smrg /* not an error */ 6737117f1b4Smrg return; 6747117f1b4Smrg } 6757117f1b4Smrg 6767117f1b4Smrg { 6777117f1b4Smrg GLfloat minmax[2][4]; 6787117f1b4Smrg minmax[0][RCOMP] = CLAMP(ctx->MinMax.Min[RCOMP], 0.0F, 1.0F); 6797117f1b4Smrg minmax[0][GCOMP] = CLAMP(ctx->MinMax.Min[GCOMP], 0.0F, 1.0F); 6807117f1b4Smrg minmax[0][BCOMP] = CLAMP(ctx->MinMax.Min[BCOMP], 0.0F, 1.0F); 6817117f1b4Smrg minmax[0][ACOMP] = CLAMP(ctx->MinMax.Min[ACOMP], 0.0F, 1.0F); 6827117f1b4Smrg minmax[1][RCOMP] = CLAMP(ctx->MinMax.Max[RCOMP], 0.0F, 1.0F); 6837117f1b4Smrg minmax[1][GCOMP] = CLAMP(ctx->MinMax.Max[GCOMP], 0.0F, 1.0F); 6847117f1b4Smrg minmax[1][BCOMP] = CLAMP(ctx->MinMax.Max[BCOMP], 0.0F, 1.0F); 6857117f1b4Smrg minmax[1][ACOMP] = CLAMP(ctx->MinMax.Max[ACOMP], 0.0F, 1.0F); 6867117f1b4Smrg _mesa_pack_rgba_span_float(ctx, 2, minmax, 6877117f1b4Smrg format, type, values, &ctx->Pack, 0x0); 6887117f1b4Smrg } 6897117f1b4Smrg 6907117f1b4Smrg if (ctx->Pack.BufferObj->Name) { 6917117f1b4Smrg ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, 6927117f1b4Smrg ctx->Pack.BufferObj); 6937117f1b4Smrg } 6947117f1b4Smrg 6957117f1b4Smrg if (reset) { 6967117f1b4Smrg _mesa_ResetMinmax(GL_MINMAX); 6977117f1b4Smrg } 6987117f1b4Smrg} 6997117f1b4Smrg 7007117f1b4Smrg 7017117f1b4Smrgvoid GLAPIENTRY 7027117f1b4Smrg_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) 7037117f1b4Smrg{ 7047117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7057117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 7067117f1b4Smrg 7077117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 7087117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram"); 7097117f1b4Smrg return; 7107117f1b4Smrg } 7117117f1b4Smrg 7127117f1b4Smrg if (target != GL_HISTOGRAM) { 7137117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(target)"); 7147117f1b4Smrg return; 7157117f1b4Smrg } 7167117f1b4Smrg 7177117f1b4Smrg if (format != GL_RED && 7187117f1b4Smrg format != GL_GREEN && 7197117f1b4Smrg format != GL_BLUE && 7207117f1b4Smrg format != GL_ALPHA && 7217117f1b4Smrg format != GL_RGB && 7227117f1b4Smrg format != GL_BGR && 7237117f1b4Smrg format != GL_RGBA && 7247117f1b4Smrg format != GL_BGRA && 7257117f1b4Smrg format != GL_ABGR_EXT && 7267117f1b4Smrg format != GL_LUMINANCE && 7277117f1b4Smrg format != GL_LUMINANCE_ALPHA) { 7287117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(format)"); 7297117f1b4Smrg } 7307117f1b4Smrg 7317117f1b4Smrg if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 7327117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(format or type)"); 7337117f1b4Smrg return; 7347117f1b4Smrg } 7357117f1b4Smrg 7367117f1b4Smrg if (ctx->Pack.BufferObj->Name) { 7377117f1b4Smrg /* pack min/max values into a PBO */ 7387117f1b4Smrg GLubyte *buf; 7397117f1b4Smrg if (!_mesa_validate_pbo_access(1, &ctx->Pack, ctx->Histogram.Width, 1, 1, 7407117f1b4Smrg format, type, values)) { 7417117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, 7427117f1b4Smrg "glGetHistogram(invalid PBO access)"); 7437117f1b4Smrg return; 7447117f1b4Smrg } 7457117f1b4Smrg buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, 7467117f1b4Smrg GL_WRITE_ONLY_ARB, 7477117f1b4Smrg ctx->Pack.BufferObj); 7487117f1b4Smrg if (!buf) { 7497117f1b4Smrg /* buffer is already mapped - that's an error */ 7507117f1b4Smrg _mesa_error(ctx,GL_INVALID_OPERATION,"glGetHistogram(PBO is mapped)"); 7517117f1b4Smrg return; 7527117f1b4Smrg } 7537117f1b4Smrg values = ADD_POINTERS(buf, values); 7547117f1b4Smrg } 7557117f1b4Smrg else if (!values) { 7567117f1b4Smrg /* not an error */ 7577117f1b4Smrg return; 7587117f1b4Smrg } 7597117f1b4Smrg 7607117f1b4Smrg pack_histogram(ctx, ctx->Histogram.Width, 7617117f1b4Smrg (CONST GLuint (*)[4]) ctx->Histogram.Count, 7627117f1b4Smrg format, type, values, &ctx->Pack); 7637117f1b4Smrg 7647117f1b4Smrg if (ctx->Pack.BufferObj->Name) { 7657117f1b4Smrg ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, 7667117f1b4Smrg ctx->Pack.BufferObj); 7677117f1b4Smrg } 7687117f1b4Smrg 7697117f1b4Smrg if (reset) { 7707117f1b4Smrg GLuint i; 7717117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 7727117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 7737117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 7747117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 7757117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 7767117f1b4Smrg } 7777117f1b4Smrg } 7787117f1b4Smrg} 7797117f1b4Smrg 7807117f1b4Smrg 7817117f1b4Smrgvoid GLAPIENTRY 7827117f1b4Smrg_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params) 7837117f1b4Smrg{ 7847117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7857117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 7867117f1b4Smrg 7877117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 7887117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameterfv"); 7897117f1b4Smrg return; 7907117f1b4Smrg } 7917117f1b4Smrg 7927117f1b4Smrg if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { 7937117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(target)"); 7947117f1b4Smrg return; 7957117f1b4Smrg } 7967117f1b4Smrg 7977117f1b4Smrg switch (pname) { 7987117f1b4Smrg case GL_HISTOGRAM_WIDTH: 7997117f1b4Smrg *params = (GLfloat) ctx->Histogram.Width; 8007117f1b4Smrg break; 8017117f1b4Smrg case GL_HISTOGRAM_FORMAT: 8027117f1b4Smrg *params = (GLfloat) ctx->Histogram.Format; 8037117f1b4Smrg break; 8047117f1b4Smrg case GL_HISTOGRAM_RED_SIZE: 8057117f1b4Smrg *params = (GLfloat) ctx->Histogram.RedSize; 8067117f1b4Smrg break; 8077117f1b4Smrg case GL_HISTOGRAM_GREEN_SIZE: 8087117f1b4Smrg *params = (GLfloat) ctx->Histogram.GreenSize; 8097117f1b4Smrg break; 8107117f1b4Smrg case GL_HISTOGRAM_BLUE_SIZE: 8117117f1b4Smrg *params = (GLfloat) ctx->Histogram.BlueSize; 8127117f1b4Smrg break; 8137117f1b4Smrg case GL_HISTOGRAM_ALPHA_SIZE: 8147117f1b4Smrg *params = (GLfloat) ctx->Histogram.AlphaSize; 8157117f1b4Smrg break; 8167117f1b4Smrg case GL_HISTOGRAM_LUMINANCE_SIZE: 8177117f1b4Smrg *params = (GLfloat) ctx->Histogram.LuminanceSize; 8187117f1b4Smrg break; 8197117f1b4Smrg case GL_HISTOGRAM_SINK: 8207117f1b4Smrg *params = (GLfloat) ctx->Histogram.Sink; 8217117f1b4Smrg break; 8227117f1b4Smrg default: 8237117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(pname)"); 8247117f1b4Smrg } 8257117f1b4Smrg} 8267117f1b4Smrg 8277117f1b4Smrg 8287117f1b4Smrgvoid GLAPIENTRY 8297117f1b4Smrg_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params) 8307117f1b4Smrg{ 8317117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 8327117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 8337117f1b4Smrg 8347117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 8357117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameteriv"); 8367117f1b4Smrg return; 8377117f1b4Smrg } 8387117f1b4Smrg 8397117f1b4Smrg if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { 8407117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(target)"); 8417117f1b4Smrg return; 8427117f1b4Smrg } 8437117f1b4Smrg 8447117f1b4Smrg switch (pname) { 8457117f1b4Smrg case GL_HISTOGRAM_WIDTH: 8467117f1b4Smrg *params = (GLint) ctx->Histogram.Width; 8477117f1b4Smrg break; 8487117f1b4Smrg case GL_HISTOGRAM_FORMAT: 8497117f1b4Smrg *params = (GLint) ctx->Histogram.Format; 8507117f1b4Smrg break; 8517117f1b4Smrg case GL_HISTOGRAM_RED_SIZE: 8527117f1b4Smrg *params = (GLint) ctx->Histogram.RedSize; 8537117f1b4Smrg break; 8547117f1b4Smrg case GL_HISTOGRAM_GREEN_SIZE: 8557117f1b4Smrg *params = (GLint) ctx->Histogram.GreenSize; 8567117f1b4Smrg break; 8577117f1b4Smrg case GL_HISTOGRAM_BLUE_SIZE: 8587117f1b4Smrg *params = (GLint) ctx->Histogram.BlueSize; 8597117f1b4Smrg break; 8607117f1b4Smrg case GL_HISTOGRAM_ALPHA_SIZE: 8617117f1b4Smrg *params = (GLint) ctx->Histogram.AlphaSize; 8627117f1b4Smrg break; 8637117f1b4Smrg case GL_HISTOGRAM_LUMINANCE_SIZE: 8647117f1b4Smrg *params = (GLint) ctx->Histogram.LuminanceSize; 8657117f1b4Smrg break; 8667117f1b4Smrg case GL_HISTOGRAM_SINK: 8677117f1b4Smrg *params = (GLint) ctx->Histogram.Sink; 8687117f1b4Smrg break; 8697117f1b4Smrg default: 8707117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(pname)"); 8717117f1b4Smrg } 8727117f1b4Smrg} 8737117f1b4Smrg 8747117f1b4Smrg 8757117f1b4Smrgvoid GLAPIENTRY 8767117f1b4Smrg_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params) 8777117f1b4Smrg{ 8787117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 8797117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 8807117f1b4Smrg 8817117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 8827117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameterfv"); 8837117f1b4Smrg return; 8847117f1b4Smrg } 8857117f1b4Smrg if (target != GL_MINMAX) { 8867117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameterfv(target)"); 8877117f1b4Smrg return; 8887117f1b4Smrg } 8897117f1b4Smrg if (pname == GL_MINMAX_FORMAT) { 8907117f1b4Smrg *params = (GLfloat) ctx->MinMax.Format; 8917117f1b4Smrg } 8927117f1b4Smrg else if (pname == GL_MINMAX_SINK) { 8937117f1b4Smrg *params = (GLfloat) ctx->MinMax.Sink; 8947117f1b4Smrg } 8957117f1b4Smrg else { 8967117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameterfv(pname)"); 8977117f1b4Smrg } 8987117f1b4Smrg} 8997117f1b4Smrg 9007117f1b4Smrg 9017117f1b4Smrgvoid GLAPIENTRY 9027117f1b4Smrg_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params) 9037117f1b4Smrg{ 9047117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9057117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 9067117f1b4Smrg 9077117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 9087117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameteriv"); 9097117f1b4Smrg return; 9107117f1b4Smrg } 9117117f1b4Smrg if (target != GL_MINMAX) { 9127117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameteriv(target)"); 9137117f1b4Smrg return; 9147117f1b4Smrg } 9157117f1b4Smrg if (pname == GL_MINMAX_FORMAT) { 9167117f1b4Smrg *params = (GLint) ctx->MinMax.Format; 9177117f1b4Smrg } 9187117f1b4Smrg else if (pname == GL_MINMAX_SINK) { 9197117f1b4Smrg *params = (GLint) ctx->MinMax.Sink; 9207117f1b4Smrg } 9217117f1b4Smrg else { 9227117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameteriv(pname)"); 9237117f1b4Smrg } 9247117f1b4Smrg} 9257117f1b4Smrg 9267117f1b4Smrg 9277117f1b4Smrgvoid GLAPIENTRY 9287117f1b4Smrg_mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink) 9297117f1b4Smrg{ 9307117f1b4Smrg GLuint i; 9317117f1b4Smrg GLboolean error = GL_FALSE; 9327117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9337117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */ 9347117f1b4Smrg 9357117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 9367117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glHistogram"); 9377117f1b4Smrg return; 9387117f1b4Smrg } 9397117f1b4Smrg 9407117f1b4Smrg if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { 9417117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(target)"); 9427117f1b4Smrg return; 9437117f1b4Smrg } 9447117f1b4Smrg 9457117f1b4Smrg if (width < 0 || width > HISTOGRAM_TABLE_SIZE) { 9467117f1b4Smrg if (target == GL_PROXY_HISTOGRAM) { 9477117f1b4Smrg error = GL_TRUE; 9487117f1b4Smrg } 9497117f1b4Smrg else { 9507117f1b4Smrg if (width < 0) 9517117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)"); 9527117f1b4Smrg else 9537117f1b4Smrg _mesa_error(ctx, GL_TABLE_TOO_LARGE, "glHistogram(width)"); 9547117f1b4Smrg return; 9557117f1b4Smrg } 9567117f1b4Smrg } 9577117f1b4Smrg 958c1f859d4Smrg if (width != 0 && !_mesa_is_pow_two(width)) { 9597117f1b4Smrg if (target == GL_PROXY_HISTOGRAM) { 9607117f1b4Smrg error = GL_TRUE; 9617117f1b4Smrg } 9627117f1b4Smrg else { 9637117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)"); 9647117f1b4Smrg return; 9657117f1b4Smrg } 9667117f1b4Smrg } 9677117f1b4Smrg 9687117f1b4Smrg if (base_histogram_format(internalFormat) < 0) { 9697117f1b4Smrg if (target == GL_PROXY_HISTOGRAM) { 9707117f1b4Smrg error = GL_TRUE; 9717117f1b4Smrg } 9727117f1b4Smrg else { 9737117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(internalFormat)"); 9747117f1b4Smrg return; 9757117f1b4Smrg } 9767117f1b4Smrg } 9777117f1b4Smrg 9787117f1b4Smrg /* reset histograms */ 9797117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 9807117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 9817117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 9827117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 9837117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 9847117f1b4Smrg } 9857117f1b4Smrg 9867117f1b4Smrg if (error) { 9877117f1b4Smrg ctx->Histogram.Width = 0; 9887117f1b4Smrg ctx->Histogram.Format = 0; 9897117f1b4Smrg ctx->Histogram.RedSize = 0; 9907117f1b4Smrg ctx->Histogram.GreenSize = 0; 9917117f1b4Smrg ctx->Histogram.BlueSize = 0; 9927117f1b4Smrg ctx->Histogram.AlphaSize = 0; 9937117f1b4Smrg ctx->Histogram.LuminanceSize = 0; 9947117f1b4Smrg } 9957117f1b4Smrg else { 9967117f1b4Smrg ctx->Histogram.Width = width; 9977117f1b4Smrg ctx->Histogram.Format = internalFormat; 9987117f1b4Smrg ctx->Histogram.Sink = sink; 9997117f1b4Smrg ctx->Histogram.RedSize = 8 * sizeof(GLuint); 10007117f1b4Smrg ctx->Histogram.GreenSize = 8 * sizeof(GLuint); 10017117f1b4Smrg ctx->Histogram.BlueSize = 8 * sizeof(GLuint); 10027117f1b4Smrg ctx->Histogram.AlphaSize = 8 * sizeof(GLuint); 10037117f1b4Smrg ctx->Histogram.LuminanceSize = 8 * sizeof(GLuint); 10047117f1b4Smrg } 10057117f1b4Smrg 10067117f1b4Smrg ctx->NewState |= _NEW_PIXEL; 10077117f1b4Smrg} 10087117f1b4Smrg 10097117f1b4Smrg 10107117f1b4Smrgvoid GLAPIENTRY 10117117f1b4Smrg_mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) 10127117f1b4Smrg{ 10137117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10147117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 10157117f1b4Smrg 10167117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 10177117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glMinmax"); 10187117f1b4Smrg return; 10197117f1b4Smrg } 10207117f1b4Smrg 10217117f1b4Smrg if (target != GL_MINMAX) { 10227117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(target)"); 10237117f1b4Smrg return; 10247117f1b4Smrg } 10257117f1b4Smrg 10267117f1b4Smrg if (base_histogram_format(internalFormat) < 0) { 10277117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(internalFormat)"); 10287117f1b4Smrg return; 10297117f1b4Smrg } 10307117f1b4Smrg 10317117f1b4Smrg if (ctx->MinMax.Sink == sink) 10327117f1b4Smrg return; 10337117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 10347117f1b4Smrg ctx->MinMax.Sink = sink; 10357117f1b4Smrg} 10367117f1b4Smrg 10377117f1b4Smrg 10387117f1b4Smrgvoid GLAPIENTRY 10397117f1b4Smrg_mesa_ResetHistogram(GLenum target) 10407117f1b4Smrg{ 10417117f1b4Smrg GLuint i; 10427117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10437117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */ 10447117f1b4Smrg 10457117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 10467117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glResetHistogram"); 10477117f1b4Smrg return; 10487117f1b4Smrg } 10497117f1b4Smrg 10507117f1b4Smrg if (target != GL_HISTOGRAM) { 10517117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glResetHistogram(target)"); 10527117f1b4Smrg return; 10537117f1b4Smrg } 10547117f1b4Smrg 10557117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 10567117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 10577117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 10587117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 10597117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 10607117f1b4Smrg } 10617117f1b4Smrg 10627117f1b4Smrg ctx->NewState |= _NEW_PIXEL; 10637117f1b4Smrg} 10647117f1b4Smrg 10657117f1b4Smrg 10667117f1b4Smrgvoid GLAPIENTRY 10677117f1b4Smrg_mesa_ResetMinmax(GLenum target) 10687117f1b4Smrg{ 10697117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10707117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10717117f1b4Smrg 10727117f1b4Smrg if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { 10737117f1b4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glResetMinmax"); 10747117f1b4Smrg return; 10757117f1b4Smrg } 10767117f1b4Smrg 10777117f1b4Smrg if (target != GL_MINMAX) { 10787117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glResetMinMax(target)"); 10797117f1b4Smrg return; 10807117f1b4Smrg } 10817117f1b4Smrg 10827117f1b4Smrg ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000; 10837117f1b4Smrg ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000; 10847117f1b4Smrg ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000; 10857117f1b4Smrg ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000; 10867117f1b4Smrg ctx->NewState |= _NEW_PIXEL; 10877117f1b4Smrg} 10887117f1b4Smrg 10897117f1b4Smrg 10907117f1b4Smrg 10917117f1b4Smrg/**********************************************************************/ 10927117f1b4Smrg/***** Initialization *****/ 10937117f1b4Smrg/**********************************************************************/ 10947117f1b4Smrg 10957117f1b4Smrgvoid _mesa_init_histogram( GLcontext * ctx ) 10967117f1b4Smrg{ 10977117f1b4Smrg int i; 10987117f1b4Smrg 10997117f1b4Smrg /* Histogram group */ 11007117f1b4Smrg ctx->Histogram.Width = 0; 11017117f1b4Smrg ctx->Histogram.Format = GL_RGBA; 11027117f1b4Smrg ctx->Histogram.Sink = GL_FALSE; 11037117f1b4Smrg ctx->Histogram.RedSize = 0; 11047117f1b4Smrg ctx->Histogram.GreenSize = 0; 11057117f1b4Smrg ctx->Histogram.BlueSize = 0; 11067117f1b4Smrg ctx->Histogram.AlphaSize = 0; 11077117f1b4Smrg ctx->Histogram.LuminanceSize = 0; 11087117f1b4Smrg for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { 11097117f1b4Smrg ctx->Histogram.Count[i][0] = 0; 11107117f1b4Smrg ctx->Histogram.Count[i][1] = 0; 11117117f1b4Smrg ctx->Histogram.Count[i][2] = 0; 11127117f1b4Smrg ctx->Histogram.Count[i][3] = 0; 11137117f1b4Smrg } 11147117f1b4Smrg 11157117f1b4Smrg /* Min/Max group */ 11167117f1b4Smrg ctx->MinMax.Format = GL_RGBA; 11177117f1b4Smrg ctx->MinMax.Sink = GL_FALSE; 11187117f1b4Smrg ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000; 11197117f1b4Smrg ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000; 11207117f1b4Smrg ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000; 11217117f1b4Smrg ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000; 11227117f1b4Smrg} 1123