blob: c8c7dd5c696dde8d92f32f64b552a103c1fa2c38 [file] [log] [blame]
Guido van Rossumb6775db1994-08-01 11:34:53 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/*
3Input used to generate the Python module "glmodule.c".
Guido van Rossumb3165151991-08-16 08:59:21 +00004The stub generator is a Python script called "cgen.py".
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
6Each definition must be contained on one line:
7
8<returntype> <name> <type> <arg> <type> <arg>
9
10<returntype> can be: void, short, long (XXX maybe others?)
11
12<type> can be: char, string, short, float, long, or double
13 string indicates a null terminated string;
14 if <type> is char and <arg> begins with a *, the * is stripped
15 and <type> is changed into string
16
17<arg> has the form <mode> or <mode>[<subscript>]
18 where <mode> can be
19 s: arg is sent
20 r: arg is received (arg is a pointer)
21 and <subscript> can be (N and I are numbers):
22 N
23 argI
24 retval
25 N*argI
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000026 N*I
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027 N*retval
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000028 In the case where the subscript consists of two parts
29 separated by *, the first part is the width of the matrix, and
30 the second part is the length of the matrix. This order is
31 opposite from the order used in C to declare a two-dimensional
32 matrix.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033*/
34
Jack Jansen743db361992-08-13 14:13:11 +000035/*
36 * An attempt has been made to make this module switch threads on qread
37 * calls. It is far from safe, though.
38 */
39
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040#include <gl.h>
41#include <device.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000042
Guido van Rossumece35bc1996-12-09 18:52:11 +000043#ifdef __sgi
44extern int devport();
45extern int textwritemask();
46extern int pagewritemask();
47extern int gewrite();
48extern int gettp();
49#endif
50
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000051#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052#include "cgensupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053
54/*
55Some stubs are too complicated for the stub generator.
56We can include manually written versions of them here.
57A line starting with '%' gives the name of the function so the stub
58generator can include it in the table of functions.
59*/
60
Jack Jansen743db361992-08-13 14:13:11 +000061% qread
62
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000063static PyObject *
Jack Jansen743db361992-08-13 14:13:11 +000064gl_qread(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000065 PyObject *self;
66 PyObject *args;
Jack Jansen743db361992-08-13 14:13:11 +000067{
68 long retval;
69 short arg1 ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000070 Py_BEGIN_ALLOW_THREADS
Jack Jansen743db361992-08-13 14:13:11 +000071 retval = qread( & arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000072 Py_END_ALLOW_THREADS
73 { PyObject *v = PyTuple_New( 2 );
Jack Jansen743db361992-08-13 14:13:11 +000074 if (v == NULL) return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000075 PyTuple_SetItem(v, 0, mknewlongobject(retval));
76 PyTuple_SetItem(v, 1, mknewshortobject(arg1));
Jack Jansen743db361992-08-13 14:13:11 +000077 return v;
78 }
79}
80
81
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082/*
83varray -- an array of v.. calls.
84The argument is an array (maybe list or tuple) of points.
85Each point must be a tuple or list of coordinates (x, y, z).
86The points may be 2- or 3-dimensional but must all have the
87same dimension. Float and int values may be mixed however.
88The points are always converted to 3D double precision points
89by assuming z=0.0 if necessary (as indicated in the man page),
90and for each point v3d() is called.
91*/
92
93% varray
94
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000095static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096gl_varray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000097 PyObject *self;
98 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000100 PyObject *v, *w=NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 int i, n, width;
102 double vec[3];
Sjoerd Mullenderf28b8982000-08-18 10:00:28 +0000103 PyObject * (*getitem)(PyObject *, int);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000105 if (!PyArg_GetObject(args, 1, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 return NULL;
107
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000108 if (PyList_Check(v)) {
109 n = PyList_Size(v);
110 getitem = PyList_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000112 else if (PyTuple_Check(v)) {
113 n = PyTuple_Size(v);
114 getitem = PyTuple_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 }
116 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000117 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 return NULL;
119 }
120
121 if (n == 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000122 Py_INCREF(Py_None);
123 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 }
125 if (n > 0)
126 w = (*getitem)(v, 0);
127
128 width = 0;
129 if (w == NULL) {
130 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000131 else if (PyList_Check(w)) {
132 width = PyList_Size(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000134 else if (PyTuple_Check(w)) {
135 width = PyTuple_Size(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 }
137
138 switch (width) {
139 case 2:
140 vec[2] = 0.0;
141 /* Fall through */
142 case 3:
143 break;
144 default:
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000145 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 return NULL;
147 }
148
149 for (i = 0; i < n; i++) {
150 w = (*getitem)(v, i);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000151 if (!PyArg_GetDoubleArray(w, 1, 0, width, vec))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152 return NULL;
153 v3d(vec);
154 }
155
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000156 Py_INCREF(Py_None);
157 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158}
159
160/*
161vnarray, nvarray -- an array of n3f and v3f calls.
162The argument is an array (list or tuple) of pairs of points and normals.
163Each pair is a tuple (NOT a list) of a point and a normal for that point.
164Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
165Three coordinates must be given. Float and int values may be mixed.
166For each pair, n3f() is called for the normal, and then v3f() is called
167for the vector.
168
169vnarray and nvarray differ only in the order of the vector and normal in
170the pair: vnarray expects (v, n) while nvarray expects (n, v).
171*/
172
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000173static PyObject *gen_nvarray(); /* Forward */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174
175% nvarray
176
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000177static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178gl_nvarray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000179 PyObject *self;
180 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
182 return gen_nvarray(args, 0);
183}
184
185% vnarray
186
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000187static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188gl_vnarray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000189 PyObject *self;
190 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
192 return gen_nvarray(args, 1);
193}
194
195/* Generic, internal version of {nv,nv}array: inorm indicates the
196 argument order, 0: normal first, 1: vector first. */
197
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000198static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199gen_nvarray(args, inorm)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000200 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 int inorm;
202{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000203 PyObject *v, *w, *wnorm, *wvec;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 int i, n;
205 float norm[3], vec[3];
Sjoerd Mullenderf28b8982000-08-18 10:00:28 +0000206 PyObject * (*getitem)(PyObject *, int);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000208 if (!PyArg_GetObject(args, 1, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 return NULL;
210
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000211 if (PyList_Check(v)) {
212 n = PyList_Size(v);
213 getitem = PyList_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000215 else if (PyTuple_Check(v)) {
216 n = PyTuple_Size(v);
217 getitem = PyTuple_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 }
219 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000220 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 return NULL;
222 }
223
224 for (i = 0; i < n; i++) {
225 w = (*getitem)(v, i);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000226 if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) {
227 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 return NULL;
229 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000230 wnorm = PyTuple_GetItem(w, inorm);
231 wvec = PyTuple_GetItem(w, 1 - inorm);
232 if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) ||
233 !PyArg_GetFloatArray(wvec, 1, 0, 3, vec))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234 return NULL;
235 n3f(norm);
236 v3f(vec);
237 }
238
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000239 Py_INCREF(Py_None);
240 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241}
242
243/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
244 The dimensions of ctl[] are computed as follows:
245 [len(s_knots) - s_order], [len(t_knots) - t_order]
246*/
247
248% nurbssurface
249
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000250static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251gl_nurbssurface(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000252 PyObject *self;
253 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254{
255 long arg1 ;
256 double * arg2 ;
257 long arg3 ;
258 double * arg4 ;
259 double *arg5 ;
260 long arg6 ;
261 long arg7 ;
262 long arg8 ;
263 long ncoords;
264 long s_byte_stride, t_byte_stride;
265 long s_nctl, t_nctl;
266 long s, t;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000267 PyObject *v, *w, *pt;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268 double *pnext;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000269 if (!PyArg_GetLongArraySize(args, 6, 0, &arg1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000271 if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
272 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000274 if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000276 if (!PyArg_GetLongArraySize(args, 6, 1, &arg3))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000278 if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) {
279 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000281 if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000283 if (!PyArg_GetLong(args, 6, 3, &arg6))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000285 if (!PyArg_GetLong(args, 6, 4, &arg7))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000287 if (!PyArg_GetLong(args, 6, 5, &arg8))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 return NULL;
289 if (arg8 == N_XYZ)
290 ncoords = 3;
291 else if (arg8 == N_XYZW)
292 ncoords = 4;
293 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000294 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 return NULL;
296 }
297 s_nctl = arg1 - arg6;
298 t_nctl = arg3 - arg7;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000299 if (!PyArg_GetObject(args, 6, 2, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000301 if (!PyList_Check(v) || PyList_Size(v) != s_nctl) {
302 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 return NULL;
304 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000305 if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
306 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 }
308 pnext = arg5;
309 for (s = 0; s < s_nctl; s++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000310 w = PyList_GetItem(v, s);
311 if (w == NULL || !PyList_Check(w) ||
312 PyList_Size(w) != t_nctl) {
313 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 return NULL;
315 }
316 for (t = 0; t < t_nctl; t++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000317 pt = PyList_GetItem(w, t);
318 if (!PyArg_GetDoubleArray(pt, 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 return NULL;
320 pnext += ncoords;
321 }
322 }
323 s_byte_stride = sizeof(double) * ncoords;
324 t_byte_stride = s_byte_stride * s_nctl;
325 nurbssurface( arg1 , arg2 , arg3 , arg4 ,
326 s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000327 PyMem_DEL(arg2);
328 PyMem_DEL(arg4);
329 PyMem_DEL(arg5);
330 Py_INCREF(Py_None);
331 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332}
333
334/* nurbscurve(knots, ctlpoints, order, type).
335 The length of ctlpoints is len(knots)-order. */
336
337%nurbscurve
338
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000339static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340gl_nurbscurve(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000341 PyObject *self;
342 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343{
344 long arg1 ;
345 double * arg2 ;
346 long arg3 ;
347 double * arg4 ;
348 long arg5 ;
349 long arg6 ;
350 int ncoords, npoints;
351 int i;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000352 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 double *pnext;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000354 if (!PyArg_GetLongArraySize(args, 4, 0, &arg1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000356 if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
357 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000359 if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000361 if (!PyArg_GetLong(args, 4, 2, &arg5))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000363 if (!PyArg_GetLong(args, 4, 3, &arg6))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 return NULL;
365 if (arg6 == N_ST)
366 ncoords = 2;
367 else if (arg6 == N_STW)
368 ncoords = 3;
369 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000370 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 return NULL;
372 }
373 npoints = arg1 - arg5;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000374 if (!PyArg_GetObject(args, 4, 1, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000376 if (!PyList_Check(v) || PyList_Size(v) != npoints) {
377 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 return NULL;
379 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000380 if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) {
381 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382 }
383 pnext = arg4;
384 for (i = 0; i < npoints; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000385 if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 return NULL;
387 pnext += ncoords;
388 }
389 arg3 = (sizeof(double)) * ncoords;
390 nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000391 PyMem_DEL(arg2);
392 PyMem_DEL(arg4);
393 Py_INCREF(Py_None);
394 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395}
396
397/* pwlcurve(points, type).
398 Points is a list of points. Type must be N_ST. */
399
400%pwlcurve
401
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000402static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403gl_pwlcurve(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000404 PyObject *self;
405 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000407 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408 long type;
409 double *data, *pnext;
410 long npoints, ncoords;
411 int i;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000412 if (!PyArg_GetObject(args, 2, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000414 if (!PyArg_GetLong(args, 2, 1, &type))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000416 if (!PyList_Check(v)) {
417 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418 return NULL;
419 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000420 npoints = PyList_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421 if (type == N_ST)
422 ncoords = 2;
423 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000424 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425 return NULL;
426 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000427 if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) {
428 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 }
430 pnext = data;
431 for (i = 0; i < npoints; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000432 if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433 return NULL;
434 pnext += ncoords;
435 }
436 pwlcurve(npoints, data, sizeof(double)*ncoords, type);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000437 PyMem_DEL(data);
438 Py_INCREF(Py_None);
439 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
442
443/* Picking and Selecting */
444
445static short *pickbuffer = NULL;
446static long pickbuffersize;
447
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000448static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449pick_select(args, func)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000450 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 void (*func)();
452{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000453 if (!PyArg_GetLong(args, 1, 0, &pickbuffersize))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 return NULL;
455 if (pickbuffer != NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000456 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 "pick/gselect: already picking/selecting");
458 return NULL;
459 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000460 if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) {
461 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462 }
463 (*func)(pickbuffer, pickbuffersize);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000464 Py_INCREF(Py_None);
465 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466}
467
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000468static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469endpick_select(args, func)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000470 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 long (*func)();
472{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000473 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474 int i, nhits, n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475 if (pickbuffer == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000476 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477 "endpick/endselect: not in pick/select mode");
478 return NULL;
479 }
480 nhits = (*func)(pickbuffer);
481 if (nhits < 0) {
482 nhits = -nhits; /* How to report buffer overflow otherwise? */
483 }
484 /* Scan the buffer to see how many integers */
485 n = 0;
486 for (; nhits > 0; nhits--) {
487 n += 1 + pickbuffer[n];
488 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000489 v = PyList_New(n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 if (v == NULL)
491 return NULL;
492 /* XXX Could do it nicer and interpret the data structure here,
493 returning a list of lists. But this can be done in Python... */
494 for (i = 0; i < n; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000495 w = PyInt_FromLong((long)pickbuffer[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000496 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000497 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 return NULL;
499 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000500 PyList_SetItem(v, i, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000502 PyMem_DEL(pickbuffer);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503 pickbuffer = NULL;
504 return v;
505}
506
507extern void pick(), gselect();
508extern long endpick(), endselect();
509
510%pick
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000511static PyObject *gl_pick(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 return pick_select(args, pick);
513}
514
515%endpick
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000516static PyObject *gl_endpick(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517 return endpick_select(args, endpick);
518}
519
520%gselect
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000521static PyObject *gl_gselect(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 return pick_select(args, gselect);
523}
524
525%endselect
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000526static PyObject *gl_endselect(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000527 return endpick_select(args, endselect);
528}
529
530
531/* XXX The generator botches this one. Here's a quick hack to fix it. */
532
Guido van Rossumb3165151991-08-16 08:59:21 +0000533/* XXX The generator botches this one. Here's a quick hack to fix it. */
534
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000535% getmatrix float r[16]
536
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000537static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538gl_getmatrix(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000539 PyObject *self;
540 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000542 Matrix arg1;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000543 PyObject *v, *w;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000544 int i, j;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 getmatrix( arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000546 v = PyList_New(16);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000547 if (v == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000548 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000550 for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
551 w = mknewfloatobject(arg1[i][j]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000553 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000554 return NULL;
555 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000556 PyList_SetItem(v, i*4+j, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557 }
558 return v;
559}
560
Guido van Rossumb3165151991-08-16 08:59:21 +0000561/* Here's an alternate version that returns a 4x4 matrix instead of
562 a vector. Unfortunately it is incompatible with loadmatrix and
563 multmatrix... */
564
565% altgetmatrix float r[4][4]
566
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000567static PyObject *
Guido van Rossumb3165151991-08-16 08:59:21 +0000568gl_altgetmatrix(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000569 PyObject *self;
570 PyObject *args;
Guido van Rossumb3165151991-08-16 08:59:21 +0000571{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000572 Matrix arg1;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000573 PyObject *v, *w;
Guido van Rossumb3165151991-08-16 08:59:21 +0000574 int i, j;
575 getmatrix( arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000576 v = PyList_New(4);
Guido van Rossumb3165151991-08-16 08:59:21 +0000577 if (v == NULL) {
578 return NULL;
579 }
580 for (i = 0; i < 4; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000581 w = PyList_New(4);
Guido van Rossumb3165151991-08-16 08:59:21 +0000582 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000583 Py_DECREF(v);
Guido van Rossumb3165151991-08-16 08:59:21 +0000584 return NULL;
585 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000586 PyList_SetItem(v, i, w);
Guido van Rossumb3165151991-08-16 08:59:21 +0000587 }
588 for (i = 0; i < 4; i++) {
589 for (j = 0; j < 4; j++) {
590 w = mknewfloatobject(arg1[i][j]);
591 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000592 Py_DECREF(v);
Guido van Rossumb3165151991-08-16 08:59:21 +0000593 return NULL;
594 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000595 PyList_SetItem(PyList_GetItem(v, i), j, w);
Guido van Rossumb3165151991-08-16 08:59:21 +0000596 }
597 }
598 return v;
599}
600
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000601% lrectwrite
602
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000603static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000604gl_lrectwrite(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000605 PyObject *self;
606 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000607{
608 short x1 ;
609 short y1 ;
610 short x2 ;
611 short y2 ;
612 string parray ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000613 PyObject *s;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000614#if 0
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000615 int pixcount;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000616#endif
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000617 if (!PyArg_GetShort(args, 5, 0, &x1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000618 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000619 if (!PyArg_GetShort(args, 5, 1, &y1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000620 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000621 if (!PyArg_GetShort(args, 5, 2, &x2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000622 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000623 if (!PyArg_GetShort(args, 5, 3, &y2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000624 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000625 if (!PyArg_GetString(args, 5, 4, &parray))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000626 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000627 if (!PyArg_GetObject(args, 5, 4, &s))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000628 return NULL;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000629#if 0
630/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000631 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000632 if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) {
633 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000634 "string arg to lrectwrite has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000635 return NULL;
636 }
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000637#endif
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000638 lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000639 Py_INCREF(Py_None);
640 return Py_None;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000641}
642
643% lrectread
644
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000645static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000646gl_lrectread(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000647 PyObject *self;
648 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000649{
650 short x1 ;
651 short y1 ;
652 short x2 ;
653 short y2 ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000654 PyObject *parray;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000655 int pixcount;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000656 if (!PyArg_GetShort(args, 4, 0, &x1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000657 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000658 if (!PyArg_GetShort(args, 4, 1, &y1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000659 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000660 if (!PyArg_GetShort(args, 4, 2, &x2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000661 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000662 if (!PyArg_GetShort(args, 4, 3, &y2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000663 return NULL;
664 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000665 parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000666 if (parray == NULL)
667 return NULL; /* No memory */
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000668 lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000669 return parray;
670}
671
Jack Jansen5fc67731993-02-16 09:25:15 +0000672% readdisplay
673
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000674static PyObject *
Jack Jansen5fc67731993-02-16 09:25:15 +0000675gl_readdisplay(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000676 PyObject *self;
677 PyObject *args;
Jack Jansen5fc67731993-02-16 09:25:15 +0000678{
679 short x1, y1, x2, y2;
680 unsigned long *parray, hints;
681 long size, size_ret;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000682 PyObject *rv;
Jack Jansen5fc67731993-02-16 09:25:15 +0000683
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000684 if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) )
Jack Jansen5fc67731993-02-16 09:25:15 +0000685 return 0;
686 size = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000687 rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long));
Jack Jansen5fc67731993-02-16 09:25:15 +0000688 if ( rv == NULL )
689 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000690 parray = (unsigned long *)PyString_AsString(rv);
Jack Jansen5fc67731993-02-16 09:25:15 +0000691 size_ret = readdisplay(x1, y1, x2, y2, parray, hints);
692 if ( size_ret != size ) {
Guido van Rossumece35bc1996-12-09 18:52:11 +0000693 printf("gl_readdisplay: got %ld pixels, expected %ld\n",
Jack Jansen5fc67731993-02-16 09:25:15 +0000694 size_ret, size);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000695 PyErr_SetString(PyExc_RuntimeError, "readdisplay returned unexpected length");
Jack Jansen5fc67731993-02-16 09:25:15 +0000696 return NULL;
697 }
698 return rv;
699}
700
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000701/* Desperately needed, here are tools to compress and decompress
702 the data manipulated by lrectread/lrectwrite.
703
704 gl.packrect(width, height, packfactor, bigdata) --> smalldata
705 makes 'bigdata' 4*(packfactor**2) times smaller by:
706 - turning it into B/W (a factor 4)
707 - replacing squares of size pacfactor by one
708 representative
709
710 gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
711 is the inverse; the numeric arguments must be *the same*.
712
713 Both work best if width and height are multiples of packfactor
714 (in fact unpackrect will leave garbage bytes).
715*/
716
717% packrect
718
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000719static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000720gl_packrect(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000721 PyObject *self;
722 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000723{
724 long width, height, packfactor;
725 char *s;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000726 PyObject *unpacked, *packed;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000727 int pixcount, packedcount, x, y, r, g, b;
728 unsigned long pixel;
729 unsigned char *p;
730 unsigned long *parray;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000731 if (!PyArg_GetLong(args, 4, 0, &width))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000732 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000733 if (!PyArg_GetLong(args, 4, 1, &height))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000734 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000735 if (!PyArg_GetLong(args, 4, 2, &packfactor))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000736 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000737 if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000738 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000739 if (!PyArg_GetObject(args, 4, 3, &unpacked))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000740 return NULL;
741 if (width <= 0 || height <= 0 || packfactor <= 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000742 PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000743 return NULL;
744 }
745 pixcount = width*height;
746 packedcount = ((width+packfactor-1)/packfactor) *
747 ((height+packfactor-1)/packfactor);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000748 if (PyString_Size(unpacked) != pixcount*sizeof(long)) {
749 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000750 "string arg to packrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000751 return NULL;
752 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000753 packed = PyString_FromStringAndSize((char *)NULL, packedcount);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000754 if (packed == NULL)
755 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000756 parray = (unsigned long *) PyString_AsString(unpacked);
757 p = (unsigned char *) PyString_AsString(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000758 for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
759 for (x = 0; x < width; x += packfactor) {
760 pixel = parray[x];
761 r = pixel & 0xff;
762 g = (pixel >> 8) & 0xff;
763 b = (pixel >> 16) & 0xff;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000764 *p++ = (30*r+59*g+11*b) / 100;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000765 }
766 }
767 return packed;
768}
769
770% unpackrect
771
772static unsigned long unpacktab[256];
773static int unpacktab_inited = 0;
774
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000775static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000776gl_unpackrect(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000777 PyObject *self;
778 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000779{
780 long width, height, packfactor;
781 char *s;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000782 PyObject *unpacked, *packed;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000783 int pixcount, packedcount;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000784 register unsigned char *p;
785 register unsigned long *parray;
786 if (!unpacktab_inited) {
787 register int white;
788 for (white = 256; --white >= 0; )
789 unpacktab[white] = white * 0x010101L;
790 unpacktab_inited++;
791 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000792 if (!PyArg_GetLong(args, 4, 0, &width))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000793 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000794 if (!PyArg_GetLong(args, 4, 1, &height))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000795 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000796 if (!PyArg_GetLong(args, 4, 2, &packfactor))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000797 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000798 if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000799 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000800 if (!PyArg_GetObject(args, 4, 3, &packed))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000801 return NULL;
802 if (width <= 0 || height <= 0 || packfactor <= 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000803 PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000804 return NULL;
805 }
806 pixcount = width*height;
807 packedcount = ((width+packfactor-1)/packfactor) *
808 ((height+packfactor-1)/packfactor);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000809 if (PyString_Size(packed) != packedcount) {
810 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000811 "string arg to unpackrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000812 return NULL;
813 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000814 unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000815 if (unpacked == NULL)
816 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000817 parray = (unsigned long *) PyString_AsString(unpacked);
818 p = (unsigned char *) PyString_AsString(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000819 if (packfactor == 1 && width*height > 0) {
820 /* Just expand bytes to longs */
821 register int x = width * height;
822 do {
823 *parray++ = unpacktab[*p++];
824 } while (--x >= 0);
825 }
826 else {
827 register int y;
828 for (y = 0; y < height-packfactor+1;
829 y += packfactor, parray += packfactor*width) {
830 register int x;
831 for (x = 0; x < width-packfactor+1; x += packfactor) {
832 register unsigned long pixel = unpacktab[*p++];
833 register int i;
834 for (i = packfactor*width; (i-=width) >= 0;) {
835 register int j;
836 for (j = packfactor; --j >= 0; )
837 parray[i+x+j] = pixel;
838 }
839 }
840 }
841 }
842 return unpacked;
843}
844
Guido van Rossumaee08791992-09-08 09:05:33 +0000845% gversion
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000846static PyObject *
Guido van Rossumaee08791992-09-08 09:05:33 +0000847gl_gversion(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000848 PyObject *self;
849 PyObject *args;
Guido van Rossumaee08791992-09-08 09:05:33 +0000850{
851 char buf[20];
852 gversion(buf);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000853 return PyString_FromString(buf);
Guido van Rossumaee08791992-09-08 09:05:33 +0000854}
855
856
Guido van Rossum5c069fd1998-04-28 16:09:16 +0000857/* void clear - Manual because of clash with termcap */
858%clear
859static PyObject *
860gl_clear(self, args)
861 PyObject *self;
862 PyObject *args;
863{
864 __GLclear( );
865 Py_INCREF(Py_None);
866 return Py_None;
867}
868
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000869/* End of manually written stubs */
870
871%%
872
873long getshade
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000874if !solaris void devport short s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000875void rdr2i long s long s
876void rectfs short s short s short s short s
877void rects short s short s short s short s
878void rmv2i long s long s
879void noport
880void popviewport
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000881void clearhitcode
882void closeobj
883void cursoff
884void curson
885void doublebuffer
886void finish
887void gconfig
888void ginit
889void greset
890void multimap
891void onemap
892void popattributes
893void popmatrix
894void pushattributes
895void pushmatrix
896void pushviewport
897void qreset
898void RGBmode
899void singlebuffer
900void swapbuffers
901void gsync
Guido van Rossum06a67021992-02-26 15:19:45 +0000902void gflush
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000903void tpon
904void tpoff
905void clkon
906void clkoff
907void ringbell
908#void callfunc
909void gbegin
910void textinit
911void initnames
912void pclos
913void popname
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000914if !solaris void spclos
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000915void zclear
916void screenspace
917void reshapeviewport
918void winpush
919void winpop
920void foreground
921void endfullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000922if !solaris void endpupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000923void fullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000924if !solaris void pupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000925void winconstraints
926void pagecolor short s
927void textcolor short s
928void color short s
929void curveit short s
930void font short s
931void linewidth short s
932void setlinestyle short s
933void setmap short s
934void swapinterval short s
935void writemask short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000936if !solaris void textwritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000937void qdevice short s
938void unqdevice short s
939void curvebasis short s
940void curveprecision short s
941void loadname short s
942void passthrough short s
943void pushname short s
944void setmonitor short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000945if !solaris void setshade short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000946void setpattern short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000947if !solaris void pagewritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000948#
949void callobj long s
950void delobj long s
951void editobj long s
952void makeobj long s
953void maketag long s
954void chunksize long s
955void compactify long s
956void deltag long s
957void lsrepeat long s
958void objinsert long s
959void objreplace long s
960void winclose long s
961void blanktime long s
962void freepup long s
963# This is not in the library!?
964###void pupcolor long s
965#
966void backbuffer long s
967void frontbuffer long s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000968if !solaris void lsbackup long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000969void resetls long s
970void lampon long s
971void lampoff long s
972void setbell long s
973void blankscreen long s
974void depthcue long s
975void zbuffer long s
976void backface long s
977#
978void cmov2i long s long s
979void draw2i long s long s
980void move2i long s long s
981void pnt2i long s long s
982void patchbasis long s long s
983void patchprecision long s long s
984void pdr2i long s long s
985void pmv2i long s long s
986void rpdr2i long s long s
987void rpmv2i long s long s
988void xfpt2i long s long s
989void objdelete long s long s
990void patchcurves long s long s
991void minsize long s long s
992void maxsize long s long s
993void keepaspect long s long s
994void prefsize long s long s
995void stepunit long s long s
996void fudge long s long s
997void winmove long s long s
998#
999void attachcursor short s short s
1000void deflinestyle short s short s
1001void noise short s short s
1002void picksize short s short s
1003void qenter short s short s
1004void setdepth short s short s
1005void cmov2s short s short s
1006void draw2s short s short s
1007void move2s short s short s
1008void pdr2s short s short s
1009void pmv2s short s short s
1010void pnt2s short s short s
1011void rdr2s short s short s
1012void rmv2s short s short s
1013void rpdr2s short s short s
1014void rpmv2s short s short s
1015void xfpt2s short s short s
1016#
1017void cmov2 float s float s
1018void draw2 float s float s
1019void move2 float s float s
1020void pnt2 float s float s
1021void pdr2 float s float s
1022void pmv2 float s float s
1023void rdr2 float s float s
1024void rmv2 float s float s
1025void rpdr2 float s float s
1026void rpmv2 float s float s
1027void xfpt2 float s float s
1028#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001029void loadmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001030# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001031void multmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001032# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001033void crv float s[3*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001034# Really [4][3]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001035void rcrv float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001036# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001037#
1038# Methods that have strings.
1039#
1040void addtopup long s char *s long s
1041void charstr char *s
1042void getport char *s
1043long strwidth char *s
1044long winopen char *s
1045void wintitle char *s
1046#
1047# Methods that have 1 long (# of elements) and an array
1048#
1049void polf long s float s[3*arg1]
1050void polf2 long s float s[2*arg1]
1051void poly long s float s[3*arg1]
1052void poly2 long s float s[2*arg1]
1053void crvn long s float s[3*arg1]
1054void rcrvn long s float s[4*arg1]
1055#
1056void polf2i long s long s[2*arg1]
1057void polfi long s long s[3*arg1]
1058void poly2i long s long s[2*arg1]
1059void polyi long s long s[3*arg1]
1060#
1061void polf2s long s short s[2*arg1]
1062void polfs long s short s[3*arg1]
1063void polys long s short s[3*arg1]
1064void poly2s long s short s[2*arg1]
1065#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001066void defcursor short s u_short s[128]
Guido van Rossumb3165151991-08-16 08:59:21 +00001067# Is this useful?
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001068void writepixels short s u_short s[arg1]
Guido van Rossumb3165151991-08-16 08:59:21 +00001069# Should be unsigned short...
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001070void defbasis long s float s[4*4]
1071if !solaris void gewrite short s short s[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001072#
1073void rotate short s char s
1074# This is not in the library!?
1075###void setbutton short s char s
1076void rot float s char s
1077#
1078void circfi long s long s long s
1079void circi long s long s long s
1080void cmovi long s long s long s
1081void drawi long s long s long s
1082void movei long s long s long s
1083void pnti long s long s long s
1084void newtag long s long s long s
1085void pdri long s long s long s
1086void pmvi long s long s long s
1087void rdri long s long s long s
1088void rmvi long s long s long s
1089void rpdri long s long s long s
1090void rpmvi long s long s long s
1091void xfpti long s long s long s
1092#
1093void circ float s float s float s
1094void circf float s float s float s
1095void cmov float s float s float s
1096void draw float s float s float s
1097void move float s float s float s
1098void pnt float s float s float s
1099void scale float s float s float s
1100void translate float s float s float s
1101void pdr float s float s float s
1102void pmv float s float s float s
1103void rdr float s float s float s
1104void rmv float s float s float s
1105void rpdr float s float s float s
1106void rpmv float s float s float s
1107void xfpt float s float s float s
1108#
1109void RGBcolor short s short s short s
1110void RGBwritemask short s short s short s
1111void setcursor short s short s short s
1112void tie short s short s short s
1113void circfs short s short s short s
1114void circs short s short s short s
1115void cmovs short s short s short s
1116void draws short s short s short s
1117void moves short s short s short s
1118void pdrs short s short s short s
1119void pmvs short s short s short s
1120void pnts short s short s short s
1121void rdrs short s short s short s
1122void rmvs short s short s short s
1123void rpdrs short s short s short s
1124void rpmvs short s short s short s
1125void xfpts short s short s short s
1126void curorigin short s short s short s
1127void cyclemap short s short s short s
1128#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001129void patch float s[4*4] float s[4*4] float s[4*4]
1130void splf long s float s[3*arg1] u_short s[arg1]
1131void splf2 long s float s[2*arg1] u_short s[arg1]
1132void splfi long s long s[3*arg1] u_short s[arg1]
1133void splf2i long s long s[2*arg1] u_short s[arg1]
1134void splfs long s short s[3*arg1] u_short s[arg1]
1135void splf2s long s short s[2*arg1] u_short s[arg1]
1136###void defpattern short s short s u_short s[arg2*arg2/16]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001137#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001138void rpatch float s[4*4] float s[4*4] float s[4*4] float s[4*4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001139#
1140# routines that send 4 floats
1141#
1142void ortho2 float s float s float s float s
1143void rect float s float s float s float s
1144void rectf float s float s float s float s
1145void xfpt4 float s float s float s float s
1146#
1147void textport short s short s short s short s
1148void mapcolor short s short s short s short s
1149void scrmask short s short s short s short s
1150void setvaluator short s short s short s short s
1151void viewport short s short s short s short s
1152void shaderange short s short s short s short s
1153void xfpt4s short s short s short s short s
1154void rectfi long s long s long s long s
1155void recti long s long s long s long s
1156void xfpt4i long s long s long s long s
1157void prefposition long s long s long s long s
1158#
1159void arc float s float s float s short s short s
1160void arcf float s float s float s short s short s
1161void arcfi long s long s long s short s short s
1162void arci long s long s long s short s short s
1163#
1164void bbox2 short s short s float s float s float s float s
1165void bbox2i short s short s long s long s long s long s
1166void bbox2s short s short s short s short s short s short s
1167void blink short s short s short s short s short s
1168void ortho float s float s float s float s float s float s
1169void window float s float s float s float s float s float s
1170void lookat float s float s float s float s float s float s short s
1171#
1172void perspective short s float s float s float s
1173void polarview float s short s short s short s
1174# XXX getichararray not supported
1175#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
1176#
1177void arcfs short s short s short s short s short s
1178void arcs short s short s short s short s short s
1179void rectcopy short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001180if !solaris void RGBcursor short s short s short s short s short s short s short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001181#
1182long getbutton short s
1183long getcmmode
1184long getlsbackup
1185long getresetls
1186long getdcm
1187long getzbuffer
1188long ismex
1189long isobj long s
1190long isqueued short s
1191long istag long s
1192#
1193long genobj
1194long gentag
1195long getbuffer
1196long getcolor
1197long getdisplaymode
1198long getfont
1199long getheight
1200long gethitcode
1201long getlstyle
1202long getlwidth
1203long getmap
1204long getplanes
1205long getwritemask
1206long qtest
1207long getlsrepeat
1208long getmonitor
1209long getopenobj
1210long getpattern
1211long winget
1212long winattach
1213long getothermonitor
1214long newpup
1215#
1216long getvaluator short s
1217void winset long s
1218long dopup long s
1219void getdepth short r short r
1220void getcpos short r short r
1221void getsize long r long r
1222void getorigin long r long r
1223void getviewport short r short r short r short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001224if !solaris void gettp short r short r short r short r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225void getgpos float r float r float r float r
1226void winposition long s long s long s long s
1227void gRGBcolor short r short r short r
1228void gRGBmask short r short r short r
1229void getscrmask short r short r short r short r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001230###void gRGBcursor short r short r short r short r short r short r short r short r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001231void getmcolor short s short r short r short r
1232void mapw long s short s short s float r float r float r float r float r float r
1233void mapw2 long s short s short s float r float r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001234###void defrasterfont short s short s short s Fontchar s[arg3] short s short s[4*arg5]
Guido van Rossum39789031992-08-13 14:23:56 +00001235###long qread short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001236void getcursor short r u_short r u_short r long r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237#
1238# For these we receive arrays of stuff
1239#
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001240###void getdev long s short s[arg1] short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001241#XXX not generated correctly yet
1242#void getmatrix float r[16]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001243###long readpixels short s short r[retval]
1244###long readRGB short s char r[retval] char r[retval] char r[retval]
1245###long blkqread short s short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001246#
1247# New 4D routines
1248#
1249void cmode
1250void concave long s
1251void curstype long s
1252void drawmode long s
1253void gammaramp short s[256] short s[256] short s[256]
1254long getbackface
1255long getdescender
1256long getdrawmode
1257long getmmode
1258long getsm
1259long getvideo long s
1260void imakebackground
1261void lmbind short s short s
1262void lmdef long s long s long s float s[arg3]
1263void mmode long s
1264void normal float s[3]
1265void overlay long s
1266void RGBrange short s short s short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001267if !solaris void setvideo long s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001268void shademodel long s
1269void underlay long s
1270#
1271# New Personal Iris/GT Routines
1272#
1273void bgnclosedline
1274void bgnline
1275void bgnpoint
1276void bgnpolygon
1277void bgnsurface
1278void bgntmesh
1279void bgntrim
1280void endclosedline
1281void endline
1282void endpoint
1283void endpolygon
1284void endsurface
1285void endtmesh
1286void endtrim
1287void blendfunction long s long s
1288void c3f float s[3]
1289void c3i long s[3]
1290void c3s short s[3]
1291void c4f float s[4]
1292void c4i long s[4]
1293void c4s short s[4]
1294void colorf float s
1295void cpack long s
1296void czclear long s long s
1297void dglclose long s
1298long dglopen char *s long s
1299long getgdesc long s
1300void getnurbsproperty long s float r
1301void glcompat long s long s
1302void iconsize long s long s
1303void icontitle char *s
1304void lRGBrange short s short s short s short s short s short s long s long s
1305void linesmooth long s
1306void lmcolor long s
1307void logicop long s
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001308###long lrectread short s short s short s short s long r[retval]
1309###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
1310### Now manual, with string last arg
1311###long rectread short s short s short s short s short r[retval]
1312###void rectwrite short s short s short s short s short s[(arg2-arg1+1)*(arg4-arg3+1)]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001313void lsetdepth long s long s
1314void lshaderange short s short s long s long s
1315void n3f float s[3]
1316void noborder
1317void pntsmooth long s
1318void readsource long s
1319void rectzoom float s float s
1320void sbox float s float s float s float s
1321void sboxi long s long s long s long s
1322void sboxs short s short s short s short s
1323void sboxf float s float s float s float s
1324void sboxfi long s long s long s long s
1325void sboxfs short s short s short s short s
1326void setnurbsproperty long s float s
1327void setpup long s long s long s
1328void smoothline long s
1329void subpixel long s
1330void swaptmesh
1331long swinopen long s
1332void v2f float s[2]
1333void v2i long s[2]
1334void v2s short s[2]
1335void v3f float s[3]
1336void v3i long s[3]
1337void v3s short s[3]
1338void v4f float s[4]
1339void v4i long s[4]
1340void v4s short s[4]
1341void videocmd long s
1342long windepth long s
1343void wmpack long s
1344void zdraw long s
1345void zfunction long s
1346void zsource long s
1347void zwritemask long s
1348#
1349# uses doubles
1350#
1351void v2d double s[2]
1352void v3d double s[3]
1353void v4d double s[4]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001354#
1355# Why isn't this here?
1356#
1357void pixmode long s long s
Guido van Rossumdd9ed831992-06-29 17:10:40 +00001358#
1359# New in IRIX 4.0
1360#
1361long qgetfd
Jack Jansenfa1b9f61993-02-19 12:53:12 +00001362void dither long s