diff options
author | John-Mark Bell <jmb@netsurf-browser.org> | 2021-08-05 19:23:14 +0100 |
---|---|---|
committer | John-Mark Bell <jmb@netsurf-browser.org> | 2021-08-05 19:23:14 +0100 |
commit | ee664df8218ff38d9d90dddecc0c20cd2857a4be (patch) | |
tree | d47b0bfbd4a11b0078cdb4311baf98aac4bcc174 /src | |
parent | ec4f056527a065d95583f1c82b9d9975bd89bf2a (diff) | |
download | ttf2f-ee664df8218ff38d9d90dddecc0c20cd2857a4be.tar.gz ttf2f-ee664df8218ff38d9d90dddecc0c20cd2857a4be.tar.bz2 |
Fix Encoding file entries for astral characters.
Early versions of the UCS Font Manager (3.41-3.42) supported the
use of /uni followed by up to 8 upper-case hex digits to specify
the Unicode codepoint represented by a glyph.
Font Manager 3.43 changed this behaviour to align with Adobe's
then-current specification of /uniXXXX for characters in the
Basic Multilingual Plane and /uniXXXXYYYY for all other characters
(where XXXX is a high UTF-16 surrogate and YYYY is a low surrogate)
Font Manager 3.53 changed again to remove support for /uniXXXXYYYY
and, instead, introduced support for /uXXXX to /uXXXXXXXX, where
leading zeroes are forbidden if more than 4 hex digits are present.
Change our behaviour to use the /uniXXXX form for characters in
the Basic Multilingual Plane (which is supported by all versions
of the UCS Font Manager) and use the /uXXXXX - /uXXXXXXXX form
for all other characters.
This effectively means that Font Manager 3.53 or later is required
when astral characters are in use.
Diffstat (limited to 'src')
-rw-r--r-- | src/encoding.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/encoding.c b/src/encoding.c index ae8767d..8f9671f 100644 --- a/src/encoding.c +++ b/src/encoding.c @@ -78,8 +78,15 @@ void encoding_write_glyph(int index, struct glyph *glyph, glyph->name); } } else if (glyph->code != (unsigned int) -1) { - fprintf(fp, "%4.4X;uni%04X;COMMENT\n", index, - glyph->code); + if (glyph->code < 0x10000) { + /* Use uniXXXX for BMP codepoints */ + fprintf(fp, "%4.4X;uni%04X;COMMENT\n", index, + glyph->code); + } else { + /* Use uXXXXX - uXXXXXXXX otherwise */ + fprintf(fp, "%4.4X;u%X;COMMENT\n", index, + glyph->code); + } } else { fprintf(fp, "# Skipping %4.4X\n", index); } @@ -87,11 +94,26 @@ void encoding_write_glyph(int index, struct glyph *glyph, if (glyph->name != 0) { fprintf(fp, "/%s\n", glyph->name); } else if (glyph->code != (unsigned int) -1) { - fprintf(fp, "/uni%4.4X\n", glyph->code); + if (glyph->code < 0x10000) { + /* Use /uniXXXX for BMP codepoints */ + fprintf(fp, "/uni%4.4X\n", glyph->code); + } else { + /* Use /uXXXXX - /uXXXXXXXX otherwise. + * These are supported since FM 3.53. + * FM 3.43 - 3.52 (inclusive) understood + * /uniXXXXYYYY, where XXXX and YYYY were + * a UTF-16 surrogate pair. We have never + * emitted such things and support for + * them was removed in FM 3.53 with the + * introduction of support for the /u form. + * Thus, take the easy option and rely on + * noone running a UCS FM earlier than 3.53 + * expecting astral codepoints to work. + */ + fprintf(fp, "/u%X\n", glyph->code); + } } else { fprintf(fp, "/.notdef\n"); } } } - - |