Skip to content

Commit

Permalink
[glyphs2fontir] Use binary search instead of linear scan
Browse files Browse the repository at this point in the history
  • Loading branch information
khaledhosny committed Oct 9, 2024
1 parent 202ad73 commit 8dd4032
Showing 1 changed file with 23 additions and 21 deletions.
44 changes: 23 additions & 21 deletions glyphs-reader/src/font.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1919,23 +1919,24 @@ fn get_glyph_category(name: &str, codepoints: &BTreeSet<u32>) -> Option<(Categor
// https://github.com/googlefonts/glyphsLib/blob/24b4d340e4c82948ba121dcfe563c1450a8e69c9/Lib/glyphsLib/builder/constants.py#L186
#[rustfmt::skip]
static GLYPHS_TO_OPENTYPE_LANGUAGE_ID: &[(&str, i32)] = &[
("dflt", 0x0409), ("AFK", 0x0436), ("ARA", 0x0C01), ("ASM", 0x044D), ("AZE", 0x042C),
("BEL", 0x0423), ("BEN", 0x0845), ("BGR", 0x0402), ("BRE", 0x047E), ("CAT", 0x0403),
("CSY", 0x0405), ("DAN", 0x0406), ("DEU", 0x0407), ("ELL", 0x0408), ("ENG", 0x0409),
("ESP", 0x0C0A), ("ETI", 0x0425), ("EUQ", 0x042D), ("FIN", 0x040B), ("FLE", 0x0813),
("FOS", 0x0438), ("FRA", 0x040C), ("FRI", 0x0462), ("GRN", 0x046F), ("GUJ", 0x0447),
("HAU", 0x0468), ("HIN", 0x0439), ("HRV", 0x041A), ("HUN", 0x040E), ("HVE", 0x042B),
("IRI", 0x083C), ("ISL", 0x040F), ("ITA", 0x0410), ("IWR", 0x040D), ("JPN", 0x0411),
("KAN", 0x044B), ("KAT", 0x0437), ("KAZ", 0x043F), ("KHM", 0x0453), ("KOK", 0x0457),
("LAO", 0x0454), ("LSB", 0x082E), ("LTH", 0x0427), ("LVI", 0x0426), ("MAR", 0x044E),
("MKD", 0x042F), ("MLR", 0x044C), ("MLY", 0x043E), ("MNG", 0x0352), ("MTS", 0x043A),
("NEP", 0x0461), ("NLD", 0x0413), ("NOB", 0x0414), ("ORI", 0x0448), ("PAN", 0x0446),
("PAS", 0x0463), ("PLK", 0x0415), ("PTG", 0x0816), ("PTG-BR", 0x0416), ("RMS", 0x0417),
("ROM", 0x0418), ("RUS", 0x0419), ("SAN", 0x044F), ("SKY", 0x041B), ("SLV", 0x0424),
("SQI", 0x041C), ("SRB", 0x081A), ("SVE", 0x041D), ("TAM", 0x0449), ("TAT", 0x0444),
("TEL", 0x044A), ("THA", 0x041E), ("TIB", 0x0451), ("TRK", 0x041F), ("UKR", 0x0422),
("URD", 0x0420), ("USB", 0x042E), ("UYG", 0x0480), ("UZB", 0x0443), ("VIT", 0x042A),
("WEL", 0x0452), ("ZHH", 0x0C04), ("ZHS", 0x0804), ("ZHT", 0x0404),
("AFK", 0x0436), ("ARA", 0x0C01), ("ASM", 0x044D), ("AZE", 0x042C), ("BEL", 0x0423),
("BEN", 0x0845), ("BGR", 0x0402), ("BRE", 0x047E), ("CAT", 0x0403), ("CSY", 0x0405),
("DAN", 0x0406), ("DEU", 0x0407), ("ELL", 0x0408), ("ENG", 0x0409), ("ESP", 0x0C0A),
("ETI", 0x0425), ("EUQ", 0x042D), ("FIN", 0x040B), ("FLE", 0x0813), ("FOS", 0x0438),
("FRA", 0x040C), ("FRI", 0x0462), ("GRN", 0x046F), ("GUJ", 0x0447), ("HAU", 0x0468),
("HIN", 0x0439), ("HRV", 0x041A), ("HUN", 0x040E), ("HVE", 0x042B), ("IRI", 0x083C),
("ISL", 0x040F), ("ITA", 0x0410), ("IWR", 0x040D), ("JPN", 0x0411), ("KAN", 0x044B),
("KAT", 0x0437), ("KAZ", 0x043F), ("KHM", 0x0453), ("KOK", 0x0457), ("LAO", 0x0454),
("LSB", 0x082E), ("LTH", 0x0427), ("LVI", 0x0426), ("MAR", 0x044E), ("MKD", 0x042F),
("MLR", 0x044C), ("MLY", 0x043E), ("MNG", 0x0352), ("MTS", 0x043A), ("NEP", 0x0461),
("NLD", 0x0413), ("NOB", 0x0414), ("ORI", 0x0448), ("PAN", 0x0446), ("PAS", 0x0463),
("PLK", 0x0415), ("PTG", 0x0816), ("PTG-BR", 0x0416), ("RMS", 0x0417), ("ROM", 0x0418),
("RUS", 0x0419), ("SAN", 0x044F), ("SKY", 0x041B), ("SLV", 0x0424), ("SQI", 0x041C),
("SRB", 0x081A), ("SVE", 0x041D), ("TAM", 0x0449), ("TAT", 0x0444), ("TEL", 0x044A),
("THA", 0x041E), ("TIB", 0x0451), ("TRK", 0x041F), ("UKR", 0x0422), ("URD", 0x0420),
("USB", 0x042E), ("UYG", 0x0480), ("UZB", 0x0443), ("VIT", 0x042A), ("WEL", 0x0452),
("ZHH", 0x0C04), ("ZHS", 0x0804), ("ZHT", 0x0404),
("dflt", 0x0409),
];

impl RawFeature {
Expand Down Expand Up @@ -1971,11 +1972,12 @@ impl RawFeature {
.iter()
.filter_map(|label| {
GLYPHS_TO_OPENTYPE_LANGUAGE_ID
.iter()
.find(|entry| entry.0 == label.language)
.map(|entry| {
.binary_search_by_key(&label.language, |entry| entry.0.to_owned())
.ok()
.map(|index| {
let language_id = &GLYPHS_TO_OPENTYPE_LANGUAGE_ID[index].1;
let name = label.value.replace("\\", "\\005c").replace("\"", "\\0022");
format!(" name 3 1 0x{:04X} \"{}\";", entry.1, name)
format!(" name 3 1 0x{:04X} \"{}\";", language_id, name)
})
.or_else(|| {
warn!("Unknown feature label language: {}", label.language);
Expand Down

0 comments on commit 8dd4032

Please sign in to comment.