int fwritescan( /* write out a scanline */ COLOR *scanline, int len, FILE *fp ) { COLR *clrscan; int n; COLR *sp; /* get scanline buffer */ if ((sp = (COLR *)tempbuffer(len*sizeof(COLR))) == NULL) return(-1); clrscan = sp; /* convert scanline */ n = len; while (n-- > 0) { setcolr(sp[0], scanline[0][RED], scanline[0][GRN], scanline[0][BLU]); scanline++; sp++; } return(fwritecolrs(clrscan, len, fp)); }
void getpictcolrs( /* get scanline from picture */ int yoff, COLR *scan, PNODE *p, int xsiz, int ysiz ) { int mx; int my; if (p->kid == NULL) { /* do this node */ setcolr(scan[0], colval(p->v,RED), colval(p->v,GRN), colval(p->v,BLU)); for (mx = 1; mx < xsiz; mx++) copycolr(scan[mx], scan[0]); return; } /* do kids */ mx = xsiz >> 1; my = ysiz >> 1; if (yoff < my) { getpictcolrs(yoff, scan, p->kid+DL, mx, my); getpictcolrs(yoff, scan+mx, p->kid+DR, xsiz-mx, my); } else { getpictcolrs(yoff-my, scan, p->kid+UL, mx, ysiz-my); getpictcolrs(yoff-my, scan+mx, p->kid+UR, xsiz-mx, ysiz-my); } }
/* Put out ray contribution to file */ static void put_contrib(const DCOLOR cnt, FILE *fout) { double sf = 1; COLOR fv; COLR cv; if (accumulate > 1) sf = 1./(double)accumulate; switch (outfmt) { case 'a': if (accumulate > 1) fprintf(fout, "%.6e\t%.6e\t%.6e\t", sf*cnt[0], sf*cnt[1], sf*cnt[2]); else fprintf(fout, "%.6e\t%.6e\t%.6e\t", cnt[0], cnt[1], cnt[2]); break; case 'f': if (accumulate > 1) { copycolor(fv, cnt); scalecolor(fv, sf); } else copycolor(fv, cnt); fwrite(fv, sizeof(float), 3, fout); break; case 'd': if (accumulate > 1) { DCOLOR dv; copycolor(dv, cnt); scalecolor(dv, sf); fwrite(dv, sizeof(double), 3, fout); } else fwrite(cnt, sizeof(double), 3, fout); break; case 'c': if (accumulate > 1) setcolr(cv, sf*cnt[0], sf*cnt[1], sf*cnt[2]); else setcolr(cv, cnt[0], cnt[1], cnt[2]); fwrite(cv, sizeof(cv), 1, fout); break; default: error(INTERNAL, "botched output format"); } }
static void vips_float2rad_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width ) { COLOR *inp = (COLOR *) in[0]; COLR *outbuf = (COLR *) out; while( width-- > 0 ) { setcolr( outbuf[0], inp[0][RED], inp[0][GRN], inp[0][BLU] ); inp++; outbuf++; } }
int main( int argc, char *argv[] ) { int i; progname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 't': /* threshold value */ thresh = atof(argv[++i]); break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: can't open input \"%s\"\n", progname, argv[i]); exit(1); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { fprintf(stderr, "%s: can't open output \"%s\"\n", progname, argv[i+1]); exit(1); } /* assign threshold color */ setcolr(threshclr, thresh, thresh, thresh); /* get our header */ if (checkheader(stdin, COLRFMT, NULL) < 0 || fgetresolu(&xmax, &ymax, stdin) < 0) quiterr("bad picture format"); /* convert file */ ra2hex(); exit(0); userr: fprintf(stderr, "Usage: %s [-t thresh] [input [output]]\n", progname); exit(1); }
int main( int argc, char *argv[] ) { int ncolumns = 0; int autolabel = 0; int curcol = 0, x0 = 0, curx = 0, cury = 0, spacing = 0; int xsgn, ysgn; char *thislabel; int an; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; for (an = 1; an < argc && argv[an][0] == '-'; an++) switch (argv[an][1]) { case 'h': echoheader = !echoheader; break; case 'x': xsiz = atoi(argv[++an]); break; case 'y': ysiz = atoi(argv[++an]); break; case 'b': setcolr(bgcolr, atof(argv[an+1]), atof(argv[an+2]), atof(argv[an+3])); an += 3; break; case 'a': ncolumns = atoi(argv[++an]); break; case 's': spacing = atoi(argv[++an]); break; case 'o': curx = x0 = atoi(argv[++an]); cury = atoi(argv[++an]); break; case 'l': switch (argv[an][2]) { case 'a': autolabel++; break; case 'h': labelht = atoi(argv[++an]); break; case '\0': goto dofiles; default: goto userr; } break; case '\0': case 't': goto dofiles; default: goto userr; } dofiles: newheader("RADIANCE", stdout); fputnow(stdout); for (nfile = 0; an < argc; nfile++) { if (nfile >= MAXFILE) goto toomany; thislabel = NULL; input[nfile].flags = 0; xsgn = ysgn = '-'; while (an < argc && (argv[an][0] == '-' || argv[an][0] == '+' || argv[an][0] == '=')) { switch (argv[an][1]) { case 't': checkthresh = 1; if (argv[an][0] == '-') { input[nfile].flags |= HASMIN; input[nfile].thmin = atof(argv[an+1]); } else if (argv[an][0] == '+') { input[nfile].flags |= HASMAX; input[nfile].thmax = atof(argv[an+1]); } else goto userr; an++; break; case 'l': if (strcmp(argv[an], "-l")) goto userr; thislabel = argv[++an]; break; case '+': case '-': case '0': if (argv[an][0] != '=') goto userr; xsgn = argv[an][1]; ysgn = argv[an][2]; if (ysgn != '+' && ysgn != '-' && ysgn != '0') goto userr; break; case '\0': if (argv[an][0] == '-') goto getfile; goto userr; default: goto userr; } an++; } getfile: if (argc-an < (ncolumns ? 1 : 3)) goto userr; if (autolabel && thislabel == NULL) thislabel = argv[an]; if (!strcmp(argv[an], "-")) { input[nfile].name = StandardInput; input[nfile].fp = stdin; } else { if (argv[an][0] == '!') { input[nfile].name = Command; input[nfile].fp = popen(argv[an]+1, "r"); } else { input[nfile].name = argv[an]; input[nfile].fp = fopen(argv[an], "r"); } if (input[nfile].fp == NULL) { perror(argv[an]); quit(1); } } an++; /* get header */ if (echoheader) printf("%s:\n", input[nfile].name); getheader(input[nfile].fp, headline, NULL); if (wrongformat) { fprintf(stderr, "%s: incompatible input format\n", input[nfile].name); quit(1); } /* get picture size */ if (fgetresolu(&input[nfile].xres, &input[nfile].yres, input[nfile].fp) < 0) { fprintf(stderr, "%s: bad picture size\n", input[nfile].name); quit(1); } if (ncolumns > 0) { if (curcol >= ncolumns) { cury = ymax + spacing; curx = x0; curcol = 0; } input[nfile].xloc = curx; input[nfile].yloc = cury; curx += input[nfile].xres + spacing; curcol++; } else { input[nfile].xloc = atoi(argv[an++]); if (xsgn == '+') input[nfile].xloc -= input[nfile].xres; else if (xsgn == '0') input[nfile].xloc -= input[nfile].xres/2; input[nfile].yloc = atoi(argv[an++]); if (ysgn == '+') input[nfile].yloc -= input[nfile].yres; else if (ysgn == '0') input[nfile].yloc -= input[nfile].yres/2; } if (input[nfile].xloc < xmin) xmin = input[nfile].xloc; if (input[nfile].yloc < ymin) ymin = input[nfile].yloc; if (input[nfile].xloc+input[nfile].xres > xmax) xmax = input[nfile].xloc+input[nfile].xres; if (input[nfile].yloc+input[nfile].yres > ymax) ymax = input[nfile].yloc+input[nfile].yres; if (thislabel != NULL) { if (++nfile >= MAXFILE) goto toomany; input[nfile].name = Label; input[nfile].flags = 0; input[nfile].xres = input[nfile-1].xres; input[nfile].yres = labelht; if ((input[nfile].fp = lblopen(thislabel, &input[nfile].xres, &input[nfile].yres)) == NULL) goto labelerr; input[nfile].xloc = input[nfile-1].xloc; input[nfile].yloc = input[nfile-1].yloc + input[nfile-1].yres-input[nfile].yres; } } if (xsiz <= 0) xsiz = xmax; else if (xsiz > xmax) xmax = xsiz; if (ysiz <= 0) ysiz = ymax; else if (ysiz > ymax) ymax = ysiz; /* add new header info. */ printargs(argc, argv, stdout); if (strcmp(ourfmt, PICFMT)) fputformat(ourfmt, stdout); /* print format if known */ putchar('\n'); fprtresolu(xsiz, ysiz, stdout); compos(); quit(0); userr: fprintf(stderr, "Usage: %s [-h][-x xr][-y yr][-b r g b][-a n][-s p][-o x0 y0][-la][-lh h] ", progname); fprintf(stderr, "[-t min1][+t max1][-l lab][=SS] pic1 x1 y1 ..\n"); quit(1); toomany: fprintf(stderr, "%s: only %d files and labels allowed\n", progname, MAXFILE); quit(1); labelerr: fprintf(stderr, "%s: error opening label\n", progname); quit(1); return 1; /* pro forma return */ }
static void clrdebug(void) /* put out debug picture from color input */ { static COLR blkclr = BLKCOLR; COLR mbclr[24], cvclr[24], orclr[24]; COLR *scan; COLOR ctmp, ct2; int y, i; register int x, rg; /* convert colors */ for (i = 0; i < 24; i++) { copycolor(ctmp, mbRGB[i]); clipgamut(ctmp, bright(ctmp), CGAMUT, cblack, cwhite); setcolr(mbclr[i], colval(ctmp,RED), colval(ctmp,GRN), colval(ctmp,BLU)); if (inpflags & 1L<<i) { copycolor(ctmp, inpRGB[i]); clipgamut(ctmp, bright(ctmp), CGAMUT, cblack, cwhite); setcolr(orclr[i], colval(ctmp,RED), colval(ctmp,GRN), colval(ctmp,BLU)); if (rawmap) copycolr(cvclr[i], mbclr[i]); else { bresp(ctmp, inpRGB[i]); colortrans(ct2, solmat, ctmp); clipgamut(ct2, bright(ct2), CGAMUT, cblack, cwhite); setcolr(cvclr[i], colval(ct2,RED), colval(ct2,GRN), colval(ct2,BLU)); } } } /* allocate scanline */ scan = (COLR *)malloc(xmax*sizeof(COLR)); if (scan == NULL) { perror(progname); exit(1); } /* finish debug header */ fputformat(COLRFMT, debugfp); putc('\n', debugfp); fprtresolu(xmax, ymax, debugfp); /* write debug picture */ for (y = ymax-1; y >= 0; y--) { for (x = 0; x < xmax; x++) { rg = chartndx(x, y, &i); if (rg == RG_CENT) { if (!(1L<<i & gmtflags) || (x+y)&07) copycolr(scan[x], mbclr[i]); else copycolr(scan[x], blkclr); } else if (rg == RG_BORD || !(1L<<i & inpflags)) copycolr(scan[x], blkclr); else if (rg == RG_ORIG) copycolr(scan[x], orclr[i]); else /* rg == RG_CORR */ copycolr(scan[x], cvclr[i]); } if (fwritecolrs(scan, xmax, debugfp) < 0) { fprintf(stderr, "%s: error writing debugging picture\n", progname); exit(1); } } /* clean up */ fclose(debugfp); free((void *)scan); }
void addpicz( /* add a picture + depth-buffer */ char *pcf, char *zbf ) { FILE *pfp; int zfd; COLR *cscn; float *zscn; struct phead phd; int eshft; double emult; RESOLU prs; RREAL vl[2]; FVECT ro, rd; double aftd; COLOR ctmp; int j; register int i; /* open files */ if ((pfp = fopen(pcf, "r")) == NULL) { sprintf(errmsg, "cannot open picture file \"%s\"", pcf); error(SYSTEM, pcf); } if ((zfd = open(zbf, O_RDONLY)) < 0) { sprintf(errmsg, "cannot open depth file \"%s\"", zbf); error(SYSTEM, pcf); } /* load picture header */ phd.vw = stdview; phd.expos = 1.0; phd.badfmt = phd.gotview = phd.altprims = 0; if (getheader(pfp, picheadline, &phd) < 0 || phd.badfmt || !fgetsresolu(&prs, pfp)) { sprintf(errmsg, "bad format for picture file \"%s\"", pcf); error(USER, errmsg); } if (!phd.gotview || setview(&phd.vw) != NULL) { sprintf(errmsg, "missing/illegal view in picture \"%s\"", pcf); error(USER, errmsg); } if (phd.altprims) { sprintf(errmsg, "ignoring primary values in picture \"%s\"", pcf); error(WARNING, errmsg); } /* figure out what to do about exposure */ if ((phd.expos < 0.99) | (phd.expos > 1.01)) { emult = -log(phd.expos)/log(2.); eshft = emult >= 0. ? emult+.5 : emult-.5; emult -= (double)eshft; if ((emult <= 0.01) & (emult >= -0.01)) emult = -1.; else { emult = 1./phd.expos; eshft = 0; } } else { emult = -1.; eshft = 0; } /* allocate buffers */ cscn = (COLR *)malloc(scanlen(&prs)*sizeof(COLR)); zscn = (float *)malloc(scanlen(&prs)*sizeof(float)); if ((cscn == NULL) | (zscn == NULL)) error(SYSTEM, "out of memory in addpicz"); /* read and process each scanline */ for (j = 0; j < numscans(&prs); j++) { i = scanlen(&prs); /* read colrs */ if (freadcolrs(cscn, i, pfp) < 0) { sprintf(errmsg, "error reading picture \"%s\"", pcf); error(USER, errmsg); } if (eshft) /* shift exposure */ shiftcolrs(cscn, i, eshft); i *= sizeof(float); /* read depth */ if (read(zfd, (char *)zscn, i) != i) { sprintf(errmsg, "error reading depth file \"%s\"", zbf); error(USER, errmsg); } for (i = scanlen(&prs); i--; ) { /* do each pixel */ pix2loc(vl, &prs, i, j); aftd = viewray(ro, rd, &phd.vw, vl[0], vl[1]); if (aftd < -FTINY) continue; /* off view */ if (aftd > FTINY && zscn[i] > aftd) continue; /* aft clipped */ if (emult > 0.) { /* whatta pain */ colr_color(ctmp, cscn[i]); scalecolor(ctmp, emult); setcolr(cscn[i], colval(ctmp,RED), colval(ctmp,GRN), colval(ctmp,BLU)); } addray(ro, rd, (double)zscn[i], cscn[i]); } } /* write output and free beams */ hdflush(NULL); /* clean up */ free((void *)cscn); free((void *)zscn); fclose(pfp); close(zfd); }