blob: 3ce58da952f89b0efd076a6d6930d5251b73583c [file] [log] [blame]
Guido van Rossumb6775db1994-08-01 11:34:53 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumb6775db1994-08-01 11:34:53 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumb6775db1994-08-01 11:34:53 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/*
12Input used to generate the Python module "glmodule.c".
Guido van Rossumb3165151991-08-16 08:59:21 +000013The stub generator is a Python script called "cgen.py".
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
15Each definition must be contained on one line:
16
17<returntype> <name> <type> <arg> <type> <arg>
18
19<returntype> can be: void, short, long (XXX maybe others?)
20
21<type> can be: char, string, short, float, long, or double
22 string indicates a null terminated string;
23 if <type> is char and <arg> begins with a *, the * is stripped
24 and <type> is changed into string
25
26<arg> has the form <mode> or <mode>[<subscript>]
27 where <mode> can be
28 s: arg is sent
29 r: arg is received (arg is a pointer)
30 and <subscript> can be (N and I are numbers):
31 N
32 argI
33 retval
34 N*argI
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000035 N*I
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 N*retval
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000037 In the case where the subscript consists of two parts
38 separated by *, the first part is the width of the matrix, and
39 the second part is the length of the matrix. This order is
40 opposite from the order used in C to declare a two-dimensional
41 matrix.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042*/
43
Jack Jansen743db361992-08-13 14:13:11 +000044/*
45 * An attempt has been made to make this module switch threads on qread
46 * calls. It is far from safe, though.
47 */
48
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049#include <gl.h>
50#include <device.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000051
Guido van Rossumece35bc1996-12-09 18:52:11 +000052#ifdef __sgi
53extern int devport();
54extern int textwritemask();
55extern int pagewritemask();
56extern int gewrite();
57extern int gettp();
58#endif
59
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000060#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061#include "cgensupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062
63/*
64Some stubs are too complicated for the stub generator.
65We can include manually written versions of them here.
66A line starting with '%' gives the name of the function so the stub
67generator can include it in the table of functions.
68*/
69
Jack Jansen743db361992-08-13 14:13:11 +000070% qread
71
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000072static PyObject *
Jack Jansen743db361992-08-13 14:13:11 +000073gl_qread(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000074 PyObject *self;
75 PyObject *args;
Jack Jansen743db361992-08-13 14:13:11 +000076{
77 long retval;
78 short arg1 ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000079 Py_BEGIN_ALLOW_THREADS
Jack Jansen743db361992-08-13 14:13:11 +000080 retval = qread( & arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000081 Py_END_ALLOW_THREADS
82 { PyObject *v = PyTuple_New( 2 );
Jack Jansen743db361992-08-13 14:13:11 +000083 if (v == NULL) return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +000084 PyTuple_SetItem(v, 0, mknewlongobject(retval));
85 PyTuple_SetItem(v, 1, mknewshortobject(arg1));
Jack Jansen743db361992-08-13 14:13:11 +000086 return v;
87 }
88}
89
90
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091/*
92varray -- an array of v.. calls.
93The argument is an array (maybe list or tuple) of points.
94Each point must be a tuple or list of coordinates (x, y, z).
95The points may be 2- or 3-dimensional but must all have the
96same dimension. Float and int values may be mixed however.
97The points are always converted to 3D double precision points
98by assuming z=0.0 if necessary (as indicated in the man page),
99and for each point v3d() is called.
100*/
101
102% varray
103
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000104static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105gl_varray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000106 PyObject *self;
107 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000109 PyObject *v, *w=NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110 int i, n, width;
111 double vec[3];
Sjoerd Mullenderf28b8982000-08-18 10:00:28 +0000112 PyObject * (*getitem)(PyObject *, int);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000114 if (!PyArg_GetObject(args, 1, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 return NULL;
116
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000117 if (PyList_Check(v)) {
118 n = PyList_Size(v);
119 getitem = PyList_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000121 else if (PyTuple_Check(v)) {
122 n = PyTuple_Size(v);
123 getitem = PyTuple_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 }
125 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000126 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 return NULL;
128 }
129
130 if (n == 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000131 Py_INCREF(Py_None);
132 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 }
134 if (n > 0)
135 w = (*getitem)(v, 0);
136
137 width = 0;
138 if (w == NULL) {
139 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000140 else if (PyList_Check(w)) {
141 width = PyList_Size(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000143 else if (PyTuple_Check(w)) {
144 width = PyTuple_Size(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 }
146
147 switch (width) {
148 case 2:
149 vec[2] = 0.0;
150 /* Fall through */
151 case 3:
152 break;
153 default:
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000154 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 return NULL;
156 }
157
158 for (i = 0; i < n; i++) {
159 w = (*getitem)(v, i);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000160 if (!PyArg_GetDoubleArray(w, 1, 0, width, vec))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161 return NULL;
162 v3d(vec);
163 }
164
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000165 Py_INCREF(Py_None);
166 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167}
168
169/*
170vnarray, nvarray -- an array of n3f and v3f calls.
171The argument is an array (list or tuple) of pairs of points and normals.
172Each pair is a tuple (NOT a list) of a point and a normal for that point.
173Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
174Three coordinates must be given. Float and int values may be mixed.
175For each pair, n3f() is called for the normal, and then v3f() is called
176for the vector.
177
178vnarray and nvarray differ only in the order of the vector and normal in
179the pair: vnarray expects (v, n) while nvarray expects (n, v).
180*/
181
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000182static PyObject *gen_nvarray(); /* Forward */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183
184% nvarray
185
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000186static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187gl_nvarray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000188 PyObject *self;
189 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
191 return gen_nvarray(args, 0);
192}
193
194% vnarray
195
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000196static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197gl_vnarray(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000198 PyObject *self;
199 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200{
201 return gen_nvarray(args, 1);
202}
203
204/* Generic, internal version of {nv,nv}array: inorm indicates the
205 argument order, 0: normal first, 1: vector first. */
206
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000207static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208gen_nvarray(args, inorm)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000209 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210 int inorm;
211{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000212 PyObject *v, *w, *wnorm, *wvec;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213 int i, n;
214 float norm[3], vec[3];
Sjoerd Mullenderf28b8982000-08-18 10:00:28 +0000215 PyObject * (*getitem)(PyObject *, int);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000217 if (!PyArg_GetObject(args, 1, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 return NULL;
219
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000220 if (PyList_Check(v)) {
221 n = PyList_Size(v);
222 getitem = PyList_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000224 else if (PyTuple_Check(v)) {
225 n = PyTuple_Size(v);
226 getitem = PyTuple_GetItem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 }
228 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000229 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 return NULL;
231 }
232
233 for (i = 0; i < n; i++) {
234 w = (*getitem)(v, i);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000235 if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) {
236 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 return NULL;
238 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000239 wnorm = PyTuple_GetItem(w, inorm);
240 wvec = PyTuple_GetItem(w, 1 - inorm);
241 if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) ||
242 !PyArg_GetFloatArray(wvec, 1, 0, 3, vec))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 return NULL;
244 n3f(norm);
245 v3f(vec);
246 }
247
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000248 Py_INCREF(Py_None);
249 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250}
251
252/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
253 The dimensions of ctl[] are computed as follows:
254 [len(s_knots) - s_order], [len(t_knots) - t_order]
255*/
256
257% nurbssurface
258
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000259static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260gl_nurbssurface(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000261 PyObject *self;
262 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263{
264 long arg1 ;
265 double * arg2 ;
266 long arg3 ;
267 double * arg4 ;
268 double *arg5 ;
269 long arg6 ;
270 long arg7 ;
271 long arg8 ;
272 long ncoords;
273 long s_byte_stride, t_byte_stride;
274 long s_nctl, t_nctl;
275 long s, t;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000276 PyObject *v, *w, *pt;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 double *pnext;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000278 if (!PyArg_GetLongArraySize(args, 6, 0, &arg1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000280 if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
281 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000283 if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000285 if (!PyArg_GetLongArraySize(args, 6, 1, &arg3))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000287 if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) {
288 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000290 if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000292 if (!PyArg_GetLong(args, 6, 3, &arg6))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000294 if (!PyArg_GetLong(args, 6, 4, &arg7))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000296 if (!PyArg_GetLong(args, 6, 5, &arg8))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 return NULL;
298 if (arg8 == N_XYZ)
299 ncoords = 3;
300 else if (arg8 == N_XYZW)
301 ncoords = 4;
302 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000303 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 return NULL;
305 }
306 s_nctl = arg1 - arg6;
307 t_nctl = arg3 - arg7;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000308 if (!PyArg_GetObject(args, 6, 2, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000310 if (!PyList_Check(v) || PyList_Size(v) != s_nctl) {
311 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 return NULL;
313 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000314 if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
315 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 }
317 pnext = arg5;
318 for (s = 0; s < s_nctl; s++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000319 w = PyList_GetItem(v, s);
320 if (w == NULL || !PyList_Check(w) ||
321 PyList_Size(w) != t_nctl) {
322 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 return NULL;
324 }
325 for (t = 0; t < t_nctl; t++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000326 pt = PyList_GetItem(w, t);
327 if (!PyArg_GetDoubleArray(pt, 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 return NULL;
329 pnext += ncoords;
330 }
331 }
332 s_byte_stride = sizeof(double) * ncoords;
333 t_byte_stride = s_byte_stride * s_nctl;
334 nurbssurface( arg1 , arg2 , arg3 , arg4 ,
335 s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000336 PyMem_DEL(arg2);
337 PyMem_DEL(arg4);
338 PyMem_DEL(arg5);
339 Py_INCREF(Py_None);
340 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341}
342
343/* nurbscurve(knots, ctlpoints, order, type).
344 The length of ctlpoints is len(knots)-order. */
345
346%nurbscurve
347
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000348static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349gl_nurbscurve(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000350 PyObject *self;
351 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352{
353 long arg1 ;
354 double * arg2 ;
355 long arg3 ;
356 double * arg4 ;
357 long arg5 ;
358 long arg6 ;
359 int ncoords, npoints;
360 int i;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000361 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 double *pnext;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000363 if (!PyArg_GetLongArraySize(args, 4, 0, &arg1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000365 if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
366 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000368 if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000370 if (!PyArg_GetLong(args, 4, 2, &arg5))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000372 if (!PyArg_GetLong(args, 4, 3, &arg6))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 return NULL;
374 if (arg6 == N_ST)
375 ncoords = 2;
376 else if (arg6 == N_STW)
377 ncoords = 3;
378 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000379 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380 return NULL;
381 }
382 npoints = arg1 - arg5;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000383 if (!PyArg_GetObject(args, 4, 1, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000385 if (!PyList_Check(v) || PyList_Size(v) != npoints) {
386 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 return NULL;
388 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000389 if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) {
390 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 }
392 pnext = arg4;
393 for (i = 0; i < npoints; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000394 if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 return NULL;
396 pnext += ncoords;
397 }
398 arg3 = (sizeof(double)) * ncoords;
399 nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000400 PyMem_DEL(arg2);
401 PyMem_DEL(arg4);
402 Py_INCREF(Py_None);
403 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
406/* pwlcurve(points, type).
407 Points is a list of points. Type must be N_ST. */
408
409%pwlcurve
410
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000411static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412gl_pwlcurve(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000413 PyObject *self;
414 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000416 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417 long type;
418 double *data, *pnext;
419 long npoints, ncoords;
420 int i;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000421 if (!PyArg_GetObject(args, 2, 0, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000423 if (!PyArg_GetLong(args, 2, 1, &type))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000425 if (!PyList_Check(v)) {
426 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 return NULL;
428 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000429 npoints = PyList_Size(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 if (type == N_ST)
431 ncoords = 2;
432 else {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000433 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 return NULL;
435 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000436 if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) {
437 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438 }
439 pnext = data;
440 for (i = 0; i < npoints; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000441 if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 return NULL;
443 pnext += ncoords;
444 }
445 pwlcurve(npoints, data, sizeof(double)*ncoords, type);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000446 PyMem_DEL(data);
447 Py_INCREF(Py_None);
448 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449}
450
451
452/* Picking and Selecting */
453
454static short *pickbuffer = NULL;
455static long pickbuffersize;
456
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000457static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458pick_select(args, func)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000459 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 void (*func)();
461{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000462 if (!PyArg_GetLong(args, 1, 0, &pickbuffersize))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 return NULL;
464 if (pickbuffer != NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000465 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466 "pick/gselect: already picking/selecting");
467 return NULL;
468 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000469 if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) {
470 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 }
472 (*func)(pickbuffer, pickbuffersize);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000473 Py_INCREF(Py_None);
474 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475}
476
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000477static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478endpick_select(args, func)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000479 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480 long (*func)();
481{
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000482 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483 int i, nhits, n;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000484 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 return NULL;
486 if (pickbuffer == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000487 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488 "endpick/endselect: not in pick/select mode");
489 return NULL;
490 }
491 nhits = (*func)(pickbuffer);
492 if (nhits < 0) {
493 nhits = -nhits; /* How to report buffer overflow otherwise? */
494 }
495 /* Scan the buffer to see how many integers */
496 n = 0;
497 for (; nhits > 0; nhits--) {
498 n += 1 + pickbuffer[n];
499 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000500 v = PyList_New(n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501 if (v == NULL)
502 return NULL;
503 /* XXX Could do it nicer and interpret the data structure here,
504 returning a list of lists. But this can be done in Python... */
505 for (i = 0; i < n; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000506 w = PyInt_FromLong((long)pickbuffer[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000507 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000508 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 return NULL;
510 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000511 PyList_SetItem(v, i, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000513 PyMem_DEL(pickbuffer);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 pickbuffer = NULL;
515 return v;
516}
517
518extern void pick(), gselect();
519extern long endpick(), endselect();
520
521%pick
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000522static PyObject *gl_pick(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000523 return pick_select(args, pick);
524}
525
526%endpick
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000527static PyObject *gl_endpick(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000528 return endpick_select(args, endpick);
529}
530
531%gselect
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000532static PyObject *gl_gselect(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533 return pick_select(args, gselect);
534}
535
536%endselect
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000537static PyObject *gl_endselect(self, args) PyObject *self, *args; {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538 return endpick_select(args, endselect);
539}
540
541
542/* XXX The generator botches this one. Here's a quick hack to fix it. */
543
Guido van Rossumb3165151991-08-16 08:59:21 +0000544/* XXX The generator botches this one. Here's a quick hack to fix it. */
545
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000546% getmatrix float r[16]
547
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000548static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549gl_getmatrix(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000550 PyObject *self;
551 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000553 Matrix arg1;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000554 PyObject *v, *w;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000555 int i, j;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556 getmatrix( arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000557 v = PyList_New(16);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000558 if (v == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000559 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000561 for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
562 w = mknewfloatobject(arg1[i][j]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000564 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565 return NULL;
566 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000567 PyList_SetItem(v, i*4+j, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568 }
569 return v;
570}
571
Guido van Rossumb3165151991-08-16 08:59:21 +0000572/* Here's an alternate version that returns a 4x4 matrix instead of
573 a vector. Unfortunately it is incompatible with loadmatrix and
574 multmatrix... */
575
576% altgetmatrix float r[4][4]
577
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000578static PyObject *
Guido van Rossumb3165151991-08-16 08:59:21 +0000579gl_altgetmatrix(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000580 PyObject *self;
581 PyObject *args;
Guido van Rossumb3165151991-08-16 08:59:21 +0000582{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000583 Matrix arg1;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000584 PyObject *v, *w;
Guido van Rossumb3165151991-08-16 08:59:21 +0000585 int i, j;
586 getmatrix( arg1 );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000587 v = PyList_New(4);
Guido van Rossumb3165151991-08-16 08:59:21 +0000588 if (v == NULL) {
589 return NULL;
590 }
591 for (i = 0; i < 4; i++) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000592 w = PyList_New(4);
Guido van Rossumb3165151991-08-16 08:59:21 +0000593 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000594 Py_DECREF(v);
Guido van Rossumb3165151991-08-16 08:59:21 +0000595 return NULL;
596 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000597 PyList_SetItem(v, i, w);
Guido van Rossumb3165151991-08-16 08:59:21 +0000598 }
599 for (i = 0; i < 4; i++) {
600 for (j = 0; j < 4; j++) {
601 w = mknewfloatobject(arg1[i][j]);
602 if (w == NULL) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000603 Py_DECREF(v);
Guido van Rossumb3165151991-08-16 08:59:21 +0000604 return NULL;
605 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000606 PyList_SetItem(PyList_GetItem(v, i), j, w);
Guido van Rossumb3165151991-08-16 08:59:21 +0000607 }
608 }
609 return v;
610}
611
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000612% lrectwrite
613
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000614static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000615gl_lrectwrite(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000616 PyObject *self;
617 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000618{
619 short x1 ;
620 short y1 ;
621 short x2 ;
622 short y2 ;
623 string parray ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000624 PyObject *s;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000625#if 0
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000626 int pixcount;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000627#endif
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000628 if (!PyArg_GetShort(args, 5, 0, &x1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000629 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000630 if (!PyArg_GetShort(args, 5, 1, &y1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000631 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000632 if (!PyArg_GetShort(args, 5, 2, &x2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000633 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000634 if (!PyArg_GetShort(args, 5, 3, &y2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000635 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000636 if (!PyArg_GetString(args, 5, 4, &parray))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000637 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000638 if (!PyArg_GetObject(args, 5, 4, &s))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000639 return NULL;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000640#if 0
641/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000642 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000643 if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) {
644 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000645 "string arg to lrectwrite has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000646 return NULL;
647 }
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000648#endif
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000649 lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000650 Py_INCREF(Py_None);
651 return Py_None;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000652}
653
654% lrectread
655
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000656static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000657gl_lrectread(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000658 PyObject *self;
659 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000660{
661 short x1 ;
662 short y1 ;
663 short x2 ;
664 short y2 ;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000665 PyObject *parray;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000666 int pixcount;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000667 if (!PyArg_GetShort(args, 4, 0, &x1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000668 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000669 if (!PyArg_GetShort(args, 4, 1, &y1))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000670 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000671 if (!PyArg_GetShort(args, 4, 2, &x2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000672 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000673 if (!PyArg_GetShort(args, 4, 3, &y2))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000674 return NULL;
675 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000676 parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000677 if (parray == NULL)
678 return NULL; /* No memory */
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000679 lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000680 return parray;
681}
682
Jack Jansen5fc67731993-02-16 09:25:15 +0000683% readdisplay
684
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000685static PyObject *
Jack Jansen5fc67731993-02-16 09:25:15 +0000686gl_readdisplay(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000687 PyObject *self;
688 PyObject *args;
Jack Jansen5fc67731993-02-16 09:25:15 +0000689{
690 short x1, y1, x2, y2;
691 unsigned long *parray, hints;
692 long size, size_ret;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000693 PyObject *rv;
Jack Jansen5fc67731993-02-16 09:25:15 +0000694
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000695 if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) )
Jack Jansen5fc67731993-02-16 09:25:15 +0000696 return 0;
697 size = (long)(x2+1-x1) * (long)(y2+1-y1);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000698 rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long));
Jack Jansen5fc67731993-02-16 09:25:15 +0000699 if ( rv == NULL )
700 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000701 parray = (unsigned long *)PyString_AsString(rv);
Jack Jansen5fc67731993-02-16 09:25:15 +0000702 size_ret = readdisplay(x1, y1, x2, y2, parray, hints);
703 if ( size_ret != size ) {
Guido van Rossumece35bc1996-12-09 18:52:11 +0000704 printf("gl_readdisplay: got %ld pixels, expected %ld\n",
Jack Jansen5fc67731993-02-16 09:25:15 +0000705 size_ret, size);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000706 PyErr_SetString(PyExc_RuntimeError, "readdisplay returned unexpected length");
Jack Jansen5fc67731993-02-16 09:25:15 +0000707 return NULL;
708 }
709 return rv;
710}
711
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000712/* Desperately needed, here are tools to compress and decompress
713 the data manipulated by lrectread/lrectwrite.
714
715 gl.packrect(width, height, packfactor, bigdata) --> smalldata
716 makes 'bigdata' 4*(packfactor**2) times smaller by:
717 - turning it into B/W (a factor 4)
718 - replacing squares of size pacfactor by one
719 representative
720
721 gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
722 is the inverse; the numeric arguments must be *the same*.
723
724 Both work best if width and height are multiples of packfactor
725 (in fact unpackrect will leave garbage bytes).
726*/
727
728% packrect
729
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000730static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000731gl_packrect(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000732 PyObject *self;
733 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000734{
735 long width, height, packfactor;
736 char *s;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000737 PyObject *unpacked, *packed;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000738 int pixcount, packedcount, x, y, r, g, b;
739 unsigned long pixel;
740 unsigned char *p;
741 unsigned long *parray;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000742 if (!PyArg_GetLong(args, 4, 0, &width))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000743 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000744 if (!PyArg_GetLong(args, 4, 1, &height))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000745 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000746 if (!PyArg_GetLong(args, 4, 2, &packfactor))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000747 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000748 if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000749 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000750 if (!PyArg_GetObject(args, 4, 3, &unpacked))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000751 return NULL;
752 if (width <= 0 || height <= 0 || packfactor <= 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000753 PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000754 return NULL;
755 }
756 pixcount = width*height;
757 packedcount = ((width+packfactor-1)/packfactor) *
758 ((height+packfactor-1)/packfactor);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000759 if (PyString_Size(unpacked) != pixcount*sizeof(long)) {
760 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000761 "string arg to packrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000762 return NULL;
763 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000764 packed = PyString_FromStringAndSize((char *)NULL, packedcount);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000765 if (packed == NULL)
766 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000767 parray = (unsigned long *) PyString_AsString(unpacked);
768 p = (unsigned char *) PyString_AsString(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000769 for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
770 for (x = 0; x < width; x += packfactor) {
771 pixel = parray[x];
772 r = pixel & 0xff;
773 g = (pixel >> 8) & 0xff;
774 b = (pixel >> 16) & 0xff;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000775 *p++ = (30*r+59*g+11*b) / 100;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000776 }
777 }
778 return packed;
779}
780
781% unpackrect
782
783static unsigned long unpacktab[256];
784static int unpacktab_inited = 0;
785
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000786static PyObject *
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000787gl_unpackrect(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000788 PyObject *self;
789 PyObject *args;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000790{
791 long width, height, packfactor;
792 char *s;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000793 PyObject *unpacked, *packed;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000794 int pixcount, packedcount;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000795 register unsigned char *p;
796 register unsigned long *parray;
797 if (!unpacktab_inited) {
798 register int white;
799 for (white = 256; --white >= 0; )
800 unpacktab[white] = white * 0x010101L;
801 unpacktab_inited++;
802 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000803 if (!PyArg_GetLong(args, 4, 0, &width))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000804 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000805 if (!PyArg_GetLong(args, 4, 1, &height))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000806 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000807 if (!PyArg_GetLong(args, 4, 2, &packfactor))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000808 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000809 if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000810 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000811 if (!PyArg_GetObject(args, 4, 3, &packed))
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000812 return NULL;
813 if (width <= 0 || height <= 0 || packfactor <= 0) {
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000814 PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000815 return NULL;
816 }
817 pixcount = width*height;
818 packedcount = ((width+packfactor-1)/packfactor) *
819 ((height+packfactor-1)/packfactor);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000820 if (PyString_Size(packed) != packedcount) {
821 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000822 "string arg to unpackrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000823 return NULL;
824 }
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000825 unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long));
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000826 if (unpacked == NULL)
827 return NULL;
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000828 parray = (unsigned long *) PyString_AsString(unpacked);
829 p = (unsigned char *) PyString_AsString(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000830 if (packfactor == 1 && width*height > 0) {
831 /* Just expand bytes to longs */
832 register int x = width * height;
833 do {
834 *parray++ = unpacktab[*p++];
835 } while (--x >= 0);
836 }
837 else {
838 register int y;
839 for (y = 0; y < height-packfactor+1;
840 y += packfactor, parray += packfactor*width) {
841 register int x;
842 for (x = 0; x < width-packfactor+1; x += packfactor) {
843 register unsigned long pixel = unpacktab[*p++];
844 register int i;
845 for (i = packfactor*width; (i-=width) >= 0;) {
846 register int j;
847 for (j = packfactor; --j >= 0; )
848 parray[i+x+j] = pixel;
849 }
850 }
851 }
852 }
853 return unpacked;
854}
855
Guido van Rossumaee08791992-09-08 09:05:33 +0000856% gversion
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000857static PyObject *
Guido van Rossumaee08791992-09-08 09:05:33 +0000858gl_gversion(self, args)
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000859 PyObject *self;
860 PyObject *args;
Guido van Rossumaee08791992-09-08 09:05:33 +0000861{
862 char buf[20];
863 gversion(buf);
Guido van Rossum0a3eaf01997-04-29 15:39:28 +0000864 return PyString_FromString(buf);
Guido van Rossumaee08791992-09-08 09:05:33 +0000865}
866
867
Guido van Rossum5c069fd1998-04-28 16:09:16 +0000868/* void clear - Manual because of clash with termcap */
869%clear
870static PyObject *
871gl_clear(self, args)
872 PyObject *self;
873 PyObject *args;
874{
875 __GLclear( );
876 Py_INCREF(Py_None);
877 return Py_None;
878}
879
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000880/* End of manually written stubs */
881
882%%
883
884long getshade
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000885if !solaris void devport short s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000886void rdr2i long s long s
887void rectfs short s short s short s short s
888void rects short s short s short s short s
889void rmv2i long s long s
890void noport
891void popviewport
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000892void clearhitcode
893void closeobj
894void cursoff
895void curson
896void doublebuffer
897void finish
898void gconfig
899void ginit
900void greset
901void multimap
902void onemap
903void popattributes
904void popmatrix
905void pushattributes
906void pushmatrix
907void pushviewport
908void qreset
909void RGBmode
910void singlebuffer
911void swapbuffers
912void gsync
Guido van Rossum06a67021992-02-26 15:19:45 +0000913void gflush
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000914void tpon
915void tpoff
916void clkon
917void clkoff
918void ringbell
919#void callfunc
920void gbegin
921void textinit
922void initnames
923void pclos
924void popname
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000925if !solaris void spclos
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000926void zclear
927void screenspace
928void reshapeviewport
929void winpush
930void winpop
931void foreground
932void endfullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000933if !solaris void endpupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000934void fullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000935if !solaris void pupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000936void winconstraints
937void pagecolor short s
938void textcolor short s
939void color short s
940void curveit short s
941void font short s
942void linewidth short s
943void setlinestyle short s
944void setmap short s
945void swapinterval short s
946void writemask short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000947if !solaris void textwritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000948void qdevice short s
949void unqdevice short s
950void curvebasis short s
951void curveprecision short s
952void loadname short s
953void passthrough short s
954void pushname short s
955void setmonitor short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000956if !solaris void setshade short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000957void setpattern short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000958if !solaris void pagewritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000959#
960void callobj long s
961void delobj long s
962void editobj long s
963void makeobj long s
964void maketag long s
965void chunksize long s
966void compactify long s
967void deltag long s
968void lsrepeat long s
969void objinsert long s
970void objreplace long s
971void winclose long s
972void blanktime long s
973void freepup long s
974# This is not in the library!?
975###void pupcolor long s
976#
977void backbuffer long s
978void frontbuffer long s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000979if !solaris void lsbackup long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000980void resetls long s
981void lampon long s
982void lampoff long s
983void setbell long s
984void blankscreen long s
985void depthcue long s
986void zbuffer long s
987void backface long s
988#
989void cmov2i long s long s
990void draw2i long s long s
991void move2i long s long s
992void pnt2i long s long s
993void patchbasis long s long s
994void patchprecision long s long s
995void pdr2i long s long s
996void pmv2i long s long s
997void rpdr2i long s long s
998void rpmv2i long s long s
999void xfpt2i long s long s
1000void objdelete long s long s
1001void patchcurves long s long s
1002void minsize long s long s
1003void maxsize long s long s
1004void keepaspect long s long s
1005void prefsize long s long s
1006void stepunit long s long s
1007void fudge long s long s
1008void winmove long s long s
1009#
1010void attachcursor short s short s
1011void deflinestyle short s short s
1012void noise short s short s
1013void picksize short s short s
1014void qenter short s short s
1015void setdepth short s short s
1016void cmov2s short s short s
1017void draw2s short s short s
1018void move2s short s short s
1019void pdr2s short s short s
1020void pmv2s short s short s
1021void pnt2s short s short s
1022void rdr2s short s short s
1023void rmv2s short s short s
1024void rpdr2s short s short s
1025void rpmv2s short s short s
1026void xfpt2s short s short s
1027#
1028void cmov2 float s float s
1029void draw2 float s float s
1030void move2 float s float s
1031void pnt2 float s float s
1032void pdr2 float s float s
1033void pmv2 float s float s
1034void rdr2 float s float s
1035void rmv2 float s float s
1036void rpdr2 float s float s
1037void rpmv2 float s float s
1038void xfpt2 float s float s
1039#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001040void loadmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001041# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001042void multmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001043# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001044void crv float s[3*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001045# Really [4][3]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001046void rcrv float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001047# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001048#
1049# Methods that have strings.
1050#
1051void addtopup long s char *s long s
1052void charstr char *s
1053void getport char *s
1054long strwidth char *s
1055long winopen char *s
1056void wintitle char *s
1057#
1058# Methods that have 1 long (# of elements) and an array
1059#
1060void polf long s float s[3*arg1]
1061void polf2 long s float s[2*arg1]
1062void poly long s float s[3*arg1]
1063void poly2 long s float s[2*arg1]
1064void crvn long s float s[3*arg1]
1065void rcrvn long s float s[4*arg1]
1066#
1067void polf2i long s long s[2*arg1]
1068void polfi long s long s[3*arg1]
1069void poly2i long s long s[2*arg1]
1070void polyi long s long s[3*arg1]
1071#
1072void polf2s long s short s[2*arg1]
1073void polfs long s short s[3*arg1]
1074void polys long s short s[3*arg1]
1075void poly2s long s short s[2*arg1]
1076#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001077void defcursor short s u_short s[128]
Guido van Rossumb3165151991-08-16 08:59:21 +00001078# Is this useful?
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001079void writepixels short s u_short s[arg1]
Guido van Rossumb3165151991-08-16 08:59:21 +00001080# Should be unsigned short...
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001081void defbasis long s float s[4*4]
1082if !solaris void gewrite short s short s[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001083#
1084void rotate short s char s
1085# This is not in the library!?
1086###void setbutton short s char s
1087void rot float s char s
1088#
1089void circfi long s long s long s
1090void circi long s long s long s
1091void cmovi long s long s long s
1092void drawi long s long s long s
1093void movei long s long s long s
1094void pnti long s long s long s
1095void newtag long s long s long s
1096void pdri long s long s long s
1097void pmvi long s long s long s
1098void rdri long s long s long s
1099void rmvi long s long s long s
1100void rpdri long s long s long s
1101void rpmvi long s long s long s
1102void xfpti long s long s long s
1103#
1104void circ float s float s float s
1105void circf float s float s float s
1106void cmov float s float s float s
1107void draw float s float s float s
1108void move float s float s float s
1109void pnt float s float s float s
1110void scale float s float s float s
1111void translate float s float s float s
1112void pdr float s float s float s
1113void pmv float s float s float s
1114void rdr float s float s float s
1115void rmv float s float s float s
1116void rpdr float s float s float s
1117void rpmv float s float s float s
1118void xfpt float s float s float s
1119#
1120void RGBcolor short s short s short s
1121void RGBwritemask short s short s short s
1122void setcursor short s short s short s
1123void tie short s short s short s
1124void circfs short s short s short s
1125void circs short s short s short s
1126void cmovs short s short s short s
1127void draws short s short s short s
1128void moves short s short s short s
1129void pdrs short s short s short s
1130void pmvs short s short s short s
1131void pnts short s short s short s
1132void rdrs short s short s short s
1133void rmvs short s short s short s
1134void rpdrs short s short s short s
1135void rpmvs short s short s short s
1136void xfpts short s short s short s
1137void curorigin short s short s short s
1138void cyclemap short s short s short s
1139#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001140void patch float s[4*4] float s[4*4] float s[4*4]
1141void splf long s float s[3*arg1] u_short s[arg1]
1142void splf2 long s float s[2*arg1] u_short s[arg1]
1143void splfi long s long s[3*arg1] u_short s[arg1]
1144void splf2i long s long s[2*arg1] u_short s[arg1]
1145void splfs long s short s[3*arg1] u_short s[arg1]
1146void splf2s long s short s[2*arg1] u_short s[arg1]
1147###void defpattern short s short s u_short s[arg2*arg2/16]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001148#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001149void 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 +00001150#
1151# routines that send 4 floats
1152#
1153void ortho2 float s float s float s float s
1154void rect float s float s float s float s
1155void rectf float s float s float s float s
1156void xfpt4 float s float s float s float s
1157#
1158void textport short s short s short s short s
1159void mapcolor short s short s short s short s
1160void scrmask short s short s short s short s
1161void setvaluator short s short s short s short s
1162void viewport short s short s short s short s
1163void shaderange short s short s short s short s
1164void xfpt4s short s short s short s short s
1165void rectfi long s long s long s long s
1166void recti long s long s long s long s
1167void xfpt4i long s long s long s long s
1168void prefposition long s long s long s long s
1169#
1170void arc float s float s float s short s short s
1171void arcf float s float s float s short s short s
1172void arcfi long s long s long s short s short s
1173void arci long s long s long s short s short s
1174#
1175void bbox2 short s short s float s float s float s float s
1176void bbox2i short s short s long s long s long s long s
1177void bbox2s short s short s short s short s short s short s
1178void blink short s short s short s short s short s
1179void ortho float s float s float s float s float s float s
1180void window float s float s float s float s float s float s
1181void lookat float s float s float s float s float s float s short s
1182#
1183void perspective short s float s float s float s
1184void polarview float s short s short s short s
1185# XXX getichararray not supported
1186#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
1187#
1188void arcfs short s short s short s short s short s
1189void arcs short s short s short s short s short s
1190void rectcopy short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001191if !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 +00001192#
1193long getbutton short s
1194long getcmmode
1195long getlsbackup
1196long getresetls
1197long getdcm
1198long getzbuffer
1199long ismex
1200long isobj long s
1201long isqueued short s
1202long istag long s
1203#
1204long genobj
1205long gentag
1206long getbuffer
1207long getcolor
1208long getdisplaymode
1209long getfont
1210long getheight
1211long gethitcode
1212long getlstyle
1213long getlwidth
1214long getmap
1215long getplanes
1216long getwritemask
1217long qtest
1218long getlsrepeat
1219long getmonitor
1220long getopenobj
1221long getpattern
1222long winget
1223long winattach
1224long getothermonitor
1225long newpup
1226#
1227long getvaluator short s
1228void winset long s
1229long dopup long s
1230void getdepth short r short r
1231void getcpos short r short r
1232void getsize long r long r
1233void getorigin long r long r
1234void getviewport short r short r short r short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001235if !solaris void gettp short r short r short r short r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001236void getgpos float r float r float r float r
1237void winposition long s long s long s long s
1238void gRGBcolor short r short r short r
1239void gRGBmask short r short r short r
1240void getscrmask short r short r short r short r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001241###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 +00001242void getmcolor short s short r short r short r
1243void mapw long s short s short s float r float r float r float r float r float r
1244void mapw2 long s short s short s float r float r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001245###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 +00001246###long qread short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001247void getcursor short r u_short r u_short r long r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001248#
1249# For these we receive arrays of stuff
1250#
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001251###void getdev long s short s[arg1] short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001252#XXX not generated correctly yet
1253#void getmatrix float r[16]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001254###long readpixels short s short r[retval]
1255###long readRGB short s char r[retval] char r[retval] char r[retval]
1256###long blkqread short s short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001257#
1258# New 4D routines
1259#
1260void cmode
1261void concave long s
1262void curstype long s
1263void drawmode long s
1264void gammaramp short s[256] short s[256] short s[256]
1265long getbackface
1266long getdescender
1267long getdrawmode
1268long getmmode
1269long getsm
1270long getvideo long s
1271void imakebackground
1272void lmbind short s short s
1273void lmdef long s long s long s float s[arg3]
1274void mmode long s
1275void normal float s[3]
1276void overlay long s
1277void RGBrange short s short s short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001278if !solaris void setvideo long s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001279void shademodel long s
1280void underlay long s
1281#
1282# New Personal Iris/GT Routines
1283#
1284void bgnclosedline
1285void bgnline
1286void bgnpoint
1287void bgnpolygon
1288void bgnsurface
1289void bgntmesh
1290void bgntrim
1291void endclosedline
1292void endline
1293void endpoint
1294void endpolygon
1295void endsurface
1296void endtmesh
1297void endtrim
1298void blendfunction long s long s
1299void c3f float s[3]
1300void c3i long s[3]
1301void c3s short s[3]
1302void c4f float s[4]
1303void c4i long s[4]
1304void c4s short s[4]
1305void colorf float s
1306void cpack long s
1307void czclear long s long s
1308void dglclose long s
1309long dglopen char *s long s
1310long getgdesc long s
1311void getnurbsproperty long s float r
1312void glcompat long s long s
1313void iconsize long s long s
1314void icontitle char *s
1315void lRGBrange short s short s short s short s short s short s long s long s
1316void linesmooth long s
1317void lmcolor long s
1318void logicop long s
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001319###long lrectread short s short s short s short s long r[retval]
1320###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
1321### Now manual, with string last arg
1322###long rectread short s short s short s short s short r[retval]
1323###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 +00001324void lsetdepth long s long s
1325void lshaderange short s short s long s long s
1326void n3f float s[3]
1327void noborder
1328void pntsmooth long s
1329void readsource long s
1330void rectzoom float s float s
1331void sbox float s float s float s float s
1332void sboxi long s long s long s long s
1333void sboxs short s short s short s short s
1334void sboxf float s float s float s float s
1335void sboxfi long s long s long s long s
1336void sboxfs short s short s short s short s
1337void setnurbsproperty long s float s
1338void setpup long s long s long s
1339void smoothline long s
1340void subpixel long s
1341void swaptmesh
1342long swinopen long s
1343void v2f float s[2]
1344void v2i long s[2]
1345void v2s short s[2]
1346void v3f float s[3]
1347void v3i long s[3]
1348void v3s short s[3]
1349void v4f float s[4]
1350void v4i long s[4]
1351void v4s short s[4]
1352void videocmd long s
1353long windepth long s
1354void wmpack long s
1355void zdraw long s
1356void zfunction long s
1357void zsource long s
1358void zwritemask long s
1359#
1360# uses doubles
1361#
1362void v2d double s[2]
1363void v3d double s[3]
1364void v4d double s[4]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001365#
1366# Why isn't this here?
1367#
1368void pixmode long s long s
Guido van Rossumdd9ed831992-06-29 17:10:40 +00001369#
1370# New in IRIX 4.0
1371#
1372long qgetfd
Jack Jansenfa1b9f61993-02-19 12:53:12 +00001373void dither long s