Mercurial > hgrepos > Python2 > PyMuPDF
comparison mupdf-source/source/fitz/noto.c @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:1d09e1dec1d9 | 2:b50eed0cc0ef |
|---|---|
| 1 // Copyright (C) 2004-2025 Artifex Software, Inc. | |
| 2 // | |
| 3 // This file is part of MuPDF. | |
| 4 // | |
| 5 // MuPDF is free software: you can redistribute it and/or modify it under the | |
| 6 // terms of the GNU Affero General Public License as published by the Free | |
| 7 // Software Foundation, either version 3 of the License, or (at your option) | |
| 8 // any later version. | |
| 9 // | |
| 10 // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY | |
| 11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 12 // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more | |
| 13 // details. | |
| 14 // | |
| 15 // You should have received a copy of the GNU Affero General Public License | |
| 16 // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html> | |
| 17 // | |
| 18 // Alternative licensing terms are available from the licensor. | |
| 19 // For commercial licensing, see <https://www.artifex.com/> or contact | |
| 20 // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, | |
| 21 // CA 94129, USA, for further information. | |
| 22 | |
| 23 #include "mupdf/fitz.h" | |
| 24 #include "mupdf/ucdn.h" | |
| 25 | |
| 26 #include <string.h> | |
| 27 | |
| 28 /* | |
| 29 Base 14 PDF fonts from URW. | |
| 30 Noto fonts from Google. | |
| 31 Source Han Serif from Adobe for CJK. | |
| 32 DroidSansFallback from Android for CJK. | |
| 33 Charis SIL from SIL. | |
| 34 | |
| 35 Define TOFU to only include the Base14 and CJK fonts. | |
| 36 | |
| 37 Define TOFU_CJK_LANG to skip Source Han Serif per-language fonts. | |
| 38 Define TOFU_CJK_EXT to skip DroidSansFallbackFull (and the above). | |
| 39 Define TOFU_CJK to skip DroidSansFallback (and the above). | |
| 40 | |
| 41 Define TOFU_NOTO to skip ALL non-CJK noto fonts. | |
| 42 Define TOFU_SYMBOL to skip symbol fonts. | |
| 43 Define TOFU_EMOJI to skip emoji/extended symbol font. | |
| 44 | |
| 45 Define TOFU_SIL to skip the SIL fonts (warning: makes EPUB documents ugly). | |
| 46 Define TOFU_BASE14 to skip the Base 14 fonts (warning: makes PDF unusable). | |
| 47 */ | |
| 48 | |
| 49 #ifdef NOTO_SMALL | |
| 50 #define TOFU_CJK_EXT | |
| 51 #define TOFU_SYMBOL | |
| 52 #define TOFU_EMOJI | |
| 53 #define TOFU_SIL | |
| 54 #endif | |
| 55 | |
| 56 #ifdef NO_CJK | |
| 57 #define TOFU_CJK | |
| 58 #endif | |
| 59 | |
| 60 #ifdef TOFU | |
| 61 #define TOFU_NOTO | |
| 62 #define TOFU_SIL | |
| 63 #endif | |
| 64 | |
| 65 #ifdef TOFU_NOTO | |
| 66 #define TOFU_SYMBOL | |
| 67 #define TOFU_EMOJI | |
| 68 #endif | |
| 69 | |
| 70 /* This historic script has an unusually large font (2MB), so we skip it by default. */ | |
| 71 #ifndef NOTO_TANGUT | |
| 72 #define NOTO_TANGUT 0 | |
| 73 #endif | |
| 74 | |
| 75 /* Define some extra scripts for special fonts. */ | |
| 76 enum | |
| 77 { | |
| 78 MUPDF_SCRIPT_MUSIC = UCDN_LAST_SCRIPT+1, | |
| 79 MUPDF_SCRIPT_MATH, | |
| 80 MUPDF_SCRIPT_SYMBOLS, | |
| 81 MUPDF_SCRIPT_SYMBOLS2, | |
| 82 MUPDF_SCRIPT_EMOJI, | |
| 83 MUPDF_SCRIPT_CJKV | |
| 84 }; | |
| 85 | |
| 86 enum | |
| 87 { | |
| 88 BOLD = 1, | |
| 89 ITALIC = 2 | |
| 90 }; | |
| 91 | |
| 92 typedef struct | |
| 93 { | |
| 94 const unsigned char *data; | |
| 95 #ifdef HAVE_OBJCOPY | |
| 96 const unsigned char *start; | |
| 97 const unsigned char *end; | |
| 98 #define INBUILT_SIZE(e) (e->end - e->start) | |
| 99 #else | |
| 100 const unsigned int *size; | |
| 101 #define INBUILT_SIZE(e) (e->size ? *e->size : 0) | |
| 102 #endif | |
| 103 char family[48]; | |
| 104 int script; | |
| 105 int lang; | |
| 106 int subfont; | |
| 107 int attr; | |
| 108 } font_entry; | |
| 109 | |
| 110 #define END_OF_DATA -2 | |
| 111 #define ANY_SCRIPT -1 | |
| 112 #define NO_SUBFONT 0 | |
| 113 #define REGULAR 0 | |
| 114 | |
| 115 /* First, declare all the fonts. */ | |
| 116 #ifdef HAVE_OBJCOPY | |
| 117 #define FONT(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) \ | |
| 118 extern const unsigned char _binary_resources_fonts_##FORGE##_##NAME##_start; \ | |
| 119 extern const unsigned char _binary_resources_fonts_##FORGE##_##NAME##_end; | |
| 120 #else | |
| 121 #define FONT(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) \ | |
| 122 extern const unsigned char _binary_##NAME[];\ | |
| 123 extern const unsigned int _binary_##NAME##_size; | |
| 124 #endif | |
| 125 #define ALIAS(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) | |
| 126 #define EMPTY(SCRIPT) | |
| 127 | |
| 128 #include "font-table.h" | |
| 129 | |
| 130 #undef FONT | |
| 131 #undef ALIAS | |
| 132 #undef EMPTY | |
| 133 | |
| 134 /* Now the actual list. */ | |
| 135 #ifdef HAVE_OBJCOPY | |
| 136 #define FONT_DATA(FORGE,NAME) &_binary_resources_fonts_##FORGE##_##NAME##_start | |
| 137 #define FONT_SIZE(FORGE,NAME) &_binary_resources_fonts_##FORGE##_##NAME##_start, &_binary_resources_fonts_##FORGE##_##NAME##_end | |
| 138 #define EMPTY(SCRIPT) { NULL, NULL, NULL, "", SCRIPT, FZ_LANG_UNSET, NO_SUBFONT, REGULAR }, | |
| 139 #else | |
| 140 #define FONT_DATA(FORGE,NAME) _binary_##NAME | |
| 141 #define FONT_SIZE(FORCE,NAME) &_binary_##NAME##_size | |
| 142 #define EMPTY(SCRIPT) { NULL, 0, "", SCRIPT, FZ_LANG_UNSET, NO_SUBFONT, REGULAR }, | |
| 143 #endif | |
| 144 | |
| 145 #define FONT(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) { FONT_DATA(FORGE, NAME), FONT_SIZE(FORGE, NAME), NAME2, SCRIPT, LANG, SUBFONT, ATTR }, | |
| 146 #define ALIAS(FORGE,NAME,NAME2,SCRIPT,LANG,SUBFONT,ATTR) { FONT_DATA(FORGE, NAME), FONT_SIZE(FORGE, NAME), NAME2, SCRIPT, LANG, SUBFONT, ATTR }, | |
| 147 static font_entry inbuilt_fonts[] = | |
| 148 { | |
| 149 #include "font-table.h" | |
| 150 { NULL, | |
| 151 #ifdef HAVE_OBJCOPY | |
| 152 NULL, NULL, | |
| 153 #else | |
| 154 0, | |
| 155 #endif | |
| 156 "", END_OF_DATA, FZ_LANG_UNSET, NO_SUBFONT, REGULAR } | |
| 157 }; | |
| 158 | |
| 159 #undef FONT | |
| 160 #undef ALIAS | |
| 161 #undef EMPTY | |
| 162 #undef FONT_DATA | |
| 163 #undef FONT_SIZE | |
| 164 | |
| 165 static const unsigned char * | |
| 166 search_by_script_lang_strict(int *size, int *subfont, int script, int language) | |
| 167 { | |
| 168 /* Search in the inbuilt font table. */ | |
| 169 font_entry *e; | |
| 170 | |
| 171 if (subfont) | |
| 172 *subfont = 0; | |
| 173 | |
| 174 for (e = inbuilt_fonts; e->script != END_OF_DATA; e++) | |
| 175 { | |
| 176 if (script != ANY_SCRIPT && e->script != script) | |
| 177 continue; | |
| 178 if (e->lang != language) | |
| 179 continue; | |
| 180 *size = INBUILT_SIZE(e); | |
| 181 if (subfont) | |
| 182 *subfont = e->subfont; | |
| 183 return e->data; | |
| 184 } | |
| 185 | |
| 186 return *size = 0, NULL; | |
| 187 } | |
| 188 | |
| 189 static const unsigned char * | |
| 190 search_by_script_lang(int *size, int *subfont, int script, int language) | |
| 191 { | |
| 192 const unsigned char *result; | |
| 193 result = search_by_script_lang_strict(size, subfont, script, language); | |
| 194 if (!result && language != FZ_LANG_UNSET) | |
| 195 result = search_by_script_lang_strict(size, subfont, script, FZ_LANG_UNSET); | |
| 196 return result; | |
| 197 } | |
| 198 | |
| 199 static const unsigned char * | |
| 200 search_by_family(int *size, const char *family, int attr) | |
| 201 { | |
| 202 /* Search in the inbuilt font table. */ | |
| 203 font_entry *e; | |
| 204 | |
| 205 for (e = inbuilt_fonts; e->script != END_OF_DATA; e++) | |
| 206 { | |
| 207 if (e->family[0] == '\0') | |
| 208 continue; | |
| 209 if (attr != e->attr) | |
| 210 continue; | |
| 211 if (!fz_strcasecmp(e->family, family)) | |
| 212 { | |
| 213 *size = INBUILT_SIZE(e); | |
| 214 return e->data; | |
| 215 } | |
| 216 } | |
| 217 | |
| 218 return *size = 0, NULL; | |
| 219 } | |
| 220 | |
| 221 const unsigned char * | |
| 222 fz_lookup_base14_font(fz_context *ctx, const char *name, int *size) | |
| 223 { | |
| 224 /* We want to insist on the base14 name matching exactly, | |
| 225 * so we check that here first, before we look in the font table | |
| 226 * to see if we actually have data. */ | |
| 227 | |
| 228 if (!strcmp(name, "Courier")) | |
| 229 return search_by_family(size, "Courier", REGULAR); | |
| 230 if (!strcmp(name, "Courier-Oblique")) | |
| 231 return search_by_family(size, "Courier", ITALIC); | |
| 232 if (!strcmp(name, "Courier-Bold")) | |
| 233 return search_by_family(size, "Courier", BOLD); | |
| 234 if (!strcmp(name, "Courier-BoldOblique")) | |
| 235 return search_by_family(size, "Courier", BOLD|ITALIC); | |
| 236 | |
| 237 if (!strcmp(name, "Helvetica")) | |
| 238 return search_by_family(size, "Helvetica", REGULAR); | |
| 239 if (!strcmp(name, "Helvetica-Oblique")) | |
| 240 return search_by_family(size, "Helvetica", ITALIC); | |
| 241 if (!strcmp(name, "Helvetica-Bold")) | |
| 242 return search_by_family(size, "Helvetica", BOLD); | |
| 243 if (!strcmp(name, "Helvetica-BoldOblique")) | |
| 244 return search_by_family(size, "Helvetica", BOLD|ITALIC); | |
| 245 | |
| 246 if (!strcmp(name, "Times-Roman")) | |
| 247 return search_by_family(size, "Times", REGULAR); | |
| 248 if (!strcmp(name, "Times-Italic")) | |
| 249 return search_by_family(size, "Times", ITALIC); | |
| 250 if (!strcmp(name, "Times-Bold")) | |
| 251 return search_by_family(size, "Times", BOLD); | |
| 252 if (!strcmp(name, "Times-BoldItalic")) | |
| 253 return search_by_family(size, "Times", BOLD|ITALIC); | |
| 254 | |
| 255 if (!strcmp(name, "Symbol")) | |
| 256 return search_by_family(size, "Symbol", REGULAR); | |
| 257 if (!strcmp(name, "ZapfDingbats")) | |
| 258 return search_by_family(size, "ZapfDingbats", REGULAR); | |
| 259 | |
| 260 *size = 0; | |
| 261 return NULL; | |
| 262 } | |
| 263 | |
| 264 const unsigned char * | |
| 265 fz_lookup_builtin_font(fz_context *ctx, const char *family, int is_bold, int is_italic, int *size) | |
| 266 { | |
| 267 return search_by_family(size, family, (is_bold ? BOLD : 0) | (is_italic ? ITALIC : 0)); | |
| 268 } | |
| 269 | |
| 270 const unsigned char * | |
| 271 fz_lookup_cjk_font(fz_context *ctx, int ordering, int *size, int *subfont) | |
| 272 { | |
| 273 int lang = FZ_LANG_UNSET; | |
| 274 switch (ordering) | |
| 275 { | |
| 276 case FZ_ADOBE_JAPAN: lang = FZ_LANG_ja; break; | |
| 277 case FZ_ADOBE_KOREA: lang = FZ_LANG_ko; break; | |
| 278 case FZ_ADOBE_GB: lang = FZ_LANG_zh_Hans; break; | |
| 279 case FZ_ADOBE_CNS: lang = FZ_LANG_zh_Hant; break; | |
| 280 } | |
| 281 return search_by_script_lang(size, subfont, UCDN_SCRIPT_HAN, lang); | |
| 282 } | |
| 283 | |
| 284 int | |
| 285 fz_lookup_cjk_ordering_by_language(const char *lang) | |
| 286 { | |
| 287 if (!strcmp(lang, "zh-Hant")) return FZ_ADOBE_CNS; | |
| 288 if (!strcmp(lang, "zh-TW")) return FZ_ADOBE_CNS; | |
| 289 if (!strcmp(lang, "zh-HK")) return FZ_ADOBE_CNS; | |
| 290 if (!strcmp(lang, "zh-Hans")) return FZ_ADOBE_GB; | |
| 291 if (!strcmp(lang, "zh-CN")) return FZ_ADOBE_GB; | |
| 292 if (!strcmp(lang, "ja")) return FZ_ADOBE_JAPAN; | |
| 293 if (!strcmp(lang, "ko")) return FZ_ADOBE_KOREA; | |
| 294 return -1; | |
| 295 } | |
| 296 | |
| 297 static int | |
| 298 fz_lookup_cjk_language(const char *lang) | |
| 299 { | |
| 300 if (!strcmp(lang, "zh-Hant")) return FZ_LANG_zh_Hant; | |
| 301 if (!strcmp(lang, "zh-TW")) return FZ_LANG_zh_Hant; | |
| 302 if (!strcmp(lang, "zh-HK")) return FZ_LANG_zh_Hant; | |
| 303 if (!strcmp(lang, "zh-Hans")) return FZ_LANG_zh_Hans; | |
| 304 if (!strcmp(lang, "zh-CN")) return FZ_LANG_zh_Hans; | |
| 305 if (!strcmp(lang, "ja")) return FZ_LANG_ja; | |
| 306 if (!strcmp(lang, "ko")) return FZ_LANG_ko; | |
| 307 return FZ_LANG_UNSET; | |
| 308 } | |
| 309 | |
| 310 const unsigned char * | |
| 311 fz_lookup_cjk_font_by_language(fz_context *ctx, const char *lang, int *size, int *subfont) | |
| 312 { | |
| 313 return search_by_script_lang(size, subfont, UCDN_SCRIPT_HAN, fz_lookup_cjk_language(lang)); | |
| 314 } | |
| 315 | |
| 316 const unsigned char * | |
| 317 fz_lookup_noto_font(fz_context *ctx, int script, int language, int *size, int *subfont) | |
| 318 { | |
| 319 return search_by_script_lang(size, subfont, script, language); | |
| 320 } | |
| 321 | |
| 322 const unsigned char * | |
| 323 fz_lookup_noto_math_font(fz_context *ctx, int *size) | |
| 324 { | |
| 325 return search_by_script_lang(size, NULL, MUPDF_SCRIPT_MATH, FZ_LANG_UNSET); | |
| 326 } | |
| 327 | |
| 328 const unsigned char * | |
| 329 fz_lookup_noto_music_font(fz_context *ctx, int *size) | |
| 330 { | |
| 331 return search_by_script_lang(size, NULL, MUPDF_SCRIPT_MUSIC, FZ_LANG_UNSET); | |
| 332 } | |
| 333 | |
| 334 const unsigned char * | |
| 335 fz_lookup_noto_symbol1_font(fz_context *ctx, int *size) | |
| 336 { | |
| 337 return search_by_script_lang(size, NULL, MUPDF_SCRIPT_SYMBOLS, FZ_LANG_UNSET); | |
| 338 } | |
| 339 | |
| 340 const unsigned char * | |
| 341 fz_lookup_noto_symbol2_font(fz_context *ctx, int *size) | |
| 342 { | |
| 343 return search_by_script_lang(size, NULL, MUPDF_SCRIPT_SYMBOLS2, FZ_LANG_UNSET); | |
| 344 } | |
| 345 | |
| 346 const unsigned char * | |
| 347 fz_lookup_noto_emoji_font(fz_context *ctx, int *size) | |
| 348 { | |
| 349 return search_by_script_lang(size, NULL, MUPDF_SCRIPT_EMOJI, FZ_LANG_UNSET); | |
| 350 } | |
| 351 | |
| 352 const unsigned char * | |
| 353 fz_lookup_noto_boxes_font(fz_context *ctx, int *size) | |
| 354 { | |
| 355 return search_by_family(size, "Nimbus Boxes", REGULAR); | |
| 356 } | |
| 357 | |
| 358 | |
| 359 const char * | |
| 360 fz_lookup_noto_stem_from_script(fz_context *ctx, int script, int language) | |
| 361 { | |
| 362 switch (script) | |
| 363 { | |
| 364 default: | |
| 365 case UCDN_SCRIPT_COMMON: | |
| 366 case UCDN_SCRIPT_INHERITED: | |
| 367 case UCDN_SCRIPT_UNKNOWN: | |
| 368 return NULL; | |
| 369 | |
| 370 case UCDN_SCRIPT_HANGUL: return "KR"; | |
| 371 case UCDN_SCRIPT_HIRAGANA: return "JP"; | |
| 372 case UCDN_SCRIPT_KATAKANA: return "JP"; | |
| 373 case UCDN_SCRIPT_BOPOMOFO: return "TC"; | |
| 374 case UCDN_SCRIPT_HAN: | |
| 375 switch (language) | |
| 376 { | |
| 377 case FZ_LANG_ja: return "JP"; | |
| 378 case FZ_LANG_ko: return "KR"; | |
| 379 case FZ_LANG_zh_Hans: return "SC"; | |
| 380 default: | |
| 381 case FZ_LANG_zh_Hant: return "TC"; | |
| 382 } | |
| 383 | |
| 384 case UCDN_SCRIPT_LATIN: return ""; | |
| 385 case UCDN_SCRIPT_GREEK: return ""; | |
| 386 case UCDN_SCRIPT_CYRILLIC: return ""; | |
| 387 case UCDN_SCRIPT_ARABIC: return "Naskh"; | |
| 388 | |
| 389 case UCDN_SCRIPT_ARMENIAN: return "Armenian"; | |
| 390 case UCDN_SCRIPT_HEBREW: return "Hebrew"; | |
| 391 case UCDN_SCRIPT_SYRIAC: return "Syriac"; | |
| 392 case UCDN_SCRIPT_THAANA: return "Thaana"; | |
| 393 case UCDN_SCRIPT_DEVANAGARI: return "Devanagari"; | |
| 394 case UCDN_SCRIPT_BENGALI: return "Bengali"; | |
| 395 case UCDN_SCRIPT_GURMUKHI: return "Gurmukhi"; | |
| 396 case UCDN_SCRIPT_GUJARATI: return "Gujarati"; | |
| 397 case UCDN_SCRIPT_ORIYA: return "Oriya"; | |
| 398 case UCDN_SCRIPT_TAMIL: return "Tamil"; | |
| 399 case UCDN_SCRIPT_TELUGU: return "Telugu"; | |
| 400 case UCDN_SCRIPT_KANNADA: return "Kannada"; | |
| 401 case UCDN_SCRIPT_MALAYALAM: return "Malayalam"; | |
| 402 case UCDN_SCRIPT_SINHALA: return "Sinhala"; | |
| 403 case UCDN_SCRIPT_THAI: return "Thai"; | |
| 404 case UCDN_SCRIPT_LAO: return "Lao"; | |
| 405 case UCDN_SCRIPT_TIBETAN: return "Tibetan"; | |
| 406 case UCDN_SCRIPT_MYANMAR: return "Myanmar"; | |
| 407 case UCDN_SCRIPT_GEORGIAN: return "Georgian"; | |
| 408 case UCDN_SCRIPT_ETHIOPIC: return "Ethiopic"; | |
| 409 case UCDN_SCRIPT_CHEROKEE: return "Cherokee"; | |
| 410 case UCDN_SCRIPT_CANADIAN_ABORIGINAL: return "CanadianAboriginal"; | |
| 411 case UCDN_SCRIPT_OGHAM: return "Ogham"; | |
| 412 case UCDN_SCRIPT_RUNIC: return "Runic"; | |
| 413 case UCDN_SCRIPT_KHMER: return "Khmer"; | |
| 414 case UCDN_SCRIPT_MONGOLIAN: return "Mongolian"; | |
| 415 case UCDN_SCRIPT_YI: return "Yi"; | |
| 416 case UCDN_SCRIPT_OLD_ITALIC: return "OldItalic"; | |
| 417 case UCDN_SCRIPT_GOTHIC: return "Gothic"; | |
| 418 case UCDN_SCRIPT_DESERET: return "Deseret"; | |
| 419 case UCDN_SCRIPT_TAGALOG: return "Tagalog"; | |
| 420 case UCDN_SCRIPT_HANUNOO: return "Hanunoo"; | |
| 421 case UCDN_SCRIPT_BUHID: return "Buhid"; | |
| 422 case UCDN_SCRIPT_TAGBANWA: return "Tagbanwa"; | |
| 423 case UCDN_SCRIPT_LIMBU: return "Limbu"; | |
| 424 case UCDN_SCRIPT_TAI_LE: return "TaiLe"; | |
| 425 case UCDN_SCRIPT_LINEAR_B: return "LinearB"; | |
| 426 case UCDN_SCRIPT_UGARITIC: return "Ugaritic"; | |
| 427 case UCDN_SCRIPT_SHAVIAN: return "Shavian"; | |
| 428 case UCDN_SCRIPT_OSMANYA: return "Osmanya"; | |
| 429 case UCDN_SCRIPT_CYPRIOT: return "Cypriot"; | |
| 430 case UCDN_SCRIPT_BUGINESE: return "Buginese"; | |
| 431 case UCDN_SCRIPT_COPTIC: return "Coptic"; | |
| 432 case UCDN_SCRIPT_NEW_TAI_LUE: return "NewTaiLue"; | |
| 433 case UCDN_SCRIPT_GLAGOLITIC: return "Glagolitic"; | |
| 434 case UCDN_SCRIPT_TIFINAGH: return "Tifinagh"; | |
| 435 case UCDN_SCRIPT_SYLOTI_NAGRI: return "SylotiNagri"; | |
| 436 case UCDN_SCRIPT_OLD_PERSIAN: return "OldPersian"; | |
| 437 case UCDN_SCRIPT_KHAROSHTHI: return "Kharoshthi"; | |
| 438 case UCDN_SCRIPT_BALINESE: return "Balinese"; | |
| 439 case UCDN_SCRIPT_CUNEIFORM: return "Cuneiform"; | |
| 440 case UCDN_SCRIPT_PHOENICIAN: return "Phoenician"; | |
| 441 case UCDN_SCRIPT_PHAGS_PA: return "PhagsPa"; | |
| 442 case UCDN_SCRIPT_NKO: return "NKo"; | |
| 443 case UCDN_SCRIPT_SUNDANESE: return "Sundanese"; | |
| 444 case UCDN_SCRIPT_LEPCHA: return "Lepcha"; | |
| 445 case UCDN_SCRIPT_OL_CHIKI: return "OlChiki"; | |
| 446 case UCDN_SCRIPT_VAI: return "Vai"; | |
| 447 case UCDN_SCRIPT_SAURASHTRA: return "Saurashtra"; | |
| 448 case UCDN_SCRIPT_KAYAH_LI: return "KayahLi"; | |
| 449 case UCDN_SCRIPT_REJANG: return "Rejang"; | |
| 450 case UCDN_SCRIPT_LYCIAN: return "Lycian"; | |
| 451 case UCDN_SCRIPT_CARIAN: return "Carian"; | |
| 452 case UCDN_SCRIPT_LYDIAN: return "Lydian"; | |
| 453 case UCDN_SCRIPT_CHAM: return "Cham"; | |
| 454 case UCDN_SCRIPT_TAI_THAM: return "TaiTham"; | |
| 455 case UCDN_SCRIPT_TAI_VIET: return "TaiViet"; | |
| 456 case UCDN_SCRIPT_AVESTAN: return "Avestan"; | |
| 457 case UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS: return "EgyptianHieroglyphs"; | |
| 458 case UCDN_SCRIPT_SAMARITAN: return "Samaritan"; | |
| 459 case UCDN_SCRIPT_LISU: return "Lisu"; | |
| 460 case UCDN_SCRIPT_BAMUM: return "Bamum"; | |
| 461 case UCDN_SCRIPT_JAVANESE: return "Javanese"; | |
| 462 case UCDN_SCRIPT_MEETEI_MAYEK: return "MeeteiMayek"; | |
| 463 case UCDN_SCRIPT_IMPERIAL_ARAMAIC: return "ImperialAramaic"; | |
| 464 case UCDN_SCRIPT_OLD_SOUTH_ARABIAN: return "OldSouthArabian"; | |
| 465 case UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN: return "InscriptionalParthian"; | |
| 466 case UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI: return "InscriptionalPahlavi"; | |
| 467 case UCDN_SCRIPT_OLD_TURKIC: return "OldTurkic"; | |
| 468 case UCDN_SCRIPT_KAITHI: return "Kaithi"; | |
| 469 case UCDN_SCRIPT_BATAK: return "Batak"; | |
| 470 case UCDN_SCRIPT_BRAHMI: return "Brahmi"; | |
| 471 case UCDN_SCRIPT_MANDAIC: return "Mandaic"; | |
| 472 case UCDN_SCRIPT_CHAKMA: return "Chakma"; | |
| 473 case UCDN_SCRIPT_MEROITIC_CURSIVE: return "Meroitic"; | |
| 474 case UCDN_SCRIPT_MEROITIC_HIEROGLYPHS: return "Meroitic"; | |
| 475 case UCDN_SCRIPT_MIAO: return "Miao"; | |
| 476 case UCDN_SCRIPT_SHARADA: return "Sharada"; | |
| 477 case UCDN_SCRIPT_SORA_SOMPENG: return "SoraSompeng"; | |
| 478 case UCDN_SCRIPT_TAKRI: return "Takri"; | |
| 479 case UCDN_SCRIPT_BASSA_VAH: return "BassaVah"; | |
| 480 case UCDN_SCRIPT_CAUCASIAN_ALBANIAN: return "CaucasianAlbanian"; | |
| 481 case UCDN_SCRIPT_DUPLOYAN: return "Duployan"; | |
| 482 case UCDN_SCRIPT_ELBASAN: return "Elbasan"; | |
| 483 case UCDN_SCRIPT_GRANTHA: return "Grantha"; | |
| 484 case UCDN_SCRIPT_KHOJKI: return "Khojki"; | |
| 485 case UCDN_SCRIPT_KHUDAWADI: return "Khudawadi"; | |
| 486 case UCDN_SCRIPT_LINEAR_A: return "LinearA"; | |
| 487 case UCDN_SCRIPT_MAHAJANI: return "Mahajani"; | |
| 488 case UCDN_SCRIPT_MANICHAEAN: return "Manichaean"; | |
| 489 case UCDN_SCRIPT_MENDE_KIKAKUI: return "MendeKikakui"; | |
| 490 case UCDN_SCRIPT_MODI: return "Modi"; | |
| 491 case UCDN_SCRIPT_MRO: return "Mro"; | |
| 492 case UCDN_SCRIPT_NABATAEAN: return "Nabataean"; | |
| 493 case UCDN_SCRIPT_OLD_NORTH_ARABIAN: return "OldNorthArabian"; | |
| 494 case UCDN_SCRIPT_OLD_PERMIC: return "OldPermic"; | |
| 495 case UCDN_SCRIPT_PAHAWH_HMONG: return "PahawhHmong"; | |
| 496 case UCDN_SCRIPT_PALMYRENE: return "Palmyrene"; | |
| 497 case UCDN_SCRIPT_PAU_CIN_HAU: return "PauCinHau"; | |
| 498 case UCDN_SCRIPT_PSALTER_PAHLAVI: return "PsalterPahlavi"; | |
| 499 case UCDN_SCRIPT_SIDDHAM: return "Siddham"; | |
| 500 case UCDN_SCRIPT_TIRHUTA: return "Tirhuta"; | |
| 501 case UCDN_SCRIPT_WARANG_CITI: return "WarangCiti"; | |
| 502 case UCDN_SCRIPT_AHOM: return "Ahom"; | |
| 503 case UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS: return "AnatolianHieroglyphs"; | |
| 504 case UCDN_SCRIPT_HATRAN: return "Hatran"; | |
| 505 case UCDN_SCRIPT_MULTANI: return "Multani"; | |
| 506 case UCDN_SCRIPT_OLD_HUNGARIAN: return "OldHungarian"; | |
| 507 case UCDN_SCRIPT_SIGNWRITING: return "SignWriting"; | |
| 508 case UCDN_SCRIPT_ADLAM: return "Adlam"; | |
| 509 case UCDN_SCRIPT_BHAIKSUKI: return "Bhaiksuki"; | |
| 510 case UCDN_SCRIPT_MARCHEN: return "Marchen"; | |
| 511 case UCDN_SCRIPT_NEWA: return "Newa"; | |
| 512 case UCDN_SCRIPT_OSAGE: return "Osage"; | |
| 513 case UCDN_SCRIPT_TANGUT: return "Tangut"; | |
| 514 case UCDN_SCRIPT_MASARAM_GONDI: return "MasaramGondi"; | |
| 515 case UCDN_SCRIPT_NUSHU: return "Nushu"; | |
| 516 case UCDN_SCRIPT_SOYOMBO: return "Soyombo"; | |
| 517 case UCDN_SCRIPT_ZANABAZAR_SQUARE: return "ZanabazarSquare"; | |
| 518 case UCDN_SCRIPT_DOGRA: return "Dogra"; | |
| 519 case UCDN_SCRIPT_GUNJALA_GONDI: return "GunjalaGondi"; | |
| 520 case UCDN_SCRIPT_HANIFI_ROHINGYA: return "HanifiRohingya"; | |
| 521 case UCDN_SCRIPT_MAKASAR: return "Makasar"; | |
| 522 case UCDN_SCRIPT_MEDEFAIDRIN: return "Medefaidrin"; | |
| 523 case UCDN_SCRIPT_OLD_SOGDIAN: return "OldSogdian"; | |
| 524 case UCDN_SCRIPT_SOGDIAN: return "Sogdian"; | |
| 525 case UCDN_SCRIPT_ELYMAIC: return "Elymaic"; | |
| 526 case UCDN_SCRIPT_NANDINAGARI: return "Nandinagari"; | |
| 527 case UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONG: return "NyiakengPuachueHmong"; | |
| 528 case UCDN_SCRIPT_WANCHO: return "Wancho"; | |
| 529 case UCDN_SCRIPT_CHORASMIAN: return "Chorasmian"; | |
| 530 case UCDN_SCRIPT_DIVES_AKURU: return "DivesAkuru"; | |
| 531 case UCDN_SCRIPT_KHITAN_SMALL_SCRIPT: return "KhitanSmallScript"; | |
| 532 case UCDN_SCRIPT_YEZIDI: return "Yezidi"; | |
| 533 case UCDN_SCRIPT_VITHKUQI: return "Vithkuqi"; | |
| 534 case UCDN_SCRIPT_OLD_UYGHUR: return "OldUyghur"; | |
| 535 case UCDN_SCRIPT_CYPRO_MINOAN: return "CyproMinoan"; | |
| 536 case UCDN_SCRIPT_TANGSA: return "Tangsa"; | |
| 537 case UCDN_SCRIPT_TOTO: return "Toto"; | |
| 538 case UCDN_SCRIPT_KAWI: return "Kawi"; | |
| 539 case UCDN_SCRIPT_NAG_MUNDARI: return "NagMundari"; | |
| 540 } | |
| 541 } | |
| 542 | |
| 543 const char * | |
| 544 fz_lookup_script_name(fz_context *ctx, int script, int language) | |
| 545 { | |
| 546 switch (script) { | |
| 547 case UCDN_SCRIPT_COMMON: | |
| 548 case UCDN_SCRIPT_INHERITED: | |
| 549 case UCDN_SCRIPT_UNKNOWN: | |
| 550 return "Common"; | |
| 551 case UCDN_SCRIPT_LATIN: return "Latin"; | |
| 552 case UCDN_SCRIPT_GREEK: return "Greek"; | |
| 553 case UCDN_SCRIPT_CYRILLIC: return "Cyrillic"; | |
| 554 case UCDN_SCRIPT_ARABIC: return "Arabic"; | |
| 555 default: return fz_lookup_noto_stem_from_script(ctx, script, language); | |
| 556 } | |
| 557 } |
