mirror of https://github.com/python/cpython
1377 lines
33 KiB
Plaintext
1377 lines
33 KiB
Plaintext
/***********************************************************
|
|
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
|
The Netherlands.
|
|
|
|
All Rights Reserved
|
|
|
|
Permission to use, copy, modify, and distribute this software and its
|
|
documentation for any purpose and without fee is hereby granted,
|
|
provided that the above copyright notice appear in all copies and that
|
|
both that copyright notice and this permission notice appear in
|
|
supporting documentation, and that the names of Stichting Mathematisch
|
|
Centrum or CWI or Corporation for National Research Initiatives or
|
|
CNRI not be used in advertising or publicity pertaining to
|
|
distribution of the software without specific, written prior
|
|
permission.
|
|
|
|
While CWI is the initial source for this software, a modified version
|
|
is made available by the Corporation for National Research Initiatives
|
|
(CNRI) at the Internet address ftp://ftp.python.org.
|
|
|
|
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
|
|
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
|
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
|
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
******************************************************************/
|
|
|
|
/*
|
|
Input used to generate the Python module "glmodule.c".
|
|
The stub generator is a Python script called "cgen.py".
|
|
|
|
Each definition must be contained on one line:
|
|
|
|
<returntype> <name> <type> <arg> <type> <arg>
|
|
|
|
<returntype> can be: void, short, long (XXX maybe others?)
|
|
|
|
<type> can be: char, string, short, float, long, or double
|
|
string indicates a null terminated string;
|
|
if <type> is char and <arg> begins with a *, the * is stripped
|
|
and <type> is changed into string
|
|
|
|
<arg> has the form <mode> or <mode>[<subscript>]
|
|
where <mode> can be
|
|
s: arg is sent
|
|
r: arg is received (arg is a pointer)
|
|
and <subscript> can be (N and I are numbers):
|
|
N
|
|
argI
|
|
retval
|
|
N*argI
|
|
N*I
|
|
N*retval
|
|
In the case where the subscript consists of two parts
|
|
separated by *, the first part is the width of the matrix, and
|
|
the second part is the length of the matrix. This order is
|
|
opposite from the order used in C to declare a two-dimensional
|
|
matrix.
|
|
*/
|
|
|
|
/*
|
|
* An attempt has been made to make this module switch threads on qread
|
|
* calls. It is far from safe, though.
|
|
*/
|
|
|
|
#include <gl.h>
|
|
#include <device.h>
|
|
|
|
#include "allobjects.h"
|
|
#include "import.h"
|
|
#include "modsupport.h"
|
|
#include "cgensupport.h"
|
|
#include "ceval.h"
|
|
|
|
/*
|
|
Some stubs are too complicated for the stub generator.
|
|
We can include manually written versions of them here.
|
|
A line starting with '%' gives the name of the function so the stub
|
|
generator can include it in the table of functions.
|
|
*/
|
|
|
|
% qread
|
|
|
|
static object *
|
|
gl_qread(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
long retval;
|
|
short arg1 ;
|
|
BGN_SAVE
|
|
retval = qread( & arg1 );
|
|
END_SAVE
|
|
{ object *v = newtupleobject( 2 );
|
|
if (v == NULL) return NULL;
|
|
settupleitem(v, 0, mknewlongobject(retval));
|
|
settupleitem(v, 1, mknewshortobject(arg1));
|
|
return v;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
varray -- an array of v.. calls.
|
|
The argument is an array (maybe list or tuple) of points.
|
|
Each point must be a tuple or list of coordinates (x, y, z).
|
|
The points may be 2- or 3-dimensional but must all have the
|
|
same dimension. Float and int values may be mixed however.
|
|
The points are always converted to 3D double precision points
|
|
by assuming z=0.0 if necessary (as indicated in the man page),
|
|
and for each point v3d() is called.
|
|
*/
|
|
|
|
% varray
|
|
|
|
static object *
|
|
gl_varray(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
object *v, *w;
|
|
int i, n, width;
|
|
double vec[3];
|
|
object * (*getitem) FPROTO((object *, int));
|
|
|
|
if (!getiobjectarg(args, 1, 0, &v))
|
|
return NULL;
|
|
|
|
if (is_listobject(v)) {
|
|
n = getlistsize(v);
|
|
getitem = getlistitem;
|
|
}
|
|
else if (is_tupleobject(v)) {
|
|
n = gettuplesize(v);
|
|
getitem = gettupleitem;
|
|
}
|
|
else {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
|
|
if (n == 0) {
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
if (n > 0)
|
|
w = (*getitem)(v, 0);
|
|
|
|
width = 0;
|
|
if (w == NULL) {
|
|
}
|
|
else if (is_listobject(w)) {
|
|
width = getlistsize(w);
|
|
}
|
|
else if (is_tupleobject(w)) {
|
|
width = gettuplesize(w);
|
|
}
|
|
|
|
switch (width) {
|
|
case 2:
|
|
vec[2] = 0.0;
|
|
/* Fall through */
|
|
case 3:
|
|
break;
|
|
default:
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
|
|
for (i = 0; i < n; i++) {
|
|
w = (*getitem)(v, i);
|
|
if (!getidoublearray(w, 1, 0, width, vec))
|
|
return NULL;
|
|
v3d(vec);
|
|
}
|
|
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
/*
|
|
vnarray, nvarray -- an array of n3f and v3f calls.
|
|
The argument is an array (list or tuple) of pairs of points and normals.
|
|
Each pair is a tuple (NOT a list) of a point and a normal for that point.
|
|
Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
|
|
Three coordinates must be given. Float and int values may be mixed.
|
|
For each pair, n3f() is called for the normal, and then v3f() is called
|
|
for the vector.
|
|
|
|
vnarray and nvarray differ only in the order of the vector and normal in
|
|
the pair: vnarray expects (v, n) while nvarray expects (n, v).
|
|
*/
|
|
|
|
static object *gen_nvarray(); /* Forward */
|
|
|
|
% nvarray
|
|
|
|
static object *
|
|
gl_nvarray(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
return gen_nvarray(args, 0);
|
|
}
|
|
|
|
% vnarray
|
|
|
|
static object *
|
|
gl_vnarray(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
return gen_nvarray(args, 1);
|
|
}
|
|
|
|
/* Generic, internal version of {nv,nv}array: inorm indicates the
|
|
argument order, 0: normal first, 1: vector first. */
|
|
|
|
static object *
|
|
gen_nvarray(args, inorm)
|
|
object *args;
|
|
int inorm;
|
|
{
|
|
object *v, *w, *wnorm, *wvec;
|
|
int i, n;
|
|
float norm[3], vec[3];
|
|
object * (*getitem) FPROTO((object *, int));
|
|
|
|
if (!getiobjectarg(args, 1, 0, &v))
|
|
return NULL;
|
|
|
|
if (is_listobject(v)) {
|
|
n = getlistsize(v);
|
|
getitem = getlistitem;
|
|
}
|
|
else if (is_tupleobject(v)) {
|
|
n = gettuplesize(v);
|
|
getitem = gettupleitem;
|
|
}
|
|
else {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
|
|
for (i = 0; i < n; i++) {
|
|
w = (*getitem)(v, i);
|
|
if (!is_tupleobject(w) || gettuplesize(w) != 2) {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
wnorm = gettupleitem(w, inorm);
|
|
wvec = gettupleitem(w, 1 - inorm);
|
|
if (!getifloatarray(wnorm, 1, 0, 3, norm) ||
|
|
!getifloatarray(wvec, 1, 0, 3, vec))
|
|
return NULL;
|
|
n3f(norm);
|
|
v3f(vec);
|
|
}
|
|
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
|
|
The dimensions of ctl[] are computed as follows:
|
|
[len(s_knots) - s_order], [len(t_knots) - t_order]
|
|
*/
|
|
|
|
% nurbssurface
|
|
|
|
static object *
|
|
gl_nurbssurface(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
long arg1 ;
|
|
double * arg2 ;
|
|
long arg3 ;
|
|
double * arg4 ;
|
|
double *arg5 ;
|
|
long arg6 ;
|
|
long arg7 ;
|
|
long arg8 ;
|
|
long ncoords;
|
|
long s_byte_stride, t_byte_stride;
|
|
long s_nctl, t_nctl;
|
|
long s, t;
|
|
object *v, *w, *pt;
|
|
double *pnext;
|
|
if (!getilongarraysize(args, 6, 0, &arg1))
|
|
return NULL;
|
|
if ((arg2 = NEW(double, arg1 )) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
if (!getidoublearray(args, 6, 0, arg1 , arg2))
|
|
return NULL;
|
|
if (!getilongarraysize(args, 6, 1, &arg3))
|
|
return NULL;
|
|
if ((arg4 = NEW(double, arg3 )) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
if (!getidoublearray(args, 6, 1, arg3 , arg4))
|
|
return NULL;
|
|
if (!getilongarg(args, 6, 3, &arg6))
|
|
return NULL;
|
|
if (!getilongarg(args, 6, 4, &arg7))
|
|
return NULL;
|
|
if (!getilongarg(args, 6, 5, &arg8))
|
|
return NULL;
|
|
if (arg8 == N_XYZ)
|
|
ncoords = 3;
|
|
else if (arg8 == N_XYZW)
|
|
ncoords = 4;
|
|
else {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
s_nctl = arg1 - arg6;
|
|
t_nctl = arg3 - arg7;
|
|
if (!getiobjectarg(args, 6, 2, &v))
|
|
return NULL;
|
|
if (!is_listobject(v) || getlistsize(v) != s_nctl) {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
if ((arg5 = NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
pnext = arg5;
|
|
for (s = 0; s < s_nctl; s++) {
|
|
w = getlistitem(v, s);
|
|
if (w == NULL || !is_listobject(w) ||
|
|
getlistsize(w) != t_nctl) {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
for (t = 0; t < t_nctl; t++) {
|
|
pt = getlistitem(w, t);
|
|
if (!getidoublearray(pt, 1, 0, ncoords, pnext))
|
|
return NULL;
|
|
pnext += ncoords;
|
|
}
|
|
}
|
|
s_byte_stride = sizeof(double) * ncoords;
|
|
t_byte_stride = s_byte_stride * s_nctl;
|
|
nurbssurface( arg1 , arg2 , arg3 , arg4 ,
|
|
s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
|
|
DEL(arg2);
|
|
DEL(arg4);
|
|
DEL(arg5);
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
/* nurbscurve(knots, ctlpoints, order, type).
|
|
The length of ctlpoints is len(knots)-order. */
|
|
|
|
%nurbscurve
|
|
|
|
static object *
|
|
gl_nurbscurve(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
long arg1 ;
|
|
double * arg2 ;
|
|
long arg3 ;
|
|
double * arg4 ;
|
|
long arg5 ;
|
|
long arg6 ;
|
|
int ncoords, npoints;
|
|
int i;
|
|
object *v;
|
|
double *pnext;
|
|
if (!getilongarraysize(args, 4, 0, &arg1))
|
|
return NULL;
|
|
if ((arg2 = NEW(double, arg1 )) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
if (!getidoublearray(args, 4, 0, arg1 , arg2))
|
|
return NULL;
|
|
if (!getilongarg(args, 4, 2, &arg5))
|
|
return NULL;
|
|
if (!getilongarg(args, 4, 3, &arg6))
|
|
return NULL;
|
|
if (arg6 == N_ST)
|
|
ncoords = 2;
|
|
else if (arg6 == N_STW)
|
|
ncoords = 3;
|
|
else {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
npoints = arg1 - arg5;
|
|
if (!getiobjectarg(args, 4, 1, &v))
|
|
return NULL;
|
|
if (!is_listobject(v) || getlistsize(v) != npoints) {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
if ((arg4 = NEW(double, npoints*ncoords )) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
pnext = arg4;
|
|
for (i = 0; i < npoints; i++) {
|
|
if (!getidoublearray(getlistitem(v, i), 1, 0, ncoords, pnext))
|
|
return NULL;
|
|
pnext += ncoords;
|
|
}
|
|
arg3 = (sizeof(double)) * ncoords;
|
|
nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
|
|
DEL(arg2);
|
|
DEL(arg4);
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
/* pwlcurve(points, type).
|
|
Points is a list of points. Type must be N_ST. */
|
|
|
|
%pwlcurve
|
|
|
|
static object *
|
|
gl_pwlcurve(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
object *v;
|
|
long type;
|
|
double *data, *pnext;
|
|
long npoints, ncoords;
|
|
int i;
|
|
if (!getiobjectarg(args, 2, 0, &v))
|
|
return NULL;
|
|
if (!getilongarg(args, 2, 1, &type))
|
|
return NULL;
|
|
if (!is_listobject(v)) {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
npoints = getlistsize(v);
|
|
if (type == N_ST)
|
|
ncoords = 2;
|
|
else {
|
|
err_badarg();
|
|
return NULL;
|
|
}
|
|
if ((data = NEW(double, npoints*ncoords)) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
pnext = data;
|
|
for (i = 0; i < npoints; i++) {
|
|
if (!getidoublearray(getlistitem(v, i), 1, 0, ncoords, pnext))
|
|
return NULL;
|
|
pnext += ncoords;
|
|
}
|
|
pwlcurve(npoints, data, sizeof(double)*ncoords, type);
|
|
DEL(data);
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
|
|
/* Picking and Selecting */
|
|
|
|
static short *pickbuffer = NULL;
|
|
static long pickbuffersize;
|
|
|
|
static object *
|
|
pick_select(args, func)
|
|
object *args;
|
|
void (*func)();
|
|
{
|
|
if (!getilongarg(args, 1, 0, &pickbuffersize))
|
|
return NULL;
|
|
if (pickbuffer != NULL) {
|
|
err_setstr(RuntimeError,
|
|
"pick/gselect: already picking/selecting");
|
|
return NULL;
|
|
}
|
|
if ((pickbuffer = NEW(short, pickbuffersize)) == NULL) {
|
|
return err_nomem();
|
|
}
|
|
(*func)(pickbuffer, pickbuffersize);
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
static object *
|
|
endpick_select(args, func)
|
|
object *args;
|
|
long (*func)();
|
|
{
|
|
object *v, *w;
|
|
int i, nhits, n;
|
|
if (!getnoarg(args))
|
|
return NULL;
|
|
if (pickbuffer == NULL) {
|
|
err_setstr(RuntimeError,
|
|
"endpick/endselect: not in pick/select mode");
|
|
return NULL;
|
|
}
|
|
nhits = (*func)(pickbuffer);
|
|
if (nhits < 0) {
|
|
nhits = -nhits; /* How to report buffer overflow otherwise? */
|
|
}
|
|
/* Scan the buffer to see how many integers */
|
|
n = 0;
|
|
for (; nhits > 0; nhits--) {
|
|
n += 1 + pickbuffer[n];
|
|
}
|
|
v = newlistobject(n);
|
|
if (v == NULL)
|
|
return NULL;
|
|
/* XXX Could do it nicer and interpret the data structure here,
|
|
returning a list of lists. But this can be done in Python... */
|
|
for (i = 0; i < n; i++) {
|
|
w = newintobject((long)pickbuffer[i]);
|
|
if (w == NULL) {
|
|
DECREF(v);
|
|
return NULL;
|
|
}
|
|
setlistitem(v, i, w);
|
|
}
|
|
DEL(pickbuffer);
|
|
pickbuffer = NULL;
|
|
return v;
|
|
}
|
|
|
|
extern void pick(), gselect();
|
|
extern long endpick(), endselect();
|
|
|
|
%pick
|
|
static object *gl_pick(self, args) object *self, *args; {
|
|
return pick_select(args, pick);
|
|
}
|
|
|
|
%endpick
|
|
static object *gl_endpick(self, args) object *self, *args; {
|
|
return endpick_select(args, endpick);
|
|
}
|
|
|
|
%gselect
|
|
static object *gl_gselect(self, args) object *self, *args; {
|
|
return pick_select(args, gselect);
|
|
}
|
|
|
|
%endselect
|
|
static object *gl_endselect(self, args) object *self, *args; {
|
|
return endpick_select(args, endselect);
|
|
}
|
|
|
|
|
|
/* XXX The generator botches this one. Here's a quick hack to fix it. */
|
|
|
|
/* XXX The generator botches this one. Here's a quick hack to fix it. */
|
|
|
|
% getmatrix float r[16]
|
|
|
|
static object *
|
|
gl_getmatrix(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
Matrix arg1;
|
|
object *v, *w;
|
|
int i, j;
|
|
getmatrix( arg1 );
|
|
v = newlistobject(16);
|
|
if (v == NULL) {
|
|
return err_nomem();
|
|
}
|
|
for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
|
|
w = mknewfloatobject(arg1[i][j]);
|
|
if (w == NULL) {
|
|
DECREF(v);
|
|
return NULL;
|
|
}
|
|
setlistitem(v, i*4+j, w);
|
|
}
|
|
return v;
|
|
}
|
|
|
|
/* Here's an alternate version that returns a 4x4 matrix instead of
|
|
a vector. Unfortunately it is incompatible with loadmatrix and
|
|
multmatrix... */
|
|
|
|
% altgetmatrix float r[4][4]
|
|
|
|
static object *
|
|
gl_altgetmatrix(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
Matrix arg1;
|
|
object *v, *w;
|
|
int i, j;
|
|
getmatrix( arg1 );
|
|
v = newlistobject(4);
|
|
if (v == NULL) {
|
|
return NULL;
|
|
}
|
|
for (i = 0; i < 4; i++) {
|
|
w = newlistobject(4);
|
|
if (w == NULL) {
|
|
DECREF(v);
|
|
return NULL;
|
|
}
|
|
setlistitem(v, i, w);
|
|
}
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
w = mknewfloatobject(arg1[i][j]);
|
|
if (w == NULL) {
|
|
DECREF(v);
|
|
return NULL;
|
|
}
|
|
setlistitem(getlistitem(v, i), j, w);
|
|
}
|
|
}
|
|
return v;
|
|
}
|
|
|
|
% lrectwrite
|
|
|
|
static object *
|
|
gl_lrectwrite(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
short x1 ;
|
|
short y1 ;
|
|
short x2 ;
|
|
short y2 ;
|
|
string parray ;
|
|
object *s;
|
|
int pixcount;
|
|
if (!getishortarg(args, 5, 0, &x1))
|
|
return NULL;
|
|
if (!getishortarg(args, 5, 1, &y1))
|
|
return NULL;
|
|
if (!getishortarg(args, 5, 2, &x2))
|
|
return NULL;
|
|
if (!getishortarg(args, 5, 3, &y2))
|
|
return NULL;
|
|
if (!getistringarg(args, 5, 4, &parray))
|
|
return NULL;
|
|
if (!getiobjectarg(args, 5, 4, &s))
|
|
return NULL;
|
|
#if 0
|
|
/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */
|
|
pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
|
|
if (!is_stringobject(s) || getstringsize(s) != pixcount*sizeof(long)) {
|
|
err_setstr(RuntimeError,
|
|
"string arg to lrectwrite has wrong size");
|
|
return NULL;
|
|
}
|
|
#endif
|
|
lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
|
|
INCREF(None);
|
|
return None;
|
|
}
|
|
|
|
% lrectread
|
|
|
|
static object *
|
|
gl_lrectread(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
short x1 ;
|
|
short y1 ;
|
|
short x2 ;
|
|
short y2 ;
|
|
object *parray;
|
|
int pixcount;
|
|
if (!getishortarg(args, 4, 0, &x1))
|
|
return NULL;
|
|
if (!getishortarg(args, 4, 1, &y1))
|
|
return NULL;
|
|
if (!getishortarg(args, 4, 2, &x2))
|
|
return NULL;
|
|
if (!getishortarg(args, 4, 3, &y2))
|
|
return NULL;
|
|
pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
|
|
parray = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
|
|
if (parray == NULL)
|
|
return NULL; /* No memory */
|
|
lrectread(x1, y1, x2, y2, (unsigned long *) getstringvalue(parray));
|
|
return parray;
|
|
}
|
|
|
|
% readdisplay
|
|
|
|
static object *
|
|
gl_readdisplay(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
short x1, y1, x2, y2;
|
|
unsigned long *parray, hints;
|
|
long size, size_ret;
|
|
object *rv;
|
|
|
|
if ( !getargs(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) )
|
|
return 0;
|
|
size = (long)(x2+1-x1) * (long)(y2+1-y1);
|
|
rv = newsizedstringobject((char *)NULL, size*sizeof(long));
|
|
if ( rv == NULL )
|
|
return NULL;
|
|
parray = (unsigned long *)getstringvalue(rv);
|
|
size_ret = readdisplay(x1, y1, x2, y2, parray, hints);
|
|
if ( size_ret != size ) {
|
|
printf("gl_readdisplay: got %d pixels, expected %d\n",
|
|
size_ret, size);
|
|
err_setstr(RuntimeError, "readdisplay returned unexpected length");
|
|
return NULL;
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
/* Desperately needed, here are tools to compress and decompress
|
|
the data manipulated by lrectread/lrectwrite.
|
|
|
|
gl.packrect(width, height, packfactor, bigdata) --> smalldata
|
|
makes 'bigdata' 4*(packfactor**2) times smaller by:
|
|
- turning it into B/W (a factor 4)
|
|
- replacing squares of size pacfactor by one
|
|
representative
|
|
|
|
gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
|
|
is the inverse; the numeric arguments must be *the same*.
|
|
|
|
Both work best if width and height are multiples of packfactor
|
|
(in fact unpackrect will leave garbage bytes).
|
|
*/
|
|
|
|
% packrect
|
|
|
|
static object *
|
|
gl_packrect(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
long width, height, packfactor;
|
|
char *s;
|
|
object *unpacked, *packed;
|
|
int pixcount, packedcount, x, y, r, g, b;
|
|
unsigned long pixel;
|
|
unsigned char *p;
|
|
unsigned long *parray;
|
|
if (!getilongarg(args, 4, 0, &width))
|
|
return NULL;
|
|
if (!getilongarg(args, 4, 1, &height))
|
|
return NULL;
|
|
if (!getilongarg(args, 4, 2, &packfactor))
|
|
return NULL;
|
|
if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
|
|
return NULL;
|
|
if (!getiobjectarg(args, 4, 3, &unpacked))
|
|
return NULL;
|
|
if (width <= 0 || height <= 0 || packfactor <= 0) {
|
|
err_setstr(RuntimeError, "packrect args must be > 0");
|
|
return NULL;
|
|
}
|
|
pixcount = width*height;
|
|
packedcount = ((width+packfactor-1)/packfactor) *
|
|
((height+packfactor-1)/packfactor);
|
|
if (getstringsize(unpacked) != pixcount*sizeof(long)) {
|
|
err_setstr(RuntimeError,
|
|
"string arg to packrect has wrong size");
|
|
return NULL;
|
|
}
|
|
packed = newsizedstringobject((char *)NULL, packedcount);
|
|
if (packed == NULL)
|
|
return NULL;
|
|
parray = (unsigned long *) getstringvalue(unpacked);
|
|
p = (unsigned char *) getstringvalue(packed);
|
|
for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
|
|
for (x = 0; x < width; x += packfactor) {
|
|
pixel = parray[x];
|
|
r = pixel & 0xff;
|
|
g = (pixel >> 8) & 0xff;
|
|
b = (pixel >> 16) & 0xff;
|
|
*p++ = (30*r+59*g+11*b) / 100;
|
|
}
|
|
}
|
|
return packed;
|
|
}
|
|
|
|
% unpackrect
|
|
|
|
static unsigned long unpacktab[256];
|
|
static int unpacktab_inited = 0;
|
|
|
|
static object *
|
|
gl_unpackrect(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
long width, height, packfactor;
|
|
char *s;
|
|
object *unpacked, *packed;
|
|
int pixcount, packedcount, y;
|
|
register unsigned char *p;
|
|
register unsigned long *parray;
|
|
if (!unpacktab_inited) {
|
|
register int white;
|
|
for (white = 256; --white >= 0; )
|
|
unpacktab[white] = white * 0x010101L;
|
|
unpacktab_inited++;
|
|
}
|
|
if (!getilongarg(args, 4, 0, &width))
|
|
return NULL;
|
|
if (!getilongarg(args, 4, 1, &height))
|
|
return NULL;
|
|
if (!getilongarg(args, 4, 2, &packfactor))
|
|
return NULL;
|
|
if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
|
|
return NULL;
|
|
if (!getiobjectarg(args, 4, 3, &packed))
|
|
return NULL;
|
|
if (width <= 0 || height <= 0 || packfactor <= 0) {
|
|
err_setstr(RuntimeError, "packrect args must be > 0");
|
|
return NULL;
|
|
}
|
|
pixcount = width*height;
|
|
packedcount = ((width+packfactor-1)/packfactor) *
|
|
((height+packfactor-1)/packfactor);
|
|
if (getstringsize(packed) != packedcount) {
|
|
err_setstr(RuntimeError,
|
|
"string arg to unpackrect has wrong size");
|
|
return NULL;
|
|
}
|
|
unpacked = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
|
|
if (unpacked == NULL)
|
|
return NULL;
|
|
parray = (unsigned long *) getstringvalue(unpacked);
|
|
p = (unsigned char *) getstringvalue(packed);
|
|
if (packfactor == 1 && width*height > 0) {
|
|
/* Just expand bytes to longs */
|
|
register int x = width * height;
|
|
do {
|
|
*parray++ = unpacktab[*p++];
|
|
} while (--x >= 0);
|
|
}
|
|
else {
|
|
register int y;
|
|
for (y = 0; y < height-packfactor+1;
|
|
y += packfactor, parray += packfactor*width) {
|
|
register int x;
|
|
for (x = 0; x < width-packfactor+1; x += packfactor) {
|
|
register unsigned long pixel = unpacktab[*p++];
|
|
register int i;
|
|
for (i = packfactor*width; (i-=width) >= 0;) {
|
|
register int j;
|
|
for (j = packfactor; --j >= 0; )
|
|
parray[i+x+j] = pixel;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return unpacked;
|
|
}
|
|
|
|
% gversion
|
|
static object *
|
|
gl_gversion(self, args)
|
|
object *self;
|
|
object *args;
|
|
{
|
|
char buf[20];
|
|
gversion(buf);
|
|
return newstringobject(buf);
|
|
}
|
|
|
|
|
|
/* End of manually written stubs */
|
|
|
|
%%
|
|
|
|
long getshade
|
|
if !solaris void devport short s long s
|
|
void rdr2i long s long s
|
|
void rectfs short s short s short s short s
|
|
void rects short s short s short s short s
|
|
void rmv2i long s long s
|
|
void noport
|
|
void popviewport
|
|
void clear
|
|
void clearhitcode
|
|
void closeobj
|
|
void cursoff
|
|
void curson
|
|
void doublebuffer
|
|
void finish
|
|
void gconfig
|
|
void ginit
|
|
void greset
|
|
void multimap
|
|
void onemap
|
|
void popattributes
|
|
void popmatrix
|
|
void pushattributes
|
|
void pushmatrix
|
|
void pushviewport
|
|
void qreset
|
|
void RGBmode
|
|
void singlebuffer
|
|
void swapbuffers
|
|
void gsync
|
|
void gflush
|
|
void tpon
|
|
void tpoff
|
|
void clkon
|
|
void clkoff
|
|
void ringbell
|
|
#void callfunc
|
|
void gbegin
|
|
void textinit
|
|
void initnames
|
|
void pclos
|
|
void popname
|
|
if !solaris void spclos
|
|
void zclear
|
|
void screenspace
|
|
void reshapeviewport
|
|
void winpush
|
|
void winpop
|
|
void foreground
|
|
void endfullscrn
|
|
if !solaris void endpupmode
|
|
void fullscrn
|
|
if !solaris void pupmode
|
|
void winconstraints
|
|
void pagecolor short s
|
|
void textcolor short s
|
|
void color short s
|
|
void curveit short s
|
|
void font short s
|
|
void linewidth short s
|
|
void setlinestyle short s
|
|
void setmap short s
|
|
void swapinterval short s
|
|
void writemask short s
|
|
if !solaris void textwritemask short s
|
|
void qdevice short s
|
|
void unqdevice short s
|
|
void curvebasis short s
|
|
void curveprecision short s
|
|
void loadname short s
|
|
void passthrough short s
|
|
void pushname short s
|
|
void setmonitor short s
|
|
if !solaris void setshade short s
|
|
void setpattern short s
|
|
if !solaris void pagewritemask short s
|
|
#
|
|
void callobj long s
|
|
void delobj long s
|
|
void editobj long s
|
|
void makeobj long s
|
|
void maketag long s
|
|
void chunksize long s
|
|
void compactify long s
|
|
void deltag long s
|
|
void lsrepeat long s
|
|
void objinsert long s
|
|
void objreplace long s
|
|
void winclose long s
|
|
void blanktime long s
|
|
void freepup long s
|
|
# This is not in the library!?
|
|
###void pupcolor long s
|
|
#
|
|
void backbuffer long s
|
|
void frontbuffer long s
|
|
if !solaris void lsbackup long s
|
|
void resetls long s
|
|
void lampon long s
|
|
void lampoff long s
|
|
void setbell long s
|
|
void blankscreen long s
|
|
void depthcue long s
|
|
void zbuffer long s
|
|
void backface long s
|
|
#
|
|
void cmov2i long s long s
|
|
void draw2i long s long s
|
|
void move2i long s long s
|
|
void pnt2i long s long s
|
|
void patchbasis long s long s
|
|
void patchprecision long s long s
|
|
void pdr2i long s long s
|
|
void pmv2i long s long s
|
|
void rpdr2i long s long s
|
|
void rpmv2i long s long s
|
|
void xfpt2i long s long s
|
|
void objdelete long s long s
|
|
void patchcurves long s long s
|
|
void minsize long s long s
|
|
void maxsize long s long s
|
|
void keepaspect long s long s
|
|
void prefsize long s long s
|
|
void stepunit long s long s
|
|
void fudge long s long s
|
|
void winmove long s long s
|
|
#
|
|
void attachcursor short s short s
|
|
void deflinestyle short s short s
|
|
void noise short s short s
|
|
void picksize short s short s
|
|
void qenter short s short s
|
|
void setdepth short s short s
|
|
void cmov2s short s short s
|
|
void draw2s short s short s
|
|
void move2s short s short s
|
|
void pdr2s short s short s
|
|
void pmv2s short s short s
|
|
void pnt2s short s short s
|
|
void rdr2s short s short s
|
|
void rmv2s short s short s
|
|
void rpdr2s short s short s
|
|
void rpmv2s short s short s
|
|
void xfpt2s short s short s
|
|
#
|
|
void cmov2 float s float s
|
|
void draw2 float s float s
|
|
void move2 float s float s
|
|
void pnt2 float s float s
|
|
void pdr2 float s float s
|
|
void pmv2 float s float s
|
|
void rdr2 float s float s
|
|
void rmv2 float s float s
|
|
void rpdr2 float s float s
|
|
void rpmv2 float s float s
|
|
void xfpt2 float s float s
|
|
#
|
|
void loadmatrix float s[4*4]
|
|
# Really [4][4]
|
|
void multmatrix float s[4*4]
|
|
# Really [4][4]
|
|
void crv float s[3*4]
|
|
# Really [4][3]
|
|
void rcrv float s[4*4]
|
|
# Really [4][4]
|
|
#
|
|
# Methods that have strings.
|
|
#
|
|
void addtopup long s char *s long s
|
|
void charstr char *s
|
|
void getport char *s
|
|
long strwidth char *s
|
|
long winopen char *s
|
|
void wintitle char *s
|
|
#
|
|
# Methods that have 1 long (# of elements) and an array
|
|
#
|
|
void polf long s float s[3*arg1]
|
|
void polf2 long s float s[2*arg1]
|
|
void poly long s float s[3*arg1]
|
|
void poly2 long s float s[2*arg1]
|
|
void crvn long s float s[3*arg1]
|
|
void rcrvn long s float s[4*arg1]
|
|
#
|
|
void polf2i long s long s[2*arg1]
|
|
void polfi long s long s[3*arg1]
|
|
void poly2i long s long s[2*arg1]
|
|
void polyi long s long s[3*arg1]
|
|
#
|
|
void polf2s long s short s[2*arg1]
|
|
void polfs long s short s[3*arg1]
|
|
void polys long s short s[3*arg1]
|
|
void poly2s long s short s[2*arg1]
|
|
#
|
|
void defcursor short s u_short s[128]
|
|
# Is this useful?
|
|
void writepixels short s u_short s[arg1]
|
|
# Should be unsigned short...
|
|
void defbasis long s float s[4*4]
|
|
if !solaris void gewrite short s short s[arg1]
|
|
#
|
|
void rotate short s char s
|
|
# This is not in the library!?
|
|
###void setbutton short s char s
|
|
void rot float s char s
|
|
#
|
|
void circfi long s long s long s
|
|
void circi long s long s long s
|
|
void cmovi long s long s long s
|
|
void drawi long s long s long s
|
|
void movei long s long s long s
|
|
void pnti long s long s long s
|
|
void newtag long s long s long s
|
|
void pdri long s long s long s
|
|
void pmvi long s long s long s
|
|
void rdri long s long s long s
|
|
void rmvi long s long s long s
|
|
void rpdri long s long s long s
|
|
void rpmvi long s long s long s
|
|
void xfpti long s long s long s
|
|
#
|
|
void circ float s float s float s
|
|
void circf float s float s float s
|
|
void cmov float s float s float s
|
|
void draw float s float s float s
|
|
void move float s float s float s
|
|
void pnt float s float s float s
|
|
void scale float s float s float s
|
|
void translate float s float s float s
|
|
void pdr float s float s float s
|
|
void pmv float s float s float s
|
|
void rdr float s float s float s
|
|
void rmv float s float s float s
|
|
void rpdr float s float s float s
|
|
void rpmv float s float s float s
|
|
void xfpt float s float s float s
|
|
#
|
|
void RGBcolor short s short s short s
|
|
void RGBwritemask short s short s short s
|
|
void setcursor short s short s short s
|
|
void tie short s short s short s
|
|
void circfs short s short s short s
|
|
void circs short s short s short s
|
|
void cmovs short s short s short s
|
|
void draws short s short s short s
|
|
void moves short s short s short s
|
|
void pdrs short s short s short s
|
|
void pmvs short s short s short s
|
|
void pnts short s short s short s
|
|
void rdrs short s short s short s
|
|
void rmvs short s short s short s
|
|
void rpdrs short s short s short s
|
|
void rpmvs short s short s short s
|
|
void xfpts short s short s short s
|
|
void curorigin short s short s short s
|
|
void cyclemap short s short s short s
|
|
#
|
|
void patch float s[4*4] float s[4*4] float s[4*4]
|
|
void splf long s float s[3*arg1] u_short s[arg1]
|
|
void splf2 long s float s[2*arg1] u_short s[arg1]
|
|
void splfi long s long s[3*arg1] u_short s[arg1]
|
|
void splf2i long s long s[2*arg1] u_short s[arg1]
|
|
void splfs long s short s[3*arg1] u_short s[arg1]
|
|
void splf2s long s short s[2*arg1] u_short s[arg1]
|
|
###void defpattern short s short s u_short s[arg2*arg2/16]
|
|
#
|
|
void rpatch float s[4*4] float s[4*4] float s[4*4] float s[4*4]
|
|
#
|
|
# routines that send 4 floats
|
|
#
|
|
void ortho2 float s float s float s float s
|
|
void rect float s float s float s float s
|
|
void rectf float s float s float s float s
|
|
void xfpt4 float s float s float s float s
|
|
#
|
|
void textport short s short s short s short s
|
|
void mapcolor short s short s short s short s
|
|
void scrmask short s short s short s short s
|
|
void setvaluator short s short s short s short s
|
|
void viewport short s short s short s short s
|
|
void shaderange short s short s short s short s
|
|
void xfpt4s short s short s short s short s
|
|
void rectfi long s long s long s long s
|
|
void recti long s long s long s long s
|
|
void xfpt4i long s long s long s long s
|
|
void prefposition long s long s long s long s
|
|
#
|
|
void arc float s float s float s short s short s
|
|
void arcf float s float s float s short s short s
|
|
void arcfi long s long s long s short s short s
|
|
void arci long s long s long s short s short s
|
|
#
|
|
void bbox2 short s short s float s float s float s float s
|
|
void bbox2i short s short s long s long s long s long s
|
|
void bbox2s short s short s short s short s short s short s
|
|
void blink short s short s short s short s short s
|
|
void ortho float s float s float s float s float s float s
|
|
void window float s float s float s float s float s float s
|
|
void lookat float s float s float s float s float s float s short s
|
|
#
|
|
void perspective short s float s float s float s
|
|
void polarview float s short s short s short s
|
|
# XXX getichararray not supported
|
|
#void writeRGB short s char s[arg1] char s[arg1] char s[arg1]
|
|
#
|
|
void arcfs short s short s short s short s short s
|
|
void arcs short s short s short s short s short s
|
|
void rectcopy short s short s short s short s short s short s
|
|
if !solaris void RGBcursor short s short s short s short s short s short s short s
|
|
#
|
|
long getbutton short s
|
|
long getcmmode
|
|
long getlsbackup
|
|
long getresetls
|
|
long getdcm
|
|
long getzbuffer
|
|
long ismex
|
|
long isobj long s
|
|
long isqueued short s
|
|
long istag long s
|
|
#
|
|
long genobj
|
|
long gentag
|
|
long getbuffer
|
|
long getcolor
|
|
long getdisplaymode
|
|
long getfont
|
|
long getheight
|
|
long gethitcode
|
|
long getlstyle
|
|
long getlwidth
|
|
long getmap
|
|
long getplanes
|
|
long getwritemask
|
|
long qtest
|
|
long getlsrepeat
|
|
long getmonitor
|
|
long getopenobj
|
|
long getpattern
|
|
long winget
|
|
long winattach
|
|
long getothermonitor
|
|
long newpup
|
|
#
|
|
long getvaluator short s
|
|
void winset long s
|
|
long dopup long s
|
|
void getdepth short r short r
|
|
void getcpos short r short r
|
|
void getsize long r long r
|
|
void getorigin long r long r
|
|
void getviewport short r short r short r short r
|
|
if !solaris void gettp short r short r short r short r
|
|
void getgpos float r float r float r float r
|
|
void winposition long s long s long s long s
|
|
void gRGBcolor short r short r short r
|
|
void gRGBmask short r short r short r
|
|
void getscrmask short r short r short r short r
|
|
###void gRGBcursor short r short r short r short r short r short r short r short r
|
|
void getmcolor short s short r short r short r
|
|
void mapw long s short s short s float r float r float r float r float r float r
|
|
void mapw2 long s short s short s float r float r
|
|
###void defrasterfont short s short s short s Fontchar s[arg3] short s short s[4*arg5]
|
|
###long qread short r
|
|
void getcursor short r u_short r u_short r long r
|
|
#
|
|
# For these we receive arrays of stuff
|
|
#
|
|
###void getdev long s short s[arg1] short r[arg1]
|
|
#XXX not generated correctly yet
|
|
#void getmatrix float r[16]
|
|
###long readpixels short s short r[retval]
|
|
###long readRGB short s char r[retval] char r[retval] char r[retval]
|
|
###long blkqread short s short r[arg1]
|
|
#
|
|
# New 4D routines
|
|
#
|
|
void cmode
|
|
void concave long s
|
|
void curstype long s
|
|
void drawmode long s
|
|
void gammaramp short s[256] short s[256] short s[256]
|
|
long getbackface
|
|
long getdescender
|
|
long getdrawmode
|
|
long getmmode
|
|
long getsm
|
|
long getvideo long s
|
|
void imakebackground
|
|
void lmbind short s short s
|
|
void lmdef long s long s long s float s[arg3]
|
|
void mmode long s
|
|
void normal float s[3]
|
|
void overlay long s
|
|
void RGBrange short s short s short s short s short s short s short s short s
|
|
if !solaris void setvideo long s long s
|
|
void shademodel long s
|
|
void underlay long s
|
|
#
|
|
# New Personal Iris/GT Routines
|
|
#
|
|
void bgnclosedline
|
|
void bgnline
|
|
void bgnpoint
|
|
void bgnpolygon
|
|
void bgnsurface
|
|
void bgntmesh
|
|
void bgntrim
|
|
void endclosedline
|
|
void endline
|
|
void endpoint
|
|
void endpolygon
|
|
void endsurface
|
|
void endtmesh
|
|
void endtrim
|
|
void blendfunction long s long s
|
|
void c3f float s[3]
|
|
void c3i long s[3]
|
|
void c3s short s[3]
|
|
void c4f float s[4]
|
|
void c4i long s[4]
|
|
void c4s short s[4]
|
|
void colorf float s
|
|
void cpack long s
|
|
void czclear long s long s
|
|
void dglclose long s
|
|
long dglopen char *s long s
|
|
long getgdesc long s
|
|
void getnurbsproperty long s float r
|
|
void glcompat long s long s
|
|
void iconsize long s long s
|
|
void icontitle char *s
|
|
void lRGBrange short s short s short s short s short s short s long s long s
|
|
void linesmooth long s
|
|
void lmcolor long s
|
|
void logicop long s
|
|
###long lrectread short s short s short s short s long r[retval]
|
|
###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
|
|
### Now manual, with string last arg
|
|
###long rectread short s short s short s short s short r[retval]
|
|
###void rectwrite short s short s short s short s short s[(arg2-arg1+1)*(arg4-arg3+1)]
|
|
void lsetdepth long s long s
|
|
void lshaderange short s short s long s long s
|
|
void n3f float s[3]
|
|
void noborder
|
|
void pntsmooth long s
|
|
void readsource long s
|
|
void rectzoom float s float s
|
|
void sbox float s float s float s float s
|
|
void sboxi long s long s long s long s
|
|
void sboxs short s short s short s short s
|
|
void sboxf float s float s float s float s
|
|
void sboxfi long s long s long s long s
|
|
void sboxfs short s short s short s short s
|
|
void setnurbsproperty long s float s
|
|
void setpup long s long s long s
|
|
void smoothline long s
|
|
void subpixel long s
|
|
void swaptmesh
|
|
long swinopen long s
|
|
void v2f float s[2]
|
|
void v2i long s[2]
|
|
void v2s short s[2]
|
|
void v3f float s[3]
|
|
void v3i long s[3]
|
|
void v3s short s[3]
|
|
void v4f float s[4]
|
|
void v4i long s[4]
|
|
void v4s short s[4]
|
|
void videocmd long s
|
|
long windepth long s
|
|
void wmpack long s
|
|
void zdraw long s
|
|
void zfunction long s
|
|
void zsource long s
|
|
void zwritemask long s
|
|
#
|
|
# uses doubles
|
|
#
|
|
void v2d double s[2]
|
|
void v3d double s[3]
|
|
void v4d double s[4]
|
|
#
|
|
# Why isn't this here?
|
|
#
|
|
void pixmode long s long s
|
|
#
|
|
# New in IRIX 4.0
|
|
#
|
|
long qgetfd
|
|
void dither long s
|