ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/x11image.c
(Generate patch)

Comparing ray/src/px/x11image.c (file contents):
Revision 1.19 by greg, Fri May 3 09:54:31 1991 UTC vs.
Revision 2.5 by greg, Tue May 19 14:22:46 1992 UTC

# Line 1 | Line 1
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";
# Line 30 | Line 30 | static char SCCSid[] = "$SunId$ LBL";
30   #include  "pic.h"
31   #include  "x11raster.h"
32   #include  "random.h"
33 + #include  "resolu.h"
34  
35   #define  FONTNAME       "8x13"          /* text font we'll use */
36  
37 < #define  CTRL(c)        ('c'-'@')
37 > #define  CTRL(c)        ((c)-'@')
38  
39   #define  BORWIDTH       5               /* border width */
40  
# Line 70 | Line 71 | int  gotview = 0;                      /* got parameters from file */
71  
72   COLR  *scanline;                        /* scan line buffer */
73  
74 < int  xmax, ymax;                        /* picture resolution */
74 > RESOLU  inpres;                         /* input resolution and ordering */
75 > int  xmax, ymax;                        /* picture dimensions */
76   int  width, height;                     /* window size */
77   char  *fname = NULL;                    /* input file name */
78   FILE  *fin = stdin;                     /* input file */
# Line 103 | Line 105 | extern long  ftell();
105  
106   extern char  *malloc(), *calloc();
107  
108 < extern double  atof(), pow(), log();
108 > extern double  pow(), log();
109  
110   Display  *thedisplay;
111  
# Line 165 | Line 167 | char  *argv[];
167                                  /* get header */
168          getheader(fin, headline, NULL);
169                                  /* get picture dimensions */
170 <        if (wrongformat || fgetresolu(&xmax, &ymax, fin) != (YMAJOR|YDECR))
170 >        if (wrongformat || !fgetsresolu(&inpres, fin))
171                  quiterr("bad picture format");
172 +        xmax = scanlen(&inpres);
173 +        ymax = numscans(&inpres);
174                                  /* set view parameters */
175          if (gotview && setview(&ourview) != NULL)
176                  gotview = 0;
# Line 188 | Line 192 | userr:
192   headline(s)             /* get relevant info from header */
193   char  *s;
194   {
191        static char  *altname[] = {"rview","rpict","pinterp",VIEWSTR,NULL};
192        register char  **an;
195          char  fmt[32];
196  
197          if (isexpos(s))
# Line 197 | Line 199 | char  *s;
199          else if (isformat(s)) {
200                  formatval(fmt, s);
201                  wrongformat = strcmp(fmt, COLRFMT);
202 <        } else
203 <                for (an = altname; *an != NULL; an++)
202 <                        if (!strncmp(*an, s, strlen(*an))) {
203 <                                if (sscanview(&ourview, s+strlen(*an)) > 0)
204 <                                        gotview++;
205 <                                return;
206 <                        }
202 >        } else if (isview(s) && sscanview(&ourview, s) > 0)
203 >                gotview++;
204   }
205  
206  
# Line 248 | Line 245 | init()                 /* get data and open window */
245          XSetFunction(thedisplay, revgc, GXinvert);
246          XDefineCursor(thedisplay, wind, XCreateFontCursor(thedisplay,
247                          XC_diamond_cross));
248 +        XStoreName(thedisplay, wind, fname == NULL ? progname : fname);
249          if (geometry != NULL) {
250                  bzero((char *)&oursizhints, sizeof(oursizhints));
251                  i = XParseGeometry(geometry, &oursizhints.x, &oursizhints.y,
# Line 280 | Line 278 | init()                 /* get data and open window */
278                          |ButtonMotionMask|StructureNotifyMask
279                          |KeyPressMask|ExposureMask);
280          XMapWindow(thedisplay, wind);
283                                /* store name last as ready signal */
284        XStoreName(thedisplay, wind, fname == NULL ? progname : fname);
281          return;
282   memerr:
283          quiterr("out of memory");
# Line 407 | Line 403 | XKeyPressedEvent  *ekey;
403          XColor  cvx;
404          int  com, n;
405          double  comp;
406 +        FLOAT  hv[2];
407          FVECT  rorg, rdir;
408  
409          n = XLookupString(ekey, buf, sizeof(buf), NULL, NULL);
# Line 415 | Line 412 | XKeyPressedEvent  *ekey;
412          com = buf[0];
413          switch (com) {                  /* interpret command */
414          case 'q':
415 <        case CTRL(D):                           /* quit */
415 >        case CTRL('D'):                         /* quit */
416                  quit(0);
417          case '\n':
418          case '\r':
# Line 455 | Line 452 | XKeyPressedEvent  *ekey;
452                  XStoreColor(thedisplay, ourras->cmap, &cvx);
453                  return(0);
454          case 'p':                               /* position */
455 <                sprintf(buf, "(%d,%d)", ekey->x-xoff, ymax-1-ekey->y+yoff);
455 >                pix2loc(hv, &inpres, ekey->x-xoff, ekey->y-yoff);
456 >                sprintf(buf, "(%d,%d)", (int)(hv[0]*inpres.xr),
457 >                                (int)(hv[1]*inpres.yr));
458                  XDrawImageString(thedisplay, wind, ourgc, ekey->x, ekey->y,
459                                          buf, strlen(buf));
460                  return(0);
# Line 464 | Line 463 | XKeyPressedEvent  *ekey;
463                          XBell(thedisplay, 0);
464                          return(-1);
465                  }
466 <                if (viewray(rorg, rdir, &ourview,
467 <                                (ekey->x-xoff+.5)/xmax,
469 <                                (ymax-1-ekey->y+yoff+.5)/ymax) < 0)
466 >                pix2loc(hv, &inpres, ekey->x-xoff, ekey->y-yoff);
467 >                if (viewray(rorg, rdir, &ourview, hv[0], hv[1]) < 0)
468                          return(-1);
469                  printf("%e %e %e ", rorg[0], rorg[1], rorg[2]);
470                  printf("%e %e %e\n", rdir[0], rdir[1], rdir[2]);
# Line 488 | Line 486 | XKeyPressedEvent  *ekey;
486                  free_raster(ourras);
487                  getras();
488          /* fall through */
489 <        case CTRL(R):                           /* redraw */
490 <        case CTRL(L):
489 >        case CTRL('R'):                         /* redraw */
490 >        case CTRL('L'):
491                  unmap_rcolors(ourras);
492                  XClearWindow(thedisplay, wind);
493                  map_rcolors(ourras, wind);
# Line 581 | Line 579 | int  x0, y0, x1, y1;
579   avgbox(clr)                             /* average color over current box */
580   COLOR  clr;
581   {
582 +        static COLOR  lc;
583 +        static int  ll, lr, lt, lb;
584          int  left, right, top, bottom;
585          int  y;
586          double  d;
# Line 604 | Line 604 | COLOR  clr;
604                  bottom = ymax;
605          if (top >= bottom)
606                  return(-1);
607 +        if (left == ll && right == lr && top == lt && bottom == lb) {
608 +                copycolor(clr, lc);
609 +                return;
610 +        }
611          for (y = top; y < bottom; y++) {
612                  if (getscan(y) == -1)
613                          return(-1);
# Line 614 | Line 618 | COLOR  clr;
618          }
619          d = 1.0/((right-left)*(bottom-top));
620          scalecolor(clr, d);
621 +        ll = left; lr = right; lt = top; lb = bottom;
622 +        copycolor(lc, clr);
623          return(0);
624   }
625  
# Line 622 | Line 628 | getmono()                      /* get monochrome data */
628   {
629          register unsigned char  *dp;
630          register int    x, err;
631 <        int     y;
631 >        int     y, errp;
632          short   *cerr;
633  
634          if ((cerr = (short *)calloc(xmax,sizeof(short))) == NULL)
# Line 637 | Line 643 | getmono()                      /* get monochrome data */
643                  for (x = 0; x < xmax; x++) {
644                          if (!(x&7))
645                                  *++dp = 0;
646 +                        errp = err;
647                          err += normbright(scanline[x]) + cerr[x];
648                          if (err > 127)
649                                  err -= 255;
650                          else
651                                  *dp |= 1<<(7-(x&07));
652 <                        cerr[x] = err >>= 1;
652 >                        err /= 3;
653 >                        cerr[x] = err + errp;
654                  }
655          }
656          free((char *)cerr);
# Line 653 | Line 661 | add2icon(y, scan)              /* add a scanline to our icon data
661   int  y;
662   COLR  *scan;
663   {
656        static char  *dp = NULL;
664          static short  cerr[ICONSIZ];
665 +        static int  ynext;
666 +        static char  *dp;
667          register int  err;
668 <        register int    x, xi;
668 >        register int    x, ti;
669 >        int  errp;
670  
671          if (iconheight == 0) {          /* initialize */
672                  if (xmax <= ICONSIZ && ymax <= ICONSIZ) {
# Line 665 | Line 675 | COLR  *scan;
675                  } else if (xmax > ymax) {
676                          iconwidth = ICONSIZ;
677                          iconheight = ICONSIZ*ymax/xmax;
678 +                        if (iconheight < 1)
679 +                                iconheight = 1;
680                  } else {
681                          iconwidth = ICONSIZ*xmax/ymax;
682 +                        if (iconwidth < 1)
683 +                                iconwidth = 1;
684                          iconheight = ICONSIZ;
685                  }
686 +                ynext = 0;
687                  dp = icondata - 1;
688          }
689 <        if (dp == NULL)                 /* done already */
689 >        if (y < ynext*ymax/iconheight)  /* skip this one */
690                  return;
676        if (y % (ymax/iconheight))      /* skip this one */
677                return;
691          err = 0;
692          for (x = 0; x < iconwidth; x++) {
693                  if (!(x&7))
694                          *++dp = 0;
695 <                xi = x*xmax/iconwidth;
696 <                err += normbright(scan[xi]) + cerr[x];
695 >                errp = err;
696 >                ti = x*xmax/iconwidth;
697 >                err += normbright(scan[ti]) + cerr[x];
698                  if (err > 127)
699                          err -= 255;
700                  else
701                          *dp |= 1<<(x&07);
702 <                cerr[x] = err >>= 1;
702 >                err /= 3;
703 >                cerr[x] = err + errp;
704          }
705 <        if (y >= ymax - ymax/iconheight)        /* all done */
691 <                dp = NULL;
705 >        ynext++;
706   }
707  
708  
# Line 708 | Line 722 | getfull()                      /* get full (24-bit) data */
722                          shiftcolrs(scanline, xmax, scale);
723                  colrs_gambs(scanline, xmax);
724                  add2icon(y, scanline);
725 <                for (x = 0; x < xmax; x++) {
712 <                        *dp++ = scanline[x][RED];
713 <                        *dp++ = scanline[x][GRN];
725 >                for (x = 0; x < xmax; x++) {    /* BGR byte ordering */
726                          *dp++ = scanline[x][BLU];
727 +                        *dp++ = scanline[x][GRN];
728 +                        *dp++ = scanline[x][RED];
729                  }
730          }
731   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines