IRIS.rgb to Color PS
Loki Jorgenson Rm421
loki at physics.mcgill.ca
Tue Oct 16 13:03:48 AEST 1990
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