~ubuntu-branches/ubuntu/quantal/mesa/quantal

« back to all changes in this revision

Viewing changes to src/glx/x11/singlepix.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2007-02-21 12:44:07 UTC
  • mfrom: (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 22.
  • Revision ID: james.westby@ubuntu.com-20070221124407-rgcacs32mycrtadl
ImportĀ upstreamĀ versionĀ 6.5.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
 
37
37
#include "packsingle.h"
38
38
#include "indirect.h"
 
39
#include "dispatch.h"
 
40
#include "glapi.h"
 
41
#include "glthread.h"
 
42
#include "glapioffsets.h"
 
43
#include <GL/glxproto.h>
39
44
 
40
45
void __indirect_glGetSeparableFilter(GLenum target, GLenum format, GLenum type,
41
46
                          GLvoid *row, GLvoid *column, GLvoid *span)
103
108
    __GLX_SINGLE_END();
104
109
    
105
110
}
 
111
 
 
112
 
 
113
#define CONCAT(a,b) a ## b
 
114
#define NAME(o) CONCAT(gl_dispatch_stub_, o)
 
115
 
 
116
void NAME(_gloffset_GetSeparableFilter)(GLenum target, GLenum format, GLenum type,
 
117
                                        GLvoid *row, GLvoid *column, GLvoid *span)
 
118
{
 
119
    __GLXcontext * const gc = __glXGetCurrentContext();
 
120
 
 
121
    if (gc->isDirect) {
 
122
        CALL_GetSeparableFilter(GET_DISPATCH(),
 
123
                                (target, format, type, row, column, span));
 
124
        return;
 
125
    }
 
126
    else {
 
127
        Display *const dpy = gc->currentDpy;
 
128
        const GLuint cmdlen = __GLX_PAD(13);
 
129
 
 
130
        if (dpy != NULL) {
 
131
            const __GLXattribute * const state = gc->client_state_private;
 
132
            xGLXGetSeparableFilterReply reply;
 
133
            GLubyte const *pc =
 
134
              __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
 
135
                                      X_GLvop_GetSeparableFilterEXT, cmdlen);
 
136
            unsigned compsize;
 
137
 
 
138
 
 
139
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
 
140
            (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
 
141
            (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
 
142
            *(int8_t *) (pc + 12) = state->storePack.swapEndian;
 
143
 
 
144
            (void) _XReply(dpy, (xReply *) & reply, 0, False);
 
145
 
 
146
            compsize = reply.length << 2;
 
147
 
 
148
            if (compsize != 0) {
 
149
                const GLint width = reply.width;
 
150
                const GLint height = reply.height;
 
151
                const GLint widthsize =
 
152
                  __glImageSize(width, 1, 1, format, type, 0);
 
153
                const GLint heightsize =
 
154
                  __glImageSize(height, 1, 1, format, type, 0);
 
155
                GLubyte * const buf =
 
156
                  (GLubyte*) Xmalloc((widthsize > heightsize) ? widthsize : heightsize);
 
157
 
 
158
                if (buf == NULL) {
 
159
                    /* Throw data away */
 
160
                    _XEatData(dpy, compsize);
 
161
                    __glXSetError(gc, GL_OUT_OF_MEMORY);
 
162
 
 
163
                    UnlockDisplay(dpy);
 
164
                    SyncHandle();
 
165
                    return;
 
166
                } else {
 
167
                    int extra;
 
168
                    
 
169
                    extra = 4 - (widthsize & 3);
 
170
                    _XRead(dpy, (char *)buf, widthsize);
 
171
                    if (extra < 4) {
 
172
                        _XEatData(dpy, extra);
 
173
                    }
 
174
 
 
175
                    __glEmptyImage(gc, 1, width, 1, 1, format, type, buf,
 
176
                                   row);
 
177
 
 
178
                    extra = 4 - (heightsize & 3);
 
179
                    _XRead(dpy, (char *)buf, heightsize);
 
180
                    if (extra < 4) {
 
181
                        _XEatData(dpy, extra);
 
182
                    }
 
183
 
 
184
                    __glEmptyImage(gc, 1, height, 1, 1, format, type, buf,
 
185
                                   column);
 
186
 
 
187
                    Xfree((char*) buf);
 
188
                }
 
189
            }
 
190
        }
 
191
    }
 
192
}