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