diff options
Diffstat (limited to 'dviware/beebe/src/dvidjp.c')
-rw-r--r-- | dviware/beebe/src/dvidjp.c | 579 |
1 files changed, 579 insertions, 0 deletions
diff --git a/dviware/beebe/src/dvidjp.c b/dviware/beebe/src/dvidjp.c new file mode 100644 index 0000000000..c9e79cad96 --- /dev/null +++ b/dviware/beebe/src/dvidjp.c @@ -0,0 +1,579 @@ + +/* +I just got myself a brand new HP Desk Jet Plus printer to use with TeX. +I and a number of other people asked the net for sources to one of the many +DeskJet drivers which must be out there, but there was no response. I +searched all the archives I could find, with similarly unsuccessful +results. + +So I took the dvijet driver from the Beebe release and modified it for +the desk jet plus. It might be called (as by some) a "vanilla" driver +because it doesn't use downloadable fonts, but downloadable fonts +requires an extra memory cartridge -- for that I would have just +as soon bought the IIp. I did include some memory compaction, though, +which reduces file size and transfer time by 50 - 70 % So it's not +quite vanilla. The various compaction schemes can be switched off +at compile time if the old Desk Jet doesn't support them (I have no +idea) or if any of them prove buggy (possible). + +I include the modified source below, as I am guessing there are +others out there on the net who would find it useful. Perhaps some +kind soul will even archive it. It requires the rest of the +Beebe driver code, which is commonly available -- eg, +at ymir.claremont.edu & utah ... whatever. + +Hope this is helpful. Sorry if this isn't the place I'm supposed to post +source, but it's the best way I know to reach people who might find +this useful. + +Paul Kirkaas +kirkaas@cs.ucla.edu + +---------------------------------------------------------- +/* -*-C-*- dvidjp.c */ +/*-->dvidjp*/ +/**********************************************************************/ +/******************************* dvidjp *******************************/ +/**********************************************************************/ + +/* Driver for HP DeskJet Plus printer -- modified from + * Beebe Laser Jet driver + * by Paul Kirkaas (kirkaas@cs.ucla.edu) 22 May 1990 + * patch 1 -- bugs in YOFF & COMPACTION fixed 23 May 1990 + * + * Employs 3 types of data compaction for greater efficiency -- + * up to 60 - 70% reduction in output file size. Each compaction + * scheme can be switched on or off independently by defining any + * or all of: + * + * XOFF -- X offset -- instead of a string of leading zeros, offset + * by appropriate amount. Minimal savings when used with + * COMPACTION mode set. + * + * YOFF -- Y offset -- compress multiple blank lines into a single + * y skip command. + * + * COMPACTION -- Uses mode 2 compaction on Desk Jet Plus -- this is + * the trickiest but most effective compression modification. + * This is the likliest part to have a bug. + * Lots of cleaning up can be done here. + * + * If you have an old Desk Jet (not a Plus) it may not have + * all these abilities -- try undfining some of these switches. + * + * It should run straight with the Beebe driver set; you might + * have to make some adjustments. + * + * Please let me know if you make any improvements or repairs. + * Thanks + * + * Good Luck. + */ + +#include "dvihead.h" + +/**********************************************************************/ +/************************ Device Definitions ************************/ +/**********************************************************************/ + +/* All output-device-specific definitions go here. This section must +be changed when modifying a dvi driver for use on a new device */ + +#undef HPLASERJET +#define HPLASERJET 1 /* conditional compilation flag */ +#define HPDESKJET 1 /* conditional compilation flag */ + /* Include the following line for Y offsets*/ +#define YOFF 1 + /* Include the following line for using temporary X offsets*/ +#define XOFF 1 + /* Include the following line for Mode 2 Compaction */ +#define COMPACTION 1 +/* +#define COMPACTION 0 +*/ + +#define VERSION_NO "2.10" /* DVI driver version number */ + +#define DEVICE_ID (comp ? \ + "Hewlett-Packard Desk Jet plus (from LaserJet)\n\ + WITH Data Compaction for faster I/O" : \ + "Hewlett-Packard Desk Jet plus (from LaserJet)\n\ + with-OUT Data Compaction I/O" ) + /* this string is printed at runtime */ +#define OUTFILE_EXT (comp ? "djc" : "dj") + +#define DEFAULT_RESOLUTION 300 /* default dots/inch on HP Desk Jet */ + +#define BYTE_SIZE 8 /* output file byte size */ + +#undef STDRES +#define STDRES 1 /* 0 for low-resolution devices */ + +#define XDPI 300 /* HP Laser Jet horizontal dots/inch */ +#define XPSIZE 8 /* horizontal paper size in inches */ + +#define XSIZE (((XDPI*XPSIZE+2*HOST_WORD_SIZE-1)/\ + (2*HOST_WORD_SIZE))*(2*HOST_WORD_SIZE)) + /* number of horizontal dots; */ + /* MUST BE multiple of */ + /* 2*HOST_WORD_SIZE */ +#define XWORDS ((XSIZE + HOST_WORD_SIZE - 1)/HOST_WORD_SIZE) + /* number of words in rows */ + /* of bitmap array */ + +#define YDPI 300 /* HP Laser Jet vertical dots/inch */ + +#define YPSIZE 11 /* vertical paper size in inches */ +#define YSIZE (YDPI*YPSIZE) /* number of vertical dots */ + +/* The printer bit map (must have an even number of columns). */ + +#define XBIT ((1+2*XWORDS)/2) +#define YBIT YSIZE +#if (IBM_PC_LATTICE | IBM_PC_MICROSOFT | IBM_PC_WIZARD) +#undef SEGMEM +#define SEGMEM 1 /* ( ((long)XBIT * (long)YBIT) > 65536L ) */ +#endif +int comp = COMPACTION; /* compaction flag -- reset in option.h */ + +#include "bitmap.h" + +#include "main.h" +#undef STDMAG +#undef RESOLUTION +#define STDMAG 1500 +#define RESOLUTION (((float)STDMAG)/5.0) /* dots per inch */ +#include "abortrun.h" +#include "actfact.h" +#include "alldone.h" +#include "chargf.h" +#include "charpk.h" +#include "charpxl.h" +#include "clrbmap.h" +#include "clrrow.h" +#include "dbgopen.h" + +/*-->devinit*/ +/**********************************************************************/ +/****************************** devinit *******************************/ +/**********************************************************************/ + +void +devinit(argc,argv) /* initialize device */ +int argc; +char *argv[]; +{ + (void)getbmap(); + OUTS("\033E"); /* printer reset */ + OUTS("\033&l0L"); /* Disable perforation skip */ +/* OUTS("\033*rB"); /* End graphics */ + OUTS("\033*t300R"); /* printer resolution */ +if (comp) + OUTS("\033*b2M"); /* Select Compacted Graphics Mode Two */ +else + OUTS("\033*b0M"); /* Select Full Graphics Mode */ + + OUTS("\033*r0A"); /* Start graphics, at leftmost position */ +} + +/*-->devterm*/ +/**********************************************************************/ +/****************************** devterm *******************************/ +/**********************************************************************/ + +void +devterm() /* terminate device */ +{ + OUTS("\033E"); /* printer reset*/ +} + +#include "dvifile.h" +#include "dviinit.h" +#include "dviterm.h" +#include "dispchar.h" +#include "f20open.h" +#include "fatal.h" +#include "fillrect.h" +#include "findpost.h" +#include "fixpos.h" +#include "fontfile.h" +#include "fontsub.h" +#include "getbmap.h" +#include "getbytes.h" +#include "getfntdf.h" +#include "getpgtab.h" +#include "initglob.h" +#include "inch.h" +#include "loadchar.h" +#include "movedown.h" +#include "moveover.h" +#include "moveto.h" +#include "nosignex.h" +#include "openfont.h" +#include "option.h" + +/*-->outline*/ +/**********************************************************************/ +/****************************** outline *******************************/ +/**********************************************************************/ + +void +outline(pbit) +UNSIGN32 *pbit; /* pointer to raster line */ + +/************************************************************************* +Use machine-specific coding here for efficiency. For TOPS-20, we encode +9 bytes from every pair of 36-bit words. + +For each raster line on the paper, the Laser Jet expects a binary 8-bit +byte stream of the form + + <ESC>*bnnnWxxxxxxx ... xxxxxxx + <--- nnn bytes ---> + +where each byte contains, in order from high to low bit, a left-to-right +bit pattern. No end-of-line marker is required; the escape sequence +automatically causes a new raster line to be started. +*************************************************************************/ + +{ + register UNSIGN32 w_even,w_odd; + register UNSIGN32 *p; + register BYTE *pbuf; + BYTE buf[1+(XSIZE+7)/8]; /* space for EOS + n 8-bit bytes */ + register INT16 i,last_word; + int ic,jc; /* just counters */ + unsigned char * endb; /* pointer to end of buf */ + unsigned char greystr[129]; /* Max length of 127 in compacted mode 2 */ + unsigned char * greyp; /* Pointer to greystr[] */ + unsigned char outstr[999]; /* Compacted mode 2 output string */ + unsigned char * outp; /* Pointer to outstr[] */ + unsigned char * endob; /* pointer to end of outstr */ + unsigned char cmp; /* Comparison variable */ + int outsz; /* Size of outstr -- since includes NULLs */ + int count; + int gcnt; /* Length of grey runs */ + + +#if IBM_PC_MICROSOFT + for (last_word = XBIT - 1; + (last_word >= 1) && (*(UNSIGN32*)normaddr(pbit,last_word) == 0); + --last_word) + ; /* trim white space a word at a time */ +#else + p = pbit + XBIT - 1; /* point to last word on line */ + for (last_word = XBIT - 1; (last_word >= 1) && (*p == 0); --last_word) + --p; /* trim white space a word at a time */ +#endif + + p = pbit; + pbuf = &buf[0]; + for (i = 0; i <= last_word; i += 2) /* loop over trimmed raster */ + { + w_even = (*p++); + w_odd = (*p++); + +#if (HOST_WORD_SIZE == 36) + *pbuf++ = (BYTE)( (w_even >> 28) & 0xff); + *pbuf++ = (BYTE)( (w_even >> 20) & 0xff); + *pbuf++ = (BYTE)( (w_even >> 12) & 0xff); + *pbuf++ = (BYTE)( (w_even >> 4) & 0xff); + *pbuf++ = (BYTE)( ((w_even << 4) | (w_odd >> 32)) & 0xff); + *pbuf++ = (BYTE)( (w_odd >> 24) & 0xff); + *pbuf++ = (BYTE)( (w_odd >> 16) & 0xff); + *pbuf++ = (BYTE)( (w_odd >> 8) & 0xff); + *pbuf++ = (BYTE)( (w_odd ) & 0xff); +#else /* HOST_WORD_SIZE == 32 */ + /* encode 8 bytes at a time on 32-bit machines */ + *pbuf++ = (BYTE)( (w_even >> 24) & 0xff); + *pbuf++ = (BYTE)( (w_even >> 16) & 0xff); + *pbuf++ = (BYTE)( (w_even >> 8) & 0xff); + *pbuf++ = (BYTE)( (w_even ) & 0xff); + *pbuf++ = (BYTE)( (w_odd >> 24) & 0xff); + *pbuf++ = (BYTE)( (w_odd >> 16) & 0xff); + *pbuf++ = (BYTE)( (w_odd >> 8) & 0xff); + *pbuf++ = (BYTE)( (w_odd ) & 0xff); +#endif + + } + + *pbuf = '\0'; /* trailing EOS marker */ + + last_word |= 1; /* make last_word ODD */ + for (i = ((last_word+1)*HOST_WORD_SIZE)/8; + (*(--pbuf) == '\0') && (i > 1); --i) + ; /* trim trailing zero bytes, leaving at least one */ + last_word = i; +#ifdef XOFF + /* Trim leading zero bytes & do appropriate Temporary X offset */ + OUTS("\033*b"); /* Set up for raster transfer */ + pbuf=buf; + for (ic=0; !buf[ic] && ic<last_word ; ic++, pbuf++) + ; + if (ic>10) /* Do an X-shift */ + { + OUTF("%dx",8*ic); /* Shift by 8*ic # of blank pixels */ + } + else /* don't bother */ + { pbuf = buf; ic = 0; } + + endb = &buf[last_word]; + +if (comp) + { + greyp = greystr; + outp = outstr; + outsz = gcnt = 0; + endb = &buf[last_word]; + while (pbuf <= endb) + { + cmp = *pbuf; + for (count = 0; count<127 && pbuf<=endb && cmp==*pbuf; count ++, pbuf++) + ; + if (count==0){printf("DANGER DANGER ***COUNT IS ZERO***!!!\n");exit(0);} + if (count <= 3) /* No run yet -- just put them in greystr */ + { + gcnt += count; + for (jc = 0; jc < count ; jc ++) + { + *greyp = cmp; + greyp++; + } + if (gcnt >= 124) /* Can't have more than 127, so ... */ + { + outstr[outsz] = gcnt-1; + outsz++; + for (jc = 0; jc < gcnt; jc ++) + { + outstr[outsz + jc] = greystr[jc]; + } + outsz += gcnt; + gcnt = 0; + greyp = greystr; + continue; + } + } + else /* We have a run of 4 or more */ + { + if (gcnt) /* Flush our accumilated grey */ + { + outstr[outsz] = gcnt-1; + outsz++; + for (jc = 0; jc < gcnt; jc ++) + { + outstr[outsz + jc] = greystr[jc]; + } + outsz += gcnt; + gcnt = 0; + greyp = greystr; + } + outstr[outsz] = (unsigned char) (1-count); /* Is this cast right? */ + outsz ++; + outstr[outsz] = cmp; + outsz++; + } + } + if (gcnt) /* Flush our accumilated grey */ + { + outstr[outsz] = gcnt-1; + outsz++; + for (jc = 0; jc < gcnt; jc ++) + { + outstr[outsz + jc] = greystr[jc]; + } + outsz += gcnt; + gcnt = 0; + greyp = greystr; + } + OUTF("%dW",outsz); /* How much is coming ... */ + endob = outstr + outsz -1; /* End of the outstr */ + for (outp = outstr; outp <= endob; outp++ ) + OUTC(*outp); + + } + else + { + OUTF("%dW",(int)last_word-ic); /* How much is coming ... */ + /* cannot use fprintf with %s format because of + NUL's in string, and it is slow anyway */ + for (i = ic; i < last_word; ++pbuf,++i) + OUTC(*pbuf); + } +#else + OUTF("\033*b%dW",(int)last_word); + pbuf = &buf[0]; /* cannot use fprintf with %s format because of + NUL's in string, and it is slow anyway */ + for (i = 0; i < last_word; ++pbuf,++i) + OUTC(*pbuf); +#endif XOFF +} + +/*-->prtbmap*/ +/**********************************************************************/ +/****************************** prtbmap *******************************/ +/**********************************************************************/ + +void +prtbmap() + +{ + register UNSIGN32 *p; + register INT16 j,k,ybottom,ytop; +#ifdef YOFF + int ycnt = 0; +#endif YOFF +/* OUTS("\033E"); /* printer reset */ +/* OUTS("\033&l0L"); /* Disable perforation skip */ +/* OUTS("\033*rB"); /* End graphics */ +/* OUTS("\033*t300R"); /* printer resolution */ +if (comp) + OUTS("\033*b2M"); /* Select Compacted Graphics Mode Two */ +else + OUTS("\033*b0M"); /* Select Full Graphics Mode */ + + OUTS("\033*r0A"); /* Start graphics, at leftmost position */ + + if (DBGOPT(DBG_PAGE_DUMP)) + { + INT16 k1,k2,k3; + + for (k3 = 0; k3 < XBIT; (k3 += 7, ++p)) + { /* print bitmap 7 words at a pass */ + k1 = k3; + k2 = MIN(XBIT,k1+7); + (void)printf("prtbmap()...bitmap words %d..%d",k1,k2-1); + NEWLINE(stdout); + (void)printf(" "); + for (k = k1; k < k2; ++k) + (void)printf("%10d",k*HOST_WORD_SIZE); + NEWLINE(stdout); + for (j = YBIT-1; j >= 0; --j) + { + p = BITMAP(j,0); + for (k = 0; k < XBIT; (++k,++p)) + { + if (*p) /* print non-blank raster line */ + { + p = BITMAP(j,k1); + (void)printf("%5d:",j); + for (k = k1; k < k2; (++k,++p)) + (void)printf(" %09lx",*p); + NEWLINE(stdout); + break; /* exit loop over k */ + } + } + } + } + } + + (void)clearerr(plotfp); + +#if ZAPTHISOUT + k = -1; /* find top non-zero raster */ + for (j = YBIT-1; (j > 0) && (k < 0); --j) /* loop over raster lines */ + { + p = BITMAP(j,XBIT-1); + for (k = XBIT - 1; ((k >= 0) && (*p == 0)); --k) + --p; /* trim white space */ + } + ytop = j; +#else + ytop = YBIT-1; +#endif + + k = -1; /* find bottom non-zero raster */ + for (j = 0; (j < ytop) && (k < 0); ++j) /* loop over raster lines */ + { + +#if IBM_PC_MICROSOFT + for (k = XBIT - 1;((k >= 0) && (*BITMAP(j,k) == 0));--k) + ; /* trim white space */ +#else + p = BITMAP(j,XBIT-1); + for (k = XBIT - 1; ((k >= 0) && (*p == 0)); --k) + --p; /* trim white space */ +#endif + + } + ybottom = MAX(0,j-1); + +#if ZAPTHISOUT + for (j = ytop; (j >= ybottom); --j) + { + OUTF("%5d:",(int)j); + for (k = 0; k < XBIT; ++k) + OUTF(" %9x",*BITMAP(j,k)); + NEWLINE(plotfp); + } +#endif + + +#ifdef YOFF + ycnt = 0; + for (j = ytop; (j >= ybottom) ; --j) /* loop over raster lines */ + { + if (isNul (BITMAP(j,0))) + ycnt ++; + else + { + if (ycnt) OUTF("\033*p+%dY",ycnt); + outline(BITMAP(j,0)); + ycnt = 0; + } + } +#else + for (j = ytop; (j >= ybottom) ; --j) /* loop over raster lines */ + outline(BITMAP(j,0)); +#endif YOFF + + OUTS("\033*rB\f"); /* end raster graphics, eject page */ + + (void)fflush(plotfp); + if (DISKFULL(plotfp)) + (void)fatal("Output error -- disk storage probably full"); +} +#ifdef YOFF +isNul (pbit) UNSIGN32 *pbit; +{ + UNSIGN32 * p; +#if IBM_PC_MICROSOFT + int last_word; + for (last_word = XBIT - 1; + (last_word >= 1) && (*(UNSIGN32*)normaddr(pbit,last_word) == 0); + --last_word) + ; /* trim white space a word at a time */ + if (last_word <=1) return 1; + return 0; +#else + p = pbit + XBIT - 1; /* point to last word on line */ + while ( !*p && p>pbit ) p--; + if (p==pbit && !*p) return 1; + return 0; +#endif IBM_PC_MICROSOFT +} +#endif YOFF + +#include "outrow.h" +#include "prtpage.h" +#include "readfont.h" +#include "readgf.h" +#include "readpk.h" +#include "readpost.h" +#include "readpxl.h" +#include "reldfont.h" +#include "rulepxl.h" +#include "setchar.h" +#include "setfntnm.h" +#include "setrule.h" +#include "signex.h" +#include "skgfspec.h" +#include "skipfont.h" +#include "skpkspec.h" +#include "special.h" +#include "strchr.h" +#include "strcm2.h" +#include "strid2.h" +#include "strrchr.h" +#include "tctos.h" +#include "usage.h" +#include "warning.h" |