--- ray/src/rt/data.c 1990/04/03 17:24:35 1.4 +++ ray/src/rt/data.c 1991/01/15 22:24:19 1.8 @@ -1,4 +1,4 @@ -/* Copyright (c) 1986 Regents of the University of California */ +/* Copyright (c) 1991 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -55,7 +55,7 @@ char *dname; * For irregularly spaced points, the following can be * substituted for begi endi ni: * - * @ ni p0i p1i .. pni + * 0 0 ni p0i p1i .. pni */ if ((dfname = getpath(dname, libpath, R_OK)) == NULL) { @@ -82,10 +82,12 @@ char *dname; for (i = 0; i < dp->nd; i++) { if (fscanf(fp, "%lf %lf %d", &dp->dim[i].org, &dp->dim[i].siz, - &dp->dim[i].ne) == 3) { - dp->dim[i].siz -= dp->dim[i].org; - dp->dim[i].p = NULL; - } else if (fscanf(fp, "@ %d", &dp->dim[i].ne) == 1) { + &dp->dim[i].ne) != 3) + goto scanerr; + if (dp->dim[i].ne < 2) + goto scanerr; + asize *= dp->dim[i].ne; + if ((dp->dim[i].siz -= dp->dim[i].org) == 0) { dp->dim[i].p = (double *)malloc(dp->dim[i].ne*sizeof(double)); if (dp->dim[i].p == NULL) goto memerr; @@ -100,10 +102,7 @@ char *dname; dp->dim[i].siz = dp->dim[i].p[dp->dim[i].ne-1] - dp->dim[i].p[0]; } else - goto scanerr; - if (dp->dim[i].siz == 0.0 || dp->dim[i].ne < 2) - goto scanerr; - asize *= dp->dim[i].ne; + dp->dim[i].p = NULL; } if ((dp->arr = (DATATYPE *)malloc(asize*sizeof(DATATYPE))) == NULL) goto memerr; @@ -125,6 +124,17 @@ scanerr: } +static double inpaspect; /* aspect ratio of input picture */ + +static +headaspect(s) /* check string for aspect ratio */ +char *s; +{ + if (isaspect(s)) + inpaspect *= aspectval(s); +} + + DATARRAY * getpict(pname) /* get picture pname */ char *pname; @@ -158,22 +168,24 @@ char *pname; error(SYSTEM, errmsg); } /* get dimensions */ - getheader(fp, NULL); + inpaspect = 1.0; + getheader(fp, headaspect); if (fgetresolu(&width, &height, fp) != (YMAJOR|YDECR)) goto readerr; for (i = 0; i < 3; i++) { pp[i].nd = 2; - pp[i].dim[0].ne = width; - pp[i].dim[1].ne = height; + pp[i].dim[0].ne = height; + pp[i].dim[1].ne = width; pp[i].dim[0].org = pp[i].dim[1].org = 0.0; - if (width <= height) { - pp[i].dim[0].siz = 1.0; - pp[i].dim[1].siz = (double)height/width; - } else { - pp[i].dim[0].siz = (double)width/height; + if (width <= height*inpaspect) { + pp[i].dim[0].siz = inpaspect*(double)height/width; pp[i].dim[1].siz = 1.0; + } else { + pp[i].dim[0].siz = 1.0; + pp[i].dim[1].siz = (double)width/height/inpaspect; } + pp[i].dim[0].p = pp[i].dim[1].p = NULL; pp[i].arr = (DATATYPE *)malloc(width*height*sizeof(DATATYPE)); if (pp[i].arr == NULL) goto memerr; @@ -186,7 +198,7 @@ char *pname; goto readerr; for (x = 0; x < width; x++) for (i = 0; i < 3; i++) - pp[i].arr[x*height+y] = colval(scanin[x],i); + pp[i].arr[y*width+x] = colval(scanin[x],i); } free((char *)scanin); fclose(fp); @@ -254,6 +266,7 @@ double *pt; { DATARRAY sd; int asize; + int lower, upper; register int i; double x, y, y0, y1; /* set up dimensions for recursion */ @@ -275,20 +288,22 @@ double *pt; else if (i > dp->dim[0].ne - 2) i = dp->dim[0].ne - 2; } else { /* unevenly spaced points */ - if (dp->dim[0].siz > 0.0) - for (i = 0; i < dp->dim[0].ne; i++) - if (pt[0] < dp->dim[0].p[i]) - break; - else - for (i = 0; i < dp->dim[0].ne; i++) - if (pt[0] >= dp->dim[0].p[i]) - break; - if (i <= 0) - i = 0; - else if (i >= dp->dim[0].ne) + if (dp->dim[0].siz > 0.0) { + lower = 0; + upper = dp->dim[0].ne; + } else { + lower = dp->dim[0].ne; + upper = 0; + } + do { + i = (lower + upper) >> 1; + if (pt[0] >= dp->dim[0].p[i]) + lower = i; + else + upper = i; + } while (i != (lower + upper) >> 1); + if (i > dp->dim[0].ne - 2) i = dp->dim[0].ne - 2; - else - i--; x = i + (pt[0] - dp->dim[0].p[i]) / (dp->dim[0].p[i+1] - dp->dim[0].p[i]); }