blob: bbb3a10637da7fd0887ea3b5223becbfe0c2ddea [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
660/* Desperately needed, here are tools to compress and decompress
661 the data manipulated by lrectread/lrectwrite.
662
663 gl.packrect(width, height, packfactor, bigdata) --> smalldata
664 makes 'bigdata' 4*(packfactor**2) times smaller by:
665 - turning it into B/W (a factor 4)
666 - replacing squares of size pacfactor by one
667 representative
668
669 gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
670 is the inverse; the numeric arguments must be *the same*.
671
672 Both work best if width and height are multiples of packfactor
673 (in fact unpackrect will leave garbage bytes).
674*/
675
676% packrect
677
678static object *
679gl_packrect(self, args)
680 object *self;
681 object *args;
682{
683 long width, height, packfactor;
684 char *s;
685 object *unpacked, *packed;
686 int pixcount, packedcount, x, y, r, g, b;
687 unsigned long pixel;
688 unsigned char *p;
689 unsigned long *parray;
690 if (!getilongarg(args, 4, 0, &width))
691 return NULL;
692 if (!getilongarg(args, 4, 1, &height))
693 return NULL;
694 if (!getilongarg(args, 4, 2, &packfactor))
695 return NULL;
696 if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
697 return NULL;
698 if (!getiobjectarg(args, 4, 3, &unpacked))
699 return NULL;
700 if (width <= 0 || height <= 0 || packfactor <= 0) {
701 err_setstr(RuntimeError, "packrect args must be > 0");
702 return NULL;
703 }
704 pixcount = width*height;
705 packedcount = ((width+packfactor-1)/packfactor) *
706 ((height+packfactor-1)/packfactor);
707 if (getstringsize(unpacked) != pixcount*sizeof(long)) {
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000708 err_setstr(RuntimeError,
709 "string arg to packrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000710 return NULL;
711 }
712 packed = newsizedstringobject((char *)NULL, packedcount);
713 if (packed == NULL)
714 return NULL;
715 parray = (unsigned long *) getstringvalue(unpacked);
716 p = getstringvalue(packed);
717 for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
718 for (x = 0; x < width; x += packfactor) {
719 pixel = parray[x];
720 r = pixel & 0xff;
721 g = (pixel >> 8) & 0xff;
722 b = (pixel >> 16) & 0xff;
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000723 *p++ = (30*r+59*g+11*b) / 100;
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000724 }
725 }
726 return packed;
727}
728
729% unpackrect
730
731static unsigned long unpacktab[256];
732static int unpacktab_inited = 0;
733
734static object *
735gl_unpackrect(self, args)
736 object *self;
737 object *args;
738{
739 long width, height, packfactor;
740 char *s;
741 object *unpacked, *packed;
742 int pixcount, packedcount, y;
743 register unsigned char *p;
744 register unsigned long *parray;
745 if (!unpacktab_inited) {
746 register int white;
747 for (white = 256; --white >= 0; )
748 unpacktab[white] = white * 0x010101L;
749 unpacktab_inited++;
750 }
751 if (!getilongarg(args, 4, 0, &width))
752 return NULL;
753 if (!getilongarg(args, 4, 1, &height))
754 return NULL;
755 if (!getilongarg(args, 4, 2, &packfactor))
756 return NULL;
757 if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
758 return NULL;
759 if (!getiobjectarg(args, 4, 3, &packed))
760 return NULL;
761 if (width <= 0 || height <= 0 || packfactor <= 0) {
762 err_setstr(RuntimeError, "packrect args must be > 0");
763 return NULL;
764 }
765 pixcount = width*height;
766 packedcount = ((width+packfactor-1)/packfactor) *
767 ((height+packfactor-1)/packfactor);
768 if (getstringsize(packed) != packedcount) {
Guido van Rossum6d0b5a71991-11-12 15:41:00 +0000769 err_setstr(RuntimeError,
770 "string arg to unpackrect has wrong size");
Guido van Rossumd26d9ed1991-10-20 20:13:40 +0000771 return NULL;
772 }
773 unpacked = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
774 if (unpacked == NULL)
775 return NULL;
776 parray = (unsigned long *) getstringvalue(unpacked);
777 p = (unsigned char *) getstringvalue(packed);
778 if (packfactor == 1 && width*height > 0) {
779 /* Just expand bytes to longs */
780 register int x = width * height;
781 do {
782 *parray++ = unpacktab[*p++];
783 } while (--x >= 0);
784 }
785 else {
786 register int y;
787 for (y = 0; y < height-packfactor+1;
788 y += packfactor, parray += packfactor*width) {
789 register int x;
790 for (x = 0; x < width-packfactor+1; x += packfactor) {
791 register unsigned long pixel = unpacktab[*p++];
792 register int i;
793 for (i = packfactor*width; (i-=width) >= 0;) {
794 register int j;
795 for (j = packfactor; --j >= 0; )
796 parray[i+x+j] = pixel;
797 }
798 }
799 }
800 }
801 return unpacked;
802}
803
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000804/* End of manually written stubs */
805
806%%
807
808long getshade
809void devport short s long s
810void rdr2i long s long s
811void rectfs short s short s short s short s
812void rects short s short s short s short s
813void rmv2i long s long s
814void noport
815void popviewport
816void clear
817void clearhitcode
818void closeobj
819void cursoff
820void curson
821void doublebuffer
822void finish
823void gconfig
824void ginit
825void greset
826void multimap
827void onemap
828void popattributes
829void popmatrix
830void pushattributes
831void pushmatrix
832void pushviewport
833void qreset
834void RGBmode
835void singlebuffer
836void swapbuffers
837void gsync
Guido van Rossum06a67021992-02-26 15:19:45 +0000838void gflush
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839void tpon
840void tpoff
841void clkon
842void clkoff
843void ringbell
844#void callfunc
845void gbegin
846void textinit
847void initnames
848void pclos
849void popname
850void spclos
851void zclear
852void screenspace
853void reshapeviewport
854void winpush
855void winpop
856void foreground
857void endfullscrn
858void endpupmode
859void fullscrn
860void pupmode
861void winconstraints
862void pagecolor short s
863void textcolor short s
864void color short s
865void curveit short s
866void font short s
867void linewidth short s
868void setlinestyle short s
869void setmap short s
870void swapinterval short s
871void writemask short s
872void textwritemask short s
873void qdevice short s
874void unqdevice short s
875void curvebasis short s
876void curveprecision short s
877void loadname short s
878void passthrough short s
879void pushname short s
880void setmonitor short s
881void setshade short s
882void setpattern short s
883void pagewritemask short s
884#
885void callobj long s
886void delobj long s
887void editobj long s
888void makeobj long s
889void maketag long s
890void chunksize long s
891void compactify long s
892void deltag long s
893void lsrepeat long s
894void objinsert long s
895void objreplace long s
896void winclose long s
897void blanktime long s
898void freepup long s
899# This is not in the library!?
900###void pupcolor long s
901#
902void backbuffer long s
903void frontbuffer long s
904void lsbackup long s
905void resetls long s
906void lampon long s
907void lampoff long s
908void setbell long s
909void blankscreen long s
910void depthcue long s
911void zbuffer long s
912void backface long s
913#
914void cmov2i long s long s
915void draw2i long s long s
916void move2i long s long s
917void pnt2i long s long s
918void patchbasis long s long s
919void patchprecision long s long s
920void pdr2i long s long s
921void pmv2i long s long s
922void rpdr2i long s long s
923void rpmv2i long s long s
924void xfpt2i long s long s
925void objdelete long s long s
926void patchcurves long s long s
927void minsize long s long s
928void maxsize long s long s
929void keepaspect long s long s
930void prefsize long s long s
931void stepunit long s long s
932void fudge long s long s
933void winmove long s long s
934#
935void attachcursor short s short s
936void deflinestyle short s short s
937void noise short s short s
938void picksize short s short s
939void qenter short s short s
940void setdepth short s short s
941void cmov2s short s short s
942void draw2s short s short s
943void move2s short s short s
944void pdr2s short s short s
945void pmv2s short s short s
946void pnt2s short s short s
947void rdr2s short s short s
948void rmv2s short s short s
949void rpdr2s short s short s
950void rpmv2s short s short s
951void xfpt2s short s short s
952#
953void cmov2 float s float s
954void draw2 float s float s
955void move2 float s float s
956void pnt2 float s float s
957void pdr2 float s float s
958void pmv2 float s float s
959void rdr2 float s float s
960void rmv2 float s float s
961void rpdr2 float s float s
962void rpmv2 float s float s
963void xfpt2 float s float s
964#
965void loadmatrix float s[16]
Guido van Rossumb3165151991-08-16 08:59:21 +0000966# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000967void multmatrix float s[16]
Guido van Rossumb3165151991-08-16 08:59:21 +0000968# Really [4][4]
969void crv float s[12]
970# Really [4][3]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000971void rcrv float s[16]
Guido van Rossumb3165151991-08-16 08:59:21 +0000972# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000973#
974# Methods that have strings.
975#
976void addtopup long s char *s long s
977void charstr char *s
978void getport char *s
979long strwidth char *s
980long winopen char *s
981void wintitle char *s
982#
983# Methods that have 1 long (# of elements) and an array
984#
985void polf long s float s[3*arg1]
986void polf2 long s float s[2*arg1]
987void poly long s float s[3*arg1]
988void poly2 long s float s[2*arg1]
989void crvn long s float s[3*arg1]
990void rcrvn long s float s[4*arg1]
991#
992void polf2i long s long s[2*arg1]
993void polfi long s long s[3*arg1]
994void poly2i long s long s[2*arg1]
995void polyi long s long s[3*arg1]
996#
997void polf2s long s short s[2*arg1]
998void polfs long s short s[3*arg1]
999void polys long s short s[3*arg1]
1000void poly2s long s short s[2*arg1]
1001#
Guido van Rossumb3165151991-08-16 08:59:21 +00001002void defcursor short s short s[128]
1003# Is this useful?
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001004void writepixels short s short s[arg1]
Guido van Rossumb3165151991-08-16 08:59:21 +00001005# Should be unsigned short...
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001006void defbasis long s float s[16]
1007void gewrite short s short s[arg1]
1008#
1009void rotate short s char s
1010# This is not in the library!?
1011###void setbutton short s char s
1012void rot float s char s
1013#
1014void circfi long s long s long s
1015void circi long s long s long s
1016void cmovi long s long s long s
1017void drawi long s long s long s
1018void movei long s long s long s
1019void pnti long s long s long s
1020void newtag long s long s long s
1021void pdri long s long s long s
1022void pmvi long s long s long s
1023void rdri long s long s long s
1024void rmvi long s long s long s
1025void rpdri long s long s long s
1026void rpmvi long s long s long s
1027void xfpti long s long s long s
1028#
1029void circ float s float s float s
1030void circf float s float s float s
1031void cmov float s float s float s
1032void draw float s float s float s
1033void move float s float s float s
1034void pnt float s float s float s
1035void scale float s float s float s
1036void translate float s float s float s
1037void pdr float s float s float s
1038void pmv float s float s float s
1039void rdr float s float s float s
1040void rmv float s float s float s
1041void rpdr float s float s float s
1042void rpmv float s float s float s
1043void xfpt float s float s float s
1044#
1045void RGBcolor short s short s short s
1046void RGBwritemask short s short s short s
1047void setcursor short s short s short s
1048void tie short s short s short s
1049void circfs short s short s short s
1050void circs short s short s short s
1051void cmovs short s short s short s
1052void draws short s short s short s
1053void moves short s short s short s
1054void pdrs short s short s short s
1055void pmvs short s short s short s
1056void pnts short s short s short s
1057void rdrs short s short s short s
1058void rmvs short s short s short s
1059void rpdrs short s short s short s
1060void rpmvs short s short s short s
1061void xfpts short s short s short s
1062void curorigin short s short s short s
1063void cyclemap short s short s short s
1064#
1065void patch float s[16] float s[16] float s[16]
1066void splf long s float s[3*arg1] short s[arg1]
1067void splf2 long s float s[2*arg1] short s[arg1]
1068void splfi long s long s[3*arg1] short s[arg1]
1069void splf2i long s long s[2*arg1] short s[arg1]
1070void splfs long s short s[3*arg1] short s[arg1]
1071void splf2s long s short s[2*arg1] short s[arg1]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001072###void defpattern short s short s short s[arg2*arg2/16]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001073#
1074void rpatch float s[16] float s[16] float s[16] float s[16]
1075#
1076# routines that send 4 floats
1077#
1078void ortho2 float s float s float s float s
1079void rect float s float s float s float s
1080void rectf float s float s float s float s
1081void xfpt4 float s float s float s float s
1082#
1083void textport short s short s short s short s
1084void mapcolor short s short s short s short s
1085void scrmask short s short s short s short s
1086void setvaluator short s short s short s short s
1087void viewport short s short s short s short s
1088void shaderange short s short s short s short s
1089void xfpt4s short s short s short s short s
1090void rectfi long s long s long s long s
1091void recti long s long s long s long s
1092void xfpt4i long s long s long s long s
1093void prefposition long s long s long s long s
1094#
1095void arc float s float s float s short s short s
1096void arcf float s float s float s short s short s
1097void arcfi long s long s long s short s short s
1098void arci long s long s long s short s short s
1099#
1100void bbox2 short s short s float s float s float s float s
1101void bbox2i short s short s long s long s long s long s
1102void bbox2s short s short s short s short s short s short s
1103void blink short s short s short s short s short s
1104void ortho float s float s float s float s float s float s
1105void window float s float s float s float s float s float s
1106void lookat float s float s float s float s float s float s short s
1107#
1108void perspective short s float s float s float s
1109void polarview float s short s short s short s
1110# XXX getichararray not supported
1111#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
1112#
1113void arcfs short s short s short s short s short s
1114void arcs short s short s short s short s short s
1115void rectcopy short s short s short s short s short s short s
1116void RGBcursor short s short s short s short s short s short s short s
1117#
1118long getbutton short s
1119long getcmmode
1120long getlsbackup
1121long getresetls
1122long getdcm
1123long getzbuffer
1124long ismex
1125long isobj long s
1126long isqueued short s
1127long istag long s
1128#
1129long genobj
1130long gentag
1131long getbuffer
1132long getcolor
1133long getdisplaymode
1134long getfont
1135long getheight
1136long gethitcode
1137long getlstyle
1138long getlwidth
1139long getmap
1140long getplanes
1141long getwritemask
1142long qtest
1143long getlsrepeat
1144long getmonitor
1145long getopenobj
1146long getpattern
1147long winget
1148long winattach
1149long getothermonitor
1150long newpup
1151#
1152long getvaluator short s
1153void winset long s
1154long dopup long s
1155void getdepth short r short r
1156void getcpos short r short r
1157void getsize long r long r
1158void getorigin long r long r
1159void getviewport short r short r short r short r
1160void gettp short r short r short r short r
1161void getgpos float r float r float r float r
1162void winposition long s long s long s long s
1163void gRGBcolor short r short r short r
1164void gRGBmask short r short r short r
1165void getscrmask short r short r short r short r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001166###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 +00001167void getmcolor short s short r short r short r
1168void mapw long s short s short s float r float r float r float r float r float r
1169void mapw2 long s short s short s float r float r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001170###void defrasterfont short s short s short s Fontchar s[arg3] short s short s[4*arg5]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001171long qread short r
1172void getcursor short r short r short r long r
1173#
1174# For these we receive arrays of stuff
1175#
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001176###void getdev long s short s[arg1] short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001177#XXX not generated correctly yet
1178#void getmatrix float r[16]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001179###long readpixels short s short r[retval]
1180###long readRGB short s char r[retval] char r[retval] char r[retval]
1181###long blkqread short s short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001182#
1183# New 4D routines
1184#
1185void cmode
1186void concave long s
1187void curstype long s
1188void drawmode long s
1189void gammaramp short s[256] short s[256] short s[256]
1190long getbackface
1191long getdescender
1192long getdrawmode
1193long getmmode
1194long getsm
1195long getvideo long s
1196void imakebackground
1197void lmbind short s short s
1198void lmdef long s long s long s float s[arg3]
1199void mmode long s
1200void normal float s[3]
1201void overlay long s
1202void RGBrange short s short s short s short s short s short s short s short s
1203void setvideo long s long s
1204void shademodel long s
1205void underlay long s
1206#
1207# New Personal Iris/GT Routines
1208#
1209void bgnclosedline
1210void bgnline
1211void bgnpoint
1212void bgnpolygon
1213void bgnsurface
1214void bgntmesh
1215void bgntrim
1216void endclosedline
1217void endline
1218void endpoint
1219void endpolygon
1220void endsurface
1221void endtmesh
1222void endtrim
1223void blendfunction long s long s
1224void c3f float s[3]
1225void c3i long s[3]
1226void c3s short s[3]
1227void c4f float s[4]
1228void c4i long s[4]
1229void c4s short s[4]
1230void colorf float s
1231void cpack long s
1232void czclear long s long s
1233void dglclose long s
1234long dglopen char *s long s
1235long getgdesc long s
1236void getnurbsproperty long s float r
1237void glcompat long s long s
1238void iconsize long s long s
1239void icontitle char *s
1240void lRGBrange short s short s short s short s short s short s long s long s
1241void linesmooth long s
1242void lmcolor long s
1243void logicop long s
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001244###long lrectread short s short s short s short s long r[retval]
1245###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
1246### Now manual, with string last arg
1247###long rectread short s short s short s short s short r[retval]
1248###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 +00001249void lsetdepth long s long s
1250void lshaderange short s short s long s long s
1251void n3f float s[3]
1252void noborder
1253void pntsmooth long s
1254void readsource long s
1255void rectzoom float s float s
1256void sbox float s float s float s float s
1257void sboxi long s long s long s long s
1258void sboxs short s short s short s short s
1259void sboxf float s float s float s float s
1260void sboxfi long s long s long s long s
1261void sboxfs short s short s short s short s
1262void setnurbsproperty long s float s
1263void setpup long s long s long s
1264void smoothline long s
1265void subpixel long s
1266void swaptmesh
1267long swinopen long s
1268void v2f float s[2]
1269void v2i long s[2]
1270void v2s short s[2]
1271void v3f float s[3]
1272void v3i long s[3]
1273void v3s short s[3]
1274void v4f float s[4]
1275void v4i long s[4]
1276void v4s short s[4]
1277void videocmd long s
1278long windepth long s
1279void wmpack long s
1280void zdraw long s
1281void zfunction long s
1282void zsource long s
1283void zwritemask long s
1284#
1285# uses doubles
1286#
1287void v2d double s[2]
1288void v3d double s[3]
1289void v4d double s[4]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001290#
1291# Why isn't this here?
1292#
1293void pixmode long s long s
Guido van Rossumdd9ed831992-06-29 17:10:40 +00001294#
1295# New in IRIX 4.0
1296#
1297long qgetfd