--- ray/src/common/normcodec.c 2019/08/14 21:00:14 2.3 +++ ray/src/common/normcodec.c 2022/08/24 19:55:58 2.7 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: normcodec.c,v 2.3 2019/08/14 21:00:14 greg Exp $"; +static const char RCSid[] = "$Id: normcodec.c,v 2.7 2022/08/24 19:55:58 greg Exp $"; #endif /* * Routines to encode/decode 32-bit normals @@ -20,7 +20,6 @@ set_nc_defaults(NORMCODEC *ncp) ncp->finp = stdin; ncp->inpname = ""; ncp->format = 'a'; - ncp->swapped = 0; ncp->res.rt = PIXSTANDARD; if (!progname) progname = "norm_codec"; } @@ -58,6 +57,14 @@ process_nc_header(NORMCODEC *ncp, int ac, char *av[]) } return 0; } + /* get resolution string? */ + if (ncp->hdrflags & HF_RESIN && !fgetsresolu(&ncp->res, ncp->finp)) { + if (ncp->hdrflags & HF_STDERR) { + fputs(ncp->inpname, stderr); + fputs(": bad resolution string\n", stderr); + } + return 0; + } if (ncp->hdrflags & HF_HEADOUT) { /* finish header */ if (!(ncp->hdrflags & HF_HEADIN)) newheader("RADIANCE", stdout); @@ -65,7 +72,12 @@ process_nc_header(NORMCODEC *ncp, int ac, char *av[]) printargs(ac, av, stdout); if (ncp->hdrflags & HF_ENCODE) { fputformat(NORMAL32FMT, stdout); - } else + } else { + fputs("NCOMP=3\n", stdout); + if ((ncp->hdrflags & (HF_RESIN|HF_RESOUT)) == HF_RESIN) + printf("NCOLS=%d\nNROWS=%d\n", + scanlen(&ncp->res), + numscans(&ncp->res)); switch (ncp->format) { case 'a': fputformat("ascii", stdout); @@ -79,20 +91,13 @@ process_nc_header(NORMCODEC *ncp, int ac, char *av[]) fputformat("double", stdout); break; } + } fputc('\n', stdout); } - /* get/put resolution string */ - if (ncp->hdrflags & HF_RESIN && !fgetsresolu(&ncp->res, ncp->finp)) { - if (ncp->hdrflags & HF_STDERR) { - fputs(ncp->inpname, stderr); - fputs(": bad resolution string\n", stderr); - } - return 0; - } - if (ncp->hdrflags & HF_RESOUT) + if (ncp->hdrflags & HF_RESOUT) /* put resolution string? */ fputsresolu(&ncp->res, stdout); - ncp->dstart = ncp->curpos = ftell(ncp->finp); + ncp->dstart = ftell(ncp->finp); return 1; } @@ -125,15 +130,22 @@ check_decode_normals(NORMCODEC *ncp) int decode_normal_next(FVECT nrm, NORMCODEC *ncp) { - int32 c = getint(4, ncp->finp); + static int32 lastc; + static FVECT lastv; + int32 c = getint(4, ncp->finp); if (c == EOF && feof(ncp->finp)) return -1; - ncp->curpos += 4; - - decodedir(nrm, c); - + if (c == lastc) { /* optimization */ + VCOPY(nrm, lastv); + } else { + decodedir(nrm, c); + if (c) { + lastc = c; + VCOPY(lastv, nrm); + } + } return (c != 0); } @@ -142,8 +154,6 @@ decode_normal_next(FVECT nrm, NORMCODEC *ncp) int seek_nc_pix(NORMCODEC *ncp, int x, int y) { - long seekpos; - if ((ncp->res.xr <= 0) | (ncp->res.yr <= 0)) { if (ncp->hdrflags & HF_STDERR) { fputs(progname, stderr); @@ -159,17 +169,14 @@ seek_nc_pix(NORMCODEC *ncp, int x, int y) } return 0; } - seekpos = ncp->dstart + 4*((long)y*scanlen(&ncp->res) + x); - - if (seekpos != ncp->curpos && - fseek(ncp->finp, seekpos, SEEK_SET) == EOF) { + if (fseek(ncp->finp, ncp->dstart + 4*((long)y*scanlen(&ncp->res) + x), + SEEK_SET) == EOF) { if (ncp->hdrflags & HF_STDERR) { fputs(ncp->inpname, stderr); fputs(": seek error\n", stderr); } return -1; } - ncp->curpos = seekpos; return 1; }