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 }