--- ray/src/rt/data.c 1991/05/23 08:14:57 1.9 +++ ray/src/rt/data.c 1991/11/11 14:02:43 1.11 @@ -14,9 +14,14 @@ static char SCCSid[] = "$SunId$ LBL"; #include "color.h" +#include "resolu.h" + #include "data.h" +extern char *fgetword(); +extern double atof(); + extern char *libpath; /* library search path */ static DATARRAY *dlist = NULL; /* data array list */ @@ -28,6 +33,7 @@ DATARRAY * getdata(dname) /* get data array dname */ char *dname; { + char word[64]; char *dfname; FILE *fp; int asize; @@ -72,18 +78,24 @@ char *dname; error(SYSTEM, errmsg); } /* get dimensions */ - if (fscanf(fp, "%d", &dp->nd) != 1) + if (fgetword(word, sizeof(word), fp) == NULL || !isint(word)) goto scanerr; + dp->nd = atoi(word); if (dp->nd <= 0 || dp->nd > MAXDDIM) { sprintf(errmsg, "bad number of dimensions for \"%s\"", dname); error(USER, errmsg); } asize = 1; 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) + if (fgetword(word, sizeof(word), fp) == NULL || !isflt(word)) goto scanerr; + dp->dim[i].org = atof(word); + if (fgetword(word, sizeof(word), fp) == NULL || !isflt(word)) + goto scanerr; + dp->dim[i].siz = atof(word); + if (fgetword(word, sizeof(word), fp) == NULL || !isint(word)) + goto scanerr; + dp->dim[i].ne = atoi(word); if (dp->dim[i].ne < 2) goto scanerr; asize *= dp->dim[i].ne; @@ -91,9 +103,12 @@ char *dname; dp->dim[i].p = (double *)malloc(dp->dim[i].ne*sizeof(double)); if (dp->dim[i].p == NULL) goto memerr; - for (j = 0; j < dp->dim[i].ne; j++) - if (fscanf(fp, "%lf", &dp->dim[i].p[j]) != 1) + for (j = 0; j < dp->dim[i].ne; j++) { + if (fgetword(word, sizeof(word), fp) == NULL || + !isflt(word)) goto scanerr; + dp->dim[i].p[j] = atof(word); + } for (j = 1; j < dp->dim[i].ne-1; j++) if ((dp->dim[i].p[j-1] < dp->dim[i].p[j]) != (dp->dim[i].p[j] < dp->dim[i].p[j+1])) @@ -107,10 +122,11 @@ char *dname; if ((dp->arr = (DATATYPE *)malloc(asize*sizeof(DATATYPE))) == NULL) goto memerr; - for (i = 0; i < asize; i++) - if (fscanf(fp, DSCANF, &dp->arr[i]) != 1) + for (i = 0; i < asize; i++) { + if (fgetword(word, sizeof(word), fp) == NULL || !isflt(word)) goto scanerr; - + dp->arr[i] = atof(word); + } fclose(fp); dp->next = dlist; return(dlist = dp); @@ -143,9 +159,11 @@ char *pname; char *pfname; FILE *fp; COLOR *scanin; - int width, height; - int x, y; - register int i; + int sl, ns; + RESOLU inpres; + FLOAT loc[2]; + int y; + register int x, i; register DATARRAY *pp; /* look for array in list */ for (pp = plist; pp != NULL; pp = pp->next) @@ -170,35 +188,45 @@ char *pname; /* get dimensions */ inpaspect = 1.0; getheader(fp, headaspect); - if (fgetresolu(&width, &height, fp) != (YMAJOR|YDECR)) + if (!fgetsresolu(&inpres, fp)) goto readerr; for (i = 0; i < 3; i++) { pp[i].nd = 2; - pp[i].dim[0].ne = height; - pp[i].dim[1].ne = width; + pp[i].dim[0].ne = inpres.yr; + pp[i].dim[1].ne = inpres.xr; pp[i].dim[0].org = pp[i].dim[1].org = 0.0; - if (width <= height*inpaspect) { - pp[i].dim[0].siz = inpaspect*(double)height/width; + if (inpres.xr <= inpres.yr*inpaspect) { + pp[i].dim[0].siz = inpaspect * + (double)inpres.yr/inpres.xr; 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[1].siz = (double)inpres.xr/inpres.yr / + inpaspect; } pp[i].dim[0].p = pp[i].dim[1].p = NULL; - pp[i].arr = (DATATYPE *)malloc(width*height*sizeof(DATATYPE)); + pp[i].arr = (DATATYPE *) + malloc(inpres.xr*inpres.yr*sizeof(DATATYPE)); if (pp[i].arr == NULL) goto memerr; } /* load picture */ - if ((scanin = (COLOR *)malloc(width*sizeof(COLOR))) == NULL) + sl = scanlen(&inpres); + ns = numscans(&inpres); + if ((scanin = (COLOR *)malloc(sl*sizeof(COLOR))) == NULL) goto memerr; - for (y = height-1; y >= 0; y--) { - if (freadscan(scanin, width, fp) < 0) + for (y = 0; y < ns; y++) { + if (freadscan(scanin, sl, fp) < 0) goto readerr; - for (x = 0; x < width; x++) - for (i = 0; i < 3; i++) - pp[i].arr[y*width+x] = colval(scanin[x],i); + for (x = 0; x < sl; x++) { + pix2loc(loc, &inpres, x, y); + i = (int)(loc[1]*inpres.yr)*inpres.xr + + (int)(loc[0]*inpres.xr); + pp[0].arr[i] = colval(scanin[x],RED); + pp[1].arr[i] = colval(scanin[x],GRN); + pp[2].arr[i] = colval(scanin[x],BLU); + } } free((char *)scanin); fclose(fp);