--- ray/src/common/image.c 1998/10/27 08:44:29 2.14 +++ ray/src/common/image.c 2004/06/08 19:48:29 2.28 @@ -1,28 +1,29 @@ -/* Copyright (c) 1996 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: image.c,v 2.28 2004/06/08 19:48:29 greg Exp $"; #endif - /* * image.c - routines for image generation. + * + * External symbols declared in view.h */ -#include "standard.h" +#include "copyright.h" +#include "rtio.h" +#include "rtmath.h" +#include "paths.h" #include "view.h" -#include "resolu.h" -#include "paths.h" - #define FEQ(x,y) (fabs((x)-(y)) <= FTINY) #define VEQ(v,w) (FEQ((v)[0],(w)[0]) && FEQ((v)[1],(w)[1]) \ && FEQ((v)[2],(w)[2])) VIEW stdview = STDVIEW; /* default view parameters */ +static gethfunc gethview; + char * setview(v) /* set hvec and vvec, return message on error */ register VIEW *v; @@ -30,8 +31,7 @@ register VIEW *v; static char ill_horiz[] = "illegal horizontal view size"; static char ill_vert[] = "illegal vertical view size"; - if (v->vfore < -FTINY || v->vaft < -FTINY || - (v->vaft > FTINY && v->vaft <= v->vfore)) + if (v->vaft < -FTINY || (v->vaft > FTINY && v->vaft <= v->vfore)) return("illegal fore/aft clipping plane"); if (normalize(v->vdir) == 0.0) /* normalize direction */ @@ -109,6 +109,7 @@ register VIEW *v; } +void normaspect(va, ap, xp, yp) /* fix pixel aspect or resolution */ double va; /* view aspect ratio */ double *ap; /* pixel aspect in (or out if 0) */ @@ -200,6 +201,7 @@ double x, y; } +void viewloc(ip, v, p) /* find image location for point */ FVECT ip; register VIEW *v; @@ -246,8 +248,7 @@ FVECT p; d = 1.0/sqrt(d*d + d2*d2); ip[1] = DOT(disp,v->vvec)*d/v->vn2 + 0.5 - v->voff; ip[2] = VLEN(disp); - if (v->vfore > FTINY) - ip[2] *= (1.0 - v->vfore*d); + ip[2] *= (1.0 - v->vfore*d); return; case VT_ANG: /* angular fisheye */ ip[0] = 0.5 - v->hoff; @@ -270,29 +271,31 @@ FVECT p; } +void pix2loc(loc, rp, px, py) /* compute image location from pixel pos. */ -FLOAT loc[2]; +RREAL loc[2]; register RESOLU *rp; int px, py; { register int x, y; - if (rp->or & YMAJOR) { + if (rp->rt & YMAJOR) { x = px; y = py; } else { x = py; y = px; } - if (rp->or & XDECR) + if (rp->rt & XDECR) x = rp->xr-1 - x; - if (rp->or & YDECR) + if (rp->rt & YDECR) y = rp->yr-1 - y; loc[0] = (x+.5)/rp->xr; loc[1] = (y+.5)/rp->yr; } +void loc2pix(pp, rp, lx, ly) /* compute pixel pos. from image location */ int pp[2]; register RESOLU *rp; @@ -302,11 +305,11 @@ double lx, ly; x = lx * rp->xr; y = ly * rp->yr; - if (rp->or & XDECR) + if (rp->rt & XDECR) x = rp->xr-1 - x; - if (rp->or & YDECR) + if (rp->rt & YDECR) y = rp->yr-1 - y; - if (rp->or & YMAJOR) { + if (rp->rt & YMAJOR) { pp[0] = x; pp[1] = y; } else { @@ -393,12 +396,15 @@ register char *s; int na; int nvopts = 0; + while (*s == ' ') + s++; if (*s != '-') s = sskip2(s,1); while (*s) { ac = 0; do { - av[ac++] = s; + if (ac || *s == '-') + av[ac++] = s; while (*s && *s != ' ') s++; while (*s == ' ') @@ -415,6 +421,7 @@ register char *s; } +void fprintview(vp, fp) /* write out view parameters */ register VIEW *vp; FILE *fp; @@ -487,7 +494,7 @@ int isview(s) /* is this a view string? */ char *s; { - static char *altname[]={NULL,VIEWSTR,"rpict","rview","pinterp",NULL}; + static char *altname[]={NULL,VIEWSTR,"rpict","rview","rvu","rpiece","pinterp",NULL}; extern char *progname; register char *cp; register char **an; @@ -519,12 +526,13 @@ struct myview { static int -gethview(s, v) /* get view from header */ -char *s; -register struct myview *v; +gethview( /* get view from header */ + char *s, + void *v +) { - if (isview(s) && sscanview(v->hv, s) > 0) - v->ok++; + if (isview(s) && sscanview(((struct myview*)v)->hv, s) > 0) + ((struct myview*)v)->ok++; return(0); } @@ -538,7 +546,9 @@ RESOLU *rp; struct myview mvs; FILE *fp; - if ((fp = fopen(fname, "r")) == NULL) + if (fname == NULL || !strcmp(fname, "-")) + fp = stdin; + else if ((fp = fopen(fname, "r")) == NULL) return(-1); mvs.hv = vp;