use super::internal::{raw_tag, RawTag};
#[derive(Copy, Clone)]
pub struct SeenFeatures {
bits: [u32; 6],
}
impl SeenFeatures {
pub fn new() -> Self {
Self { bits: [0; 6] }
}
pub fn mark(&mut self, feature_index: usize) -> bool {
let word = &mut self.bits[feature_index / 32];
let bit = 1 << (feature_index % 32);
if *word & bit == 0 {
*word |= bit;
true
} else {
false
}
}
}
pub fn desc_from_at(tag: RawTag) -> Option<(usize, &'static str)> {
Some(match FEATURES.binary_search_by(|e| e.0.cmp(&tag)) {
Ok(index) => (index, FEATURES[index].1),
_ => return None,
})
}
pub fn desc_from_aat(feature: u16, selector: u16) -> Option<(usize, RawTag, &'static str)> {
let key = (feature << 8) | selector;
Some(match AAT_TO_AT.binary_search_by(|pair| pair.0.cmp(&key)) {
Ok(index) => {
let (tag, desc) = FEATURES[AAT_TO_AT[index].1 as usize];
(index, tag, desc)
}
_ => return None,
})
}
pub const FEATURES: [(u32, &'static str); 142] = [
(raw_tag(b"aalt"), "Access All Alternates"),
(raw_tag(b"abvf"), "Above-base Forms"),
(raw_tag(b"abvm"), "Above-base Mark Positioning"),
(raw_tag(b"abvs"), "Above-base Substitutions"),
(raw_tag(b"afrc"), "Alternative Fractions"),
(raw_tag(b"akhn"), "Akhands"),
(raw_tag(b"blwf"), "Below-base Forms"),
(raw_tag(b"blwm"), "Below-base Mark Positioning"),
(raw_tag(b"blws"), "Below-base Substitutions"),
(raw_tag(b"c2pc"), "Petite Capitals From Capitals"),
(raw_tag(b"c2sc"), "Small Capitals From Capitals"),
(raw_tag(b"calt"), "Contextual Alternates"),
(raw_tag(b"case"), "Case-Sensitive Forms"),
(raw_tag(b"ccmp"), "Glyph Composition / Decomposition"),
(raw_tag(b"cfar"), "Conjunct Form After Ro"),
(raw_tag(b"chws"), "Contextual Half-width Spacing"),
(raw_tag(b"cjct"), "Conjunct Forms"),
(raw_tag(b"clig"), "Contextual Ligatures"),
(raw_tag(b"cpct"), "Centered CJK Punctuation"),
(raw_tag(b"cpsp"), "Capital Spacing"),
(raw_tag(b"cswh"), "Contextual Swash"),
(raw_tag(b"curs"), "Cursive Positioning"),
(raw_tag(b"dist"), "Distances"),
(raw_tag(b"dlig"), "Discretionary Ligatures"),
(raw_tag(b"dnom"), "Denominators"),
(raw_tag(b"dtls"), "Dotless Forms"),
(raw_tag(b"expt"), "Expert Forms"),
(raw_tag(b"falt"), "Final Glyph on Line Alternates"),
(raw_tag(b"fin2"), "Terminal Forms #2"),
(raw_tag(b"fin3"), "Terminal Forms #3"),
(raw_tag(b"fina"), "Terminal Forms"),
(raw_tag(b"flac"), "Flattened accent forms"),
(raw_tag(b"frac"), "Fractions"),
(raw_tag(b"fwid"), "Full Widths"),
(raw_tag(b"half"), "Half Forms"),
(raw_tag(b"haln"), "Halant Forms"),
(raw_tag(b"halt"), "Alternate Half Widths"),
(raw_tag(b"hist"), "Historical Forms"),
(raw_tag(b"hkna"), "Horizontal Kana Alternates"),
(raw_tag(b"hlig"), "Historical Ligatures"),
(raw_tag(b"hngl"), "Hangul"),
(raw_tag(b"hojo"), "Hojo Kanji Forms"),
(raw_tag(b"hwid"), "Half Widths"),
(raw_tag(b"init"), "Initial Forms"),
(raw_tag(b"isol"), "Isolated Forms"),
(raw_tag(b"ital"), "Italics"),
(raw_tag(b"jalt"), "Justification Alternates"),
(raw_tag(b"jp78"), "JIS78 Forms"),
(raw_tag(b"jp83"), "JIS83 Forms"),
(raw_tag(b"jp90"), "JIS90 Forms"),
(raw_tag(b"jp04"), "JIS2004 Forms"),
(raw_tag(b"kern"), "Kerning"),
(raw_tag(b"lfbd"), "Left Bounds"),
(raw_tag(b"liga"), "Standard Ligatures"),
(raw_tag(b"ljmo"), "Leading Jamo Forms"),
(raw_tag(b"lnum"), "Lining Figures"),
(raw_tag(b"locl"), "Localized Forms"),
(raw_tag(b"ltra"), "Left-to-right alternates"),
(raw_tag(b"ltrm"), "Left-to-right mirrored forms"),
(raw_tag(b"mark"), "Mark Positioning"),
(raw_tag(b"med2"), "Medial Forms #2"),
(raw_tag(b"medi"), "Medial Forms"),
(raw_tag(b"mgrk"), "Mathematical Greek"),
(raw_tag(b"mkmk"), "Mark to Mark Positioning"),
(raw_tag(b"mset"), "Mark Positioning via Substitution"),
(raw_tag(b"nalt"), "Alternate Annotation Forms"),
(raw_tag(b"nlck"), "NLC Kanji Forms"),
(raw_tag(b"nukt"), "Nukta Forms"),
(raw_tag(b"numr"), "Numerators"),
(raw_tag(b"onum"), "Oldstyle Figures"),
(raw_tag(b"opbd"), "Optical Bounds"),
(raw_tag(b"ordn"), "Ordinals"),
(raw_tag(b"ornm"), "Ornaments"),
(raw_tag(b"palt"), "Proportional Alternate Widths"),
(raw_tag(b"pcap"), "Petite Capitals"),
(raw_tag(b"pkna"), "Proportional Kana"),
(raw_tag(b"pnum"), "Proportional Figures"),
(raw_tag(b"pref"), "Pre-Base Forms"),
(raw_tag(b"pres"), "Pre-base Substitutions"),
(raw_tag(b"pstf"), "Post-base Forms"),
(raw_tag(b"psts"), "Post-base Substitutions"),
(raw_tag(b"pwid"), "Proportional Widths"),
(raw_tag(b"qwid"), "Quarter Widths"),
(raw_tag(b"rand"), "Randomize"),
(raw_tag(b"rclt"), "Required Contextual Alternates"),
(raw_tag(b"rkrf"), "Rakar Forms"),
(raw_tag(b"rlig"), "Required Ligatures"),
(raw_tag(b"rphf"), "Reph Forms"),
(raw_tag(b"rtbd"), "Right Bounds"),
(raw_tag(b"rtla"), "Right-to-left alternates"),
(raw_tag(b"rtlm"), "Right-to-left mirrored forms"),
(raw_tag(b"ruby"), "Ruby Notation Forms"),
(raw_tag(b"rvrn"), "Required Variation Alternates"),
(raw_tag(b"salt"), "Stylistic Alternates"),
(raw_tag(b"sinf"), "Scientific Inferiors"),
(raw_tag(b"size"), "Optical size"),
(raw_tag(b"smcp"), "Small Capitals"),
(raw_tag(b"smpl"), "Simplified Forms"),
(raw_tag(b"ss01"), "Stylistic Set 1"),
(raw_tag(b"ss02"), "Stylistic Set 2"),
(raw_tag(b"ss03"), "Stylistic Set 3"),
(raw_tag(b"ss04"), "Stylistic Set 4"),
(raw_tag(b"ss05"), "Stylistic Set 5"),
(raw_tag(b"ss06"), "Stylistic Set 6"),
(raw_tag(b"ss07"), "Stylistic Set 7"),
(raw_tag(b"ss08"), "Stylistic Set 8"),
(raw_tag(b"ss09"), "Stylistic Set 9"),
(raw_tag(b"ss10"), "Stylistic Set 10"),
(raw_tag(b"ss11"), "Stylistic Set 11"),
(raw_tag(b"ss12"), "Stylistic Set 12"),
(raw_tag(b"ss13"), "Stylistic Set 13"),
(raw_tag(b"ss14"), "Stylistic Set 14"),
(raw_tag(b"ss15"), "Stylistic Set 15"),
(raw_tag(b"ss16"), "Stylistic Set 16"),
(raw_tag(b"ss17"), "Stylistic Set 17"),
(raw_tag(b"ss18"), "Stylistic Set 18"),
(raw_tag(b"ss19"), "Stylistic Set 19"),
(raw_tag(b"ss20"), "Stylistic Set 20"),
(raw_tag(b"ssty"), "Math script style alternates"),
(raw_tag(b"stch"), "Stretching Glyph Decomposition"),
(raw_tag(b"subs"), "Subscript"),
(raw_tag(b"sups"), "Superscript"),
(raw_tag(b"swsh"), "Swash"),
(raw_tag(b"titl"), "Titling"),
(raw_tag(b"tjmo"), "Trailing Jamo Forms"),
(raw_tag(b"tnam"), "Traditional Name Forms"),
(raw_tag(b"tnum"), "Tabular Figures"),
(raw_tag(b"trad"), "Traditional Forms"),
(raw_tag(b"twid"), "Third Widths"),
(raw_tag(b"unic"), "Unicase"),
(raw_tag(b"valt"), "Alternate Vertical Metrics"),
(raw_tag(b"vatu"), "Vattu Variants"),
(raw_tag(b"vchw"), "Vertical Contextual Half-width Spacing"),
(raw_tag(b"vert"), "Vertical Writing"),
(raw_tag(b"vhal"), "Alternate Vertical Half Metrics"),
(raw_tag(b"vjmo"), "Vowel Jamo Forms"),
(raw_tag(b"vkna"), "Vertical Kana Alternates"),
(raw_tag(b"vkrn"), "Vertical Kerning"),
(raw_tag(b"vpal"), "Proportional Alternate Vertical Metrics"),
(raw_tag(b"vrt2"), "Vertical Alternates and Rotation"),
(raw_tag(b"vrtr"), "Vertical Alternates for Rotation"),
(raw_tag(b"zero"), "Slashed Zero"),
];
pub const AAT_TO_AT: [(u16, u16); 77] = [
(256, 86),
(258, 53),
(260, 23),
(274, 15),
(276, 37),
(276, 39),
(782, 129),
(1024, 133),
(1024, 139),
(1536, 126),
(1537, 76),
(2561, 121),
(2562, 120),
(2563, 71),
(2564, 94),
(2817, 4),
(2818, 32),
(3588, 141),
(3850, 62),
(4868, 123),
(5120, 127),
(5121, 97),
(5122, 47),
(5123, 48),
(5124, 49),
(5130, 26),
(5131, 50),
(5132, 41),
(5133, 66),
(5134, 125),
(5376, 69),
(5377, 55),
(5632, 81),
(5632, 75),
(5633, 33),
(5634, 42),
(5635, 128),
(5636, 82),
(5637, 73),
(5637, 130),
(5637, 138),
(5638, 36),
(5638, 134),
(5889, 40),
(7170, 91),
(8194, 45),
(8448, 10),
(8450, 17),
(8704, 38),
(8706, 136),
(8962, 98),
(8964, 99),
(8966, 100),
(8968, 101),
(8970, 102),
(8972, 103),
(8974, 104),
(8976, 105),
(8978, 106),
(8980, 107),
(8982, 108),
(8984, 109),
(8986, 110),
(8988, 111),
(8990, 112),
(8992, 113),
(8994, 114),
(8996, 115),
(8998, 116),
(9000, 117),
(9216, 9),
(9218, 122),
(9220, 18),
(9473, 96),
(9474, 74),
(9729, 21),
(9730, 20),
];