X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/ba0fe3ecfe639410b68c2115d67fe486ffbbe9b6..4105facaec17862f03a6217f93a1609606f2a7cd:/in_afm.c diff --git a/in_afm.c b/in_afm.c index 0935bf3..dead96f 100644 --- a/in_afm.c +++ b/in_afm.c @@ -51,13 +51,20 @@ static int afm_require_key(char *line, char const *expected, input *in) { void read_afm_file(input *in) { char *line, *key, *val; font_info *fi; + size_t i; fi = snew(font_info); fi->name = NULL; fi->nglyphs = 0; fi->glyphs = NULL; fi->widths = NULL; + fi->fp = NULL; fi->kerns = newtree234(kern_cmp); + fi->fontbbox[0] = fi->fontbbox[1] = fi->fontbbox[2] = fi->fontbbox[3] = 0; + fi->capheight = fi->xheight = fi->ascent = fi->descent = 0; + fi->stemh = fi->stemv = fi->italicangle = 0; + for (i = 0; i < lenof(fi->bmp); i++) + fi->bmp[i] = 0xFFFF; in->pos.line = 0; line = afm_read_line(in); if (!line || !afm_require_key(line, "StartFontMetrics", in)) @@ -87,6 +94,63 @@ void read_afm_file(input *in) { goto giveup; } fi->name = dupstr(val); + } else if (strcmp(key, "FontBBox") == 0) { + int i; + for (i = 0; i < 3; i++) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 4); + goto giveup; + } + fi->fontbbox[i] = atof(val); + } + } else if (strcmp(key, "CapHeight") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->capheight = atof(val); + } else if (strcmp(key, "XHeight") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->xheight = atof(val); + } else if (strcmp(key, "Ascender") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->ascent = atof(val); + } else if (strcmp(key, "Descender") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->descent = atof(val); + } else if (strcmp(key, "CapHeight") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->capheight = atof(val); + } else if (strcmp(key, "StdHW") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->stemh = atof(val); + } else if (strcmp(key, "StdVW") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->stemv = atof(val); + } else if (strcmp(key, "ItalicAngle") == 0) { + if (!(val = strtok(NULL, " \t"))) { + error(err_afmval, &in->pos, key, 1); + goto giveup; + } + fi->italicangle = atof(val); } else if (strcmp(key, "StartCharMetrics") == 0) { char const **glyphs; int *widths;