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
use crate::{tree, geom::*};
pub fn view_box_to_transform(
view_box: Rect,
aspect: tree::AspectRatio,
img_size: Size,
) -> tree::Transform {
let vr = view_box;
let sx = img_size.width() / vr.width();
let sy = img_size.height() / vr.height();
let (sx, sy) = if aspect.align == tree::Align::None {
(sx, sy)
} else {
let s = if aspect.slice {
if sx < sy { sy } else { sx }
} else {
if sx > sy { sy } else { sx }
};
(s, s)
};
let x = -vr.x() * sx;
let y = -vr.y() * sy;
let w = img_size.width() - vr.width() * sx;
let h = img_size.height() - vr.height() * sy;
let (tx, ty) = aligned_pos(aspect.align, x, y, w, h);
tree::Transform::new(sx, 0.0, 0.0, sy, tx, ty)
}
pub fn aligned_pos(
align: tree::Align,
x: f64, y: f64, w: f64, h: f64,
) -> (f64, f64) {
match align {
tree::Align::None => (x, y ),
tree::Align::XMinYMin => (x, y ),
tree::Align::XMidYMin => (x + w / 2.0, y ),
tree::Align::XMaxYMin => (x + w, y ),
tree::Align::XMinYMid => (x, y + h / 2.0),
tree::Align::XMidYMid => (x + w / 2.0, y + h / 2.0),
tree::Align::XMaxYMid => (x + w, y + h / 2.0),
tree::Align::XMinYMax => (x, y + h ),
tree::Align::XMidYMax => (x + w / 2.0, y + h ),
tree::Align::XMaxYMax => (x + w, y + h ),
}
}
pub(crate) fn file_extension(path: &std::path::Path) -> Option<&str> {
if let Some(ext) = path.extension() {
ext.to_str()
} else {
None
}
}