--- ray/src/common/image.c 1996/01/10 19:25:57 2.11 +++ ray/src/common/image.c 2004/01/01 19:47:05 2.25 @@ -1,21 +1,18 @@ -/* 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.25 2004/01/01 19:47:05 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 "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])) @@ -30,8 +27,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 +105,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,12 +197,13 @@ double x, y; } +void viewloc(ip, v, p) /* find image location for point */ FVECT ip; register VIEW *v; FVECT p; { - double d; + double d, d2; FVECT disp; disp[0] = p[0] - v->vp[0]; @@ -218,7 +216,7 @@ FVECT p; break; case VT_PER: /* perspective view */ d = DOT(disp,v->vdir); - ip[2] = sqrt(DOT(disp,disp)); + ip[2] = VLEN(disp); if (d < 0.0) { /* fold pyramid */ ip[2] = -ip[2]; d = -d; @@ -240,15 +238,13 @@ FVECT p; ip[2] -= v->vfore; break; case VT_CYL: /* cylindrical panorama */ - ip[2] = DOT(disp,v->vdir); d = DOT(disp,v->hvec); - ip[0] = 180.0/PI * atan2(d,ip[2]) / v->horiz + 0.5 - v->hoff; - ip[1] = DOT(disp,v->vvec)/v->vn2 + 0.5 - v->voff; - if (v->vfore > FTINY) - ip[2] = sqrt(DOT(disp,disp)) * - (1.0 - v->vfore/sqrt(d*d + ip[2]*ip[2])); - else - ip[2] = sqrt(DOT(disp,disp)); + d2 = DOT(disp,v->vdir); + ip[0] = 180.0/PI * atan2(d,d2) / v->horiz + 0.5 - v->hoff; + 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); + ip[2] *= (1.0 - v->vfore*d); return; case VT_ANG: /* angular fisheye */ ip[0] = 0.5 - v->hoff; @@ -271,29 +267,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; @@ -303,11 +301,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 { @@ -394,12 +392,15 @@ register char *s; int na; int nvopts = 0; + while (*s == ' ') + s++; if (*s != '-') - s = sskip(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 == ' ') @@ -416,6 +417,7 @@ register char *s; } +void fprintview(vp, fp) /* write out view parameters */ register VIEW *vp; FILE *fp; @@ -488,7 +490,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,13 +521,14 @@ struct myview { }; -static +static int gethview(s, v) /* get view from header */ char *s; register struct myview *v; { if (isview(s) && sscanview(v->hv, s) > 0) v->ok++; + return(0); } @@ -538,13 +541,15 @@ 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; mvs.ok = 0; - getheader(fp, gethview, &mvs); + getheader(fp, (int (*)(char *, char *))&gethview, (char *)&mvs); if (rp != NULL && !fgetsresolu(rp, fp)) mvs.ok = 0;