| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- // Copyright (C) 2004-2025 Artifex Software, Inc.
- //
- // This file is part of MuPDF.
- //
- // MuPDF is free software: you can redistribute it and/or modify it under the
- // terms of the GNU Affero General Public License as published by the Free
- // Software Foundation, either version 3 of the License, or (at your option)
- // any later version.
- //
- // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
- // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
- // details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
- //
- // Alternative licensing terms are available from the licensor.
- // For commercial licensing, see <https://www.artifex.com/> or contact
- // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
- // CA 94129, USA, for further information.
- #include "mupdf/fitz.h"
- #include "mupdf/ucdn.h"
- #include <string.h>
- /*
- Base 14 PDF fonts from URW.
- Noto fonts from Google.
- Source Han Serif from Adobe for CJK.
- DroidSansFallback from Android for CJK.
- Charis SIL from SIL.
- Define TOFU to only include the Base14 and CJK fonts.
- Define TOFU_CJK_LANG to skip Source Han Serif per-language fonts.
- Define TOFU_CJK_EXT to skip DroidSansFallbackFull (and the above).
- Define TOFU_CJK to skip DroidSansFallback (and the above).
- Define TOFU_NOTO to skip ALL non-CJK noto fonts.
- Define TOFU_SYMBOL to skip symbol fonts.
- Define TOFU_EMOJI to skip emoji/extended symbol font.
- Define TOFU_SIL to skip the SIL fonts (warning: makes EPUB documents ugly).
- Define TOFU_BASE14 to skip the Base 14 fonts (warning: makes PDF unusable).
- */
- #ifdef NOTO_SMALL
- #define TOFU_CJK_EXT
- #define TOFU_SYMBOL
- #define TOFU_EMOJI
- #define TOFU_SIL
- #endif
- #ifdef NO_CJK
- #define TOFU_CJK
- #endif
- #ifdef TOFU
- #define TOFU_NOTO
- #define TOFU_SIL
- #endif
- #ifdef TOFU_NOTO
- #define TOFU_SYMBOL
- #define TOFU_EMOJI
- #endif
- /* This historic script has an unusually large font (2MB), so we skip it by default. */
- #ifndef NOTO_TANGUT
- #define NOTO_TANGUT 0
- #endif
- /* Define some extra scripts for special fonts. */
- enum
- {
- MUPDF_SCRIPT_MUSIC = UCDN_LAST_SCRIPT+1,
- MUPDF_SCRIPT_MATH,
- MUPDF_SCRIPT_SYMBOLS,
- MUPDF_SCRIPT_SYMBOLS2,
- MUPDF_SCRIPT_EMOJI,
- MUPDF_SCRIPT_CJKV
- };
- enum
- {
- BOLD = 1,
- ITALIC = 2
- };
- typedef struct
- {
- const unsigned char *data;
- #ifdef HAVE_OBJCOPY
- const unsigned char *start;
- const unsigned char *end;
- #define INBUILT_SIZE(e) (e->end - e->start)
- #else
- const unsigned int *size;
- #define INBUILT_SIZE(e) (e->size ? *e->size : 0)
- #endif
- char family[48];
- int script;
- int lang;
- int subfont;
- int attr;
- } font_entry;
- #define END_OF_DATA -2
- #define ANY_SCRIPT -1
- #define NO_SUBFONT 0
- #define REGULAR 0
- /* First, declare all the fonts. */
- #ifdef HAVE_OBJCOPY
- #define FONT(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) \
- extern const unsigned char _binary_resources_fonts_##FORGE##_##NAME##_start; \
- extern const unsigned char _binary_resources_fonts_##FORGE##_##NAME##_end;
- #else
- #define FONT(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) \
- extern const unsigned char _binary_##NAME[];\
- extern const unsigned int _binary_##NAME##_size;
- #endif
- #define ALIAS(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR)
- #define EMPTY(SCRIPT)
- #include "font-table.h"
- #undef FONT
- #undef ALIAS
- #undef EMPTY
- /* Now the actual list. */
- #ifdef HAVE_OBJCOPY
- #define FONT_DATA(FORGE,NAME) &_binary_resources_fonts_##FORGE##_##NAME##_start
- #define FONT_SIZE(FORGE,NAME) &_binary_resources_fonts_##FORGE##_##NAME##_start, &_binary_resources_fonts_##FORGE##_##NAME##_end
- #define EMPTY(SCRIPT) { NULL, NULL, NULL, "", SCRIPT, FZ_LANG_UNSET, NO_SUBFONT, REGULAR },
- #else
- #define FONT_DATA(FORGE,NAME) _binary_##NAME
- #define FONT_SIZE(FORCE,NAME) &_binary_##NAME##_size
- #define EMPTY(SCRIPT) { NULL, 0, "", SCRIPT, FZ_LANG_UNSET, NO_SUBFONT, REGULAR },
- #endif
- #define FONT(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) { FONT_DATA(FORGE, NAME), FONT_SIZE(FORGE, NAME), NAME2, SCRIPT, LANG, SUBFONT, ATTR },
- #define ALIAS(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) { FONT_DATA(FORGE, NAME), FONT_SIZE(FORGE, NAME), NAME2, SCRIPT, LANG, SUBFONT, ATTR },
- static font_entry inbuilt_fonts[] =
- {
- #include "font-table.h"
- { NULL,
- #ifdef HAVE_OBJCOPY
- NULL, NULL,
- #else
- 0,
- #endif
- "", END_OF_DATA, FZ_LANG_UNSET, NO_SUBFONT, REGULAR }
- };
- #undef FONT
- #undef ALIAS
- #undef EMPTY
- #undef FONT_DATA
- #undef FONT_SIZE
- static const unsigned char *
- search_by_script_lang_strict(int *size, int *subfont, int script, int language)
- {
- /* Search in the inbuilt font table. */
- font_entry *e;
- if (subfont)
- *subfont = 0;
- for (e = inbuilt_fonts; e->script != END_OF_DATA; e++)
- {
- if (script != ANY_SCRIPT && e->script != script)
- continue;
- if (e->lang != language)
- continue;
- *size = INBUILT_SIZE(e);
- if (subfont)
- *subfont = e->subfont;
- return e->data;
- }
- return *size = 0, NULL;
- }
- static const unsigned char *
- search_by_script_lang(int *size, int *subfont, int script, int language)
- {
- const unsigned char *result;
- result = search_by_script_lang_strict(size, subfont, script, language);
- if (!result && language != FZ_LANG_UNSET)
- result = search_by_script_lang_strict(size, subfont, script, FZ_LANG_UNSET);
- return result;
- }
- static const unsigned char *
- search_by_family(int *size, const char *family, int attr)
- {
- /* Search in the inbuilt font table. */
- font_entry *e;
- for (e = inbuilt_fonts; e->script != END_OF_DATA; e++)
- {
- if (e->family[0] == '\0')
- continue;
- if (attr != e->attr)
- continue;
- if (!fz_strcasecmp(e->family, family))
- {
- *size = INBUILT_SIZE(e);
- return e->data;
- }
- }
- return *size = 0, NULL;
- }
- const unsigned char *
- fz_lookup_base14_font(fz_context *ctx, const char *name, int *size)
- {
- /* We want to insist on the base14 name matching exactly,
- * so we check that here first, before we look in the font table
- * to see if we actually have data. */
- if (!strcmp(name, "Courier"))
- return search_by_family(size, "Courier", REGULAR);
- if (!strcmp(name, "Courier-Oblique"))
- return search_by_family(size, "Courier", ITALIC);
- if (!strcmp(name, "Courier-Bold"))
- return search_by_family(size, "Courier", BOLD);
- if (!strcmp(name, "Courier-BoldOblique"))
- return search_by_family(size, "Courier", BOLD|ITALIC);
- if (!strcmp(name, "Helvetica"))
- return search_by_family(size, "Helvetica", REGULAR);
- if (!strcmp(name, "Helvetica-Oblique"))
- return search_by_family(size, "Helvetica", ITALIC);
- if (!strcmp(name, "Helvetica-Bold"))
- return search_by_family(size, "Helvetica", BOLD);
- if (!strcmp(name, "Helvetica-BoldOblique"))
- return search_by_family(size, "Helvetica", BOLD|ITALIC);
- if (!strcmp(name, "Times-Roman"))
- return search_by_family(size, "Times", REGULAR);
- if (!strcmp(name, "Times-Italic"))
- return search_by_family(size, "Times", ITALIC);
- if (!strcmp(name, "Times-Bold"))
- return search_by_family(size, "Times", BOLD);
- if (!strcmp(name, "Times-BoldItalic"))
- return search_by_family(size, "Times", BOLD|ITALIC);
- if (!strcmp(name, "Symbol"))
- return search_by_family(size, "Symbol", REGULAR);
- if (!strcmp(name, "ZapfDingbats"))
- return search_by_family(size, "ZapfDingbats", REGULAR);
- *size = 0;
- return NULL;
- }
- const unsigned char *
- fz_lookup_builtin_font(fz_context *ctx, const char *family, int is_bold, int is_italic, int *size)
- {
- return search_by_family(size, family, (is_bold ? BOLD : 0) | (is_italic ? ITALIC : 0));
- }
- const unsigned char *
- fz_lookup_cjk_font(fz_context *ctx, int ordering, int *size, int *subfont)
- {
- int lang = FZ_LANG_UNSET;
- switch (ordering)
- {
- case FZ_ADOBE_JAPAN: lang = FZ_LANG_ja; break;
- case FZ_ADOBE_KOREA: lang = FZ_LANG_ko; break;
- case FZ_ADOBE_GB: lang = FZ_LANG_zh_Hans; break;
- case FZ_ADOBE_CNS: lang = FZ_LANG_zh_Hant; break;
- }
- return search_by_script_lang(size, subfont, UCDN_SCRIPT_HAN, lang);
- }
- int
- fz_lookup_cjk_ordering_by_language(const char *lang)
- {
- if (!strcmp(lang, "zh-Hant")) return FZ_ADOBE_CNS;
- if (!strcmp(lang, "zh-TW")) return FZ_ADOBE_CNS;
- if (!strcmp(lang, "zh-HK")) return FZ_ADOBE_CNS;
- if (!strcmp(lang, "zh-Hans")) return FZ_ADOBE_GB;
- if (!strcmp(lang, "zh-CN")) return FZ_ADOBE_GB;
- if (!strcmp(lang, "ja")) return FZ_ADOBE_JAPAN;
- if (!strcmp(lang, "ko")) return FZ_ADOBE_KOREA;
- return -1;
- }
- static int
- fz_lookup_cjk_language(const char *lang)
- {
- if (!strcmp(lang, "zh-Hant")) return FZ_LANG_zh_Hant;
- if (!strcmp(lang, "zh-TW")) return FZ_LANG_zh_Hant;
- if (!strcmp(lang, "zh-HK")) return FZ_LANG_zh_Hant;
- if (!strcmp(lang, "zh-Hans")) return FZ_LANG_zh_Hans;
- if (!strcmp(lang, "zh-CN")) return FZ_LANG_zh_Hans;
- if (!strcmp(lang, "ja")) return FZ_LANG_ja;
- if (!strcmp(lang, "ko")) return FZ_LANG_ko;
- return FZ_LANG_UNSET;
- }
- const unsigned char *
- fz_lookup_cjk_font_by_language(fz_context *ctx, const char *lang, int *size, int *subfont)
- {
- return search_by_script_lang(size, subfont, UCDN_SCRIPT_HAN, fz_lookup_cjk_language(lang));
- }
- const unsigned char *
- fz_lookup_noto_font(fz_context *ctx, int script, int language, int *size, int *subfont)
- {
- return search_by_script_lang(size, subfont, script, language);
- }
- const unsigned char *
- fz_lookup_noto_math_font(fz_context *ctx, int *size)
- {
- return search_by_script_lang(size, NULL, MUPDF_SCRIPT_MATH, FZ_LANG_UNSET);
- }
- const unsigned char *
- fz_lookup_noto_music_font(fz_context *ctx, int *size)
- {
- return search_by_script_lang(size, NULL, MUPDF_SCRIPT_MUSIC, FZ_LANG_UNSET);
- }
- const unsigned char *
- fz_lookup_noto_symbol1_font(fz_context *ctx, int *size)
- {
- return search_by_script_lang(size, NULL, MUPDF_SCRIPT_SYMBOLS, FZ_LANG_UNSET);
- }
- const unsigned char *
- fz_lookup_noto_symbol2_font(fz_context *ctx, int *size)
- {
- return search_by_script_lang(size, NULL, MUPDF_SCRIPT_SYMBOLS2, FZ_LANG_UNSET);
- }
- const unsigned char *
- fz_lookup_noto_emoji_font(fz_context *ctx, int *size)
- {
- return search_by_script_lang(size, NULL, MUPDF_SCRIPT_EMOJI, FZ_LANG_UNSET);
- }
- const unsigned char *
- fz_lookup_noto_boxes_font(fz_context *ctx, int *size)
- {
- return search_by_family(size, "Nimbus Boxes", REGULAR);
- }
- const char *
- fz_lookup_noto_stem_from_script(fz_context *ctx, int script, int language)
- {
- switch (script)
- {
- default:
- case UCDN_SCRIPT_COMMON:
- case UCDN_SCRIPT_INHERITED:
- case UCDN_SCRIPT_UNKNOWN:
- return NULL;
- case UCDN_SCRIPT_HANGUL: return "KR";
- case UCDN_SCRIPT_HIRAGANA: return "JP";
- case UCDN_SCRIPT_KATAKANA: return "JP";
- case UCDN_SCRIPT_BOPOMOFO: return "TC";
- case UCDN_SCRIPT_HAN:
- switch (language)
- {
- case FZ_LANG_ja: return "JP";
- case FZ_LANG_ko: return "KR";
- case FZ_LANG_zh_Hans: return "SC";
- default:
- case FZ_LANG_zh_Hant: return "TC";
- }
- case UCDN_SCRIPT_LATIN: return "";
- case UCDN_SCRIPT_GREEK: return "";
- case UCDN_SCRIPT_CYRILLIC: return "";
- case UCDN_SCRIPT_ARABIC: return "Naskh";
- case UCDN_SCRIPT_ARMENIAN: return "Armenian";
- case UCDN_SCRIPT_HEBREW: return "Hebrew";
- case UCDN_SCRIPT_SYRIAC: return "Syriac";
- case UCDN_SCRIPT_THAANA: return "Thaana";
- case UCDN_SCRIPT_DEVANAGARI: return "Devanagari";
- case UCDN_SCRIPT_BENGALI: return "Bengali";
- case UCDN_SCRIPT_GURMUKHI: return "Gurmukhi";
- case UCDN_SCRIPT_GUJARATI: return "Gujarati";
- case UCDN_SCRIPT_ORIYA: return "Oriya";
- case UCDN_SCRIPT_TAMIL: return "Tamil";
- case UCDN_SCRIPT_TELUGU: return "Telugu";
- case UCDN_SCRIPT_KANNADA: return "Kannada";
- case UCDN_SCRIPT_MALAYALAM: return "Malayalam";
- case UCDN_SCRIPT_SINHALA: return "Sinhala";
- case UCDN_SCRIPT_THAI: return "Thai";
- case UCDN_SCRIPT_LAO: return "Lao";
- case UCDN_SCRIPT_TIBETAN: return "Tibetan";
- case UCDN_SCRIPT_MYANMAR: return "Myanmar";
- case UCDN_SCRIPT_GEORGIAN: return "Georgian";
- case UCDN_SCRIPT_ETHIOPIC: return "Ethiopic";
- case UCDN_SCRIPT_CHEROKEE: return "Cherokee";
- case UCDN_SCRIPT_CANADIAN_ABORIGINAL: return "CanadianAboriginal";
- case UCDN_SCRIPT_OGHAM: return "Ogham";
- case UCDN_SCRIPT_RUNIC: return "Runic";
- case UCDN_SCRIPT_KHMER: return "Khmer";
- case UCDN_SCRIPT_MONGOLIAN: return "Mongolian";
- case UCDN_SCRIPT_YI: return "Yi";
- case UCDN_SCRIPT_OLD_ITALIC: return "OldItalic";
- case UCDN_SCRIPT_GOTHIC: return "Gothic";
- case UCDN_SCRIPT_DESERET: return "Deseret";
- case UCDN_SCRIPT_TAGALOG: return "Tagalog";
- case UCDN_SCRIPT_HANUNOO: return "Hanunoo";
- case UCDN_SCRIPT_BUHID: return "Buhid";
- case UCDN_SCRIPT_TAGBANWA: return "Tagbanwa";
- case UCDN_SCRIPT_LIMBU: return "Limbu";
- case UCDN_SCRIPT_TAI_LE: return "TaiLe";
- case UCDN_SCRIPT_LINEAR_B: return "LinearB";
- case UCDN_SCRIPT_UGARITIC: return "Ugaritic";
- case UCDN_SCRIPT_SHAVIAN: return "Shavian";
- case UCDN_SCRIPT_OSMANYA: return "Osmanya";
- case UCDN_SCRIPT_CYPRIOT: return "Cypriot";
- case UCDN_SCRIPT_BUGINESE: return "Buginese";
- case UCDN_SCRIPT_COPTIC: return "Coptic";
- case UCDN_SCRIPT_NEW_TAI_LUE: return "NewTaiLue";
- case UCDN_SCRIPT_GLAGOLITIC: return "Glagolitic";
- case UCDN_SCRIPT_TIFINAGH: return "Tifinagh";
- case UCDN_SCRIPT_SYLOTI_NAGRI: return "SylotiNagri";
- case UCDN_SCRIPT_OLD_PERSIAN: return "OldPersian";
- case UCDN_SCRIPT_KHAROSHTHI: return "Kharoshthi";
- case UCDN_SCRIPT_BALINESE: return "Balinese";
- case UCDN_SCRIPT_CUNEIFORM: return "Cuneiform";
- case UCDN_SCRIPT_PHOENICIAN: return "Phoenician";
- case UCDN_SCRIPT_PHAGS_PA: return "PhagsPa";
- case UCDN_SCRIPT_NKO: return "NKo";
- case UCDN_SCRIPT_SUNDANESE: return "Sundanese";
- case UCDN_SCRIPT_LEPCHA: return "Lepcha";
- case UCDN_SCRIPT_OL_CHIKI: return "OlChiki";
- case UCDN_SCRIPT_VAI: return "Vai";
- case UCDN_SCRIPT_SAURASHTRA: return "Saurashtra";
- case UCDN_SCRIPT_KAYAH_LI: return "KayahLi";
- case UCDN_SCRIPT_REJANG: return "Rejang";
- case UCDN_SCRIPT_LYCIAN: return "Lycian";
- case UCDN_SCRIPT_CARIAN: return "Carian";
- case UCDN_SCRIPT_LYDIAN: return "Lydian";
- case UCDN_SCRIPT_CHAM: return "Cham";
- case UCDN_SCRIPT_TAI_THAM: return "TaiTham";
- case UCDN_SCRIPT_TAI_VIET: return "TaiViet";
- case UCDN_SCRIPT_AVESTAN: return "Avestan";
- case UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS: return "EgyptianHieroglyphs";
- case UCDN_SCRIPT_SAMARITAN: return "Samaritan";
- case UCDN_SCRIPT_LISU: return "Lisu";
- case UCDN_SCRIPT_BAMUM: return "Bamum";
- case UCDN_SCRIPT_JAVANESE: return "Javanese";
- case UCDN_SCRIPT_MEETEI_MAYEK: return "MeeteiMayek";
- case UCDN_SCRIPT_IMPERIAL_ARAMAIC: return "ImperialAramaic";
- case UCDN_SCRIPT_OLD_SOUTH_ARABIAN: return "OldSouthArabian";
- case UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN: return "InscriptionalParthian";
- case UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI: return "InscriptionalPahlavi";
- case UCDN_SCRIPT_OLD_TURKIC: return "OldTurkic";
- case UCDN_SCRIPT_KAITHI: return "Kaithi";
- case UCDN_SCRIPT_BATAK: return "Batak";
- case UCDN_SCRIPT_BRAHMI: return "Brahmi";
- case UCDN_SCRIPT_MANDAIC: return "Mandaic";
- case UCDN_SCRIPT_CHAKMA: return "Chakma";
- case UCDN_SCRIPT_MEROITIC_CURSIVE: return "Meroitic";
- case UCDN_SCRIPT_MEROITIC_HIEROGLYPHS: return "Meroitic";
- case UCDN_SCRIPT_MIAO: return "Miao";
- case UCDN_SCRIPT_SHARADA: return "Sharada";
- case UCDN_SCRIPT_SORA_SOMPENG: return "SoraSompeng";
- case UCDN_SCRIPT_TAKRI: return "Takri";
- case UCDN_SCRIPT_BASSA_VAH: return "BassaVah";
- case UCDN_SCRIPT_CAUCASIAN_ALBANIAN: return "CaucasianAlbanian";
- case UCDN_SCRIPT_DUPLOYAN: return "Duployan";
- case UCDN_SCRIPT_ELBASAN: return "Elbasan";
- case UCDN_SCRIPT_GRANTHA: return "Grantha";
- case UCDN_SCRIPT_KHOJKI: return "Khojki";
- case UCDN_SCRIPT_KHUDAWADI: return "Khudawadi";
- case UCDN_SCRIPT_LINEAR_A: return "LinearA";
- case UCDN_SCRIPT_MAHAJANI: return "Mahajani";
- case UCDN_SCRIPT_MANICHAEAN: return "Manichaean";
- case UCDN_SCRIPT_MENDE_KIKAKUI: return "MendeKikakui";
- case UCDN_SCRIPT_MODI: return "Modi";
- case UCDN_SCRIPT_MRO: return "Mro";
- case UCDN_SCRIPT_NABATAEAN: return "Nabataean";
- case UCDN_SCRIPT_OLD_NORTH_ARABIAN: return "OldNorthArabian";
- case UCDN_SCRIPT_OLD_PERMIC: return "OldPermic";
- case UCDN_SCRIPT_PAHAWH_HMONG: return "PahawhHmong";
- case UCDN_SCRIPT_PALMYRENE: return "Palmyrene";
- case UCDN_SCRIPT_PAU_CIN_HAU: return "PauCinHau";
- case UCDN_SCRIPT_PSALTER_PAHLAVI: return "PsalterPahlavi";
- case UCDN_SCRIPT_SIDDHAM: return "Siddham";
- case UCDN_SCRIPT_TIRHUTA: return "Tirhuta";
- case UCDN_SCRIPT_WARANG_CITI: return "WarangCiti";
- case UCDN_SCRIPT_AHOM: return "Ahom";
- case UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS: return "AnatolianHieroglyphs";
- case UCDN_SCRIPT_HATRAN: return "Hatran";
- case UCDN_SCRIPT_MULTANI: return "Multani";
- case UCDN_SCRIPT_OLD_HUNGARIAN: return "OldHungarian";
- case UCDN_SCRIPT_SIGNWRITING: return "SignWriting";
- case UCDN_SCRIPT_ADLAM: return "Adlam";
- case UCDN_SCRIPT_BHAIKSUKI: return "Bhaiksuki";
- case UCDN_SCRIPT_MARCHEN: return "Marchen";
- case UCDN_SCRIPT_NEWA: return "Newa";
- case UCDN_SCRIPT_OSAGE: return "Osage";
- case UCDN_SCRIPT_TANGUT: return "Tangut";
- case UCDN_SCRIPT_MASARAM_GONDI: return "MasaramGondi";
- case UCDN_SCRIPT_NUSHU: return "Nushu";
- case UCDN_SCRIPT_SOYOMBO: return "Soyombo";
- case UCDN_SCRIPT_ZANABAZAR_SQUARE: return "ZanabazarSquare";
- case UCDN_SCRIPT_DOGRA: return "Dogra";
- case UCDN_SCRIPT_GUNJALA_GONDI: return "GunjalaGondi";
- case UCDN_SCRIPT_HANIFI_ROHINGYA: return "HanifiRohingya";
- case UCDN_SCRIPT_MAKASAR: return "Makasar";
- case UCDN_SCRIPT_MEDEFAIDRIN: return "Medefaidrin";
- case UCDN_SCRIPT_OLD_SOGDIAN: return "OldSogdian";
- case UCDN_SCRIPT_SOGDIAN: return "Sogdian";
- case UCDN_SCRIPT_ELYMAIC: return "Elymaic";
- case UCDN_SCRIPT_NANDINAGARI: return "Nandinagari";
- case UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONG: return "NyiakengPuachueHmong";
- case UCDN_SCRIPT_WANCHO: return "Wancho";
- case UCDN_SCRIPT_CHORASMIAN: return "Chorasmian";
- case UCDN_SCRIPT_DIVES_AKURU: return "DivesAkuru";
- case UCDN_SCRIPT_KHITAN_SMALL_SCRIPT: return "KhitanSmallScript";
- case UCDN_SCRIPT_YEZIDI: return "Yezidi";
- case UCDN_SCRIPT_VITHKUQI: return "Vithkuqi";
- case UCDN_SCRIPT_OLD_UYGHUR: return "OldUyghur";
- case UCDN_SCRIPT_CYPRO_MINOAN: return "CyproMinoan";
- case UCDN_SCRIPT_TANGSA: return "Tangsa";
- case UCDN_SCRIPT_TOTO: return "Toto";
- case UCDN_SCRIPT_KAWI: return "Kawi";
- case UCDN_SCRIPT_NAG_MUNDARI: return "NagMundari";
- }
- }
- const char *
- fz_lookup_script_name(fz_context *ctx, int script, int language)
- {
- switch (script) {
- case UCDN_SCRIPT_COMMON:
- case UCDN_SCRIPT_INHERITED:
- case UCDN_SCRIPT_UNKNOWN:
- return "Common";
- case UCDN_SCRIPT_LATIN: return "Latin";
- case UCDN_SCRIPT_GREEK: return "Greek";
- case UCDN_SCRIPT_CYRILLIC: return "Cyrillic";
- case UCDN_SCRIPT_ARABIC: return "Arabic";
- default: return fz_lookup_noto_stem_from_script(ctx, script, language);
- }
- }
|