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, &param);
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, &param);
346cdc920a0Smrg      break;
347cdc920a0Smrg
348cdc920a0Smrg   default:
349cdc920a0Smrg      __glXSetError(gc, GL_INVALID_ENUM);
350cdc920a0Smrg      break;
351cdc920a0Smrg   }
352cdc920a0Smrg}
353