You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1364 lines
32 KiB
1364 lines
32 KiB
|
|
/* |
|
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> |
|
|
|
#ifdef __sgi |
|
extern int devport(); |
|
extern int textwritemask(); |
|
extern int pagewritemask(); |
|
extern int gewrite(); |
|
extern int gettp(); |
|
#endif |
|
|
|
#include "Python.h" |
|
#include "cgensupport.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 PyObject * |
|
gl_qread(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
long retval; |
|
short arg1 ; |
|
Py_BEGIN_ALLOW_THREADS |
|
retval = qread( & arg1 ); |
|
Py_END_ALLOW_THREADS |
|
{ PyObject *v = PyTuple_New( 2 ); |
|
if (v == NULL) return NULL; |
|
PyTuple_SetItem(v, 0, mknewlongobject(retval)); |
|
PyTuple_SetItem(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 PyObject * |
|
gl_varray(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
PyObject *v, *w=NULL; |
|
int i, n, width; |
|
double vec[3]; |
|
PyObject * (*getitem)(PyObject *, int); |
|
|
|
if (!PyArg_GetObject(args, 1, 0, &v)) |
|
return NULL; |
|
|
|
if (PyList_Check(v)) { |
|
n = PyList_Size(v); |
|
getitem = PyList_GetItem; |
|
} |
|
else if (PyTuple_Check(v)) { |
|
n = PyTuple_Size(v); |
|
getitem = PyTuple_GetItem; |
|
} |
|
else { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
|
|
if (n == 0) { |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
if (n > 0) |
|
w = (*getitem)(v, 0); |
|
|
|
width = 0; |
|
if (w == NULL) { |
|
} |
|
else if (PyList_Check(w)) { |
|
width = PyList_Size(w); |
|
} |
|
else if (PyTuple_Check(w)) { |
|
width = PyTuple_Size(w); |
|
} |
|
|
|
switch (width) { |
|
case 2: |
|
vec[2] = 0.0; |
|
/* Fall through */ |
|
case 3: |
|
break; |
|
default: |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
|
|
for (i = 0; i < n; i++) { |
|
w = (*getitem)(v, i); |
|
if (!PyArg_GetDoubleArray(w, 1, 0, width, vec)) |
|
return NULL; |
|
v3d(vec); |
|
} |
|
|
|
Py_INCREF(Py_None); |
|
return Py_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 PyObject *gen_nvarray(); /* Forward */ |
|
|
|
% nvarray |
|
|
|
static PyObject * |
|
gl_nvarray(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
return gen_nvarray(args, 0); |
|
} |
|
|
|
% vnarray |
|
|
|
static PyObject * |
|
gl_vnarray(self, args) |
|
PyObject *self; |
|
PyObject *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 PyObject * |
|
gen_nvarray(args, inorm) |
|
PyObject *args; |
|
int inorm; |
|
{ |
|
PyObject *v, *w, *wnorm, *wvec; |
|
int i, n; |
|
float norm[3], vec[3]; |
|
PyObject * (*getitem)(PyObject *, int); |
|
|
|
if (!PyArg_GetObject(args, 1, 0, &v)) |
|
return NULL; |
|
|
|
if (PyList_Check(v)) { |
|
n = PyList_Size(v); |
|
getitem = PyList_GetItem; |
|
} |
|
else if (PyTuple_Check(v)) { |
|
n = PyTuple_Size(v); |
|
getitem = PyTuple_GetItem; |
|
} |
|
else { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
|
|
for (i = 0; i < n; i++) { |
|
w = (*getitem)(v, i); |
|
if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
wnorm = PyTuple_GetItem(w, inorm); |
|
wvec = PyTuple_GetItem(w, 1 - inorm); |
|
if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) || |
|
!PyArg_GetFloatArray(wvec, 1, 0, 3, vec)) |
|
return NULL; |
|
n3f(norm); |
|
v3f(vec); |
|
} |
|
|
|
Py_INCREF(Py_None); |
|
return Py_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 PyObject * |
|
gl_nurbssurface(self, args) |
|
PyObject *self; |
|
PyObject *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; |
|
PyObject *v, *w, *pt; |
|
double *pnext; |
|
if (!PyArg_GetLongArraySize(args, 6, 0, &arg1)) |
|
return NULL; |
|
if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2)) |
|
return NULL; |
|
if (!PyArg_GetLongArraySize(args, 6, 1, &arg3)) |
|
return NULL; |
|
if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 6, 3, &arg6)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 6, 4, &arg7)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 6, 5, &arg8)) |
|
return NULL; |
|
if (arg8 == N_XYZ) |
|
ncoords = 3; |
|
else if (arg8 == N_XYZW) |
|
ncoords = 4; |
|
else { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
s_nctl = arg1 - arg6; |
|
t_nctl = arg3 - arg7; |
|
if (!PyArg_GetObject(args, 6, 2, &v)) |
|
return NULL; |
|
if (!PyList_Check(v) || PyList_Size(v) != s_nctl) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
pnext = arg5; |
|
for (s = 0; s < s_nctl; s++) { |
|
w = PyList_GetItem(v, s); |
|
if (w == NULL || !PyList_Check(w) || |
|
PyList_Size(w) != t_nctl) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
for (t = 0; t < t_nctl; t++) { |
|
pt = PyList_GetItem(w, t); |
|
if (!PyArg_GetDoubleArray(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 ); |
|
PyMem_DEL(arg2); |
|
PyMem_DEL(arg4); |
|
PyMem_DEL(arg5); |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
|
|
/* nurbscurve(knots, ctlpoints, order, type). |
|
The length of ctlpoints is len(knots)-order. */ |
|
|
|
%nurbscurve |
|
|
|
static PyObject * |
|
gl_nurbscurve(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
long arg1 ; |
|
double * arg2 ; |
|
long arg3 ; |
|
double * arg4 ; |
|
long arg5 ; |
|
long arg6 ; |
|
int ncoords, npoints; |
|
int i; |
|
PyObject *v; |
|
double *pnext; |
|
if (!PyArg_GetLongArraySize(args, 4, 0, &arg1)) |
|
return NULL; |
|
if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 4, 2, &arg5)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 4, 3, &arg6)) |
|
return NULL; |
|
if (arg6 == N_ST) |
|
ncoords = 2; |
|
else if (arg6 == N_STW) |
|
ncoords = 3; |
|
else { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
npoints = arg1 - arg5; |
|
if (!PyArg_GetObject(args, 4, 1, &v)) |
|
return NULL; |
|
if (!PyList_Check(v) || PyList_Size(v) != npoints) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
pnext = arg4; |
|
for (i = 0; i < npoints; i++) { |
|
if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext)) |
|
return NULL; |
|
pnext += ncoords; |
|
} |
|
arg3 = (sizeof(double)) * ncoords; |
|
nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); |
|
PyMem_DEL(arg2); |
|
PyMem_DEL(arg4); |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
|
|
/* pwlcurve(points, type). |
|
Points is a list of points. Type must be N_ST. */ |
|
|
|
%pwlcurve |
|
|
|
static PyObject * |
|
gl_pwlcurve(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
PyObject *v; |
|
long type; |
|
double *data, *pnext; |
|
long npoints, ncoords; |
|
int i; |
|
if (!PyArg_GetObject(args, 2, 0, &v)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 2, 1, &type)) |
|
return NULL; |
|
if (!PyList_Check(v)) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
npoints = PyList_Size(v); |
|
if (type == N_ST) |
|
ncoords = 2; |
|
else { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
pnext = data; |
|
for (i = 0; i < npoints; i++) { |
|
if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext)) |
|
return NULL; |
|
pnext += ncoords; |
|
} |
|
pwlcurve(npoints, data, sizeof(double)*ncoords, type); |
|
PyMem_DEL(data); |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
|
|
|
|
/* Picking and Selecting */ |
|
|
|
static short *pickbuffer = NULL; |
|
static long pickbuffersize; |
|
|
|
static PyObject * |
|
pick_select(args, func) |
|
PyObject *args; |
|
void (*func)(); |
|
{ |
|
if (!PyArg_GetLong(args, 1, 0, &pickbuffersize)) |
|
return NULL; |
|
if (pickbuffer != NULL) { |
|
PyErr_SetString(PyExc_RuntimeError, |
|
"pick/gselect: already picking/selecting"); |
|
return NULL; |
|
} |
|
if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
(*func)(pickbuffer, pickbuffersize); |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
|
|
static PyObject * |
|
endpick_select(args, func) |
|
PyObject *args; |
|
long (*func)(); |
|
{ |
|
PyObject *v, *w; |
|
int i, nhits, n; |
|
if (!PyArg_NoArgs(args)) |
|
return NULL; |
|
if (pickbuffer == NULL) { |
|
PyErr_SetString(PyExc_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 = PyList_New(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 = PyInt_FromLong((long)pickbuffer[i]); |
|
if (w == NULL) { |
|
Py_DECREF(v); |
|
return NULL; |
|
} |
|
PyList_SetItem(v, i, w); |
|
} |
|
PyMem_DEL(pickbuffer); |
|
pickbuffer = NULL; |
|
return v; |
|
} |
|
|
|
extern void pick(), gselect(); |
|
extern long endpick(), endselect(); |
|
|
|
%pick |
|
static PyObject *gl_pick(self, args) PyObject *self, *args; { |
|
return pick_select(args, pick); |
|
} |
|
|
|
%endpick |
|
static PyObject *gl_endpick(self, args) PyObject *self, *args; { |
|
return endpick_select(args, endpick); |
|
} |
|
|
|
%gselect |
|
static PyObject *gl_gselect(self, args) PyObject *self, *args; { |
|
return pick_select(args, gselect); |
|
} |
|
|
|
%endselect |
|
static PyObject *gl_endselect(self, args) PyObject *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 PyObject * |
|
gl_getmatrix(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
Matrix arg1; |
|
PyObject *v, *w; |
|
int i, j; |
|
getmatrix( arg1 ); |
|
v = PyList_New(16); |
|
if (v == NULL) { |
|
return PyErr_NoMemory(); |
|
} |
|
for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { |
|
w = mknewfloatobject(arg1[i][j]); |
|
if (w == NULL) { |
|
Py_DECREF(v); |
|
return NULL; |
|
} |
|
PyList_SetItem(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 PyObject * |
|
gl_altgetmatrix(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
Matrix arg1; |
|
PyObject *v, *w; |
|
int i, j; |
|
getmatrix( arg1 ); |
|
v = PyList_New(4); |
|
if (v == NULL) { |
|
return NULL; |
|
} |
|
for (i = 0; i < 4; i++) { |
|
w = PyList_New(4); |
|
if (w == NULL) { |
|
Py_DECREF(v); |
|
return NULL; |
|
} |
|
PyList_SetItem(v, i, w); |
|
} |
|
for (i = 0; i < 4; i++) { |
|
for (j = 0; j < 4; j++) { |
|
w = mknewfloatobject(arg1[i][j]); |
|
if (w == NULL) { |
|
Py_DECREF(v); |
|
return NULL; |
|
} |
|
PyList_SetItem(PyList_GetItem(v, i), j, w); |
|
} |
|
} |
|
return v; |
|
} |
|
|
|
% lrectwrite |
|
|
|
static PyObject * |
|
gl_lrectwrite(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
short x1 ; |
|
short y1 ; |
|
short x2 ; |
|
short y2 ; |
|
string parray ; |
|
PyObject *s; |
|
#if 0 |
|
int pixcount; |
|
#endif |
|
if (!PyArg_GetShort(args, 5, 0, &x1)) |
|
return NULL; |
|
if (!PyArg_GetShort(args, 5, 1, &y1)) |
|
return NULL; |
|
if (!PyArg_GetShort(args, 5, 2, &x2)) |
|
return NULL; |
|
if (!PyArg_GetShort(args, 5, 3, &y2)) |
|
return NULL; |
|
if (!PyArg_GetString(args, 5, 4, &parray)) |
|
return NULL; |
|
if (!PyArg_GetObject(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 (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) { |
|
PyErr_SetString(PyExc_RuntimeError, |
|
"string arg to lrectwrite has wrong size"); |
|
return NULL; |
|
} |
|
#endif |
|
lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray ); |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
|
|
% lrectread |
|
|
|
static PyObject * |
|
gl_lrectread(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
short x1 ; |
|
short y1 ; |
|
short x2 ; |
|
short y2 ; |
|
PyObject *parray; |
|
int pixcount; |
|
if (!PyArg_GetShort(args, 4, 0, &x1)) |
|
return NULL; |
|
if (!PyArg_GetShort(args, 4, 1, &y1)) |
|
return NULL; |
|
if (!PyArg_GetShort(args, 4, 2, &x2)) |
|
return NULL; |
|
if (!PyArg_GetShort(args, 4, 3, &y2)) |
|
return NULL; |
|
pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); |
|
parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); |
|
if (parray == NULL) |
|
return NULL; /* No memory */ |
|
lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray)); |
|
return parray; |
|
} |
|
|
|
% readdisplay |
|
|
|
static PyObject * |
|
gl_readdisplay(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
short x1, y1, x2, y2; |
|
unsigned long *parray, hints; |
|
long size, size_ret; |
|
PyObject *rv; |
|
|
|
if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) ) |
|
return 0; |
|
size = (long)(x2+1-x1) * (long)(y2+1-y1); |
|
rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long)); |
|
if ( rv == NULL ) |
|
return NULL; |
|
parray = (unsigned long *)PyString_AsString(rv); |
|
size_ret = readdisplay(x1, y1, x2, y2, parray, hints); |
|
if ( size_ret != size ) { |
|
printf("gl_readdisplay: got %ld pixels, expected %ld\n", |
|
size_ret, size); |
|
PyErr_SetString(PyExc_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 PyObject * |
|
gl_packrect(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
long width, height, packfactor; |
|
char *s; |
|
PyObject *unpacked, *packed; |
|
int pixcount, packedcount, x, y, r, g, b; |
|
unsigned long pixel; |
|
unsigned char *p; |
|
unsigned long *parray; |
|
if (!PyArg_GetLong(args, 4, 0, &width)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 4, 1, &height)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 4, 2, &packfactor)) |
|
return NULL; |
|
if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */ |
|
return NULL; |
|
if (!PyArg_GetObject(args, 4, 3, &unpacked)) |
|
return NULL; |
|
if (width <= 0 || height <= 0 || packfactor <= 0) { |
|
PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0"); |
|
return NULL; |
|
} |
|
pixcount = width*height; |
|
packedcount = ((width+packfactor-1)/packfactor) * |
|
((height+packfactor-1)/packfactor); |
|
if (PyString_Size(unpacked) != pixcount*sizeof(long)) { |
|
PyErr_SetString(PyExc_RuntimeError, |
|
"string arg to packrect has wrong size"); |
|
return NULL; |
|
} |
|
packed = PyString_FromStringAndSize((char *)NULL, packedcount); |
|
if (packed == NULL) |
|
return NULL; |
|
parray = (unsigned long *) PyString_AsString(unpacked); |
|
p = (unsigned char *) PyString_AsString(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 PyObject * |
|
gl_unpackrect(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
long width, height, packfactor; |
|
char *s; |
|
PyObject *unpacked, *packed; |
|
int pixcount, packedcount; |
|
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 (!PyArg_GetLong(args, 4, 0, &width)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 4, 1, &height)) |
|
return NULL; |
|
if (!PyArg_GetLong(args, 4, 2, &packfactor)) |
|
return NULL; |
|
if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */ |
|
return NULL; |
|
if (!PyArg_GetObject(args, 4, 3, &packed)) |
|
return NULL; |
|
if (width <= 0 || height <= 0 || packfactor <= 0) { |
|
PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0"); |
|
return NULL; |
|
} |
|
pixcount = width*height; |
|
packedcount = ((width+packfactor-1)/packfactor) * |
|
((height+packfactor-1)/packfactor); |
|
if (PyString_Size(packed) != packedcount) { |
|
PyErr_SetString(PyExc_RuntimeError, |
|
"string arg to unpackrect has wrong size"); |
|
return NULL; |
|
} |
|
unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); |
|
if (unpacked == NULL) |
|
return NULL; |
|
parray = (unsigned long *) PyString_AsString(unpacked); |
|
p = (unsigned char *) PyString_AsString(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 PyObject * |
|
gl_gversion(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
char buf[20]; |
|
gversion(buf); |
|
return PyString_FromString(buf); |
|
} |
|
|
|
|
|
/* void clear - Manual because of clash with termcap */ |
|
%clear |
|
static PyObject * |
|
gl_clear(self, args) |
|
PyObject *self; |
|
PyObject *args; |
|
{ |
|
__GLclear( ); |
|
Py_INCREF(Py_None); |
|
return Py_None; |
|
} |
|
|
|
/* 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 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
|
|
|