blob: 88d57c55be91c303881dd50e57dc949c994cb9cc [file] [log] [blame]
Guido van Rossumb6775db1994-08-01 11:34:53 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumb6775db1994-08-01 11:34:53 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumb6775db1994-08-01 11:34:53 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumb6775db1994-08-01 11:34:53 +000014
15******************************************************************/
16
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017/*
18Input used to generate the Python module "glmodule.c".
Guido van Rossumb3165151991-08-16 08:59:21 +000019The stub generator is a Python script called "cgen.py".
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020
21Each definition must be contained on one line:
22
23<returntype> <name> <type> <arg> <type> <arg>
24
25<returntype> can be: void, short, long (XXX maybe others?)
26
27<type> can be: char, string, short, float, long, or double
28 string indicates a null terminated string;
29 if <type> is char and <arg> begins with a *, the * is stripped
30 and <type> is changed into string
31
32<arg> has the form <mode> or <mode>[<subscript>]
33 where <mode> can be
34 s: arg is sent
35 r: arg is received (arg is a pointer)
36 and <subscript> can be (N and I are numbers):
37 N
38 argI
39 retval
40 N*argI
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000041 N*I
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042 N*retval
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000043 In the case where the subscript consists of two parts
44 separated by *, the first part is the width of the matrix, and
45 the second part is the length of the matrix. This order is
46 opposite from the order used in C to declare a two-dimensional
47 matrix.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048*/
49
Jack Jansen743db361992-08-13 14:13:11 +000050/*
51 * An attempt has been made to make this module switch threads on qread
52 * calls. It is far from safe, though.
53 */
54
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055#include <gl.h>
56#include <device.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000057
Guido van Rossumece35bc1996-12-09 18:52:11 +000058#ifdef __sgi
59extern int devport();
60extern int textwritemask();
61extern int pagewritemask();
62extern int gewrite();
63extern int gettp();
64#endif
65
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000066#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067#include "cgensupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068
69/*
70Some stubs are too complicated for the stub generator.
71We can include manually written versions of them here.
72A line starting with '%' gives the name of the function so the stub
73generator can include it in the table of functions.
74*/
75
Jack Jansen743db361992-08-13 14:13:11 +000076% qread
77
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000078static PyObject *
Jack Jansen743db361992-08-13 14:13:11 +000079gl_qread(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000080 PyObject *self;
81 PyObject *args;
Jack Jansen743db361992-08-13 14:13:11 +000082{
83 long retval;
84 short arg1 ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000085 Py_BEGIN_ALLOW_THREADS
Jack Jansen743db361992-08-13 14:13:11 +000086 retval = qread( & arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000087 Py_END_ALLOW_THREADS
88 { PyObject *v = PyTuple_New( 2 );
Jack Jansen743db361992-08-13 14:13:11 +000089 if (v == NULL) return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000090 PyTuple_SetItem(v, 0, mknewlongobject(retval));
91 PyTuple_SetItem(v, 1, mknewshortobject(arg1));
Jack Jansen743db361992-08-13 14:13:11 +000092 return v;
93 }
94}
95
96
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097/*
98varray -- an array of v.. calls.
99The argument is an array (maybe list or tuple) of points.
100Each point must be a tuple or list of coordinates (x, y, z).
101The points may be 2- or 3-dimensional but must all have the
102same dimension. Float and int values may be mixed however.
103The points are always converted to 3D double precision points
104by assuming z=0.0 if necessary (as indicated in the man page),
105and for each point v3d() is called.
106*/
107
108% varray
109
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000110static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111gl_varray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000112 PyObject *self;
113 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000115 PyObject *v, *w=NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 int i, n, width;
117 double vec[3];
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000118 PyObject * (*getitem) Py_FPROTO((PyObject *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000120 if (!PyArg_GetObject(args, 1, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121 return NULL;
122
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000123 if (PyList_Check(v)) {
124 n = PyList_Size(v);
125 getitem = PyList_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000127 else if (PyTuple_Check(v)) {
128 n = PyTuple_Size(v);
129 getitem = PyTuple_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 }
131 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000132 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 return NULL;
134 }
135
136 if (n == 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000137 Py_INCREF(Py_None);
138 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 }
140 if (n > 0)
141 w = (*getitem)(v, 0);
142
143 width = 0;
144 if (w == NULL) {
145 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000146 else if (PyList_Check(w)) {
147 width = PyList_Size(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000149 else if (PyTuple_Check(w)) {
150 width = PyTuple_Size(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 }
152
153 switch (width) {
154 case 2:
155 vec[2] = 0.0;
156 /* Fall through */
157 case 3:
158 break;
159 default:
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000160 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161 return NULL;
162 }
163
164 for (i = 0; i < n; i++) {
165 w = (*getitem)(v, i);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000166 if (!PyArg_GetDoubleArray(w, 1, 0, width, vec))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 return NULL;
168 v3d(vec);
169 }
170
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000171 Py_INCREF(Py_None);
172 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173}
174
175/*
176vnarray, nvarray -- an array of n3f and v3f calls.
177The argument is an array (list or tuple) of pairs of points and normals.
178Each pair is a tuple (NOT a list) of a point and a normal for that point.
179Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
180Three coordinates must be given. Float and int values may be mixed.
181For each pair, n3f() is called for the normal, and then v3f() is called
182for the vector.
183
184vnarray and nvarray differ only in the order of the vector and normal in
185the pair: vnarray expects (v, n) while nvarray expects (n, v).
186*/
187
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000188static PyObject *gen_nvarray(); /* Forward */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189
190% nvarray
191
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000192static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193gl_nvarray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000194 PyObject *self;
195 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196{
197 return gen_nvarray(args, 0);
198}
199
200% vnarray
201
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000202static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203gl_vnarray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000204 PyObject *self;
205 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206{
207 return gen_nvarray(args, 1);
208}
209
210/* Generic, internal version of {nv,nv}array: inorm indicates the
211 argument order, 0: normal first, 1: vector first. */
212
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000213static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214gen_nvarray(args, inorm)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000215 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216 int inorm;
217{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000218 PyObject *v, *w, *wnorm, *wvec;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219 int i, n;
220 float norm[3], vec[3];
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000221 PyObject * (*getitem) Py_FPROTO((PyObject *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000223 if (!PyArg_GetObject(args, 1, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224 return NULL;
225
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000226 if (PyList_Check(v)) {
227 n = PyList_Size(v);
228 getitem = PyList_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000230 else if (PyTuple_Check(v)) {
231 n = PyTuple_Size(v);
232 getitem = PyTuple_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233 }
234 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000235 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 return NULL;
237 }
238
239 for (i = 0; i < n; i++) {
240 w = (*getitem)(v, i);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000241 if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) {
242 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 return NULL;
244 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000245 wnorm = PyTuple_GetItem(w, inorm);
246 wvec = PyTuple_GetItem(w, 1 - inorm);
247 if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) ||
248 !PyArg_GetFloatArray(wvec, 1, 0, 3, vec))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 return NULL;
250 n3f(norm);
251 v3f(vec);
252 }
253
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000254 Py_INCREF(Py_None);
255 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256}
257
258/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
259 The dimensions of ctl[] are computed as follows:
260 [len(s_knots) - s_order], [len(t_knots) - t_order]
261*/
262
263% nurbssurface
264
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000265static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266gl_nurbssurface(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000267 PyObject *self;
268 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269{
270 long arg1 ;
271 double * arg2 ;
272 long arg3 ;
273 double * arg4 ;
274 double *arg5 ;
275 long arg6 ;
276 long arg7 ;
277 long arg8 ;
278 long ncoords;
279 long s_byte_stride, t_byte_stride;
280 long s_nctl, t_nctl;
281 long s, t;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000282 PyObject *v, *w, *pt;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 double *pnext;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000284 if (!PyArg_GetLongArraySize(args, 6, 0, &arg1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000286 if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
287 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000289 if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000291 if (!PyArg_GetLongArraySize(args, 6, 1, &arg3))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000293 if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) {
294 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000296 if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000298 if (!PyArg_GetLong(args, 6, 3, &arg6))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000300 if (!PyArg_GetLong(args, 6, 4, &arg7))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000302 if (!PyArg_GetLong(args, 6, 5, &arg8))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 return NULL;
304 if (arg8 == N_XYZ)
305 ncoords = 3;
306 else if (arg8 == N_XYZW)
307 ncoords = 4;
308 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000309 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 return NULL;
311 }
312 s_nctl = arg1 - arg6;
313 t_nctl = arg3 - arg7;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000314 if (!PyArg_GetObject(args, 6, 2, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000316 if (!PyList_Check(v) || PyList_Size(v) != s_nctl) {
317 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 return NULL;
319 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000320 if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
321 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 }
323 pnext = arg5;
324 for (s = 0; s < s_nctl; s++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000325 w = PyList_GetItem(v, s);
326 if (w == NULL || !PyList_Check(w) ||
327 PyList_Size(w) != t_nctl) {
328 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329 return NULL;
330 }
331 for (t = 0; t < t_nctl; t++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000332 pt = PyList_GetItem(w, t);
333 if (!PyArg_GetDoubleArray(pt, 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 return NULL;
335 pnext += ncoords;
336 }
337 }
338 s_byte_stride = sizeof(double) * ncoords;
339 t_byte_stride = s_byte_stride * s_nctl;
340 nurbssurface( arg1 , arg2 , arg3 , arg4 ,
341 s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000342 PyMem_DEL(arg2);
343 PyMem_DEL(arg4);
344 PyMem_DEL(arg5);
345 Py_INCREF(Py_None);
346 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347}
348
349/* nurbscurve(knots, ctlpoints, order, type).
350 The length of ctlpoints is len(knots)-order. */
351
352%nurbscurve
353
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000354static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355gl_nurbscurve(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000356 PyObject *self;
357 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358{
359 long arg1 ;
360 double * arg2 ;
361 long arg3 ;
362 double * arg4 ;
363 long arg5 ;
364 long arg6 ;
365 int ncoords, npoints;
366 int i;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000367 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 double *pnext;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000369 if (!PyArg_GetLongArraySize(args, 4, 0, &arg1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000371 if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
372 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000374 if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000376 if (!PyArg_GetLong(args, 4, 2, &arg5))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000378 if (!PyArg_GetLong(args, 4, 3, &arg6))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379 return NULL;
380 if (arg6 == N_ST)
381 ncoords = 2;
382 else if (arg6 == N_STW)
383 ncoords = 3;
384 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000385 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 return NULL;
387 }
388 npoints = arg1 - arg5;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000389 if (!PyArg_GetObject(args, 4, 1, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000391 if (!PyList_Check(v) || PyList_Size(v) != npoints) {
392 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 return NULL;
394 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000395 if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) {
396 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397 }
398 pnext = arg4;
399 for (i = 0; i < npoints; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000400 if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 return NULL;
402 pnext += ncoords;
403 }
404 arg3 = (sizeof(double)) * ncoords;
405 nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000406 PyMem_DEL(arg2);
407 PyMem_DEL(arg4);
408 Py_INCREF(Py_None);
409 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410}
411
412/* pwlcurve(points, type).
413 Points is a list of points. Type must be N_ST. */
414
415%pwlcurve
416
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000417static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418gl_pwlcurve(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000419 PyObject *self;
420 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000422 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423 long type;
424 double *data, *pnext;
425 long npoints, ncoords;
426 int i;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000427 if (!PyArg_GetObject(args, 2, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000429 if (!PyArg_GetLong(args, 2, 1, &type))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000431 if (!PyList_Check(v)) {
432 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433 return NULL;
434 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000435 npoints = PyList_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 if (type == N_ST)
437 ncoords = 2;
438 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000439 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440 return NULL;
441 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000442 if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) {
443 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 }
445 pnext = data;
446 for (i = 0; i < npoints; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000447 if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448 return NULL;
449 pnext += ncoords;
450 }
451 pwlcurve(npoints, data, sizeof(double)*ncoords, type);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000452 PyMem_DEL(data);
453 Py_INCREF(Py_None);
454 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455}
456
457
458/* Picking and Selecting */
459
460static short *pickbuffer = NULL;
461static long pickbuffersize;
462
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000463static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464pick_select(args, func)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000465 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466 void (*func)();
467{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000468 if (!PyArg_GetLong(args, 1, 0, &pickbuffersize))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469 return NULL;
470 if (pickbuffer != NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000471 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 "pick/gselect: already picking/selecting");
473 return NULL;
474 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000475 if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) {
476 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477 }
478 (*func)(pickbuffer, pickbuffersize);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000479 Py_INCREF(Py_None);
480 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481}
482
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000483static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484endpick_select(args, func)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000485 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 long (*func)();
487{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000488 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 int i, nhits, n;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000490 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491 return NULL;
492 if (pickbuffer == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000493 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494 "endpick/endselect: not in pick/select mode");
495 return NULL;
496 }
497 nhits = (*func)(pickbuffer);
498 if (nhits < 0) {
499 nhits = -nhits; /* How to report buffer overflow otherwise? */
500 }
501 /* Scan the buffer to see how many integers */
502 n = 0;
503 for (; nhits > 0; nhits--) {
504 n += 1 + pickbuffer[n];
505 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000506 v = PyList_New(n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000507 if (v == NULL)
508 return NULL;
509 /* XXX Could do it nicer and interpret the data structure here,
510 returning a list of lists. But this can be done in Python... */
511 for (i = 0; i < n; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000512 w = PyInt_FromLong((long)pickbuffer[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000514 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515 return NULL;
516 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000517 PyList_SetItem(v, i, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000519 PyMem_DEL(pickbuffer);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520 pickbuffer = NULL;
521 return v;
522}
523
524extern void pick(), gselect();
525extern long endpick(), endselect();
526
527%pick
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000528static PyObject *gl_pick(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529 return pick_select(args, pick);
530}
531
532%endpick
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000533static PyObject *gl_endpick(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534 return endpick_select(args, endpick);
535}
536
537%gselect
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000538static PyObject *gl_gselect(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539 return pick_select(args, gselect);
540}
541
542%endselect
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000543static PyObject *gl_endselect(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544 return endpick_select(args, endselect);
545}
546
547
548/* XXX The generator botches this one. Here's a quick hack to fix it. */
549
Guido van Rossumb3165151991-08-16 08:59:21 +0000550/* XXX The generator botches this one. Here's a quick hack to fix it. */
551
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552% getmatrix float r[16]
553
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000554static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555gl_getmatrix(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000556 PyObject *self;
557 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000558{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000559 Matrix arg1;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000560 PyObject *v, *w;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000561 int i, j;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562 getmatrix( arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000563 v = PyList_New(16);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564 if (v == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000565 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000567 for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
568 w = mknewfloatobject(arg1[i][j]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000570 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571 return NULL;
572 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000573 PyList_SetItem(v, i*4+j, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574 }
575 return v;
576}
577
Guido van Rossumb3165151991-08-16 08:59:21 +0000578/* Here's an alternate version that returns a 4x4 matrix instead of
579 a vector. Unfortunately it is incompatible with loadmatrix and
580 multmatrix... */
581
582% altgetmatrix float r[4][4]
583
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000584static PyObject *
Guido van Rossumb3165151991-08-16 08:59:21 +0000585gl_altgetmatrix(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000586 PyObject *self;
587 PyObject *args;
Guido van Rossumb3165151991-08-16 08:59:21 +0000588{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000589 Matrix arg1;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000590 PyObject *v, *w;
Guido van Rossumb3165151991-08-16 08:59:21 +0000591 int i, j;
592 getmatrix( arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000593 v = PyList_New(4);
Guido van Rossumb3165151991-08-16 08:59:21 +0000594 if (v == NULL) {
595 return NULL;
596 }
597 for (i = 0; i < 4; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000598 w = PyList_New(4);
Guido van Rossumb3165151991-08-16 08:59:21 +0000599 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000600 Py_DECREF(v);
Guido van Rossumb3165151991-08-16 08:59:21 +0000601 return NULL;
602 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000603 PyList_SetItem(v, i, w);
Guido van Rossumb3165151991-08-16 08:59:21 +0000604 }
605 for (i = 0; i < 4; i++) {
606 for (j = 0; j < 4; j++) {
607 w = mknewfloatobject(arg1[i][j]);
608 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000609 Py_DECREF(v);
Guido van Rossumb3165151991-08-16 08:59:21 +0000610 return NULL;
611 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000612 PyList_SetItem(PyList_GetItem(v, i), j, w);
Guido van Rossumb3165151991-08-16 08:59:21 +0000613 }
614 }
615 return v;
616}
617
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000618% lrectwrite
619
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000620static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000621gl_lrectwrite(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000622 PyObject *self;
623 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000624{
625 short x1 ;
626 short y1 ;
627 short x2 ;
628 short y2 ;
629 string parray ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000630 PyObject *s;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000631#if 0
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000632 int pixcount;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000633#endif
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000634 if (!PyArg_GetShort(args, 5, 0, &x1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000635 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000636 if (!PyArg_GetShort(args, 5, 1, &y1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000637 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000638 if (!PyArg_GetShort(args, 5, 2, &x2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000639 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000640 if (!PyArg_GetShort(args, 5, 3, &y2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000641 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000642 if (!PyArg_GetString(args, 5, 4, &parray))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000643 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000644 if (!PyArg_GetObject(args, 5, 4, &s))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000645 return NULL;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000646#if 0
647/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000648 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000649 if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) {
650 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000651 "string arg to lrectwrite has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000652 return NULL;
653 }
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000654#endif
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000655 lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000656 Py_INCREF(Py_None);
657 return Py_None;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000658}
659
660% lrectread
661
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000662static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000663gl_lrectread(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000664 PyObject *self;
665 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000666{
667 short x1 ;
668 short y1 ;
669 short x2 ;
670 short y2 ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000671 PyObject *parray;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000672 int pixcount;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000673 if (!PyArg_GetShort(args, 4, 0, &x1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000674 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000675 if (!PyArg_GetShort(args, 4, 1, &y1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000676 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000677 if (!PyArg_GetShort(args, 4, 2, &x2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000678 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000679 if (!PyArg_GetShort(args, 4, 3, &y2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000680 return NULL;
681 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000682 parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000683 if (parray == NULL)
684 return NULL; /* No memory */
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000685 lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000686 return parray;
687}
688
Jack Jansen5fc67731993-02-16 09:25:15 +0000689% readdisplay
690
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000691static PyObject *
Jack Jansen5fc67731993-02-16 09:25:15 +0000692gl_readdisplay(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000693 PyObject *self;
694 PyObject *args;
Jack Jansen5fc67731993-02-16 09:25:15 +0000695{
696 short x1, y1, x2, y2;
697 unsigned long *parray, hints;
698 long size, size_ret;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000699 PyObject *rv;
Jack Jansen5fc67731993-02-16 09:25:15 +0000700
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000701 if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) )
Jack Jansen5fc67731993-02-16 09:25:15 +0000702 return 0;
703 size = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000704 rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long));
Jack Jansen5fc67731993-02-16 09:25:15 +0000705 if ( rv == NULL )
706 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000707 parray = (unsigned long *)PyString_AsString(rv);
Jack Jansen5fc67731993-02-16 09:25:15 +0000708 size_ret = readdisplay(x1, y1, x2, y2, parray, hints);
709 if ( size_ret != size ) {
Guido van Rossumece35bc1996-12-09 18:52:11 +0000710 printf("gl_readdisplay: got %ld pixels, expected %ld\n",
Jack Jansen5fc67731993-02-16 09:25:15 +0000711 size_ret, size);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000712 PyErr_SetString(PyExc_RuntimeError, "readdisplay returned unexpected length");
Jack Jansen5fc67731993-02-16 09:25:15 +0000713 return NULL;
714 }
715 return rv;
716}
717
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000718/* Desperately needed, here are tools to compress and decompress
719 the data manipulated by lrectread/lrectwrite.
720
721 gl.packrect(width, height, packfactor, bigdata) --> smalldata
722 makes 'bigdata' 4*(packfactor**2) times smaller by:
723 - turning it into B/W (a factor 4)
724 - replacing squares of size pacfactor by one
725 representative
726
727 gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
728 is the inverse; the numeric arguments must be *the same*.
729
730 Both work best if width and height are multiples of packfactor
731 (in fact unpackrect will leave garbage bytes).
732*/
733
734% packrect
735
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000736static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000737gl_packrect(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000738 PyObject *self;
739 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000740{
741 long width, height, packfactor;
742 char *s;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000743 PyObject *unpacked, *packed;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000744 int pixcount, packedcount, x, y, r, g, b;
745 unsigned long pixel;
746 unsigned char *p;
747 unsigned long *parray;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000748 if (!PyArg_GetLong(args, 4, 0, &width))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000749 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000750 if (!PyArg_GetLong(args, 4, 1, &height))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000751 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000752 if (!PyArg_GetLong(args, 4, 2, &packfactor))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000753 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000754 if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000755 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000756 if (!PyArg_GetObject(args, 4, 3, &unpacked))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000757 return NULL;
758 if (width <= 0 || height <= 0 || packfactor <= 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000759 PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000760 return NULL;
761 }
762 pixcount = width*height;
763 packedcount = ((width+packfactor-1)/packfactor) *
764 ((height+packfactor-1)/packfactor);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000765 if (PyString_Size(unpacked) != pixcount*sizeof(long)) {
766 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000767 "string arg to packrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000768 return NULL;
769 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000770 packed = PyString_FromStringAndSize((char *)NULL, packedcount);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000771 if (packed == NULL)
772 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000773 parray = (unsigned long *) PyString_AsString(unpacked);
774 p = (unsigned char *) PyString_AsString(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000775 for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
776 for (x = 0; x < width; x += packfactor) {
777 pixel = parray[x];
778 r = pixel & 0xff;
779 g = (pixel >> 8) & 0xff;
780 b = (pixel >> 16) & 0xff;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000781 *p++ = (30*r+59*g+11*b) / 100;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000782 }
783 }
784 return packed;
785}
786
787% unpackrect
788
789static unsigned long unpacktab[256];
790static int unpacktab_inited = 0;
791
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000792static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000793gl_unpackrect(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000794 PyObject *self;
795 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000796{
797 long width, height, packfactor;
798 char *s;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000799 PyObject *unpacked, *packed;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000800 int pixcount, packedcount;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000801 register unsigned char *p;
802 register unsigned long *parray;
803 if (!unpacktab_inited) {
804 register int white;
805 for (white = 256; --white >= 0; )
806 unpacktab[white] = white * 0x010101L;
807 unpacktab_inited++;
808 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000809 if (!PyArg_GetLong(args, 4, 0, &width))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000810 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000811 if (!PyArg_GetLong(args, 4, 1, &height))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000812 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000813 if (!PyArg_GetLong(args, 4, 2, &packfactor))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000814 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000815 if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000816 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000817 if (!PyArg_GetObject(args, 4, 3, &packed))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000818 return NULL;
819 if (width <= 0 || height <= 0 || packfactor <= 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000820 PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000821 return NULL;
822 }
823 pixcount = width*height;
824 packedcount = ((width+packfactor-1)/packfactor) *
825 ((height+packfactor-1)/packfactor);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000826 if (PyString_Size(packed) != packedcount) {
827 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000828 "string arg to unpackrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000829 return NULL;
830 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000831 unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000832 if (unpacked == NULL)
833 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000834 parray = (unsigned long *) PyString_AsString(unpacked);
835 p = (unsigned char *) PyString_AsString(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000836 if (packfactor == 1 && width*height > 0) {
837 /* Just expand bytes to longs */
838 register int x = width * height;
839 do {
840 *parray++ = unpacktab[*p++];
841 } while (--x >= 0);
842 }
843 else {
844 register int y;
845 for (y = 0; y < height-packfactor+1;
846 y += packfactor, parray += packfactor*width) {
847 register int x;
848 for (x = 0; x < width-packfactor+1; x += packfactor) {
849 register unsigned long pixel = unpacktab[*p++];
850 register int i;
851 for (i = packfactor*width; (i-=width) >= 0;) {
852 register int j;
853 for (j = packfactor; --j >= 0; )
854 parray[i+x+j] = pixel;
855 }
856 }
857 }
858 }
859 return unpacked;
860}
861
Guido van Rossumaee08791992-09-08 09:05:33 +0000862% gversion
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000863static PyObject *
Guido van Rossumaee08791992-09-08 09:05:33 +0000864gl_gversion(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000865 PyObject *self;
866 PyObject *args;
Guido van Rossumaee08791992-09-08 09:05:33 +0000867{
868 char buf[20];
869 gversion(buf);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000870 return PyString_FromString(buf);
Guido van Rossumaee08791992-09-08 09:05:33 +0000871}
872
873
Guido van Rossum5c069fd1998-04-28 16:09:16 +0000874/* void clear - Manual because of clash with termcap */
875%clear
876static PyObject *
877gl_clear(self, args)
878 PyObject *self;
879 PyObject *args;
880{
881 __GLclear( );
882 Py_INCREF(Py_None);
883 return Py_None;
884}
885
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000886/* End of manually written stubs */
887
888%%
889
890long getshade
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000891if !solaris void devport short s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000892void rdr2i long s long s
893void rectfs short s short s short s short s
894void rects short s short s short s short s
895void rmv2i long s long s
896void noport
897void popviewport
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000898void clearhitcode
899void closeobj
900void cursoff
901void curson
902void doublebuffer
903void finish
904void gconfig
905void ginit
906void greset
907void multimap
908void onemap
909void popattributes
910void popmatrix
911void pushattributes
912void pushmatrix
913void pushviewport
914void qreset
915void RGBmode
916void singlebuffer
917void swapbuffers
918void gsync
Guido van Rossum06a67021992-02-26 15:19:45 +0000919void gflush
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000920void tpon
921void tpoff
922void clkon
923void clkoff
924void ringbell
925#void callfunc
926void gbegin
927void textinit
928void initnames
929void pclos
930void popname
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000931if !solaris void spclos
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000932void zclear
933void screenspace
934void reshapeviewport
935void winpush
936void winpop
937void foreground
938void endfullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000939if !solaris void endpupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000940void fullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000941if !solaris void pupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000942void winconstraints
943void pagecolor short s
944void textcolor short s
945void color short s
946void curveit short s
947void font short s
948void linewidth short s
949void setlinestyle short s
950void setmap short s
951void swapinterval short s
952void writemask short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000953if !solaris void textwritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000954void qdevice short s
955void unqdevice short s
956void curvebasis short s
957void curveprecision short s
958void loadname short s
959void passthrough short s
960void pushname short s
961void setmonitor short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000962if !solaris void setshade short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000963void setpattern short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000964if !solaris void pagewritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000965#
966void callobj long s
967void delobj long s
968void editobj long s
969void makeobj long s
970void maketag long s
971void chunksize long s
972void compactify long s
973void deltag long s
974void lsrepeat long s
975void objinsert long s
976void objreplace long s
977void winclose long s
978void blanktime long s
979void freepup long s
980# This is not in the library!?
981###void pupcolor long s
982#
983void backbuffer long s
984void frontbuffer long s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000985if !solaris void lsbackup long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000986void resetls long s
987void lampon long s
988void lampoff long s
989void setbell long s
990void blankscreen long s
991void depthcue long s
992void zbuffer long s
993void backface long s
994#
995void cmov2i long s long s
996void draw2i long s long s
997void move2i long s long s
998void pnt2i long s long s
999void patchbasis long s long s
1000void patchprecision long s long s
1001void pdr2i long s long s
1002void pmv2i long s long s
1003void rpdr2i long s long s
1004void rpmv2i long s long s
1005void xfpt2i long s long s
1006void objdelete long s long s
1007void patchcurves long s long s
1008void minsize long s long s
1009void maxsize long s long s
1010void keepaspect long s long s
1011void prefsize long s long s
1012void stepunit long s long s
1013void fudge long s long s
1014void winmove long s long s
1015#
1016void attachcursor short s short s
1017void deflinestyle short s short s
1018void noise short s short s
1019void picksize short s short s
1020void qenter short s short s
1021void setdepth short s short s
1022void cmov2s short s short s
1023void draw2s short s short s
1024void move2s short s short s
1025void pdr2s short s short s
1026void pmv2s short s short s
1027void pnt2s short s short s
1028void rdr2s short s short s
1029void rmv2s short s short s
1030void rpdr2s short s short s
1031void rpmv2s short s short s
1032void xfpt2s short s short s
1033#
1034void cmov2 float s float s
1035void draw2 float s float s
1036void move2 float s float s
1037void pnt2 float s float s
1038void pdr2 float s float s
1039void pmv2 float s float s
1040void rdr2 float s float s
1041void rmv2 float s float s
1042void rpdr2 float s float s
1043void rpmv2 float s float s
1044void xfpt2 float s float s
1045#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001046void loadmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001047# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001048void multmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001049# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001050void crv float s[3*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001051# Really [4][3]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001052void rcrv float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001053# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054#
1055# Methods that have strings.
1056#
1057void addtopup long s char *s long s
1058void charstr char *s
1059void getport char *s
1060long strwidth char *s
1061long winopen char *s
1062void wintitle char *s
1063#
1064# Methods that have 1 long (# of elements) and an array
1065#
1066void polf long s float s[3*arg1]
1067void polf2 long s float s[2*arg1]
1068void poly long s float s[3*arg1]
1069void poly2 long s float s[2*arg1]
1070void crvn long s float s[3*arg1]
1071void rcrvn long s float s[4*arg1]
1072#
1073void polf2i long s long s[2*arg1]
1074void polfi long s long s[3*arg1]
1075void poly2i long s long s[2*arg1]
1076void polyi long s long s[3*arg1]
1077#
1078void polf2s long s short s[2*arg1]
1079void polfs long s short s[3*arg1]
1080void polys long s short s[3*arg1]
1081void poly2s long s short s[2*arg1]
1082#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001083void defcursor short s u_short s[128]
Guido van Rossumb3165151991-08-16 08:59:21 +00001084# Is this useful?
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001085void writepixels short s u_short s[arg1]
Guido van Rossumb3165151991-08-16 08:59:21 +00001086# Should be unsigned short...
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001087void defbasis long s float s[4*4]
1088if !solaris void gewrite short s short s[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001089#
1090void rotate short s char s
1091# This is not in the library!?
1092###void setbutton short s char s
1093void rot float s char s
1094#
1095void circfi long s long s long s
1096void circi long s long s long s
1097void cmovi long s long s long s
1098void drawi long s long s long s
1099void movei long s long s long s
1100void pnti long s long s long s
1101void newtag long s long s long s
1102void pdri long s long s long s
1103void pmvi long s long s long s
1104void rdri long s long s long s
1105void rmvi long s long s long s
1106void rpdri long s long s long s
1107void rpmvi long s long s long s
1108void xfpti long s long s long s
1109#
1110void circ float s float s float s
1111void circf float s float s float s
1112void cmov float s float s float s
1113void draw float s float s float s
1114void move float s float s float s
1115void pnt float s float s float s
1116void scale float s float s float s
1117void translate float s float s float s
1118void pdr float s float s float s
1119void pmv float s float s float s
1120void rdr float s float s float s
1121void rmv float s float s float s
1122void rpdr float s float s float s
1123void rpmv float s float s float s
1124void xfpt float s float s float s
1125#
1126void RGBcolor short s short s short s
1127void RGBwritemask short s short s short s
1128void setcursor short s short s short s
1129void tie short s short s short s
1130void circfs short s short s short s
1131void circs short s short s short s
1132void cmovs short s short s short s
1133void draws short s short s short s
1134void moves short s short s short s
1135void pdrs short s short s short s
1136void pmvs short s short s short s
1137void pnts short s short s short s
1138void rdrs short s short s short s
1139void rmvs short s short s short s
1140void rpdrs short s short s short s
1141void rpmvs short s short s short s
1142void xfpts short s short s short s
1143void curorigin short s short s short s
1144void cyclemap short s short s short s
1145#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001146void patch float s[4*4] float s[4*4] float s[4*4]
1147void splf long s float s[3*arg1] u_short s[arg1]
1148void splf2 long s float s[2*arg1] u_short s[arg1]
1149void splfi long s long s[3*arg1] u_short s[arg1]
1150void splf2i long s long s[2*arg1] u_short s[arg1]
1151void splfs long s short s[3*arg1] u_short s[arg1]
1152void splf2s long s short s[2*arg1] u_short s[arg1]
1153###void defpattern short s short s u_short s[arg2*arg2/16]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001154#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001155void 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 +00001156#
1157# routines that send 4 floats
1158#
1159void ortho2 float s float s float s float s
1160void rect float s float s float s float s
1161void rectf float s float s float s float s
1162void xfpt4 float s float s float s float s
1163#
1164void textport short s short s short s short s
1165void mapcolor short s short s short s short s
1166void scrmask short s short s short s short s
1167void setvaluator short s short s short s short s
1168void viewport short s short s short s short s
1169void shaderange short s short s short s short s
1170void xfpt4s short s short s short s short s
1171void rectfi long s long s long s long s
1172void recti long s long s long s long s
1173void xfpt4i long s long s long s long s
1174void prefposition long s long s long s long s
1175#
1176void arc float s float s float s short s short s
1177void arcf float s float s float s short s short s
1178void arcfi long s long s long s short s short s
1179void arci long s long s long s short s short s
1180#
1181void bbox2 short s short s float s float s float s float s
1182void bbox2i short s short s long s long s long s long s
1183void bbox2s short s short s short s short s short s short s
1184void blink short s short s short s short s short s
1185void ortho float s float s float s float s float s float s
1186void window float s float s float s float s float s float s
1187void lookat float s float s float s float s float s float s short s
1188#
1189void perspective short s float s float s float s
1190void polarview float s short s short s short s
1191# XXX getichararray not supported
1192#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
1193#
1194void arcfs short s short s short s short s short s
1195void arcs short s short s short s short s short s
1196void rectcopy short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001197if !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 +00001198#
1199long getbutton short s
1200long getcmmode
1201long getlsbackup
1202long getresetls
1203long getdcm
1204long getzbuffer
1205long ismex
1206long isobj long s
1207long isqueued short s
1208long istag long s
1209#
1210long genobj
1211long gentag
1212long getbuffer
1213long getcolor
1214long getdisplaymode
1215long getfont
1216long getheight
1217long gethitcode
1218long getlstyle
1219long getlwidth
1220long getmap
1221long getplanes
1222long getwritemask
1223long qtest
1224long getlsrepeat
1225long getmonitor
1226long getopenobj
1227long getpattern
1228long winget
1229long winattach
1230long getothermonitor
1231long newpup
1232#
1233long getvaluator short s
1234void winset long s
1235long dopup long s
1236void getdepth short r short r
1237void getcpos short r short r
1238void getsize long r long r
1239void getorigin long r long r
1240void getviewport short r short r short r short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001241if !solaris void gettp short r short r short r short r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001242void getgpos float r float r float r float r
1243void winposition long s long s long s long s
1244void gRGBcolor short r short r short r
1245void gRGBmask short r short r short r
1246void getscrmask short r short r short r short r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001247###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 +00001248void getmcolor short s short r short r short r
1249void mapw long s short s short s float r float r float r float r float r float r
1250void mapw2 long s short s short s float r float r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001251###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 +00001252###long qread short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001253void getcursor short r u_short r u_short r long r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001254#
1255# For these we receive arrays of stuff
1256#
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001257###void getdev long s short s[arg1] short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001258#XXX not generated correctly yet
1259#void getmatrix float r[16]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001260###long readpixels short s short r[retval]
1261###long readRGB short s char r[retval] char r[retval] char r[retval]
1262###long blkqread short s short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001263#
1264# New 4D routines
1265#
1266void cmode
1267void concave long s
1268void curstype long s
1269void drawmode long s
1270void gammaramp short s[256] short s[256] short s[256]
1271long getbackface
1272long getdescender
1273long getdrawmode
1274long getmmode
1275long getsm
1276long getvideo long s
1277void imakebackground
1278void lmbind short s short s
1279void lmdef long s long s long s float s[arg3]
1280void mmode long s
1281void normal float s[3]
1282void overlay long s
1283void RGBrange short s short s short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001284if !solaris void setvideo long s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285void shademodel long s
1286void underlay long s
1287#
1288# New Personal Iris/GT Routines
1289#
1290void bgnclosedline
1291void bgnline
1292void bgnpoint
1293void bgnpolygon
1294void bgnsurface
1295void bgntmesh
1296void bgntrim
1297void endclosedline
1298void endline
1299void endpoint
1300void endpolygon
1301void endsurface
1302void endtmesh
1303void endtrim
1304void blendfunction long s long s
1305void c3f float s[3]
1306void c3i long s[3]
1307void c3s short s[3]
1308void c4f float s[4]
1309void c4i long s[4]
1310void c4s short s[4]
1311void colorf float s
1312void cpack long s
1313void czclear long s long s
1314void dglclose long s
1315long dglopen char *s long s
1316long getgdesc long s
1317void getnurbsproperty long s float r
1318void glcompat long s long s
1319void iconsize long s long s
1320void icontitle char *s
1321void lRGBrange short s short s short s short s short s short s long s long s
1322void linesmooth long s
1323void lmcolor long s
1324void logicop long s
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001325###long lrectread short s short s short s short s long r[retval]
1326###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
1327### Now manual, with string last arg
1328###long rectread short s short s short s short s short r[retval]
1329###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 +00001330void lsetdepth long s long s
1331void lshaderange short s short s long s long s
1332void n3f float s[3]
1333void noborder
1334void pntsmooth long s
1335void readsource long s
1336void rectzoom float s float s
1337void sbox float s float s float s float s
1338void sboxi long s long s long s long s
1339void sboxs short s short s short s short s
1340void sboxf float s float s float s float s
1341void sboxfi long s long s long s long s
1342void sboxfs short s short s short s short s
1343void setnurbsproperty long s float s
1344void setpup long s long s long s
1345void smoothline long s
1346void subpixel long s
1347void swaptmesh
1348long swinopen long s
1349void v2f float s[2]
1350void v2i long s[2]
1351void v2s short s[2]
1352void v3f float s[3]
1353void v3i long s[3]
1354void v3s short s[3]
1355void v4f float s[4]
1356void v4i long s[4]
1357void v4s short s[4]
1358void videocmd long s
1359long windepth long s
1360void wmpack long s
1361void zdraw long s
1362void zfunction long s
1363void zsource long s
1364void zwritemask long s
1365#
1366# uses doubles
1367#
1368void v2d double s[2]
1369void v3d double s[3]
1370void v4d double s[4]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001371#
1372# Why isn't this here?
1373#
1374void pixmode long s long s
Guido van Rossumdd9ed831992-06-29 17:10:40 +00001375#
1376# New in IRIX 4.0
1377#
1378long qgetfd
Jack Jansenfa1b9f61993-02-19 12:53:12 +00001379void dither long s