--- ray/src/common/depthcodec.c 2020/01/10 01:02:14 2.6 +++ ray/src/common/depthcodec.c 2022/03/03 16:09:31 2.12 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: depthcodec.c,v 2.6 2020/01/10 01:02:14 greg Exp $"; +static const char RCSid[] = "$Id: depthcodec.c,v 2.12 2022/03/03 16:09:31 greg Exp $"; #endif /* * Routines to encode/decoded 16-bit depths @@ -26,7 +26,7 @@ depth2code(double d, double dref) if (d > dref) return (int)(32768.001 - 32768.*dref/d) - 1; - return (int)(32767.*d/dref - 32768.); + return (int)(32767.*d/dref - 32768.999); } #endif @@ -42,10 +42,10 @@ code2depth(int c, double dref) if (c >= 32767) return FHUGE; - if (c >= 0) + if (c >= -1) return dref*32768./(32766.5 - c); - return dref*(32767.5 + c)*(1./32767.); + return dref*(32768.5 + c)*(1./32767.); } #endif @@ -97,6 +97,8 @@ headline(char *s, void *p) } return -1; } + if (dcp->hdrflags & HF_ENCODE) + return 0; /* will add this later */ } else if (!strncmp(s, "SAMP360=", 8)) dcp->gotview--; else if (isview(s)) /* get view params */ @@ -120,6 +122,14 @@ process_dc_header(DEPTHCODEC *dcp, int ac, char *av[]) return 0; } dcp->gotview *= (dcp->gotview > 0); + /* get resolution string? */ + if (dcp->hdrflags & HF_RESIN && !fgetsresolu(&dcp->res, dcp->finp)) { + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": bad resolution string\n", stderr); + } + return 0; + } if (dcp->hdrflags & HF_HEADOUT) { /* finish header */ if (!(dcp->hdrflags & HF_HEADIN)) newheader("RADIANCE", stdout); @@ -130,7 +140,12 @@ process_dc_header(DEPTHCODEC *dcp, int ac, char *av[]) fputs(dcp->depth_unit, stdout); fputc('\n', stdout); fputformat(DEPTH16FMT, stdout); - } else + } else { + fputs("NCOMP=1\n", stdout); + if ((dcp->hdrflags & (HF_RESIN|HF_RESOUT)) == HF_RESIN) + printf("NCOLS=%d\nNROWS=%d\n", + scanlen(&dcp->res), + numscans(&dcp->res)); switch (dcp->format) { case 'a': fputformat("ascii", stdout); @@ -144,17 +159,10 @@ process_dc_header(DEPTHCODEC *dcp, int ac, char *av[]) fputformat("double", stdout); break; } + } fputc('\n', stdout); } - /* get/put resolution string */ - if (dcp->hdrflags & HF_RESIN && !fgetsresolu(&dcp->res, dcp->finp)) { - if (dcp->hdrflags & HF_STDERR) { - fputs(dcp->inpname, stderr); - fputs(": bad resolution string\n", stderr); - } - return 0; - } - if (dcp->hdrflags & HF_RESOUT) + if (dcp->hdrflags & HF_RESOUT) /* put resolution string? */ fputsresolu(&dcp->res, stdout); dcp->dstart = dcp->curpos = ftell(dcp->finp); @@ -250,14 +258,18 @@ compute_worldpos(FVECT wpos, DEPTHCODEC *dcp, int x, i RREAL loc[2]; FVECT rdir; + if (d >= FHUGE*.99) + goto badval; + pix2loc(loc, &dcp->res, x, y); - if (viewray(wpos, rdir, &dcp->vw, loc[0], loc[1]) < -FTINY) { - VCOPY(wpos, dcp->vw.vp); - return 0; + if (viewray(wpos, rdir, &dcp->vw, loc[0], loc[1]) >= -FTINY) { + VSUM(wpos, wpos, rdir, d); + return 1; } - VSUM(wpos, wpos, rdir, d); - return 1; +badval: + VCOPY(wpos, dcp->vw.vp); + return 0; } @@ -317,6 +329,7 @@ seek_dc_pix(DEPTHCODEC *dcp, int x, int y) return -1; } dcp->curpos = seekpos; + dcp->use_last = 0; return 1; }