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, &param);
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, &param);
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