1 /* $Id: dvi2xx.h,v 2.3 1996/05/20 11:05:57 neumann Exp $ */
2 #ifndef DVI2XX_H
3 #define DVI2XX_H
4 /**********************************************************************
5  ************************  Global Definitions  ************************
6  **********************************************************************/
7 /* #define IBM3812 */
8 /* #define LJ */
9 /* #define DRAWGLYPH */
10 
11 #ifdef KPATHSEA
12 #include <kpathsea/config.h>
13 #include <kpathsea/c-std.h>
14 #include <kpathsea/c-limits.h>
15 #include <kpathsea/c-pathch.h>
16 #include <kpathsea/magstep.h>
17 #include <kpathsea/proginit.h>
18 #include <kpathsea/progname.h>
19 #include <kpathsea/tex-file.h>
20 #include <kpathsea/tex-glyph.h>
21 #include <kpathsea/tex-hush.h>
22 #include <kpathsea/tex-make.h>
23 #include <kpathsea/version.h>
24 #include <stdarg.h>
25 #include <c-auto.h>
26 #else
27 #include <string.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <unistd.h>
31 #ifdef  unix
32 #include <limits.h>
33 #endif
34 #endif
35 
36 #include <signal.h>
37 #include <ctype.h>
38 #ifdef vms
39 #include <file.h>
40 #else
41 # ifndef __riscos
42 # include <fcntl.h>
43 # endif
44 #endif
45 #ifdef MSC5
46 #include <dos.h>     /* only for binaryopen on device  */
47 #endif
48 
49 
50 #include "config.h"
51 #include "commands.h"
52 
53 #define  DVIFORMAT     2
54 #ifndef UNKNOWN
55 #define  UNKNOWN      -1
56 #endif
57 #define  FIRSTFNTCHAR  0
58 
59 #ifdef __riscos
60 # ifdef RISC_USE_OSL
61 #  define MAXOPEN_OS    16
62 # else
63 #  define MAXOPEN_OS    8      /* don't know if this IS the maximum */
64 # endif
65 #else
66 # ifdef   OPEN_MAX                    /* ... in a friendly unix system  */
67 #  ifndef vms
68 #   define MAXOPEN_OS (OPEN_MAX - 8)
69 #  else
70 #   define  MAXOPEN_OS 12     /* OPEN_MAX seems to be 8 on VMS systems */
71 #  endif
72 # else
73 #  ifdef __DJGPP__
74 #   if __DJGPP_MINOR__ <= 1
75     /* DJGPP needs few handles free in the first 20, or else child programs
76        (called by MakeTeX... scripts) won't run, since the stub loader
77        cannot open the .exe program.  This is because DOS only copies the
78        first 20 handles to the child program.  */
79 #    define MAXOPEN_OS   5
80 #   else
81     /* DJGPP v2.02 and later works around this.  Assume they have at least
82        FILES=30 in their CONFIG.SYS (everybody should).  */
83 #    define MAXOPEN_OS  20
84 #   endif
85 #  else
86 #   define  MAXOPEN_OS  12     /* limit on number of open font files */
87 #  endif
88 # endif
89 #endif
90 
91 #ifdef LJ_RESIDENT_FONTS
92 /* we have to read tfm files as well */
93 #define  MAXOPEN       (MAXOPEN_OS - 1)
94 #else
95 #define  MAXOPEN       MAXOPEN_OS
96 #endif
97 
98 #define  NFNTCHARS       LASTFNTCHAR+1
99 #define  STACK_SIZE      100     /* DVI-stack size                     */
100 #define  NONEXISTANT     -1      /* offset for PXL files not found     */
101 #ifdef RISC_USE_OSL
102 # define  NO_FILE        (FPNULL-1)
103 #else
104 # define  NO_FILE        ((FILE *)-1)
105 #endif
106 #define  NEW(A) ((A *)  malloc(sizeof(A)))
107 #define  EQ(a,b)        (strcmp(a,b)==0)
108 #define  MM_TO_PXL(x)   (int)(((x)*RESOLUTION*10)/254)
109 #define  PT_TO_PXL(x)   (int)((long4)((x)*RESOLUTION*100l)/7224)
110 #define  PT_TO_DVI(x)   (long4)((x)*65536l)
111 #define  BINOPEN(f) BOPENCMD(f,READ_BINARY)
112 /* SMALL_SIZE characters are loaded into font storage of the printer   */
113 /* LARGE_SIZE characters are rastered                                  */
114 /* HUGE_SIZE characters are not loaded into the memory of the host     */
115 #define  SMALL_SIZE (unsigned char) 0
116 #define  LARGE_SIZE (unsigned char) 1
117 #define  HUGE_SIZE  (unsigned char) 2
118 #define  HUGE_CHAR_PATTERN 32767l
119 #define  BYTES_PER_PIXEL_LINE 500    /* max number of bytes per pixel line */
120 #define  MAX_SPECIAL_DEFPOINTS 80    /* max number of defpoint specials */
121 
122 
123 #define PK_POST 245
124 #define PK_PRE 247
125 #define PK_ID 89
126 
127 /* to speedup the program a little: redefinition of PixRound and PutWord */
128 /*#define PIXROUND(x,c) ((((double)x+(double)(c>>1))/(double)c)+0.5)*/
129 #define PIXROUND(x,c) (((x)+c)/c)
130 #define PUTWORD(w)  EMITC( ((unsigned char)(w>>8) & 0xff)), EMITC((unsigned char)(w & 0xff))
131 /*************************************************************************/
132 #ifdef RISC_BUFFER
133 # define   EMIT           emsize = sprintf
134 # define   EMFLUSH        b_wrtmult(outfp,embuf,emsize)
135 # define   EMTO           embuf
136 # define   EMIT1(a)       emsize = sprintf(embuf,a), EMFLUSH
137 # define   EMIT2(a,b)     emsize = sprintf(embuf,a,b), EMFLUSH
138 # define   EMIT3(a,b,c)   emsize = sprintf(embuf,a,b,c), EMFLUSH
139 # define   EMIT4(a,b,c,d) emsize = sprintf(embuf,a,b,c,d), EMFLUSH
140 #else
141 # ifdef RISC_USE_OSL
142 #  define  EMIT           emsize = sprintf
143 #  define  EMFLUSH        write_multi(embuf,1,emsize,outfp)
144 #  define  EMTO           embuf
145 #  define  EMIT1(a)       emsize = sprintf(embuf,a), EMFLUSH
146 #  define  EMIT2(a,b)     emsize = sprintf(embuf,a,b), EMFLUSH
147 # define   EMIT3(a,b,c)   emsize = sprintf(embuf,a,b,c), EMFLUSH
148 # define   EMIT4(a,b,c,d) emsize = sprintf(embuf,a,b,c,d), EMFLUSH
149 # else
150 #  define  EMIT           fprintf            /* output a formatted string   */
151 #  define  EMTO           outfp
152 #  define  EMIT1(a)       fprintf(outfp,a)
153 #  define  EMIT2(a,b)     fprintf(outfp,a,b)
154 #  define  EMIT3(a,b,c)   fprintf(outfp,a,b,c)
155 #  define  EMIT4(a,b,c,d) fprintf(outfp,a,b,c,d)
156 # endif
157 #endif
158 #ifndef vms
159 # ifdef RISC_BUFFER
160 #  define  EMITB(len,b)   b_wrtmult(outfp,b,len) /* output binary data of len*/
161 # else
162 #  define  EMITB(len,b)   write_multi(b,1,len,outfp)
163 # endif
164 #else
165     /* VMS doesn't like to use fwrite on a file with fixed record sizes,
166        so use number of putc calls */
167 # define  EMITB(len,b)   for (kk = 0;kk < len; kk++) fputc(*(b+kk),outfp);
168 #endif
169 #define  EMITWORD(w)     PUTWORD((w))        /* output a 2 byte word of data */
170 
171 #define  MoveOver(b)  h += (long4) b
172 #define  MoveDown(a)  v += (long4) a
173 #define  qfprintf if (!G_quiet) fprintf
174 #define  qprintf  if (!G_quiet) printf
175 #define  LARGER(a,b) (((a)>(b)) ? (a) : (b))
176 
177 #ifdef IBM3812
178 #define  PRINTER      "IBM 3812 pageprinter"
179 #define  EMITC(c)      PMPoutC(c)               /* output a single character */
180 #define  PMPcont(l)    PMPout(-1,(char *)l)       /* next l bytes continuous */
181 #define  PMPflush      PMPout(0l,"")                     /* flush PMP-buffer */
182 #define  EMITL(l,d)    PMPout((int)l,d)      /* EMIT-logical: via PMP-buffer */
183 #define  hconvRESOLUTION   240
184 #define  vconvRESOLUTION   240
185 #define  CHAR_WIDTH_LARGE  100       /*  limit for loading into printer font */
186 #define  CHAR_HEIGTH_LARGE 127       /*  limit for loading into printer font */
187 #define  OUTBUFSIZE     20000        /*   size of output buffer for PMP cmds */
188                       /*   has to be less max(signed int)     */
189 #define  MAXFONTSTORAGE      130000l /* font storage in the 3812 pageprinter */
190 #define  EMITFILE_EXTENSION    ".pmp"      /* default extension of emit file */
191 #define  XDEFAULTOFF     ((int)(0.72*RESOLUTION))/* default x and y offset   */
192 #define  YDEFAULTOFF    RESOLUTION
193 #define  CHARSTRINGMAX  80                /* bufferlength for SetString      */
194 #define  MAX_PAGE_WIDTH  2040
195 #define  MAX_PAGE_HEIGHT 3360
196 /**********************************************************************/
197 /**************  Positioning for the 3812  ****************************/
198 /**********************************************************************/
199 #define VERT_HALF(n) ((short)((n+1)>>1)-1)
200 #define HOR_HALF(n)  ((short)(n>>1))
201 #define MoveHor(n)  if ((n)!=0) { PMPcont(3); PMPout(1,"\342"); EMITWORD((n)); }
202 #define MoveVert(n) if ((n)!=0) { PMPcont(3); PMPout(1,"\343"); EMITWORD((n)); }
203 #endif /* IBM 3812 */
204 
205 #ifdef LJ
206 # ifdef LJ4
207 #  ifdef LJ4L
208 #  define  PRINTER       "HP Laserjet 4L"
209 #  else
210 #  define  PRINTER       "HP Laserjet 4"
211 #  endif
212 # else
213 #  ifdef LJ2P
214 #   define  PRINTER       "HP LaserJet IIP"
215 #  else
216 #   ifdef LJ2
217 #    define  PRINTER       "HP LaserJet 2"
218 #   else
219 #    define  PRINTER       "HP LaserJet"
220 #   endif
221 #  endif
222 # endif
223 
224 # ifdef LJ4
225 #  ifdef LJ4L
226 int   RESOLUTION = 300;
227 const char *MFMODE     = MFMODE300;
228 #  else
229 int   RESOLUTION = 600;
230 const char *MFMODE     = MFMODE600;
231 #  endif
232 # else
233 #  define RESOLUTION 300
234 # endif
235 # define  hconvRESOLUTION   RESOLUTION
236 # define  vconvRESOLUTION   RESOLUTION
237 # ifdef LJ2
238 /* the printer limit of the LJ2P is actually 16384x16384,
239   * but to exploit it, one would need lots of memory in the printer
240  */
241 #  define  CHAR_WIDTH_LARGE  200     /* limit for loading into printer font */
242 #  define  CHAR_HEIGTH_LARGE 255         /* y_offset reaches the same size! */
243 # else   /* such as LaserJet+, Laserjet II */
244 #  define  CHAR_WIDTH_LARGE  100     /* limit for loading into printer font */
245 #  define  CHAR_HEIGTH_LARGE 127         /* y_offset reaches the same size! */
246 # endif
247 # define  EMITFILE_EXTENSION  ".lj"       /* default extension of emit file */
248 # ifndef MAX_FONTS_PER_PAGE
249 #  define  MAX_FONTS_PER_PAGE 16        /* maximum number of fonts per page */
250 # endif
251 # define  HANDLE_MAX_FONTS  255      /* max nr of fonts handled (rasterfont) */
252 # define  FONTS_DOWNLOADABLE 32    /* max nr of fonts that can be downloaded */
253 # ifdef SHARP_JX_9500
254 #  define  MAXFONTSTORAGE (200l*1024l)               /* standard user memory */
255 # else
256 #  define  MAXFONTSTORAGE (395l*1024l)               /* standard user memory */
257 # endif
258 # ifdef RISC_BUFFER
259 #  define EMITC(c)       b_write(outfp,c)       /* output a single character */
260 # else
261 #  define EMITC(c)       write_byte(outfp,c)    /* output a single character */
262 # endif
263 # define  EMITL(l,d)     EMITB(l,d)                  /* EMIT-logical = EMITB */
264 
265 # define  XDEFAULTOFF   ((int)(0.72*RESOLUTION))
266 # define  YDEFAULTOFF   RESOLUTION
267 #ifdef NEVER
268 # define  XDEFAULTOFF   RESOLUTION   /*x default offset on page 1in (LJ2)*/
269 # define  YDEFAULTOFF   RESOLUTION    /* y default offset on page 1inch */
270 #endif
271 # ifndef vms
272 #  define  INT_ASCII(b,i) \
273    if (i == 0) b[0] = '\0'; else sprintf((char *)b,"%hd",i)
274 # else
275 #  define  INT_ASCII(b,i) \
276    if (i == 0) b[0] = '\0'; else sprintf((char *)b,"%d",i)
277 # endif
278 #endif
279 
280 
281 #ifndef SEVENBIT
282 #define VisChar(c) (unsigned char)(c)
283 #endif
284 
285 /* Used to be a function. buf is always an array, never a pointer.
286    Without that invariant, we would have to introduce full dynamic
287    memory management in this driver -- probably it would be easier to
288    write a new one. [27 Jun 07 -js] */
289 #define GetBytes(fp,buf,n) \
290     ( sizeof(buf) != sizeof(void *) && sizeof(buf) > n ? \
291         (void)read_multi(buf, 1, n, fp)					\
292       : Fatal("Try to read %d bytes in an array of size %d", n, sizeof(buf)) )
293 
294 
295 /**********************************************************************/
296 /***********************  external definitions  ***********************/
297 /**********************************************************************/
298 
299 #ifndef WIN32
300 #ifndef _AMIGA
301 # ifndef unix
302 long    access(char *, int);      /* all the other ones known under RISC OS */
303 #  ifndef __riscos
304 FILEPTR BOPENCMD();
305 void    exit();
306 int     fclose();
307 int     fprintf();
308 int     fseek();
309 /*char   *index();*/
310 int     printf();
311 int     sscanf();
312 int     strcmp();
313 char   *strcpy();
314 char   *strncpy();
315 #   ifdef MSC5
316 unsigned int strlen();
317 #   endif
318 void    free();
319 void    setbuf();
320 #  endif
321 
322 #  ifdef MSC5
323 int     intdos();
324 #  endif
325 # endif
326 #endif
327 #else /* WIN32 */
328 #include <string.h>
329 #include <stdio.h>
330 #include <stdlib.h>
331 #endif
332 
333 #ifndef USEPXL
334 /* interface to gf.c */
335 extern FILEPTR gfin;
336 extern int checksum;
337 extern long4 tfm_wd[], char_pointer[];
338 extern char char_exists[];
339 extern int num_cols, num_rows, num_bytes, x_offset, y_offset;
340 extern unsigned char bits[];
341 extern int gf_font_max_m, gf_font_max_n, gf_font_min_n;
342 extern int gettochar();
343 extern void readbits();
344 extern void readpost();
345 extern void seekpost();
346 extern int seekchar();
347 #endif
348 
349 /**********************************************************************/
350 /********************** Special Data Structures ***********************/
351 /**********************************************************************/
352 
353 typedef enum { None, String, Integer /*, Number, Dimension*/ } ValTyp;
354 typedef struct {
355   char    *Key;       /* the keyword string */
356   char    *Val;       /* the value string */
357   ValTyp  vt;         /* the value type */
358   union {         /* the decoded value */
359     int     i;
360     float   n;
361   } v;
362 } KeyWord;
363 typedef struct {
364   int     KeyId;     /* the keyword ID */
365   const char    *Entry;
366   ValTyp  Typ;
367 } KeyDesc;
368 
369 /**********************************************************************/
370 /***********************  Font Data Structures  ***********************/
371 /**********************************************************************/
372 
373 struct char_entry {             /* character entry */
374 #ifdef USEPXL
375     unsigned short  width, height;      /* width and height in pixels */
376     short   xOffset, yOffset, yyOffset; /* x offset and y offset in pixels*/
377 #endif
378     struct {
379         bool isloaded;
380         union {
381             long4    fileOffset;
382             long4    *pixptr;
383         } address;
384     } where;
385     long4    tfmw;             /* TFM width                 */
386     long4    cw;               /* character width in pixels */
387     unsigned char   flag_byte;          /* for PK-files    */
388     unsigned char   charsize;
389 };
390 struct font_entry {    /* font entry */
391     long4    k, c, s, d;
392     int     a, l;
393     char n[STRSIZE];          /* FNT_DEF command parameters                */
394     long4    font_mag;         /* computed from FNT_DEF s and d parameters  */
395     /*char psname[STRSIZE];*/ /* PostScript name of the font               */
396     char    *name;	       /* full name of PXL file                     */
397     FILEPTR font_file_id;      /* file identifier (NO_FILE if none)         */
398 #ifdef USEPXL
399     long4    magnification;    /* magnification read from PXL file          */
400     long4    designsize;       /* design size read from PXL file            */
401 #endif
402     struct char_entry ch[NFNTCHARS];   /* character information            */
403     struct font_entry *next;
404     unsigned short ncdl;      /* #of different chars actually downloaded   */
405     unsigned short plusid;    /* Font id in Printer                        */
406     bool used_on_this_page;
407 #ifdef LJ_RESIDENT_FONTS
408     bool resident_p;          /* is font resident in printer?              */
409     char symbol_set[40];      /* symbol set value (resident fonts)         */
410     unsigned short resid;     /* typeface id (resident fonts)              */
411     unsigned spacing;         /* 0=monospace, 1=variable (resident fonts)  */
412     unsigned style;           /* upright/italic/... (resident fonts)       */
413     int weight;               /* regular/bold/... (resident fonts)         */
414     double pitch;             /* chars per inch (monospaced resident fonts)*/
415 #endif
416     enum PxlId {
417         id1001, id1002, pk89    } id;
418 #ifdef LJ
419     unsigned short max_width, max_height, max_yoff;
420 #endif
421 };
422 
423 
424 struct pixel_list {
425     FILEPTR pixel_file_id;    /* file identifier  */
426     int     use_count;        /* count of "opens" */
427 };
428 
429 #ifdef __riscos
430 typedef struct {
431   int scalex;
432   int scaley;
433   int cropl;
434   int cropb;
435   int cropr;
436   int cropt;
437 } diagtrafo;                  /* to be passed to diagrams */
438 #endif
439 
440 
441 /**********************************************************************/
442 /*************************  Global Procedures  ************************/
443 /**********************************************************************/
444 /* Note: Global procedures are declared here in alphabetical order, with
445    those which do not return values typed "void".  Their bodies occur in
446    alphabetical order following the main() procedure.  The names are
447    kept unique in the first 6 characters for portability. */
448 
449 double  ActualFactor(long4);
450 void    AllDone(bool);
451 #ifdef  MSC5
452 void    AssureBinary(FILEPTR);  /* DOS and Microsoft C dependent !!! */
453 #endif
454 void    CloseFiles(void);
455 void    my_CopyFile(const char *);
456 void    CopyHPFile(char *);
457 void    DecodeArgs(int, char *[]);
458 #ifdef __riscos
459 void    diagram(char *, diagtrafo *);
460 void   *xosfile_set_type(char *, int);
461 void    MakeMetafontFile(char *, char *, int);
462 #endif
463 void    DoBop(void);
464 long4   DoConv(long4, long4, int);
465 void    DoSpecial(char *, int);
466 void    EmitChar(long4, struct char_entry *);
467 void    FindPostAmblePtr(long *);
468 void    FormFeed(void);
469 void    GetFontDef(void);
470 char    *GetKeyStr(char *, KeyWord *);
471 bool    GetKeyVal(KeyWord *, KeyDesc[], int, int *);
472 bool    IsSame(const char *, const char *);
473 void    LoadAChar(long4, register struct char_entry *);
474 void    OpenFontFile(void);
475 long4   PixRound(long4, long4);
476 void    PkRaster(struct char_entry *, int);
477 void    RasterLine(struct char_entry *, unsigned int,
478                    unsigned int, unsigned char *);
479 void    RasterChar(struct char_entry *);
480 void    ReadFontDef(long4);
481 void    ReadPostAmble(bool);
482 void    SetChar(long4, short, int, bool, bool);
483 void    SetFntNum(long4, bool);
484 void    SetPosn(long4, long4);
485 void    SetRule(long4, long4, int);
486 void    SetString(short, int);
487 long4   SignExtend(FILEPTR, int);
488 void    SkipFontDef(void);
489 unsigned char   skip_specials(long4 *);
490 #ifdef LJ4
491 int     CompressLine2(unsigned char *, unsigned char *, int);
492 int     CompressLine3(unsigned char *, unsigned char *, int);
493 void    CompressedCharLine(struct char_entry *,int,unsigned char *);
494 #endif
495 #ifdef IBM3812
496 void    PMPout(int, char *);
497 void    PMPoutC(char);
498 #endif
499 
500 /* buffer IO */
501 char   b_read(FILEPTR);
502 #ifdef RISC_BUFFER
503 void   b_write(FILEPTR, char);
504 void   b_wrtmult(FILEPTR, char *, int);
505 void   b_oflush(FILEPTR);
506 #endif
507 
508 
509 /**********************************************************************/
510 /*************************  Global Variables  *************************/
511 /**********************************************************************/
512 bool    ManualFeed = _FALSE;
513 long4    FirstPage  = -1000000;  /* first page to print (uses count0)   */
514 long4    LastPage   = 1000000;   /* last page to print                  */
515 long4    PrintPages = 1000000;   /* nr of pages to print                */
516 bool    FirstPageSpecified = _FALSE;
517 bool    LastPageSpecified = _FALSE;
518 #ifndef KPATHSEA
519 char   *PXLpath = FONTAREA;
520 #endif
521 char   *G_progname;		 /* program name                        */
522 char   *filename;	         /* DVI file name                       */
523 char   *rootname;		 /* DVI filename without extension      */
524 const char   *HeaderFileName = "";     /* file name & path of Headerfile      */
525 const char   *EmitFileName = "";       /* file name & path for output         */
526 char    tmp_dir[STRSIZE] = "";	 /* temporary directory for auxiliary files */
527 enum   { Ignore, PSFile_dvilj /*, PSFile_dvips */ } PSFileSyntaxTyp = PSFile_dvilj;
528 #ifdef IBM3812
529 bool    FirstAlternate = _FALSE; /* first page from alternate casette ?   */
530 #endif
531 bool    Reverse = _FALSE;        /* process DVI pages in reverse order?   */
532 bool    Landscape = _FALSE;      /* print document in ladscape mode       */
533 bool    my_ResetPrinter = _TRUE; /* reset printer at the begin of the job */
534 bool    DoublePage = _FALSE;     /* print on both sides of a paper        */
535 bool    PrintSecondPart = _TRUE; /* print First Part when DoublePage      */
536 bool    PrintFirstPart  = _TRUE; /* print Second Part when DoublePage     */
537 bool    PrintEmptyPages = _TRUE; /* print Empty pages in DoublePage mode  */
538 short   PageParity = 1;
539 #ifdef MAKETEXPK
540 #ifdef KPATHSEA
541 bool    makeTexPK = MAKE_TEX_PK_BY_DEFAULT;
542 #else
543 bool    makeTexPK = _TRUE;
544 #endif
545 #endif
546 
547 #ifdef LJ
548 bool    kyocera_mode = _FALSE;  /* bug fixes for Kyocera F-1200 LJ-Emulation */
549 bool    brother_mode = _FALSE;  /* bug fixes for Brother HL-8D LJ-Emulation */
550 #ifdef LJ2P
551 int     DuplexMode = 0;
552 #endif
553 #ifdef LJ4
554 bool    econoMode = _FALSE;
555 bool    LJ6 = _FALSE;
556 #endif
557 bool    PrintTestPage = _FALSE; /* print testpage with pagecounter after job */
558 unsigned short pagesize = 0;    /* page size value                      */
559 unsigned short pgsiz_dots = 0;  /* page size in dots (for rule-clipping)*/
560 #endif
561 
562 
563 #ifndef vms
564 short   G_errenc = 0;           /* has an error been encountered?      */
565 #else
566 long4    G_errenc = SS$_NORMAL;  /* has an error been encountered?      */
567 #endif
568 bool    G_header = _FALSE;      /* copy header file to output?         */
569 bool    G_quiet = _FALSE;       /* for quiet operation                 */
570 bool    G_verbose = _FALSE;     /* inform user about pxl-files used    */
571 bool    G_nowarn = _FALSE;      /* don't print out warnings            */
572 short   x_origin;               /* x-origin in dots                    */
573 short   y_origin;               /* y-origin in dots                    */
574 short   x_goffset;              /* global x-offset in dots             */
575 short   y_goffset;              /* global y-offset in dots             */
576 unsigned short ncopies = 1;     /* number of copies to print           */
577 long4    hconv, vconv;           /* converts DVI units to pixels        */
578 long4    h;                      /* current horizontal position         */
579 long4    hh = 0;                 /* current h on device                 */
580 long4    v;                      /* current vertical position           */
581 long4    vv = 0;                 /* current v on device                 */
582 long4    mag;                    /* magnification specified in preamble */
583 long     usermag = 0;            /* user specified magnification        */
584 int      ndone = 0;              /* number of pages converted           */
585 int      nopen = 0;              /* number of open PXL files            */
586 #ifdef vms
587 int	kk;			 /* loop variable for EMITB	       */
588 #endif
589 FILEPTR outfp = FPNULL;          /* output file                         */
590 FILEPTR pxlfp;                   /* PXL file pointer                    */
591 FILEPTR dvifp  = FPNULL;         /* DVI file pointer                    */
592 struct font_entry *prevfont = NULL; /* font_entry pointer previous font*/
593 struct font_entry *fontptr;      /* font_entry pointer                  */
594 struct font_entry *hfontptr = NULL; /* font_entry pointer              */
595 struct font_entry *pfontptr = NULL; /* previous font_entry pointer     */
596 struct pixel_list pixel_files[MAXOPEN+1]; /* list of open PXL files    */
597 long   postambleptr;            /* Pointer to the postamble            */
598 long   ppagep;                  /* previous page pointer               */
599 static int      last_ry = UNKNOWN;      /* last y-position on page     */
600 static int      last_rx = UNKNOWN;      /* last x-position on page     */
601 long4  StartPrintPages;         /* notpad for double paged output      */
602 int    WouldPrint    = 0;
603 bool   ZeroPage = _FALSE;       /* Document starts with a Zero Page    */
604 bool   EvenPage = _FALSE;       /* Document starts with an even Page   */
605 long4  LastPtobePrinted = 0;
606 int    G_ncdl = 0;
607 
608 long     allocated_storage = 0; /* size of mallocated storage (statistics) */
609 long4    power[32] ;
610 long4    gpower[33] ;
611 
612 unsigned char buffin[BUFFSIZE]; /* Input buffer; always used for Copy[HP]File */
613 int binumber=0;            /* number of valid bytes in input buffer */
614 int biact=0;               /* number of next byte to read from input buffer */
615 #ifdef RISC_BUFFER
616 char buffout[BUFFSIZE];    /* Output buffer; used if RISC_BUFFER defined */
617 int boact=0;               /* number of next byte to write to output buffer */
618 #endif
619 
620 #ifdef LJ4
621 # define DEFAULT_COMPRESS_MODE  3
622 # define DEFAULT_COMPRESS_WIDTH 0
623 # define COMPRESS_WIDTH0        0
624 # define COMPRESS_WIDTH2        72
625 # define COMPRESS_WIDTH3        0
626 /* Raster chars compression */
627 int CompressCharWidth = -1;  /* Value to be determined dependent at runtime */
628 int CompressCharMode;        /* Used only from within RasterChar/Line */
629 int UseCompression = DEFAULT_COMPRESS_MODE; /* This performs very well with Characters */
630 /* Shared by both compression types */
631 unsigned char *PrevLine = NULL; /* Holds last raster line; set at runtime */
632 int PrevSize = 0;               /* Size of PrevLine */
633 /* Downloaded chars compression */
634 int CChar_Off, CChar_Last;      /* For compressed character downloading */
635 bool CompressFontMode = _TRUE;  /* Download characters compressed */
636 #endif /* LJ4 */
637 
638 #ifdef RISC_USE_OSL
639 char   embuf[STRSIZE];         /* Buffer for emitting stuff */
640 int    emsize;                 /* Number of bytes written in buffer */
641 #else
642 # ifdef RISC_BUFFER
643 char   embuf[STRSIZE];
644 int    emsize;
645 # endif
646 #endif
647 
648 #ifdef __riscos
649 #define DIAGDIRSIZE 32
650 char diagdir[DIAGDIRSIZE] = "LJdiag"; /* Prefix name of directory for
651 					 cached printouts */
652 bool cachediag = _FALSE;       /* cache PDriver's output in document folder */
653 bool printdiag = _TRUE;        /* printf diagrams */
654 FILEPTR metafile = FPNULL;     /* Filepointer of file containing
655 				  metafont directives*/
656 
657 char MFFileName[STRSIZE];
658 int RasterMultipass = 0;
659 #endif
660 
661 #ifdef DEBUG
662 int Debug = 0;
663 #define DEBUG_START() do { if (Debug) {
664 #define DEBUG_END()        fflush (stdout); } } while (0)
665 #define DEBUG_PRINT(str)						\
666   DEBUG_START (); fputs (str, stdout); DEBUG_END ()
667 #define DEBUG_PRINT1(str, e1)						\
668   DEBUG_START (); printf (str, e1); DEBUG_END ()
669 #else
670 #define DEBUG_PRINT(str)
671 #define DEBUG_PRINT1(str, e1)
672 #endif
673 
674 #ifdef LJ
675 int   fonts_used_on_this_page = MAX_FONTS_PER_PAGE+1;
676 char  rasterfont[HANDLE_MAX_FONTS];
677     /* raster if fonts/page>MAX_FONTS_PER_PAGE*/
678 #ifdef LJ_RESIDENT_FONTS
679 unsigned resident_count = 0;
680 #ifndef KPATHSEA
681 char *TFMpath = DEFAULT_TFM_PATH;
682 #endif
683 #endif
684 #endif
685 
686 long     used_fontstorage = 0;
687 
688 #ifdef IBM3812
689 char    PMPformat[20];
690 char    CharString[CHARSTRINGMAX];
691 unsigned int CharStringPos = 0;
692 #define CharStringOut \
693     if (CharStringPos>0) { \
694         PMPcont(CharStringPos+1);\
695         PMPoutC((unsigned char)CharStringPos);\
696         PMPout(CharStringPos, CharString); \
697         CharStringPos=0; }
698 #endif
699 
700 
701 /************************timing stuff*********************/
702 #ifdef TIMING
703 # ifdef BSD_TIME_CALLS
704 #  ifndef vms
705 #   include <sys/timeb.h>
706 #  else
707 #   include <timeb.h>
708 #  endif
709 struct timeb timebuffer;
710 double  start_time;
711 # else
712 #  ifdef __riscos
713 #   include <sys/times.h>
714 #  else
715 #   include <sys/time.h>
716 struct timeval Tp;
717 double  start_time;
718 #  endif
719 # endif
720 #endif /* TIMING */
721 
722 
723 #endif /* DVI2XX_H */
724