ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/data.c
(Generate patch)

Comparing ray/src/rt/data.c (file contents):
Revision 1.4 by greg, Tue Apr 3 17:24:35 1990 UTC vs.
Revision 1.6 by greg, Fri Apr 6 14:12:21 1990 UTC

# Line 55 | Line 55 | char  *dname;
55           *      For irregularly spaced points, the following can be
56           *  substituted for begi endi ni:
57           *
58 <         *              @ ni p0i p1i .. pni
58 >         *              0 0 ni p0i p1i .. pni
59           */
60  
61          if ((dfname = getpath(dname, libpath, R_OK)) == NULL) {
# Line 82 | Line 82 | char  *dname;
82          for (i = 0; i < dp->nd; i++) {
83                  if (fscanf(fp, "%lf %lf %d",
84                                  &dp->dim[i].org, &dp->dim[i].siz,
85 <                                &dp->dim[i].ne) == 3) {
86 <                        dp->dim[i].siz -= dp->dim[i].org;
87 <                        dp->dim[i].p = NULL;
88 <                } else if (fscanf(fp, "@ %d", &dp->dim[i].ne) == 1) {
85 >                                &dp->dim[i].ne) != 3)
86 >                        goto scanerr;
87 >                if (dp->dim[i].ne < 2)
88 >                        goto scanerr;
89 >                asize *= dp->dim[i].ne;
90 >                if ((dp->dim[i].siz -= dp->dim[i].org) == 0) {
91                          dp->dim[i].p = (double *)malloc(dp->dim[i].ne*sizeof(double));
92                          if (dp->dim[i].p == NULL)
93                                  goto memerr;
# Line 100 | Line 102 | char  *dname;
102                          dp->dim[i].siz = dp->dim[i].p[dp->dim[i].ne-1]
103                                                  - dp->dim[i].p[0];
104                  } else
105 <                        goto scanerr;
104 <                if (dp->dim[i].siz == 0.0 || dp->dim[i].ne < 2)
105 <                        goto scanerr;
106 <                asize *= dp->dim[i].ne;
105 >                        dp->dim[i].p = NULL;
106          }
107          if ((dp->arr = (DATATYPE *)malloc(asize*sizeof(DATATYPE))) == NULL)
108                  goto memerr;
# Line 125 | Line 124 | scanerr:
124   }
125  
126  
127 + static double  inpaspect;               /* aspect ratio of input picture */
128 +
129 + static
130 + headaspect(s)                           /* check string for aspect ratio */
131 + char  *s;
132 + {
133 +        if (isaspect(s))
134 +                inpaspect *= aspectval(s);
135 + }
136 +
137 +
138   DATARRAY *
139   getpict(pname)                          /* get picture pname */
140   char  *pname;
# Line 158 | Line 168 | char  *pname;
168                  error(SYSTEM, errmsg);
169          }
170                                                  /* get dimensions */
171 <        getheader(fp, NULL);
171 >        inpaspect = 1.0;
172 >        getheader(fp, headaspect);
173          if (fgetresolu(&width, &height, fp) != (YMAJOR|YDECR))
174                  goto readerr;
175          for (i = 0; i < 3; i++) {
# Line 167 | Line 178 | char  *pname;
178                  pp[i].dim[1].ne = height;
179                  pp[i].dim[0].org =
180                  pp[i].dim[1].org = 0.0;
181 <                if (width <= height) {
181 >                if (width <= height*inpaspect) {
182                          pp[i].dim[0].siz = 1.0;
183 <                        pp[i].dim[1].siz = (double)height/width;
183 >                        pp[i].dim[1].siz = inpaspect*(double)height/width;
184                  } else {
185 <                        pp[i].dim[0].siz = (double)width/height;
185 >                        pp[i].dim[0].siz = (double)width/height/inpaspect;
186                          pp[i].dim[1].siz = 1.0;
187                  }
188                  pp[i].arr = (DATATYPE *)malloc(width*height*sizeof(DATATYPE));
# Line 254 | Line 265 | double  *pt;
265   {
266          DATARRAY  sd;
267          int  asize;
268 +        int  lower, upper;
269          register int  i;
270          double  x, y, y0, y1;
271                                          /* set up dimensions for recursion */
# Line 275 | Line 287 | double  *pt;
287                  else if (i > dp->dim[0].ne - 2)
288                          i = dp->dim[0].ne - 2;
289          } else {                                /* unevenly spaced points */
290 <                if (dp->dim[0].siz > 0.0)
291 <                        for (i = 0; i < dp->dim[0].ne; i++)
292 <                                if (pt[0] < dp->dim[0].p[i])
293 <                                        break;
294 <                else
295 <                        for (i = 0; i < dp->dim[0].ne; i++)
296 <                                if (pt[0] >= dp->dim[0].p[i])
297 <                                        break;
298 <                if (i <= 0)
290 >                if (dp->dim[0].siz > 0.0) {
291 >                        lower = 0;
292 >                        upper = dp->dim[0].ne;
293 >                } else {
294 >                        lower = dp->dim[0].ne;
295 >                        upper = 0;
296 >                }
297 >                do {
298 >                        i = (lower + upper) >> 1;
299 >                        if (pt[0] >= dp->dim[0].p[i])
300 >                                lower = i;
301 >                        else if (pt[0] < dp->dim[0].p[i])
302 >                                upper = i;
303 >                } while (i != (lower + upper) >> 1);
304 >                if (i < 0)
305                          i = 0;
306 <                else if (i >= dp->dim[0].ne)
306 >                else if (i > dp->dim[0].ne - 2)
307                          i = dp->dim[0].ne - 2;
290                else
291                        i--;
308                  x = i + (pt[0] - dp->dim[0].p[i]) /
309                                  (dp->dim[0].p[i+1] - dp->dim[0].p[i]);
310          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines