summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Farley <ryan.farley@gmx.com>2019-08-31 06:42:24 -0500
committerPeter Hutterer <peter.hutterer@who-t.net>2019-12-04 06:25:24 +0000
commitcfb4d64e1b90a28693fd700f4abf0f55d969f4f6 (patch)
tree1aaeb653d6ba7fb8e8f270fdcb4b0afb1a3879de
parent5d446a02a7422d3a61f74b8d1c28b7b551ea06fd (diff)
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.
-rw-r--r--read.c26
1 files 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;