singlepix.c revision 7e31ba66
14642e01fSmrg/* 24642e01fSmrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 34642e01fSmrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 44642e01fSmrg * 54642e01fSmrg * Permission is hereby granted, free of charge, to any person obtaining a 64642e01fSmrg * copy of this software and associated documentation files (the "Software"), 74642e01fSmrg * to deal in the Software without restriction, including without limitation 84642e01fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 94642e01fSmrg * and/or sell copies of the Software, and to permit persons to whom the 104642e01fSmrg * Software is furnished to do so, subject to the following conditions: 114642e01fSmrg * 124642e01fSmrg * The above copyright notice including the dates of first publication and 134642e01fSmrg * either this permission notice or a reference to 144642e01fSmrg * http://oss.sgi.com/projects/FreeB/ 154642e01fSmrg * shall be included in all copies or substantial portions of the Software. 164642e01fSmrg * 174642e01fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 184642e01fSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 194642e01fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 204642e01fSmrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 214642e01fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 224642e01fSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 234642e01fSmrg * SOFTWARE. 244642e01fSmrg * 254642e01fSmrg * Except as contained in this notice, the name of Silicon Graphics, Inc. 264642e01fSmrg * shall not be used in advertising or otherwise to promote the sale, use or 274642e01fSmrg * other dealings in this Software without prior written authorization from 284642e01fSmrg * Silicon Graphics, Inc. 294642e01fSmrg */ 304642e01fSmrg 314642e01fSmrg#ifdef HAVE_DIX_CONFIG_H 324642e01fSmrg#include <dix-config.h> 334642e01fSmrg#endif 344642e01fSmrg 354642e01fSmrg#include "glxserver.h" 364642e01fSmrg#include "glxext.h" 374642e01fSmrg#include "singlesize.h" 384642e01fSmrg#include "unpack.h" 394642e01fSmrg#include "indirect_size_get.h" 404642e01fSmrg#include "indirect_dispatch.h" 414642e01fSmrg 42f7df2e56Smrgint 43f7df2e56Smrg__glXDisp_ReadPixels(__GLXclientState * cl, GLbyte * pc) 444642e01fSmrg{ 454642e01fSmrg GLsizei width, height; 464642e01fSmrg GLenum format, type; 474642e01fSmrg GLboolean swapBytes, lsbFirst; 484642e01fSmrg GLint compsize; 494642e01fSmrg __GLXcontext *cx; 504642e01fSmrg ClientPtr client = cl->client; 514642e01fSmrg int error; 524642e01fSmrg char *answer, answerBuffer[200]; 537e31ba66Smrg xGLXSingleReply reply = { 0, }; 544642e01fSmrg 550b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 28); 560b0d8713Smrg 574642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 584642e01fSmrg if (!cx) { 59f7df2e56Smrg return error; 604642e01fSmrg } 614642e01fSmrg 624642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 63f7df2e56Smrg width = *(GLsizei *) (pc + 8); 64f7df2e56Smrg height = *(GLsizei *) (pc + 12); 65f7df2e56Smrg format = *(GLenum *) (pc + 16); 66f7df2e56Smrg type = *(GLenum *) (pc + 20); 67f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 24); 68f7df2e56Smrg lsbFirst = *(GLboolean *) (pc + 25); 69f7df2e56Smrg compsize = __glReadPixels_size(format, type, width, height); 700b0d8713Smrg if (compsize < 0) 710b0d8713Smrg return BadLength; 724642e01fSmrg 73f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 74f7df2e56Smrg glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst); 75f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 764642e01fSmrg __glXClearErrorOccured(); 77f7df2e56Smrg glReadPixels(*(GLint *) (pc + 0), *(GLint *) (pc + 4), 78f7df2e56Smrg *(GLsizei *) (pc + 8), *(GLsizei *) (pc + 12), 79f7df2e56Smrg *(GLenum *) (pc + 16), *(GLenum *) (pc + 20), answer); 804642e01fSmrg 814642e01fSmrg if (__glXErrorOccured()) { 82f7df2e56Smrg __GLX_BEGIN_REPLY(0); 83f7df2e56Smrg __GLX_SEND_HEADER(); 844642e01fSmrg } 85f7df2e56Smrg else { 86f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 87f7df2e56Smrg __GLX_SEND_HEADER(); 88f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 89f7df2e56Smrg } 904642e01fSmrg return Success; 914642e01fSmrg} 924642e01fSmrg 93f7df2e56Smrgint 94f7df2e56Smrg__glXDisp_GetTexImage(__GLXclientState * cl, GLbyte * pc) 954642e01fSmrg{ 964642e01fSmrg GLint level, compsize; 974642e01fSmrg GLenum format, type, target; 984642e01fSmrg GLboolean swapBytes; 994642e01fSmrg __GLXcontext *cx; 1004642e01fSmrg ClientPtr client = cl->client; 1014642e01fSmrg int error; 1024642e01fSmrg char *answer, answerBuffer[200]; 103f7df2e56Smrg GLint width = 0, height = 0, depth = 1; 1047e31ba66Smrg xGLXSingleReply reply = { 0, }; 105f7df2e56Smrg 106f7df2e56Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 20); 1074642e01fSmrg 1080b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 20); 1090b0d8713Smrg 1104642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 1114642e01fSmrg if (!cx) { 112f7df2e56Smrg return error; 1134642e01fSmrg } 1144642e01fSmrg 1154642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 116f7df2e56Smrg level = *(GLint *) (pc + 4); 117f7df2e56Smrg format = *(GLenum *) (pc + 8); 118f7df2e56Smrg type = *(GLenum *) (pc + 12); 119f7df2e56Smrg target = *(GLenum *) (pc + 0); 120f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 16); 121f7df2e56Smrg 122f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width); 123f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height); 124f7df2e56Smrg if (target == GL_TEXTURE_3D) { 125f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_DEPTH, &depth); 1264642e01fSmrg } 1274642e01fSmrg /* 1284642e01fSmrg * The three queries above might fail if we're in a state where queries 1294642e01fSmrg * are illegal, but then width, height, and depth would still be zero anyway. 1304642e01fSmrg */ 131f7df2e56Smrg compsize = 132f7df2e56Smrg __glGetTexImage_size(target, level, format, type, width, height, depth); 1330b0d8713Smrg if (compsize < 0) 1340b0d8713Smrg return BadLength; 1354642e01fSmrg 136f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 137f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 1384642e01fSmrg __glXClearErrorOccured(); 139f7df2e56Smrg glGetTexImage(*(GLenum *) (pc + 0), *(GLint *) (pc + 4), 140f7df2e56Smrg *(GLenum *) (pc + 8), *(GLenum *) (pc + 12), answer); 1414642e01fSmrg 1424642e01fSmrg if (__glXErrorOccured()) { 143f7df2e56Smrg __GLX_BEGIN_REPLY(0); 144f7df2e56Smrg __GLX_SEND_HEADER(); 145f7df2e56Smrg } 146f7df2e56Smrg else { 147f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 1487e31ba66Smrg ((xGLXGetTexImageReply *) &reply)->width = width; 1497e31ba66Smrg ((xGLXGetTexImageReply *) &reply)->height = height; 1507e31ba66Smrg ((xGLXGetTexImageReply *) &reply)->depth = depth; 151f7df2e56Smrg __GLX_SEND_HEADER(); 152f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 1534642e01fSmrg } 1544642e01fSmrg return Success; 1554642e01fSmrg} 1564642e01fSmrg 157f7df2e56Smrgint 158f7df2e56Smrg__glXDisp_GetPolygonStipple(__GLXclientState * cl, GLbyte * pc) 1594642e01fSmrg{ 1604642e01fSmrg GLboolean lsbFirst; 1614642e01fSmrg __GLXcontext *cx; 1624642e01fSmrg ClientPtr client = cl->client; 1634642e01fSmrg int error; 1644642e01fSmrg GLubyte answerBuffer[200]; 1654642e01fSmrg char *answer; 1667e31ba66Smrg xGLXSingleReply reply = { 0, }; 1674642e01fSmrg 1680b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 4); 1690b0d8713Smrg 1704642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 1714642e01fSmrg if (!cx) { 172f7df2e56Smrg return error; 1734642e01fSmrg } 1744642e01fSmrg 1754642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 176f7df2e56Smrg lsbFirst = *(GLboolean *) (pc + 0); 1774642e01fSmrg 178f7df2e56Smrg glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst); 179f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, 128, 1); 1804642e01fSmrg 1814642e01fSmrg __glXClearErrorOccured(); 182f7df2e56Smrg glGetPolygonStipple((GLubyte *) answer); 1834642e01fSmrg 1844642e01fSmrg if (__glXErrorOccured()) { 185f7df2e56Smrg __GLX_BEGIN_REPLY(0); 186f7df2e56Smrg __GLX_SEND_HEADER(); 187f7df2e56Smrg } 188f7df2e56Smrg else { 189f7df2e56Smrg __GLX_BEGIN_REPLY(128); 190f7df2e56Smrg __GLX_SEND_HEADER(); 191f7df2e56Smrg __GLX_SEND_BYTE_ARRAY(128); 1924642e01fSmrg } 1934642e01fSmrg return Success; 1944642e01fSmrg} 1954642e01fSmrg 196f7df2e56Smrgstatic int 197f7df2e56SmrgGetSeparableFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 1984642e01fSmrg{ 1994642e01fSmrg GLint compsize, compsize2; 2004642e01fSmrg GLenum format, type, target; 2014642e01fSmrg GLboolean swapBytes; 2024642e01fSmrg __GLXcontext *cx; 2034642e01fSmrg ClientPtr client = cl->client; 2044642e01fSmrg int error; 2054642e01fSmrg char *answer, answerBuffer[200]; 206f7df2e56Smrg GLint width = 0, height = 0; 2077e31ba66Smrg xGLXSingleReply reply = { 0, }; 2084642e01fSmrg 2094642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 2104642e01fSmrg if (!cx) { 211f7df2e56Smrg return error; 2124642e01fSmrg } 2134642e01fSmrg 214f7df2e56Smrg format = *(GLenum *) (pc + 4); 215f7df2e56Smrg type = *(GLenum *) (pc + 8); 216f7df2e56Smrg target = *(GLenum *) (pc + 0); 217f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 2184642e01fSmrg 2194642e01fSmrg /* target must be SEPARABLE_2D, however I guess we can let the GL 2204642e01fSmrg barf on this one.... */ 2214642e01fSmrg 222f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width); 223f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height); 2244642e01fSmrg /* 2254642e01fSmrg * The two queries above might fail if we're in a state where queries 2264642e01fSmrg * are illegal, but then width and height would still be zero anyway. 2274642e01fSmrg */ 228f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 229f7df2e56Smrg compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); 2304642e01fSmrg 2310b0d8713Smrg if ((compsize = safe_pad(compsize)) < 0) 2320b0d8713Smrg return BadLength; 2330b0d8713Smrg if ((compsize2 = safe_pad(compsize2)) < 0) 2340b0d8713Smrg return BadLength; 2354642e01fSmrg 236f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 2370b0d8713Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1); 2384642e01fSmrg __glXClearErrorOccured(); 239f7df2e56Smrg glGetSeparableFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 240f7df2e56Smrg *(GLenum *) (pc + 8), answer, answer + compsize, NULL); 2414642e01fSmrg 2424642e01fSmrg if (__glXErrorOccured()) { 243f7df2e56Smrg __GLX_BEGIN_REPLY(0); 244f7df2e56Smrg __GLX_SEND_HEADER(); 245f7df2e56Smrg } 246f7df2e56Smrg else { 247f7df2e56Smrg __GLX_BEGIN_REPLY(compsize + compsize2); 2487e31ba66Smrg ((xGLXGetSeparableFilterReply *) &reply)->width = width; 2497e31ba66Smrg ((xGLXGetSeparableFilterReply *) &reply)->height = height; 250f7df2e56Smrg __GLX_SEND_HEADER(); 251f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize + compsize2); 2524642e01fSmrg } 2534642e01fSmrg 2544642e01fSmrg return Success; 2554642e01fSmrg} 2564642e01fSmrg 257f7df2e56Smrgint 258f7df2e56Smrg__glXDisp_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc) 2594642e01fSmrg{ 2604642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 2610b0d8713Smrg ClientPtr client = cl->client; 2620b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 2634642e01fSmrg return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 2644642e01fSmrg} 2654642e01fSmrg 266f7df2e56Smrgint 267f7df2e56Smrg__glXDisp_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc) 2684642e01fSmrg{ 2694642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 2700b0d8713Smrg ClientPtr client = cl->client; 2710b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 2724642e01fSmrg return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 2734642e01fSmrg} 2744642e01fSmrg 275f7df2e56Smrgstatic int 276f7df2e56SmrgGetConvolutionFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 2774642e01fSmrg{ 2784642e01fSmrg GLint compsize; 2794642e01fSmrg GLenum format, type, target; 2804642e01fSmrg GLboolean swapBytes; 2814642e01fSmrg __GLXcontext *cx; 2824642e01fSmrg ClientPtr client = cl->client; 2834642e01fSmrg int error; 2844642e01fSmrg char *answer, answerBuffer[200]; 285f7df2e56Smrg GLint width = 0, height = 0; 2867e31ba66Smrg xGLXSingleReply reply = { 0, }; 2874642e01fSmrg 2884642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 2894642e01fSmrg if (!cx) { 290f7df2e56Smrg return error; 2914642e01fSmrg } 2924642e01fSmrg 293f7df2e56Smrg format = *(GLenum *) (pc + 4); 294f7df2e56Smrg type = *(GLenum *) (pc + 8); 295f7df2e56Smrg target = *(GLenum *) (pc + 0); 296f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 2974642e01fSmrg 298f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width); 2994642e01fSmrg if (target == GL_CONVOLUTION_1D) { 3004642e01fSmrg height = 1; 301f7df2e56Smrg } 302f7df2e56Smrg else { 303f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height); 3044642e01fSmrg } 3054642e01fSmrg /* 3064642e01fSmrg * The two queries above might fail if we're in a state where queries 3074642e01fSmrg * are illegal, but then width and height would still be zero anyway. 3084642e01fSmrg */ 309f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, height, 1); 3100b0d8713Smrg if (compsize < 0) 3110b0d8713Smrg return BadLength; 3124642e01fSmrg 313f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 314f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 3154642e01fSmrg __glXClearErrorOccured(); 316f7df2e56Smrg glGetConvolutionFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 317f7df2e56Smrg *(GLenum *) (pc + 8), answer); 3184642e01fSmrg 3194642e01fSmrg if (__glXErrorOccured()) { 320f7df2e56Smrg __GLX_BEGIN_REPLY(0); 321f7df2e56Smrg __GLX_SEND_HEADER(); 322f7df2e56Smrg } 323f7df2e56Smrg else { 324f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 3257e31ba66Smrg ((xGLXGetConvolutionFilterReply *) &reply)->width = width; 3267e31ba66Smrg ((xGLXGetConvolutionFilterReply *) &reply)->height = height; 327f7df2e56Smrg __GLX_SEND_HEADER(); 328f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 3294642e01fSmrg } 3304642e01fSmrg 3314642e01fSmrg return Success; 3324642e01fSmrg} 3334642e01fSmrg 334f7df2e56Smrgint 335f7df2e56Smrg__glXDisp_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc) 3364642e01fSmrg{ 3374642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 3380b0d8713Smrg ClientPtr client = cl->client; 3390b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 3404642e01fSmrg return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 3414642e01fSmrg} 3424642e01fSmrg 343f7df2e56Smrgint 344f7df2e56Smrg__glXDisp_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc) 3454642e01fSmrg{ 3464642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 3470b0d8713Smrg ClientPtr client = cl->client; 3480b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 3494642e01fSmrg return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 3504642e01fSmrg} 3514642e01fSmrg 352f7df2e56Smrgstatic int 353f7df2e56SmrgGetHistogram(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 3544642e01fSmrg{ 3554642e01fSmrg GLint compsize; 3564642e01fSmrg GLenum format, type, target; 3574642e01fSmrg GLboolean swapBytes, reset; 3584642e01fSmrg __GLXcontext *cx; 3594642e01fSmrg ClientPtr client = cl->client; 3604642e01fSmrg int error; 3614642e01fSmrg char *answer, answerBuffer[200]; 362f7df2e56Smrg GLint width = 0; 3637e31ba66Smrg xGLXSingleReply reply = { 0, }; 3644642e01fSmrg 3654642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 3664642e01fSmrg if (!cx) { 367f7df2e56Smrg return error; 3684642e01fSmrg } 3694642e01fSmrg 370f7df2e56Smrg format = *(GLenum *) (pc + 4); 371f7df2e56Smrg type = *(GLenum *) (pc + 8); 372f7df2e56Smrg target = *(GLenum *) (pc + 0); 373f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 374f7df2e56Smrg reset = *(GLboolean *) (pc + 13); 3754642e01fSmrg 376f7df2e56Smrg glGetHistogramParameteriv(target, GL_HISTOGRAM_WIDTH, &width); 3774642e01fSmrg /* 3784642e01fSmrg * The one query above might fail if we're in a state where queries 3794642e01fSmrg * are illegal, but then width would still be zero anyway. 3804642e01fSmrg */ 381f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 3820b0d8713Smrg if (compsize < 0) 3830b0d8713Smrg return BadLength; 3844642e01fSmrg 385f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 386f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 3874642e01fSmrg __glXClearErrorOccured(); 388f7df2e56Smrg glGetHistogram(target, reset, format, type, answer); 3894642e01fSmrg 3904642e01fSmrg if (__glXErrorOccured()) { 391f7df2e56Smrg __GLX_BEGIN_REPLY(0); 392f7df2e56Smrg __GLX_SEND_HEADER(); 393f7df2e56Smrg } 394f7df2e56Smrg else { 395f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 3967e31ba66Smrg ((xGLXGetHistogramReply *) &reply)->width = width; 397f7df2e56Smrg __GLX_SEND_HEADER(); 398f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 3994642e01fSmrg } 4004642e01fSmrg 4014642e01fSmrg return Success; 4024642e01fSmrg} 4034642e01fSmrg 404f7df2e56Smrgint 405f7df2e56Smrg__glXDisp_GetHistogram(__GLXclientState * cl, GLbyte * pc) 4064642e01fSmrg{ 4074642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 4080b0d8713Smrg ClientPtr client = cl->client; 4090b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 4104642e01fSmrg return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 4114642e01fSmrg} 4124642e01fSmrg 413f7df2e56Smrgint 414f7df2e56Smrg__glXDisp_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc) 4154642e01fSmrg{ 4164642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 4170b0d8713Smrg ClientPtr client = cl->client; 4180b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 4194642e01fSmrg return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 4204642e01fSmrg} 4214642e01fSmrg 422f7df2e56Smrgstatic int 423f7df2e56SmrgGetMinmax(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 4244642e01fSmrg{ 4254642e01fSmrg GLint compsize; 4264642e01fSmrg GLenum format, type, target; 4274642e01fSmrg GLboolean swapBytes, reset; 4284642e01fSmrg __GLXcontext *cx; 4294642e01fSmrg ClientPtr client = cl->client; 4304642e01fSmrg int error; 4314642e01fSmrg char *answer, answerBuffer[200]; 4327e31ba66Smrg xGLXSingleReply reply = { 0, }; 4334642e01fSmrg 4344642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 4354642e01fSmrg if (!cx) { 436f7df2e56Smrg return error; 4374642e01fSmrg } 4384642e01fSmrg 439f7df2e56Smrg format = *(GLenum *) (pc + 4); 440f7df2e56Smrg type = *(GLenum *) (pc + 8); 441f7df2e56Smrg target = *(GLenum *) (pc + 0); 442f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 443f7df2e56Smrg reset = *(GLboolean *) (pc + 13); 4444642e01fSmrg 445f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, 2, 1, 1); 4460b0d8713Smrg if (compsize < 0) 4470b0d8713Smrg return BadLength; 4484642e01fSmrg 449f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 450f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 4514642e01fSmrg __glXClearErrorOccured(); 452f7df2e56Smrg glGetMinmax(target, reset, format, type, answer); 4534642e01fSmrg 4544642e01fSmrg if (__glXErrorOccured()) { 455f7df2e56Smrg __GLX_BEGIN_REPLY(0); 456f7df2e56Smrg __GLX_SEND_HEADER(); 457f7df2e56Smrg } 458f7df2e56Smrg else { 459f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 460f7df2e56Smrg __GLX_SEND_HEADER(); 461f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 4624642e01fSmrg } 4634642e01fSmrg 4644642e01fSmrg return Success; 4654642e01fSmrg} 4664642e01fSmrg 467f7df2e56Smrgint 468f7df2e56Smrg__glXDisp_GetMinmax(__GLXclientState * cl, GLbyte * pc) 4694642e01fSmrg{ 4704642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 4710b0d8713Smrg ClientPtr client = cl->client; 4720b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 4734642e01fSmrg return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 4744642e01fSmrg} 4754642e01fSmrg 476f7df2e56Smrgint 477f7df2e56Smrg__glXDisp_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc) 4784642e01fSmrg{ 4794642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 4800b0d8713Smrg ClientPtr client = cl->client; 4810b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 4824642e01fSmrg return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 4834642e01fSmrg} 4844642e01fSmrg 485f7df2e56Smrgstatic int 486f7df2e56SmrgGetColorTable(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 4874642e01fSmrg{ 4884642e01fSmrg GLint compsize; 4894642e01fSmrg GLenum format, type, target; 4904642e01fSmrg GLboolean swapBytes; 4914642e01fSmrg __GLXcontext *cx; 4924642e01fSmrg ClientPtr client = cl->client; 4934642e01fSmrg int error; 4944642e01fSmrg char *answer, answerBuffer[200]; 495f7df2e56Smrg GLint width = 0; 4967e31ba66Smrg xGLXSingleReply reply = { 0, }; 4974642e01fSmrg 4984642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 4994642e01fSmrg if (!cx) { 500f7df2e56Smrg return error; 5014642e01fSmrg } 5024642e01fSmrg 503f7df2e56Smrg target = *(GLenum *) (pc + 0); 504f7df2e56Smrg format = *(GLenum *) (pc + 4); 505f7df2e56Smrg type = *(GLenum *) (pc + 8); 506f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 5074642e01fSmrg 508f7df2e56Smrg glGetColorTableParameteriv(target, GL_COLOR_TABLE_WIDTH, &width); 5094642e01fSmrg /* 5104642e01fSmrg * The one query above might fail if we're in a state where queries 5114642e01fSmrg * are illegal, but then width would still be zero anyway. 5124642e01fSmrg */ 513f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 5140b0d8713Smrg if (compsize < 0) 5150b0d8713Smrg return BadLength; 5164642e01fSmrg 517f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 518f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 5194642e01fSmrg __glXClearErrorOccured(); 520f7df2e56Smrg glGetColorTable(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 521f7df2e56Smrg *(GLenum *) (pc + 8), answer); 5224642e01fSmrg 5234642e01fSmrg if (__glXErrorOccured()) { 524f7df2e56Smrg __GLX_BEGIN_REPLY(0); 525f7df2e56Smrg __GLX_SEND_HEADER(); 526f7df2e56Smrg } 527f7df2e56Smrg else { 528f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 5297e31ba66Smrg ((xGLXGetColorTableReply *) &reply)->width = width; 530f7df2e56Smrg __GLX_SEND_HEADER(); 531f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 5324642e01fSmrg } 5334642e01fSmrg 5344642e01fSmrg return Success; 5354642e01fSmrg} 5364642e01fSmrg 537f7df2e56Smrgint 538f7df2e56Smrg__glXDisp_GetColorTable(__GLXclientState * cl, GLbyte * pc) 5394642e01fSmrg{ 5404642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 5410b0d8713Smrg ClientPtr client = cl->client; 5420b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 5434642e01fSmrg return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 5444642e01fSmrg} 5454642e01fSmrg 546f7df2e56Smrgint 547f7df2e56Smrg__glXDisp_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc) 5484642e01fSmrg{ 5494642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 5500b0d8713Smrg ClientPtr client = cl->client; 5510b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 5524642e01fSmrg return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 5534642e01fSmrg} 554