summaryrefslogtreecommitdiff
path: root/dviware/beebe/src/readgf.h
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/beebe/src/readgf.h')
-rw-r--r--dviware/beebe/src/readgf.h178
1 files changed, 178 insertions, 0 deletions
diff --git a/dviware/beebe/src/readgf.h b/dviware/beebe/src/readgf.h
new file mode 100644
index 0000000000..5df2586034
--- /dev/null
+++ b/dviware/beebe/src/readgf.h
@@ -0,0 +1,178 @@
+/* -*-C-*- readgf.h */
+/*-->readgf*/
+/**********************************************************************/
+/******************************* readgf *******************************/
+/**********************************************************************/
+
+int
+readgf() /* return 0 on success, EOF on failure */
+{
+ UNSIGN32 checksum;
+ register struct char_entry *tcharptr;/* temporary char_entry pointer */
+ register BYTE the_byte;
+ register UNSIGN16 the_char; /* loop index */
+
+ /*
+ Read a GF file postamble, extracting character metrics and raster
+ locations. The character xoffp, yoffp, wp, and hp values will not
+ be filled in until a character raster description is actually called
+ for.
+ */
+
+ /******************************************************************/
+
+ /* Process the post-postamble */
+
+#if OS_VAXVMS
+ /* VMS binary files are stored with NUL padding to the next 512 byte
+ multiple. We therefore search backwards to the last non-NULL byte
+ to the find real end-of-file, then move back 4 bytes from that. */
+ FSEEK(fontfp,0L,2); /* seek to end-of-file */
+ while (FSEEK(fontfp,-1L,1) == 0)
+ {
+ the_char = (UNSIGN16)fgetc(fontfp);
+ if (the_char)
+ break; /* exit leaving pointer PAST last non-NUL */
+ UNGETC((char)the_char,fontfp);
+ }
+ if (FSEEK(fontfp,-4L,1)) /* start 4 bytes before last non-NUL */
+#else
+ if (FSEEK(fontfp,-4L,2)) /* start 4 bytes from end-of-file */
+#endif
+ {
+ (void)warning("readgf(): FSEEK() failed--GF font file may be empty");
+ return(EOF);
+ }
+
+ while ((the_byte = (BYTE)nosignex(fontfp,(BYTE)1)) == GFEOF)
+ {
+ if (FSEEK(fontfp,-2L,1))/* backup 2 bytes to read previous one */
+ {
+ (void)warning(
+ "readgf(): FSEEK() failed to find GF font file EOF trailer bytes");
+ return(EOF);
+ }
+ }
+
+ if (the_byte != (BYTE)GFID)
+ {
+ (void)warning("readgf(): GF font file ID byte not found");
+ return(EOF);
+ }
+
+ if (FSEEK(fontfp,-6L,1)) /* backup to read post_post */
+ {
+ (void)warning(
+ "readgf(): FSEEK() failed to find GF font file POSTPOST byte");
+ return(EOF);
+ }
+
+ if ((BYTE)nosignex(fontfp,(BYTE)1) != (BYTE)GFPOSTPOST)
+ {
+ (void)warning("readgf(): GF font file POSTPOST byte not found");
+ return(EOF);
+ }
+
+ if (FSEEK(fontfp,(long)nosignex(fontfp,(BYTE)4),0))
+ { /* position to start of postamble */
+ (void)warning(
+ "readgf(): FSEEK() failed to find postamble in GF font file");
+ return(EOF);
+ }
+
+ /******************************************************************/
+
+ /* Process the postamble */
+
+ if ((BYTE)nosignex(fontfp,(BYTE)1) != (BYTE)GFPOST)
+ {
+ (void)warning("readgf(): GF font file POST byte not found");
+ return(EOF);
+ }
+
+ (void)nosignex(fontfp,(BYTE)4); /* discard special pointer p[4] */
+
+ fontptr->designsize = nosignex(fontfp,(BYTE)4);
+
+ checksum = nosignex(fontfp,(BYTE)4);
+ if ((fontptr->c != 0L) && (checksum != 0L) && (fontptr->c != checksum))
+ {
+ (void)sprintf(message,
+ "readgf(): font [%s] has checksum = 10#%010lu [16#%08lx] [8#%011lo] \
+different from DVI checksum = 10#%010lu [16#%08lx] [8#%011lo]. \
+TeX preloaded .fmt file is probably out-of-date with respect to new fonts.",
+ fontptr->name, fontptr->c, fontptr->c, fontptr->c,
+ checksum, checksum, checksum);
+ (void)warning(message);
+ }
+
+ fontptr->hppp = (UNSIGN32)nosignex(fontfp,(BYTE)4);
+ fontptr->vppp = (UNSIGN32)nosignex(fontfp,(BYTE)4);
+ fontptr->min_m = (INT32)signex(fontfp,(BYTE)4);
+ fontptr->max_m = (INT32)signex(fontfp,(BYTE)4);
+ fontptr->min_n = (INT32)signex(fontfp,(BYTE)4);
+ fontptr->max_n = (INT32)signex(fontfp,(BYTE)4);
+
+ fontptr->magnification = (UNSIGN32)( 0.5 + 5.0 * 72.27 *
+ (float)(fontptr->hppp) / 65536.0 ); /* from GFtoPXL Section 53 */
+
+ /******************************************************************/
+
+ /* Process the character locators */
+
+ the_byte = (BYTE)GFNOOP;
+ while (the_byte == (BYTE)GFNOOP)
+ {
+ switch(the_byte = (BYTE)nosignex(fontfp,(BYTE)1))
+ {
+ case GFCHLOC:
+ case GFCHLOC0:
+ the_char = (UNSIGN16)nosignex(fontfp,(BYTE)1);
+ /* character number MOD 256 */
+ if (the_char >= NPXLCHARS)
+ {
+ (void)warning(
+ "readgf(): GF font file character number is too big for me");
+ return(EOF);
+ }
+ tcharptr = &(fontptr->ch[the_char]);
+ if (the_byte == (BYTE)GFCHLOC) /* long form */
+ {
+ tcharptr->dx = (INT32)signex(fontfp,(BYTE)4);
+ tcharptr->dy = (INT32)signex(fontfp,(BYTE)4);
+ }
+ else /* short form */
+ {
+ tcharptr->dx = (INT32)(((UNSIGN32)nosignex(fontfp,(BYTE)1)) <<
+ 16);
+ tcharptr->dy = 0L;
+ }
+ tcharptr->tfmw = (UNSIGN32)(((float)nosignex(fontfp,(BYTE)4) *
+ (float)fontptr->s) / (float)(1L << 20));
+ tcharptr->pxlw = (UNSIGN16)PIXROUND(tcharptr->dx, 1.0/65536.0);
+ tcharptr->fontrp = (long)signex(fontfp,(BYTE)4);
+
+ the_byte = (BYTE)GFNOOP; /* to force loop continuation */
+ break;
+
+ case GFNOOP:
+ break;
+
+ default: /* this causes loop exit */
+ break;
+ } /* end switch */
+ } /* end while */
+
+ for (the_char = FIRSTPXLCHAR; the_char <= LASTPXLCHAR; the_char++)
+ { /* Get remaining character metrics, and ignore error returns for now. */
+ tcharptr = &(fontptr->ch[the_char]);
+ if (tcharptr->fontrp >= 0L)
+ (void)chargf((BYTE)the_char,(void(*)())NULL);
+ }
+
+#if (BBNBITGRAPH | HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2)
+ (void)newfont();
+#endif
+
+ return(0);
+}