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