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 "packsingle.h"
32cdc920a0Smrg#include "indirect.h"
33cdc920a0Smrg#include "glapi.h"
34cdc920a0Smrg#include <GL/glxproto.h>
35cdc920a0Smrg
36cdc920a0Smrgvoid
37cdc920a0Smrg__indirect_glGetSeparableFilter(GLenum target, GLenum format, GLenum type,
38cdc920a0Smrg                                GLvoid * row, GLvoid * column, GLvoid * span)
39cdc920a0Smrg{
40cdc920a0Smrg   __GLX_SINGLE_DECLARE_VARIABLES();
41cdc920a0Smrg   const __GLXattribute *state;
42cdc920a0Smrg   xGLXGetSeparableFilterReply reply;
43cdc920a0Smrg   GLubyte *rowBuf, *colBuf;
44cdc920a0Smrg
45cdc920a0Smrg   if (!dpy)
46cdc920a0Smrg      return;
47cdc920a0Smrg   __GLX_SINGLE_LOAD_VARIABLES();
48cdc920a0Smrg   state = gc->client_state_private;
49cdc920a0Smrg
50cdc920a0Smrg   /* Send request */
51cdc920a0Smrg   __GLX_SINGLE_BEGIN(X_GLsop_GetSeparableFilter, __GLX_PAD(13));
52cdc920a0Smrg   __GLX_SINGLE_PUT_LONG(0, target);
53cdc920a0Smrg   __GLX_SINGLE_PUT_LONG(4, format);
54cdc920a0Smrg   __GLX_SINGLE_PUT_LONG(8, type);
55cdc920a0Smrg   __GLX_SINGLE_PUT_CHAR(12, state->storePack.swapEndian);
56cdc920a0Smrg   __GLX_SINGLE_READ_XREPLY();
57cdc920a0Smrg   compsize = reply.length << 2;
58cdc920a0Smrg
59cdc920a0Smrg   if (compsize != 0) {
60cdc920a0Smrg      GLint width, height;
61cdc920a0Smrg      GLint widthsize, heightsize;
62cdc920a0Smrg
63cdc920a0Smrg      width = reply.width;
64cdc920a0Smrg      height = reply.height;
65cdc920a0Smrg
66cdc920a0Smrg      widthsize = __glImageSize(width, 1, 1, format, type, 0);
67cdc920a0Smrg      heightsize = __glImageSize(height, 1, 1, format, type, 0);
68cdc920a0Smrg
69cdc920a0Smrg      /* Allocate a holding buffer to transform the data from */
70af69d88dSmrg      rowBuf = malloc(widthsize);
71cdc920a0Smrg      if (!rowBuf) {
72cdc920a0Smrg         /* Throw data away */
73cdc920a0Smrg         _XEatData(dpy, compsize);
74cdc920a0Smrg         __glXSetError(gc, GL_OUT_OF_MEMORY);
75cdc920a0Smrg         UnlockDisplay(dpy);
76cdc920a0Smrg         SyncHandle();
77cdc920a0Smrg         return;
78cdc920a0Smrg      }
79cdc920a0Smrg      else {
80cdc920a0Smrg         __GLX_SINGLE_GET_CHAR_ARRAY(((char *) rowBuf), widthsize);
81cdc920a0Smrg         __glEmptyImage(gc, 1, width, 1, 1, format, type, rowBuf, row);
82af69d88dSmrg         free((char *) rowBuf);
83cdc920a0Smrg      }
84af69d88dSmrg      colBuf = malloc(heightsize);
85cdc920a0Smrg      if (!colBuf) {
86cdc920a0Smrg         /* Throw data away */
87cdc920a0Smrg         _XEatData(dpy, compsize - __GLX_PAD(widthsize));
88cdc920a0Smrg         __glXSetError(gc, GL_OUT_OF_MEMORY);
89cdc920a0Smrg         UnlockDisplay(dpy);
90cdc920a0Smrg         SyncHandle();
91cdc920a0Smrg         return;
92cdc920a0Smrg      }
93cdc920a0Smrg      else {
94cdc920a0Smrg         __GLX_SINGLE_GET_CHAR_ARRAY(((char *) colBuf), heightsize);
95cdc920a0Smrg         __glEmptyImage(gc, 1, height, 1, 1, format, type, colBuf, column);
96af69d88dSmrg         free((char *) colBuf);
97cdc920a0Smrg      }
98cdc920a0Smrg   }
99cdc920a0Smrg   else {
100cdc920a0Smrg      /*
101cdc920a0Smrg       ** don't modify user's buffer.
102cdc920a0Smrg       */
103cdc920a0Smrg   }
104cdc920a0Smrg   __GLX_SINGLE_END();
105cdc920a0Smrg
106cdc920a0Smrg}
107cdc920a0Smrg
108cdc920a0Smrg
1093464ebd5Sriastradh/* it is defined to gl_dispatch_stub_NNN in indirect.h */
1103464ebd5Sriastradhvoid gl_dispatch_stub_GetSeparableFilterEXT (GLenum target, GLenum format,
1113464ebd5Sriastradh                                             GLenum type, GLvoid * row,
1123464ebd5Sriastradh                                             GLvoid * column, GLvoid * span)
113cdc920a0Smrg{
1143464ebd5Sriastradh   struct glx_context *const gc = __glXGetCurrentContext();
115cdc920a0Smrg
116cdc920a0Smrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
1173464ebd5Sriastradh   if (gc->isDirect) {
118af69d88dSmrg      const _glapi_proc *const table = (_glapi_proc *) GET_DISPATCH();
119af69d88dSmrg      PFNGLGETSEPARABLEFILTEREXTPROC p =
120af69d88dSmrg         (PFNGLGETSEPARABLEFILTEREXTPROC) table[359];
121af69d88dSmrg
122af69d88dSmrg      p(target, format, type, row, column, span);
123cdc920a0Smrg      return;
124cdc920a0Smrg   }
125cdc920a0Smrg   else
126cdc920a0Smrg#endif
127cdc920a0Smrg   {
128cdc920a0Smrg      Display *const dpy = gc->currentDpy;
129cdc920a0Smrg      const GLuint cmdlen = __GLX_PAD(13);
130cdc920a0Smrg
131cdc920a0Smrg      if (dpy != NULL) {
132cdc920a0Smrg         const __GLXattribute *const state = gc->client_state_private;
133cdc920a0Smrg         xGLXGetSeparableFilterReply reply;
134cdc920a0Smrg         GLubyte const *pc =
135cdc920a0Smrg            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
136cdc920a0Smrg                                    X_GLvop_GetSeparableFilterEXT, cmdlen);
137cdc920a0Smrg         unsigned compsize;
138cdc920a0Smrg
139cdc920a0Smrg
140cdc920a0Smrg         (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
141cdc920a0Smrg         (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
142cdc920a0Smrg         (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
143cdc920a0Smrg         *(int8_t *) (pc + 12) = state->storePack.swapEndian;
144cdc920a0Smrg
145cdc920a0Smrg         (void) _XReply(dpy, (xReply *) & reply, 0, False);
146cdc920a0Smrg
147cdc920a0Smrg         compsize = reply.length << 2;
148cdc920a0Smrg
149cdc920a0Smrg         if (compsize != 0) {
150cdc920a0Smrg            const GLint width = reply.width;
151cdc920a0Smrg            const GLint height = reply.height;
152cdc920a0Smrg            const GLint widthsize =
153cdc920a0Smrg               __glImageSize(width, 1, 1, format, type, 0);
154cdc920a0Smrg            const GLint heightsize =
155cdc920a0Smrg               __glImageSize(height, 1, 1, format, type, 0);
156cdc920a0Smrg            GLubyte *const buf =
157af69d88dSmrg               malloc((widthsize > heightsize) ? widthsize : heightsize);
158cdc920a0Smrg
159cdc920a0Smrg            if (buf == NULL) {
160cdc920a0Smrg               /* Throw data away */
161cdc920a0Smrg               _XEatData(dpy, compsize);
162cdc920a0Smrg               __glXSetError(gc, GL_OUT_OF_MEMORY);
163cdc920a0Smrg
164cdc920a0Smrg               UnlockDisplay(dpy);
165cdc920a0Smrg               SyncHandle();
166cdc920a0Smrg               return;
167cdc920a0Smrg            }
168cdc920a0Smrg            else {
169cdc920a0Smrg               int extra;
170cdc920a0Smrg
171cdc920a0Smrg               extra = 4 - (widthsize & 3);
172cdc920a0Smrg               _XRead(dpy, (char *) buf, widthsize);
173cdc920a0Smrg               if (extra < 4) {
174cdc920a0Smrg                  _XEatData(dpy, extra);
175cdc920a0Smrg               }
176cdc920a0Smrg
177cdc920a0Smrg               __glEmptyImage(gc, 1, width, 1, 1, format, type, buf, row);
178cdc920a0Smrg
179cdc920a0Smrg               extra = 4 - (heightsize & 3);
180cdc920a0Smrg               _XRead(dpy, (char *) buf, heightsize);
181cdc920a0Smrg               if (extra < 4) {
182cdc920a0Smrg                  _XEatData(dpy, extra);
183cdc920a0Smrg               }
184cdc920a0Smrg
185cdc920a0Smrg               __glEmptyImage(gc, 1, height, 1, 1, format, type, buf, column);
186cdc920a0Smrg
187af69d88dSmrg               free((char *) buf);
188cdc920a0Smrg            }
189cdc920a0Smrg         }
190cdc920a0Smrg      }
191cdc920a0Smrg   }
192cdc920a0Smrg}
193