| 37 |  |  | 
| 38 |  | #define  BORWIDTH       5               /* border width */ | 
| 39 |  |  | 
| 40 | + | #define  ICONSIZ        (8*10)          /* maximum icon dimension (even 8) */ | 
| 41 | + |  | 
| 42 |  | #define  ourscreen      DefaultScreen(thedisplay) | 
| 43 |  | #define  ourblack       BlackPixel(thedisplay,ourscreen) | 
| 44 |  | #define  ourwhite       WhitePixel(thedisplay,ourscreen) | 
| 79 |  |  | 
| 80 |  | double  exposure = 1.0;                 /* exposure compensation used */ | 
| 81 |  |  | 
| 82 | + | int  wrongformat = 0;                   /* input in another format? */ | 
| 83 | + |  | 
| 84 |  | GC      revgc;                          /* graphics context with GXinvert */ | 
| 85 |  |  | 
| 86 |  | XRASTER *ourras;                        /* our stored image */ | 
| 92 |  |  | 
| 93 |  | char  *geometry = NULL;                 /* geometry specification */ | 
| 94 |  |  | 
| 95 | + | char  icondata[ICONSIZ*ICONSIZ/8];      /* icon bitmap data */ | 
| 96 | + | int  iconwidth = 0, iconheight = 0; | 
| 97 | + |  | 
| 98 |  | char  *progname; | 
| 99 |  |  | 
| 100 |  | char  errmsg[128]; | 
| 163 |  | } else if (i != argc) | 
| 164 |  | goto userr; | 
| 165 |  | /* get header */ | 
| 166 | < | getheader(fin, headline); | 
| 166 | > | getheader(fin, headline, NULL); | 
| 167 |  | /* get picture dimensions */ | 
| 168 | < | if (fgetresolu(&xmax, &ymax, fin) != (YMAJOR|YDECR)) | 
| 169 | < | quiterr("bad picture size"); | 
| 168 | > | if (wrongformat || fgetresolu(&xmax, &ymax, fin) != (YMAJOR|YDECR)) | 
| 169 | > | quiterr("bad picture format"); | 
| 170 |  | /* set view parameters */ | 
| 171 |  | if (gotview && setview(&ourview) != NULL) | 
| 172 |  | gotview = 0; | 
| 190 |  | { | 
| 191 |  | static char  *altname[] = {"rview","rpict","pinterp",VIEWSTR,NULL}; | 
| 192 |  | register char  **an; | 
| 193 | + | char  fmt[32]; | 
| 194 |  |  | 
| 195 |  | if (isexpos(s)) | 
| 196 |  | exposure *= exposval(s); | 
| 197 | < | else | 
| 197 | > | else if (isformat(s)) { | 
| 198 | > | formatval(fmt, s); | 
| 199 | > | wrongformat = strcmp(fmt, COLRFMT); | 
| 200 | > | } else | 
| 201 |  | for (an = altname; *an != NULL; an++) | 
| 202 |  | if (!strncmp(*an, s, strlen(*an))) { | 
| 203 |  | if (sscanview(&ourview, s+strlen(*an)) > 0) | 
| 209 |  |  | 
| 210 |  | init()                  /* get data and open window */ | 
| 211 |  | { | 
| 212 | + | XWMHints        ourxwmhints; | 
| 213 |  | XSetWindowAttributes    ourwinattr; | 
| 214 |  | XSizeHints  oursizhints; | 
| 215 |  | register int  i; | 
| 246 |  | XSetFont(thedisplay, ourgc, fontid); | 
| 247 |  | revgc = XCreateGC(thedisplay, wind, 0, 0); | 
| 248 |  | XSetFunction(thedisplay, revgc, GXinvert); | 
| 237 | – | XStoreName(thedisplay, wind, fname == NULL ? progname : fname); | 
| 249 |  | XDefineCursor(thedisplay, wind, XCreateFontCursor(thedisplay, | 
| 250 |  | XC_diamond_cross)); | 
| 251 | + | XStoreName(thedisplay, wind, fname == NULL ? progname : fname); | 
| 252 |  | if (geometry != NULL) { | 
| 253 |  | bzero((char *)&oursizhints, sizeof(oursizhints)); | 
| 254 |  | i = XParseGeometry(geometry, &oursizhints.x, &oursizhints.y, | 
| 272 |  | } | 
| 273 |  | XSetNormalHints(thedisplay, wind, &oursizhints); | 
| 274 |  | } | 
| 275 | + | ourxwmhints.flags = InputHint|IconPixmapHint; | 
| 276 | + | ourxwmhints.input = True; | 
| 277 | + | ourxwmhints.icon_pixmap = XCreateBitmapFromData(thedisplay, | 
| 278 | + | wind, icondata, iconwidth, iconheight); | 
| 279 | + | XSetWMHints(thedisplay, wind, &ourxwmhints); | 
| 280 |  | XSelectInput(thedisplay, wind, ButtonPressMask|ButtonReleaseMask | 
| 281 |  | |ButtonMotionMask|StructureNotifyMask | 
| 282 |  | |KeyPressMask|ExposureMask); | 
| 428 |  | sprintf(buf, "%.3f", intens(cval)/exposure); | 
| 429 |  | break; | 
| 430 |  | case 'l':                               /* luminance */ | 
| 431 | < | sprintf(buf, "%.0fn", bright(cval)*683.0/exposure); | 
| 431 | > | sprintf(buf, "%.0fL", luminance(cval)/exposure); | 
| 432 |  | break; | 
| 433 |  | case 'c':                               /* color */ | 
| 434 |  | comp = pow(2.0, (double)scale); | 
| 631 |  | if (getscan(y) < 0) | 
| 632 |  | quiterr("seek error in getmono"); | 
| 633 |  | normcolrs(scanline, xmax, scale); | 
| 634 | + | add2icon(y, scanline); | 
| 635 |  | err = 0; | 
| 636 |  | for (x = 0; x < xmax; x++) { | 
| 637 |  | if (!(x&7)) | 
| 648 |  | } | 
| 649 |  |  | 
| 650 |  |  | 
| 651 | + | add2icon(y, scan)               /* add a scanline to our icon data */ | 
| 652 | + | int  y; | 
| 653 | + | COLR  *scan; | 
| 654 | + | { | 
| 655 | + | static short  cerr[ICONSIZ]; | 
| 656 | + | static int  ynext; | 
| 657 | + | static char  *dp; | 
| 658 | + | register int  err; | 
| 659 | + | register int    x, ti; | 
| 660 | + |  | 
| 661 | + | if (iconheight == 0) {          /* initialize */ | 
| 662 | + | if (xmax <= ICONSIZ && ymax <= ICONSIZ) { | 
| 663 | + | iconwidth = xmax; | 
| 664 | + | iconheight = ymax; | 
| 665 | + | } else if (xmax > ymax) { | 
| 666 | + | iconwidth = ICONSIZ; | 
| 667 | + | iconheight = ICONSIZ*ymax/xmax; | 
| 668 | + | } else { | 
| 669 | + | iconwidth = ICONSIZ*xmax/ymax; | 
| 670 | + | iconheight = ICONSIZ; | 
| 671 | + | } | 
| 672 | + | ynext = 0; | 
| 673 | + | dp = icondata - 1; | 
| 674 | + | } | 
| 675 | + | if (y < ynext*ymax/iconheight)  /* skip this one */ | 
| 676 | + | return; | 
| 677 | + | err = 0; | 
| 678 | + | for (x = 0; x < iconwidth; x++) { | 
| 679 | + | if (!(x&7)) | 
| 680 | + | *++dp = 0; | 
| 681 | + | ti = x*xmax/iconwidth; | 
| 682 | + | err += normbright(scan[ti]) + cerr[x]; | 
| 683 | + | if (err > 127) | 
| 684 | + | err -= 255; | 
| 685 | + | else | 
| 686 | + | *dp |= 1<<(x&07); | 
| 687 | + | cerr[x] = err >>= 1; | 
| 688 | + | } | 
| 689 | + | ynext++; | 
| 690 | + | } | 
| 691 | + |  | 
| 692 | + |  | 
| 693 |  | getfull()                       /* get full (24-bit) data */ | 
| 694 |  | { | 
| 695 |  | int     y; | 
| 705 |  | if (scale) | 
| 706 |  | shiftcolrs(scanline, xmax, scale); | 
| 707 |  | colrs_gambs(scanline, xmax); | 
| 708 | + | add2icon(y, scanline); | 
| 709 |  | for (x = 0; x < xmax; x++) { | 
| 710 |  | *dp++ = scanline[x][RED]; | 
| 711 |  | *dp++ = scanline[x][GRN]; | 
| 773 |  | quiterr("cannot seek for picreadline"); | 
| 774 |  | /* convert scanline */ | 
| 775 |  | normcolrs(scanline, xmax, scale); | 
| 776 | + | add2icon(y, scanline); | 
| 777 |  | for (i = 0; i < xmax; i++) { | 
| 778 |  | l3[i].r = scanline[i][RED]; | 
| 779 |  | l3[i].g = scanline[i][GRN]; |