blob: 6ff8f54794e43150d15d971e7773e5b710737f8e [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 Rossumaee08791992-09-08 09:05:33 +0000804% gversion
805static object *
806gl_gversion(self, args)
807 object *self;
808 object *args;
809{
810 char buf[20];
811 gversion(buf);
812 return newstringobject(buf);
813}
814
815
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000816/* End of manually written stubs */
817
818%%
819
820long getshade
821void devport short s long s
822void rdr2i long s long s
823void rectfs short s short s short s short s
824void rects short s short s short s short s
825void rmv2i long s long s
826void noport
827void popviewport
828void clear
829void clearhitcode
830void closeobj
831void cursoff
832void curson
833void doublebuffer
834void finish
835void gconfig
836void ginit
837void greset
838void multimap
839void onemap
840void popattributes
841void popmatrix
842void pushattributes
843void pushmatrix
844void pushviewport
845void qreset
846void RGBmode
847void singlebuffer
848void swapbuffers
849void gsync
Guido van Rossum06a67021992-02-26 15:19:45 +0000850void gflush
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000851void tpon
852void tpoff
853void clkon
854void clkoff
855void ringbell
856#void callfunc
857void gbegin
858void textinit
859void initnames
860void pclos
861void popname
862void spclos
863void zclear
864void screenspace
865void reshapeviewport
866void winpush
867void winpop
868void foreground
869void endfullscrn
870void endpupmode
871void fullscrn
872void pupmode
873void winconstraints
874void pagecolor short s
875void textcolor short s
876void color short s
877void curveit short s
878void font short s
879void linewidth short s
880void setlinestyle short s
881void setmap short s
882void swapinterval short s
883void writemask short s
884void textwritemask short s
885void qdevice short s
886void unqdevice short s
887void curvebasis short s
888void curveprecision short s
889void loadname short s
890void passthrough short s
891void pushname short s
892void setmonitor short s
893void setshade short s
894void setpattern short s
895void pagewritemask short s
896#
897void callobj long s
898void delobj long s
899void editobj long s
900void makeobj long s
901void maketag long s
902void chunksize long s
903void compactify long s
904void deltag long s
905void lsrepeat long s
906void objinsert long s
907void objreplace long s
908void winclose long s
909void blanktime long s
910void freepup long s
911# This is not in the library!?
912###void pupcolor long s
913#
914void backbuffer long s
915void frontbuffer long s
916void lsbackup long s
917void resetls long s
918void lampon long s
919void lampoff long s
920void setbell long s
921void blankscreen long s
922void depthcue long s
923void zbuffer long s
924void backface long s
925#
926void cmov2i long s long s
927void draw2i long s long s
928void move2i long s long s
929void pnt2i long s long s
930void patchbasis long s long s
931void patchprecision long s long s
932void pdr2i long s long s
933void pmv2i long s long s
934void rpdr2i long s long s
935void rpmv2i long s long s
936void xfpt2i long s long s
937void objdelete long s long s
938void patchcurves long s long s
939void minsize long s long s
940void maxsize long s long s
941void keepaspect long s long s
942void prefsize long s long s
943void stepunit long s long s
944void fudge long s long s
945void winmove long s long s
946#
947void attachcursor short s short s
948void deflinestyle short s short s
949void noise short s short s
950void picksize short s short s
951void qenter short s short s
952void setdepth short s short s
953void cmov2s short s short s
954void draw2s short s short s
955void move2s short s short s
956void pdr2s short s short s
957void pmv2s short s short s
958void pnt2s short s short s
959void rdr2s short s short s
960void rmv2s short s short s
961void rpdr2s short s short s
962void rpmv2s short s short s
963void xfpt2s short s short s
964#
965void cmov2 float s float s
966void draw2 float s float s
967void move2 float s float s
968void pnt2 float s float s
969void pdr2 float s float s
970void pmv2 float s float s
971void rdr2 float s float s
972void rmv2 float s float s
973void rpdr2 float s float s
974void rpmv2 float s float s
975void xfpt2 float s float s
976#
977void loadmatrix float s[16]
Guido van Rossumb3165151991-08-16 08:59:21 +0000978# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000979void multmatrix float s[16]
Guido van Rossumb3165151991-08-16 08:59:21 +0000980# Really [4][4]
981void crv float s[12]
982# Really [4][3]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000983void rcrv float s[16]
Guido van Rossumb3165151991-08-16 08:59:21 +0000984# Really [4][4]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000985#
986# Methods that have strings.
987#
988void addtopup long s char *s long s
989void charstr char *s
990void getport char *s
991long strwidth char *s
992long winopen char *s
993void wintitle char *s
994#
995# Methods that have 1 long (# of elements) and an array
996#
997void polf long s float s[3*arg1]
998void polf2 long s float s[2*arg1]
999void poly long s float s[3*arg1]
1000void poly2 long s float s[2*arg1]
1001void crvn long s float s[3*arg1]
1002void rcrvn long s float s[4*arg1]
1003#
1004void polf2i long s long s[2*arg1]
1005void polfi long s long s[3*arg1]
1006void poly2i long s long s[2*arg1]
1007void polyi long s long s[3*arg1]
1008#
1009void polf2s long s short s[2*arg1]
1010void polfs long s short s[3*arg1]
1011void polys long s short s[3*arg1]
1012void poly2s long s short s[2*arg1]
1013#
Guido van Rossumb3165151991-08-16 08:59:21 +00001014void defcursor short s short s[128]
1015# Is this useful?
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001016void writepixels short s short s[arg1]
Guido van Rossumb3165151991-08-16 08:59:21 +00001017# Should be unsigned short...
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001018void defbasis long s float s[16]
1019void gewrite short s short s[arg1]
1020#
1021void rotate short s char s
1022# This is not in the library!?
1023###void setbutton short s char s
1024void rot float s char s
1025#
1026void circfi long s long s long s
1027void circi long s long s long s
1028void cmovi long s long s long s
1029void drawi long s long s long s
1030void movei long s long s long s
1031void pnti long s long s long s
1032void newtag long s long s long s
1033void pdri long s long s long s
1034void pmvi long s long s long s
1035void rdri long s long s long s
1036void rmvi long s long s long s
1037void rpdri long s long s long s
1038void rpmvi long s long s long s
1039void xfpti long s long s long s
1040#
1041void circ float s float s float s
1042void circf float s float s float s
1043void cmov float s float s float s
1044void draw float s float s float s
1045void move float s float s float s
1046void pnt float s float s float s
1047void scale float s float s float s
1048void translate float s float s float s
1049void pdr float s float s float s
1050void pmv float s float s float s
1051void rdr float s float s float s
1052void rmv float s float s float s
1053void rpdr float s float s float s
1054void rpmv float s float s float s
1055void xfpt float s float s float s
1056#
1057void RGBcolor short s short s short s
1058void RGBwritemask short s short s short s
1059void setcursor short s short s short s
1060void tie short s short s short s
1061void circfs short s short s short s
1062void circs short s short s short s
1063void cmovs short s short s short s
1064void draws short s short s short s
1065void moves short s short s short s
1066void pdrs short s short s short s
1067void pmvs short s short s short s
1068void pnts short s short s short s
1069void rdrs short s short s short s
1070void rmvs short s short s short s
1071void rpdrs short s short s short s
1072void rpmvs short s short s short s
1073void xfpts short s short s short s
1074void curorigin short s short s short s
1075void cyclemap short s short s short s
1076#
1077void patch float s[16] float s[16] float s[16]
1078void splf long s float s[3*arg1] short s[arg1]
1079void splf2 long s float s[2*arg1] short s[arg1]
1080void splfi long s long s[3*arg1] short s[arg1]
1081void splf2i long s long s[2*arg1] short s[arg1]
1082void splfs long s short s[3*arg1] short s[arg1]
1083void splf2s long s short s[2*arg1] short s[arg1]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001084###void defpattern short s short s short s[arg2*arg2/16]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085#
1086void rpatch float s[16] float s[16] float s[16] float s[16]
1087#
1088# routines that send 4 floats
1089#
1090void ortho2 float s float s float s float s
1091void rect float s float s float s float s
1092void rectf float s float s float s float s
1093void xfpt4 float s float s float s float s
1094#
1095void textport short s short s short s short s
1096void mapcolor short s short s short s short s
1097void scrmask short s short s short s short s
1098void setvaluator short s short s short s short s
1099void viewport short s short s short s short s
1100void shaderange short s short s short s short s
1101void xfpt4s short s short s short s short s
1102void rectfi long s long s long s long s
1103void recti long s long s long s long s
1104void xfpt4i long s long s long s long s
1105void prefposition long s long s long s long s
1106#
1107void arc float s float s float s short s short s
1108void arcf float s float s float s short s short s
1109void arcfi long s long s long s short s short s
1110void arci long s long s long s short s short s
1111#
1112void bbox2 short s short s float s float s float s float s
1113void bbox2i short s short s long s long s long s long s
1114void bbox2s short s short s short s short s short s short s
1115void blink short s short s short s short s short s
1116void ortho float s float s float s float s float s float s
1117void window float s float s float s float s float s float s
1118void lookat float s float s float s float s float s float s short s
1119#
1120void perspective short s float s float s float s
1121void polarview float s short s short s short s
1122# XXX getichararray not supported
1123#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
1124#
1125void arcfs short s short s short s short s short s
1126void arcs short s short s short s short s short s
1127void rectcopy short s short s short s short s short s short s
1128void RGBcursor short s short s short s short s short s short s short s
1129#
1130long getbutton short s
1131long getcmmode
1132long getlsbackup
1133long getresetls
1134long getdcm
1135long getzbuffer
1136long ismex
1137long isobj long s
1138long isqueued short s
1139long istag long s
1140#
1141long genobj
1142long gentag
1143long getbuffer
1144long getcolor
1145long getdisplaymode
1146long getfont
1147long getheight
1148long gethitcode
1149long getlstyle
1150long getlwidth
1151long getmap
1152long getplanes
1153long getwritemask
1154long qtest
1155long getlsrepeat
1156long getmonitor
1157long getopenobj
1158long getpattern
1159long winget
1160long winattach
1161long getothermonitor
1162long newpup
1163#
1164long getvaluator short s
1165void winset long s
1166long dopup long s
1167void getdepth short r short r
1168void getcpos short r short r
1169void getsize long r long r
1170void getorigin long r long r
1171void getviewport short r short r short r short r
1172void gettp short r short r short r short r
1173void getgpos float r float r float r float r
1174void winposition long s long s long s long s
1175void gRGBcolor short r short r short r
1176void gRGBmask short r short r short r
1177void getscrmask short r short r short r short r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001178###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 +00001179void getmcolor short s short r short r short r
1180void mapw long s short s short s float r float r float r float r float r float r
1181void mapw2 long s short s short s float r float r
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001182###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 +00001183###long qread short r
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001184void getcursor short r short r short r long r
1185#
1186# For these we receive arrays of stuff
1187#
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001188###void getdev long s short s[arg1] short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001189#XXX not generated correctly yet
1190#void getmatrix float r[16]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001191###long readpixels short s short r[retval]
1192###long readRGB short s char r[retval] char r[retval] char r[retval]
1193###long blkqread short s short r[arg1]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194#
1195# New 4D routines
1196#
1197void cmode
1198void concave long s
1199void curstype long s
1200void drawmode long s
1201void gammaramp short s[256] short s[256] short s[256]
1202long getbackface
1203long getdescender
1204long getdrawmode
1205long getmmode
1206long getsm
1207long getvideo long s
1208void imakebackground
1209void lmbind short s short s
1210void lmdef long s long s long s float s[arg3]
1211void mmode long s
1212void normal float s[3]
1213void overlay long s
1214void RGBrange short s short s short s short s short s short s short s short s
1215void setvideo long s long s
1216void shademodel long s
1217void underlay long s
1218#
1219# New Personal Iris/GT Routines
1220#
1221void bgnclosedline
1222void bgnline
1223void bgnpoint
1224void bgnpolygon
1225void bgnsurface
1226void bgntmesh
1227void bgntrim
1228void endclosedline
1229void endline
1230void endpoint
1231void endpolygon
1232void endsurface
1233void endtmesh
1234void endtrim
1235void blendfunction long s long s
1236void c3f float s[3]
1237void c3i long s[3]
1238void c3s short s[3]
1239void c4f float s[4]
1240void c4i long s[4]
1241void c4s short s[4]
1242void colorf float s
1243void cpack long s
1244void czclear long s long s
1245void dglclose long s
1246long dglopen char *s long s
1247long getgdesc long s
1248void getnurbsproperty long s float r
1249void glcompat long s long s
1250void iconsize long s long s
1251void icontitle char *s
1252void lRGBrange short s short s short s short s short s short s long s long s
1253void linesmooth long s
1254void lmcolor long s
1255void logicop long s
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001256###long lrectread short s short s short s short s long r[retval]
1257###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
1258### Now manual, with string last arg
1259###long rectread short s short s short s short s short r[retval]
1260###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 +00001261void lsetdepth long s long s
1262void lshaderange short s short s long s long s
1263void n3f float s[3]
1264void noborder
1265void pntsmooth long s
1266void readsource long s
1267void rectzoom float s float s
1268void sbox float s float s float s float s
1269void sboxi long s long s long s long s
1270void sboxs short s short s short s short s
1271void sboxf float s float s float s float s
1272void sboxfi long s long s long s long s
1273void sboxfs short s short s short s short s
1274void setnurbsproperty long s float s
1275void setpup long s long s long s
1276void smoothline long s
1277void subpixel long s
1278void swaptmesh
1279long swinopen long s
1280void v2f float s[2]
1281void v2i long s[2]
1282void v2s short s[2]
1283void v3f float s[3]
1284void v3i long s[3]
1285void v3s short s[3]
1286void v4f float s[4]
1287void v4i long s[4]
1288void v4s short s[4]
1289void videocmd long s
1290long windepth long s
1291void wmpack long s
1292void zdraw long s
1293void zfunction long s
1294void zsource long s
1295void zwritemask long s
1296#
1297# uses doubles
1298#
1299void v2d double s[2]
1300void v3d double s[3]
1301void v4d double s[4]
Guido van Rossumd26d9ed1991-10-20 20:13:40 +00001302#
1303# Why isn't this here?
1304#
1305void pixmode long s long s
Guido van Rossumdd9ed831992-06-29 17:10:40 +00001306#
1307# New in IRIX 4.0
1308#
1309long qgetfd