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