From e90acbb3dd052ae075bac3e3aa8c9a7ecbf889d1 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 11 May 2009 00:01:02 +0000 Subject: Write out font metrics so that the first 256 glyphs match Acorn Latin 1. Don't use this version -- it will produce inconsistent font data (outlines and encoding export needs the same thing doing to it) svn path=/trunk/tools/ttf2f/; revision=7460 --- src/context.h | 3 ++- src/ft.c | 12 ++++++++---- src/glyph.h | 4 ++++ src/intmetrics.c | 37 +++++++++++++++++++++---------------- 4 files changed, 35 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/context.h b/src/context.h index f555fe3..157f31c 100644 --- a/src/context.h +++ b/src/context.h @@ -14,7 +14,8 @@ struct ttf2f_ctx { size_t nglyphs; struct glyph *glyphs; - struct glyph *latin1tab[256 - 32]; /* Not chunk zero */ + struct glyph *latin1tab[256]; + size_t nlatin1; }; #endif diff --git a/src/ft.c b/src/ft.c index 0676bf8..7525d8d 100644 --- a/src/ft.c +++ b/src/ft.c @@ -115,9 +115,9 @@ int glnames(ttf2f_ctx *ctx) /* Insert into latin1 table, if appropriate */ if (0x0020 <= code && code < 0x007f) - ctx->latin1tab[code - 0x20] = &ctx->glyphs[i]; + ctx->latin1tab[code] = &ctx->glyphs[i]; else if (0x00a0 <= code && code <= 0x00ff) - ctx->latin1tab[code - 0x20] = &ctx->glyphs[i]; + ctx->latin1tab[code] = &ctx->glyphs[i]; else { int j; @@ -131,12 +131,16 @@ int glnames(ttf2f_ctx *ctx) } if (j != 32) { - ctx->latin1tab[j + 0x80 - 0x20] = - &ctx->glyphs[i]; + ctx->latin1tab[j + 0x80] = &ctx->glyphs[i]; } } } + for (i = 0; i != sizeof(ctx->latin1tab); i++) { + if (ctx->latin1tab[i] != NULL) + ctx->nlatin1++; + } + return 0; } diff --git a/src/glyph.h b/src/glyph.h index 6a18b2d..8126547 100644 --- a/src/glyph.h +++ b/src/glyph.h @@ -33,6 +33,10 @@ struct glyph { short width; /* advance width of glyph */ struct outline *outline; /* outline of glyph */ struct composite *composite; /* list of composite inclusions */ + + int done_intmetrics : 2, + done_outlines : 2, + done_encoding : 2; }; #endif diff --git a/src/intmetrics.c b/src/intmetrics.c index 6b9c297..3c99696 100644 --- a/src/intmetrics.c +++ b/src/intmetrics.c @@ -76,37 +76,42 @@ ttf2f_result intmetrics_write(const char *savein, const char *name, struct intmetrics_header header; short *xwidthtab = NULL; unsigned int xwidthtab_size = 0; + int xwidthtab_idx = sizeof(ctx->latin1tab); short mapsize; size_t i, name_len; - const struct glyph *g; + struct glyph *g; char out[1024]; FILE *output; - /* allow for chunk 0 */ - xwidthtab = calloc(33, sizeof(short)); + /* Total number of slots is the number of glyphs plus any spare + * required for the latin1 table */ + xwidthtab_size = ctx->nglyphs + sizeof(ctx->latin1tab) - ctx->nlatin1; + + xwidthtab = calloc(xwidthtab_size, sizeof(short)); if (xwidthtab == NULL) return TTF2F_RESULT_NOMEM; - xwidthtab_size = 32; + /* fill latin1 subset first */ + for (i = 0; i != sizeof(ctx->latin1tab); i++) { + g = ctx->latin1tab[i]; - /* create xwidthtab - char code is now the index */ - for (i = 0; i != ctx->nglyphs; i++) { - short *temp; + xwidthtab[i] = g != NULL ? g->width : 0; + if (g != NULL) + g->done_intmetrics = 1; + } + + /* then the rest, skipping those we've already written */ + for (i = 0; i != ctx->nglyphs; i++) { g = &ctx->glyphs[i]; callback((i * 100) / ctx->nglyphs); ttf2f_poll(1); - xwidthtab_size++; - /* +32 to skip chunk 0 */ - xwidthtab[i + 32] = g->width; - temp = realloc(xwidthtab, (xwidthtab_size + 1) * sizeof(short)); - if (temp == NULL) { - free(xwidthtab); - return TTF2F_RESULT_NOMEM; + if (g->done_intmetrics == 0) { + xwidthtab[xwidthtab_idx++] = g->width; + g->done_intmetrics = 1; } - xwidthtab = temp; } /* fill in header */ @@ -129,7 +134,7 @@ ttf2f_result intmetrics_write(const char *savein, const char *name, return TTF2F_RESULT_OPEN; } - if (fwrite((void*)&header, sizeof(struct intmetrics_header), + if (fwrite((void*) &header, sizeof(struct intmetrics_header), 1, output) != 1) goto error_write; if (fputc(mapsize & 0xFF, output) == EOF) goto error_write; -- cgit v1.2.3