home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
APPS
/
DVI_MGR
/
dvimgr_s.lzh
/
dvimgr
/
readgf.h
< prev
next >
Wrap
Text File
|
1993-08-06
|
5KB
|
179 lines
/* -*-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);
}