270 lines
8.8 KiB
Rust
270 lines
8.8 KiB
Rust
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
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Returns a feature description for the specified tag.
|
|
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,
|
|
})
|
|
}
|
|
|
|
/// Returns a feature tag and description from an AAT feature
|
|
/// and selector.
|
|
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),
|
|
];
|