IRIS.rgb to Color PS
Dwight Schwartz
schwartz at aries.scs.uiuc.edu
Tue Oct 16 20:18:14 AEST 1990
In article <9010160303.AA13301 at frodo.Physics.McGill.CA> loki at physics.mcgill.ca (Loki Jorgenson Rm421) writes:
>
> Sorry to bother the rest of you but mail to the person concerned
>bounced so I am posting to the list.
>
>To: nigel.ee.udel.edu!mccalpin at louie.udel.edu
>Subject: Re: color postscript
>
> Here is an IRIS (rgb) to color PS filter that I picked up
>somewhere.... I don't have a color laser yet so no idea how well it
>works.
>
>Regards,
> __ __
> / / \ \
>Loki Jorgenson / /\/\/\/\/\/\ \ node: loki at physics.mcgill.ca
>Physics, McGill University < < > > fax: (514) 398-3733
>Montreal Quebec CANADA \ \/\/\/\/\/\/ / phone: (514) 398-6531
> \_\ /_/
> __ __
> <_< Lurking with the intent to skulk >_>
>
>
>/* tocolps -
> * Convert a color image to color 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:
> *
> * tocolps blat.rgb | lp
> *
> * to actually print a picture (portrait).
> *
> * tocolpsl blat.rgb | lp
> *
> * to actually print a picture (landscape).
> *
> * compile with:
> * cc -o tocolps -O tocolps.c -lc_s -limage -lm
> * ln tocolps tocolpsl
> * to create portrait and landscape versions. Note that the landscape
> * version can be accessed from tocolps by the -l switch. This also swaps
> * the values of maxxsize and maxysize.
> *
> * This version also now uses different screen angles for each color,
> * uses a default screen density of 50, and has an improved spot function.
> * Also, screen angles and frequencies can be changed by tches.
> *
> * Improvements and bug fixes will be gratefully accepted. Send to the
> * addresses below. Complaints will be forwarded to /dev/null.
> *
> *
> * Steven H. Izen, 4/26/90
> *
> * tops.c by Paul Haeberli - 1988
> *
> * Adapted from P. H.'s tops.c to work with color
> * January, April, 1990.
> * by Steven H. Izen, Dept. of Math. & Stat.,
> * Case Western Reserve University, Cleveland, OH 44106
> * izen at cwru.cwru.edu or steve at pitacat.math.cwru.edu or
> * steve at izen386.math.cwru.edu
> */
>#include <gl/image.h>
>#include <math.h>
>#include <string.h>
>#include <sys/types.h>
>
>int hi[256], low[256];
>int reverse_flag = 0;
>int landscape_flag = 0;
>short buf[4096];
>
>main(argc,argv)
>int argc;
>char **argv;
>{
> float pixperinch, maxxsize, maxysize, temp;
> float cyanscreendensity, cyanscreenangle;
> float magentascreendensity, magentascreenangle;
> float yellowscreendensity, yellowscreenangle;
> float blackscreendensity, blackscreenangle;
> int bitsper, i;
> IMAGE *image;
>
> if(argc<2) {
> fprintf(stderr,"usage: %s inimage [-b bitsperpixel]\n",argv[0]);
> fprintf(stderr," [-l ] # landscape mode\n");
> fprintf(stderr," [-k blackscreendensity]\n");
> fprintf(stderr," [-K blackscreenangle]\n");
> fprintf(stderr," [-c cyanscreendensity]\n");
> fprintf(stderr," [-C cyanscreenangle]\n");
> fprintf(stderr," [-g magentascreendensity]\n");
> fprintf(stderr," [-G magentascreenangle]\n");
> fprintf(stderr," [-y yellowscreendensity]\n");
> fprintf(stderr," [-Y yellowscreenangle]\n");
> fprintf(stderr," [-p pixelsperinch]\n");
> fprintf(stderr," [-m maxxinches maxyinches]\n");
> exit(1);
> }
> if (strcmp(argv[0],"tocolpsl")==0)
> landscape_flag = 1;
> image = iopen(argv[1],"r");
> if(!image) {
> fprintf(stderr,"%s: can't open input image file\n",argv[0]);
> exit(1);
> }
> cyanscreendensity = 50.0;
> cyanscreenangle = 15.0;
> magentascreendensity = 50.0;
> magentascreenangle = 75.0;
> yellowscreendensity = 50.0;
> yellowscreenangle = 0.0;
> blackscreendensity = 50.0;
> blackscreenangle = 45.0;
> pixperinch = -1.0;
> maxxsize = 528.0;
> maxysize = 700.0;
> bitsper = 8;
> for(i=2; i<argc; i++) {
> if(argv[i][0] == '-') {
> switch(argv[i][1]) {
> case 'b':
> i++;
> bitsper = atoi(argv[i]);
> switch(bitsper) {
> case 1:
> case 2:
> case 4:
> case 8:
> break;
> default:
> fprintf(stderr,"tops: bits per pixel must be 1, 2, 4, or 8\n");
> exit(1);
> }
> break;
> case 'l':
> landscape_flag = 1;
> break;
> case 'k':
> i++;
> blackscreendensity = atof(argv[i]);
> break;
> case 'K':
> i++;
> blackscreenangle = atof(argv[i]);
> break;
> case 'c':
> i++;
> cyanscreendensity = atof(argv[i]);
> break;
> case 'C':
> i++;
> cyanscreenangle = atof(argv[i]);
> break;
> case 'g':
> i++;
> magentascreendensity = atof(argv[i]);
> break;
> case 'G':
> i++;
> magentascreenangle = atof(argv[i]);
> break;
> case 'y':
> i++;
> yellowscreendensity = atof(argv[i]);
> break;
> case 'Y':
> i++;
> yellowscreenangle = atof(argv[i]);
> break;
> case 'p':
> i++;
> pixperinch = atof(argv[i]);
> break;
> case 'm':
> i++;
> maxxsize = 72.0*atof(argv[i]);
> i++;
> maxysize = 72.0*atof(argv[i]);
> break;
> case 'r':
> reverse_flag = 1; /* not implemented yet */
> break;
> }
> }
> }
> if (landscape_flag) /* swap roles of x and y */
> {
> temp = maxxsize;
> maxxsize = maxysize;
> maxysize = temp;
> }
> tops(image,
> cyanscreendensity,cyanscreenangle,
> magentascreendensity,magentascreenangle,
> yellowscreendensity,yellowscreenangle,
> blackscreendensity,blackscreenangle,
> pixperinch,maxxsize,maxysize,bitsper);
>}
>
>tops(image,
> cyanscreendensity,cyanscreenangle,
> magentascreendensity,magentascreenangle,
> yellowscreendensity,yellowscreenangle,
> blackscreendensity,blackscreenangle,
> pixperinch,maxxsize,maxysize,bitsper)
>
>float pixperinch, maxxsize, maxysize;
>float cyanscreendensity, cyanscreenangle;
>float magentascreendensity, magentascreenangle;
>float yellowscreendensity, yellowscreenangle;
>float blackscreendensity, blackscreenangle;
>int bitsper;
>IMAGE *image;
>
>{
> register int x, y, n, i, val, plane;
> int picstrlen, xsize, ysize;
> float doscale, ppiscale;
>
> xsize = image->xsize;
> ysize = image->ysize;
> maketables();
>
> picstrlen = xsize*bitsper;
> picstrlen = (picstrlen+7)/8;
>
> if(ysize/(float)xsize < maxysize/maxxsize)
> doscale = maxxsize/xsize;
> else
> doscale = maxysize/ysize;
> if(pixperinch > 0.0) {
> ppiscale = 72.0/pixperinch;
> if(ppiscale<doscale)
> doscale = ppiscale;
> else {
> fprintf(stderr,"tops: can't fit image into print area, increase print area with -m option\n");
> exit(1);
> }
> }
>
>/* put out the header */
> putchar('%');
> putchar('!');
> putchar('\n');
> printf("%% Output by tocolps- Steve Izen's hack to tops.c\n");
> printf("initgraphics\n");
>
>/* define the half tone screen */
>
> printf("%f %f \n", cyanscreendensity,cyanscreenangle);
> printf("{ abs exch abs 2 copy add 1 gt\n");
> printf("{ 1 sub dup mul exch 1 sub dup mul add 1 sub }\n");
> printf("{ dup mul exch dup mul add 1 exch sub} ifelse }\n");
> printf("%f %f \n", magentascreendensity,magentascreenangle);
> printf("{ abs exch abs 2 copy add 1 gt\n");
> printf("{ 1 sub dup mul exch 1 sub dup mul add 1 sub }\n");
> printf("{ dup mul exch dup mul add 1 exch sub} ifelse }\n");
> printf("%f %f \n", yellowscreendensity,yellowscreenangle);
> printf("{ abs exch abs 2 copy add 1 gt\n");
> printf("{ 1 sub dup mul exch 1 sub dup mul add 1 sub }\n");
> printf("{ dup mul exch dup mul add 1 exch sub} ifelse }\n");
> printf("%f %f \n", blackscreendensity,blackscreenangle);
> printf("{ abs exch abs 2 copy add 1 gt\n");
> printf("{ 1 sub dup mul exch 1 sub dup mul add 1 sub }\n");
> printf("{ dup mul exch dup mul add 1 exch sub} ifelse }\n setcolorscreen\n");
>
>
>/* allocate the pixel buffer */
> printf("/rpicstr %d string def\n",picstrlen);
> printf("/gpicstr %d string def\n",picstrlen);
> printf("/bpicstr %d string def\n",picstrlen);
>
>/* rotate image if in landscape mode */
> if (landscape_flag)
> printf("0 792 translate -90 rotate\n");
>
>
>/* do the proper image translation and scaling */
> printf("45 %f translate\n",maxysize+50.0);
> printf("%f %f scale\n",doscale*xsize,-doscale*ysize);
> printf("%d %d %d\n",xsize,ysize,bitsper);
> printf("[%d 0 0 -%d 0 %d]\n",xsize,ysize,ysize);
> printf("{ currentfile\n rpicstr readhexstring pop}");
> printf("{ currentfile\n gpicstr readhexstring pop}");
> printf("{ currentfile\n bpicstr readhexstring pop}");
> printf("true 3 colorimage\n");
>
>/* send out the picure */
> for( y=0; y<ysize; y++ ) {
> for (plane=0;plane<3;++plane) {
> getrow(image,buf,y,plane);
> switch(bitsper) {
> case 1:
> x=0;
> for(n=2*picstrlen; n--; ) {
> val = 0;
> for(i=0; i<4; i++) {
> val <<= 1;
> val |= (buf[x]&0x80) >> 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]);
> }
> break;
> case 8:
> x=0;
> for(n=2*picstrlen; n--; ) {
> val = buf[x];
> if(val > 255)
> fprintf(stderr,"bad poop\n");
> x++;
> n--;
> psputchar(hi[val]);
> psputchar(low[val]);
> }
> break;
> default:
> fprintf(stderr,"bits per pixel must be a power of 2!!\n");
> exit(1);
> }
> }
> }
> printf("\nshowpage\n");
>}
>
>maketables()
>{
> register int i;
>
> for(i=0; i<256; i++) {
> 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;
> }
>}
More information about the Comp.sys.sgi
mailing list