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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use font_types::Tag;
use crate::{tables, FontData, FontRead, FontReadWithArgs, ReadError};
pub trait TableProvider<'a> {
fn data_for_tag(&self, tag: Tag) -> Option<FontData<'a>>;
fn expect_data_for_tag(&self, tag: Tag) -> Result<FontData<'a>, ReadError> {
self.data_for_tag(tag).ok_or(ReadError::TableIsMissing(tag))
}
fn head(&self) -> Result<tables::head::Head<'a>, ReadError> {
self.expect_data_for_tag(tables::head::TAG)
.and_then(FontRead::read)
}
fn name(&self) -> Result<tables::name::Name<'a>, ReadError> {
self.expect_data_for_tag(tables::name::TAG)
.and_then(FontRead::read)
}
fn hhea(&self) -> Result<tables::hhea::Hhea<'a>, ReadError> {
self.expect_data_for_tag(tables::hhea::TAG)
.and_then(FontRead::read)
}
fn hmtx(&self) -> Result<tables::hmtx::Hmtx<'a>, ReadError> {
let num_glyphs = self.maxp().map(|maxp| maxp.num_glyphs())?;
let number_of_h_metrics = self.hhea().map(|hhea| hhea.number_of_h_metrics())?;
self.expect_data_for_tag(tables::hmtx::TAG)
.and_then(|data| {
FontReadWithArgs::read_with_args(data, &(num_glyphs, number_of_h_metrics))
})
}
fn maxp(&self) -> Result<tables::maxp::Maxp<'a>, ReadError> {
self.expect_data_for_tag(tables::maxp::TAG)
.and_then(FontRead::read)
}
fn post(&self) -> Result<tables::post::Post<'a>, ReadError> {
self.expect_data_for_tag(tables::post::TAG)
.and_then(FontRead::read)
}
fn loca(&self, is_long: impl Into<Option<bool>>) -> Result<tables::loca::Loca<'a>, ReadError> {
let is_long = match is_long.into() {
Some(val) => val,
None => self.head()?.index_to_loc_format() == 1,
};
self.expect_data_for_tag(tables::loca::TAG)
.and_then(|data| FontReadWithArgs::read_with_args(data, &is_long))
}
fn glyf(&self) -> Result<tables::glyf::Glyf<'a>, ReadError> {
self.expect_data_for_tag(tables::glyf::TAG)
.and_then(FontRead::read)
}
fn cmap(&self) -> Result<tables::cmap::Cmap<'a>, ReadError> {
self.expect_data_for_tag(tables::cmap::TAG)
.and_then(FontRead::read)
}
fn gdef(&self) -> Result<tables::gdef::Gdef<'a>, ReadError> {
self.expect_data_for_tag(tables::gdef::TAG)
.and_then(FontRead::read)
}
fn gpos(&self) -> Result<tables::gpos::Gpos<'a>, ReadError> {
self.expect_data_for_tag(tables::gpos::TAG)
.and_then(FontRead::read)
}
fn gsub(&self) -> Result<tables::gsub::Gsub<'a>, ReadError> {
self.expect_data_for_tag(tables::gsub::TAG)
.and_then(FontRead::read)
}
}