pixelstore.c revision 3464ebd5
1cdc920a0Smrg/* 2cdc920a0Smrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3cdc920a0Smrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4cdc920a0Smrg * 5cdc920a0Smrg * Permission is hereby granted, free of charge, to any person obtaining a 6cdc920a0Smrg * copy of this software and associated documentation files (the "Software"), 7cdc920a0Smrg * to deal in the Software without restriction, including without limitation 8cdc920a0Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9cdc920a0Smrg * and/or sell copies of the Software, and to permit persons to whom the 10cdc920a0Smrg * Software is furnished to do so, subject to the following conditions: 11cdc920a0Smrg * 12cdc920a0Smrg * The above copyright notice including the dates of first publication and 13cdc920a0Smrg * either this permission notice or a reference to 14cdc920a0Smrg * http://oss.sgi.com/projects/FreeB/ 15cdc920a0Smrg * shall be included in all copies or substantial portions of the Software. 16cdc920a0Smrg * 17cdc920a0Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18cdc920a0Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19cdc920a0Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20cdc920a0Smrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21cdc920a0Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22cdc920a0Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23cdc920a0Smrg * SOFTWARE. 24cdc920a0Smrg * 25cdc920a0Smrg * Except as contained in this notice, the name of Silicon Graphics, Inc. 26cdc920a0Smrg * shall not be used in advertising or otherwise to promote the sale, use or 27cdc920a0Smrg * other dealings in this Software without prior written authorization from 28cdc920a0Smrg * Silicon Graphics, Inc. 29cdc920a0Smrg */ 30cdc920a0Smrg 31cdc920a0Smrg#include "glxclient.h" 32cdc920a0Smrg#include "indirect.h" 33cdc920a0Smrg 34cdc920a0Smrg#if !defined(__GNUC__) 35cdc920a0Smrg# define __builtin_expect(x, y) x 36cdc920a0Smrg#endif 37cdc920a0Smrg 38cdc920a0Smrg/** 39cdc920a0Smrg * Send glPixelStore command to the server 40cdc920a0Smrg * 41cdc920a0Smrg * \param gc Current GLX context 42cdc920a0Smrg * \param sop Either \c X_GLsop_PixelStoref or \c X_GLsop_PixelStorei 43cdc920a0Smrg * \param pname Selector of which pixel parameter is to be set. 44cdc920a0Smrg * \param param Value that \c pname is set to. 45cdc920a0Smrg * 46cdc920a0Smrg * \sa __indirect_glPixelStorei, __indirect_glPixelStoref 47cdc920a0Smrg */ 48cdc920a0Smrgstatic void 493464ebd5Sriastradhsend_PixelStore(struct glx_context * gc, unsigned sop, GLenum pname, 50cdc920a0Smrg const void *param) 51cdc920a0Smrg{ 52cdc920a0Smrg Display *const dpy = gc->currentDpy; 53cdc920a0Smrg const GLuint cmdlen = 8; 54cdc920a0Smrg if (__builtin_expect(dpy != NULL, 1)) { 55cdc920a0Smrg GLubyte const *pc = __glXSetupSingleRequest(gc, sop, cmdlen); 56cdc920a0Smrg (void) memcpy((void *) (pc + 0), (void *) (&pname), 4); 57cdc920a0Smrg (void) memcpy((void *) (pc + 4), param, 4); 58cdc920a0Smrg UnlockDisplay(dpy); 59cdc920a0Smrg SyncHandle(); 60cdc920a0Smrg } 61cdc920a0Smrg return; 62cdc920a0Smrg} 63cdc920a0Smrg 64cdc920a0Smrg/* 65cdc920a0Smrg** Specify parameters that control the storage format of pixel arrays. 66cdc920a0Smrg*/ 67cdc920a0Smrgvoid 68cdc920a0Smrg__indirect_glPixelStoref(GLenum pname, GLfloat param) 69cdc920a0Smrg{ 703464ebd5Sriastradh struct glx_context *gc = __glXGetCurrentContext(); 71cdc920a0Smrg __GLXattribute *state = gc->client_state_private; 72cdc920a0Smrg Display *dpy = gc->currentDpy; 73cdc920a0Smrg GLuint a; 74cdc920a0Smrg 75cdc920a0Smrg if (!dpy) 76cdc920a0Smrg return; 77cdc920a0Smrg 78cdc920a0Smrg switch (pname) { 79cdc920a0Smrg case GL_PACK_ROW_LENGTH: 80cdc920a0Smrg a = (GLuint) (param + 0.5); 81cdc920a0Smrg if (((GLint) a) < 0) { 82cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 83cdc920a0Smrg return; 84cdc920a0Smrg } 85cdc920a0Smrg state->storePack.rowLength = a; 86cdc920a0Smrg break; 87cdc920a0Smrg case GL_PACK_IMAGE_HEIGHT: 88cdc920a0Smrg a = (GLuint) (param + 0.5); 89cdc920a0Smrg if (((GLint) a) < 0) { 90cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 91cdc920a0Smrg return; 92cdc920a0Smrg } 93cdc920a0Smrg state->storePack.imageHeight = a; 94cdc920a0Smrg break; 95cdc920a0Smrg case GL_PACK_SKIP_ROWS: 96cdc920a0Smrg a = (GLuint) (param + 0.5); 97cdc920a0Smrg if (((GLint) a) < 0) { 98cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 99cdc920a0Smrg return; 100cdc920a0Smrg } 101cdc920a0Smrg state->storePack.skipRows = a; 102cdc920a0Smrg break; 103cdc920a0Smrg case GL_PACK_SKIP_PIXELS: 104cdc920a0Smrg a = (GLuint) (param + 0.5); 105cdc920a0Smrg if (((GLint) a) < 0) { 106cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 107cdc920a0Smrg return; 108cdc920a0Smrg } 109cdc920a0Smrg state->storePack.skipPixels = a; 110cdc920a0Smrg break; 111cdc920a0Smrg case GL_PACK_SKIP_IMAGES: 112cdc920a0Smrg a = (GLuint) (param + 0.5); 113cdc920a0Smrg if (((GLint) a) < 0) { 114cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 115cdc920a0Smrg return; 116cdc920a0Smrg } 117cdc920a0Smrg state->storePack.skipImages = a; 118cdc920a0Smrg break; 119cdc920a0Smrg case GL_PACK_ALIGNMENT: 120cdc920a0Smrg a = (GLint) (param + 0.5); 121cdc920a0Smrg switch (a) { 122cdc920a0Smrg case 1: 123cdc920a0Smrg case 2: 124cdc920a0Smrg case 4: 125cdc920a0Smrg case 8: 126cdc920a0Smrg state->storePack.alignment = a; 127cdc920a0Smrg break; 128cdc920a0Smrg default: 129cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 130cdc920a0Smrg return; 131cdc920a0Smrg } 132cdc920a0Smrg break; 133cdc920a0Smrg case GL_PACK_SWAP_BYTES: 134cdc920a0Smrg state->storePack.swapEndian = (param != 0); 135cdc920a0Smrg break; 136cdc920a0Smrg case GL_PACK_LSB_FIRST: 137cdc920a0Smrg state->storePack.lsbFirst = (param != 0); 138cdc920a0Smrg break; 139cdc920a0Smrg 140cdc920a0Smrg case GL_UNPACK_ROW_LENGTH: 141cdc920a0Smrg a = (GLuint) (param + 0.5); 142cdc920a0Smrg if (((GLint) a) < 0) { 143cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 144cdc920a0Smrg return; 145cdc920a0Smrg } 146cdc920a0Smrg state->storeUnpack.rowLength = a; 147cdc920a0Smrg break; 148cdc920a0Smrg case GL_UNPACK_IMAGE_HEIGHT: 149cdc920a0Smrg a = (GLuint) (param + 0.5); 150cdc920a0Smrg if (((GLint) a) < 0) { 151cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 152cdc920a0Smrg return; 153cdc920a0Smrg } 154cdc920a0Smrg state->storeUnpack.imageHeight = a; 155cdc920a0Smrg break; 156cdc920a0Smrg case GL_UNPACK_SKIP_ROWS: 157cdc920a0Smrg a = (GLuint) (param + 0.5); 158cdc920a0Smrg if (((GLint) a) < 0) { 159cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 160cdc920a0Smrg return; 161cdc920a0Smrg } 162cdc920a0Smrg state->storeUnpack.skipRows = a; 163cdc920a0Smrg break; 164cdc920a0Smrg case GL_UNPACK_SKIP_PIXELS: 165cdc920a0Smrg a = (GLuint) (param + 0.5); 166cdc920a0Smrg if (((GLint) a) < 0) { 167cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 168cdc920a0Smrg return; 169cdc920a0Smrg } 170cdc920a0Smrg state->storeUnpack.skipPixels = a; 171cdc920a0Smrg break; 172cdc920a0Smrg case GL_UNPACK_SKIP_IMAGES: 173cdc920a0Smrg a = (GLuint) (param + 0.5); 174cdc920a0Smrg if (((GLint) a) < 0) { 175cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 176cdc920a0Smrg return; 177cdc920a0Smrg } 178cdc920a0Smrg state->storeUnpack.skipImages = a; 179cdc920a0Smrg break; 180cdc920a0Smrg case GL_UNPACK_ALIGNMENT: 181cdc920a0Smrg a = (GLint) (param + 0.5); 182cdc920a0Smrg switch (a) { 183cdc920a0Smrg case 1: 184cdc920a0Smrg case 2: 185cdc920a0Smrg case 4: 186cdc920a0Smrg case 8: 187cdc920a0Smrg state->storeUnpack.alignment = a; 188cdc920a0Smrg break; 189cdc920a0Smrg default: 190cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 191cdc920a0Smrg return; 192cdc920a0Smrg } 193cdc920a0Smrg break; 194cdc920a0Smrg case GL_UNPACK_SWAP_BYTES: 195cdc920a0Smrg state->storeUnpack.swapEndian = (param != 0); 196cdc920a0Smrg break; 197cdc920a0Smrg case GL_UNPACK_LSB_FIRST: 198cdc920a0Smrg state->storeUnpack.lsbFirst = (param != 0); 199cdc920a0Smrg break; 200cdc920a0Smrg 201cdc920a0Smrg /* Group all of the pixel store modes that need to be sent to the 202cdc920a0Smrg * server here. Care must be used to only send modes to the server that 203cdc920a0Smrg * won't affect the size of the data sent to or received from the 204cdc920a0Smrg * server. GL_PACK_INVERT_MESA is safe in this respect, but other, 205cdc920a0Smrg * future modes may not be. 206cdc920a0Smrg */ 207cdc920a0Smrg case GL_PACK_INVERT_MESA: 208cdc920a0Smrg send_PixelStore(gc, X_GLsop_PixelStoref, pname, ¶m); 209cdc920a0Smrg break; 210cdc920a0Smrg 211cdc920a0Smrg default: 212cdc920a0Smrg __glXSetError(gc, GL_INVALID_ENUM); 213cdc920a0Smrg break; 214cdc920a0Smrg } 215cdc920a0Smrg} 216cdc920a0Smrg 217cdc920a0Smrgvoid 218cdc920a0Smrg__indirect_glPixelStorei(GLenum pname, GLint param) 219cdc920a0Smrg{ 2203464ebd5Sriastradh struct glx_context *gc = __glXGetCurrentContext(); 221cdc920a0Smrg __GLXattribute *state = gc->client_state_private; 222cdc920a0Smrg Display *dpy = gc->currentDpy; 223cdc920a0Smrg 224cdc920a0Smrg if (!dpy) 225cdc920a0Smrg return; 226cdc920a0Smrg 227cdc920a0Smrg switch (pname) { 228cdc920a0Smrg case GL_PACK_ROW_LENGTH: 229cdc920a0Smrg if (param < 0) { 230cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 231cdc920a0Smrg return; 232cdc920a0Smrg } 233cdc920a0Smrg state->storePack.rowLength = param; 234cdc920a0Smrg break; 235cdc920a0Smrg case GL_PACK_IMAGE_HEIGHT: 236cdc920a0Smrg if (param < 0) { 237cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 238cdc920a0Smrg return; 239cdc920a0Smrg } 240cdc920a0Smrg state->storePack.imageHeight = param; 241cdc920a0Smrg break; 242cdc920a0Smrg case GL_PACK_SKIP_ROWS: 243cdc920a0Smrg if (param < 0) { 244cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 245cdc920a0Smrg return; 246cdc920a0Smrg } 247cdc920a0Smrg state->storePack.skipRows = param; 248cdc920a0Smrg break; 249cdc920a0Smrg case GL_PACK_SKIP_PIXELS: 250cdc920a0Smrg if (param < 0) { 251cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 252cdc920a0Smrg return; 253cdc920a0Smrg } 254cdc920a0Smrg state->storePack.skipPixels = param; 255cdc920a0Smrg break; 256cdc920a0Smrg case GL_PACK_SKIP_IMAGES: 257cdc920a0Smrg if (param < 0) { 258cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 259cdc920a0Smrg return; 260cdc920a0Smrg } 261cdc920a0Smrg state->storePack.skipImages = param; 262cdc920a0Smrg break; 263cdc920a0Smrg case GL_PACK_ALIGNMENT: 264cdc920a0Smrg switch (param) { 265cdc920a0Smrg case 1: 266cdc920a0Smrg case 2: 267cdc920a0Smrg case 4: 268cdc920a0Smrg case 8: 269cdc920a0Smrg state->storePack.alignment = param; 270cdc920a0Smrg break; 271cdc920a0Smrg default: 272cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 273cdc920a0Smrg return; 274cdc920a0Smrg } 275cdc920a0Smrg break; 276cdc920a0Smrg case GL_PACK_SWAP_BYTES: 277cdc920a0Smrg state->storePack.swapEndian = (param != 0); 278cdc920a0Smrg break; 279cdc920a0Smrg case GL_PACK_LSB_FIRST: 280cdc920a0Smrg state->storePack.lsbFirst = (param != 0); 281cdc920a0Smrg break; 282cdc920a0Smrg 283cdc920a0Smrg case GL_UNPACK_ROW_LENGTH: 284cdc920a0Smrg if (param < 0) { 285cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 286cdc920a0Smrg return; 287cdc920a0Smrg } 288cdc920a0Smrg state->storeUnpack.rowLength = param; 289cdc920a0Smrg break; 290cdc920a0Smrg case GL_UNPACK_IMAGE_HEIGHT: 291cdc920a0Smrg if (param < 0) { 292cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 293cdc920a0Smrg return; 294cdc920a0Smrg } 295cdc920a0Smrg state->storeUnpack.imageHeight = param; 296cdc920a0Smrg break; 297cdc920a0Smrg case GL_UNPACK_SKIP_ROWS: 298cdc920a0Smrg if (param < 0) { 299cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 300cdc920a0Smrg return; 301cdc920a0Smrg } 302cdc920a0Smrg state->storeUnpack.skipRows = param; 303cdc920a0Smrg break; 304cdc920a0Smrg case GL_UNPACK_SKIP_PIXELS: 305cdc920a0Smrg if (param < 0) { 306cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 307cdc920a0Smrg return; 308cdc920a0Smrg } 309cdc920a0Smrg state->storeUnpack.skipPixels = param; 310cdc920a0Smrg break; 311cdc920a0Smrg case GL_UNPACK_SKIP_IMAGES: 312cdc920a0Smrg if (param < 0) { 313cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 314cdc920a0Smrg return; 315cdc920a0Smrg } 316cdc920a0Smrg state->storeUnpack.skipImages = param; 317cdc920a0Smrg break; 318cdc920a0Smrg case GL_UNPACK_ALIGNMENT: 319cdc920a0Smrg switch (param) { 320cdc920a0Smrg case 1: 321cdc920a0Smrg case 2: 322cdc920a0Smrg case 4: 323cdc920a0Smrg case 8: 324cdc920a0Smrg state->storeUnpack.alignment = param; 325cdc920a0Smrg break; 326cdc920a0Smrg default: 327cdc920a0Smrg __glXSetError(gc, GL_INVALID_VALUE); 328cdc920a0Smrg return; 329cdc920a0Smrg } 330cdc920a0Smrg break; 331cdc920a0Smrg case GL_UNPACK_SWAP_BYTES: 332cdc920a0Smrg state->storeUnpack.swapEndian = (param != 0); 333cdc920a0Smrg break; 334cdc920a0Smrg case GL_UNPACK_LSB_FIRST: 335cdc920a0Smrg state->storeUnpack.lsbFirst = (param != 0); 336cdc920a0Smrg break; 337cdc920a0Smrg 338cdc920a0Smrg /* Group all of the pixel store modes that need to be sent to the 339cdc920a0Smrg * server here. Care must be used to only send modes to the server that 340cdc920a0Smrg * won't affect the size of the data sent to or received from the 341cdc920a0Smrg * server. GL_PACK_INVERT_MESA is safe in this respect, but other, 342cdc920a0Smrg * future modes may not be. 343cdc920a0Smrg */ 344cdc920a0Smrg case GL_PACK_INVERT_MESA: 345cdc920a0Smrg send_PixelStore(gc, X_GLsop_PixelStorei, pname, ¶m); 346cdc920a0Smrg break; 347cdc920a0Smrg 348cdc920a0Smrg default: 349cdc920a0Smrg __glXSetError(gc, GL_INVALID_ENUM); 350cdc920a0Smrg break; 351cdc920a0Smrg } 352cdc920a0Smrg} 353