Skip to content

Commit c47194b

Browse files
committed
A bunch more checks
1 parent 174c9a9 commit c47194b

File tree

6 files changed

+317
-5
lines changed

6 files changed

+317
-5
lines changed

fontspector-checkapi/src/constants.rs

+86
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,92 @@ pub const STATIC_STYLE_NAMES: [&str; 18] = [
2020
"Black Italic",
2121
];
2222

23+
pub const VALID_SCRIPT_TAGS: [&str; 170] = [
24+
"DFLT", "adlm", "ahom", "hluw", "arab", "armn", "avst", "bali", "bamu", "bass", "batk", "beng",
25+
"bng2", "bhks", "bopo", "brah", "brai", "bugi", "buhd", "byzm", "cans", "cari", "aghb", "cakm",
26+
"cham", "cher", "chrs", "hani", "copt", "cprt", "cyrl", "DFLT", "dsrt", "deva", "dev2", "diak",
27+
"dogr", "dupl", "egyp", "elba", "elym", "ethi", "geor", "glag", "goth", "gran", "grek", "gujr",
28+
"gjr2", "gong", "guru", "gur2", "hang", "jamo", "rohg", "hano", "hatr", "hebr", "kana", "armi",
29+
"phli", "prti", "java", "kthi", "knda", "knd2", "kana", "kali", "khar", "kits", "khmr", "khoj",
30+
"sind", "lao ", "latn", "lepc", "limb", "lina", "linb", "lisu", "lyci", "lydi", "mahj", "maka",
31+
"mlym", "mlm2", "mand", "mani", "marc", "gonm", "math", "medf", "mtei", "mend", "merc", "mero",
32+
"plrd", "modi", "mong", "mroo", "mult", "musc", "mymr", "mym2", "nbat", "nand", "newa", "talu",
33+
"nko ", "nshu", "hmnp", "orya", "ory2", "ogam", "olck", "ital", "hung", "narb", "perm", "xpeo",
34+
"sogo", "sarb", "orkh", "osge", "osma", "hmng", "palm", "pauc", "phag", "phnx", "phlp", "rjng",
35+
"runr", "samr", "saur", "shrd", "shaw", "sidd", "sgnw", "sinh", "sogd", "sora", "soyo", "xsux",
36+
"sund", "sylo", "syrc", "tglg", "tagb", "tale", "lana", "tavt", "takr", "taml", "tml2", "tang",
37+
"telu", "tel2", "thaa", "thai", "tibt", "tfng", "tirh", "ugar", "vai ", "wcho", "wara", "yezi",
38+
"yi ", "zanb",
39+
];
40+
41+
pub const VALID_LANG_TAGS: [&str; 612] = [
42+
"dflt", "ABA ", "ABK ", "ACH ", "ACR ", "ADY ", "AFK ", "AFR ", "AGW ", "AIO ", "AKA ", "AKB ",
43+
"ALS ", "ALT ", "AMH ", "ANG ", "APPH", "ARA ", "ARG ", "ARI ", "ARK ", "ASM ", "AST ", "ATH ",
44+
"AVR ", "AWA ", "AYM ", "AZB ", "AZE ", "BAD ", "BAD0", "BAG ", "BAL ", "BAN ", "BAR ", "BAU ",
45+
"BBC ", "BBR ", "BCH ", "BCR ", "BDY ", "BEL ", "BEM ", "BEN ", "BGC ", "BGQ ", "BGR ", "BHI ",
46+
"BHO ", "BIK ", "BIL ", "BIS ", "BJJ ", "BKF ", "BLI ", "BLK ", "BLN ", "BLT ", "BMB ", "BML ",
47+
"BOS ", "BPY ", "BRE ", "BRH ", "BRI ", "BRM ", "BRX ", "BSH ", "BSK ", "BTD ", "BTI ", "BTK ",
48+
"BTM ", "BTS ", "BTX ", "BTZ ", "BUG ", "BYV ", "CAK ", "CAT ", "CBK ", "CCHN", "CEB ", "CGG ",
49+
"CHA ", "CHE ", "CHG ", "CHH ", "CHI ", "CHK ", "CHK0", "CHO ", "CHP ", "CHR ", "CHU ", "CHY ",
50+
"CJA ", "CJM ", "CMR ", "COP ", "COR ", "COS ", "CPP ", "CRE ", "CRR ", "CRT ", "CSB ", "CSL ",
51+
"CSY ", "CTG ", "CUK ", "DAG ", "DAN ", "DAR ", "DAX ", "DCR ", "DEU ", "DGO ", "DGR ", "DHG ",
52+
"DHV ", "DIQ ", "DIV ", "DJR ", "DJR0", "DNG ", "DNJ ", "DNK ", "DRI ", "DUJ ", "DUN ", "DZN ",
53+
"EBI ", "ECR ", "EDO ", "EFI ", "ELL ", "EMK ", "ENG ", "ERZ ", "ESP ", "ESU ", "ETI ", "EUQ ",
54+
"EVK ", "EVN ", "EWE ", "FAN ", "FAN0", "FAR ", "FAT ", "FIN ", "FJI ", "FLE ", "FMP ", "FNE ",
55+
"FON ", "FOS ", "FRA ", "FRC ", "FRI ", "FRL ", "FRP ", "FTA ", "FUL ", "FUV ", "GAD ", "GAE ",
56+
"GAG ", "GAL ", "GAR ", "GAW ", "GEZ ", "GIH ", "GIL ", "GIL0", "GKP ", "GLK ", "GMZ ", "GNN ",
57+
"GOG ", "GON ", "GRN ", "GRO ", "GUA ", "GUC ", "GUF ", "GUJ ", "GUZ ", "HAI ", "HAL ", "HAR ",
58+
"HAU ", "HAW ", "HAY ", "HAZ ", "HBN ", "HER ", "HIL ", "HIN ", "HMA ", "HMN ", "HMO ", "HND ",
59+
"HO ", "HRI ", "HRV ", "HUN ", "HYE ", "HYE0", "IBA ", "IBB ", "IBO ", "IDO ", "IJO ", "ILE ",
60+
"ILO ", "INA ", "IND ", "ING ", "INU ", "IPK ", "IPPH", "IRI ", "IRT ", "ISL ", "ISM ", "ITA ",
61+
"IWR ", "JAM ", "JAN ", "JAV ", "JBO ", "JCT ", "JII ", "JUD ", "JUL ", "KAB ", "KAB0", "KAC ",
62+
"KAL ", "KAN ", "KAR ", "KAT ", "KAZ ", "KDE ", "KEA ", "KEB ", "KEK ", "KGE ", "KHA ", "KHK ",
63+
"KHM ", "KHS ", "KHT ", "KHV ", "KHW ", "KIK ", "KIR ", "KIS ", "KIU ", "KJD ", "KJP ", "KJZ ",
64+
"KKN ", "KLM ", "KMB ", "KMN ", "KMO ", "KMS ", "KMZ ", "KNR ", "KOD ", "KOH ", "KOK ", "KOM ",
65+
"KON ", "KON0", "KOP ", "KOR ", "KOS ", "KOZ ", "KPL ", "KRI ", "KRK ", "KRL ", "KRM ", "KRN ",
66+
"KRT ", "KSH ", "KSH0", "KSI ", "KSM ", "KSW ", "KUA ", "KUI ", "KUL ", "KUM ", "KUR ", "KUU ",
67+
"KUY ", "KYK ", "KYU ", "LAD ", "LAH ", "LAK ", "LAM ", "LAO ", "LAT ", "LAZ ", "LCR ", "LDK ",
68+
"LEZ ", "LIJ ", "LIM ", "LIN ", "LIS ", "LJP ", "LKI ", "LMA ", "LMB ", "LMO ", "LMW ", "LOM ",
69+
"LRC ", "LSB ", "LSM ", "LTH ", "LTZ ", "LUA ", "LUB ", "LUG ", "LUH ", "LUO ", "LVI ", "MAD ",
70+
"MAG ", "MAH ", "MAJ ", "MAK ", "MAL ", "MAM ", "MAN ", "MAP ", "MAR ", "MAW ", "MBN ", "MBO ",
71+
"MCH ", "MCR ", "MDE ", "MDR ", "MEN ", "MER ", "MFA ", "MFE ", "MIN ", "MIZ ", "MKD ", "MKR ",
72+
"MKW ", "MLE ", "MLG ", "MLN ", "MLR ", "MLY ", "MND ", "MNG ", "MNI ", "MNK ", "MNX ", "MOH ",
73+
"MOK ", "MOL ", "MON ", "MOR ", "MOS ", "MRI ", "MTH ", "MTS ", "MUN ", "MUS ", "MWL ", "MWW ",
74+
"MYN ", "MZN ", "NAG ", "NAH ", "NAN ", "NAP ", "NAS ", "NAU ", "NAV ", "NCR ", "NDB ", "NDC ",
75+
"NDG ", "NDS ", "NEP ", "NEW ", "NGA ", "NGR ", "NHC ", "NIS ", "NIU ", "NKL ", "NKO ", "NLD ",
76+
"NOE ", "NOG ", "NOR ", "NOV ", "NSM ", "NSO ", "NTA ", "NTO ", "NYM ", "NYN ", "NZA ", "OCI ",
77+
"OCR ", "OJB ", "ORI ", "ORO ", "OSS ", "PAA ", "PAG ", "PAL ", "PAM ", "PAN ", "PAP ", "PAP0",
78+
"PAS ", "PAU ", "PCC ", "PCD ", "PDC ", "PGR ", "PHK ", "PIH ", "PIL ", "PLG ", "PLK ", "PMS ",
79+
"PNB ", "POH ", "PON ", "PRO ", "PTG ", "PWO ", "QIN ", "QUC ", "QUH ", "QUZ ", "QVI ", "QWH ",
80+
"RAJ ", "RAR ", "RBU ", "RCR ", "REJ ", "RIA ", "RIF ", "RIT ", "RKW ", "RMS ", "RMY ", "ROM ",
81+
"ROY ", "RSY ", "RTM ", "RUA ", "RUN ", "RUP ", "RUS ", "SAD ", "SAN ", "SAS ", "SAT ", "SAY ",
82+
"SCN ", "SCO ", "SCS ", "SEK ", "SEL ", "SGA ", "SGO ", "SGS ", "SHI ", "SHN ", "SIB ", "SID ",
83+
"SIG ", "SKS ", "SKY ", "SLA ", "SLV ", "SML ", "SMO ", "SNA ", "SNA0", "SND ", "SNH ", "SNK ",
84+
"SOG ", "SOP ", "SOT ", "SQI ", "SRB ", "SRD ", "SRK ", "SRR ", "SSL ", "SSM ", "STQ ", "SUK ",
85+
"SUN ", "SUR ", "SVA ", "SVE ", "SWA ", "SWK ", "SWZ ", "SXT ", "SXU ", "SYL ", "SYR ", "SYRE",
86+
"SYRJ", "SYRN", "SZL ", "TAB ", "TAJ ", "TAM ", "TAT ", "TCR ", "TDD ", "TEL ", "TET ", "TGL ",
87+
"TGN ", "TGR ", "TGY ", "THA ", "THT ", "TIB ", "TIV ", "TKM ", "TMH ", "TMN ", "TNA ", "TNE ",
88+
"TNG ", "TOD ", "TOD0", "TPI ", "TRK ", "TSG ", "TSJ ", "TUA ", "TUL ", "TUM ", "TUV ", "TVL ",
89+
"TWI ", "TYZ ", "TZM ", "TZO ", "UDM ", "UKR ", "UMB ", "URD ", "USB ", "UYG ", "UZB ", "VEC ",
90+
"VEN ", "VIT ", "VOL ", "VRO ", "WA ", "WAG ", "WAR ", "WCR ", "WEL ", "WLF ", "WLN ", "WTM ",
91+
"XBD ", "XHS ", "XJB ", "XKF ", "XOG ", "XPE ", "YAK ", "YAO ", "YAP ", "YBA ", "YCR ", "YIC ",
92+
"YIM ", "ZEA ", "ZGH ", "ZHA ", "ZHH ", "ZHP ", "ZHS ", "ZHT ", "ZHTM", "ZND ", "ZUL ", "ZZA ",
93+
];
94+
95+
pub const VALID_FEATURE_TAGS: [&str; 122] = [
96+
"aalt", "abvf", "abvm", "abvs", "afrc", "akhn", "blwf", "blwm", "blws", "c2pc", "c2sc", "calt",
97+
"case", "ccmp", "cfar", "chws", "cjct", "clig", "cpct", "cpsp", "cswh", "curs", "dist", "dlig",
98+
"dnom", "dtls", "expt", "falt", "fin2", "fin3", "fina", "flac", "frac", "fwid", "half", "haln",
99+
"halt", "hist", "hkna", "hlig", "hngl", "hojo", "hwid", "init", "isol", "ital", "jalt", "jp04",
100+
"jp78", "jp83", "jp90", "kern", "lfbd", "liga", "ljmo", "lnum", "locl", "ltra", "ltrm", "mark",
101+
"med2", "medi", "mgrk", "mkmk", "mset", "nalt", "nlck", "nukt", "numr", "onum", "opbd", "ordn",
102+
"ornm", "palt", "pcap", "pkna", "pnum", "pref", "pres", "pstf", "psts", "pwid", "qwid", "rand",
103+
"rclt", "rkrf", "rlig", "rphf", "rtbd", "rtla", "rtlm", "ruby", "rvrn", "salt", "sinf", "size",
104+
"smcp", "smpl", "ssty", "stch", "subs", "sups", "swsh", "titl", "tjmo", "tnam", "tnum", "trad",
105+
"twid", "unic", "valt", "vatu", "vchw", "vert", "vhal", "vjmo", "vkna", "vkrn", "vpal", "vrt2",
106+
"vrtr", "zero",
107+
];
108+
23109
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24110
pub enum GlyphClass {
25111
Base,
+155
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
use std::collections::HashSet;
2+
3+
use fontspector_checkapi::constants::{VALID_FEATURE_TAGS, VALID_LANG_TAGS, VALID_SCRIPT_TAGS};
4+
use fontspector_checkapi::{prelude::*, testfont, FileTypeConvert};
5+
use read_fonts::TableProvider;
6+
7+
#[check(
8+
id = "opentype/layout_valid_language_tags",
9+
rationale = "
10+
Incorrect language tags can be indications of typos, leftover debugging code
11+
or questionable approaches, or user error in the font editor. Such typos can
12+
cause features and language support to fail to work as intended.
13+
",
14+
proposal = "https://github.com/fonttools/fontbakery/issues/3355",
15+
title = "Does the font have any invalid language tags?"
16+
)]
17+
fn layout_valid_language_tags(f: &Testable, _context: &Context) -> CheckFnResult {
18+
let font = testfont!(f);
19+
let mut bad_tag = HashSet::new();
20+
21+
if let Ok(gpos) = font.font().gpos() {
22+
let scriptlist = gpos.script_list()?;
23+
for script in scriptlist.script_records() {
24+
for lang in script.script(scriptlist.offset_data())?.lang_sys_records() {
25+
let tag = lang.lang_sys_tag().to_string();
26+
if !VALID_LANG_TAGS.contains(&tag.as_str()) {
27+
bad_tag.insert(tag);
28+
}
29+
}
30+
}
31+
}
32+
33+
if let Ok(gsub) = font.font().gsub() {
34+
let scriptlist = gsub.script_list()?;
35+
for script in scriptlist.script_records() {
36+
for lang in script.script(scriptlist.offset_data())?.lang_sys_records() {
37+
let tag = lang.lang_sys_tag().to_string();
38+
if !VALID_LANG_TAGS.contains(&tag.as_str()) {
39+
bad_tag.insert(tag);
40+
}
41+
}
42+
}
43+
}
44+
45+
Ok(if bad_tag.is_empty() {
46+
Status::just_one_pass()
47+
} else {
48+
Status::just_one_fail(
49+
"bad-language-tags",
50+
&format!(
51+
"The following invalid language tags were found in the font: {}",
52+
bad_tag.into_iter().collect::<Vec<_>>().join(", ")
53+
),
54+
)
55+
})
56+
}
57+
58+
#[check(
59+
id = "opentype/layout_valid_script_tags",
60+
rationale = "
61+
Incorrect script tags can be indications of typos, leftover debugging code
62+
or questionable approaches, or user error in the font editor. Such typos can
63+
cause features and language support to fail to work as intended.
64+
",
65+
proposal = "https://github.com/fonttools/fontbakery/issues/3355",
66+
title = "Does the font have any invalid script tags?"
67+
)]
68+
fn layout_valid_script_tags(f: &Testable, _context: &Context) -> CheckFnResult {
69+
let font = testfont!(f);
70+
let mut bad_tag = HashSet::new();
71+
72+
if let Ok(gpos) = font.font().gpos() {
73+
let scriptlist = gpos.script_list()?;
74+
for script in scriptlist.script_records() {
75+
let tag = script.script_tag().to_string();
76+
if !VALID_SCRIPT_TAGS.contains(&tag.as_str()) {
77+
bad_tag.insert(tag);
78+
}
79+
}
80+
}
81+
82+
if let Ok(gsub) = font.font().gsub() {
83+
let scriptlist = gsub.script_list()?;
84+
for script in scriptlist.script_records() {
85+
let tag = script.script_tag().to_string();
86+
if !VALID_SCRIPT_TAGS.contains(&tag.as_str()) {
87+
bad_tag.insert(tag);
88+
}
89+
}
90+
}
91+
92+
Ok(if bad_tag.is_empty() {
93+
Status::just_one_pass()
94+
} else {
95+
Status::just_one_fail(
96+
"bad-language-tags",
97+
&format!(
98+
"The following invalid script tags were found in the font: {}",
99+
bad_tag.into_iter().collect::<Vec<_>>().join(", ")
100+
),
101+
)
102+
})
103+
}
104+
105+
#[check(
106+
id = "opentype/layout_valid_feature_tags",
107+
rationale = "
108+
Incorrect tags can be indications of typos, leftover debugging code
109+
or questionable approaches, or user error in the font editor. Such typos can
110+
cause features and language support to fail to work as intended.
111+
112+
Font vendors may use private tags to identify private features. These tags
113+
must be four uppercase letters (A-Z) with no punctuation, spaces, or numbers.
114+
",
115+
proposal = "https://github.com/fonttools/fontbakery/issues/3355",
116+
title = "Does the font have any invalid feature tags?"
117+
)]
118+
fn layout_valid_feature_tags(f: &Testable, _context: &Context) -> CheckFnResult {
119+
let font = testfont!(f);
120+
let mut bad_tag = HashSet::new();
121+
122+
if let Ok(gpos) = font.font().gpos() {
123+
for feature_record in gpos.feature_list()?.feature_records() {
124+
let tag = feature_record.feature_tag().to_string();
125+
if !VALID_FEATURE_TAGS.contains(&tag.as_str())
126+
&& (tag.len() != 4 || !tag.chars().all(|c| c.is_ascii_uppercase()))
127+
{
128+
bad_tag.insert(tag);
129+
}
130+
}
131+
}
132+
133+
if let Ok(gsub) = font.font().gsub() {
134+
for feature_record in gsub.feature_list()?.feature_records() {
135+
let tag = feature_record.feature_tag().to_string();
136+
if !VALID_FEATURE_TAGS.contains(&tag.as_str())
137+
&& (tag.len() != 4 || !tag.chars().all(|c| c.is_ascii_uppercase()))
138+
{
139+
bad_tag.insert(tag);
140+
}
141+
}
142+
}
143+
144+
Ok(if bad_tag.is_empty() {
145+
Status::just_one_pass()
146+
} else {
147+
Status::just_one_fail(
148+
"bad-language-tags",
149+
&format!(
150+
"The following invalid feature tags were found in the font: {}",
151+
bad_tag.into_iter().collect::<Vec<_>>().join(", ")
152+
),
153+
)
154+
})
155+
}

profile-universal/src/checks/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pub mod glyf;
66
pub mod glyphnames;
77
pub mod head;
88
pub mod hhea;
9+
pub mod layout;
910
pub mod name;
1011
pub mod name_trailing_spaces;
1112
pub mod os2;

profile-universal/src/checks/os2.rs

+33
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,36 @@ fn panose_familytype(c: &TestableCollection, _context: &Context) -> CheckFnResul
127127
"PANOSE family type is not the same across this family. In order to fix this, please make sure that the panose.bFamilyType value is the same in the OS/2 table of all of this family's font files.",
128128
)
129129
}
130+
131+
#[check(
132+
id = "opentype/vendor_id",
133+
rationale = "
134+
When a font project's Vendor ID is specified explicitly on FontBakery's
135+
configuration file, all binaries must have a matching vendor identifier
136+
value in the OS/2 table.
137+
",
138+
proposal = "https://github.com/fonttools/fontbakery/pull/3941",
139+
title = "Check OS/2 achVendID against configuration"
140+
)]
141+
fn check_vendor_id(f: &Testable, context: &Context) -> CheckFnResult {
142+
let font = testfont!(f);
143+
let vendor_id = context
144+
.check_metadata
145+
.get("vendor_id")
146+
.ok_or(CheckError::skip(
147+
"no-vendor-id",
148+
"Add the `vendor_id` key to a `fontspector.yaml` file on your font project directory to enable this check.\nYou'll also need to use the `--configuration` flag when invoking fontspector",
149+
))?;
150+
let os2_vendor_id = font.font().os2()?.ach_vend_id().to_string();
151+
if os2_vendor_id.as_str() == vendor_id {
152+
Ok(Status::just_one_pass())
153+
} else {
154+
Ok(Status::just_one_fail(
155+
"bad-vendor-id",
156+
&format!(
157+
"OS/2 achVendID value '{}' does not match configuration value '{}'",
158+
os2_vendor_id, vendor_id
159+
),
160+
))
161+
}
162+
}

profile-universal/src/checks/stat.rs

+32
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,35 @@ fn stat_has_axis_value_tables(t: &Testable, _context: &Context) -> CheckFnResult
137137

138138
return_result(messages)
139139
}
140+
141+
#[check(
142+
id = "opentype/weight_class_fvar",
143+
rationale = "According to Microsoft's OT Spec the OS/2 usWeightClass should match the fvar default value.",
144+
proposal = "https://github.com/googlefonts/gftools/issues/477",
145+
title = "Checking if OS/2 usWeightClass matches fvar."
146+
)]
147+
fn weight_class_fvar(t: &Testable, _context: &Context) -> CheckFnResult {
148+
let f = testfont!(t);
149+
skip!(!f.is_variable_font(), "not-variable", "Not a variable font");
150+
let fvar_value = f
151+
.axis_ranges()
152+
.find(|(tag, _, _, _)| tag == "wght")
153+
.map(|(_, _, default, _)| default)
154+
.ok_or(CheckError::skip("no-wght", "No 'wght' axis"))?;
155+
let os2_value = f
156+
.font()
157+
.os2()
158+
.map_err(|_| CheckError::skip("no-os2", "No OS/2 table"))?
159+
.us_weight_class();
160+
if os2_value != fvar_value as u16 {
161+
return Ok(Status::just_one_fail(
162+
"bad-weight-class",
163+
&format!(
164+
"OS/2 usWeightClass is {}, but fvar default is {}",
165+
os2_value, fvar_value
166+
),
167+
));
168+
}
169+
170+
Ok(Status::just_one_pass())
171+
}

profile-universal/src/lib.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,18 @@ impl fontspector_checkapi::Plugin for Universal {
2626
cr.register_check(checks::head::unitsperem);
2727
cr.register_check(checks::hhea::caret_slope);
2828
cr.register_check(checks::hhea::maxadvancewidth);
29+
cr.register_check(checks::layout::layout_valid_feature_tags);
30+
cr.register_check(checks::layout::layout_valid_language_tags);
31+
cr.register_check(checks::layout::layout_valid_script_tags);
2932
cr.register_check(checks::name::check_name_no_copyright_on_description);
3033
cr.register_check(checks::post::post_table_version);
3134
cr.register_check(checks::post::underline_thickness);
3235
cr.register_check(checks::stat::stat_axis_record);
3336
cr.register_check(checks::stat::stat_has_axis_value_tables);
37+
cr.register_check(checks::stat::weight_class_fvar);
3438
cr.register_check(checks::os2::fsselection);
3539
cr.register_check(checks::os2::panose_familytype);
40+
cr.register_check(checks::os2::check_vendor_id);
3641

3742
let opentype_profile = Profile::from_toml(
3843
r#"
@@ -64,6 +69,11 @@ impl fontspector_checkapi::Plugin for Universal {
6469
"opentype/varfont/same_size_instance_records",
6570
"opentype/varfont/valid_nameids",
6671
"opentype/stat_has_axis_value_tables",
72+
"opentype/layout_valid_feature_tags",
73+
"opentype/layout_valid_language_tags",
74+
"opentype/layout_valid_script_tags",
75+
"opentype/weight_class_fvar",
76+
"opentype/vendor_id",
6777
6878
# Checks left to port
6979
"opentype/cff2_call_depth",
@@ -101,9 +111,6 @@ impl fontspector_checkapi::Plugin for Universal {
101111
"opentype/italic_axis_in_stat_is_boolean", # Merge into above
102112
"opentype/italic_axis_last", # Merge into above
103113
"opentype/kern_table",
104-
"opentype/layout_valid_feature_tags",
105-
"opentype/layout_valid_language_tags",
106-
"opentype/layout_valid_script_tags",
107114
"opentype/loca/maxp_num_glyphs",
108115
"opentype/monospace",
109116
"opentype/name/italic_names",
@@ -113,8 +120,6 @@ impl fontspector_checkapi::Plugin for Universal {
113120
"opentype/postscript_name",
114121
"opentype/slant_direction",
115122
"opentype/varfont/valid_default_instance_nameids",
116-
"opentype/vendor_id",
117-
"opentype/weight_class_fvar",
118123
"opentype/xavgcharwidth",
119124
]
120125
"#,

0 commit comments

Comments
 (0)