--- ray/src/px/x11image.c 1997/04/15 18:33:31 2.45 +++ ray/src/px/x11image.c 1997/04/22 10:01:43 2.48 @@ -178,11 +178,11 @@ char *argv[]; break; case 'e': /* exposure comp. */ i++; - if (!strcmp(argv[i], "auto")) { + if (argv[i][0] == 'a') { tmflags = TM_F_CAMERA; break; } - if (!strcmp(argv[i], "human")) { + if (argv[i][0] == 'h') { tmflags = TM_F_HUMAN; break; } @@ -733,6 +733,18 @@ XKeyPressedEvent *ekey; return(0); case 't': /* trace */ return(traceray(ekey->x, ekey->y)); + case 'a': /* auto exposure */ + if (tmflags == TM_F_CAMERA) + return(0); + tmflags = TM_F_CAMERA; + strcpy(buf, "auto exposure..."); + goto remap; + case 'h': /* human response */ + if (tmflags == TM_F_HUMAN) + return(0); + tmflags = TM_F_HUMAN; + strcpy(buf, "human exposure..."); + goto remap; case '=': /* adjust exposure */ case '@': /* adaptation level */ if (avgbox(cval) == -1) @@ -758,6 +770,7 @@ XKeyPressedEvent *ekey; } scale += n; sprintf(buf, "%+d", scale); + remap: XDrawImageString(thedisplay, wind, ourgc, box.xmin, box.ymin+box.ysiz, buf, strlen(buf)); XFlush(thedisplay); @@ -931,7 +944,7 @@ COLOR clr; make_tonemap() /* initialize tone mapping */ { - int y; + int flags, y; if (tmflags != -1 && fname == NULL) { fprintf(stderr, "%s: cannot adjust tone of standard input\n", @@ -942,17 +955,19 @@ make_tonemap() /* initialize tone mapping */ setcolrcor(pow, 1.0/gamcor); return; } - if (greyscale) - tmflags |= TM_F_BW; + if (tmTop != NULL) /* already initialized? */ + return; + flags = tmflags; + if (greyscale) flags |= TM_F_BW; /* initialize tm library */ - if (tmInit(tmflags, stdprims, gamcor) == NULL) + if (tmInit(flags, stdprims, gamcor) == NULL) goto memerr; if (tmSetSpace(stdprims, WHTEFFICACY/exposure)) goto tmerr; /* allocate encoding buffers */ if ((lscan = (TMbright *)malloc(xmax*sizeof(TMbright))) == NULL) goto memerr; - if (tmflags & TM_F_BW) { + if (greyscale) { cscan = TM_NOCHROM; if ((pscan = (BYTE *)malloc(sizeof(BYTE)*xmax)) == NULL) goto memerr; @@ -969,7 +984,6 @@ make_tonemap() /* initialize tone mapping */ /* compute tone mapping */ if (tmComputeMapping(gamcor, 0., 0.)) goto tmerr; - free((char *)lscan); return; memerr: quiterr("out of memory in make_tonemap"); @@ -997,7 +1011,7 @@ int len; if (tmMapPixels(pscan, lscan, cscan, len)) goto tmerr; ps = pscan; - if (tmflags & TM_F_BW) + if (greyscale) while (len--) { scn[0][RED] = scn[0][GRN] = scn[0][BLU] = *ps++; scn[0][EXP] = COLXS; @@ -1017,16 +1031,6 @@ tmerr: } -done_tonemap() /* clean up after tone mapping is done */ -{ - if (tmflags == -1 || tmTop == NULL) - return; - tmDone(tmTop); /* clear old mapping */ - free((char *)lscan); /* free memory */ - free((char *)pscan); -} - - getmono() /* get monochrome data */ { register unsigned char *dp; @@ -1135,7 +1139,6 @@ getfull() /* get full (24-bit) data */ (unsigned int4)scanline[x][GRN] << 8 | (unsigned int4)scanline[x][BLU] << 16 ; } - done_tonemap(); } @@ -1163,7 +1166,6 @@ getgrey() /* get greyscale data */ for (x = 0; x < maxcolors; x++) clrtab[x][RED] = clrtab[x][GRN] = clrtab[x][BLU] = ((int4)x*256 + 128)/maxcolors; - done_tonemap(); } @@ -1196,7 +1198,6 @@ getmapped() /* get color-mapped data */ else map_colrs(ourdata+y*xmax, scanline, xmax); } - done_tonemap(); }