pixelstore.c revision 848b8605
1848b8605Smrg/*
2848b8605Smrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3848b8605Smrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4848b8605Smrg *
5848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
6848b8605Smrg * copy of this software and associated documentation files (the "Software"),
7848b8605Smrg * to deal in the Software without restriction, including without limitation
8848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
10848b8605Smrg * Software is furnished to do so, subject to the following conditions:
11848b8605Smrg *
12848b8605Smrg * The above copyright notice including the dates of first publication and
13848b8605Smrg * either this permission notice or a reference to
14848b8605Smrg * http://oss.sgi.com/projects/FreeB/
15848b8605Smrg * shall be included in all copies or substantial portions of the Software.
16848b8605Smrg *
17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20848b8605Smrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21848b8605Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22848b8605Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23848b8605Smrg * SOFTWARE.
24848b8605Smrg *
25848b8605Smrg * Except as contained in this notice, the name of Silicon Graphics, Inc.
26848b8605Smrg * shall not be used in advertising or otherwise to promote the sale, use or
27848b8605Smrg * other dealings in this Software without prior written authorization from
28848b8605Smrg * Silicon Graphics, Inc.
29848b8605Smrg */
30848b8605Smrg
31848b8605Smrg#include "glxclient.h"
32848b8605Smrg#include "indirect.h"
33848b8605Smrg
34848b8605Smrg#if !defined(__GNUC__)
35848b8605Smrg#  define __builtin_expect(x, y) x
36848b8605Smrg#endif
37848b8605Smrg
38848b8605Smrg/**
39848b8605Smrg * Send glPixelStore command to the server
40848b8605Smrg *
41848b8605Smrg * \param gc     Current GLX context
42848b8605Smrg * \param sop    Either \c X_GLsop_PixelStoref or \c X_GLsop_PixelStorei
43848b8605Smrg * \param pname  Selector of which pixel parameter is to be set.
44848b8605Smrg * \param param  Value that \c pname is set to.
45848b8605Smrg *
46848b8605Smrg * \sa __indirect_glPixelStorei,  __indirect_glPixelStoref
47848b8605Smrg */
48848b8605Smrgstatic void
49848b8605Smrgsend_PixelStore(struct glx_context * gc, unsigned sop, GLenum pname,
50848b8605Smrg                const void *param)
51848b8605Smrg{
52848b8605Smrg   Display *const dpy = gc->currentDpy;
53848b8605Smrg   const GLuint cmdlen = 8;
54848b8605Smrg   if (__builtin_expect(dpy != NULL, 1)) {
55848b8605Smrg      GLubyte const *pc = __glXSetupSingleRequest(gc, sop, cmdlen);
56848b8605Smrg      (void) memcpy((void *) (pc + 0), (void *) (&pname), 4);
57848b8605Smrg      (void) memcpy((void *) (pc + 4), param, 4);
58848b8605Smrg      UnlockDisplay(dpy);
59848b8605Smrg      SyncHandle();
60848b8605Smrg   }
61848b8605Smrg   return;
62848b8605Smrg}
63848b8605Smrg
64848b8605Smrg/*
65848b8605Smrg** Specify parameters that control the storage format of pixel arrays.
66848b8605Smrg*/
67848b8605Smrgvoid
68848b8605Smrg__indirect_glPixelStoref(GLenum pname, GLfloat param)
69848b8605Smrg{
70848b8605Smrg   struct glx_context *gc = __glXGetCurrentContext();
71848b8605Smrg   __GLXattribute *state = gc->client_state_private;
72848b8605Smrg   Display *dpy = gc->currentDpy;
73848b8605Smrg   GLuint a;
74848b8605Smrg
75848b8605Smrg   if (!dpy)
76848b8605Smrg      return;
77848b8605Smrg
78848b8605Smrg   switch (pname) {
79848b8605Smrg   case GL_PACK_ROW_LENGTH:
80848b8605Smrg      a = (GLuint) (param + 0.5);
81848b8605Smrg      if (((GLint) a) < 0) {
82848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
83848b8605Smrg         return;
84848b8605Smrg      }
85848b8605Smrg      state->storePack.rowLength = a;
86848b8605Smrg      break;
87848b8605Smrg   case GL_PACK_IMAGE_HEIGHT:
88848b8605Smrg      a = (GLuint) (param + 0.5);
89848b8605Smrg      if (((GLint) a) < 0) {
90848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
91848b8605Smrg         return;
92848b8605Smrg      }
93848b8605Smrg      state->storePack.imageHeight = a;
94848b8605Smrg      break;
95848b8605Smrg   case GL_PACK_SKIP_ROWS:
96848b8605Smrg      a = (GLuint) (param + 0.5);
97848b8605Smrg      if (((GLint) a) < 0) {
98848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
99848b8605Smrg         return;
100848b8605Smrg      }
101848b8605Smrg      state->storePack.skipRows = a;
102848b8605Smrg      break;
103848b8605Smrg   case GL_PACK_SKIP_PIXELS:
104848b8605Smrg      a = (GLuint) (param + 0.5);
105848b8605Smrg      if (((GLint) a) < 0) {
106848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
107848b8605Smrg         return;
108848b8605Smrg      }
109848b8605Smrg      state->storePack.skipPixels = a;
110848b8605Smrg      break;
111848b8605Smrg   case GL_PACK_SKIP_IMAGES:
112848b8605Smrg      a = (GLuint) (param + 0.5);
113848b8605Smrg      if (((GLint) a) < 0) {
114848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
115848b8605Smrg         return;
116848b8605Smrg      }
117848b8605Smrg      state->storePack.skipImages = a;
118848b8605Smrg      break;
119848b8605Smrg   case GL_PACK_ALIGNMENT:
120848b8605Smrg      a = (GLint) (param + 0.5);
121848b8605Smrg      switch (a) {
122848b8605Smrg      case 1:
123848b8605Smrg      case 2:
124848b8605Smrg      case 4:
125848b8605Smrg      case 8:
126848b8605Smrg         state->storePack.alignment = a;
127848b8605Smrg         break;
128848b8605Smrg      default:
129848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
130848b8605Smrg         return;
131848b8605Smrg      }
132848b8605Smrg      break;
133848b8605Smrg   case GL_PACK_SWAP_BYTES:
134848b8605Smrg      state->storePack.swapEndian = (param != 0);
135848b8605Smrg      break;
136848b8605Smrg   case GL_PACK_LSB_FIRST:
137848b8605Smrg      state->storePack.lsbFirst = (param != 0);
138848b8605Smrg      break;
139848b8605Smrg
140848b8605Smrg   case GL_UNPACK_ROW_LENGTH:
141848b8605Smrg      a = (GLuint) (param + 0.5);
142848b8605Smrg      if (((GLint) a) < 0) {
143848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
144848b8605Smrg         return;
145848b8605Smrg      }
146848b8605Smrg      state->storeUnpack.rowLength = a;
147848b8605Smrg      break;
148848b8605Smrg   case GL_UNPACK_IMAGE_HEIGHT:
149848b8605Smrg      a = (GLuint) (param + 0.5);
150848b8605Smrg      if (((GLint) a) < 0) {
151848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
152848b8605Smrg         return;
153848b8605Smrg      }
154848b8605Smrg      state->storeUnpack.imageHeight = a;
155848b8605Smrg      break;
156848b8605Smrg   case GL_UNPACK_SKIP_ROWS:
157848b8605Smrg      a = (GLuint) (param + 0.5);
158848b8605Smrg      if (((GLint) a) < 0) {
159848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
160848b8605Smrg         return;
161848b8605Smrg      }
162848b8605Smrg      state->storeUnpack.skipRows = a;
163848b8605Smrg      break;
164848b8605Smrg   case GL_UNPACK_SKIP_PIXELS:
165848b8605Smrg      a = (GLuint) (param + 0.5);
166848b8605Smrg      if (((GLint) a) < 0) {
167848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
168848b8605Smrg         return;
169848b8605Smrg      }
170848b8605Smrg      state->storeUnpack.skipPixels = a;
171848b8605Smrg      break;
172848b8605Smrg   case GL_UNPACK_SKIP_IMAGES:
173848b8605Smrg      a = (GLuint) (param + 0.5);
174848b8605Smrg      if (((GLint) a) < 0) {
175848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
176848b8605Smrg         return;
177848b8605Smrg      }
178848b8605Smrg      state->storeUnpack.skipImages = a;
179848b8605Smrg      break;
180848b8605Smrg   case GL_UNPACK_ALIGNMENT:
181848b8605Smrg      a = (GLint) (param + 0.5);
182848b8605Smrg      switch (a) {
183848b8605Smrg      case 1:
184848b8605Smrg      case 2:
185848b8605Smrg      case 4:
186848b8605Smrg      case 8:
187848b8605Smrg         state->storeUnpack.alignment = a;
188848b8605Smrg         break;
189848b8605Smrg      default:
190848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
191848b8605Smrg         return;
192848b8605Smrg      }
193848b8605Smrg      break;
194848b8605Smrg   case GL_UNPACK_SWAP_BYTES:
195848b8605Smrg      state->storeUnpack.swapEndian = (param != 0);
196848b8605Smrg      break;
197848b8605Smrg   case GL_UNPACK_LSB_FIRST:
198848b8605Smrg      state->storeUnpack.lsbFirst = (param != 0);
199848b8605Smrg      break;
200848b8605Smrg
201848b8605Smrg      /* Group all of the pixel store modes that need to be sent to the
202848b8605Smrg       * server here.  Care must be used to only send modes to the server that
203848b8605Smrg       * won't affect the size of the data sent to or received from the
204848b8605Smrg       * server.  GL_PACK_INVERT_MESA is safe in this respect, but other,
205848b8605Smrg       * future modes may not be.
206848b8605Smrg       */
207848b8605Smrg   case GL_PACK_INVERT_MESA:
208848b8605Smrg      send_PixelStore(gc, X_GLsop_PixelStoref, pname, &param);
209848b8605Smrg      break;
210848b8605Smrg
211848b8605Smrg   default:
212848b8605Smrg      __glXSetError(gc, GL_INVALID_ENUM);
213848b8605Smrg      break;
214848b8605Smrg   }
215848b8605Smrg}
216848b8605Smrg
217848b8605Smrgvoid
218848b8605Smrg__indirect_glPixelStorei(GLenum pname, GLint param)
219848b8605Smrg{
220848b8605Smrg   struct glx_context *gc = __glXGetCurrentContext();
221848b8605Smrg   __GLXattribute *state = gc->client_state_private;
222848b8605Smrg   Display *dpy = gc->currentDpy;
223848b8605Smrg
224848b8605Smrg   if (!dpy)
225848b8605Smrg      return;
226848b8605Smrg
227848b8605Smrg   switch (pname) {
228848b8605Smrg   case GL_PACK_ROW_LENGTH:
229848b8605Smrg      if (param < 0) {
230848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
231848b8605Smrg         return;
232848b8605Smrg      }
233848b8605Smrg      state->storePack.rowLength = param;
234848b8605Smrg      break;
235848b8605Smrg   case GL_PACK_IMAGE_HEIGHT:
236848b8605Smrg      if (param < 0) {
237848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
238848b8605Smrg         return;
239848b8605Smrg      }
240848b8605Smrg      state->storePack.imageHeight = param;
241848b8605Smrg      break;
242848b8605Smrg   case GL_PACK_SKIP_ROWS:
243848b8605Smrg      if (param < 0) {
244848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
245848b8605Smrg         return;
246848b8605Smrg      }
247848b8605Smrg      state->storePack.skipRows = param;
248848b8605Smrg      break;
249848b8605Smrg   case GL_PACK_SKIP_PIXELS:
250848b8605Smrg      if (param < 0) {
251848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
252848b8605Smrg         return;
253848b8605Smrg      }
254848b8605Smrg      state->storePack.skipPixels = param;
255848b8605Smrg      break;
256848b8605Smrg   case GL_PACK_SKIP_IMAGES:
257848b8605Smrg      if (param < 0) {
258848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
259848b8605Smrg         return;
260848b8605Smrg      }
261848b8605Smrg      state->storePack.skipImages = param;
262848b8605Smrg      break;
263848b8605Smrg   case GL_PACK_ALIGNMENT:
264848b8605Smrg      switch (param) {
265848b8605Smrg      case 1:
266848b8605Smrg      case 2:
267848b8605Smrg      case 4:
268848b8605Smrg      case 8:
269848b8605Smrg         state->storePack.alignment = param;
270848b8605Smrg         break;
271848b8605Smrg      default:
272848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
273848b8605Smrg         return;
274848b8605Smrg      }
275848b8605Smrg      break;
276848b8605Smrg   case GL_PACK_SWAP_BYTES:
277848b8605Smrg      state->storePack.swapEndian = (param != 0);
278848b8605Smrg      break;
279848b8605Smrg   case GL_PACK_LSB_FIRST:
280848b8605Smrg      state->storePack.lsbFirst = (param != 0);
281848b8605Smrg      break;
282848b8605Smrg
283848b8605Smrg   case GL_UNPACK_ROW_LENGTH:
284848b8605Smrg      if (param < 0) {
285848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
286848b8605Smrg         return;
287848b8605Smrg      }
288848b8605Smrg      state->storeUnpack.rowLength = param;
289848b8605Smrg      break;
290848b8605Smrg   case GL_UNPACK_IMAGE_HEIGHT:
291848b8605Smrg      if (param < 0) {
292848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
293848b8605Smrg         return;
294848b8605Smrg      }
295848b8605Smrg      state->storeUnpack.imageHeight = param;
296848b8605Smrg      break;
297848b8605Smrg   case GL_UNPACK_SKIP_ROWS:
298848b8605Smrg      if (param < 0) {
299848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
300848b8605Smrg         return;
301848b8605Smrg      }
302848b8605Smrg      state->storeUnpack.skipRows = param;
303848b8605Smrg      break;
304848b8605Smrg   case GL_UNPACK_SKIP_PIXELS:
305848b8605Smrg      if (param < 0) {
306848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
307848b8605Smrg         return;
308848b8605Smrg      }
309848b8605Smrg      state->storeUnpack.skipPixels = param;
310848b8605Smrg      break;
311848b8605Smrg   case GL_UNPACK_SKIP_IMAGES:
312848b8605Smrg      if (param < 0) {
313848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
314848b8605Smrg         return;
315848b8605Smrg      }
316848b8605Smrg      state->storeUnpack.skipImages = param;
317848b8605Smrg      break;
318848b8605Smrg   case GL_UNPACK_ALIGNMENT:
319848b8605Smrg      switch (param) {
320848b8605Smrg      case 1:
321848b8605Smrg      case 2:
322848b8605Smrg      case 4:
323848b8605Smrg      case 8:
324848b8605Smrg         state->storeUnpack.alignment = param;
325848b8605Smrg         break;
326848b8605Smrg      default:
327848b8605Smrg         __glXSetError(gc, GL_INVALID_VALUE);
328848b8605Smrg         return;
329848b8605Smrg      }
330848b8605Smrg      break;
331848b8605Smrg   case GL_UNPACK_SWAP_BYTES:
332848b8605Smrg      state->storeUnpack.swapEndian = (param != 0);
333848b8605Smrg      break;
334848b8605Smrg   case GL_UNPACK_LSB_FIRST:
335848b8605Smrg      state->storeUnpack.lsbFirst = (param != 0);
336848b8605Smrg      break;
337848b8605Smrg
338848b8605Smrg      /* Group all of the pixel store modes that need to be sent to the
339848b8605Smrg       * server here.  Care must be used to only send modes to the server that
340848b8605Smrg       * won't affect the size of the data sent to or received from the
341848b8605Smrg       * server.  GL_PACK_INVERT_MESA is safe in this respect, but other,
342848b8605Smrg       * future modes may not be.
343848b8605Smrg       */
344848b8605Smrg   case GL_PACK_INVERT_MESA:
345848b8605Smrg      send_PixelStore(gc, X_GLsop_PixelStorei, pname, &param);
346848b8605Smrg      break;
347848b8605Smrg
348848b8605Smrg   default:
349848b8605Smrg      __glXSetError(gc, GL_INVALID_ENUM);
350848b8605Smrg      break;
351848b8605Smrg   }
352848b8605Smrg}
353