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