1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| fn dump_name_table( name_table: &allsorts::tables::NameTable, ) -> Result<(), allsorts::error::ParseError> { use encoding_rs::{MACINTOSH, UTF_16BE}; for name_record in &name_table.name_records { let platform = name_record.platform_id; let encoding = name_record.encoding_id; let language = name_record.language_id; let offset = usize::from(name_record.offset); let length = usize::from(name_record.length); let name_data = name_table .string_storage .offset_length(offset, length)? .data(); println!("offset={}, length = {length},{:?}",name_table.string_storage.base + offset ,name_data); let name = match (platform, encoding, language) { (0, _, _) => decode(UTF_16BE, name_data), (1, 0, _) => decode(MACINTOSH, name_data), (3, 0, _) => decode(UTF_16BE, name_data), (3, 1, _) => decode(UTF_16BE, name_data), (3, 10, _) => decode(UTF_16BE, name_data), _ => format!( "(unknown platform={} encoding={} language={})", platform, encoding, language ), }; match get_name_meaning(name_record.name_id) { Some(meaning) => println!("{}", meaning,), None => println!("name {}", name_record.name_id,), } println!("{:?}", name); println!(); } } fn get_name_meaning(name_id: u16) -> Option<&'static str> { match name_id { NameTable::COPYRIGHT_NOTICE => Some("Copyright"), NameTable::FONT_FAMILY_NAME => Some("Font Family"), NameTable::FONT_SUBFAMILY_NAME => Some("Font Subfamily"), NameTable::UNIQUE_FONT_IDENTIFIER => Some("Unique Identifier"), NameTable::FULL_FONT_NAME => Some("Full Font Name"), NameTable::VERSION_STRING => Some("Version"), NameTable::POSTSCRIPT_NAME => Some("PostScript Name"), NameTable::TRADEMARK => Some("Trademark"), NameTable::MANUFACTURER_NAME => Some("Manufacturer"), NameTable::DESIGNER => Some("Designer"), NameTable::DESCRIPTION => Some("Description"), NameTable::URL_VENDOR => Some("URL Vendor"), NameTable::URL_DESIGNER => Some("URL Designer"), NameTable::LICENSE_DESCRIPTION => Some("License Description"), NameTable::LICENSE_INFO_URL => Some("License Info URL"), NameTable::TYPOGRAPHIC_FAMILY_NAME => Some("Typographic Family"), NameTable::TYPOGRAPHIC_SUBFAMILY_NAME => Some("Typographic Subfamily"), NameTable::COMPATIBLE_FULL => Some("Compatible Full"), NameTable::SAMPLE_TEXT => Some("Sample Text"), NameTable::POSTSCRIPT_CID_FINDFONT_NAME => Some("PostScript CID findfont"), NameTable::WWS_FAMILY_NAME => Some("WWS Family Name"), NameTable::WWS_SUBFAMILY_NAME => Some("WWS Subfamily Name"), NameTable::LIGHT_BACKGROUND_PALETTE => Some("Light Background Palette"), NameTable::DARK_BACKGROUND_PALETTE => Some("Dark Background Palette"), NameTable::VARIATIONS_POSTSCRIPT_NAME_PREFIX => Some("Variations PostScript Name Prefix"), _ => None, } } pub(crate) fn decode(encoding: &'static encoding_rs::Encoding, data: &[u8]) -> String { let mut decoder = encoding.new_decoder(); if let Some(size) = decoder.max_utf8_buffer_length(data.len()) { let mut s = String::with_capacity(size); let (_res, _read, _repl) = decoder.decode_to_string(data, &mut s, true); s } else { String::new() } }
|