| 1 | – | /* Copyright (c) 1999 Silicon Graphics, Inc. */ | 
| 2 | – |  | 
| 1 |  | #ifndef lint | 
| 2 | < | static char SCCSid[] = "$SunId$ SGI"; | 
| 2 | > | static const char       RCSid[] = "$Id$"; | 
| 3 |  | #endif | 
| 6 | – |  | 
| 4 |  | /* | 
| 5 |  | * Interpolate and extrapolate pictures with different view parameters. | 
| 6 |  | * | 
| 7 |  | *      Greg Ward       09Dec89 | 
| 8 |  | */ | 
| 9 |  |  | 
| 10 | < | #include "standard.h" | 
| 10 | > | #include "copyright.h" | 
| 11 |  |  | 
| 12 |  | #include <ctype.h> | 
| 13 | + | #include <string.h> | 
| 14 |  |  | 
| 15 | + | #include "platform.h" | 
| 16 | + | #include "standard.h" | 
| 17 | + | #include "rtprocess.h" /* Windows: must come before color.h */ | 
| 18 |  | #include "view.h" | 
| 18 | – |  | 
| 19 |  | #include "color.h" | 
| 20 |  |  | 
| 21 | – | #include "resolu.h" | 
| 22 | – |  | 
| 21 |  | #define LOG2            0.69314718055994530942 | 
| 22 |  |  | 
| 23 |  | #define pscan(y)        (ourpict+(y)*hresolu) | 
| 28 |  | #define averaging       (ourweigh != NULL) | 
| 29 |  | #define blurring        (ourbpict != NULL) | 
| 30 |  | #define usematrix       (hasmatrix & !averaging) | 
| 31 | < | #define zisnorm         (!usematrix | ourview.type != VT_PER) | 
| 31 | > | #define zisnorm         ((!usematrix) | (ourview.type != VT_PER)) | 
| 32 |  |  | 
| 33 |  | #define MAXWT           1000.           /* maximum pixel weight (averaging) */ | 
| 34 |  |  | 
| 68 |  |  | 
| 69 |  | int     fillo = F_FORE|F_BACK;          /* selected fill options */ | 
| 70 |  | int     fillsamp = 0;                   /* sample separation (0 == inf) */ | 
| 73 | – | extern int      backfill(), rcalfill(); /* fill functions */ | 
| 74 | – | int     (*fillfunc)() = backfill;       /* selected fill function */ | 
| 71 |  | COLR    backcolr = BLKCOLR;             /* background color */ | 
| 72 |  | COLOR   backcolor = BLKCOLOR;           /* background color (float) */ | 
| 73 |  | double  backz = 0.0;                    /* background z value */ | 
| 85 |  | MAT4    theirs2ours;                    /* transformation matrix */ | 
| 86 |  | int     hasmatrix = 0;                  /* has transformation matrix */ | 
| 87 |  |  | 
| 88 | < | int     PDesc[3] = {-1,-1,-1};          /* rtrace process descriptor */ | 
| 93 | < | #define childpid        (PDesc[2]) | 
| 88 | > | static SUBPROC PDesc = SP_INACTIVE; /* rtrace process descriptor */ | 
| 89 |  | unsigned short  queue[PACKSIZ][2];      /* pending pixels */ | 
| 90 |  | int     packsiz;                        /* actual packet size */ | 
| 91 |  | int     queuesiz = 0;                   /* number of pixels pending */ | 
| 92 |  |  | 
| 93 | < | extern double   movepixel(); | 
| 93 | > | typedef void fillfunc_t(int x, int y); | 
| 94 |  |  | 
| 95 | + | static gethfunc headline; | 
| 96 | + | static int nextview(FILE *fp); | 
| 97 | + | static void compavgview(void); | 
| 98 | + | static void addpicture(char *pfile, char *zspec); | 
| 99 | + | static int pixform(MAT4 xfmat, VIEW *vw1, VIEW *vw2); | 
| 100 | + | static void addscanline(struct bound *xl, int y, | 
| 101 | + | COLR *pline, float *zline, struct position *lasty); | 
| 102 | + | static void addpixel(struct position *p0, struct position *p1, | 
| 103 | + | struct position *p2, COLR pix, double w, double z); | 
| 104 | + | static double movepixel(FVECT pos); | 
| 105 | + | static int getperim(struct bound *xl, struct bound *yl, float *zline, int zfd); | 
| 106 | + | static void backpicture(fillfunc_t *fill, int samp); | 
| 107 | + | static void fillpicture(fillfunc_t *fill); | 
| 108 | + | static int clipaft(void); | 
| 109 | + | static int addblur(void); | 
| 110 | + | static void writepicture(void); | 
| 111 | + | static void writedistance(char *fname); | 
| 112 | + | static fillfunc_t backfill; | 
| 113 | + | static fillfunc_t rcalfill; | 
| 114 | + | static void calstart(char *prog, char *args); | 
| 115 | + | static void caldone(void); | 
| 116 | + | static void clearqueue(void); | 
| 117 | + | static void syserror(char *s); | 
| 118 |  |  | 
| 119 | < | main(argc, argv)                        /* interpolate pictures */ | 
| 120 | < | int     argc; | 
| 121 | < | char    *argv[]; | 
| 119 | > | fillfunc_t *fillfunc = backfill;        /* selected fill function */ | 
| 120 | > |  | 
| 121 | > | int | 
| 122 | > | main(                   /* interpolate pictures */ | 
| 123 | > | int     argc, | 
| 124 | > | char    *argv[] | 
| 125 | > | ) | 
| 126 |  | { | 
| 127 |  | #define  check(ol,al)           if (argv[an][ol] || \ | 
| 128 |  | badarg(argc-an-1,argv+an+1,al)) \ | 
| 134 |  | char    *expcomp = NULL; | 
| 135 |  | int     i, an, rval; | 
| 136 |  |  | 
| 137 | + | SET_DEFAULT_BINARY(); | 
| 138 | + | SET_FILE_BINARY(stdout); | 
| 139 | + |  | 
| 140 |  | progname = argv[0]; | 
| 141 |  |  | 
| 142 |  | for (an = 1; an < argc && argv[an][0] == '-'; an++) { | 
| 238 |  | if (argv[an][2] != 'f') | 
| 239 |  | goto badopt; | 
| 240 |  | check(3,"s"); | 
| 241 | < | gotvfile = viewfile(argv[++an], &ourview, 0, 0); | 
| 241 | > | gotvfile = viewfile(argv[++an], &ourview, NULL); | 
| 242 |  | if (gotvfile < 0) | 
| 243 |  | syserror(argv[an]); | 
| 244 |  | else if (gotvfile == 0) { | 
| 261 |  | fillo &= ~F_BACK; | 
| 262 |  | if (doavg < 0) | 
| 263 |  | doavg = (argc-an) > 2; | 
| 264 | < | if (expcomp != NULL) | 
| 265 | < | if (expcomp[0] == '+' | expcomp[0] == '-') { | 
| 264 | > | if (expcomp != NULL) { | 
| 265 | > | if ((expcomp[0] == '+') | (expcomp[0] == '-')) { | 
| 266 |  | expadj = atof(expcomp) + (expcomp[0]=='+' ? .5 : -.5); | 
| 267 |  | if (doavg | doblur) | 
| 268 |  | rexpadj = pow(2.0, atof(expcomp)); | 
| 276 |  | if (!(doavg | doblur)) | 
| 277 |  | rexpadj = pow(2.0, (double)expadj); | 
| 278 |  | } | 
| 279 | + | } | 
| 280 |  | /* set view */ | 
| 281 |  | if (nextview(doblur ? stdin : (FILE *)NULL) == EOF) { | 
| 282 |  | fprintf(stderr, "%s: no view on standard input!\n", | 
| 288 |  | if (doavg) { | 
| 289 |  | ourspict = (COLOR *)bmalloc(hresolu*vresolu*sizeof(COLOR)); | 
| 290 |  | ourweigh = (float *)bmalloc(hresolu*vresolu*sizeof(float)); | 
| 291 | < | if (ourspict == NULL | ourweigh == NULL) | 
| 291 | > | if ((ourspict == NULL) | (ourweigh == NULL)) | 
| 292 |  | syserror(progname); | 
| 293 |  | } else { | 
| 294 |  | ourpict = (COLR *)bmalloc(hresolu*vresolu*sizeof(COLR)); | 
| 305 |  | syserror(progname); | 
| 306 |  | /* new header */ | 
| 307 |  | newheader("RADIANCE", stdout); | 
| 308 | + | fputnow(stdout); | 
| 309 |  | /* run pictures */ | 
| 310 |  | do { | 
| 311 | < | bzero((char *)ourzbuf, hresolu*vresolu*sizeof(float)); | 
| 311 | > | memset((char *)ourzbuf, '\0', hresolu*vresolu*sizeof(float)); | 
| 312 |  | for (i = an; i < argc; i += 2) | 
| 313 |  | addpicture(argv[i], argv[i+1]); | 
| 314 |  | if (fillo&F_BACK)                       /* fill in spaces */ | 
| 328 |  | fprintview(&avgview, stdout); | 
| 329 |  | putc('\n', stdout); | 
| 330 |  | } | 
| 331 | < | if (pixaspect < .99 | pixaspect > 1.01) | 
| 331 | > | if ((pixaspect < .99) | (pixaspect > 1.01)) | 
| 332 |  | fputaspect(pixaspect, stdout); | 
| 333 |  | if (ourexp > 0) | 
| 334 |  | ourexp *= rexpadj; | 
| 335 |  | else | 
| 336 |  | ourexp = rexpadj; | 
| 337 | < | if (ourexp < .995 | ourexp > 1.005) | 
| 337 | > | if ((ourexp < .995) | (ourexp > 1.005)) | 
| 338 |  | fputexpos(ourexp, stdout); | 
| 339 |  | if (strcmp(ourfmt, PICFMT))             /* print format if known */ | 
| 340 |  | fputformat(ourfmt, stdout); | 
| 355 |  | } | 
| 356 |  |  | 
| 357 |  |  | 
| 358 | < | int | 
| 359 | < | headline(s)                             /* process header string */ | 
| 360 | < | char    *s; | 
| 358 | > | static int | 
| 359 | > | headline(                               /* process header string */ | 
| 360 | > | char    *s, | 
| 361 | > | void    *p | 
| 362 | > | ) | 
| 363 |  | { | 
| 364 |  | char    fmt[32]; | 
| 365 |  |  | 
| 387 |  | } | 
| 388 |  |  | 
| 389 |  |  | 
| 390 | < | nextview(fp)                            /* get and set next view */ | 
| 391 | < | FILE    *fp; | 
| 390 | > | static int | 
| 391 | > | nextview(                               /* get and set next view */ | 
| 392 | > | FILE    *fp | 
| 393 | > | ) | 
| 394 |  | { | 
| 395 |  | char    linebuf[256]; | 
| 396 |  | char    *err; | 
| 397 | < | register int    i; | 
| 397 | > | int     i; | 
| 398 |  |  | 
| 399 |  | if (fp != NULL) { | 
| 400 |  | do                      /* get new view */ | 
| 408 |  | exit(1); | 
| 409 |  | } | 
| 410 |  | if (!nvavg) {                   /* first view */ | 
| 411 | < | copystruct(&avgview, &ourview); | 
| 411 | > | avgview = ourview; | 
| 412 |  | return(nvavg++); | 
| 413 |  | } | 
| 414 |  | /* add to average view */ | 
| 417 |  | avgview.vdir[i] += ourview.vdir[i]; | 
| 418 |  | avgview.vup[i] += ourview.vup[i]; | 
| 419 |  | } | 
| 420 | + | avgview.vdist += ourview.vdist; | 
| 421 |  | avgview.horiz += ourview.horiz; | 
| 422 |  | avgview.vert += ourview.vert; | 
| 423 |  | avgview.hoff += ourview.hoff; | 
| 428 |  | } | 
| 429 |  |  | 
| 430 |  |  | 
| 431 | < | compavgview()                           /* compute average view */ | 
| 431 | > | static void | 
| 432 | > | compavgview(void)                               /* compute average view */ | 
| 433 |  | { | 
| 434 | < | register int    i; | 
| 434 | > | int     i; | 
| 435 |  | double  f; | 
| 436 |  |  | 
| 437 |  | if (nvavg < 2) | 
| 442 |  | avgview.vdir[i] *= f; | 
| 443 |  | avgview.vup[i] *= f; | 
| 444 |  | } | 
| 445 | + | avgview.vdist *= f; | 
| 446 |  | avgview.horiz *= f; | 
| 447 |  | avgview.vert *= f; | 
| 448 |  | avgview.hoff *= f; | 
| 450 |  | avgview.vfore *= f; | 
| 451 |  | avgview.vaft *= f; | 
| 452 |  | if (setview(&avgview) != NULL)          /* in case of emergency... */ | 
| 453 | < | copystruct(&avgview, &ourview); | 
| 453 | > | avgview = ourview; | 
| 454 |  | pixaspect = viewaspect(&avgview) * hresolu / vresolu; | 
| 455 |  | } | 
| 456 |  |  | 
| 457 |  |  | 
| 458 | < | addpicture(pfile, zspec)                /* add picture to output */ | 
| 459 | < | char    *pfile, *zspec; | 
| 458 | > | static void | 
| 459 | > | addpicture(             /* add picture to output */ | 
| 460 | > | char    *pfile, | 
| 461 | > | char    *zspec | 
| 462 | > | ) | 
| 463 |  | { | 
| 464 |  | FILE    *pfp; | 
| 465 |  | int     zfd; | 
| 474 |  | syserror(pfile); | 
| 475 |  | /* get header with exposure and view */ | 
| 476 |  | theirexp = 1.0; | 
| 477 | < | copystruct(&theirview, &stdview); | 
| 477 | > | theirview = stdview; | 
| 478 |  | gotview = 0; | 
| 479 |  | if (nvavg < 2) | 
| 480 |  | printf("%s:\n", pfile); | 
| 487 |  | ourexp = theirexp; | 
| 488 |  | else if (ABS(theirexp-ourexp) > .01*ourexp) | 
| 489 |  | fprintf(stderr, "%s: different exposure (warning)\n", pfile); | 
| 490 | < | if (err = setview(&theirview)) { | 
| 490 | > | if ( (err = setview(&theirview)) ) { | 
| 491 |  | fprintf(stderr, "%s: %s\n", pfile, err); | 
| 492 |  | exit(1); | 
| 493 |  | } | 
| 499 |  | syserror(progname); | 
| 500 |  | if ((zfd = open(zspec, O_RDONLY)) == -1) { | 
| 501 |  | double  zvalue; | 
| 502 | < | register int    x; | 
| 502 | > | int     x; | 
| 503 |  | if (!isflt(zspec) || (zvalue = atof(zspec)) <= 0.0) | 
| 504 |  | syserror(zspec); | 
| 505 |  | for (x = scanlen(&tresolu); x-- > 0; ) | 
| 510 |  | if (xlim == NULL) | 
| 511 |  | syserror(progname); | 
| 512 |  | if (!getperim(xlim, &ylim, zin, zfd)) { /* overlapping area? */ | 
| 513 | < | free((char *)zin); | 
| 514 | < | free((char *)xlim); | 
| 513 | > | free((void *)zin); | 
| 514 | > | free((void *)xlim); | 
| 515 |  | if (zfd != -1) | 
| 516 |  | close(zfd); | 
| 517 |  | fclose(pfp); | 
| 521 |  | scanin = (COLR *)malloc(scanlen(&tresolu)*sizeof(COLR)); | 
| 522 |  | plast = (struct position *)calloc(scanlen(&tresolu), | 
| 523 |  | sizeof(struct position)); | 
| 524 | < | if (scanin == NULL | plast == NULL) | 
| 524 | > | if ((scanin == NULL) | (plast == NULL)) | 
| 525 |  | syserror(progname); | 
| 526 |  | /* skip to starting point */ | 
| 527 |  | for (y = 0; y < ylim.min; y++) | 
| 530 |  | exit(1); | 
| 531 |  | } | 
| 532 |  | if (zfd != -1 && lseek(zfd, | 
| 533 | < | (long)ylim.min*scanlen(&tresolu)*sizeof(float), 0) < 0) | 
| 533 | > | (off_t)ylim.min*scanlen(&tresolu)*sizeof(float), | 
| 534 | > | SEEK_SET) < 0) | 
| 535 |  | syserror(zspec); | 
| 536 |  | /* load image */ | 
| 537 |  | for (y = ylim.min; y <= ylim.max; y++) { | 
| 546 |  | addscanline(xlim+y, y, scanin, zin, plast); | 
| 547 |  | } | 
| 548 |  | /* clean up */ | 
| 549 | < | free((char *)xlim); | 
| 550 | < | free((char *)scanin); | 
| 551 | < | free((char *)zin); | 
| 552 | < | free((char *)plast); | 
| 549 | > | free((void *)xlim); | 
| 550 | > | free((void *)scanin); | 
| 551 | > | free((void *)zin); | 
| 552 | > | free((void *)plast); | 
| 553 |  | fclose(pfp); | 
| 554 |  | if (zfd != -1) | 
| 555 |  | close(zfd); | 
| 556 |  | } | 
| 557 |  |  | 
| 558 |  |  | 
| 559 | < | pixform(xfmat, vw1, vw2)                /* compute view1 to view2 matrix */ | 
| 560 | < | register MAT4   xfmat; | 
| 561 | < | register VIEW   *vw1, *vw2; | 
| 559 | > | static int | 
| 560 | > | pixform(                /* compute view1 to view2 matrix */ | 
| 561 | > | MAT4    xfmat, | 
| 562 | > | VIEW    *vw1, | 
| 563 | > | VIEW    *vw2 | 
| 564 | > | ) | 
| 565 |  | { | 
| 566 | < | double  m4t[4][4]; | 
| 566 | > | MAT4    m4t; | 
| 567 |  |  | 
| 568 | < | if (vw1->type != VT_PER & vw1->type != VT_PAR) | 
| 568 | > | if ((vw1->type != VT_PER) & (vw1->type != VT_PAR)) | 
| 569 |  | return(0); | 
| 570 | < | if (vw2->type != VT_PER & vw2->type != VT_PAR) | 
| 570 | > | if ((vw2->type != VT_PER) & (vw2->type != VT_PAR)) | 
| 571 |  | return(0); | 
| 572 |  | setident4(xfmat); | 
| 573 |  | xfmat[0][0] = vw1->hvec[0]; | 
| 600 |  | } | 
| 601 |  |  | 
| 602 |  |  | 
| 603 | < | addscanline(xl, y, pline, zline, lasty) /* add scanline to output */ | 
| 604 | < | struct bound    *xl; | 
| 605 | < | int     y; | 
| 606 | < | COLR    *pline; | 
| 607 | < | float   *zline; | 
| 608 | < | struct position *lasty;         /* input/output */ | 
| 603 | > | static void | 
| 604 | > | addscanline(    /* add scanline to output */ | 
| 605 | > | struct bound    *xl, | 
| 606 | > | int     y, | 
| 607 | > | COLR    *pline, | 
| 608 | > | float   *zline, | 
| 609 | > | struct position *lasty          /* input/output */ | 
| 610 | > | ) | 
| 611 |  | { | 
| 612 |  | FVECT   pos; | 
| 613 |  | struct position lastx, newpos; | 
| 614 |  | double  wt; | 
| 615 | < | register int    x; | 
| 615 | > | int     x; | 
| 616 |  |  | 
| 617 |  | lastx.z = 0; | 
| 618 |  | for (x = xl->max; x >= xl->min; x--) { | 
| 634 |  | } | 
| 635 |  |  | 
| 636 |  |  | 
| 637 | < | addpixel(p0, p1, p2, pix, w, z)         /* fill in pixel parallelogram */ | 
| 638 | < | struct position *p0, *p1, *p2; | 
| 639 | < | COLR    pix; | 
| 640 | < | double  w; | 
| 641 | < | double  z; | 
| 637 | > | static void | 
| 638 | > | addpixel(               /* fill in pixel parallelogram */ | 
| 639 | > | struct position *p0, | 
| 640 | > | struct position *p1, | 
| 641 | > | struct position *p2, | 
| 642 | > | COLR    pix, | 
| 643 | > | double  w, | 
| 644 | > | double  z | 
| 645 | > | ) | 
| 646 |  | { | 
| 647 |  | double  zt = 2.*zeps*p0->z;             /* threshold */ | 
| 648 |  | COLOR   pval;                           /* converted+weighted pixel */ | 
| 650 |  | int     l1, l2, c1, c2;                 /* side lengths and counters */ | 
| 651 |  | int     p1isy;                          /* p0p1 along y? */ | 
| 652 |  | int     x1, y1;                         /* p1 position */ | 
| 653 | < | register int    x, y;                   /* final position */ | 
| 653 | > | int     x, y;                   /* final position */ | 
| 654 |  |  | 
| 655 |  | /* compute vector p0p1 */ | 
| 656 |  | if (fillo&F_FORE && ABS(p1->z-p0->z) <= zt) { | 
| 657 |  | s1x = p1->x - p0->x; | 
| 658 |  | s1y = p1->y - p0->y; | 
| 659 |  | l1 = ABS(s1x); | 
| 660 | < | if (p1isy = (ABS(s1y) > l1)) | 
| 660 | > | if ( (p1isy = (ABS(s1y) > l1)) ) | 
| 661 |  | l1 = ABS(s1y); | 
| 662 |  | else if (l1 < 1) | 
| 663 |  | l1 = 1; | 
| 690 |  | y1 = p0->y + c1*s1y/l1; | 
| 691 |  | for (c2 = l2; c2-- > 0; ) { | 
| 692 |  | x = x1 + c2*s2x/l2; | 
| 693 | < | if (x < 0 | x >= hresolu) | 
| 693 | > | if ((x < 0) | (x >= hresolu)) | 
| 694 |  | continue; | 
| 695 |  | y = y1 + c2*s2y/l2; | 
| 696 | < | if (y < 0 | y >= vresolu) | 
| 696 | > | if ((y < 0) | (y >= vresolu)) | 
| 697 |  | continue; | 
| 698 |  | if (averaging) { | 
| 699 |  | if (zscan(y)[x] <= 0 || zscan(y)[x]-z | 
| 715 |  | } | 
| 716 |  |  | 
| 717 |  |  | 
| 718 | < | double | 
| 719 | < | movepixel(pos)                          /* reposition image point */ | 
| 720 | < | register FVECT  pos; | 
| 718 | > | static double | 
| 719 | > | movepixel(                              /* reposition image point */ | 
| 720 | > | FVECT   pos | 
| 721 | > | ) | 
| 722 |  | { | 
| 723 |  | FVECT   pt, tdir, odir; | 
| 724 |  | double  d; | 
| 728 |  | if (usematrix) { | 
| 729 |  | pos[0] += theirview.hoff - .5; | 
| 730 |  | pos[1] += theirview.voff - .5; | 
| 731 | < | if (normdist & theirview.type == VT_PER) | 
| 731 | > | if (normdist & (theirview.type == VT_PER)) | 
| 732 |  | d = sqrt(1. + pos[0]*pos[0]*theirview.hn2 | 
| 733 |  | + pos[1]*pos[1]*theirview.vn2); | 
| 734 |  | else | 
| 752 |  | } else { | 
| 753 |  | if (viewray(pt, tdir, &theirview, pos[0], pos[1]) < -FTINY) | 
| 754 |  | return(0); | 
| 755 | < | if (!normdist & theirview.type == VT_PER)       /* adjust */ | 
| 756 | < | pos[2] *= sqrt(1. + pos[0]*pos[0]*theirview.hn2 | 
| 709 | < | + pos[1]*pos[1]*theirview.vn2); | 
| 755 | > | if ((!normdist) & (theirview.type == VT_PER))   /* adjust */ | 
| 756 | > | pos[2] /= DOT(theirview.vdir, tdir); | 
| 757 |  | pt[0] += tdir[0]*pos[2]; | 
| 758 |  | pt[1] += tdir[1]*pos[2]; | 
| 759 |  | pt[2] += tdir[2]*pos[2]; | 
| 760 | < | viewloc(pos, &ourview, pt); | 
| 714 | < | if (pos[2] <= 0) | 
| 760 | > | if (viewloc(pos, &ourview, pt) <= 0) | 
| 761 |  | return(0); | 
| 762 |  | } | 
| 763 | < | if (pos[0] < 0 | pos[0] >= 1-FTINY | pos[1] < 0 | pos[1] >= 1-FTINY) | 
| 763 | > | if ((pos[0] < 0) | (pos[0] >= 1-FTINY) | (pos[1] < 0) | (pos[1] >= 1-FTINY)) | 
| 764 |  | return(0); | 
| 765 |  | if (!averaging) | 
| 766 |  | return(1); | 
| 779 |  | } | 
| 780 |  |  | 
| 781 |  |  | 
| 782 | < | getperim(xl, yl, zline, zfd)            /* compute overlapping image area */ | 
| 783 | < | register struct bound   *xl; | 
| 784 | < | struct bound    *yl; | 
| 785 | < | float   *zline; | 
| 786 | < | int     zfd; | 
| 782 | > | static int | 
| 783 | > | getperim(               /* compute overlapping image area */ | 
| 784 | > | struct bound    *xl, | 
| 785 | > | struct bound    *yl, | 
| 786 | > | float   *zline, | 
| 787 | > | int     zfd | 
| 788 | > | ) | 
| 789 |  | { | 
| 790 |  | int     step; | 
| 791 |  | FVECT   pos; | 
| 792 | < | register int    x, y; | 
| 792 | > | int     x, y; | 
| 793 |  | /* set up step size */ | 
| 794 |  | if (scanlen(&tresolu) < numscans(&tresolu)) | 
| 795 |  | step = scanlen(&tresolu)/NSTEPS; | 
| 808 |  | yl->min = 32000; yl->max = 0;           /* search for points on image */ | 
| 809 |  | for (y = step - 1; y < numscans(&tresolu); y += step) { | 
| 810 |  | if (zfd != -1) { | 
| 811 | < | if (lseek(zfd, (long)y*scanlen(&tresolu)*sizeof(float), | 
| 812 | < | 0) < 0) | 
| 811 | > | if (lseek(zfd, (off_t)y*scanlen(&tresolu)*sizeof(float), | 
| 812 | > | SEEK_SET) < 0) | 
| 813 |  | syserror("lseek"); | 
| 814 |  | if (read(zfd, (char *)zline, | 
| 815 |  | scanlen(&tresolu)*sizeof(float)) | 
| 854 |  | xl[y-1].max = xl[y-step].max; | 
| 855 |  | } | 
| 856 |  | for (x = 2; x < step; x++) | 
| 857 | < | copystruct(xl+y-x, xl+y-1); | 
| 857 | > | *(xl+y-x) = *(xl+y-1); | 
| 858 |  | } | 
| 859 |  | if (yl->max >= numscans(&tresolu)) | 
| 860 |  | yl->max = numscans(&tresolu) - 1; | 
| 861 |  | y -= step; | 
| 862 |  | for (x = numscans(&tresolu) - 1; x > y; x--)    /* fill bottom rows */ | 
| 863 | < | copystruct(xl+x, xl+y); | 
| 863 | > | *(xl+x) = *(xl+y); | 
| 864 |  | return(yl->max >= yl->min); | 
| 865 |  | } | 
| 866 |  |  | 
| 867 |  |  | 
| 868 | < | backpicture(fill, samp)                 /* background fill algorithm */ | 
| 869 | < | int     (*fill)(); | 
| 870 | < | int     samp; | 
| 868 | > | static void | 
| 869 | > | backpicture(                    /* background fill algorithm */ | 
| 870 | > | fillfunc_t *fill, | 
| 871 | > | int     samp | 
| 872 | > | ) | 
| 873 |  | { | 
| 874 |  | int     *yback, xback; | 
| 875 |  | int     y; | 
| 876 | < | register int    x, i; | 
| 876 | > | int     x, i; | 
| 877 |  | /* get back buffer */ | 
| 878 |  | yback = (int *)malloc(hresolu*sizeof(int)); | 
| 879 |  | if (yback == NULL) | 
| 971 |  | xback = -2; | 
| 972 |  | } | 
| 973 |  | } | 
| 974 | < | free((char *)yback); | 
| 974 | > | free((void *)yback); | 
| 975 |  | } | 
| 976 |  |  | 
| 977 |  |  | 
| 978 | < | fillpicture(fill)               /* paint in empty pixels using fill */ | 
| 979 | < | int     (*fill)(); | 
| 978 | > | static void | 
| 979 | > | fillpicture(            /* paint in empty pixels using fill */ | 
| 980 | > | fillfunc_t *fill | 
| 981 | > | ) | 
| 982 |  | { | 
| 983 | < | register int    x, y; | 
| 983 | > | int     x, y; | 
| 984 |  |  | 
| 985 |  | for (y = 0; y < vresolu; y++) | 
| 986 |  | for (x = 0; x < hresolu; x++) | 
| 991 |  | } | 
| 992 |  |  | 
| 993 |  |  | 
| 994 | < | clipaft()                       /* perform aft clipping as indicated */ | 
| 994 | > | static int | 
| 995 | > | clipaft(void)                   /* perform aft clipping as indicated */ | 
| 996 |  | { | 
| 997 | < | register int    x, y; | 
| 998 | < | int     adjtest = ourview.type == VT_PER & zisnorm; | 
| 997 | > | int     x, y; | 
| 998 | > | int     adjtest = (ourview.type == VT_PER) & zisnorm; | 
| 999 |  | double  tstdist; | 
| 1000 |  | double  yzn2, vx; | 
| 1001 |  |  | 
| 1018 |  | continue; | 
| 1019 |  | } | 
| 1020 |  | if (averaging) | 
| 1021 | < | bzero(sscan(y)[x], sizeof(COLOR)); | 
| 1021 | > | memset(sscan(y)[x], '\0', sizeof(COLOR)); | 
| 1022 |  | else | 
| 1023 | < | bzero(pscan(y)[x], sizeof(COLR)); | 
| 1023 | > | memset(pscan(y)[x], '\0', sizeof(COLR)); | 
| 1024 |  | zscan(y)[x] = 0.0; | 
| 1025 |  | } | 
| 1026 |  | } | 
| 1028 |  | } | 
| 1029 |  |  | 
| 1030 |  |  | 
| 1031 | < | addblur()                               /* add to blurred picture */ | 
| 1031 | > | static int | 
| 1032 | > | addblur(void)                           /* add to blurred picture */ | 
| 1033 |  | { | 
| 1034 |  | COLOR   cval; | 
| 1035 |  | double  d; | 
| 1036 | < | register int    i; | 
| 1036 | > | int     i; | 
| 1037 |  |  | 
| 1038 |  | if (!blurring) | 
| 1039 |  | return(0); | 
| 1069 |  | } | 
| 1070 |  |  | 
| 1071 |  |  | 
| 1072 | < | writepicture()                          /* write out picture (alters buffer) */ | 
| 1072 | > | static void | 
| 1073 | > | writepicture(void)                              /* write out picture (alters buffer) */ | 
| 1074 |  | { | 
| 1075 |  | int     y; | 
| 1076 | < | register int    x; | 
| 1076 | > | int     x; | 
| 1077 |  | double  d; | 
| 1078 |  |  | 
| 1079 |  | fprtresolu(hresolu, vresolu, stdout); | 
| 1101 |  | } | 
| 1102 |  |  | 
| 1103 |  |  | 
| 1104 | < | writedistance(fname)                    /* write out z file (alters buffer) */ | 
| 1105 | < | char    *fname; | 
| 1104 | > | static void | 
| 1105 | > | writedistance(                  /* write out z file (alters buffer) */ | 
| 1106 | > | char    *fname | 
| 1107 | > | ) | 
| 1108 |  | { | 
| 1109 |  | int     donorm = normdist & !zisnorm ? 1 : | 
| 1110 | < | ourview.type == VT_PER & !normdist & zisnorm ? -1 : 0; | 
| 1110 | > | (ourview.type == VT_PER) & !normdist & zisnorm ? -1 : 0; | 
| 1111 |  | int     fd; | 
| 1112 |  | int     y; | 
| 1113 |  |  | 
| 1116 |  | for (y = vresolu-1; y >= 0; y--) { | 
| 1117 |  | if (donorm) { | 
| 1118 |  | double  vx, yzn2, d; | 
| 1119 | < | register int    x; | 
| 1119 | > | int     x; | 
| 1120 |  | yzn2 = (y+.5)/vresolu + ourview.voff - .5; | 
| 1121 |  | yzn2 = 1. + yzn2*yzn2*ourview.vn2; | 
| 1122 |  | for (x = 0; x < hresolu; x++) { | 
| 1136 |  | } | 
| 1137 |  |  | 
| 1138 |  |  | 
| 1139 | < | backfill(x, y)                          /* fill pixel with background */ | 
| 1140 | < | int     x, y; | 
| 1139 | > | static void | 
| 1140 | > | backfill(                               /* fill pixel with background */ | 
| 1141 | > | int     x, | 
| 1142 | > | int     y | 
| 1143 | > | ) | 
| 1144 |  | { | 
| 1145 |  | if (averaging) { | 
| 1146 |  | copycolor(sscan(y)[x], backcolor); | 
| 1151 |  | } | 
| 1152 |  |  | 
| 1153 |  |  | 
| 1154 | < | calstart(prog, args)                    /* start fill calculation */ | 
| 1155 | < | char    *prog, *args; | 
| 1154 | > | static void | 
| 1155 | > | calstart(                    /* start fill calculation */ | 
| 1156 | > | char    *prog, | 
| 1157 | > | char    *args | 
| 1158 | > | ) | 
| 1159 |  | { | 
| 1160 |  | char    combuf[512]; | 
| 1161 |  | char    *argv[64]; | 
| 1162 |  | int     rval; | 
| 1163 | < | register char   **wp, *cp; | 
| 1163 | > | char    **wp, *cp; | 
| 1164 |  |  | 
| 1165 | < | if (childpid != -1) { | 
| 1165 | > | if (PDesc.running) { | 
| 1166 |  | fprintf(stderr, "%s: too many calculations\n", progname); | 
| 1167 |  | exit(1); | 
| 1168 |  | } | 
| 1181 |  | } | 
| 1182 |  | *wp = NULL; | 
| 1183 |  | /* start process */ | 
| 1184 | < | if ((rval = open_process(PDesc, argv)) < 0) | 
| 1184 | > | if ((rval = open_process(&PDesc, argv)) < 0) | 
| 1185 |  | syserror(progname); | 
| 1186 |  | if (rval == 0) { | 
| 1187 |  | fprintf(stderr, "%s: command not found\n", argv[0]); | 
| 1194 |  | } | 
| 1195 |  |  | 
| 1196 |  |  | 
| 1197 | < | caldone()                               /* done with calculation */ | 
| 1197 | > | static void | 
| 1198 | > | caldone(void)                               /* done with calculation */ | 
| 1199 |  | { | 
| 1200 | < | if (childpid == -1) | 
| 1200 | > | if (!PDesc.running) | 
| 1201 |  | return; | 
| 1202 |  | clearqueue(); | 
| 1203 | < | close_process(PDesc); | 
| 1140 | < | childpid = -1; | 
| 1203 | > | close_process(&PDesc); | 
| 1204 |  | } | 
| 1205 |  |  | 
| 1206 |  |  | 
| 1207 | < | rcalfill(x, y)                          /* fill with ray-calculated pixel */ | 
| 1208 | < | int     x, y; | 
| 1207 | > | static void | 
| 1208 | > | rcalfill(                               /* fill with ray-calculated pixel */ | 
| 1209 | > | int     x, | 
| 1210 | > | int     y | 
| 1211 | > | ) | 
| 1212 |  | { | 
| 1213 |  | if (queuesiz >= packsiz)        /* flush queue if needed */ | 
| 1214 |  | clearqueue(); | 
| 1219 |  | } | 
| 1220 |  |  | 
| 1221 |  |  | 
| 1222 | < | clearqueue()                            /* process queue */ | 
| 1222 | > | static void | 
| 1223 | > | clearqueue(void)                                /* process queue */ | 
| 1224 |  | { | 
| 1225 |  | FVECT   orig, dir; | 
| 1226 |  | float   fbuf[6*(PACKSIZ+1)]; | 
| 1227 | < | register float  *fbp; | 
| 1228 | < | register int    i; | 
| 1227 | > | float   *fbp; | 
| 1228 | > | int     i; | 
| 1229 |  | double  vx, vy; | 
| 1230 |  |  | 
| 1231 |  | if (queuesiz == 0) | 
| 1239 |  | *fbp++ = dir[0]; *fbp++ = dir[1]; *fbp++ = dir[2]; | 
| 1240 |  | } | 
| 1241 |  | /* mark end and get results */ | 
| 1242 | < | bzero((char *)fbp, 6*sizeof(float)); | 
| 1243 | < | if (process(PDesc, fbuf, fbuf, 4*sizeof(float)*(queuesiz+1), | 
| 1242 | > | memset((char *)fbp, '\0', 6*sizeof(float)); | 
| 1243 | > | if (process(&PDesc, (char *)fbuf, (char *)fbuf, | 
| 1244 | > | 4*sizeof(float)*(queuesiz+1), | 
| 1245 |  | 6*sizeof(float)*(queuesiz+1)) != | 
| 1246 |  | 4*sizeof(float)*(queuesiz+1)) { | 
| 1247 |  | fprintf(stderr, "%s: error reading from rtrace process\n", | 
| 1276 |  | } | 
| 1277 |  |  | 
| 1278 |  |  | 
| 1279 | < | syserror(s)                     /* report error and exit */ | 
| 1280 | < | char    *s; | 
| 1279 | > | static void | 
| 1280 | > | syserror(                       /* report error and exit */ | 
| 1281 | > | char    *s | 
| 1282 | > | ) | 
| 1283 |  | { | 
| 1284 |  | perror(s); | 
| 1285 |  | exit(1); |