/* -*-C-*- dvipj.c */ /*-->dvijet*/ /**********************************************************************/ /******************************* dvipj ********************************/ /**********************************************************************/ /* HP PaintJet driver based on dvijet (the escape sequences are very */ /* similar), magnification stuff from dvitos (also 180 dpi) */ /* The changes to the included files have *only* been made for */ /* unsegmented-memory un*x */ /* We allow 4 colours (including black, but not including white) (NPLANES =4), stored as 4 separate bitmaps. The current bitmap is indexed by global variable `plane', which can be reset by \specials. To make things simpler, the paintjet palette is redefined so that when only one bitmap has a pixel set at the appropriate position you get the right colour. At present, if more then one bitmap has a given pixel set, you get a colour determined by the sequence red, green, blue, black (in order of increasing precedence). This should be changed by removing corresponding entries in the other bitmaps when the current colour is painted. There is one \special{color }. Transparency mode is assumed -- this should be a command-line switch. */ #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 HPPAINTJET #define HPPAINTJET 1 /* conditional compilation flag */ #define VERSION_NO "2.10" /* DVI driver version number */ #define DEVICE_ID "Hewlett-Packard PaintJet printer" /* this string is printed at runtime */ #define OUTFILE_EXT "pj" #define DEFAULT_RESOLUTION 180 /* default dots/inch on HP PaintJet */ #define BYTE_SIZE 8 /* output file byte size */ #undef STDRES #define STDRES 0 /* 0 for low-resolution devices */ #define XDPI 180 /* 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 180 /* HP PaintJet vertical dots/inch */ #define YPSIZE 11 /* vertical paper size in inches */ #define YSIZE (YDPI*YPSIZE) /* number of vertical dots */ #define NPLANES 4 /* number of colour planes (including black) */ /* 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 #include "bitmap.h" #include "main.h" #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(); OUTF("\033E\033*t%dR",(int)hpres); /* printer reset, resolution */ OUTS("\033&k3W"); /* transparency mode -- should be made */ /* optional */ } /*-->devterm*/ /**********************************************************************/ /****************************** devterm *******************************/ /**********************************************************************/ void devterm() /* terminate device */ { } #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(type,pbit) UNSIGN32 *pbit; /* pointer to raster line */ char type; /* 'V' or 'W' for non-last or last */ /* plane respectively */ /************************************************************************* 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 *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; #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; if (type=='V') OUTF("\033*b%dV",(int)last_word); else if (type=='W') 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); } /*-->prtbmap*/ /**********************************************************************/ /****************************** prtbmap *******************************/ /**********************************************************************/ void prtbmap() { register UNSIGN32 *p; register INT16 i,j,k,ybottom,ytop; 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(plane,j,0); for (k = 0; k < XBIT; (++k,++p)) { if (*p) /* print non-blank raster line */ { p = BITMAP(plane,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(plane,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(plane,j,k) == 0));--k) ; /* trim white space */ #else p = BITMAP(plane,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(plane,j,k)); NEWLINE(plotfp); } #endif /* OUTF("\033&l%dX",(int)copies); *//* number of copies (not relevant)*/ OUTS("\033*r4U"); /* use 4 printer colour planes */ /* (distinct from bitmap */ /* plane) */ OUTS("\033*v90A\033*v88B\033*v85C\033*v0I"); /* define palette # 0 as white */ OUTS("\033*v53A\033*v8B\033*v14C\033*v1I"); /* define palette # 1 */ /* as red */ OUTS("\033*v3A\033*v26B\033*v22C\033*v2I"); /* define palette # 2 */ /* as green */ OUTS("\033*v3I"); /* and #3 */ OUTS("\033*v4A\033*v4B\033*v29C\033*v4I"); /* define palette # 4 */ /* as blue */ OUTS("\033*v5I\033*v6I\033*v7I"); /* and #5,6,7 */ OUTS("\033*v4A\033*v4B\033*v6C\033*v8I"); /* define palette # 8 */ /* as black */ OUTS("\033*v9I\033*v10I\033*v11I\033*v12I\033*v13I\033*v14I\033*v15I"); /* and other values with top bit set (i.e., including black) */ OUTS("\033*r1A"); /* start plot at current */ /* position */ for (j = ytop; (j >= ybottom) ; --j) { /* loop over raster lines */ for (i = 1; i<=3; i++) outline('V',BITMAP(i,j,0)); /* red, green, blue in order */ outline('W',BITMAP(0,j,0)); /* finish with black */ } /* OUTS("\033*rB"); */ /* end raster graphics */ OUTS("\f"); /* get to bottom of page */ (void)fflush(plotfp); if (DISKFULL(plotfp)) (void)fatal("Output error -- disk storage probably full"); } #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" /* -*-C-*- special.h */ /*-->special*/ /**********************************************************************/ /****************************** special *******************************/ /**********************************************************************/ void special(s) /* process TeX \special{} string in s[] */ register char *s; { if (strncmp("color ",s,6)==0) { if (strcmp("black",&s[6])==0) plane=0; else if(strcmp("red",&s[6])==0) plane=1; else if(strcmp("green",&s[6])==0) plane=2; else if(strcmp("blue",&s[6])==0) plane=3; else { (void)sprintf(message, "special(): colour %s not available -- ignored",s); (void)warning(message); } } else { (void)sprintf(message, "special(): TeX \\special{%s} not implemented in this driver",s); (void)warning(message); } } #include "strchr.h" #include "strcm2.h" #include "strid2.h" #include "strrchr.h" #include "tctos.h" #include "usage.h" #include "warning.h"