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