From cfb4d64e1b90a28693fd700f4abf0f55d969f4f6 Mon Sep 17 00:00:00 2001 From: Ryan Farley Date: Sat, 31 Aug 2019 06:42:24 -0500 Subject: allow ISO-646.1991-IRV as well, adobe standard for bdf Allow for BDF file with no specified encoding to be read as Adobe Standard (per freetype's BDF driver), and handle any Unicode-equivalent encoding without changing the encoding name. --- read.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/read.c b/read.c index 5e80cc5..05f7b4f 100644 --- a/read.c +++ b/read.c @@ -64,6 +64,7 @@ readFile(char *filename, FontPtr font) StrikePtr strike; BitmapPtr bitmap; int symbol = 0; + int force_unicode = 1; char *encoding_name = NULL; FontMapPtr mapping = NULL; FontMapReversePtr reverse = NULL; @@ -79,13 +80,20 @@ readFile(char *filename, FontPtr font) return -1; } - /* FreeType will handle Unicode and automatically map ISO-8859-1 to - * Unicode for us -- everything else needs a mapping */ + /* FreeType will insist on encodings which are simple subsets of unicode + * to be read as unicode regardless of what we call them. */ + for(j = 0; j < face->num_charmaps; ++j) { + if((face->charmaps[j]->encoding == ft_encoding_none) || + (face->charmaps[j]->encoding == ft_encoding_adobe_standard)) { + force_unicode = 0; + break; + } + } + encoding_name = faceEncoding(face); if(encoding_name == NULL) { symbol = 1; - } else if((strcasecmp(encoding_name, "iso10646-1") != 0) && - (strcasecmp(encoding_name, "iso8859-1") != 0)) { + } else if(strcasecmp(encoding_name, "iso10646-1") != 0) { if(reencode_flag) mapping = FontEncMapFind(encoding_name, FONT_ENCODING_UNICODE, 0, 0, NULL); @@ -228,10 +236,16 @@ readFile(char *filename, FontPtr font) return -1; } - if(!symbol && !mapping) + if((!symbol && !mapping) || force_unicode) { rc = FT_Select_Charmap(face, ft_encoding_unicode); - else + } else { rc = FT_Select_Charmap(face, ft_encoding_none); + if(rc != 0) { + /* BDF will default to Adobe Standard even for nonstandard + * encodings, so try that as a last resort. */ + rc = FT_Select_Charmap(face, ft_encoding_adobe_standard); + } + } if(rc != 0) { fprintf(stderr, "Couldn't select character map: %x.\n", rc); return -1; -- cgit v1.2.3