1 #include "mupdf/fitz.h"
2 #include "mupdf/ucdn.h"
3
4 #include <string.h>
5
6 /*
7 Base 14 PDF fonts from URW.
8 Noto fonts from Google.
9 Source Han Serif from Adobe for CJK.
10 DroidSansFallback from Android for CJK.
11 Charis SIL from SIL.
12
13 Define TOFU to only include the Base14 and CJK fonts.
14
15 Define TOFU_CJK_LANG to skip Source Han Serif per-language fonts.
16 Define TOFU_CJK_EXT to skip DroidSansFallbackFull (and the above).
17 Define TOFU_CJK to skip DroidSansFallback (and the above).
18
19 Define TOFU_NOTO to skip ALL non-CJK noto fonts.
20 Define TOFU_SYMBOL to skip symbol fonts.
21 Define TOFU_EMOJI to skip emoji/extended symbol font.
22
23 Define TOFU_SIL to skip the SIL fonts (warning: makes EPUB documents ugly).
24 Define TOFU_BASE14 to skip the Base 14 fonts (warning: makes PDF unusable).
25 */
26
27 #ifdef NOTO_SMALL
28 #define TOFU_CJK_EXT
29 #define TOFU_SYMBOL
30 #define TOFU_EMOJI
31 #define TOFU_SIL
32 #endif
33
34 #ifdef NO_CJK
35 #define TOFU_CJK
36 #endif
37
38 #ifdef TOFU
39 #define TOFU_NOTO
40 #define TOFU_SIL
41 #endif
42
43 #ifdef TOFU_NOTO
44 #define TOFU_SYMBOL
45 #define TOFU_EMOJI
46 #endif
47
48 /* This historic script has an unusually large font (2MB), so we skip it by default. */
49 #ifndef NOTO_TANGUT
50 #define NOTO_TANGUT 0
51 #endif
52
53 #ifdef HAVE_OBJCOPY
54 #define RETURN(FORGE,NAME) \
55 do { \
56 extern unsigned char _binary_resources_fonts_##FORGE##_##NAME##_start; \
57 extern unsigned char _binary_resources_fonts_##FORGE##_##NAME##_end; \
58 return *size = \
59 &_binary_resources_fonts_##FORGE##_##NAME##_end - \
60 &_binary_resources_fonts_##FORGE##_##NAME##_start, \
61 &_binary_resources_fonts_##FORGE##_##NAME##_start; \
62 } while (0)
63 #else
64 #define RETURN(FORGE,NAME) \
65 do { \
66 extern unsigned char _binary_##NAME[]; \
67 extern unsigned int _binary_##NAME##_size; \
68 return *size = _binary_##NAME##_size, _binary_##NAME; \
69 } while (0)
70 #endif
71
72 const unsigned char *
fz_lookup_base14_font(fz_context * ctx,const char * name,int * size)73 fz_lookup_base14_font(fz_context *ctx, const char *name, int *size)
74 {
75 #ifndef TOFU_BASE14
76 if (!strcmp(name, "Courier")) RETURN(urw,NimbusMonoPS_Regular_cff);
77 if (!strcmp(name, "Courier-Oblique")) RETURN(urw,NimbusMonoPS_Italic_cff);
78 if (!strcmp(name, "Courier-Bold")) RETURN(urw,NimbusMonoPS_Bold_cff);
79 if (!strcmp(name, "Courier-BoldOblique")) RETURN(urw,NimbusMonoPS_BoldItalic_cff);
80 if (!strcmp(name, "Helvetica")) RETURN(urw,NimbusSans_Regular_cff);
81 if (!strcmp(name, "Helvetica-Oblique")) RETURN(urw,NimbusSans_Italic_cff);
82 if (!strcmp(name, "Helvetica-Bold")) RETURN(urw,NimbusSans_Bold_cff);
83 if (!strcmp(name, "Helvetica-BoldOblique")) RETURN(urw,NimbusSans_BoldItalic_cff);
84 if (!strcmp(name, "Times-Roman")) RETURN(urw,NimbusRoman_Regular_cff);
85 if (!strcmp(name, "Times-Italic")) RETURN(urw,NimbusRoman_Italic_cff);
86 if (!strcmp(name, "Times-Bold")) RETURN(urw,NimbusRoman_Bold_cff);
87 if (!strcmp(name, "Times-BoldItalic")) RETURN(urw,NimbusRoman_BoldItalic_cff);
88 if (!strcmp(name, "Symbol")) RETURN(urw,StandardSymbolsPS_cff);
89 if (!strcmp(name, "ZapfDingbats")) RETURN(urw,Dingbats_cff);
90 #endif
91 return *size = 0, NULL;
92 }
93
94 #define FAMILY(F, R, I, B, BI) \
95 if (!is_bold) { \
96 if (!is_italic) RETURN(F, R); else RETURN(F, I); \
97 } else { \
98 if (!is_italic) RETURN(F, B); else RETURN(F, BI); \
99 }
100
101 const unsigned char *
fz_lookup_builtin_font(fz_context * ctx,const char * name,int is_bold,int is_italic,int * size)102 fz_lookup_builtin_font(fz_context *ctx, const char *name, int is_bold, int is_italic, int *size)
103 {
104 #ifndef TOFU_BASE14
105 if (!strcmp(name, "Courier")) {
106 FAMILY(urw, NimbusMonoPS_Regular_cff,
107 NimbusMonoPS_Italic_cff,
108 NimbusMonoPS_Bold_cff,
109 NimbusMonoPS_BoldItalic_cff)
110 }
111 if (!strcmp(name, "Helvetica") || !strcmp(name, "Arial")) {
112 FAMILY(urw, NimbusSans_Regular_cff,
113 NimbusSans_Italic_cff,
114 NimbusSans_Bold_cff,
115 NimbusSans_BoldItalic_cff)
116 }
117 if (!strcmp(name, "Times") || !strcmp(name, "Times Roman") || !strcmp(name, "Times New Roman")) {
118 FAMILY(urw, NimbusRoman_Regular_cff,
119 NimbusRoman_Italic_cff,
120 NimbusRoman_Bold_cff,
121 NimbusRoman_BoldItalic_cff)
122 }
123 if (!strcmp(name, "Dingbats") || !strcmp(name, "Zapf Dingbats")) {
124 RETURN(urw, Dingbats_cff);
125 }
126 if (!strcmp(name, "Symbol")) {
127 RETURN(urw, StandardSymbolsPS_cff);
128 }
129 #endif
130 #ifndef TOFU_SIL
131 if (!strcmp(name, "Charis SIL")) {
132 FAMILY(sil, CharisSIL_cff,
133 CharisSIL_Italic_cff,
134 CharisSIL_Bold_cff,
135 CharisSIL_BoldItalic_cff)
136 }
137 #endif
138 #ifndef TOFU_NOTO
139 if (!strcmp(name, "Noto Serif")) {
140 RETURN(noto, NotoSerif_Regular_otf);
141 }
142 #endif
143 return *size = 0, NULL;
144 }
145
146 const unsigned char *
fz_lookup_cjk_font(fz_context * ctx,int ordering,int * size,int * subfont)147 fz_lookup_cjk_font(fz_context *ctx, int ordering, int *size, int *subfont)
148 {
149 *subfont = 0;
150 #ifndef TOFU_CJK
151 #ifndef TOFU_CJK_EXT
152 #ifndef TOFU_CJK_LANG
153 switch (ordering) {
154 case FZ_ADOBE_JAPAN: *subfont=0; RETURN(han, SourceHanSerif_Regular_ttc);
155 case FZ_ADOBE_KOREA: *subfont=1; RETURN(han, SourceHanSerif_Regular_ttc);
156 case FZ_ADOBE_GB: *subfont=2; RETURN(han, SourceHanSerif_Regular_ttc);
157 default:
158 case FZ_ADOBE_CNS: *subfont=3; RETURN(han, SourceHanSerif_Regular_ttc);
159 }
160 #else
161 RETURN(droid, DroidSansFallbackFull_ttf);
162 #endif
163 #else
164 RETURN(droid, DroidSansFallback_ttf);
165 #endif
166 #else
167 return *size = 0, NULL;
168 #endif
169 }
170
171 int
fz_lookup_cjk_ordering_by_language(const char * name)172 fz_lookup_cjk_ordering_by_language(const char *name)
173 {
174 if (!strcmp(name, "zh-Hant")) return FZ_ADOBE_CNS;
175 if (!strcmp(name, "zh-TW")) return FZ_ADOBE_CNS;
176 if (!strcmp(name, "zh-HK")) return FZ_ADOBE_CNS;
177 if (!strcmp(name, "zh-Hans")) return FZ_ADOBE_GB;
178 if (!strcmp(name, "zh-CN")) return FZ_ADOBE_GB;
179 if (!strcmp(name, "ja")) return FZ_ADOBE_JAPAN;
180 if (!strcmp(name, "ko")) return FZ_ADOBE_KOREA;
181 return -1;
182 }
183
184 const unsigned char *
fz_lookup_cjk_font_by_language(fz_context * ctx,const char * lang,int * size,int * subfont)185 fz_lookup_cjk_font_by_language(fz_context *ctx, const char *lang, int *size, int *subfont)
186 {
187 int ordering = fz_lookup_cjk_ordering_by_language(lang);
188 if (ordering >= 0)
189 return fz_lookup_cjk_font(ctx, ordering, size, subfont);
190 return *size = 0, *subfont = 0, NULL;
191 }
192
193 const unsigned char *
fz_lookup_noto_font(fz_context * ctx,int script,int language,int * size,int * subfont)194 fz_lookup_noto_font(fz_context *ctx, int script, int language, int *size, int *subfont)
195 {
196 *subfont = 0;
197
198 switch (script)
199 {
200 default:
201 case UCDN_SCRIPT_COMMON:
202 case UCDN_SCRIPT_INHERITED:
203 case UCDN_SCRIPT_UNKNOWN:
204 #ifndef TOFU_NOTO
205 RETURN(noto,NotoSerif_Regular_otf);
206 #endif
207 break;
208
209 case UCDN_SCRIPT_HANGUL:
210 return fz_lookup_cjk_font(ctx, FZ_ADOBE_KOREA, size, subfont);
211 case UCDN_SCRIPT_HIRAGANA:
212 case UCDN_SCRIPT_KATAKANA:
213 return fz_lookup_cjk_font(ctx, FZ_ADOBE_JAPAN, size, subfont);
214 case UCDN_SCRIPT_BOPOMOFO:
215 return fz_lookup_cjk_font(ctx, FZ_ADOBE_CNS, size, subfont);
216 case UCDN_SCRIPT_HAN:
217 switch (language)
218 {
219 case FZ_LANG_ja: return fz_lookup_cjk_font(ctx, FZ_ADOBE_JAPAN, size, subfont);
220 case FZ_LANG_ko: return fz_lookup_cjk_font(ctx, FZ_ADOBE_KOREA, size, subfont);
221 case FZ_LANG_zh_Hans: return fz_lookup_cjk_font(ctx, FZ_ADOBE_GB, size, subfont);
222 default:
223 case FZ_LANG_zh_Hant: return fz_lookup_cjk_font(ctx, FZ_ADOBE_CNS, size, subfont);
224 }
225
226 case UCDN_SCRIPT_BRAILLE: break; /* no dedicated font; fallback to NotoSansSymbols will cover this */
227
228 #ifndef TOFU_NOTO
229 case UCDN_SCRIPT_LATIN:
230 case UCDN_SCRIPT_GREEK:
231 case UCDN_SCRIPT_CYRILLIC:
232 RETURN(noto,NotoSerif_Regular_otf);
233
234 case UCDN_SCRIPT_ARABIC:
235 if (language == FZ_LANG_ur || language == FZ_LANG_urd)
236 RETURN(noto,NotoNastaliqUrdu_Regular_otf);
237 RETURN(noto,NotoNaskhArabic_Regular_ttf);
238
239 case UCDN_SCRIPT_ADLAM: RETURN(noto,NotoSansAdlam_Regular_otf);
240 case UCDN_SCRIPT_AHOM: RETURN(noto,NotoSerifAhom_Regular_otf);
241 case UCDN_SCRIPT_ANATOLIAN_HIEROGLYPHS: RETURN(noto,NotoSansAnatolianHieroglyphs_Regular_otf);
242 case UCDN_SCRIPT_ARMENIAN: RETURN(noto,NotoSerifArmenian_Regular_otf);
243 case UCDN_SCRIPT_AVESTAN: RETURN(noto,NotoSansAvestan_Regular_otf);
244 case UCDN_SCRIPT_BALINESE: RETURN(noto,NotoSerifBalinese_Regular_otf);
245 case UCDN_SCRIPT_BAMUM: RETURN(noto,NotoSansBamum_Regular_otf);
246 case UCDN_SCRIPT_BASSA_VAH: RETURN(noto,NotoSansBassaVah_Regular_otf);
247 case UCDN_SCRIPT_BATAK: RETURN(noto,NotoSansBatak_Regular_otf);
248 case UCDN_SCRIPT_BENGALI: RETURN(noto,NotoSerifBengali_Regular_ttf);
249 case UCDN_SCRIPT_BHAIKSUKI: RETURN(noto,NotoSansBhaiksuki_Regular_otf);
250 case UCDN_SCRIPT_BRAHMI: RETURN(noto,NotoSansBrahmi_Regular_otf);
251 case UCDN_SCRIPT_BUGINESE: RETURN(noto,NotoSansBuginese_Regular_otf);
252 case UCDN_SCRIPT_BUHID: RETURN(noto,NotoSansBuhid_Regular_otf);
253 case UCDN_SCRIPT_CANADIAN_ABORIGINAL: RETURN(noto,NotoSansCanadianAboriginal_Regular_otf);
254 case UCDN_SCRIPT_CARIAN: RETURN(noto,NotoSansCarian_Regular_otf);
255 case UCDN_SCRIPT_CAUCASIAN_ALBANIAN: RETURN(noto,NotoSansCaucasianAlbanian_Regular_otf);
256 case UCDN_SCRIPT_CHAKMA: RETURN(noto,NotoSansChakma_Regular_otf);
257 case UCDN_SCRIPT_CHAM: RETURN(noto,NotoSansCham_Regular_otf);
258 case UCDN_SCRIPT_CHEROKEE: RETURN(noto,NotoSansCherokee_Regular_otf);
259 case UCDN_SCRIPT_COPTIC: RETURN(noto,NotoSansCoptic_Regular_otf);
260 case UCDN_SCRIPT_CUNEIFORM: RETURN(noto,NotoSansCuneiform_Regular_otf);
261 case UCDN_SCRIPT_CYPRIOT: RETURN(noto,NotoSansCypriot_Regular_otf);
262 case UCDN_SCRIPT_DESERET: RETURN(noto,NotoSansDeseret_Regular_otf);
263 case UCDN_SCRIPT_DEVANAGARI: RETURN(noto,NotoSerifDevanagari_Regular_ttf);
264 case UCDN_SCRIPT_DOGRA: break;
265 case UCDN_SCRIPT_DUPLOYAN: RETURN(noto,NotoSansDuployan_Regular_otf);
266 case UCDN_SCRIPT_EGYPTIAN_HIEROGLYPHS: RETURN(noto,NotoSansEgyptianHieroglyphs_Regular_otf);
267 case UCDN_SCRIPT_ELBASAN: RETURN(noto,NotoSansElbasan_Regular_otf);
268 case UCDN_SCRIPT_ELYMAIC: break;
269 case UCDN_SCRIPT_ETHIOPIC: RETURN(noto,NotoSerifEthiopic_Regular_otf);
270 case UCDN_SCRIPT_GEORGIAN: RETURN(noto,NotoSerifGeorgian_Regular_otf);
271 case UCDN_SCRIPT_GLAGOLITIC: RETURN(noto,NotoSansGlagolitic_Regular_otf);
272 case UCDN_SCRIPT_GOTHIC: RETURN(noto,NotoSansGothic_Regular_otf);
273 case UCDN_SCRIPT_GRANTHA: RETURN(noto,NotoSansGrantha_Regular_otf);
274 case UCDN_SCRIPT_GUJARATI: RETURN(noto,NotoSerifGujarati_Regular_otf);
275 case UCDN_SCRIPT_GUNJALA_GONDI: break;
276 case UCDN_SCRIPT_GURMUKHI: RETURN(noto,NotoSerifGurmukhi_Regular_otf);
277 case UCDN_SCRIPT_HANIFI_ROHINGYA: break;
278 case UCDN_SCRIPT_HANUNOO: RETURN(noto,NotoSansHanunoo_Regular_otf);
279 case UCDN_SCRIPT_HATRAN: RETURN(noto,NotoSansHatran_Regular_otf);
280 case UCDN_SCRIPT_HEBREW: RETURN(noto,NotoSerifHebrew_Regular_otf);
281 case UCDN_SCRIPT_IMPERIAL_ARAMAIC: RETURN(noto,NotoSansImperialAramaic_Regular_otf);
282 case UCDN_SCRIPT_INSCRIPTIONAL_PAHLAVI: RETURN(noto,NotoSansInscriptionalPahlavi_Regular_otf);
283 case UCDN_SCRIPT_INSCRIPTIONAL_PARTHIAN: RETURN(noto,NotoSansInscriptionalParthian_Regular_otf);
284 case UCDN_SCRIPT_JAVANESE: RETURN(noto,NotoSansJavanese_Regular_otf);
285 case UCDN_SCRIPT_KAITHI: RETURN(noto,NotoSansKaithi_Regular_otf);
286 case UCDN_SCRIPT_KANNADA: RETURN(noto,NotoSerifKannada_Regular_otf);
287 case UCDN_SCRIPT_KAYAH_LI: RETURN(noto,NotoSansKayahLi_Regular_otf);
288 case UCDN_SCRIPT_KHAROSHTHI: RETURN(noto,NotoSansKharoshthi_Regular_otf);
289 case UCDN_SCRIPT_KHMER: RETURN(noto,NotoSerifKhmer_Regular_otf);
290 case UCDN_SCRIPT_KHOJKI: RETURN(noto,NotoSansKhojki_Regular_otf);;
291 case UCDN_SCRIPT_KHUDAWADI: RETURN(noto,NotoSansKhudawadi_Regular_otf);
292 case UCDN_SCRIPT_LAO: RETURN(noto,NotoSerifLao_Regular_otf);
293 case UCDN_SCRIPT_LEPCHA: RETURN(noto,NotoSansLepcha_Regular_otf);
294 case UCDN_SCRIPT_LIMBU: RETURN(noto,NotoSansLimbu_Regular_otf);
295 case UCDN_SCRIPT_LINEAR_A: RETURN(noto,NotoSansLinearA_Regular_otf);
296 case UCDN_SCRIPT_LINEAR_B: RETURN(noto,NotoSansLinearB_Regular_otf);
297 case UCDN_SCRIPT_LISU: RETURN(noto,NotoSansLisu_Regular_otf);
298 case UCDN_SCRIPT_LYCIAN: RETURN(noto,NotoSansLycian_Regular_otf);
299 case UCDN_SCRIPT_LYDIAN: RETURN(noto,NotoSansLydian_Regular_otf);
300 case UCDN_SCRIPT_MAHAJANI: RETURN(noto,NotoSansMahajani_Regular_otf);
301 case UCDN_SCRIPT_MAKASAR: break;
302 case UCDN_SCRIPT_MALAYALAM: RETURN(noto,NotoSerifMalayalam_Regular_ttf);
303 case UCDN_SCRIPT_MANDAIC: RETURN(noto,NotoSansMandaic_Regular_otf);
304 case UCDN_SCRIPT_MANICHAEAN: RETURN(noto,NotoSansManichaean_Regular_otf);
305 case UCDN_SCRIPT_MARCHEN: RETURN(noto,NotoSansMarchen_Regular_otf);
306 case UCDN_SCRIPT_MASARAM_GONDI: break;
307 case UCDN_SCRIPT_MEDEFAIDRIN: break;
308 case UCDN_SCRIPT_MEETEI_MAYEK: RETURN(noto,NotoSansMeeteiMayek_Regular_otf);
309 case UCDN_SCRIPT_MENDE_KIKAKUI: RETURN(noto,NotoSansMendeKikakui_Regular_otf);
310 case UCDN_SCRIPT_MEROITIC_CURSIVE: RETURN(noto,NotoSansMeroitic_Regular_otf);
311 case UCDN_SCRIPT_MEROITIC_HIEROGLYPHS: RETURN(noto,NotoSansMeroitic_Regular_otf);
312 case UCDN_SCRIPT_MIAO: RETURN(noto,NotoSansMiao_Regular_otf);
313 case UCDN_SCRIPT_MODI: RETURN(noto,NotoSansModi_Regular_otf);
314 case UCDN_SCRIPT_MONGOLIAN: RETURN(noto,NotoSansMongolian_Regular_otf);
315 case UCDN_SCRIPT_MRO: RETURN(noto,NotoSansMro_Regular_otf);
316 case UCDN_SCRIPT_MULTANI: RETURN(noto,NotoSansMultani_Regular_otf);
317 case UCDN_SCRIPT_MYANMAR: RETURN(noto,NotoSerifMyanmar_Regular_otf);
318 case UCDN_SCRIPT_NABATAEAN: RETURN(noto,NotoSansNabataean_Regular_otf);
319 case UCDN_SCRIPT_NANDINAGARI: break;
320 case UCDN_SCRIPT_NEWA: RETURN(noto,NotoSansNewa_Regular_otf);
321 case UCDN_SCRIPT_NEW_TAI_LUE: RETURN(noto,NotoSansNewTaiLue_Regular_otf);
322 case UCDN_SCRIPT_NKO: RETURN(noto,NotoSansNKo_Regular_otf);
323 case UCDN_SCRIPT_NUSHU: break;
324 case UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONG: break;
325 case UCDN_SCRIPT_OGHAM: RETURN(noto,NotoSansOgham_Regular_otf);
326 case UCDN_SCRIPT_OLD_HUNGARIAN: RETURN(noto,NotoSansOldHungarian_Regular_otf);
327 case UCDN_SCRIPT_OLD_ITALIC: RETURN(noto,NotoSansOldItalic_Regular_otf);
328 case UCDN_SCRIPT_OLD_NORTH_ARABIAN: RETURN(noto,NotoSansOldNorthArabian_Regular_otf);
329 case UCDN_SCRIPT_OLD_PERMIC: RETURN(noto,NotoSansOldPermic_Regular_otf);
330 case UCDN_SCRIPT_OLD_PERSIAN: RETURN(noto,NotoSansOldPersian_Regular_otf);
331 case UCDN_SCRIPT_OLD_SOGDIAN: break;
332 case UCDN_SCRIPT_OLD_SOUTH_ARABIAN: RETURN(noto,NotoSansOldSouthArabian_Regular_otf);
333 case UCDN_SCRIPT_OLD_TURKIC: RETURN(noto,NotoSansOldTurkic_Regular_otf);
334 case UCDN_SCRIPT_OL_CHIKI: RETURN(noto,NotoSansOlChiki_Regular_otf);
335 case UCDN_SCRIPT_ORIYA: RETURN(noto,NotoSansOriya_Regular_ttf);
336 case UCDN_SCRIPT_OSAGE: RETURN(noto,NotoSansOsage_Regular_otf);
337 case UCDN_SCRIPT_OSMANYA: RETURN(noto,NotoSansOsmanya_Regular_otf);
338 case UCDN_SCRIPT_PAHAWH_HMONG: RETURN(noto,NotoSansPahawhHmong_Regular_otf);
339 case UCDN_SCRIPT_PALMYRENE: RETURN(noto,NotoSansPalmyrene_Regular_otf);
340 case UCDN_SCRIPT_PAU_CIN_HAU: RETURN(noto,NotoSansPauCinHau_Regular_otf);
341 case UCDN_SCRIPT_PHAGS_PA: RETURN(noto,NotoSansPhagsPa_Regular_otf);
342 case UCDN_SCRIPT_PHOENICIAN: RETURN(noto,NotoSansPhoenician_Regular_otf);
343 case UCDN_SCRIPT_PSALTER_PAHLAVI: RETURN(noto,NotoSansPsalterPahlavi_Regular_otf);
344 case UCDN_SCRIPT_REJANG: RETURN(noto,NotoSansRejang_Regular_otf);
345 case UCDN_SCRIPT_RUNIC: RETURN(noto,NotoSansRunic_Regular_otf);
346 case UCDN_SCRIPT_SAMARITAN: RETURN(noto,NotoSansSamaritan_Regular_otf);
347 case UCDN_SCRIPT_SAURASHTRA: RETURN(noto,NotoSansSaurashtra_Regular_otf);
348 case UCDN_SCRIPT_SHARADA: RETURN(noto,NotoSansSharada_Regular_otf);
349 case UCDN_SCRIPT_SHAVIAN: RETURN(noto,NotoSansShavian_Regular_otf);
350 case UCDN_SCRIPT_SIDDHAM: RETURN(noto,NotoSansSiddham_Regular_otf);
351 case UCDN_SCRIPT_SIGNWRITING: break;
352 case UCDN_SCRIPT_SINHALA: RETURN(noto,NotoSerifSinhala_Regular_otf);
353 case UCDN_SCRIPT_SOGDIAN: break;
354 case UCDN_SCRIPT_SORA_SOMPENG: RETURN(noto,NotoSansSoraSompeng_Regular_otf);
355 case UCDN_SCRIPT_SOYOMBO: break;
356 case UCDN_SCRIPT_SUNDANESE: RETURN(noto,NotoSansSundanese_Regular_otf);
357 case UCDN_SCRIPT_SYLOTI_NAGRI: RETURN(noto,NotoSansSylotiNagri_Regular_otf);
358 case UCDN_SCRIPT_SYRIAC: RETURN(noto,NotoSansSyriac_Regular_otf);
359 case UCDN_SCRIPT_TAGALOG: RETURN(noto,NotoSansTagalog_Regular_otf);
360 case UCDN_SCRIPT_TAGBANWA: RETURN(noto,NotoSansTagbanwa_Regular_otf);
361 case UCDN_SCRIPT_TAI_LE: RETURN(noto,NotoSansTaiLe_Regular_otf);
362 case UCDN_SCRIPT_TAI_THAM: RETURN(noto,NotoSansTaiTham_Regular_ttf);
363 case UCDN_SCRIPT_TAI_VIET: RETURN(noto,NotoSansTaiViet_Regular_otf);
364 case UCDN_SCRIPT_TAKRI: RETURN(noto,NotoSansTakri_Regular_otf);
365 case UCDN_SCRIPT_TAMIL: RETURN(noto,NotoSerifTamil_Regular_otf);
366 case UCDN_SCRIPT_TELUGU: RETURN(noto,NotoSerifTelugu_Regular_ttf);
367 case UCDN_SCRIPT_THAANA: RETURN(noto,NotoSansThaana_Regular_otf);
368 case UCDN_SCRIPT_THAI: RETURN(noto,NotoSerifThai_Regular_otf);
369 case UCDN_SCRIPT_TIBETAN: RETURN(noto,NotoSerifTibetan_Regular_otf);
370 case UCDN_SCRIPT_TIFINAGH: RETURN(noto,NotoSansTifinagh_Regular_otf);
371 case UCDN_SCRIPT_TIRHUTA: RETURN(noto,NotoSansTirhuta_Regular_otf);
372 case UCDN_SCRIPT_UGARITIC: RETURN(noto,NotoSansUgaritic_Regular_otf);
373 case UCDN_SCRIPT_VAI: RETURN(noto,NotoSansVai_Regular_otf);
374 case UCDN_SCRIPT_WANCHO: break;
375 case UCDN_SCRIPT_WARANG_CITI: RETURN(noto,NotoSansWarangCiti_Regular_otf);
376 case UCDN_SCRIPT_YI: RETURN(noto,NotoSansYi_Regular_otf);
377 case UCDN_SCRIPT_ZANABAZAR_SQUARE: break;
378
379 #if NOTO_TANGUT
380 case UCDN_SCRIPT_TANGUT: RETURN(noto,NotoSerifTangut_Regular_otf);
381 #endif
382
383 #endif /* TOFU_NOTO */
384 }
385
386 return *size = 0, NULL;
387 }
388
389 const unsigned char *
fz_lookup_noto_math_font(fz_context * ctx,int * size)390 fz_lookup_noto_math_font(fz_context *ctx, int *size)
391 {
392 #ifndef TOFU_SYMBOL
393 RETURN(noto,NotoSansMath_Regular_otf);
394 #else
395 return *size = 0, NULL;
396 #endif
397 }
398
399 const unsigned char *
fz_lookup_noto_music_font(fz_context * ctx,int * size)400 fz_lookup_noto_music_font(fz_context *ctx, int *size)
401 {
402 #ifndef TOFU_SYMBOL
403 RETURN(noto,NotoMusic_Regular_otf);
404 #else
405 return *size = 0, NULL;
406 #endif
407 }
408
409 const unsigned char *
fz_lookup_noto_symbol1_font(fz_context * ctx,int * size)410 fz_lookup_noto_symbol1_font(fz_context *ctx, int *size)
411 {
412 #ifndef TOFU_SYMBOL
413 RETURN(noto,NotoSansSymbols_Regular_otf);
414 #else
415 return *size = 0, NULL;
416 #endif
417 }
418
419 const unsigned char *
fz_lookup_noto_symbol2_font(fz_context * ctx,int * size)420 fz_lookup_noto_symbol2_font(fz_context *ctx, int *size)
421 {
422 #ifndef TOFU_SYMBOL
423 RETURN(noto,NotoSansSymbols2_Regular_otf);
424 #else
425 return *size = 0, NULL;
426 #endif
427 }
428
429 const unsigned char *
fz_lookup_noto_emoji_font(fz_context * ctx,int * size)430 fz_lookup_noto_emoji_font(fz_context *ctx, int *size)
431 {
432 #ifndef TOFU_EMOJI
433 RETURN(noto,NotoEmoji_Regular_ttf);
434 #else
435 return *size = 0, NULL;
436 #endif
437 }
438