font_test_data/
lib.rs

1//! test data shared between various fontations crates.
2
3pub mod bebuffer;
4pub mod cmap;
5pub mod gdef;
6pub mod gpos;
7pub mod gsub;
8pub mod ift;
9pub mod layout;
10
11pub static CMAP12_FONT1: &[u8] = include_bytes!("../test_data/ttf/cmap12_font1.ttf");
12
13pub static CMAP14_FONT1: &[u8] = include_bytes!("../test_data/ttf/cmap14_font1.ttf");
14
15pub static CMAP4_SYMBOL_PUA: &[u8] = include_bytes!("../test_data/ttf/cmap4_symbol_pua.ttf");
16
17pub static COLR_GRADIENT_RECT: &[u8] =
18    include_bytes!("../test_data/ttf/linear_gradient_rect_colr_1.ttf");
19
20pub static VAZIRMATN_VAR: &[u8] = include_bytes!("../test_data/ttf/vazirmatn_var_trimmed.ttf");
21
22pub static NAMES_ONLY: &[u8] = include_bytes!("../test_data/ttf/names_only.ttf");
23
24pub static VAZIRMATN_VAR_GLYPHS: &str =
25    include_str!("../test_data/extracted/vazirmatn_var_trimmed-glyphs.txt");
26
27pub static SIMPLE_GLYF: &[u8] = include_bytes!("../test_data/ttf/simple_glyf.ttf");
28
29pub static CUBIC_GLYF: &[u8] = include_bytes!("../test_data/ttf/cubic_glyf.ttf");
30
31pub static NOTO_SERIF_DISPLAY_TRIMMED: &[u8] =
32    include_bytes!("../test_data/ttf/noto_serif_display_trimmed.ttf");
33
34pub static NOTO_SERIF_DISPLAY_TRIMMED_GLYPHS: &str =
35    include_str!("../test_data/extracted/noto_serif_display_trimmed-glyphs.txt");
36
37pub static CANTARELL_VF_TRIMMED: &[u8] =
38    include_bytes!("../test_data/ttf/cantarell_vf_trimmed.ttf");
39
40pub static CANTARELL_VF_TRIMMED_GLYPHS: &str =
41    include_str!("../test_data/extracted/cantarell_vf_trimmed-glyphs.txt");
42
43pub static CHARSTRING_PATH_OPS: &[u8] = include_bytes!("../test_data/ttf/charstring_path_ops.ttf");
44
45pub static EMBEDDED_BITMAPS: &[u8] = include_bytes!("../test_data/ttf/embedded_bitmaps.ttf");
46pub static CBDT: &[u8] = include_bytes!("../test_data/ttf/cbdt.ttf");
47
48pub static HVAR_WITH_TRUNCATED_ADVANCE_INDEX_MAP: &[u8] =
49    include_bytes!("../test_data/ttf/hvar_with_truncated_adv_index_map.ttf");
50
51pub static COLRV0V1: &[u8] = include_bytes!("../test_data/ttf/test_glyphs-glyf_colr_1.ttf");
52
53pub static COLRV0V1_VARIABLE: &[u8] =
54    include_bytes!("../test_data/ttf/test_glyphs-glyf_colr_1_variable.ttf");
55
56pub static COLRV1_NO_CLIPLIST: &[u8] =
57    include_bytes!("../test_data/ttf/test_glyphs-glyf_colr_1_no_cliplist.subset.ttf");
58
59pub static CVAR: &[u8] = include_bytes!("../test_data/ttf/cvar.ttf");
60
61pub static STARTING_OFF_CURVE: &[u8] = include_bytes!("../test_data/ttf/starts_off_curve.ttf");
62
63pub static MOSTLY_OFF_CURVE: &[u8] = include_bytes!("../test_data/ttf/mostly_off_curve.ttf");
64
65pub static INTERPOLATE_THIS: &[u8] = include_bytes!("../test_data/ttf/interpolate_this.ttf");
66
67pub static MATERIAL_SYMBOLS_SUBSET: &[u8] =
68    include_bytes!("../test_data/ttf/material_symbols_subset.ttf");
69
70pub static GLYF_COMPONENTS: &[u8] = include_bytes!("../test_data/ttf/glyf_components.ttf");
71
72pub static AUTOHINT_CMAP: &[u8] = include_bytes!("../test_data/ttf/autohint_cmap.ttf");
73
74pub static NOTOSERIFHEBREW_AUTOHINT_METRICS: &[u8] =
75    include_bytes!("../test_data/ttf/notoserifhebrew_autohint_metrics.ttf");
76
77pub static NOTOSERIFTC_AUTOHINT_METRICS: &[u8] =
78    include_bytes!("../test_data/ttf/notoseriftc_autohint_metrics.ttf");
79
80pub static NOTOSERIF_AUTOHINT_SHAPING: &[u8] =
81    include_bytes!("../test_data/ttf/notoserif_autohint_shaping.ttf");
82
83pub static TTHINT_SUBSET: &[u8] = include_bytes!("../test_data/ttf/tthint_subset.ttf");
84
85pub static VORG: &[u8] = include_bytes!("../test_data/ttf/vorg.ttf");
86
87pub static AHEM: &[u8] = include_bytes!("../test_data/ttf/ahem.ttf");
88
89pub static AVAR2_CHECKER: &[u8] = include_bytes!("../test_data/ttf/avar2checker.ttf");
90
91pub static MATERIAL_ICONS_SUBSET: &[u8] =
92    include_bytes!("../test_data/ttf/material_icons_subset.ttf");
93
94pub static TINOS_SUBSET: &[u8] = include_bytes!("../test_data/ttf/tinos_subset.ttf");
95
96pub static NOTO_HANDWRITING_SBIX: &[u8] =
97    include_bytes!("../test_data/ttf/noto_handwriting-sbix.ttf");
98
99pub mod morx {
100    // The following taken from the Unicode text rendering test fonts:
101    // <https://github.com/unicode-org/text-rendering-tests/tree/main/fonts>
102    pub static ONE: &[u8] = include_bytes!("../test_data/ttf/TestMORXOne.ttf");
103    pub static FOUR: &[u8] = include_bytes!("../test_data/ttf/TestMORXFour.ttf");
104    pub static EIGHTEEN: &[u8] = include_bytes!("../test_data/ttf/TestMORXEighteen.ttf");
105    pub static THIRTY_FOUR: &[u8] = include_bytes!("../test_data/ttf/TestMORXThirtyfour.ttf");
106    pub static FORTY_ONE: &[u8] = include_bytes!("../test_data/ttf/TestMORXFourtyone.ttf");
107}
108
109pub mod varc {
110    pub static CJK_6868: &[u8] = include_bytes!("../test_data/ttf/varc-6868.ttf");
111    pub static CONDITIONALS: &[u8] = include_bytes!("../test_data/ttf/varc-ac01-conditional.ttf");
112}
113
114pub mod closure {
115    pub static SIMPLE: &[u8] = include_bytes!("../test_data/ttf/simple_closure.ttf");
116    pub static SIMPLE_GLYPHS: &str = include_str!("../test_data/fea/simple_closure_glyphs.txt");
117    pub static RECURSIVE: &[u8] = include_bytes!("../test_data/ttf/recursive_closure.ttf");
118    pub static RECURSIVE_GLYPHS: &str =
119        include_str!("../test_data/fea/recursive_closure_glyphs.txt");
120    pub static CONTEXTUAL: &[u8] = include_bytes!("../test_data/ttf/context_closure.ttf");
121    pub static CONTEXTUAL_GLYPHS: &str =
122        include_str!("../test_data/fea/context_closure_glyphs.txt");
123    pub static RECURSIVE_CONTEXTUAL: &[u8] =
124        include_bytes!("../test_data/ttf/recursive_context_closure.ttf");
125    pub static RECURSIVE_CONTEXTUAL_GLYPHS: &str =
126        include_str!("../test_data/fea/recursive_context_closure_glyphs.txt");
127    // reuses glyph set from above
128    pub static CYCLIC_CONTEXTUAL: &[u8] =
129        include_bytes!("../test_data/ttf/cyclic_context_closure.ttf");
130    pub static CONTEXT_WITH_UNREACHABLE_BITS: &[u8] =
131        include_bytes!("../test_data/ttf/context_closure_unreachable_rule.ttf");
132    pub static CONTEXT_WITH_UNREACHABLE_BITS_GLYPHS: &str =
133        include_str!("../test_data/fea/context_closure_unreachable_rule_glyphs.txt");
134    pub static VARIATIONS_CLOSURE: &[u8] =
135        include_bytes!("../test_data/ttf/variations_closure.ttf");
136    pub static VARIATIONS_GLYPHS: &str =
137        include_str!("../test_data/fea/variations_closure_glyphs.txt");
138}
139
140pub mod post {
141
142    #[rustfmt::skip]
143    pub static SIMPLE: &[u8] = &[
144        0x00, 0x02, 0x00, 0x00, // version 2.0
145        0x00, 0x00, 0x00, 0x00, // italic angle
146        0xFF, 0xb5,             // underlinePosition -75
147        0x00, 0x32,             // underlineThickness 50
148        0x00, 0x00, 0x00, 0x00, // fixedpitch
149        0x00, 0x00, 0x00, 0x00, // min/max mem:
150        0x00, 0x00, 0x00, 0x00,
151        0x00, 0x00, 0x00, 0x00,
152        0x00, 0x00, 0x00, 0x00,
153        0x00, 0x0A,             // numGlyphs 10
154                                // glyph name index:
155        0x00, 0x00,              // glyph 0 -> name 0
156        0x00, 0x00,             // glyph 1 -> name 0
157        0x00, 0x03,              // glyph 2 -> name 3 ('space')
158        0x00, 0x04,              // glyph 3 -> name 4 ('exclam')
159        0x00, 0x06,
160        0x00, 0x07,
161        0x00, 0x08,
162        0x01, 0x02,             // glyph 7 -> name 258 first custom
163        0x01, 0x03,             // glyph 8 -> name 258 first custom
164        0x01, 0x04,             // glyph 9 -> name 258 first custom
165        0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, // 5, h e l l o
166        0x02, 0x68, 0x69, // 2, h i
167        0x4, 0x68, 0x6f, 0x6c, 0x61, // 4, h o l a
168    ];
169}
170
171pub mod cff2 {
172    /// CFF2 example table
173    /// <https://learn.microsoft.com/en-us/typography/opentype/spec/cff2#appendix-a-example-cff2-font>
174    pub static EXAMPLE: &[u8] = &[
175        0x02, 0x00, 0x05, 0x00, 0x07, 0xCF, 0x0C, 0x24, 0xC3, 0x11, 0x9B, 0x18, 0x00, 0x00, 0x00,
176        0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C,
177        0x00, 0x01, 0x00, 0x02, 0xC0, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0,
178        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
179        0x01, 0x01, 0x03, 0x05, 0x20, 0x0A, 0x20, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05,
180        0xF7, 0x06, 0xDA, 0x12, 0x77, 0x9F, 0xF8, 0x6C, 0x9D, 0xAE, 0x9A, 0xF4, 0x9A, 0x95, 0x9F,
181        0xB3, 0x9F, 0x8B, 0x8B, 0x8B, 0x8B, 0x85, 0x9A, 0x8B, 0x8B, 0x97, 0x73, 0x8B, 0x8B, 0x8C,
182        0x80, 0x8B, 0x8B, 0x8B, 0x8D, 0x8B, 0x8B, 0x8C, 0x8A, 0x8B, 0x8B, 0x97, 0x17, 0x06, 0xFB,
183        0x8E, 0x95, 0x86, 0x9D, 0x8B, 0x8B, 0x8D, 0x17, 0x07, 0x77, 0x9F, 0xF8, 0x6D, 0x9D, 0xAD,
184        0x9A, 0xF3, 0x9A, 0x95, 0x9F, 0xB3, 0x9F, 0x08, 0xFB, 0x8D, 0x95, 0x09, 0x1E, 0xA0, 0x37,
185        0x5F, 0x0C, 0x09, 0x8B, 0x0C, 0x0B, 0xC2, 0x6E, 0x9E, 0x8C, 0x17, 0x0A, 0xDB, 0x57, 0xF7,
186        0x02, 0x8C, 0x17, 0x0B, 0xB3, 0x9A, 0x77, 0x9F, 0x82, 0x8A, 0x8D, 0x17, 0x0C, 0x0C, 0xDB,
187        0x95, 0x57, 0xF7, 0x02, 0x85, 0x8B, 0x8D, 0x17, 0x0C, 0x0D, 0xF7, 0x06, 0x13, 0x00, 0x00,
188        0x00, 0x01, 0x01, 0x01, 0x1B, 0xBD, 0xBD, 0xEF, 0x8C, 0x10, 0x8B, 0x15, 0xF8, 0x88, 0x27,
189        0xFB, 0x5C, 0x8C, 0x10, 0x06, 0xF8, 0x88, 0x07, 0xFC, 0x88, 0xEF, 0xF7, 0x5C, 0x8C, 0x10,
190        0x06,
191    ];
192}
193
194/// This setup to avoid cross-crate path construction and build.rs because both caused problems for google3
195pub mod colrv1_json {
196    /// Gets the expected value for a colrv1 json test
197    pub fn expected(set_name: &str, settings: &[(&str, f32)]) -> &'static str {
198        let mut key = Vec::with_capacity(1 + settings.len());
199        key.push("colrv1_".to_string() + &set_name.to_ascii_lowercase());
200        key.extend(settings.iter().map(|(t, v)| format!("{t}_{v}")));
201        let key = key.join("_");
202        // you could generate the cases in bash using something like:
203        // for f in $(ls font-test-data/test_data/colrv1_json); do echo "\"$f\" => include_str!(\"../test_data/colrv1_json/$f\"),"; done
204        match key.as_str() {
205            "colrv1_clipbox" => include_str!("../test_data/colrv1_json/colrv1_clipbox"),
206            "colrv1_clipbox_CLIO_200" => include_str!("../test_data/colrv1_json/colrv1_clipbox_CLIO_200"),
207            "colrv1_colored_circles_v0" => include_str!("../test_data/colrv1_json/colrv1_colored_circles_v0"),
208            "colrv1_composite_mode" => include_str!("../test_data/colrv1_json/colrv1_composite_mode"),
209            "colrv1_extend_mode" => include_str!("../test_data/colrv1_json/colrv1_extend_mode"),
210            "colrv1_extend_mode_COL1_-0.25_COL3_0.25" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL1_-0.25_COL3_0.25"),
211            "colrv1_extend_mode_COL1_0.5_COL3_-0.5" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL1_0.5_COL3_-0.5"),
212            "colrv1_extend_mode_COL1_-1.5" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL1_-1.5"),
213            "colrv1_extend_mode_COL2_-0.3" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL2_-0.3"),
214            "colrv1_extend_mode_COL3_0.5" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL3_0.5"),
215            "colrv1_extend_mode_COL3_1" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL3_1"),
216            "colrv1_extend_mode_COL3_1_COL2_1.5_COL1_2" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_COL3_1_COL2_1.5_COL1_2"),
217            "colrv1_extend_mode_GRR0_-200_GRR1_-300" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_GRR0_-200_GRR1_-300"),
218            "colrv1_extend_mode_GRR0_430_GRR1_40" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_GRR0_430_GRR1_40"),
219            "colrv1_extend_mode_GRR0_-50_COL3_-2_COL2_-2_COL1_-0.9" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_GRR0_-50_COL3_-2_COL2_-2_COL1_-0.9"),
220            "colrv1_extend_mode_GRR0_-50_COL3_-2_COL2_-2_COL1_-1.1" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_GRR0_-50_COL3_-2_COL2_-2_COL1_-1.1"),
221            "colrv1_extend_mode_GRX0_1000_GRX1_-1000_GRR0_-1000_GRR1_200" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_GRX0_1000_GRX1_-1000_GRR0_-1000_GRR1_200"),
222            "colrv1_extend_mode_GRX0_-1000_GRX1_-1000_GRR0_-1000_GRR1_-900" => include_str!("../test_data/colrv1_json/colrv1_extend_mode_GRX0_-1000_GRX1_-1000_GRR0_-1000_GRR1_-900"),
223            "colrv1_foreground_color" => include_str!("../test_data/colrv1_json/colrv1_foreground_color"),
224            "colrv1_gradient_p2_skewed" => include_str!("../test_data/colrv1_json/colrv1_gradient_p2_skewed"),
225            "colrv1_gradient_stops_repeat" => include_str!("../test_data/colrv1_json/colrv1_gradient_stops_repeat"),
226            "colrv1_no_cycle_multi_colrglyph" => include_str!("../test_data/colrv1_json/colrv1_no_cycle_multi_colrglyph"),
227            "colrv1_paint_glyph_nested" => include_str!("../test_data/colrv1_json/colrv1_paint_glyph_nested"),
228            "colrv1_paint_rotate" => include_str!("../test_data/colrv1_json/colrv1_paint_rotate"),
229            "colrv1_paint_rotate_ROTA_40" => include_str!("../test_data/colrv1_json/colrv1_paint_rotate_ROTA_40"),
230            "colrv1_paint_rotate_ROTX_-250_ROTY_-250" => include_str!("../test_data/colrv1_json/colrv1_paint_rotate_ROTX_-250_ROTY_-250"),
231            "colrv1_paint_scale" => include_str!("../test_data/colrv1_json/colrv1_paint_scale"),
232            "colrv1_paint_scale_SCOX_200_SCOY_200" => include_str!("../test_data/colrv1_json/colrv1_paint_scale_SCOX_200_SCOY_200"),
233            "colrv1_paint_scale_SCSX_0.25_SCOY_0.25" => include_str!("../test_data/colrv1_json/colrv1_paint_scale_SCSX_0.25_SCOY_0.25"),
234            "colrv1_paint_scale_SCSX_-1_SCOY_-1" => include_str!("../test_data/colrv1_json/colrv1_paint_scale_SCSX_-1_SCOY_-1"),
235            "colrv1_paint_skew" => include_str!("../test_data/colrv1_json/colrv1_paint_skew"),
236            "colrv1_paint_skew_SKCX_200_SKCY_200" => include_str!("../test_data/colrv1_json/colrv1_paint_skew_SKCX_200_SKCY_200"),
237            "colrv1_paint_skew_SKXA_20" => include_str!("../test_data/colrv1_json/colrv1_paint_skew_SKXA_20"),
238            "colrv1_paint_skew_SKYA_20" => include_str!("../test_data/colrv1_json/colrv1_paint_skew_SKYA_20"),
239            "colrv1_paint_transform" => include_str!("../test_data/colrv1_json/colrv1_paint_transform"),
240            "colrv1_paint_translate" => include_str!("../test_data/colrv1_json/colrv1_paint_translate"),
241            "colrv1_paint_translate_TLDX_100_TLDY_100" => include_str!("../test_data/colrv1_json/colrv1_paint_translate_TLDX_100_TLDY_100"),
242            "colrv1_sweep_coincident" => include_str!("../test_data/colrv1_json/colrv1_sweep_coincident"),
243            "colrv1_sweep_varsweep" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep"),
244            "colrv1_sweep_varsweep_SWC1_-0.25_SWC2_0.083333336_SWC3_0.083333336_SWC4_0.25" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWC1_-0.25_SWC2_0.083333336_SWC3_0.083333336_SWC4_0.25"),
245            "colrv1_sweep_varsweep_SWPE_-45" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWPE_-45"),
246            "colrv1_sweep_varsweep_SWPE_-90" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWPE_-90"),
247            "colrv1_sweep_varsweep_SWPS_0" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWPS_0"),
248            "colrv1_sweep_varsweep_SWPS_-45_SWPE_45" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWPS_-45_SWPE_45"),
249            "colrv1_sweep_varsweep_SWPS_45_SWPE_-45_SWC1_-0.25_SWC2_-0.416687_SWC3_-0.583313_SWC4_-0.75" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWPS_45_SWPE_-45_SWC1_-0.25_SWC2_-0.416687_SWC3_-0.583313_SWC4_-0.75"),
250            "colrv1_sweep_varsweep_SWPS_90" => include_str!("../test_data/colrv1_json/colrv1_sweep_varsweep_SWPS_90"),
251            "colrv1_variable_alpha" => include_str!("../test_data/colrv1_json/colrv1_variable_alpha"),
252            "colrv1_variable_alpha_APH1_-0.7" => include_str!("../test_data/colrv1_json/colrv1_variable_alpha_APH1_-0.7"),
253            "colrv1_variable_alpha_APH2_-0.7_APH3_-0.2" => include_str!("../test_data/colrv1_json/colrv1_variable_alpha_APH2_-0.7_APH3_-0.2"),
254            _ => panic!("No entry for {key}, if this is a new test you might need to add a case"),
255        }
256    }
257}
258
259pub mod ttc {
260    pub static TTC: &[u8] = include_bytes!("../test_data/ttc/TTC.ttc");
261}
262
263pub mod meta {
264    // the table from the binary for 'Sankofa'
265    #[rustfmt::skip]
266    pub static SIMPLE_META_TABLE: &[u8] = &[
267        0x00, 0x00, 0x00, 0x01, // version 1
268        0x00, 0x00, 0x00, 0x00, // flags 0
269        0x00, 0x00, 0x00, 0x28, // reserved (?)
270        0x00, 0x00, 0x00, 0x02, // data_maps_count 2
271        0x64, 0x6c, 0x6e, 0x67, // tag: dlng
272        0x00, 0x00, 0x00, 0x28, // data offset
273        0x00, 0x00, 0x00, 0x0d, // data length
274        0x73, 0x6c, 0x6e, 0x67, // tag: slng
275        0x00, 0x00, 0x00, 0x35, // data offset
276        0x00, 0x00, 0x00, 0x04, // length
277        0x65, 0x6e, 0x2d, 0x6c,
278        0x61, 0x74, 0x6e, 0x2c,
279        0x20, 0x6c, 0x61, 0x74,
280        0x6e, 0x6c, 0x61, 0x74,
281        0x6e, 0x00, 0x00, 0x00,
282    ];
283}