#include "parse-afm.hh"
#include "warn.hh"
+#define METATYPE1_BUG /* Parse Metatype1's (version unknown)
+ 'Generated' global tag as comment. */
+
#define lineterm EOL /* line terminating character */
#define lineterm_alt '\r' /* alternative line terminating character */
#define normalEOF 1 /* return code from parsing routines used only */
ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, COMMENT,
DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES,
ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN,
- FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME, ISFIXEDPITCH,
+ FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME,
+#ifdef METATYPE1_BUG
+ GENERATED,
+#endif
+ ISFIXEDPITCH,
ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME,
NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES,
STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS,
"Ascender", "B", "C", "CC", "CapHeight", "Comment",
"Descender", "EncodingScheme", "EndCharMetrics", "EndComposites",
"EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern",
- "FamilyName", "FontBBox", "FontName", "FullName", "IsFixedPitch",
+ "FamilyName", "FontBBox", "FontName", "FullName",
+#ifdef METATYPE1_BUG
+ "Generated",
+#endif
+ "IsFixedPitch",
"ItalicAngle", "KP", "KPX", "L", "N",
"Notice", "PCC", "StartCharMetrics", "StartComposites",
"StartFontMetrics", "StartKernData", "StartKernPairs",
* reads all tokens until the next end-of-line.
*/
-static char *token (FILE *stream)
+static char*
+token (FILE *stream)
{
int ch, idx;
* more than one word (like Comment lines and FullName).
*/
-static char *linetoken (FILE *stream)
+static char*
+linetoken (FILE *stream)
{
int ch, idx;
* The algorithm is a standard Knuth binary search.
*/
-static enum parseKey recognize ( register char *ident)
+static enum parseKey
+recognize (register char *ident)
{
int lower = 0,
upper = (int) NOPE,
while ((upper >= lower) && !found)
{
midpoint = (lower + upper)/2;
- if (keyStrings[midpoint] == NULL) break;
+ if (keyStrings[midpoint] == NULL)
+ break;
cmpvalue = strncmp (ident, keyStrings[midpoint], MAX_NAME);
- if (cmpvalue == 0) found = TRUE;
- else if (cmpvalue < 0) upper = midpoint - 1;
- else lower = midpoint + 1;
- } /* while */
+ if (cmpvalue == 0)
+ found = TRUE;
+ else
+ if (cmpvalue < 0)
+ upper = midpoint - 1;
+ else
+ lower = midpoint + 1;
+ }
- if (found) return (enum parseKey) midpoint;
- else return NOPE;
-
-} /* recognize */
+ if (found)
+ return (enum parseKey) midpoint;
+ else
+ return NOPE;
+}
/************************* parseGlobals *****************************/
* parseFile to determine if there is more file to parse.
*/
-static BOOL parseGlobals (FILE *fp, register AFM_GlobalFontInfo *gfi)
+static BOOL
+parseGlobals (FILE *fp, register AFM_GlobalFontInfo *gfi)
{
BOOL cont = TRUE, save = (gfi != NULL);
int error = AFM_ok;
strcpy (gfi->afmVersion, keyword);
break;
case COMMENT:
+#ifdef METATYPE1_BUG
+ case GENERATED:
+#endif
keyword = linetoken (fp);
break;
case FONTNAME:
} /* parseGlobals */
-
+#if 0
/************************* initializeArray ************************/
/* Unmapped character codes are (at Adobe Systems) assigned the
* file is reset to be where it was upon entering this function.
*/
-static int initializeArray (FILE *fp, register int *cwi)
+static int
+initializeArray (FILE *fp, register int *cwi)
{
BOOL cont = TRUE, found = FALSE;
long opos = ftell (fp);
return (error);
} /* initializeArray */
-
+#endif
/************************* parseCharWidths **************************/
* parseFile to determine if there is more file to parse.
*/
-static int parseCharWidths (FILE *fp, register int *cwi)
+static int
+parseCharWidths (FILE *fp, register int *cwi)
{
BOOL cont = TRUE, save = (cwi != NULL);
int pos = 0, error = AFM_ok;
* parseFile to determine if there is more file to parse.
*/
-static int parseCharMetrics (FILE *fp, register AFM_Font_info *fi)
+static int
+parseCharMetrics (FILE *fp, register AFM_Font_info *fi)
{
BOOL cont = TRUE, firstTime = TRUE;
int error = AFM_ok, count = 0;
* parseFile to determine if there is more file to parse.
*/
-static int parseAFM_TrackKernData (FILE *fp, register AFM_Font_info *fi)
+static int
+parseAFM_TrackKernData (FILE *fp, register AFM_Font_info *fi)
{
BOOL cont = TRUE, save = (fi->tkd != NULL);
int pos = 0, error = AFM_ok, tcount = 0;
switch (recognize (keyword))
{
case COMMENT:
+#ifdef METATYPE1_BUG
+ case GENERATED:
+#endif
keyword = linetoken (fp);
break;
case TRACKKERN:
* parseFile to determine if there is more file to parse.
*/
-static int parseAFM_PairKernData (FILE *fp, register AFM_Font_info *fi)
+static int
+parseAFM_PairKernData (FILE *fp, register AFM_Font_info *fi)
{
BOOL cont = TRUE, save = (fi->pkd != NULL);
int pos = 0, error = AFM_ok, pcount = 0;
* parseFile to determine if there is more file to parse.
*/
-static int parseAFM_CompCharData (FILE *fp, register AFM_Font_info *fi)
+static int
+parseAFM_CompCharData (FILE *fp, register AFM_Font_info *fi)
{
BOOL cont = TRUE, firstTime = TRUE, save = (fi->ccd != NULL);
int pos = 0, j = 0, error = AFM_ok, ccount = 0, pcount = 0;
* pointer upon return of this function is undefined.
*/
-extern int AFM_parseFile (FILE *fp, AFM_Font_info **fi, int flags)
+int
+AFM_parseFile (FILE *fp, AFM_Font_info **fi, int flags)
{
int code = AFM_ok; /* return code from each of the parsing routines */
/* storage data for the global variable ident */
if (!ident)
ident = (char *) calloc (MAX_NAME, sizeof (char));
- if (ident == NULL) {error = AFM_storageProblem; return (error);}
-
+ if (ident == NULL)
+ {
+ error = AFM_storageProblem;
+ return error;
+ }
+
(*fi) = (AFM_Font_info *) calloc (1, sizeof (AFM_Font_info));
- if ((*fi) == NULL) {error = AFM_storageProblem; return (error);}
+ if ((*fi) == NULL)
+ {
+ error = AFM_storageProblem;
+ return error;
+ }
if (flags & P_G)
{
- (*fi)->gfi = (AFM_GlobalFontInfo *) calloc (1, sizeof (AFM_GlobalFontInfo));
- if ((*fi)->gfi == NULL) {error = AFM_storageProblem; return (error);}
+ (*fi)->gfi = (AFM_GlobalFontInfo *) calloc (1,
+ sizeof (AFM_GlobalFontInfo));
+ if ((*fi)->gfi == NULL)
+ {
+ error = AFM_storageProblem;
+ return error;
+ }
}
/* The AFM File begins with Global Font Information. This section */
{
(*fi)->cmi = (AFM_CharMetricInfo *)
calloc ((*fi)->numOfChars, sizeof (AFM_CharMetricInfo));
- if ((*fi)->cmi == NULL) {
- error = AFM_storageProblem;
- return (error);
-
- }
+ if ((*fi)->cmi == NULL)
+ {
+ error = AFM_storageProblem;
+ return error;
+ }
code = parseCharMetrics (fp, *fi);
}
else
,(delay (ly:font-load "cmtt12"))
)))))
+ ;; lmodern: super-cm using metapost
+ ;; lm.map: Reencoding, at fontlevel for TeX ?:
+ ;; cork-lmb10 LMRomanDemi10-Regular "enccorklm ReEncodeFont" <cork-lm.enc <lmb10.pf
+
(for-each
(lambda (x)
(add-font
(cons (* factor (cadr x))
(cddr x))
))
+
+;;; super-cm, aka lmodern (on Debian) seems rather broken:
+;;; * no usable TFM files (no lmr10.tfm, only cork-lmr10.tfm)
+;;; * broken AFM files:
+;;; - invalid keyword 'Generated'
+;;; - lists FontEncoding Fontspecific -- duh
+;;; revert to ec-fonts-mftraced for now
+;;; make this easily switchable?
+
+;;; `((#(roman upright medium) .
+;;; (10.0 . #(,(delay (ly:font-load "lmr6"))
+;;; ,(delay (ly:font-load "lmr8"))
+;;; ,(delay (ly:font-load "lmr10"))
+;;; ,(delay (ly:font-load "lmr17")))))
+
+;;; (#(roman upright bold) .
+;;; (10.0 . #(,(delay (ly:font-load "lmbx6"))
+;;; ,(delay (ly:font-load "lmbx8"))
+;;; ,(delay (ly:font-load "lmbx10"))
+;;; ,(delay (ly:font-load "lmbx12")))))
+
+;;; (#(roman italic medium) .
+;;; (10.0 . #(,(delay (ly:font-load "lmri7"))
+;;; ,(delay (ly:font-load "lmri10"))
+;;; ,(delay (ly:font-load "lmri12")))))
+;;; (#(roman italic bold) .
+;;; (10.0 . #(,(delay (ly:font-load "lmbi8"))
+;;; ,(delay (ly:font-load "lmbi10"))
+;;; ,(delay (ly:font-load "lmbi14")))))
+
+;;; (#(roman caps medium) .
+;;; (10.0 . #(,(delay (ly:font-load "lmcs10")))))
+
+;;; (#(roman upright bold-narrow ) .
+;;; (10.0 . #(,(delay (ly:font-load "lmb10")))))
+
+;;; (#(sans upright medium) .
+;;; (10.0 . #(,(delay (ly:font-load "lmss8"))
+;;; ,(delay (ly:font-load "lmss10"))
+;;; ,(delay (ly:font-load "lmss12"))
+;;; ,(delay (ly:font-load "lmss17")))))
+;;; (#(sans upright bold) .
+;;; (10.0 . #(,(delay (ly:font-load "lmssbx10")))))
+
+;;; (#(typewriter upright medium) .
+;;; (10.0 . #(,(delay (ly:font-load "lmtt8"))
+;;; ,(delay (ly:font-load "lmtt10"))
+;;; ,(delay (ly:font-load "lmtt12"))))))))
`((#(roman upright medium) .
(10.0 . #(,(delay (ly:font-load "ecrm6"))
,(delay (ly:font-load "ecrm8"))
,(delay (ly:font-load "ecrm10"))
- ,(delay (ly:font-load "ecrm17"))
- )))
-
+ ,(delay (ly:font-load "ecrm17")))))
(#(roman upright bold) .
(10.0 . #(,(delay (ly:font-load "ecbx6"))
,(delay (ly:font-load "ecbx8"))
,(delay (ly:font-load "ecbx10"))
- ,(delay (ly:font-load "ecbx12"))
- )))
-
+ ,(delay (ly:font-load "ecbx12")))))
(#(roman italic medium) .
(10.0 . #(,(delay (ly:font-load "ecti7"))
,(delay (ly:font-load "ecti10"))
- ,(delay (ly:font-load "ecti12"))
- )))
+ ,(delay (ly:font-load "ecti12")))))
(#(roman italic bold) .
(10.0 . #(,(delay (ly:font-load "ecbi8"))
,(delay (ly:font-load "ecbi10"))
- ,(delay (ly:font-load "ecbi14"))
- )))
-
- (#(roman caps medium) .
- (10.0 . #(,(delay (ly:font-load "eccc10")))))
-
+ ,(delay (ly:font-load "ecbi14")))))
+ ;; duplicate entry?
+ ;;(#(roman caps medium) .
+ ;; (10.0 . #(,(delay (ly:font-load "eccc10")))))
(#(roman caps medium) .
(10.0 . #(,(delay (ly:font-load "ecsc10")))))
-
(#(roman upright bold-narrow ) .
- (10.0 . #(,(delay (ly:font-load "ecb10"))
- )))
-
+ (10.0 . #(,(delay (ly:font-load "ecb10")))))
(#(sans upright medium) .
(10.0 . #(,(delay (ly:font-load "ecss8"))
,(delay (ly:font-load "ecss10"))
,(delay (ly:font-load "ecss12"))
- ,(delay (ly:font-load "ecss17"))
- )))
+ ,(delay (ly:font-load "ecss17")))))
(#(typewriter upright medium) .
(10.0 . #(,(delay (ly:font-load "ectt8"))
,(delay (ly:font-load "ectt10"))
- ,(delay (ly:font-load "ectt12"))
- )))
- )))
+ ,(delay (ly:font-load "ectt12"))))))))
+
+
;; (display (make-font-tree 1.0))