Skip to main content

ttf_view/tables/
mod.rs

1use crate::types::Tag;
2
3mod directory;
4pub use directory::*;
5
6pub mod cmap;
7pub mod head;
8pub mod hhea;
9pub mod hmtx;
10pub mod maxp;
11pub mod name;
12
13pub trait Table {
14    const TAG: Tag;
15    type Handle<'a>: TableHandle<'a>;
16    fn in_directory(dir: &TableDirectoryRepr) -> Option<Self::Handle<'_>> {
17        Self::Handle::in_directory(dir)
18    }
19}
20
21pub trait TableHandle<'a>: Sized {
22    fn in_directory(dir: &'a TableDirectoryRepr) -> Option<Self>;
23}
24
25impl<'a, T: Table> TableHandle<'a> for &'a T {
26    fn in_directory(dir: &'a TableDirectoryRepr) -> Option<Self> {
27        dir.table_raw::<T>()
28    }
29}
30
31impl TableDirectoryRepr {
32    // Note: These are all required tables, so we'll panic on their absence.
33    pub fn cmap(&self) -> &cmap::CmapTableRepr {
34        self.table::<cmap::CmapTableRepr>().unwrap()
35    }
36    pub fn head(&self) -> &head::HeadTableRepr {
37        self.table::<head::HeadTableRepr>().unwrap()
38    }
39    pub fn hhea(&self) -> &hhea::HheaTableRepr {
40        self.table::<hhea::HheaTableRepr>().unwrap()
41    }
42    pub fn hmtx(&self) -> hmtx::HmtxTableHandle<'_> {
43        self.table::<hmtx::HmtxTableRepr>().unwrap()
44    }
45    pub fn maxp(&self) -> &maxp::MaxpTableRepr {
46        self.table::<maxp::MaxpTableRepr>().unwrap()
47    }
48    pub fn name(&self) -> &name::NameTableRepr {
49        self.table::<name::NameTableRepr>().unwrap()
50    }
51}