braner@batcomputer.tn.cornell.edu (braner) (12/13/86)
[]
I'm just passing this on. - Moshe Braner
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Date: Wed, 10 Dec 86
From: cornell!sun!leif@bullwinkle.UUCP (Leif Samuelsson)
Organization: Sun Microsystems, Mountain View
Message-Id: <8612101906.AA04934@viking.sun.com>
Subject: Re: cbw2ps.c - Compressed B&W screen to Postscript
I have made a version of cbw2ps which generates a standard Sun
rasterfile. I currently have no access to postnews, so feel free
to post it if you wish.
----------
/*
* cbw2sun.c
*
* Compressed ST screen (monochrome) to Sun rasterfile filter.
*
* By Leif Samuelsson <leif@sun.com>, 861210
*
* Based on cbw2ps.c
* By Moshe Braner, 861116.
*
* WARNING: assumes ASCII.
*
* Usage:
*
* cbw2sun file
*
*/
#include <stdio.h>
#include <rasterfile.h>
#define OK 0
#define ERROR -1
FILE *fp, *fopen();
char scrn[32000]; /* virtual screen buffer */
char *scrnptr; /* target address for next decoded byte */
long chksum; /* chksum on input file */
int rows;
int cols;
int row;
int col;
int bferr = 0;
main(argc,argv)
int argc;
char **argv;
{
char *filename;
extern double atof();
fp = stdin;
filename = "STDIN";
while(--argc > 0) {
++argv;
if((*argv)[0] == '-') {
switch((*argv)[1]) {
default:
fprintf(stderr,
"Illegal switch \'%c\' - ignored\n",
(*argv)[1]);
}
} else {
if((fp = fopen(*argv, "r")) == (FILE *)NULL) {
fprintf(stderr,"Cannot open %s\n",*argv);
exit(1);
}
filename = *argv;
}
}
process(filename);
}
process(filename)
char *filename;
{
int inv = 1;
int bpp, xmax, ymax, junk;
register long i;
long bytes, origsum;
register unsigned int c, s, out, mask;
register int j, bpb, shift, k;
extern unsigned int decode3();
struct rasterfile rf;
c = fgetb() - 0x10;
chksum = ((long) c)&0x03;
if (c != 2) {
fprintf(stderr,
"%s not a monochrome image!\n",filename);
exit(1);
}
bpp = 1;
ymax = 400;
xmax = 640;
/* Scan off color table */
c = decode3();
chksum += ((long) c)&0xFFFF;
if ((c & 0x01) == 1)
inv = (! inv);
for(i = 0; i < 15; i++)
chksum += ((long) decode3())&0xFFFF;
/* decode the image itself */
rows = 400;
cols = 80;
row = 0;
col = 0;
scrnptr = scrn;
while ((c=fgetb()) != ERROR) {
if (c > 0x0F)
s = reps(c);
else
s = uniq(c);
if (s != OK)
break;
}
/* read original checksum */
origsum = (((long) decode3())&0xFFFF) << 16;
origsum += ((long) decode3())&0xFFFF;
if (bferr) {
fprintf(stderr,"Error while reading %s\n",
filename);
exit(3);
} else if (chksum != origsum) {
fprintf(stderr,"Checksum doesn't fit!\n");
exit(3);
}
fclose(fp);
/* Put out header */
rf.ras_magic = RAS_MAGIC; /* magic number */
rf.ras_width = xmax; /* width (pixels) of image */
rf.ras_height = ymax; /* height (pixels) of image */
rf.ras_depth = bpp; /* depth (1, 8, or 24 bits) of pixel */
rf.ras_length = xmax*ymax/8; /* length (bytes) of image */
rf.ras_type = RT_STANDARD; /* type of file; see RT_* below */
rf.ras_maptype = RMT_EQUAL_RGB; /* type of colormap; see RMT_* below */
rf.ras_maplength = 0; /* length (bytes) of following map */
fwrite(&rf, sizeof(rf), 1, stdout);
/* put out bit map data */
scrnptr = scrn;
for (i=0; i<rf.ras_length; i++) {
out = *scrnptr++;
putchar((unsigned int)(((inv == 1)? ~out : out)
& (unsigned int)0x00ff));
}
}
/*
* Read a byte from the input file, translate it.
* Skip control chars and white space, etc.
*/
int
fgetb()
{
register int c;
again:
if (bferr)
return (ERROR);
c = getc(fp);
if (c == EOF)
bferr = 1;
if (c < ',' || c > 'z')
goto again;
if (c < 'a')
return (c - ' ');
if (c < 'm')
return (c - 'a');
if (c < 'v')
return (c - 0x55);
return (c - 0x3B);
}
/*
* Decode one (16-bit) word out of 3 bytes of the input file.
*/
unsigned int
decode3()
{
register unsigned int c;
register unsigned int dummy; /* avoid a Megamax bug */
c = (fgetb() << 12);
c |= (fgetb() << 6);
c |= fgetb();
return (c);
}
/*
* Put a decoded byte into the screen buffer.
*/
int
putbyte(b)
int b;
{
*scrnptr = (char) b;
scrnptr += cols;
if (++row >= rows) {
if (++col >= cols) {
return (ERROR);
}
scrnptr = scrn + col;
row = 0;
}
return (OK);
}
/*
* Handle a pair of decoded screen bytes.
*/
int
putword(w)
register unsigned int w;
{
register unsigned int dummy; /* avoid a Megamax bug */
chksum += ((long) w)&0xFFFF;
if (putbyte((w>>8) & 0xFF) == ERROR)
return (ERROR);
return (putbyte(w & 0xFF));
}
/*
* Decode 2 screen bytes.
*/
int
uniq(c)
register unsigned int c;
{
register unsigned int dummy; /* avoid a Megamax bug */
c <<= 12;
c |= (fgetb() << 6);
c |= fgetb();
if (bferr)
return (ERROR);
return (putword(c));
}
/*
* Decode a 4-byte repetition code.
*/
int
reps(b)
register unsigned int b;
{
register unsigned int c;
b = ((b-0x10) << 2);
c = fgetb();
b |= (c >> 4);
c <<= 12;
c |= (fgetb() << 6);
c |= fgetb();
if (bferr)
return (ERROR);
while (b--) {
if (putword(c) == ERROR)
return (ERROR);
}
return (OK);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~