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