summaryrefslogtreecommitdiff
path: root/source/fitz
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-06-23 13:41:53 +0200
committerRobin Watts <robin.watts@artifex.com>2016-06-23 16:10:29 +0100
commit6e48c939dc9913a6af747d5b6961624551c8d90d (patch)
tree4b3f69c237dc7af00606c87ac94cd2c4893da628 /source/fitz
parentcf7b2cbbfe6192fbf697237735ab45bc951304e4 (diff)
downloadmupdf-6e48c939dc9913a6af747d5b6961624551c8d90d.tar.xz
epub: Use markup language when shaping and selecting fallback fonts.
Diffstat (limited to 'source/fitz')
-rw-r--r--source/fitz/font.c44
-rw-r--r--source/fitz/noto.c247
-rw-r--r--source/fitz/text.c41
3 files changed, 188 insertions, 144 deletions
diff --git a/source/fitz/font.c b/source/fitz/font.c
index 792e1875..b0248bd7 100644
--- a/source/fitz/font.c
+++ b/source/fitz/font.c
@@ -295,9 +295,10 @@ fz_font *fz_load_system_cjk_font(fz_context *ctx, const char *name, int ros, int
return font;
}
-fz_font *fz_load_fallback_font(fz_context *ctx, int script, int serif, int bold, int italic)
+fz_font *fz_load_fallback_font(fz_context *ctx, int script, int language, int serif, int bold, int italic)
{
const char *data;
+ int index;
int size;
if (script < 0 || script > nelem(ctx->font->fallback))
@@ -305,25 +306,42 @@ fz_font *fz_load_fallback_font(fz_context *ctx, int script, int serif, int bold,
/* TODO: bold and italic */
+ index = script;
+ if (script == UCDN_SCRIPT_HAN)
+ {
+ switch (language)
+ {
+ case FZ_LANG_ja: index = UCDN_LAST_SCRIPT + 1; break;
+ case FZ_LANG_ko: index = UCDN_LAST_SCRIPT + 2; break;
+ case FZ_LANG_zh_Hant: index = UCDN_LAST_SCRIPT + 3; break;
+ case FZ_LANG_zh_Hans: index = UCDN_LAST_SCRIPT + 4; break;
+ }
+ }
+ if (script == UCDN_SCRIPT_ARABIC)
+ {
+ if (language == FZ_LANG_ur || language == FZ_LANG_urd)
+ index = UCDN_LAST_SCRIPT + 5;
+ }
+
if (serif)
{
- if (ctx->font->fallback[script].serif)
- return ctx->font->fallback[script].serif;
- data = fz_lookup_noto_font(ctx, script, 1, &size);
+ if (ctx->font->fallback[index].serif)
+ return ctx->font->fallback[index].serif;
+ data = fz_lookup_noto_font(ctx, script, language, 1, &size);
if (data)
{
- ctx->font->fallback[script].serif = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
- return ctx->font->fallback[script].serif;
+ ctx->font->fallback[index].serif = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
+ return ctx->font->fallback[index].serif;
}
}
- if (ctx->font->fallback[script].sans)
- return ctx->font->fallback[script].sans;
- data = fz_lookup_noto_font(ctx, script, 0, &size);
+ if (ctx->font->fallback[index].sans)
+ return ctx->font->fallback[index].sans;
+ data = fz_lookup_noto_font(ctx, script, language, 0, &size);
if (data)
{
- ctx->font->fallback[script].sans = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
- return ctx->font->fallback[script].sans;
+ ctx->font->fallback[index].sans = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
+ return ctx->font->fallback[index].sans;
}
return NULL;
@@ -1488,7 +1506,7 @@ fz_encode_character(fz_context *ctx, fz_font *font, int ucs)
/* FIXME: This should take language too eventually, to allow for fonts where we can select different
* languages using opentype features. */
int
-fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unicode, int script, fz_font **out_font)
+fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unicode, int script, int language, fz_font **out_font)
{
fz_font *font;
int gid;
@@ -1500,7 +1518,7 @@ fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unico
if (script == 0)
script = ucdn_get_script(unicode);
- font = fz_load_fallback_font(ctx, script, user_font->is_serif, user_font->is_bold, user_font->is_italic);
+ font = fz_load_fallback_font(ctx, script, language, user_font->is_serif, user_font->is_bold, user_font->is_italic);
if (font)
{
gid = fz_encode_character(ctx, font, unicode);
diff --git a/source/fitz/noto.c b/source/fitz/noto.c
index 70f3bb8f..894d7bd6 100644
--- a/source/fitz/noto.c
+++ b/source/fitz/noto.c
@@ -6,7 +6,7 @@
DroidSansFallback from Android for CJK.
Charis SIL from SIL.
- Define TOFU to skip all the Noto fonts except CJK.
+ Define TOFU to only include the Base14 and CJK fonts.
Define TOFU_CJK to skip CJK font.
Define TOFU_CJK_EXT to skip CJK Extension A support.
@@ -15,6 +15,8 @@
Define TOFU_HISTORIC to skip ancient/historic scripts.
Define TOFU_SYMBOL to skip symbol font.
Define TOFU_SIL to skip the SIL fonts.
+
+ Define TOFU_BASE14 to skip the Base 14 fonts (warning: makes PDF unusable).
*/
#ifdef NOTO_SMALL
@@ -37,39 +39,39 @@
#endif
#define RETURN(NAME) \
- do {\
+ do { \
extern const int fz_font_ ## NAME ## _size; \
extern const char fz_font_ ## NAME []; \
- return *size = fz_font_ ## NAME ## _size, fz_font_ ## NAME;\
+ return *size = fz_font_ ## NAME ## _size, fz_font_ ## NAME; \
} while (0)
const char *
fz_lookup_base14_font(fz_context *ctx, const char *name, int *size)
{
#ifndef TOFU_BASE14
- if (!strcmp(name, "Courier")) { RETURN(NimbusMonoPS_Regular_cff); }
- if (!strcmp(name, "Courier-Oblique")) { RETURN(NimbusMonoPS_Italic_cff); }
- if (!strcmp(name, "Courier-Bold")) { RETURN(NimbusMonoPS_Bold_cff); }
- if (!strcmp(name, "Courier-BoldOblique")) { RETURN(NimbusMonoPS_BoldItalic_cff); }
- if (!strcmp(name, "Helvetica")) { RETURN(NimbusSans_Regular_cff); }
- if (!strcmp(name, "Helvetica-Oblique")) { RETURN(NimbusSans_Oblique_cff); }
- if (!strcmp(name, "Helvetica-Bold")) { RETURN(NimbusSans_Bold_cff); }
- if (!strcmp(name, "Helvetica-BoldOblique")) { RETURN(NimbusSans_BoldOblique_cff); }
- if (!strcmp(name, "Times-Roman")) { RETURN(NimbusRoman_Regular_cff); }
- if (!strcmp(name, "Times-Italic")) { RETURN(NimbusRoman_Italic_cff); }
- if (!strcmp(name, "Times-Bold")) { RETURN(NimbusRoman_Bold_cff); }
- if (!strcmp(name, "Times-BoldItalic")) { RETURN(NimbusRoman_BoldItalic_cff); }
- if (!strcmp(name, "Symbol")) { RETURN(StandardSymbolsPS_cff); }
- if (!strcmp(name, "ZapfDingbats")) { RETURN(Dingbats_cff); }
+ if (!strcmp(name, "Courier")) RETURN(NimbusMonoPS_Regular_cff);
+ if (!strcmp(name, "Courier-Oblique")) RETURN(NimbusMonoPS_Italic_cff);
+ if (!strcmp(name, "Courier-Bold")) RETURN(NimbusMonoPS_Bold_cff);
+ if (!strcmp(name, "Courier-BoldOblique")) RETURN(NimbusMonoPS_BoldItalic_cff);
+ if (!strcmp(name, "Helvetica")) RETURN(NimbusSans_Regular_cff);
+ if (!strcmp(name, "Helvetica-Oblique")) RETURN(NimbusSans_Oblique_cff);
+ if (!strcmp(name, "Helvetica-Bold")) RETURN(NimbusSans_Bold_cff);
+ if (!strcmp(name, "Helvetica-BoldOblique")) RETURN(NimbusSans_BoldOblique_cff);
+ if (!strcmp(name, "Times-Roman")) RETURN(NimbusRoman_Regular_cff);
+ if (!strcmp(name, "Times-Italic")) RETURN(NimbusRoman_Italic_cff);
+ if (!strcmp(name, "Times-Bold")) RETURN(NimbusRoman_Bold_cff);
+ if (!strcmp(name, "Times-BoldItalic")) RETURN(NimbusRoman_BoldItalic_cff);
+ if (!strcmp(name, "Symbol")) RETURN(StandardSymbolsPS_cff);
+ if (!strcmp(name, "ZapfDingbats")) RETURN(Dingbats_cff);
#endif
return *size = 0, NULL;
}
#define FAMILY(R, I, B, BI) \
if (!is_bold) { \
- if (!is_italic) { RETURN(R); } else { RETURN(I); } \
+ if (!is_italic) RETURN(R); else RETURN(I); \
} else { \
- if (!is_italic) { RETURN(B); } else { RETURN(BI); } \
+ if (!is_italic) RETURN(B); else RETURN(BI); \
}
const char *
@@ -140,20 +142,16 @@ fz_lookup_cjk_font(fz_context *ctx, int registry, int serif, int wmode, int *siz
#endif
}
-#define Noto(SANS) { RETURN(Noto ## SANS ## _Regular_ttf); } break
+#define Noto(SANS) RETURN(Noto ## SANS ## _Regular_ttf)
#define Noto2(SANS,SERIF) \
- if (serif) { RETURN(Noto ## SERIF ## _Regular_ttf); } \
- else { RETURN(Noto ## SANS ## _Regular_ttf); } \
- break
-
-#define Noto3(SANS,SERIF,UNUSED) \
- Noto2(SANS,SERIF)
+ if (serif) { RETURN(Noto ## SERIF ## _Regular_ttf); } else { RETURN(Noto ## SANS ## _Regular_ttf); }
const char *
-fz_lookup_noto_font(fz_context *ctx, int script, int serif, int *size)
+fz_lookup_noto_font(fz_context *ctx, int script, int language, int serif, int *size)
{
- /* Unused Noto fonts: NastaliqUrdu, SansSyriacEstrangela */
+ /* TODO: Noto(SansSyriacEstrangela); */
+ /* TODO: Noto(SansSyriacWestern); */
switch (script)
{
@@ -171,141 +169,152 @@ fz_lookup_noto_font(fz_context *ctx, int script, int serif, int *size)
case UCDN_SCRIPT_BOPOMOFO:
return fz_lookup_cjk_font(ctx, FZ_ADOBE_GB_1, serif, 0, size, NULL);
case UCDN_SCRIPT_HAN:
- return fz_lookup_cjk_font(ctx, FZ_ADOBE_GB_1, serif, 0, size, NULL);
+ switch (language)
+ {
+ case FZ_LANG_ja: return fz_lookup_cjk_font(ctx, FZ_ADOBE_JAPAN_1, serif, 0, size, NULL);
+ case FZ_LANG_ko: return fz_lookup_cjk_font(ctx, FZ_ADOBE_KOREA_1, serif, 0, size, NULL);
+ case FZ_LANG_zh_Hant: return fz_lookup_cjk_font(ctx, FZ_ADOBE_CNS_1, serif, 0, size, NULL);
+ default:
+ case FZ_LANG_zh_Hans: return fz_lookup_cjk_font(ctx, FZ_ADOBE_GB_1, serif, 0, size, NULL);
+ }
#ifndef TOFU
-
-#ifndef TOFU_HISTORIC
- case UCDN_SCRIPT_IMPERIAL_ARAMAIC: Noto(SansImperialAramaic);
- case UCDN_SCRIPT_AVESTAN: Noto(SansAvestan);
- case UCDN_SCRIPT_CARIAN: Noto(SansCarian);
- case UCDN_SCRIPT_CYPRIOT: Noto(SansCypriot);
- case UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS: Noto(SansEgyptianHieroglyphs);
- case UCDN_SCRIPT_GLAGOLITIC: Noto(SansGlagolitic);
- case UCDN_SCRIPT_GOTHIC: Noto(SansGothic);
- case UCDN_SCRIPT_OLD_ITALIC: Noto(SansOldItalic);
- case UCDN_SCRIPT_KHAROSHTHI: Noto(SansKharoshthi);
- case UCDN_SCRIPT_KAITHI: Noto(SansKaithi);
- case UCDN_SCRIPT_LINEAR_B: Noto(SansLinearB);
- case UCDN_SCRIPT_LYCIAN: Noto(SansLycian);
- case UCDN_SCRIPT_LYDIAN: Noto(SansLydian);
- case UCDN_SCRIPT_OGHAM: Noto(SansOgham);
- case UCDN_SCRIPT_OLD_TURKIC: Noto(SansOldTurkic);
- case UCDN_SCRIPT_PHAGS_PA: Noto(SansPhagsPa);
- case UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI: Noto(SansInscriptionalPahlavi);
- case UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN: Noto(SansInscriptionalParthian);
- case UCDN_SCRIPT_RUNIC: Noto(SansRunic);
- case UCDN_SCRIPT_OLD_SOUTH_ARABIAN: Noto(SansOldSouthArabian);
- case UCDN_SCRIPT_UGARITIC: Noto(SansUgaritic);
- case UCDN_SCRIPT_OLD_PERSIAN: Noto(SansOldPersian);
- case UCDN_SCRIPT_CUNEIFORM: Noto(SansCuneiform);
- case UCDN_SCRIPT_COPTIC: Noto(SansCoptic);
-#endif
-
case UCDN_SCRIPT_LATIN: Noto2(Sans, Serif);
case UCDN_SCRIPT_GREEK: Noto2(Sans, Serif);
case UCDN_SCRIPT_CYRILLIC: Noto2(Sans, Serif);
+
+ case UCDN_SCRIPT_ARABIC:
+ if (language == FZ_LANG_ur || language == FZ_LANG_urd)
+ Noto(NastaliqUrdu);
+ Noto2(KufiArabic, NaskhArabic);
+
case UCDN_SCRIPT_ARMENIAN: Noto2(SansArmenian, SerifArmenian);
- case UCDN_SCRIPT_HEBREW: Noto(SansHebrew);
- case UCDN_SCRIPT_ARABIC: Noto3(KufiArabic, NaskhArabic, NastaliqUrdu);
- case UCDN_SCRIPT_SYRIAC: Noto3(SansSyriacEastern, SansSyriacWestern, SansSyriacEstrangela);
- case UCDN_SCRIPT_THAANA: Noto(SansThaana);
- case UCDN_SCRIPT_DEVANAGARI: Noto(SansDevanagari);
+ case UCDN_SCRIPT_BALINESE: Noto(SansBalinese);
+ case UCDN_SCRIPT_BAMUM: Noto(SansBamum);
+ case UCDN_SCRIPT_BATAK: Noto(SansBatak);
case UCDN_SCRIPT_BENGALI: Noto2(SansBengali, SerifBengali);
- case UCDN_SCRIPT_GURMUKHI: Noto(SansGurmukhi);
+ case UCDN_SCRIPT_CANADIAN_ABORIGINAL: Noto(SansCanadianAboriginal);
+ case UCDN_SCRIPT_CHAM: Noto(SansCham);
+ case UCDN_SCRIPT_CHEROKEE: Noto(SansCherokee);
+ case UCDN_SCRIPT_DEVANAGARI: Noto(SansDevanagari);
+ case UCDN_SCRIPT_ETHIOPIC: Noto(SansEthiopic);
+ case UCDN_SCRIPT_GEORGIAN: Noto2(SansGeorgian, SerifGeorgian);
case UCDN_SCRIPT_GUJARATI: Noto2(SansGujarati, SerifGujarati);
- case UCDN_SCRIPT_ORIYA: Noto(SansOriya);
- case UCDN_SCRIPT_TAMIL: Noto2(SansTamil, SerifTamil);
- case UCDN_SCRIPT_TELUGU: Noto2(SansTelugu, SerifTelugu);
+ case UCDN_SCRIPT_GURMUKHI: Noto(SansGurmukhi);
+ case UCDN_SCRIPT_HEBREW: Noto(SansHebrew);
+ case UCDN_SCRIPT_JAVANESE: Noto(SansJavanese);
case UCDN_SCRIPT_KANNADA: Noto2(SansKannada, SerifKannada);
+ case UCDN_SCRIPT_KAYAH_LI: Noto(SansKayahLi);
+ case UCDN_SCRIPT_KHMER: Noto2(SansKhmer, SerifKhmer);
+ case UCDN_SCRIPT_LAO: Noto2(SansLao, SerifLao);
+ case UCDN_SCRIPT_LEPCHA: Noto(SansLepcha);
+ case UCDN_SCRIPT_LIMBU: Noto(SansLimbu);
+ case UCDN_SCRIPT_LISU: Noto(SansLisu);
case UCDN_SCRIPT_MALAYALAM: Noto2(SansMalayalam, SerifMalayalam);
+ case UCDN_SCRIPT_MANDAIC: Noto(SansMandaic);
+ case UCDN_SCRIPT_MEETEI_MAYEK: Noto(SansMeeteiMayek);
+ case UCDN_SCRIPT_MONGOLIAN: Noto(SansMongolian);
+ case UCDN_SCRIPT_MYANMAR: Noto(SansMyanmar);
+ case UCDN_SCRIPT_NEW_TAI_LUE: Noto(SansNewTaiLue);
+ case UCDN_SCRIPT_NKO: Noto(SansNKo);
+ case UCDN_SCRIPT_OL_CHIKI: Noto(SansOlChiki);
+ case UCDN_SCRIPT_ORIYA: Noto(SansOriya);
+ case UCDN_SCRIPT_SAURASHTRA: Noto(SansSaurashtra);
case UCDN_SCRIPT_SINHALA: Noto(SansSinhala);
+ case UCDN_SCRIPT_SUNDANESE: Noto(SansSundanese);
+ case UCDN_SCRIPT_SYLOTI_NAGRI: Noto(SansSylotiNagri);
+ case UCDN_SCRIPT_SYRIAC: Noto(SansSyriacEastern);
+ case UCDN_SCRIPT_TAI_LE: Noto(SansTaiLe);
+ case UCDN_SCRIPT_TAI_THAM: Noto(SansTaiTham);
+ case UCDN_SCRIPT_TAI_VIET: Noto(SansTaiViet);
+ case UCDN_SCRIPT_TAMIL: Noto2(SansTamil, SerifTamil);
+ case UCDN_SCRIPT_TELUGU: Noto2(SansTelugu, SerifTelugu);
+ case UCDN_SCRIPT_THAANA: Noto(SansThaana);
case UCDN_SCRIPT_THAI: Noto2(SansThai, SerifThai);
- case UCDN_SCRIPT_LAO: Noto2(SansLao, SerifLao);
case UCDN_SCRIPT_TIBETAN: Noto(SansTibetan);
- case UCDN_SCRIPT_MYANMAR: Noto(SansMyanmar);
- case UCDN_SCRIPT_GEORGIAN: Noto2(SansGeorgian, SerifGeorgian);
- case UCDN_SCRIPT_ETHIOPIC: Noto(SansEthiopic);
- case UCDN_SCRIPT_CHEROKEE: Noto(SansCherokee);
- case UCDN_SCRIPT_CANADIAN_ABORIGINAL: Noto(SansCanadianAboriginal);
- case UCDN_SCRIPT_KHMER: Noto2(SansKhmer, SerifKhmer);
- case UCDN_SCRIPT_MONGOLIAN: Noto(SansMongolian);
+ case UCDN_SCRIPT_TIFINAGH: Noto(SansTifinagh);
+ case UCDN_SCRIPT_VAI: Noto(SansVai);
case UCDN_SCRIPT_YI: Noto(SansYi);
+
+#ifndef TOFU_HISTORIC
+ case UCDN_SCRIPT_AVESTAN: Noto(SansAvestan);
+ case UCDN_SCRIPT_BRAHMI: Noto(SansBrahmi);
+ case UCDN_SCRIPT_BUGINESE: Noto(SansBuginese);
+ case UCDN_SCRIPT_BUHID: Noto(SansBuhid);
+ case UCDN_SCRIPT_CARIAN: Noto(SansCarian);
+ case UCDN_SCRIPT_COPTIC: Noto(SansCoptic);
+ case UCDN_SCRIPT_CUNEIFORM: Noto(SansCuneiform);
+ case UCDN_SCRIPT_CYPRIOT: Noto(SansCypriot);
case UCDN_SCRIPT_DESERET: Noto(SansDeseret);
- case UCDN_SCRIPT_TAGALOG: Noto(SansTagalog);
+ case UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS: Noto(SansEgyptianHieroglyphs);
+ case UCDN_SCRIPT_GLAGOLITIC: Noto(SansGlagolitic);
+ case UCDN_SCRIPT_GOTHIC: Noto(SansGothic);
case UCDN_SCRIPT_HANUNOO: Noto(SansHanunoo);
- case UCDN_SCRIPT_BUHID: Noto(SansBuhid);
- case UCDN_SCRIPT_TAGBANWA: Noto(SansTagbanwa);
- case UCDN_SCRIPT_LIMBU: Noto(SansLimbu);
- case UCDN_SCRIPT_TAI_LE: Noto(SansTaiLe);
- case UCDN_SCRIPT_SHAVIAN: Noto(SansShavian);
+ case UCDN_SCRIPT_IMPERIAL_ARAMAIC: Noto(SansImperialAramaic);
+ case UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI: Noto(SansInscriptionalPahlavi);
+ case UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN: Noto(SansInscriptionalParthian);
+ case UCDN_SCRIPT_KAITHI: Noto(SansKaithi);
+ case UCDN_SCRIPT_KHAROSHTHI: Noto(SansKharoshthi);
+ case UCDN_SCRIPT_LINEAR_B: Noto(SansLinearB);
+ case UCDN_SCRIPT_LYCIAN: Noto(SansLycian);
+ case UCDN_SCRIPT_LYDIAN: Noto(SansLydian);
+ case UCDN_SCRIPT_OGHAM: Noto(SansOgham);
+ case UCDN_SCRIPT_OLD_ITALIC: Noto(SansOldItalic);
+ case UCDN_SCRIPT_OLD_PERSIAN: Noto(SansOldPersian);
+ case UCDN_SCRIPT_OLD_SOUTH_ARABIAN: Noto(SansOldSouthArabian);
+ case UCDN_SCRIPT_OLD_TURKIC: Noto(SansOldTurkic);
case UCDN_SCRIPT_OSMANYA: Noto(SansOsmanya);
- case UCDN_SCRIPT_BUGINESE: Noto(SansBuginese);
- case UCDN_SCRIPT_NEW_TAI_LUE: Noto(SansNewTaiLue);
- case UCDN_SCRIPT_TIFINAGH: Noto(SansTifinagh);
- case UCDN_SCRIPT_SYLOTI_NAGRI: Noto(SansSylotiNagri);
- case UCDN_SCRIPT_BALINESE: Noto(SansBalinese);
+ case UCDN_SCRIPT_PHAGS_PA: Noto(SansPhagsPa);
case UCDN_SCRIPT_PHOENICIAN: Noto(SansPhoenician);
- case UCDN_SCRIPT_NKO: Noto(SansNKo);
- case UCDN_SCRIPT_SUNDANESE: Noto(SansSundanese);
- case UCDN_SCRIPT_LEPCHA: Noto(SansLepcha);
- case UCDN_SCRIPT_OL_CHIKI: Noto(SansOlChiki);
- case UCDN_SCRIPT_VAI: Noto(SansVai);
- case UCDN_SCRIPT_SAURASHTRA: Noto(SansSaurashtra);
- case UCDN_SCRIPT_KAYAH_LI: Noto(SansKayahLi);
case UCDN_SCRIPT_REJANG: Noto(SansRejang);
- case UCDN_SCRIPT_CHAM: Noto(SansCham);
- case UCDN_SCRIPT_TAI_THAM: Noto(SansTaiTham);
- case UCDN_SCRIPT_TAI_VIET: Noto(SansTaiViet);
+ case UCDN_SCRIPT_RUNIC: Noto(SansRunic);
case UCDN_SCRIPT_SAMARITAN: Noto(SansSamaritan);
- case UCDN_SCRIPT_LISU: Noto(SansLisu);
- case UCDN_SCRIPT_BAMUM: Noto(SansBamum);
- case UCDN_SCRIPT_JAVANESE: Noto(SansJavanese);
- case UCDN_SCRIPT_MEETEI_MAYEK: Noto(SansMeeteiMayek);
- case UCDN_SCRIPT_BATAK: Noto(SansBatak);
- case UCDN_SCRIPT_BRAHMI: Noto(SansBrahmi);
- case UCDN_SCRIPT_MANDAIC: Noto(SansMandaic);
+ case UCDN_SCRIPT_SHAVIAN: Noto(SansShavian);
+ case UCDN_SCRIPT_TAGALOG: Noto(SansTagalog);
+ case UCDN_SCRIPT_TAGBANWA: Noto(SansTagbanwa);
+ case UCDN_SCRIPT_UGARITIC: Noto(SansUgaritic);
+#endif
/* No fonts available for these scripts: */
+ case UCDN_SCRIPT_BRAILLE: /* no dedicated font; fallback to NotoSansSymbols will cover this */
+ case UCDN_SCRIPT_CHAKMA: break;
+ case UCDN_SCRIPT_MIAO: break;
#ifndef TOFU_HISTORIC
case UCDN_SCRIPT_AHOM: break;
+ case UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS: break;
case UCDN_SCRIPT_BASSA_VAH: break;
+ case UCDN_SCRIPT_CAUCASIAN_ALBANIAN: break;
+ case UCDN_SCRIPT_DUPLOYAN: break;
case UCDN_SCRIPT_ELBASAN: break;
case UCDN_SCRIPT_GRANTHA: break;
case UCDN_SCRIPT_HATRAN: break;
- case UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS: break;
- case UCDN_SCRIPT_OLD_HUNGARIAN: break;
case UCDN_SCRIPT_KHOJKI: break;
+ case UCDN_SCRIPT_KHUDAWADI: break;
case UCDN_SCRIPT_LINEAR_A: break;
case UCDN_SCRIPT_MAHAJANI: break;
case UCDN_SCRIPT_MANICHAEAN: break;
+ case UCDN_SCRIPT_MENDE_KIKAKUI: break;
case UCDN_SCRIPT_MEROITIC_CURSIVE: break;
case UCDN_SCRIPT_MEROITIC_HIEROGLYPHS: break;
case UCDN_SCRIPT_MODI: break;
+ case UCDN_SCRIPT_MRO: break;
case UCDN_SCRIPT_MULTANI: break;
- case UCDN_SCRIPT_OLD_NORTH_ARABIAN: break;
case UCDN_SCRIPT_NABATAEAN: break;
- case UCDN_SCRIPT_PALMYRENE: break;
+ case UCDN_SCRIPT_OLD_HUNGARIAN: break;
+ case UCDN_SCRIPT_OLD_NORTH_ARABIAN: break;
case UCDN_SCRIPT_OLD_PERMIC: break;
+ case UCDN_SCRIPT_PAHAWH_HMONG: break;
+ case UCDN_SCRIPT_PALMYRENE: break;
+ case UCDN_SCRIPT_PAU_CIN_HAU: break;
case UCDN_SCRIPT_PSALTER_PAHLAVI: break;
- case UCDN_SCRIPT_SIDDHAM: break;
-#endif
- case UCDN_SCRIPT_BRAILLE: break; /* no dedicated font */
- case UCDN_SCRIPT_CHAKMA: break;
- case UCDN_SCRIPT_MIAO: break;
case UCDN_SCRIPT_SHARADA: break;
+ case UCDN_SCRIPT_SIDDHAM: break;
+ case UCDN_SCRIPT_SIGNWRITING: break;
case UCDN_SCRIPT_SORA_SOMPENG: break;
case UCDN_SCRIPT_TAKRI: break;
- case UCDN_SCRIPT_CAUCASIAN_ALBANIAN: break;
- case UCDN_SCRIPT_DUPLOYAN: break;
- case UCDN_SCRIPT_KHUDAWADI: break;
- case UCDN_SCRIPT_MENDE_KIKAKUI: break;
- case UCDN_SCRIPT_MRO: break;
- case UCDN_SCRIPT_PAHAWH_HMONG: break;
- case UCDN_SCRIPT_PAU_CIN_HAU: break;
case UCDN_SCRIPT_TIRHUTA: break;
case UCDN_SCRIPT_WARANG_CITI: break;
- case UCDN_SCRIPT_SIGNWRITING: break;
+#endif
#endif
}
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;
}