/* * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. * * SPDX-License-Identifier: SGI-B-2.0 */ #include "packsingle.h" #include "indirect.h" #include "glapi.h" #include void __indirect_glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span) { __GLX_SINGLE_DECLARE_VARIABLES(); const __GLXattribute *state; xGLXGetSeparableFilterReply reply; GLubyte *rowBuf, *colBuf; if (!dpy) return; __GLX_SINGLE_LOAD_VARIABLES(); state = gc->client_state_private; /* Send request */ __GLX_SINGLE_BEGIN(X_GLsop_GetSeparableFilter, __GLX_PAD(13)); __GLX_SINGLE_PUT_LONG(0, target); __GLX_SINGLE_PUT_LONG(4, format); __GLX_SINGLE_PUT_LONG(8, type); __GLX_SINGLE_PUT_CHAR(12, state->storePack.swapEndian); __GLX_SINGLE_READ_XREPLY(); compsize = reply.length << 2; if (compsize != 0) { GLint width, height; GLint widthsize, heightsize; width = reply.width; height = reply.height; widthsize = __glImageSize(width, 1, 1, format, type, 0); heightsize = __glImageSize(height, 1, 1, format, type, 0); /* Allocate a holding buffer to transform the data from */ rowBuf = malloc(widthsize); if (!rowBuf) { /* Throw data away */ _XEatData(dpy, compsize); __glXSetError(gc, GL_OUT_OF_MEMORY); UnlockDisplay(dpy); SyncHandle(); return; } else { __GLX_SINGLE_GET_CHAR_ARRAY(((char *) rowBuf), widthsize); __glEmptyImage(gc, 1, width, 1, 1, format, type, rowBuf, row); free((char *) rowBuf); } colBuf = malloc(heightsize); if (!colBuf) { /* Throw data away */ _XEatData(dpy, compsize - __GLX_PAD(widthsize)); __glXSetError(gc, GL_OUT_OF_MEMORY); UnlockDisplay(dpy); SyncHandle(); return; } else { __GLX_SINGLE_GET_CHAR_ARRAY(((char *) colBuf), heightsize); __glEmptyImage(gc, 1, height, 1, 1, format, type, colBuf, column); free((char *) colBuf); } } else { /* ** don't modify user's buffer. */ } __GLX_SINGLE_END(); }