| 1 | < | /* Copyright (c) 1990 Regents of the University of California */ | 
| 1 | > | /* Copyright (c) 1991 Regents of the University of California */ | 
| 2 |  |  | 
| 3 |  | #ifndef lint | 
| 4 |  | static char SCCSid[] = "$SunId$ LBL"; | 
| 30 |  | #include  "pic.h" | 
| 31 |  | #include  "x11raster.h" | 
| 32 |  | #include  "random.h" | 
| 33 | – | #include  "x11icon.h" | 
| 33 |  |  | 
| 34 |  | #define  FONTNAME       "8x13"          /* text font we'll use */ | 
| 35 |  |  | 
| 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) | 
| 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]; | 
| 246 |  | XSetFont(thedisplay, ourgc, fontid); | 
| 247 |  | revgc = XCreateGC(thedisplay, wind, 0, 0); | 
| 248 |  | XSetFunction(thedisplay, revgc, GXinvert); | 
| 245 | – | 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, | 
| 275 |  | ourxwmhints.flags = InputHint|IconPixmapHint; | 
| 276 |  | ourxwmhints.input = True; | 
| 277 |  | ourxwmhints.icon_pixmap = XCreateBitmapFromData(thedisplay, | 
| 278 | < | wind, x11icon_bits, x11icon_width, x11icon_height); | 
| 278 | > | wind, icondata, iconwidth, iconheight); | 
| 279 |  | XSetWMHints(thedisplay, wind, &ourxwmhints); | 
| 280 |  | XSelectInput(thedisplay, wind, ButtonPressMask|ButtonReleaseMask | 
| 281 |  | |ButtonMotionMask|StructureNotifyMask | 
| 428 |  | sprintf(buf, "%.3f", intens(cval)/exposure); | 
| 429 |  | break; | 
| 430 |  | case 'l':                               /* luminance */ | 
| 431 | < | sprintf(buf, "%.0fn", luminance(cval)/exposure); | 
| 431 | > | sprintf(buf, "%.0fL", luminance(cval)/exposure); | 
| 432 |  | break; | 
| 433 |  | case 'c':                               /* color */ | 
| 434 |  | comp = pow(2.0, (double)scale); | 
| 580 |  | avgbox(clr)                             /* average color over current box */ | 
| 581 |  | COLOR  clr; | 
| 582 |  | { | 
| 583 | + | static COLOR  lc; | 
| 584 | + | static int  ll, lr, lt, lb; | 
| 585 |  | int  left, right, top, bottom; | 
| 586 |  | int  y; | 
| 587 |  | double  d; | 
| 605 |  | bottom = ymax; | 
| 606 |  | if (top >= bottom) | 
| 607 |  | return(-1); | 
| 608 | + | if (left == ll && right == lr && top == lt && bottom == lb) { | 
| 609 | + | copycolor(clr, lc); | 
| 610 | + | return; | 
| 611 | + | } | 
| 612 |  | for (y = top; y < bottom; y++) { | 
| 613 |  | if (getscan(y) == -1) | 
| 614 |  | return(-1); | 
| 619 |  | } | 
| 620 |  | d = 1.0/((right-left)*(bottom-top)); | 
| 621 |  | scalecolor(clr, d); | 
| 622 | + | ll = left; lr = right; lt = top; lb = bottom; | 
| 623 | + | copycolor(lc, clr); | 
| 624 |  | return(0); | 
| 625 |  | } | 
| 626 |  |  | 
| 629 |  | { | 
| 630 |  | register unsigned char  *dp; | 
| 631 |  | register int    x, err; | 
| 632 | < | int     y; | 
| 632 | > | int     y, errp; | 
| 633 |  | short   *cerr; | 
| 634 |  |  | 
| 635 |  | if ((cerr = (short *)calloc(xmax,sizeof(short))) == NULL) | 
| 639 |  | if (getscan(y) < 0) | 
| 640 |  | quiterr("seek error in getmono"); | 
| 641 |  | normcolrs(scanline, xmax, scale); | 
| 642 | + | add2icon(y, scanline); | 
| 643 |  | err = 0; | 
| 644 |  | for (x = 0; x < xmax; x++) { | 
| 645 |  | if (!(x&7)) | 
| 646 |  | *++dp = 0; | 
| 647 | + | errp = err; | 
| 648 |  | err += normbright(scanline[x]) + cerr[x]; | 
| 649 |  | if (err > 127) | 
| 650 |  | err -= 255; | 
| 651 |  | else | 
| 652 |  | *dp |= 1<<(7-(x&07)); | 
| 653 | < | cerr[x] = err >>= 1; | 
| 653 | > | err /= 3; | 
| 654 | > | cerr[x] = err + errp; | 
| 655 |  | } | 
| 656 |  | } | 
| 657 |  | free((char *)cerr); | 
| 658 |  | } | 
| 659 |  |  | 
| 660 |  |  | 
| 661 | + | add2icon(y, scan)               /* add a scanline to our icon data */ | 
| 662 | + | int  y; | 
| 663 | + | COLR  *scan; | 
| 664 | + | { | 
| 665 | + | static short  cerr[ICONSIZ]; | 
| 666 | + | static int  ynext; | 
| 667 | + | static char  *dp; | 
| 668 | + | register int  err; | 
| 669 | + | register int    x, ti; | 
| 670 | + | int  errp; | 
| 671 | + |  | 
| 672 | + | if (iconheight == 0) {          /* initialize */ | 
| 673 | + | if (xmax <= ICONSIZ && ymax <= ICONSIZ) { | 
| 674 | + | iconwidth = xmax; | 
| 675 | + | iconheight = ymax; | 
| 676 | + | } else if (xmax > ymax) { | 
| 677 | + | iconwidth = ICONSIZ; | 
| 678 | + | iconheight = ICONSIZ*ymax/xmax; | 
| 679 | + | if (iconheight < 1) | 
| 680 | + | iconheight = 1; | 
| 681 | + | } else { | 
| 682 | + | iconwidth = ICONSIZ*xmax/ymax; | 
| 683 | + | if (iconwidth < 1) | 
| 684 | + | iconwidth = 1; | 
| 685 | + | iconheight = ICONSIZ; | 
| 686 | + | } | 
| 687 | + | ynext = 0; | 
| 688 | + | dp = icondata - 1; | 
| 689 | + | } | 
| 690 | + | if (y < ynext*ymax/iconheight)  /* skip this one */ | 
| 691 | + | return; | 
| 692 | + | err = 0; | 
| 693 | + | for (x = 0; x < iconwidth; x++) { | 
| 694 | + | if (!(x&7)) | 
| 695 | + | *++dp = 0; | 
| 696 | + | errp = err; | 
| 697 | + | ti = x*xmax/iconwidth; | 
| 698 | + | err += normbright(scan[ti]) + cerr[x]; | 
| 699 | + | if (err > 127) | 
| 700 | + | err -= 255; | 
| 701 | + | else | 
| 702 | + | *dp |= 1<<(x&07); | 
| 703 | + | err /= 3; | 
| 704 | + | cerr[x] = err + errp; | 
| 705 | + | } | 
| 706 | + | ynext++; | 
| 707 | + | } | 
| 708 | + |  | 
| 709 | + |  | 
| 710 |  | getfull()                       /* get full (24-bit) data */ | 
| 711 |  | { | 
| 712 |  | int     y; | 
| 722 |  | if (scale) | 
| 723 |  | shiftcolrs(scanline, xmax, scale); | 
| 724 |  | colrs_gambs(scanline, xmax); | 
| 725 | + | add2icon(y, scanline); | 
| 726 |  | for (x = 0; x < xmax; x++) { | 
| 727 |  | *dp++ = scanline[x][RED]; | 
| 728 |  | *dp++ = scanline[x][GRN]; | 
| 790 |  | quiterr("cannot seek for picreadline"); | 
| 791 |  | /* convert scanline */ | 
| 792 |  | normcolrs(scanline, xmax, scale); | 
| 793 | + | add2icon(y, scanline); | 
| 794 |  | for (i = 0; i < xmax; i++) { | 
| 795 |  | l3[i].r = scanline[i][RED]; | 
| 796 |  | l3[i].g = scanline[i][GRN]; |