--- ray/src/px/x11image.c 1993/10/27 16:57:28 2.30 +++ ray/src/px/x11image.c 1993/12/14 20:43:42 2.36 @@ -56,6 +56,7 @@ static char SCCSid[] = "$SunId$ LBL"; #define redraw(x,y,w,h) patch_raster(wind,(x)-xoff,(y)-yoff,x,y,w,h,ourras) double gamcor = 2.2; /* gamma correction */ +char *gamstr = NULL; /* gamma value override */ int dither = 1; /* dither colors? */ int fast = 0; /* keep picture in Pixmap? */ @@ -116,25 +117,25 @@ extern BYTE clrtab[256][3]; /* global color map */ extern long ftell(); +extern char *getenv(); + Display *thedisplay; Atom closedownAtom, wmProtocolsAtom; -int noop() {} +int sigrecv; +int onsig() { sigrecv++; } + main(argc, argv) int argc; char *argv[]; { - extern char *getenv(); - char *gv; int headline(); int i; int pid; progname = argv[0]; - if ((gv = getenv("GAMMA")) != NULL) - gamcor = atof(gv); for (i = 1; i < argc; i++) if (argv[i][0] == '-') @@ -166,7 +167,7 @@ char *argv[]; if (argv[i][2] == 'e') geometry = argv[++i]; else - gamcor = atof(argv[++i]); + gamstr = argv[++i]; break; default: goto userr; @@ -179,6 +180,8 @@ char *argv[]; if (i > argc) goto userr; while (i < argc-1) { + sigrecv = 0; + signal(SIGCONT, onsig); if ((pid=fork()) == 0) { /* a child for each picture */ parent = -1; break; @@ -186,17 +189,15 @@ char *argv[]; if (pid < 0) quiterr("fork failed"); parent++; - signal(SIGCONT, noop); - pause(); /* wait for wake-up call */ + while (!sigrecv) + pause(); /* wait for wake-up call */ i++; } if (i < argc) { /* open picture file */ fname = argv[i]; fin = fopen(fname, "r"); - if (fin == NULL) { - sprintf(errmsg, "cannot open file \"%s\"", fname); - quiterr(errmsg); - } + if (fin == NULL) + quiterr("cannot open picture file"); } /* get header */ getheader(fin, headline, NULL); @@ -213,14 +214,15 @@ char *argv[]; init(argc, argv); /* get file and open window */ - if (parent < 0) + if (parent < 0) { kill(getppid(), SIGCONT); /* signal parent if child */ - + sigrecv--; + } for ( ; ; ) getevent(); /* main loop */ userr: fprintf(stderr, -"Usage: %s [-di disp][[-ge] spec][-b][-m][-d][-f][-c nclrs][-e +/-stops] pic ..\n", +"Usage: %s [-di disp][[-ge] spec][-b][-m][-d][-f][-c nclrs][-e +/-stops][-g gamcor] pic ..\n", progname); exit(1); } @@ -270,6 +272,13 @@ char **argv; name += i+1; if ((thedisplay = XOpenDisplay(dispname)) == NULL) quiterr("cannot open display"); + /* set gamma value */ + if (gamstr == NULL) /* get it from the X server */ + gamstr = XGetDefault(thedisplay, "radiance", "gamma"); + if (gamstr == NULL) /* get it from the environment */ + gamstr = getenv("GAMMA"); + if (gamstr != NULL) + gamcor = atof(gamstr); /* get best visual for default screen */ getbestvis(); /* store image */ @@ -311,10 +320,11 @@ char **argv; quiterr("cannot create window"); width = xmax; height = ymax; - xgcv.foreground = ourblack; - xgcv.background = ourwhite; + /* prepare graphics drawing context */ if ((xgcv.font = XLoadFont(thedisplay, FONTNAME)) == 0) quiterr("cannot get font"); + xgcv.foreground = ourblack; + xgcv.background = ourwhite; ourgc = XCreateGC(thedisplay, wind, GCForeground|GCBackground| GCFont, &xgcv); xgcv.function = GXinvert; @@ -350,16 +360,22 @@ char **argv; quiterr(err) /* print message and exit */ char *err; { - if (err != NULL) + register int es; + int cs; + + if (es = err != NULL) fprintf(stderr, "%s: %s: %s\n", progname, fname==NULL?"":fname, err); - if (wind) { - XDestroyWindow(thedisplay, wind); - XFlush(thedisplay); - } - while (parent > 0 && wait(0) != -1) /* wait for any children */ + if (thedisplay != NULL) + XCloseDisplay(thedisplay); + if (parent < 0 & sigrecv == 0) + kill(getppid(), SIGCONT); + while (parent > 0 && wait(&cs) != -1) { /* wait for any children */ + if (es == 0) + es = cs>>8 & 0xff; parent--; - exit(err != NULL); + } + exit(es); } @@ -661,9 +677,16 @@ XKeyPressedEvent *ekey; case '@': /* adaptation level */ if (avgbox(cval) == -1) return(-1); - comp = com=='@' - ? 106./pow(1.219+pow(luminance(cval)/exposure,.4),2.5)/exposure - : .5/bright(cval) ; + comp = bright(cval); + if (comp < 1e-20) { + XBell(thedisplay, 0); + return(-1); + } + if (com == '@') + comp = 106./exposure/ + pow(1.219+pow(comp*WHTEFFICACY/exposure,.4),2.5); + else + comp = .5/comp; comp = log(comp)/.69315 - scale; n = comp < 0 ? comp-.5 : comp+.5 ; /* round */ if (n == 0) @@ -924,14 +947,14 @@ getfull() /* get full (24-bit) data */ colrs_gambs(scanline, xmax); if (ourras->image->blue_mask & 1) for (x = 0; x < xmax; x++) - *dp++ = scanline[x][RED] << 16 | - scanline[x][GRN] << 8 | - scanline[x][BLU] ; + *dp++ = (unsigned int4)scanline[x][RED] << 16 | + (unsigned int4)scanline[x][GRN] << 8 | + (unsigned int4)scanline[x][BLU] ; else for (x = 0; x < xmax; x++) - *dp++ = scanline[x][RED] | - scanline[x][GRN] << 8 | - scanline[x][BLU] << 16 ; + *dp++ = (unsigned int4)scanline[x][RED] | + (unsigned int4)scanline[x][GRN] << 8 | + (unsigned int4)scanline[x][BLU] << 16 ; } }