13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"), 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions: 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice including the dates of first publication and 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * either this permission notice or a reference to 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * http://oss.sgi.com/projects/FreeB/ 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * shall be included in all copies or substantial portions of the Software. 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE. 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Except as contained in this notice, the name of Silicon Graphics, Inc. 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * shall not be used in advertising or otherwise to promote the sale, use or 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * other dealings in this Software without prior written authorization from 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Silicon Graphics, Inc. 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "glxclient.h" 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "indirect.h" 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 34760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#if !defined(__GNUC__) 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# define __builtin_expect(x, y) x 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Send glPixelStore command to the server 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param gc Current GLX context 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param sop Either \c X_GLsop_PixelStoref or \c X_GLsop_PixelStorei 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param pname Selector of which pixel parameter is to be set. 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param param Value that \c pname is set to. 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \sa __indirect_glPixelStorei, __indirect_glPixelStoref 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void 49760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgsend_PixelStore(struct glx_context * gc, unsigned sop, GLenum pname, 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const void *param) 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Display *const dpy = gc->currentDpy; 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const GLuint cmdlen = 8; 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (__builtin_expect(dpy != NULL, 1)) { 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLubyte const *pc = __glXSetupSingleRequest(gc, sop, cmdlen); 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) memcpy((void *) (pc + 0), (void *) (&pname), 4); 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) memcpy((void *) (pc + 4), param, 4); 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org UnlockDisplay(dpy); 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org SyncHandle(); 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org** Specify parameters that control the storage format of pixel arrays. 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org*/ 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glPixelStoref(GLenum pname, GLfloat param) 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 70760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct glx_context *gc = __glXGetCurrentContext(); 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __GLXattribute *state = gc->client_state_private; 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Display *dpy = gc->currentDpy; 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLuint a; 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!dpy) 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (pname) { 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_ROW_LENGTH: 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.rowLength = a; 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_IMAGE_HEIGHT: 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.imageHeight = a; 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SKIP_ROWS: 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.skipRows = a; 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SKIP_PIXELS: 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.skipPixels = a; 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SKIP_IMAGES: 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.skipImages = a; 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_ALIGNMENT: 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLint) (param + 0.5); 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (a) { 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 1: 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 2: 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 4: 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 8: 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.alignment = a; 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SWAP_BYTES: 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.swapEndian = (param != 0); 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_LSB_FIRST: 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.lsbFirst = (param != 0); 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_ROW_LENGTH: 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.rowLength = a; 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_IMAGE_HEIGHT: 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.imageHeight = a; 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SKIP_ROWS: 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.skipRows = a; 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SKIP_PIXELS: 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.skipPixels = a; 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SKIP_IMAGES: 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLuint) (param + 0.5); 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (((GLint) a) < 0) { 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.skipImages = a; 1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_ALIGNMENT: 1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org a = (GLint) (param + 0.5); 1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (a) { 1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 1: 1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 2: 1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 4: 1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 8: 1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.alignment = a; 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SWAP_BYTES: 1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.swapEndian = (param != 0); 1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_LSB_FIRST: 1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.lsbFirst = (param != 0); 1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Group all of the pixel store modes that need to be sent to the 2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * server here. Care must be used to only send modes to the server that 2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * won't affect the size of the data sent to or received from the 2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * server. GL_PACK_INVERT_MESA is safe in this respect, but other, 2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * future modes may not be. 2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_INVERT_MESA: 2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org send_PixelStore(gc, X_GLsop_PixelStoref, pname, ¶m); 2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_ENUM); 2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glPixelStorei(GLenum pname, GLint param) 2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 220760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct glx_context *gc = __glXGetCurrentContext(); 2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __GLXattribute *state = gc->client_state_private; 2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Display *dpy = gc->currentDpy; 2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!dpy) 2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (pname) { 2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_ROW_LENGTH: 2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.rowLength = param; 2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_IMAGE_HEIGHT: 2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.imageHeight = param; 2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SKIP_ROWS: 2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.skipRows = param; 2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SKIP_PIXELS: 2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.skipPixels = param; 2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SKIP_IMAGES: 2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.skipImages = param; 2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_ALIGNMENT: 2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (param) { 2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 1: 2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 2: 2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 4: 2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 8: 2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.alignment = param; 2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_SWAP_BYTES: 2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.swapEndian = (param != 0); 2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_LSB_FIRST: 2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storePack.lsbFirst = (param != 0); 2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_ROW_LENGTH: 2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.rowLength = param; 2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_IMAGE_HEIGHT: 2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.imageHeight = param; 2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SKIP_ROWS: 2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.skipRows = param; 3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SKIP_PIXELS: 3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.skipPixels = param; 3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SKIP_IMAGES: 3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (param < 0) { 3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.skipImages = param; 3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_ALIGNMENT: 3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (param) { 3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 1: 3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 2: 3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 4: 3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case 8: 3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.alignment = param; 3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_SWAP_BYTES: 3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.swapEndian = (param != 0); 3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_UNPACK_LSB_FIRST: 3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org state->storeUnpack.lsbFirst = (param != 0); 3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Group all of the pixel store modes that need to be sent to the 3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * server here. Care must be used to only send modes to the server that 3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * won't affect the size of the data sent to or received from the 3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * server. GL_PACK_INVERT_MESA is safe in this respect, but other, 3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * future modes may not be. 3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case GL_PACK_INVERT_MESA: 3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org send_PixelStore(gc, X_GLsop_PixelStorei, pname, ¶m); 3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_ENUM); 3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 353