/* * tops - * Convert a color or black and white image to PostScript. * This knows how to print images with either 1, 2, 4, or 8 bits per * pixel, and how to generate different screen densities and screen * angles. Postscript data is written to standard out, so use a * command like: * * tops blat.rgb | lp * * to actually print a picture. * * Paul Haeberli - 1988 * */ #include#include static unsigned char buf[10240]; int hi[256], low[256]; usage(str) char *str; { fprintf(stderr, "%s: usage is:\n%s -w width -h height -p pixelsperinch \n\ [-x page offset (inches) ][-y page offset]\n\ [-d screendensity]\n\ [-a angle]\n\ [-m maxxinches,yinches]\n\ [-b bitsperpixel] < inpic > out.ps\n", str, str); } main(argc, argv) int argc; char **argv; { extern int optind; extern char *optarg; int c; float screendensity, screenangle, pixperinch, maxxsize, maxysize; int bitsper, width, height; int xoffset = 50, yoffset = 50; screendensity = 75.0; screenangle = 45.0; pixperinch = -1.0; maxxsize = 528.0; maxysize = 700.0; bitsper = 8; while((c = getopt(argc, argv, "b:d:a:p:m:w:h:x:y:"))!=EOF) switch(c){ case 'x': xoffset = atof(optarg) * 72.0; break; case 'y': yoffset = atof(optarg) * 72.0; break; case 'b': bitsper = atoi(optarg); break; case 'd': screendensity = atof(optarg); break; case 'a': screenangle = atof(optarg); break; case 'p': pixperinch = atof(optarg); break; case 'm': sscanf(optarg, "%f,%f", &maxxsize, &maxysize); break; case 'w': width = atoi(optarg); break; case 'h': height = atoi(optarg); break; default: usage(argv[0]); exit(-1); } tops(screendensity,screenangle,pixperinch,maxxsize,maxysize,bitsper, width, height, xoffset, yoffset); } tops(screendensity,screenangle,pixperinch,maxxsize,maxysize,bitsper, width, height, xoffset, yoffset) float screendensity, screenangle, pixperinch, maxxsize,maxysize; int width, height; int bitsper; int xoffset, yoffset; { register int x, y, n, i, val; int picstrlen; float doscale, ppiscale; maketables(); picstrlen = width*bitsper; picstrlen = (picstrlen+7)/8; if(height/(float)width < maxysize/maxxsize) doscale = maxxsize/width; else doscale = maxysize/height; if(pixperinch > 0.0) { ppiscale = 72.0/pixperinch; if(ppiscale > 7; x++; } psputchar("0123456789abcdef"[val]); } break; case 2: x=0; for(n=2*picstrlen; n--; ) { val = 0; for(i=0; i<2; i++) { val <<= 2; val |= (buf[x]&0xc0) >> 6; x++; } psputchar("0123456789abcdef"[val]); } break; case 4: x=0; for(n=2*picstrlen; n--; ) { val = (buf[x]&0xf0) >> 4; x++; psputchar("0123456789abcdef"[val]); } int hi[i] = "0123456789abcdef"[i>>4]; low[i] = "0123456789abcdef"[i&0xf]; } } static int pos = 0; psputchar(c) int c; { putchar(c); if(++pos == 50) { putchar('\n'); pos = 0; } }