blob: b3c70379d8bf19c01a27a43033abcefee9a00e27 [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 Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumb6775db1994-08-01 11:34:53 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumb6775db1994-08-01 11:34:53 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumb6775db1994-08-01 11:34:53 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumb6775db1994-08-01 11:34:53 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/*
33Input used to generate the Python module "glmodule.c".
Guido van Rossumb3165151991-08-16 08:59:21 +000034The stub generator is a Python script called "cgen.py".
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
36Each definition must be contained on one line:
37
38<returntype> <name> <type> <arg> <type> <arg>
39
40<returntype> can be: void, short, long (XXX maybe others?)
41
42<type> can be: char, string, short, float, long, or double
43 string indicates a null terminated string;
44 if <type> is char and <arg> begins with a *, the * is stripped
45 and <type> is changed into string
46
47<arg> has the form <mode> or <mode>[<subscript>]
48 where <mode> can be
49 s: arg is sent
50 r: arg is received (arg is a pointer)
51 and <subscript> can be (N and I are numbers):
52 N
53 argI
54 retval
55 N*argI
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000056 N*I
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 N*retval
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +000058 In the case where the subscript consists of two parts
59 separated by *, the first part is the width of the matrix, and
60 the second part is the length of the matrix. This order is
61 opposite from the order used in C to declare a two-dimensional
62 matrix.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063*/
64
Jack Jansen743db361992-08-13 14:13:11 +000065/*
66 * An attempt has been made to make this module switch threads on qread
67 * calls. It is far from safe, though.
68 */
69
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070#include <gl.h>
71#include <device.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossumece35bc1996-12-09 18:52:11 +000073#ifdef __sgi
74extern int devport();
75extern int textwritemask();
76extern int pagewritemask();
77extern int gewrite();
78extern int gettp();
79#endif
80
Guido van Rossum3f5da241990-12-20 15:06:42 +000081#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083#include "modsupport.h"
84#include "cgensupport.h"
Jack Jansen743db361992-08-13 14:13:11 +000085#include "ceval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086
87/*
88Some stubs are too complicated for the stub generator.
89We can include manually written versions of them here.
90A line starting with '%' gives the name of the function so the stub
91generator can include it in the table of functions.
92*/
93
Jack Jansen743db361992-08-13 14:13:11 +000094% qread
95
96static object *
97gl_qread(self, args)
98 object *self;
99 object *args;
100{
101 long retval;
102 short arg1 ;
103 BGN_SAVE
104 retval = qread( & arg1 );
105 END_SAVE
106 { object *v = newtupleobject( 2 );
107 if (v == NULL) return NULL;
108 settupleitem(v, 0, mknewlongobject(retval));
109 settupleitem(v, 1, mknewshortobject(arg1));
110 return v;
111 }
112}
113
114
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115/*
116varray -- an array of v.. calls.
117The argument is an array (maybe list or tuple) of points.
118Each point must be a tuple or list of coordinates (x, y, z).
119The points may be 2- or 3-dimensional but must all have the
120same dimension. Float and int values may be mixed however.
121The points are always converted to 3D double precision points
122by assuming z=0.0 if necessary (as indicated in the man page),
123and for each point v3d() is called.
124*/
125
126% varray
127
128static object *
129gl_varray(self, args)
130 object *self;
131 object *args;
132{
Guido van Rossumece35bc1996-12-09 18:52:11 +0000133 object *v, *w=NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 int i, n, width;
135 double vec[3];
136 object * (*getitem) FPROTO((object *, int));
137
138 if (!getiobjectarg(args, 1, 0, &v))
139 return NULL;
140
141 if (is_listobject(v)) {
142 n = getlistsize(v);
143 getitem = getlistitem;
144 }
145 else if (is_tupleobject(v)) {
146 n = gettuplesize(v);
147 getitem = gettupleitem;
148 }
149 else {
150 err_badarg();
151 return NULL;
152 }
153
154 if (n == 0) {
155 INCREF(None);
156 return None;
157 }
158 if (n > 0)
159 w = (*getitem)(v, 0);
160
161 width = 0;
162 if (w == NULL) {
163 }
164 else if (is_listobject(w)) {
165 width = getlistsize(w);
166 }
167 else if (is_tupleobject(w)) {
168 width = gettuplesize(w);
169 }
170
171 switch (width) {
172 case 2:
173 vec[2] = 0.0;
174 /* Fall through */
175 case 3:
176 break;
177 default:
178 err_badarg();
179 return NULL;
180 }
181
182 for (i = 0; i < n; i++) {
183 w = (*getitem)(v, i);
184 if (!getidoublearray(w, 1, 0, width, vec))
185 return NULL;
186 v3d(vec);
187 }
188
189 INCREF(None);
190 return None;
191}
192
193/*
194vnarray, nvarray -- an array of n3f and v3f calls.
195The argument is an array (list or tuple) of pairs of points and normals.
196Each pair is a tuple (NOT a list) of a point and a normal for that point.
197Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
198Three coordinates must be given. Float and int values may be mixed.
199For each pair, n3f() is called for the normal, and then v3f() is called
200for the vector.
201
202vnarray and nvarray differ only in the order of the vector and normal in
203the pair: vnarray expects (v, n) while nvarray expects (n, v).
204*/
205
206static object *gen_nvarray(); /* Forward */
207
208% nvarray
209
210static object *
211gl_nvarray(self, args)
212 object *self;
213 object *args;
214{
215 return gen_nvarray(args, 0);
216}
217
218% vnarray
219
220static object *
221gl_vnarray(self, args)
222 object *self;
223 object *args;
224{
225 return gen_nvarray(args, 1);
226}
227
228/* Generic, internal version of {nv,nv}array: inorm indicates the
229 argument order, 0: normal first, 1: vector first. */
230
231static object *
232gen_nvarray(args, inorm)
233 object *args;
234 int inorm;
235{
236 object *v, *w, *wnorm, *wvec;
237 int i, n;
238 float norm[3], vec[3];
239 object * (*getitem) FPROTO((object *, int));
240
241 if (!getiobjectarg(args, 1, 0, &v))
242 return NULL;
243
244 if (is_listobject(v)) {
245 n = getlistsize(v);
246 getitem = getlistitem;
247 }
248 else if (is_tupleobject(v)) {
249 n = gettuplesize(v);
250 getitem = gettupleitem;
251 }
252 else {
253 err_badarg();
254 return NULL;
255 }
256
257 for (i = 0; i < n; i++) {
258 w = (*getitem)(v, i);
259 if (!is_tupleobject(w) || gettuplesize(w) != 2) {
260 err_badarg();
261 return NULL;
262 }
263 wnorm = gettupleitem(w, inorm);
264 wvec = gettupleitem(w, 1 - inorm);
265 if (!getifloatarray(wnorm, 1, 0, 3, norm) ||
266 !getifloatarray(wvec, 1, 0, 3, vec))
267 return NULL;
268 n3f(norm);
269 v3f(vec);
270 }
271
272 INCREF(None);
273 return None;
274}
275
276/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
277 The dimensions of ctl[] are computed as follows:
278 [len(s_knots) - s_order], [len(t_knots) - t_order]
279*/
280
281% nurbssurface
282
283static object *
284gl_nurbssurface(self, args)
285 object *self;
286 object *args;
287{
288 long arg1 ;
289 double * arg2 ;
290 long arg3 ;
291 double * arg4 ;
292 double *arg5 ;
293 long arg6 ;
294 long arg7 ;
295 long arg8 ;
296 long ncoords;
297 long s_byte_stride, t_byte_stride;
298 long s_nctl, t_nctl;
299 long s, t;
300 object *v, *w, *pt;
301 double *pnext;
302 if (!getilongarraysize(args, 6, 0, &arg1))
303 return NULL;
304 if ((arg2 = NEW(double, arg1 )) == NULL) {
305 return err_nomem();
306 }
307 if (!getidoublearray(args, 6, 0, arg1 , arg2))
308 return NULL;
309 if (!getilongarraysize(args, 6, 1, &arg3))
310 return NULL;
311 if ((arg4 = NEW(double, arg3 )) == NULL) {
312 return err_nomem();
313 }
314 if (!getidoublearray(args, 6, 1, arg3 , arg4))
315 return NULL;
316 if (!getilongarg(args, 6, 3, &arg6))
317 return NULL;
318 if (!getilongarg(args, 6, 4, &arg7))
319 return NULL;
320 if (!getilongarg(args, 6, 5, &arg8))
321 return NULL;
322 if (arg8 == N_XYZ)
323 ncoords = 3;
324 else if (arg8 == N_XYZW)
325 ncoords = 4;
326 else {
327 err_badarg();
328 return NULL;
329 }
330 s_nctl = arg1 - arg6;
331 t_nctl = arg3 - arg7;
332 if (!getiobjectarg(args, 6, 2, &v))
333 return NULL;
334 if (!is_listobject(v) || getlistsize(v) != s_nctl) {
335 err_badarg();
336 return NULL;
337 }
338 if ((arg5 = NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
339 return err_nomem();
340 }
341 pnext = arg5;
342 for (s = 0; s < s_nctl; s++) {
343 w = getlistitem(v, s);
344 if (w == NULL || !is_listobject(w) ||
345 getlistsize(w) != t_nctl) {
346 err_badarg();
347 return NULL;
348 }
349 for (t = 0; t < t_nctl; t++) {
350 pt = getlistitem(w, t);
351 if (!getidoublearray(pt, 1, 0, ncoords, pnext))
352 return NULL;
353 pnext += ncoords;
354 }
355 }
356 s_byte_stride = sizeof(double) * ncoords;
357 t_byte_stride = s_byte_stride * s_nctl;
358 nurbssurface( arg1 , arg2 , arg3 , arg4 ,
359 s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
360 DEL(arg2);
361 DEL(arg4);
362 DEL(arg5);
363 INCREF(None);
364 return None;
365}
366
367/* nurbscurve(knots, ctlpoints, order, type).
368 The length of ctlpoints is len(knots)-order. */
369
370%nurbscurve
371
372static object *
373gl_nurbscurve(self, args)
374 object *self;
375 object *args;
376{
377 long arg1 ;
378 double * arg2 ;
379 long arg3 ;
380 double * arg4 ;
381 long arg5 ;
382 long arg6 ;
383 int ncoords, npoints;
384 int i;
385 object *v;
386 double *pnext;
387 if (!getilongarraysize(args, 4, 0, &arg1))
388 return NULL;
389 if ((arg2 = NEW(double, arg1 )) == NULL) {
390 return err_nomem();
391 }
392 if (!getidoublearray(args, 4, 0, arg1 , arg2))
393 return NULL;
394 if (!getilongarg(args, 4, 2, &arg5))
395 return NULL;
396 if (!getilongarg(args, 4, 3, &arg6))
397 return NULL;
398 if (arg6 == N_ST)
399 ncoords = 2;
400 else if (arg6 == N_STW)
401 ncoords = 3;
402 else {
403 err_badarg();
404 return NULL;
405 }
406 npoints = arg1 - arg5;
407 if (!getiobjectarg(args, 4, 1, &v))
408 return NULL;
409 if (!is_listobject(v) || getlistsize(v) != npoints) {
410 err_badarg();
411 return NULL;
412 }
413 if ((arg4 = NEW(double, npoints*ncoords )) == NULL) {
414 return err_nomem();
415 }
416 pnext = arg4;
417 for (i = 0; i < npoints; i++) {
418 if (!getidoublearray(getlistitem(v, i), 1, 0, ncoords, pnext))
419 return NULL;
420 pnext += ncoords;
421 }
422 arg3 = (sizeof(double)) * ncoords;
423 nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
424 DEL(arg2);
425 DEL(arg4);
426 INCREF(None);
427 return None;
428}
429
430/* pwlcurve(points, type).
431 Points is a list of points. Type must be N_ST. */
432
433%pwlcurve
434
435static object *
436gl_pwlcurve(self, args)
437 object *self;
438 object *args;
439{
440 object *v;
441 long type;
442 double *data, *pnext;
443 long npoints, ncoords;
444 int i;
445 if (!getiobjectarg(args, 2, 0, &v))
446 return NULL;
447 if (!getilongarg(args, 2, 1, &type))
448 return NULL;
449 if (!is_listobject(v)) {
450 err_badarg();
451 return NULL;
452 }
453 npoints = getlistsize(v);
454 if (type == N_ST)
455 ncoords = 2;
456 else {
457 err_badarg();
458 return NULL;
459 }
460 if ((data = NEW(double, npoints*ncoords)) == NULL) {
461 return err_nomem();
462 }
463 pnext = data;
464 for (i = 0; i < npoints; i++) {
465 if (!getidoublearray(getlistitem(v, i), 1, 0, ncoords, pnext))
466 return NULL;
467 pnext += ncoords;
468 }
469 pwlcurve(npoints, data, sizeof(double)*ncoords, type);
470 DEL(data);
471 INCREF(None);
472 return None;
473}
474
475
476/* Picking and Selecting */
477
478static short *pickbuffer = NULL;
479static long pickbuffersize;
480
481static object *
482pick_select(args, func)
483 object *args;
484 void (*func)();
485{
486 if (!getilongarg(args, 1, 0, &pickbuffersize))
487 return NULL;
488 if (pickbuffer != NULL) {
489 err_setstr(RuntimeError,
490 "pick/gselect: already picking/selecting");
491 return NULL;
492 }
493 if ((pickbuffer = NEW(short, pickbuffersize)) == NULL) {
494 return err_nomem();
495 }
496 (*func)(pickbuffer, pickbuffersize);
497 INCREF(None);
498 return None;
499}
500
501static object *
502endpick_select(args, func)
503 object *args;
504 long (*func)();
505{
506 object *v, *w;
507 int i, nhits, n;
508 if (!getnoarg(args))
509 return NULL;
510 if (pickbuffer == NULL) {
511 err_setstr(RuntimeError,
512 "endpick/endselect: not in pick/select mode");
513 return NULL;
514 }
515 nhits = (*func)(pickbuffer);
516 if (nhits < 0) {
517 nhits = -nhits; /* How to report buffer overflow otherwise? */
518 }
519 /* Scan the buffer to see how many integers */
520 n = 0;
521 for (; nhits > 0; nhits--) {
522 n += 1 + pickbuffer[n];
523 }
524 v = newlistobject(n);
525 if (v == NULL)
526 return NULL;
527 /* XXX Could do it nicer and interpret the data structure here,
528 returning a list of lists. But this can be done in Python... */
529 for (i = 0; i < n; i++) {
530 w = newintobject((long)pickbuffer[i]);
531 if (w == NULL) {
532 DECREF(v);
533 return NULL;
534 }
535 setlistitem(v, i, w);
536 }
537 DEL(pickbuffer);
538 pickbuffer = NULL;
539 return v;
540}
541
542extern void pick(), gselect();
543extern long endpick(), endselect();
544
545%pick
546static object *gl_pick(self, args) object *self, *args; {
547 return pick_select(args, pick);
548}
549
550%endpick
551static object *gl_endpick(self, args) object *self, *args; {
552 return endpick_select(args, endpick);
553}
554
555%gselect
556static object *gl_gselect(self, args) object *self, *args; {
557 return pick_select(args, gselect);
558}
559
560%endselect
561static object *gl_endselect(self, args) object *self, *args; {
562 return endpick_select(args, endselect);
563}
564
565
566/* XXX The generator botches this one. Here's a quick hack to fix it. */
567
Guido van Rossumb3165151991-08-16 08:59:21 +0000568/* XXX The generator botches this one. Here's a quick hack to fix it. */
569
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570% getmatrix float r[16]
571
572static object *
573gl_getmatrix(self, args)
574 object *self;
575 object *args;
576{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000577 Matrix arg1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000578 object *v, *w;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000579 int i, j;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580 getmatrix( arg1 );
581 v = newlistobject(16);
582 if (v == NULL) {
583 return err_nomem();
584 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000585 for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
586 w = mknewfloatobject(arg1[i][j]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587 if (w == NULL) {
588 DECREF(v);
589 return NULL;
590 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000591 setlistitem(v, i*4+j, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 }
593 return v;
594}
595
Guido van Rossumb3165151991-08-16 08:59:21 +0000596/* Here's an alternate version that returns a 4x4 matrix instead of
597 a vector. Unfortunately it is incompatible with loadmatrix and
598 multmatrix... */
599
600% altgetmatrix float r[4][4]
601
602static object *
603gl_altgetmatrix(self, args)
604 object *self;
605 object *args;
606{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000607 Matrix arg1;
Guido van Rossumb3165151991-08-16 08:59:21 +0000608 object *v, *w;
609 int i, j;
610 getmatrix( arg1 );
611 v = newlistobject(4);
612 if (v == NULL) {
613 return NULL;
614 }
615 for (i = 0; i < 4; i++) {
616 w = newlistobject(4);
617 if (w == NULL) {
618 DECREF(v);
619 return NULL;
620 }
621 setlistitem(v, i, w);
622 }
623 for (i = 0; i < 4; i++) {
624 for (j = 0; j < 4; j++) {
625 w = mknewfloatobject(arg1[i][j]);
626 if (w == NULL) {
627 DECREF(v);
628 return NULL;
629 }
630 setlistitem(getlistitem(v, i), j, w);
631 }
632 }
633 return v;
634}
635
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000636% lrectwrite
637
638static object *
639gl_lrectwrite(self, args)
640 object *self;
641 object *args;
642{
643 short x1 ;
644 short y1 ;
645 short x2 ;
646 short y2 ;
647 string parray ;
648 object *s;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000649#if 0
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000650 int pixcount;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000651#endif
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000652 if (!getishortarg(args, 5, 0, &x1))
653 return NULL;
654 if (!getishortarg(args, 5, 1, &y1))
655 return NULL;
656 if (!getishortarg(args, 5, 2, &x2))
657 return NULL;
658 if (!getishortarg(args, 5, 3, &y2))
659 return NULL;
660 if (!getistringarg(args, 5, 4, &parray))
661 return NULL;
662 if (!getiobjectarg(args, 5, 4, &s))
663 return NULL;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000664#if 0
665/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000666 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
667 if (!is_stringobject(s) || getstringsize(s) != pixcount*sizeof(long)) {
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000668 err_setstr(RuntimeError,
669 "string arg to lrectwrite has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000670 return NULL;
671 }
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000672#endif
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000673 lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
674 INCREF(None);
675 return None;
676}
677
678% lrectread
679
680static object *
681gl_lrectread(self, args)
682 object *self;
683 object *args;
684{
685 short x1 ;
686 short y1 ;
687 short x2 ;
688 short y2 ;
689 object *parray;
690 int pixcount;
691 if (!getishortarg(args, 4, 0, &x1))
692 return NULL;
693 if (!getishortarg(args, 4, 1, &y1))
694 return NULL;
695 if (!getishortarg(args, 4, 2, &x2))
696 return NULL;
697 if (!getishortarg(args, 4, 3, &y2))
698 return NULL;
699 pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
700 parray = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
701 if (parray == NULL)
702 return NULL; /* No memory */
703 lrectread(x1, y1, x2, y2, (unsigned long *) getstringvalue(parray));
704 return parray;
705}
706
Jack Jansen5fc67731993-02-16 09:25:15 +0000707% readdisplay
708
709static object *
710gl_readdisplay(self, args)
711 object *self;
712 object *args;
713{
714 short x1, y1, x2, y2;
715 unsigned long *parray, hints;
716 long size, size_ret;
717 object *rv;
718
719 if ( !getargs(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) )
720 return 0;
721 size = (long)(x2+1-x1) * (long)(y2+1-y1);
722 rv = newsizedstringobject((char *)NULL, size*sizeof(long));
723 if ( rv == NULL )
724 return NULL;
725 parray = (unsigned long *)getstringvalue(rv);
726 size_ret = readdisplay(x1, y1, x2, y2, parray, hints);
727 if ( size_ret != size ) {
Guido van Rossumece35bc1996-12-09 18:52:11 +0000728 printf("gl_readdisplay: got %ld pixels, expected %ld\n",
Jack Jansen5fc67731993-02-16 09:25:15 +0000729 size_ret, size);
730 err_setstr(RuntimeError, "readdisplay returned unexpected length");
731 return NULL;
732 }
733 return rv;
734}
735
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000736/* Desperately needed, here are tools to compress and decompress
737 the data manipulated by lrectread/lrectwrite.
738
739 gl.packrect(width, height, packfactor, bigdata) --> smalldata
740 makes 'bigdata' 4*(packfactor**2) times smaller by:
741 - turning it into B/W (a factor 4)
742 - replacing squares of size pacfactor by one
743 representative
744
745 gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
746 is the inverse; the numeric arguments must be *the same*.
747
748 Both work best if width and height are multiples of packfactor
749 (in fact unpackrect will leave garbage bytes).
750*/
751
752% packrect
753
754static object *
755gl_packrect(self, args)
756 object *self;
757 object *args;
758{
759 long width, height, packfactor;
760 char *s;
761 object *unpacked, *packed;
762 int pixcount, packedcount, x, y, r, g, b;
763 unsigned long pixel;
764 unsigned char *p;
765 unsigned long *parray;
766 if (!getilongarg(args, 4, 0, &width))
767 return NULL;
768 if (!getilongarg(args, 4, 1, &height))
769 return NULL;
770 if (!getilongarg(args, 4, 2, &packfactor))
771 return NULL;
772 if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
773 return NULL;
774 if (!getiobjectarg(args, 4, 3, &unpacked))
775 return NULL;
776 if (width <= 0 || height <= 0 || packfactor <= 0) {
777 err_setstr(RuntimeError, "packrect args must be > 0");
778 return NULL;
779 }
780 pixcount = width*height;
781 packedcount = ((width+packfactor-1)/packfactor) *
782 ((height+packfactor-1)/packfactor);
783 if (getstringsize(unpacked) != pixcount*sizeof(long)) {
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000784 err_setstr(RuntimeError,
785 "string arg to packrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000786 return NULL;
787 }
788 packed = newsizedstringobject((char *)NULL, packedcount);
789 if (packed == NULL)
790 return NULL;
791 parray = (unsigned long *) getstringvalue(unpacked);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000792 p = (unsigned char *) getstringvalue(packed);
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000793 for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
794 for (x = 0; x < width; x += packfactor) {
795 pixel = parray[x];
796 r = pixel & 0xff;
797 g = (pixel >> 8) & 0xff;
798 b = (pixel >> 16) & 0xff;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000799 *p++ = (30*r+59*g+11*b) / 100;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000800 }
801 }
802 return packed;
803}
804
805% unpackrect
806
807static unsigned long unpacktab[256];
808static int unpacktab_inited = 0;
809
810static object *
811gl_unpackrect(self, args)
812 object *self;
813 object *args;
814{
815 long width, height, packfactor;
816 char *s;
817 object *unpacked, *packed;
Guido van Rossumece35bc1996-12-09 18:52:11 +0000818 int pixcount, packedcount;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000819 register unsigned char *p;
820 register unsigned long *parray;
821 if (!unpacktab_inited) {
822 register int white;
823 for (white = 256; --white >= 0; )
824 unpacktab[white] = white * 0x010101L;
825 unpacktab_inited++;
826 }
827 if (!getilongarg(args, 4, 0, &width))
828 return NULL;
829 if (!getilongarg(args, 4, 1, &height))
830 return NULL;
831 if (!getilongarg(args, 4, 2, &packfactor))
832 return NULL;
833 if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
834 return NULL;
835 if (!getiobjectarg(args, 4, 3, &packed))
836 return NULL;
837 if (width <= 0 || height <= 0 || packfactor <= 0) {
838 err_setstr(RuntimeError, "packrect args must be > 0");
839 return NULL;
840 }
841 pixcount = width*height;
842 packedcount = ((width+packfactor-1)/packfactor) *
843 ((height+packfactor-1)/packfactor);
844 if (getstringsize(packed) != packedcount) {
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000845 err_setstr(RuntimeError,
846 "string arg to unpackrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000847 return NULL;
848 }
849 unpacked = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
850 if (unpacked == NULL)
851 return NULL;
852 parray = (unsigned long *) getstringvalue(unpacked);
853 p = (unsigned char *) getstringvalue(packed);
854 if (packfactor == 1 && width*height > 0) {
855 /* Just expand bytes to longs */
856 register int x = width * height;
857 do {
858 *parray++ = unpacktab[*p++];
859 } while (--x >= 0);
860 }
861 else {
862 register int y;
863 for (y = 0; y < height-packfactor+1;
864 y += packfactor, parray += packfactor*width) {
865 register int x;
866 for (x = 0; x < width-packfactor+1; x += packfactor) {
867 register unsigned long pixel = unpacktab[*p++];
868 register int i;
869 for (i = packfactor*width; (i-=width) >= 0;) {
870 register int j;
871 for (j = packfactor; --j >= 0; )
872 parray[i+x+j] = pixel;
873 }
874 }
875 }
876 }
877 return unpacked;
878}
879
Guido van Rossumaee08791992-09-08 09:05:33 +0000880% gversion
881static object *
882gl_gversion(self, args)
883 object *self;
884 object *args;
885{
886 char buf[20];
887 gversion(buf);
888 return newstringobject(buf);
889}
890
891
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000892/* End of manually written stubs */
893
894%%
895
896long getshade
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000897if !solaris void devport short s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000898void rdr2i long s long s
899void rectfs short s short s short s short s
900void rects short s short s short s short s
901void rmv2i long s long s
902void noport
903void popviewport
904void clear
905void clearhitcode
906void closeobj
907void cursoff
908void curson
909void doublebuffer
910void finish
911void gconfig
912void ginit
913void greset
914void multimap
915void onemap
916void popattributes
917void popmatrix
918void pushattributes
919void pushmatrix
920void pushviewport
921void qreset
922void RGBmode
923void singlebuffer
924void swapbuffers
925void gsync
Guido van Rossum06a67021992-02-26 15:19:45 +0000926void gflush
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000927void tpon
928void tpoff
929void clkon
930void clkoff
931void ringbell
932#void callfunc
933void gbegin
934void textinit
935void initnames
936void pclos
937void popname
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000938if !solaris void spclos
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000939void zclear
940void screenspace
941void reshapeviewport
942void winpush
943void winpop
944void foreground
945void endfullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000946if !solaris void endpupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000947void fullscrn
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000948if !solaris void pupmode
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000949void winconstraints
950void pagecolor short s
951void textcolor short s
952void color short s
953void curveit short s
954void font short s
955void linewidth short s
956void setlinestyle short s
957void setmap short s
958void swapinterval short s
959void writemask short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000960if !solaris void textwritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000961void qdevice short s
962void unqdevice short s
963void curvebasis short s
964void curveprecision short s
965void loadname short s
966void passthrough short s
967void pushname short s
968void setmonitor short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000969if !solaris void setshade short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000970void setpattern short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000971if !solaris void pagewritemask short s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000972#
973void callobj long s
974void delobj long s
975void editobj long s
976void makeobj long s
977void maketag long s
978void chunksize long s
979void compactify long s
980void deltag long s
981void lsrepeat long s
982void objinsert long s
983void objreplace long s
984void winclose long s
985void blanktime long s
986void freepup long s
987# This is not in the library!?
988###void pupcolor long s
989#
990void backbuffer long s
991void frontbuffer long s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +0000992if !solaris void lsbackup long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000993void resetls long s
994void lampon long s
995void lampoff long s
996void setbell long s
997void blankscreen long s
998void depthcue long s
999void zbuffer long s
1000void backface long s
1001#
1002void cmov2i long s long s
1003void draw2i long s long s
1004void move2i long s long s
1005void pnt2i long s long s
1006void patchbasis long s long s
1007void patchprecision long s long s
1008void pdr2i long s long s
1009void pmv2i long s long s
1010void rpdr2i long s long s
1011void rpmv2i long s long s
1012void xfpt2i long s long s
1013void objdelete long s long s
1014void patchcurves long s long s
1015void minsize long s long s
1016void maxsize long s long s
1017void keepaspect long s long s
1018void prefsize long s long s
1019void stepunit long s long s
1020void fudge long s long s
1021void winmove long s long s
1022#
1023void attachcursor short s short s
1024void deflinestyle short s short s
1025void noise short s short s
1026void picksize short s short s
1027void qenter short s short s
1028void setdepth short s short s
1029void cmov2s short s short s
1030void draw2s short s short s
1031void move2s short s short s
1032void pdr2s short s short s
1033void pmv2s short s short s
1034void pnt2s short s short s
1035void rdr2s short s short s
1036void rmv2s short s short s
1037void rpdr2s short s short s
1038void rpmv2s short s short s
1039void xfpt2s short s short s
1040#
1041void cmov2 float s float s
1042void draw2 float s float s
1043void move2 float s float s
1044void pnt2 float s float s
1045void pdr2 float s float s
1046void pmv2 float s float s
1047void rdr2 float s float s
1048void rmv2 float s float s
1049void rpdr2 float s float s
1050void rpmv2 float s float s
1051void xfpt2 float s float s
1052#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001053void loadmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001054# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001055void multmatrix float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001056# Really [4][4]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001057void crv float s[3*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001058# Really [4][3]
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001059void rcrv float s[4*4]
Guido van Rossumb3165151991-08-16 08:59:21 +00001060# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001061#
1062# Methods that have strings.
1063#
1064void addtopup long s char *s long s
1065void charstr char *s
1066void getport char *s
1067long strwidth char *s
1068long winopen char *s
1069void wintitle char *s
1070#
1071# Methods that have 1 long (# of elements) and an array
1072#
1073void polf long s float s[3*arg1]
1074void polf2 long s float s[2*arg1]
1075void poly long s float s[3*arg1]
1076void poly2 long s float s[2*arg1]
1077void crvn long s float s[3*arg1]
1078void rcrvn long s float s[4*arg1]
1079#
1080void polf2i long s long s[2*arg1]
1081void polfi long s long s[3*arg1]
1082void poly2i long s long s[2*arg1]
1083void polyi long s long s[3*arg1]
1084#
1085void polf2s long s short s[2*arg1]
1086void polfs long s short s[3*arg1]
1087void polys long s short s[3*arg1]
1088void poly2s long s short s[2*arg1]
1089#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001090void defcursor short s u_short s[128]
Guido van Rossumb3165151991-08-16 08:59:21 +00001091# Is this useful?
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001092void writepixels short s u_short s[arg1]
Guido van Rossumb3165151991-08-16 08:59:21 +00001093# Should be unsigned short...
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001094void defbasis long s float s[4*4]
1095if !solaris void gewrite short s short s[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001096#
1097void rotate short s char s
1098# This is not in the library!?
1099###void setbutton short s char s
1100void rot float s char s
1101#
1102void circfi long s long s long s
1103void circi long s long s long s
1104void cmovi long s long s long s
1105void drawi long s long s long s
1106void movei long s long s long s
1107void pnti long s long s long s
1108void newtag long s long s long s
1109void pdri long s long s long s
1110void pmvi long s long s long s
1111void rdri long s long s long s
1112void rmvi long s long s long s
1113void rpdri long s long s long s
1114void rpmvi long s long s long s
1115void xfpti long s long s long s
1116#
1117void circ float s float s float s
1118void circf float s float s float s
1119void cmov float s float s float s
1120void draw float s float s float s
1121void move float s float s float s
1122void pnt float s float s float s
1123void scale float s float s float s
1124void translate float s float s float s
1125void pdr float s float s float s
1126void pmv float s float s float s
1127void rdr float s float s float s
1128void rmv float s float s float s
1129void rpdr float s float s float s
1130void rpmv float s float s float s
1131void xfpt float s float s float s
1132#
1133void RGBcolor short s short s short s
1134void RGBwritemask short s short s short s
1135void setcursor short s short s short s
1136void tie short s short s short s
1137void circfs short s short s short s
1138void circs short s short s short s
1139void cmovs short s short s short s
1140void draws short s short s short s
1141void moves short s short s short s
1142void pdrs short s short s short s
1143void pmvs short s short s short s
1144void pnts short s short s short s
1145void rdrs short s short s short s
1146void rmvs short s short s short s
1147void rpdrs short s short s short s
1148void rpmvs short s short s short s
1149void xfpts short s short s short s
1150void curorigin short s short s short s
1151void cyclemap short s short s short s
1152#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001153void patch float s[4*4] float s[4*4] float s[4*4]
1154void splf long s float s[3*arg1] u_short s[arg1]
1155void splf2 long s float s[2*arg1] u_short s[arg1]
1156void splfi long s long s[3*arg1] u_short s[arg1]
1157void splf2i long s long s[2*arg1] u_short s[arg1]
1158void splfs long s short s[3*arg1] u_short s[arg1]
1159void splf2s long s short s[2*arg1] u_short s[arg1]
1160###void defpattern short s short s u_short s[arg2*arg2/16]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001161#
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001162void 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 +00001163#
1164# routines that send 4 floats
1165#
1166void ortho2 float s float s float s float s
1167void rect float s float s float s float s
1168void rectf float s float s float s float s
1169void xfpt4 float s float s float s float s
1170#
1171void textport short s short s short s short s
1172void mapcolor short s short s short s short s
1173void scrmask short s short s short s short s
1174void setvaluator short s short s short s short s
1175void viewport short s short s short s short s
1176void shaderange short s short s short s short s
1177void xfpt4s short s short s short s short s
1178void rectfi long s long s long s long s
1179void recti long s long s long s long s
1180void xfpt4i long s long s long s long s
1181void prefposition long s long s long s long s
1182#
1183void arc float s float s float s short s short s
1184void arcf float s float s float s short s short s
1185void arcfi long s long s long s short s short s
1186void arci long s long s long s short s short s
1187#
1188void bbox2 short s short s float s float s float s float s
1189void bbox2i short s short s long s long s long s long s
1190void bbox2s short s short s short s short s short s short s
1191void blink short s short s short s short s short s
1192void ortho float s float s float s float s float s float s
1193void window float s float s float s float s float s float s
1194void lookat float s float s float s float s float s float s short s
1195#
1196void perspective short s float s float s float s
1197void polarview float s short s short s short s
1198# XXX getichararray not supported
1199#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
1200#
1201void arcfs short s short s short s short s short s
1202void arcs short s short s short s short s short s
1203void rectcopy short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001204if !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 +00001205#
1206long getbutton short s
1207long getcmmode
1208long getlsbackup
1209long getresetls
1210long getdcm
1211long getzbuffer
1212long ismex
1213long isobj long s
1214long isqueued short s
1215long istag long s
1216#
1217long genobj
1218long gentag
1219long getbuffer
1220long getcolor
1221long getdisplaymode
1222long getfont
1223long getheight
1224long gethitcode
1225long getlstyle
1226long getlwidth
1227long getmap
1228long getplanes
1229long getwritemask
1230long qtest
1231long getlsrepeat
1232long getmonitor
1233long getopenobj
1234long getpattern
1235long winget
1236long winattach
1237long getothermonitor
1238long newpup
1239#
1240long getvaluator short s
1241void winset long s
1242long dopup long s
1243void getdepth short r short r
1244void getcpos short r short r
1245void getsize long r long r
1246void getorigin long r long r
1247void getviewport short r short r short r short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001248if !solaris void gettp short r short r short r short r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001249void getgpos float r float r float r float r
1250void winposition long s long s long s long s
1251void gRGBcolor short r short r short r
1252void gRGBmask short r short r short r
1253void getscrmask short r short r short r short r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001254###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 +00001255void getmcolor short s short r short r short r
1256void mapw long s short s short s float r float r float r float r float r float r
1257void mapw2 long s short s short s float r float r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001258###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 +00001259###long qread short r
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001260void getcursor short r u_short r u_short r long r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001261#
1262# For these we receive arrays of stuff
1263#
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001264###void getdev long s short s[arg1] short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001265#XXX not generated correctly yet
1266#void getmatrix float r[16]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001267###long readpixels short s short r[retval]
1268###long readRGB short s char r[retval] char r[retval] char r[retval]
1269###long blkqread short s short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001270#
1271# New 4D routines
1272#
1273void cmode
1274void concave long s
1275void curstype long s
1276void drawmode long s
1277void gammaramp short s[256] short s[256] short s[256]
1278long getbackface
1279long getdescender
1280long getdrawmode
1281long getmmode
1282long getsm
1283long getvideo long s
1284void imakebackground
1285void lmbind short s short s
1286void lmdef long s long s long s float s[arg3]
1287void mmode long s
1288void normal float s[3]
1289void overlay long s
1290void RGBrange short s short s short s short s short s short s short s short s
Sjoerd Mullenderc4f169c1993-12-21 17:06:12 +00001291if !solaris void setvideo long s long s
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001292void shademodel long s
1293void underlay long s
1294#
1295# New Personal Iris/GT Routines
1296#
1297void bgnclosedline
1298void bgnline
1299void bgnpoint
1300void bgnpolygon
1301void bgnsurface
1302void bgntmesh
1303void bgntrim
1304void endclosedline
1305void endline
1306void endpoint
1307void endpolygon
1308void endsurface
1309void endtmesh
1310void endtrim
1311void blendfunction long s long s
1312void c3f float s[3]
1313void c3i long s[3]
1314void c3s short s[3]
1315void c4f float s[4]
1316void c4i long s[4]
1317void c4s short s[4]
1318void colorf float s
1319void cpack long s
1320void czclear long s long s
1321void dglclose long s
1322long dglopen char *s long s
1323long getgdesc long s
1324void getnurbsproperty long s float r
1325void glcompat long s long s
1326void iconsize long s long s
1327void icontitle char *s
1328void lRGBrange short s short s short s short s short s short s long s long s
1329void linesmooth long s
1330void lmcolor long s
1331void logicop long s
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001332###long lrectread short s short s short s short s long r[retval]
1333###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
1334### Now manual, with string last arg
1335###long rectread short s short s short s short s short r[retval]
1336###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 +00001337void lsetdepth long s long s
1338void lshaderange short s short s long s long s
1339void n3f float s[3]
1340void noborder
1341void pntsmooth long s
1342void readsource long s
1343void rectzoom float s float s
1344void sbox float s float s float s float s
1345void sboxi long s long s long s long s
1346void sboxs short s short s short s short s
1347void sboxf float s float s float s float s
1348void sboxfi long s long s long s long s
1349void sboxfs short s short s short s short s
1350void setnurbsproperty long s float s
1351void setpup long s long s long s
1352void smoothline long s
1353void subpixel long s
1354void swaptmesh
1355long swinopen long s
1356void v2f float s[2]
1357void v2i long s[2]
1358void v2s short s[2]
1359void v3f float s[3]
1360void v3i long s[3]
1361void v3s short s[3]
1362void v4f float s[4]
1363void v4i long s[4]
1364void v4s short s[4]
1365void videocmd long s
1366long windepth long s
1367void wmpack long s
1368void zdraw long s
1369void zfunction long s
1370void zsource long s
1371void zwritemask long s
1372#
1373# uses doubles
1374#
1375void v2d double s[2]
1376void v3d double s[3]
1377void v4d double s[4]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001378#
1379# Why isn't this here?
1380#
1381void pixmode long s long s
Guido van Rossumdd9ed831992-06-29 17:10:40 +00001382#
1383# New in IRIX 4.0
1384#
1385long qgetfd
Jack Jansenfa1b9f61993-02-19 12:53:12 +00001386void dither long s