--- ray/src/common/depthcodec.c 2019/07/26 16:18:06 2.1 +++ ray/src/common/depthcodec.c 2020/01/10 01:02:14 2.6 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: depthcodec.c,v 2.1 2019/07/26 16:18:06 greg Exp $"; +static const char RCSid[] = "$Id: depthcodec.c,v 2.6 2020/01/10 01:02:14 greg Exp $"; #endif /* * Routines to encode/decoded 16-bit depths @@ -8,7 +8,6 @@ static const char RCSid[] = "$Id: depthcodec.c,v 2.1 2 #include "copyright.h" #include -#include #include #include #include "rtio.h" @@ -16,7 +15,7 @@ static const char RCSid[] = "$Id: depthcodec.c,v 2.1 2 #include "depthcodec.h" -#if 0 /* defined as macro in depthcodec.h */ +#ifndef depth2code /* Encode depth as 16-bit signed integer */ int depth2code(double d, double dref) @@ -25,13 +24,14 @@ depth2code(double d, double dref) return -32768; if (d > dref) - return (int)(32768 - 32768*dref/d) - 1; + return (int)(32768.001 - 32768.*dref/d) - 1; - return (int)(32767*d/dref - 32768); + return (int)(32767.*d/dref - 32768.); } #endif +#ifndef code2depth /* Decode depth from 16-bit signed integer */ double code2depth(int c, double dref) @@ -41,12 +41,13 @@ code2depth(int c, double dref) if (c >= 32767) return FHUGE; - - if (c < 0) - return dref*(32767.5 + c)*(1./32767.); - - return dref*32768./(32766.5 - c); + + if (c >= 0) + return dref*32768./(32766.5 - c); + + return dref*(32767.5 + c)*(1./32767.); } +#endif /* Set codec defaults */ @@ -70,9 +71,15 @@ static int headline(char *s, void *p) { DEPTHCODEC *dcp = (DEPTHCODEC *)p; + int rv; if (formatval(dcp->inpfmt, s)) /* don't pass format */ return 0; + + if ((rv = isbigendian(s)) >= 0) { + dcp->swapped = (nativebigendian() != rv); + return 0; + } /* check for reference depth */ if (!strncmp(s, DEPTHSTR, LDEPTHSTR)) { char *cp; @@ -83,11 +90,16 @@ headline(char *s, void *p) *cp = '\0'; dcp->refdepth = atof(dcp->depth_unit); if (dcp->refdepth <= .0) { - fputs(dcp->inpname, stderr); - fputs(": bad reference depth in input header\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": bad reference depth in input header\n", + stderr); + } return -1; } - } else if (isview(s)) /* get view params */ + } else if (!strncmp(s, "SAMP360=", 8)) + dcp->gotview--; + else if (isview(s)) /* get view params */ dcp->gotview += (sscanview(&dcp->vw, s) > 0); if (dcp->hdrflags & HF_HEADOUT) fputs(s, stdout); /* copy to standard output */ @@ -101,10 +113,13 @@ process_dc_header(DEPTHCODEC *dcp, int ac, char *av[]) { if (dcp->hdrflags & HF_HEADIN && getheader(dcp->finp, headline, dcp) < 0) { - fputs(dcp->inpname, stderr); - fputs(": bad header\n", stderr); - return 1; + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": bad header\n", stderr); + } + return 0; } + dcp->gotview *= (dcp->gotview > 0); if (dcp->hdrflags & HF_HEADOUT) { /* finish header */ if (!(dcp->hdrflags & HF_HEADIN)) newheader("RADIANCE", stdout); @@ -121,9 +136,11 @@ process_dc_header(DEPTHCODEC *dcp, int ac, char *av[]) fputformat("ascii", stdout); break; case 'f': + fputendian(stdout); fputformat("float", stdout); break; case 'd': + fputendian(stdout); fputformat("double", stdout); break; } @@ -131,9 +148,11 @@ process_dc_header(DEPTHCODEC *dcp, int ac, char *av[]) } /* get/put resolution string */ if (dcp->hdrflags & HF_RESIN && !fgetsresolu(&dcp->res, dcp->finp)) { - fputs(dcp->inpname, stderr); - fputs(": bad resolution string\n", stderr); - return 1; + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": bad resolution string\n", stderr); + } + return 0; } if (dcp->hdrflags & HF_RESOUT) fputsresolu(&dcp->res, stdout); @@ -148,15 +167,19 @@ int check_decode_depths(DEPTHCODEC *dcp) { if (dcp->hdrflags & HF_ENCODE) { - fputs(progname, stderr); - fputs(": wrong header mode for decode\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(progname, stderr); + fputs(": wrong header mode for decode\n", stderr); + } return 0; } if (dcp->inpfmt[0] && strcmp(dcp->inpfmt, DEPTH16FMT)) { - fputs(dcp->inpname, stderr); - fputs(": unexpected input format: ", stderr); - fputs(dcp->inpfmt, stderr); - fputc('\n', stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": unexpected input format: ", stderr); + fputs(dcp->inpfmt, stderr); + fputc('\n', stderr); + } return 0; } return 1; @@ -172,20 +195,26 @@ check_decode_worldpos(DEPTHCODEC *dcp) if (!check_decode_depths(dcp)) return 0; if ((dcp->res.xr <= 0) | (dcp->res.yr <= 0)) { - fputs(progname, stderr); - fputs(": missing map resolution\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(progname, stderr); + fputs(": missing map resolution\n", stderr); + } return 0; } if (!dcp->gotview) { - fputs(dcp->inpname, stderr); - fputs(": missing view\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": missing view\n", stderr); + } return 0; } if ((err = setview(&dcp->vw)) != NULL) { - fputs(dcp->inpname, stderr); - fputs(": input view error: ", stderr); - fputs(err, stderr); - fputc('\n', stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": input view error: ", stderr); + fputs(err, stderr); + fputc('\n', stderr); + } return 0; } return 1; @@ -196,11 +225,18 @@ check_decode_worldpos(DEPTHCODEC *dcp) double decode_depth_next(DEPTHCODEC *dcp) { - int c = getint(2, dcp->finp); + int c; + if (dcp->use_last) { + dcp->use_last = 0; + return code2depth(dcp->last_dc, dcp->refdepth); + } + c = getint(2, dcp->finp); + if (c == EOF && feof(dcp->finp)) return -1.; + dcp->last_dc = c; dcp->curpos += 2; return code2depth(c, dcp->refdepth); @@ -252,22 +288,32 @@ seek_dc_pix(DEPTHCODEC *dcp, int x, int y) long seekpos; if ((dcp->res.xr <= 0) | (dcp->res.yr <= 0)) { - fputs(progname, stderr); - fputs(": need map resolution to seek\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(progname, stderr); + fputs(": need map resolution to seek\n", stderr); + } return -1; } if ((x < 0) | (y < 0) || (x >= scanlen(&dcp->res)) | (y >= numscans(&dcp->res))) { - fputs(dcp->inpname, stderr); - fputs(": warning - pixel index off map\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": warning - pixel index off map\n", stderr); + } return 0; } seekpos = dcp->dstart + 2*((long)y*scanlen(&dcp->res) + x); + if (seekpos == dcp->curpos-2) { + dcp->use_last++; /* avoids seek/read */ + return 1; + } if (seekpos != dcp->curpos && fseek(dcp->finp, seekpos, SEEK_SET) == EOF) { - fputs(dcp->inpname, stderr); - fputs(": seek error\n", stderr); + if (dcp->hdrflags & HF_STDERR) { + fputs(dcp->inpname, stderr); + fputs(": seek error\n", stderr); + } return -1; } dcp->curpos = seekpos;