koblas@mips.COM (David Koblas) (09/19/88)
Contained is a shar for converting MRGB pictures to either
impress or postscript depending on your needs (black and white).
[I'm looking for versatec plotter routines, if you have some I'd be interested]
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile README toprinter.c
# Wrapped by koblas@giant on Sun Sep 18 15:26:06 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(170 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X
all: prpress prpost
X
prpress: toprinter.c
X $(CC) $(CFLAGS) -DIMPRESS -o $@ $?
X
prpost: toprinter.c
X $(CC) $(CFLAGS) -DPOSTSCRIPT -o $@ $?
X
clean:
X rm -f prpress prpost
END_OF_FILE
if test 170 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(935 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X This shar contained programs to print MRGB imageformats,
onto either impress or postscript. Man page is not included,
command line options are:
X
X -x arg (postscript only) set x printed size to arg inches.
X -y arg (postscript only) set y printed size to arg inches.
X -S arg (postscript only) set x and y printed size to arg inches.
X
X -p arg (impress only) set magnifcation factor (pixel size) to arg.
X
X -i arg input from file 'arg' otherwise stdin is used.
X -r disply only red component.
X -g disply only green component.
X -b disply only blue component.
X -c display a "rgb" picture (default).
X
The one item that I'm looking for is printing routines for a versatec plotter,
if you have some or know where I might be able to find some I'd be greatly
interested.
X
XFeedback is welcome - send bug reports, enhancements, to the address below:
X
X David Koblas
X koblas@mips.com koblas@uoregon.edu
X { ames, decwrl, pyramid, wyse }!mips!koblas
END_OF_FILE
if test 935 -ne `wc -c <'README'`; then
echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'toprinter.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'toprinter.c'\"
else
echo shar: Extracting \"'toprinter.c'\" \(7319 characters\)
sed "s/^X//" >'toprinter.c' <<'END_OF_FILE'
X/* +------------------------------------------------------------------+ */
X/* | Copyright 1988, David Koblas. | */
X/* | You may copy this file in whole or in part as long as you | */
X/* | don't try to make money off it, or pretend that you wrote it. | */
X/* +------------------------------------------------------------------+ */
X
X#include <stdio.h>
X
X#define R 0x01
X#define G 0x02
X#define B 0x04
X#define ALL 0x08
X
X#ifdef IMPRESS
X#define GREYMAX (4)
X#define BITBLK (32) /* defined by impress (32 x 32 bits) */
X#define RPIXMAX (2*456) /* (RPIXMAX*GREYMAX)/BITBLK must be integrel */
X#define BLKMAX ((RPIXMAX * GREYMAX)/BITBLK)
X
unsigned char scanline[RPIXMAX][RPIXMAX]; /* buffer for linework */
unsigned char bitmap[BLKMAX][BLKMAX][BITBLK][GREYMAX];
X#endif
X
X#define RGB_TO_VAL(r,g,b) ((int)(((double)(r)*0.4)+ \
X ((double)(g)*0.4)+ \
X ((double)(b)*0.2)))
X#define VAL(x,y,i) ((i<3) ? data[(x+(xsize*y))*3+i] :\
X RGB_TO_VAL(data[(x+(xsize*y))*3+0],\
X data[(x+(xsize*y))*3+1],\
X data[(x+(xsize*y))*3+2]))
X
X#if !defined(POSTSCRIPT) && !defined(IMPRESS)
XEither POSTSCRIPT or IMPRESS needs to be defined!
X#endif
X
X#ifdef POSTSCRIPT
X#define OPTSTR "x:y:i:S:rgbc"
X#endif
X#ifdef IMPRESS
X#define OPTSTR "p:i:rgbc"
X#endif
X
char *Progname;
X
usage()
X{
X int i;
X
X fprintf(stderr,"usage: %s <args>\n",Progname);
X for (i=0;i<strlen(OPTSTR);i++) {
X switch (OPTSTR[i]) {
X case 'r':
X fprintf(stderr,"\t-r\tdisplay red space\n");
X break;
X case 'g':
X fprintf(stderr,"\t-r\tdisplay green space\n");
X break;
X case 'b':
X fprintf(stderr,"\t-r\tdisplay blue space\n");
X break;
X case 'c':
X fprintf(stderr,"\t-c\tdisplay rgb space\n");
X break;
X case 'p':
X fprintf(stderr,"\t-p arg\tscale pixel size to arg\n");
X break;
X case 'x':
X fprintf(stderr,"\t-x arg\tset x printed size to be arg inches\n");
X break;
X case 'y':
X fprintf(stderr,"\t-y arg\tset y printed size to be arg inches\n");
X break;
X case 'S':
X fprintf(stderr,"\t-S arg\tset x and y printed size to be arg inches\n");
X break;
X case 'i':
X fprintf(stderr,"\t-i arg\tuse arg as the input file otherwise stdin is used\n");
X break;
X case ':':
X break;
X default :
X fprintf(stderr,"\tUsage(%c)?\n",OPTSTR[i]);
X break;
X }
X }
X exit(1);
X}
X
main(argc,argv)
int argc;
char **argv;
X{
X int xsize,ysize;
X double xpsize=7.0,ypsize=7.0;
X double xpos,ypos;
X double atof();
X int c,x,y,i=0;
X int pixel=1;
X char *data;
X int flag=0;
X extern char *optarg;
X extern int optind;
X
X Progname=argv[0]+strlen(argv[0]);
X while ((*Progname != '/') && (Progname != argv[0])) Progname--;
X if (*Progname=='/') Progname++;
X
X while ((c=getopt(argc,argv,OPTSTR))!=EOF) {
X switch(c) {
X case 'r': flag|=R; break;
X case 'g': flag|=G; break;
X case 'b': flag|=B; break;
X case 'c': flag|=ALL; break;
X case 'p': pixel=atoi(optarg); break;
X case 'x': xpsize=atof(optarg); break;
X case 'y': ypsize=atof(optarg); break;
X case 'S': xpsize=ypsize=atof(optarg); break;
X case 'i': freopen(optarg,"r",stdin); break;
X default : usage();
X }
X }
X if (optind!=argc)
X usage();
X if (flag==0)
X flag=ALL;
X
X scanf("%d %d\n",&xsize,&ysize);
X if ((data=(char *)malloc(xsize*ysize*sizeof(char)*3))==NULL)
X exit(1);
X fread(data,sizeof(char),xsize*ysize*3,stdin);
X
X#ifdef POSTSCRIPT
X xpos = (( 8.5-xpsize)/2.0)*72;
X ypos = ((11.0-ypsize)/2.0)*72;
X#endif
X#ifdef IMPRESS
X xpos = (( 8.5-((double)(pixel*xsize*GREYMAX)/300.0))/2.0)*300.0;
X ypos = ((11.0-((double)(pixel*ysize*GREYMAX)/300.0))/2.0)*300.0;
X#endif
X
X i=0;
X do {
X if ((flag&(1<<i))==0) continue;
X
X#ifdef POSTSCRIPT
X printf("%%!\nsave\n%d %d translate\n%d %d scale\n",
X (int)xpos,(int)ypos,(int)xpsize*72,(int)ypsize*72);
X printf("/DataString %d string def\n",ysize);
X printf("%d %d 8 [ %d 0 0 %d 0 0 ] \n",
X ysize,xsize,ysize,xsize);
X printf("{\ncurrentfile DataString readhexstring pop\n} bind image\n");
X
X for (y=0;y<ysize;y++) {
X for (x=0;x<xsize;x++) {
X printf("%02x",VAL(x,y,i));
X if (i<3)
X printf("%02x",data[(x+(xsize*y))*3+i]);
X else
X printf("%02x",RGB_TO_VAL(
X }
X }
X printf("showpage\n");
X#endif
X#ifdef IMPRESS
X printf("@document(language impress)");
X putchar(213); /* PAGE */
X putchar(135); /* SET-ABS-H */
X putchar((((int)(xpos))>>8)&0x7f);
X putchar( ((int)(xpos)) &0xff);
X putchar(137); /* SET-ABS-V */
X putchar((((int)(ypos))>>8)&0x7f);
X putchar( ((int)(ypos)) &0xff);
X putchar(236); /* MAGNIFICATION */
X putchar((pixel-1)&0xff);
X
X putchar(235); /* BITMAP */
X putchar(15); /* OPERATION (OR) */
X putchar(1+(int)((xsize*(GREYMAX))/BITBLK)); /* width */
X putchar(1+(int)((ysize*(GREYMAX))/BITBLK)); /* heighth */
X
X for (x=0;x<RPIXMAX;x++)
X for (y=0;y<RPIXMAX;y++)
X scanline[y][x]=255;
X
X for (y=0;y<ysize;y++) {
X for (x=0;x<xsize;x++) {
X int v = (((double)VAL(x,y,i))*255.0/200.0);
X if (v>255) v=255;
X scanline[y][x] = v;
X }
X }
X
X dobits(xsize,ysize);
X putchar(219); /* SHOWPAGE */
X#endif
X } while (i++<4);
X}
X
X#ifdef IMPRESS
X/*
X** Thanks to Jeff Eaton for these routies.
X*/
unsigned char greys[17][GREYMAX] = {
X { 0xf, 0xf, 0xf, 0xf }, /* 1111 1111 1111 1111 */
X { 0xf, 0xf, 0xf, 0x7 }, /* 1111 1111 1111 0111 */
X { 0xf, 0xd, 0xf, 0x7 }, /* 1111 1101 1111 0111 */
X { 0xf, 0xd, 0xf, 0x5 }, /* 1111 1101 1111 0101 */
X { 0xf, 0x5, 0xf, 0x5 }, /* 1111 0101 1111 0101 */
X { 0xf, 0x5, 0xb, 0x5 }, /* 1111 0101 1011 0101 */
X { 0xe, 0x5, 0xb, 0x5 }, /* 1110 0101 1011 0101 */
X { 0xe, 0x5, 0xa, 0x5 }, /* 1110 0101 1010 0101 */
X { 0xa, 0x5, 0xa, 0x5 }, /* 1010 0101 1010 0101 */
X { 0xa, 0x5, 0xa, 0x1 }, /* 1010 0101 1010 0001 */
X { 0xa, 0x4, 0xa, 0x1 }, /* 1010 0100 1010 0001 */
X { 0xa, 0x4, 0xa, 0x0 }, /* 1010 0100 1010 0000 */
X { 0xa, 0x0, 0xa, 0x0 }, /* 1010 0000 1010 0000 */
X { 0xa, 0x0, 0x2, 0x0 }, /* 1010 0000 0010 0000 */
X { 0x8, 0x0, 0x2, 0x0 }, /* 1000 0000 0010 0000 */
X { 0x8, 0x0, 0x0, 0x0 }, /* 1000 0000 0000 0000 */
X { 0x0, 0x0, 0x0, 0x0 }, /* 0000 0000 0000 0000 */
X};
X
int dither[4][4] = {
X { 00, 8, 02, 10 },
X { 12, 04, 14, 06 },
X { 03, 11, 01, 9 },
X { 15, 07, 13, 05 },
X};
X
dobits(width,height)
int width,height;
X{
X register int row, col, lev, val1, val2, val;
X
X for (row = 0; row < height; row++) {
X for (col = 0; col < width; col += 2) {
X val1 = scanline[row][col];
X if (val1%16 > dither[row%4][col%4])
X val1 = val1/16 + 1;
X else
X val1 = val1/16;
X val2 = scanline[row][col+1];
X if (val2%16 > dither[row%4][(col+1)%4])
X val2 = val2/16 + 1;
X else
X val2 = val2/16;
X for (lev = 0; lev < 4; lev++) {
X val = greys[val2][lev]|(greys[val1][lev] << 4);
X bitmap[row/8][col/8][(row%8)*4+lev][(col%8)/2] = val;
X }
X }
X }
X for (; row < RPIXMAX; row++) {
X for (; col < RPIXMAX; col++) {
X for (lev = 0; lev < 4; lev++) {
X bitmap[row/8][col/8][(row%8)*4+lev][(col%8)/2] = 0;
X }
X }
X }
X for (val1 = 0; val1 <= (int)((height*GREYMAX)/BITBLK); val1++) {
X for (lev = 0; lev <= (int)((width*GREYMAX)/BITBLK); lev++) {
X for (row = 0; row < BITBLK; row++) {
X for (col = 0; col < GREYMAX; col++) {
X putchar(bitmap[val1][lev][row][col]);
X }
X }
X }
X }
X}
X#endif /* IMPRESS */
END_OF_FILE
if test 7319 -ne `wc -c <'toprinter.c'`; then
echo shar: \"'toprinter.c'\" unpacked with wrong size!
fi
# end of 'toprinter.c'
fi
echo shar: End of shell archive.
exit 0
--
name : David Koblas place: MIPS Computers Systems
phone: 408-991-0287 uucp : {ames,decwrl,pyramid,wyse}!mips!koblas
quote: I've began to wonder if X11 is really a competition to see who can
create the largest copyright that says, "It's free."koblas@mips.COM (David Koblas) (09/20/88)
Patch #1:
[ For those of you who don't have patch or don't what to use it..
all it says is to delete the four lines with a '-' infront of them.]
*** xxx Mon Sep 19 16:14:20 1988
--- toprinter.c Mon Sep 19 16:14:22 1988
***************
*** 153,162 ****
for (y=0;y<ysize;y++) {
for (x=0;x<xsize;x++) {
printf("%02x",VAL(x,y,i));
- if (i<3)
- printf("%02x",data[(x+(xsize*y))*3+i]);
- else
- printf("%02x",RGB_TO_VAL(
}
}
printf("showpage\n");
--- 153,158 ----
--
name : David Koblas place: MIPS Computers Systems
phone: 408-991-0287 uucp : {ames,decwrl,pyramid,wyse}!mips!koblas
quote: I've began to wonder if X11 is really a competition to see who can
create the largest copyright that says, "It's free."