diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-06-23 13:41:53 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2016-06-23 16:10:29 +0100 |
commit | 6e48c939dc9913a6af747d5b6961624551c8d90d (patch) | |
tree | 4b3f69c237dc7af00606c87ac94cd2c4893da628 /source/fitz/text.c | |
parent | cf7b2cbbfe6192fbf697237735ab45bc951304e4 (diff) | |
download | mupdf-6e48c939dc9913a6af747d5b6961624551c8d90d.tar.xz |
epub: Use markup language when shaping and selecting fallback fonts.
Diffstat (limited to 'source/fitz/text.c')
-rw-r--r-- | source/fitz/text.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/source/fitz/text.c b/source/fitz/text.c index 76838fe8..a0e2abc8 100644 --- a/source/fitz/text.c +++ b/source/fitz/text.c @@ -114,7 +114,7 @@ fz_show_string(fz_context *ctx, fz_text *text, fz_font *user_font, fz_matrix *tr while (*s) { s += fz_chartorune(&ucs, s); - gid = fz_encode_character_with_fallback(ctx, user_font, ucs, 0, &font); + gid = fz_encode_character_with_fallback(ctx, user_font, ucs, 0, language, &font); fz_show_glyph(ctx, text, font, trm, gid, ucs, wmode, bidi_level, markup_dir, language); adv = fz_advance_glyph(ctx, font, gid, wmode); if (wmode == 0) @@ -227,6 +227,16 @@ fz_text_language fz_text_language_from_string(const char *str) if (str == NULL) return FZ_LANG_UNSET; + if (!strcmp(str, "zh-Hant") || + !strcmp(str, "zh-HK") || + !strcmp(str, "zh-MO") || + !strcmp(str, "zh-SG") || + !strcmp(str, "zh-TW")) + return FZ_LANG_zh_Hant; + if (!strcmp(str, "zh-Hans") || + !strcmp(str, "zh-CN")) + return FZ_LANG_zh_Hans; + /* 1st char */ if (str[0] >= 'a' && str[0] <= 'z') lang = str[0] - 'a' + 1; @@ -254,23 +264,30 @@ fz_text_language fz_text_language_from_string(const char *str) return lang; } -char *fz_string_from_text_language(char str[4], fz_text_language lang) +char *fz_string_from_text_language(char str[8], fz_text_language lang) { int c; - /* str is supposed to be at least 4 chars in size */ + /* str is supposed to be at least 8 chars in size */ if (str == NULL) return NULL; - c = lang % 27; - lang = lang / 27; - str[0] = c == 0 ? 0 : c - 1 + 'a'; - c = lang % 27; - lang = lang / 27; - str[1] = c == 0 ? 0 : c - 1 + 'a'; - c = lang % 27; - str[2] = c == 0 ? 0 : c - 1 + 'a'; - str[3] = 0; + if (lang == FZ_LANG_zh_Hant) + fz_strlcpy(str, "zh-Hant", 8); + else if (lang == FZ_LANG_zh_Hans) + fz_strlcpy(str, "zh-Hans", 8); + else + { + c = lang % 27; + lang = lang / 27; + str[0] = c == 0 ? 0 : c - 1 + 'a'; + c = lang % 27; + lang = lang / 27; + str[1] = c == 0 ? 0 : c - 1 + 'a'; + c = lang % 27; + str[2] = c == 0 ? 0 : c - 1 + 'a'; + str[3] = 0; + } return str; } |