summaryrefslogtreecommitdiff
path: root/dviware/kane/dvifile_p.h
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/kane/dvifile_p.h
Initial commit
Diffstat (limited to 'dviware/kane/dvifile_p.h')
-rw-r--r--dviware/kane/dvifile_p.h313
1 files changed, 313 insertions, 0 deletions
diff --git a/dviware/kane/dvifile_p.h b/dviware/kane/dvifile_p.h
new file mode 100644
index 0000000000..4070054b83
--- /dev/null
+++ b/dviware/kane/dvifile_p.h
@@ -0,0 +1,313 @@
+
+Date: 20-MAR-1989 17:20:04 GMT
+From: PHYOKANE@CS8700.UCG.IE
+To: abbottp@ASTON.AC.UK
+Subject: file dvifile_p.h
+sender: hea"phyokane@cs8700.ucg.ie" <phyokane@cs8700.ucg.ie>
+
+/* -*-C-*- dvifile.h */
+/*-->dvifile*/
+/**********************************************************************/
+/****************************** dvifile *******************************/
+/**********************************************************************/
+
+void
+dvifile(argc,argv,filestr)
+int argc; /* argument count */
+char* argv[]; /* argument strings */
+char* filestr; /* DVI filename to process */
+
+{
+
+#define PAGENUMBER(p) ((p) < 0 ? (page_count + 1 + (p)) : (p))
+
+ register INT16 i,j,m; /* loop indices */
+ register INT16 swap; /* swap storage */
+ register struct font_entry *p;
+
+ INT16 m_begin,m_end,m_step; /* loop limits and increment */
+ INT16 list[3]; /* index list for sort */
+ char tempstr[MAXSTR]; /* temporary string storage */
+ int the_char;
+ int s;
+ int slot;
+ int n_slots;
+ int fontsize;
+ int pfont_size;
+ int pfont_n;
+ struct font_entry *bigfont;
+ struct printer_font *pptr;
+ /*
+ Establish the default font file search order. This is done here
+ instead of in initglob() or option(), because both could set
+ fontlist[].
+
+ By default, the search list contains names for the PK, GF, and PXL
+ font files; that order corresponds to increasing size (and
+ therefore, presumably, increasing processing cost) of font raster
+ information. This search order may be overridden at run time by
+ defining an alternate one in the environment variable FONTLIST; the
+ order of the strings "PK", "GF", and "PXL" in that variable
+ determines the search order, and letter case is NOT significant.
+ The substrings may be separated by zero or more arbitrary
+ characters, so the values "PK-GF-PXL", "PK GF PXL", "PKGFPXL",
+ "PK;GF;PXL", "PK/GF/PXL" are all acceptable, and all choose the
+ default search order. This flexibility in separator character
+ choice is occasioned by the requirement on some systems that the
+ environment variable have the syntax of a file name, or be a single
+ "word". If any substring is omitted, then that font will be
+ excluded from consideration. Thus, "GF" permits the use only of GF
+ font files.
+
+ The indexes gf_index, pk_index, and pxl_index are in -1 .. 2, and at
+ least one must be non-negative. A negative index excludes that font
+ file type from the search.
+ */
+
+ /* Note that non-negative entries in list[] are UNIQUE. */
+ list[0] = gf_index = (INT16)strid2(fontlist,"GF");
+ list[1] = pk_index = (INT16)strid2(fontlist,"PK");
+ list[2] = pxl_index = (INT16)strid2(fontlist,"PXL");
+
+ for (i = 0; i < 3; ++i) /* put list in non-decreasing order */
+ for (j = i+1; j < 3; ++j)
+ if (list[i] > list[j])
+ {
+ swap = list[i];
+ list[i] = list[j];
+ list[j] = swap;
+ }
+ for (i = 0; i < 3; ++i) /* assign indexes 0,1,2 */
+ if (list[i] >= 0)
+ {
+ if (list[i] == gf_index)
+ gf_index = i;
+ else if (list[i] == pk_index)
+ pk_index = i;
+ else if (list[i] == pxl_index)
+ pxl_index = i;
+ }
+
+ if ((gf_index < 0) && (pk_index < 0) && (pxl_index < 0))
+ (void)fatal("dvifile(): FONTLIST does not define at least one of \
+GF, PK, or PXL fonts");
+
+ (void)dviinit(filestr); /* initialize DVI file processing */
+
+ (void)devinit(argc,argv); /* initialize device output */
+
+ (void)readpost();
+ (void)FSEEK(dvifp, 14L, 0); /* position past preamble */
+ (void)getbytes(dvifp, tempstr,
+ (BYTE)nosignex(dvifp,(BYTE)1)); /* flush DVI comment */
+
+ cur_page_number = 0;
+
+
+#if (HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2)
+ /* print pages in reverse order because of laser printer */
+ /* page stacking */
+ if (backwards)
+ {
+ m_begin = 1;
+ m_end = page_count;
+ m_step = 1;
+ }
+ else /* normal device order */
+ {
+ m_begin = page_count;
+ m_end = 1;
+ m_step = -1;
+ }
+
+#else
+ /* NOT (HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2) */
+ /* print pages in forward order for most devices */
+ if (backwards)
+ {
+ m_begin = page_count;
+ m_end = 1;
+ m_step = -1;
+ }
+ else
+ {
+ m_begin = 1;
+ m_end = page_count;
+ m_step = 1;
+ }
+#endif /* (HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2) */
+
+ for (i = 0; i < npage; ++i) /* make page numbers positive */
+ { /* and order pairs non-decreasing */
+ page_begin[i] = PAGENUMBER(page_begin[i]);
+ page_end[i] = PAGENUMBER(page_end[i]);
+ if (page_begin[i] > page_end[i])
+ {
+ swap = page_begin[i];
+ page_begin[i] = page_end[i];
+ page_end[i] = swap;
+ }
+ }
+/* First pass over pages and setup font download information */
+
+ for (m = m_begin; ; m += m_step)
+ {
+ for (i = 0; i < npage; ++i) /* search page list */
+ if ( IN(page_begin[i],m,page_end[i]) &&
+ (((m - page_begin[i]) % page_step[i]) == 0) )
+ {
+ if (!quiet) /* start progress report */
+ (void)fprintf(stderr,"[%d", m);
+ cur_page_number++;/* sequential page number 1..N */
+ cur_index = m-1; /* remember index globally */
+ checkpage(page_ptr[cur_index]);
+ if (!quiet) /* finish progress report */
+ (void)fprintf(stderr,"] ");
+ break;
+ }
+ if (m == m_end) /* exit loop after last page */
+ break;
+ }
+if (!quiet) /* finish progress report */
+ (void)fprintf(stderr,"\n");
+
+/* Initialize the printer fonts */
+for (pf = FIRSTPRINTERFONT; pf <= LASTPRINTERFONT; pf++)
+{
+ printer_fonts[pf].slots_free = 190;
+ for (s = 0; s < 190; s++)
+ {
+ printer_fonts[pf].char_slots[s].tex_char = -1;
+ printer_fonts[pf].char_slots[s].tex_font = NULL;
+ }
+}
+/* Pack the TeX fonts into printer fonts
+
+ WHILE there are unassigned TeX fonts
+ select the largest TeX font
+ if possible assign all of the TeX font
+ to the FIRST SMALLEST SPACE free in the printer fonts
+ else
+ find the FIRST LARGEST SPACE free and assign as much
+ of the TeX font as will fit
+*/
+do {
+ /* First....find the largest TeX font left....*/
+ fontsize = 0;
+ bigfont = NULL;
+ fontptr = hfontptr;
+ while ((fontptr != (struct font_entry *)NULL))
+ {
+ if ((fontptr->used_chars - fontptr->assigned_chars) > fontsize)
+ {
+ fontsize = fontptr->used_chars - fontptr->assigned_chars;
+ bigfont = fontptr;
+ }
+ fontptr = fontptr->next;
+ }
+ if (bigfont == NULL) break; /* All TeX fonts assigned */
+ fontptr = bigfont;
+ fontsize = (fontsize > 190) ? 190 : fontsize;
+
+ /* Next... find a printer font to put it in.... */
+ pfont_size = 1000;
+ for (pf = FIRSTPRINTERFONT; pf <= LASTPRINTERFONT; pf++)
+ {
+ if ((printer_fonts[pf].slots_free >= fontsize) &&
+ (printer_fonts[pf].slots_free < pfont_size))
+ {
+ pfont_size = printer_fonts[pf].slots_free;
+ pfont_n = pf;
+ }
+ }
+ /* ...if there is no big slot then split this font... */
+ /* putting the first bit into the bigest free slot */
+ if (pfont_size > 190)
+ {
+ pfont_size = 0;
+ for (pf = FIRSTPRINTERFONT; pf <= LASTPRINTERFONT; pf++)
+ {
+ if (printer_fonts[pf].slots_free > pfont_size)
+ {
+ pfont_size = printer_fonts[pf].slots_free;
+ pfont_n = pf;
+ }
+ }
+ }
+ if (pfont_size == 0)
+ (void)fatal( "dvifile(): Need more printer fonts");
+ pf = pfont_n;
+/* Printer font number pf has pfont_size slots available to take characters
+ from TeX font fontptr */
+ (void)fprintf(stderr,
+"[Assigning %d characters from %s (mag = %g) to printer font %d]\n",
+ (fontsize <= pfont_size) ? fontsize : pfont_size,
+ fontptr->n,(fontptr->font_mag)/1500.0,pf);
+ for (the_char = FIRSTPXLCHAR; the_char <= LASTPXLCHAR; the_char++)
+ {
+ if (printer_fonts[pf].slots_free == 0)
+ break;
+ if (fontptr->ch[the_char].isloaded == FALSE) /* Not used */
+ continue;
+ if (fontptr->ch[the_char].lj_font != 65535)/* Already assigned */
+ continue;
+ slot = 190 - printer_fonts[pf].slots_free--;
+ printer_fonts[pf].char_slots[slot].tex_char = the_char;
+ printer_fonts[pf].char_slots[slot].tex_font = fontptr;
+ fontptr->ch[the_char].lj_char = slot;
+ fontptr->ch[the_char].lj_font = pf;
+ fontptr->assigned_chars++;
+ }
+ if ( printer_fonts[pf].slots_free == pfont_size ) /* Nothing happened !!!*/
+ fontptr->assigned_chars = fontptr->used_chars;/* Zero size font ?? */
+} while (TRUE);
+/* .... and finally download the fonts to the printer.... */
+for (pf = FIRSTPRINTERFONT; pf <= LASTPRINTERFONT; pf++)
+{
+ pptr = &printer_fonts[pf];
+ if (pptr->slots_free == 190) continue;
+ slot = 0;
+ n_slots = 190 - pptr->slots_free;
+ (void)fprintf(stderr,"[Loading printer font %d with %d characters]\n",
+ pf,n_slots);
+ (void)makefont(pptr,n_slots);
+ do {
+ fontptr = pptr->char_slots[slot].tex_font;
+ while ( (slot < n_slots) &&
+ (pptr->char_slots[slot].tex_font == fontptr) )
+ {
+ loadchar(pptr->char_slots[slot].tex_char,MAP_CHAR(slot));
+ ++slot;
+ }
+ } while ( slot < n_slots );
+}
+
+#if (HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2)
+ pf = -1;
+#endif
+
+
+/* Finally pass over pages and print them */
+ for (m = m_begin; ; m += m_step)
+ {
+ for (i = 0; i < npage; ++i) /* search page list */
+ if ( IN(page_begin[i],m,page_end[i]) &&
+ (((m - page_begin[i]) % page_step[i]) == 0) )
+ {
+ if (!quiet) /* start progress report */
+ (void)fprintf(stderr,"[%d", m);
+ cur_page_number++;/* sequential page number 1..N */
+ cur_index = m-1; /* remember index globally */
+ prtpage(page_ptr[cur_index]);
+ if (!quiet) /* finish progress report */
+ (void)fprintf(stderr,"] ");
+ break;
+ }
+ if (m == m_end) /* exit loop after last page */
+ break;
+ }
+
+ (void)devterm(); /* terminate device output */
+
+ (void)dviterm(); /* terminate DVI file processing */
+}