ab_glyph/ttfp/
outliner.rs

1use crate::{point, OutlineCurve, Point};
2#[cfg(not(feature = "std"))]
3use alloc::vec::Vec;
4
5#[derive(Debug, Default)]
6pub(crate) struct OutlineCurveBuilder {
7    last: Point,
8    last_move: Option<Point>,
9    outline: Vec<OutlineCurve>,
10}
11
12impl OutlineCurveBuilder {
13    #[inline]
14    pub(crate) fn take_outline(mut self) -> Vec<OutlineCurve> {
15        // some font glyphs implicitly close, e.g. Cantarell-VF.otf
16        owned_ttf_parser::OutlineBuilder::close(&mut self);
17        self.outline
18    }
19}
20
21impl owned_ttf_parser::OutlineBuilder for OutlineCurveBuilder {
22    #[inline]
23    fn move_to(&mut self, x: f32, y: f32) {
24        // eprintln!("M {x} {y}");
25        self.last = point(x, y);
26        self.last_move = Some(self.last);
27    }
28
29    #[inline]
30    fn line_to(&mut self, x1: f32, y1: f32) {
31        // eprintln!("L {x1} {y1}");
32        let p1 = point(x1, y1);
33        self.outline.push(OutlineCurve::Line(self.last, p1));
34        self.last = p1;
35    }
36
37    #[inline]
38    fn quad_to(&mut self, x1: f32, y1: f32, x2: f32, y2: f32) {
39        // eprintln!("Q {x1} {y1}");
40        let p1 = point(x1, y1);
41        let p2 = point(x2, y2);
42        self.outline.push(OutlineCurve::Quad(self.last, p1, p2));
43        self.last = p2;
44    }
45
46    #[inline]
47    fn curve_to(&mut self, x1: f32, y1: f32, x2: f32, y2: f32, x3: f32, y3: f32) {
48        // eprintln!("C {x1} {y1} {x3} {y3}");
49        let p1 = point(x1, y1);
50        let p2 = point(x2, y2);
51        let p3 = point(x3, y3);
52
53        self.outline
54            .push(OutlineCurve::Cubic(self.last, p1, p2, p3));
55        self.last = p3;
56    }
57
58    #[inline]
59    fn close(&mut self) {
60        // eprintln!("Z");
61        if let Some(m) = self.last_move.take() {
62            self.outline.push(OutlineCurve::Line(self.last, m));
63        }
64    }
65}