summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipsk/fontdef.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/dvipsk/fontdef.c
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipsk/fontdef.c')
-rw-r--r--Build/source/texk/dvipsk/fontdef.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/Build/source/texk/dvipsk/fontdef.c b/Build/source/texk/dvipsk/fontdef.c
new file mode 100644
index 00000000000..606fedb6958
--- /dev/null
+++ b/Build/source/texk/dvipsk/fontdef.c
@@ -0,0 +1,197 @@
+/*
+ * Stores the data from a font definition into the global data structures.
+ * A routine skipnop is also included to handle nops and font definitions
+ * between pages.
+ */
+#include "dvips.h" /* The copyright notice in that file is included too! */
+#ifdef KPATHSEA
+#include <kpathsea/magstep.h>
+#endif
+
+/*
+ * These are the external routines we call.
+ */
+#include "protos.h"
+
+/*
+ * The external variables we use:
+ */
+extern char *nextstring, *maxstring ;
+extern double mag ;
+#ifdef DEBUG
+extern integer debug_flag;
+#endif /* DEBUG */
+extern int actualdpi ;
+extern real alpha ;
+extern fontmaptype *ffont ;
+extern quarterword *curpos ;
+extern fontdesctype *fonthead ;
+extern integer fsizetol ;
+/*
+ * newfontdesc creates a new font descriptor with the given parameters and
+ * returns a pointer to the new object.
+*/
+fontdesctype*
+newfontdesc P5C(integer, cksum, integer, scsize, integer, dssize,
+ char *, name, char *, area)
+{
+ register fontdesctype *fp ;
+
+ fp = (fontdesctype *)mymalloc((integer)sizeof(fontdesctype)) ;
+ fp->chardesc = (chardesctype *)mymalloc(256*(integer)sizeof(chardesctype)) ;
+ fp->maxchars = 256 ;
+ fp->psname = 0 ;
+ fp->loaded = 0 ;
+ fp->checksum = cksum ;
+ fp->scaledsize = scsize ;
+ fp->designsize = dssize ;
+ fp->thinspace = scsize / 6 ;
+ fp->scalename = NULL ;
+ fp->psflag = 0 ;
+ fp->codewidth = 1 ;
+ fp->name = name;
+#ifdef VMCMS /* IBM: VM/CMS */
+ {
+ int i ;
+ for ( i=0 ; fp->name[i] ; i++ )
+ fp->name[i] = ascii2ebcdic[ fp->name[i] ] ;
+ }
+#else
+#ifdef MVSXA /* IBM: MVS/XA */
+ {
+ int i ;
+ for ( i=0 ; fp->name[i] ; i++ )
+ fp->name[i] = ascii2ebcdic[ fp->name[i] ] ;
+ }
+#endif /* IBM: MVS/XA */
+#endif /* IBM: VM/CMS */
+ fp->area = area;
+ fp->resfont = NULL ;
+ fp->localfonts = NULL ;
+#ifdef KPATHSEA
+ fp->dpi = kpse_magstep_fix ((halfword)(mag*(float)fp->scaledsize*DPI/
+ ((float)fp->designsize*1000.0)+0.5), DPI, NULL) ;
+#else
+ fp->dpi = dpicheck((halfword)(mag*fp->scaledsize*DPI/
+ ((float)fp->designsize*1000.0)+0.5)) ;
+#endif
+ fp->loadeddpi = fp->dpi ;
+#ifdef DEBUG
+ if (dd(D_FONTS))
+ (void)fprintf(stderr,"Defining font (%s) %s at %.1fpt\n",
+ area, name, (real)scsize/(alpha*0x100000)) ;
+#endif /* DEBUG */
+ return fp ;
+}
+/*
+ * Try to find a font with a given name and approximate scaled size, returning
+ * NULL if unsuccessful. If scname and the font's scalename are both
+ * non-NULL they must match exactly. If both are NULL, scsize and the
+ * font's scaledsize come from the dvi file and should match exactly.
+ * Otherwise there can be some slop due to the inaccuracies of sizes
+ * read from an included psfile.
+ */
+fontdesctype *
+matchfont P4C(char *, name, char *, area, integer, scsize, char *, scname)
+{
+ register fontdesctype *fp;
+ register integer smin, smax;
+
+ smin = scsize - fsizetol ;
+ smax = scsize + fsizetol ;
+ for (fp=fonthead; fp; fp=fp->next)
+ if (smin < fp->scaledsize && fp->scaledsize < smax &&
+ strcmp(name,fp->name)==0 && strcmp(area,fp->area)==0) {
+ if (scname == NULL) {
+ if (fp->scalename!=NULL || scsize==fp->scaledsize)
+ break ;
+ } else {
+ if (fp->scalename==NULL || strcmp(scname,fp->scalename)==0)
+ break ;
+ }
+ }
+#ifdef DEBUG
+ if (dd(D_FONTS) && fp)
+ (void)fprintf(stderr,"(Already known.)\n") ;
+#endif /* DEBUG */
+ return fp;
+}
+/*
+ * fontdef takes a font definition in the dvi file and loads the data
+ * into its data structures.
+ */
+void
+fontdef P1C(int, siz)
+{
+ register integer i, j, fn ;
+ register fontdesctype *fp ;
+ register fontmaptype *cfnt ;
+ char *name, *area ;
+ integer cksum, scsize, dssize ;
+ extern void skipover(int) ;
+
+ fn = dvibyte() ;
+ while (siz-- > 1)
+ fn = (fn << 8) + dvibyte() ;
+ for (cfnt=ffont; cfnt; cfnt = cfnt->next)
+ if (cfnt->fontnum == fn) goto alreadydefined ;
+ cfnt = (fontmaptype *)mymalloc((integer)sizeof(fontmaptype)) ;
+ cfnt->next = ffont ;
+ ffont = cfnt ;
+ cfnt->fontnum = fn ;
+ cksum = signedquad() ;
+ scsize = signedquad() ;
+ dssize = signedquad() ;
+ i = dvibyte() ; j = dvibyte() ;
+ if (nextstring + i + j > maxstring)
+ error("! out of string space") ;
+ area = nextstring ;
+ for (; i>0; i--)
+ *nextstring++ = dvibyte() ;
+ *nextstring++ = 0 ;
+ name = nextstring ;
+ for (; j>0; j--)
+ *nextstring++ = dvibyte() ;
+ *nextstring++ = 0 ;
+ fp = matchfont(name, area, scsize, (char *)0) ;
+ if (fp) {
+ nextstring = name ;
+ fp->checksum = cksum ;
+ } else {
+ fp = newfontdesc(cksum, scsize, dssize, name, area) ;
+ fp->next = fonthead ;
+ fonthead = fp ;
+ }
+ cfnt->desc = fp ;
+ return ;
+alreadydefined:
+/* A DVI file will not define a font twice; but we may be scanning
+ * a font definition twice because a new section has started,
+ * or because of collated copies. */
+ skipover(12) ;
+ skipover(dvibyte()+dvibyte()) ;
+}
+
+/*
+ * The next routine handles nops or font definitions between pages in a
+ * dvi file. Returns the first command that is not a nop or font definition.
+ *
+ * Now handles specials (but ignores them)
+ */
+int
+skipnop P1H(void)
+{
+ register int cmd ;
+
+ while (1) {
+ switch(cmd=dvibyte()) {
+case 138: break ;
+case 239: skipover((int)dvibyte()) ; break ; /* xxx1 */
+case 240: skipover((int)twobytes()) ; break ; /* xxx2 */
+case 241: skipover((int)threebytes()) ; break ; /* xxx3 */
+case 242: skipover((int)signedquad()) ; break ; /* xxx4 */
+case 243: case 244: case 245: case 246: fontdef(cmd-242) ; break ;
+default: return cmd ;
+ }
+ }
+}