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