home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Photo CD Demo 1
/
Demo.bin
/
gle
/
gle
/
dvitobit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-29
|
15KB
|
655 lines
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#ifdef __TURBOC__
extern unsigned _stklen=20000;
#include <alloc.h>
#else
#define huge
#endif
#define true (!false)
#define false 0
#include "bmp.h"
#include "dvipath.h"
double d_xscale, d_yscale;
int gdebug=false;
int fittobit; /* true if picture should be scaled up to fit bitmap, wp-tiff */
#define scx(v) ( ((v) * d_xscale + 1))
#define scy(v) ( ((v) * d_yscale + 1))
#define dbg if (gdebug)
char *bgidir();
int path_bezier(int x1, int y1, int x2, int y2, int x3, int y3);
int path_alloc(void);
int path_move(int x1, int y1);
int path_line(int x1, int y1);
int path_closepath(void);
int dev_print(Bitmap *b);
int dev_size(int *nxbits, int *nybits, double *devxcm, double *devycm);
int dev_hpplus;
int dev_hires;
int dev_noff;
int dev_noclip;
int dev_nosquash;
int dev_wide;
double devxcm,devycm;
double uxcm,uycm;
Bitmap *bb;
/*---------------------------------------------------------------------------*/
/* Local stuff */
int flipit;
FILE *outbit;
FILE *inf;
/*---------------------------------------------------------------------------*/
main_usage()
{
printf("Usage: dviprint [-depson | -dlj] [-old] [-hires] [-debug] [-output xx.prt]\n");
printf(" -depson To produce output for epson printers \n");
printf(" -dwp To add tiff image to wp .eps file \n");
printf(" -dlj To produce output for HP LaserJet printers \n");
printf(" -dpj To produce output for HP PaintJet printers \n");
printf(" -dvt To print bitmap to screen (preview) \n");
printf(" -over Overhead transparency mode for PaintJet\n");
printf(" -old For old HP Laser Jet printers (no compression)\n");
printf(" -hires Uses high resolution for that printer (slower)\n");
printf(" -wide If your printer has a wide carriage \n");
printf(" -noflip Disable's auto flipping \n");
printf(" -flip Forces flip \n");
printf(" -nosquash Tries to print it full size\n");
printf(" -compress Force internal bitmap compression (slow) \n");
printf(" -noff No form feed\n");
printf(" -debug Prints debug messages\n");
printf(" -out x.x Prints output to file instead of printer port\n");
printf("\n");
}
enum {D_EPSON=1,D_LJ,D_VT,D_PJ,D_WP};
int dev_type,dev_noflip,dev_lowmem,dev_low,dev_over,dev_flip;
int bmp_compress;
char outbitname[80];
char gleroot[90];
main(int argc, char **argv)
{
int i;
char *ss;
strcpy(gleroot,argv[0]);
#ifdef __TURBOC__
ss = strchr(gleroot,'\\');
if (ss==NULL) printf("Unable to locate files AGRV[0] wrong");
for (;strchr(ss+1,'\\')!=NULL;) ss = strchr(ss+1,'\\');
*(ss+1) = 0;
#endif
if (argc<=1) { main_usage(); exit(0);}
inf = fopen("out.dvi","rb");
if (inf==NULL) {
printf("Unable to open OUT.DVI for input, run DVIGLE first\n");
gle_abort("");
}
dev_hpplus = true;
for (i=1;i<argc; i++) {
#ifdef __TURBOC__
strlwr(argv[i]);
#endif
if (strncmp(argv[i],"/o",2)==0) dev_hpplus = false;
else if (strncmp(argv[i],"/h",2)==0) dev_hires = true;
else if (strncmp(argv[i],"-ol",3)==0) dev_hpplus = false;
else if (strncmp(argv[i],"-ov",3)==0) dev_over = true;
else if (strncmp(argv[i],"-me",3)==0) dev_lowmem = false;
else if (strncmp(argv[i],"-co",3)==0) bmp_compress = true;
else if (strncmp(argv[i],"-lo",3)==0) dev_low = true;
else if (strncmp(argv[i],"-h",2)==0) dev_hires = true;
else if (strncmp(argv[i],"-nosq",5)==0) dev_nosquash = true;
else if (strncmp(argv[i],"-wi",3)==0) dev_wide = true;
else if (strncmp(argv[i],"-noff",5)==0) dev_noff = true;
else if (strncmp(argv[i],"-nocl",5)==0) dev_noclip = true;
else if (strncmp(argv[i],"-n",2)==0) dev_noflip = true;
else if (strncmp(argv[i],"-fl",3)==0) dev_flip = true;
else if (strncmp(argv[i],"-deb",4)==0) gdebug = true;
else if (strncmp(argv[i],"-dwp",4)==0) dev_type = D_WP;
else if (strncmp(argv[i],"-dep",4)==0) dev_type = D_EPSON;
else if (strncmp(argv[i],"-dl",3)==0) dev_type = D_LJ;
else if (strncmp(argv[i],"-dv",3)==0) dev_type = D_VT;
else if (strncmp(argv[i],"-dp",3)==0) dev_type = D_PJ;
else if (strncmp(argv[i],"-o",2)==0) {
strcpy(outbitname,argv[++i]);
}
else {
printf("Unrecognised qualifier, {%s} \n",argv[i]);
main_usage();
exit(0);
}
}
if (dev_type==0) { main_usage(); exit(0);}
if (dev_type==D_WP) {
if (strcmp(outbitname,"out.dvi")==0) {
printf("Must specify name of .eps file to add tiff too.\n");
exit(0);
}
if (strstr(outbitname,".")!=0) {
* strchr(outbitname,'.') = 0;
}
strcat(outbitname,".epf");
}
if (strstr(outbitname,".gle")!=0) {
printf("Will not erase a .gle file\n");
exit(0);
}
open_outbit(outbitname);
draw_file();
close_output();
}
/*---------------------------------------------------------------------------*/
open_outbit(char *outbitname)
{
#if __TURBOC__
if (strlen(outbitname)!=0) {
printf("Writing output to file {%s} \n",outbitname);
outbit = fopen(outbitname,"wb");
if (outbit==NULL) {
printf("Could not open that FILE for output {%s} \n",outbitname);
perror("");
exit(1);
}
} else printf("Printing to LPT1 \n");
#else
/* Special binary open for VMS */
/* strcpy(outbitname,"out.prt"); */
printf("Writing output to file {%s} \n",outbitname);
#ifdef unix
if ((outbit = fopen(outbitname,"wb")) == NULL)
#else
if ((outbit = fopen (outbitname,"wb","rfm=fix","bls=512","mrs=512")) == NULL)
#endif
{ printf ("Can't open output bitmap file.\n");
abort();
}
#endif
}
/*---------------------------------------------------------------------------*/
/* Path variables for bitmap */
int *path;
int npath;
int npath_alloc;
int file_end = false;
float getf(void);
int getfxy(int *x, int *y);
getfxy(int *x, int *y)
{
float u,xx,yy;
xx = getf();
yy = getf();
if (flipit) {
u = yy;
yy = uxcm - xx;
xx = u;
}
/*printf("fxy %g %g \n",xx,yy); */
*x = (int) .5+scx(xx);
*y = (int) .5+scy(yy);
}
float getf(void)
{
static float x;
fread(&x,sizeof(x),1,inf);
if (feof(inf)) file_end = true;
return x;
}
long getl(void)
{
static long x;
fread(&x,sizeof(x),1,inf);
if (feof(inf)) file_end = true;
return x;
}
float cur_lwidth,cur_color,cur_fill,cur_dashlen;
long cur_lstyle;
draw_file(void)
{
int x2,y2,x3,y3,sx,sy;
int x,y,cx,cy;
int g=0;
float fx,fy;
int i,dot;
for (;!file_end;) {
i = getl();
if (file_end) break;
switch (i) {
case p_size:
dbg printf("#size \n");
fx = getf(); fy = getf();
d_open(fx,fy);
dbg printf(":");
case p_newpath:
dbg printf("#newpath \n");
npath = 0;
break;
case p_move:
getfxy(&x,&y);
cx = x; cy = y;
dbg printf("#move (%d) %d %d \n",npath,x,y);
path_move(x,y);
sx = cx; sy = cy;
break;
case p_line:
dbg {g++; if (g>200) {printf(":"); g=0;}}
getfxy(&x,&y);
cx = x; cy = y;
dbg printf("#line (%d) %d %d \n",npath,x,y);
path_line(x,y);
break;
case p_closepath:
dbg printf("#closepath %d %d \n",sx,sy);
path_closepath();
cx = sx; cy = sy;
break;
case p_dline:
dbg {g++; if (g>200) {printf(":"); g=0;}}
getfxy(&x,&y);
bmp_line(bb,cx,cy,x,y);
npath = 0;
dbg printf("#(nopath)line %d %d %d %d \n",cx,cy,x,y);
cx = x; cy = y;
break;
case p_bezier:
getfxy(&x,&y);
getfxy(&x2,&y2);
getfxy(&x3,&y3);
path_bezier(x,y,x2,y2,x3,y3);
dbg printf("#bezier (%d)\n",npath);
cx = x3; cy = y3;
break;
case p_stroke:
dbg printf("#stroke \n");
path_stroke();
break;
case p_fill:
dbg printf("#fill \n");
path_fill();
break;
case p_lwidth:
dbg printf("#lwidth \n");
cur_lwidth = getf();
bmp_lwidth(bb,(int) scx(cur_lwidth));
break;
case p_dashlen:
dbg printf("#dashlen \n");
cur_dashlen = getf();
dot=(int)(0.5+d_yscale*cur_dashlen);
dot = dot > 0 ? dot : 1;
bmp_lstyle(bb,cur_lstyle,dot);
break;
case p_lstyle:
dbg printf("#lstyle \n");
cur_lstyle = getl();
dot=(int)(0.5+d_yscale*cur_dashlen);
dot = dot > 0 ? dot : 1;
bmp_lstyle(bb,cur_lstyle,dot);
break;
case p_setcolor:
x = getl(); x2 = getl(); x3 = getl(); y = getl();
dbg printf("#setcolor %d %d %d f=%d \n",x,x2,x3,y);
bmp_setcolor(bb,x,x2,x3,y); /* r,g,b,f */
break;
case p_clip:
dbg printf("#clipcurpath \n");
path_clip();
break;
case p_saveclip:
dbg printf("#save clip \n");
bmp_saveclip(bb);
break;
case p_restoreclip:
dbg printf("#restore clip \n");
bmp_restoreclip(bb);
break;
case p_null:
dbg printf("Null \n");
break;
default:
printf("Error in PATH codes in .DVI file %d\n",i);
break;
}
}
d_close();
}
gle_abort(char *s)
{
printf("%s",s);
exit(1);
}
path_send()
{
int sx=0,sy=0,cx=0,cy=0,x1,y1,x2,y2,x3,y3;
int closed=true;
int i,j,p1,p2;
bmp_newpath(bb);
for (i=0;i<npath;i++) {
switch(path[i]) {
case p_move:
sx = path[++i];
sy = path[++i];
bmp_pmove(bb,sx,sy);
cx = sx; cy = sy;
break;
case p_line:
x1 = path[++i];
y1 = path[++i];
dbg printf("pline %d %d \n",x1,y1);
bmp_pline(bb,x1,y1);
cx = x1; cy = y1;
break;
case p_bezier:
x1 = path[++i]; y1 = path[++i];
x2 = path[++i]; y2 = path[++i];
x3 = path[++i]; y3 = path[++i];
dbg printf("pbezier %d %d %d %d %d %d\n",x1,y1,x2,y2,x3,y3);
bmp_pbezier(bb,cx,cy,x1,y1,x2,y2,x3,y3);
cx = x3; cy = y3;
break;
case p_closepath:
dbg if (cx!=sx || cy!=sy) printf("pclosepath %d %d \n",sx,sy);
if (cx!=sx || cy!=sy) bmp_pline(bb,sx,sy);
cx = sx; cy = sy;
break;
default:
printf("Error in path_fill code path[%d] %d \n",i,path[i]);
}
}
}
path_fill(void)
{
path_send();
bmp_fill(bb);
}
path_clip(void)
{
path_send();
bmp_clip(bb);
}
path_stroke(void)
{
int sx=0,sy=0,cx=0,cy=0,x1,y1,x2,y2,x3,y3;
int closed=true;
int i,j,p1,p2;
bmp_newpath(bb);
for (i=0;i<npath;i++) {
switch(path[i]) {
case p_move:
sx = path[++i];
sy = path[++i];
cx = sx; cy = sy;
break;
case p_line:
x1 = path[++i];
y1 = path[++i];
bmp_line(bb,cx,cy,x1,y1);
cx = x1; cy = y1;
break;
case p_bezier:
x1 = path[++i]; y1 = path[++i];
x2 = path[++i]; y2 = path[++i];
x3 = path[++i]; y3 = path[++i];
bmp_bezier(bb,cx,cy,x1,y1,x2,y2,x3,y3);
cx = x3; cy = y3;
break;
case p_closepath:
if (cx!=sx || cy!=sy) bmp_line(bb,cx,cy,sx,sy);
cx = sx; cy = sy;
break;
default:
printf("Error in path_fill code path[%d] %d \n",i,path[i]);
}
}
}
path_move(int x,int y)
{
path_alloc();
path[npath++] = p_move;
path[npath++] = x;
path[npath++] = y;
}
path_line(int x,int y)
{
path_alloc();
path[npath++] = p_line;
path[npath++] = x;
path[npath++] = y;
}
path_bezier(int x1, int y1, int x2, int y2,int x3, int y3)
{
path_alloc();
path[npath++] = p_bezier;
path[npath++] = x1; path[npath++] = y1;
path[npath++] = x2; path[npath++] = y2;
path[npath++] = x3; path[npath++] = y3;
}
path_closepath()
{
path_alloc();
path[npath++] = p_closepath;
}
path_alloc(void)
{
static int npa;
int *a;
if (npath < (npath_alloc-10)) return;
npath_alloc = 20 + 2 * npath;
if (npath_alloc<300) npath_alloc = 300;
dbg printf("=== Allocate %d %d \n",npath_alloc,npath);
a = (int *) calloc(1,npath_alloc*sizeof(int));
if (a==NULL) {
gle_abort("Unable to allocate memory for path \n");
}
if (path != NULL) {
dbg printf("path reallocate, copy \n");
memcpy(a,path,(npa)*sizeof(int));
free(path);
}
npa = npath_alloc;
path = a;
}
path_free(void)
{
if (path==NULL) return;
free(path);
path = NULL;
npath = 0;
npath_alloc = 0;
}
d_open(double width, double height)
{
double f,f1,f2,fx,fy;
double d_scale;
int nxbits,nybits;
{devxcm = width; devycm = height;}
if (!dev_noflip && width>height &&!dev_wide) {devxcm = height; devycm = width;}
switch (dev_type) {
case D_EPSON:
dev_size_ep(&nxbits, &nybits, &devxcm, &devycm);
break;
case D_WP:
dev_size_wp(&nxbits, &nybits, &devxcm, &devycm);
break;
case D_LJ:
dev_size_lj(&nxbits, &nybits, &devxcm, &devycm);
break;
case D_VT:
dev_size_vt(&nxbits, &nybits, &devxcm, &devycm);
break;
case D_PJ:
dev_size_pj(&nxbits, &nybits, &devxcm, &devycm);
break;
}
uxcm = width; uycm = height;
d_scale = devxcm / width;
f = devycm / height;
if (f<d_scale) d_scale = f;
if (fittobit) {
fx = devxcm / width;
d_scale = 1;
fy = devycm / height;
}
if (d_scale<.98) {
if ( dev_flip
|| (dev_wide && !dev_noflip && height>width )
|| ( !dev_wide && width>height && !dev_noflip)
) {
d_scale = devycm/width;
f = devxcm/height;
if (f<d_scale) d_scale = f;
flipit = true;
printf("Flipping graph to fit on page better \n");
}
}
/* Get correct size of drawing */
if (d_scale > 1.001) d_scale = 1;
else {
if (d_scale < .99) printf("Squashing onto page by factor %g \n",d_scale);
}
d_xscale = d_scale * (nxbits-2) / devxcm; /* Device Scale X, Device Scale y */
d_yscale = d_scale * (nybits-2) / devycm;
if (fittobit) {
d_xscale = fx * (nxbits-2) / devxcm;
d_yscale = fy * (nybits-2) / devycm;
}
bb = bmp_open(nxbits,nybits,1,bmp_compress);
if (bb==NULL) gle_abort("Unable to create bitmap\n");
}
/*---------------------------------------------------------------------------*/
d_close()
{
path_free();
printf("Bitmap image created.\n");
switch (dev_type) {
case D_EPSON:
dev_print_ep(bb);
break;
case D_WP:
dev_print_wp(bb);
break;
case D_LJ:
dev_print_lj(bb);
break;
case D_PJ:
dev_print_pj(bb);
break;
case D_VT:
dev_print_vt(bb);
break;
}
bmp_close(bb);
}
#ifdef __TURBOC__
#include <dos.h>
char put_out(char c);
int status(void);
status(void)
{
union REGS reg;
reg.h.ah = 2;
reg.x.dx = 0;
int86(0x17, ®, ®);
return (reg.h.ah & 0x80);
}
char put_out(char c)
{
union REGS reg;
int w=0;
static int ft=0;
if (outbit!=NULL) {
fputc(c,outbit);
return;
}
while (!status()) {
w++;
if (w>10000) if (ft==0) {printf("Printer Busy\n"); w=0; ft=1;}
if (w>10000) {printf("."); w=0;}
}
/* if (ft==1) printf("\n"); */
reg.h.ah = 0;
reg.h.al = c;
reg.x.dx = 0;
int86(0x17,®,®);
return (reg.h.ah);
}
close_output()
{
if (outbit!=NULL) fclose(outbit);
}
#else
#include <stdio.h>
#ifdef VAXC
#include <file.h>
#endif
char zzbuff[512];
int nzz=0;
put_out(char c)
{
zzbuff[nzz++] = c;
if (nzz==512) {
fwrite(zzbuff,nzz,1,outbit);
nzz = 0;
}
}
close_output()
{
if (nzz > 0) { /* for vax, must send whole blocks */
memset(zzbuff+nzz,0,512-nzz);
fwrite(zzbuff,512,1,outbit);
}
fclose(outbit);
}
#endif
printmem(char *s, int n)
{
for (;n>0;n--) put_out(*s++);
}
char *bgidir()
{
#ifdef __TURBOC__
char *s;
static char xx[80];
s = getenv("GLE_BGI");
if (s==NULL) {
strcpy(xx,gleroot);
strcat(xx,"exe\\");
s = xx;
}
return s;
#endif
}