diff options
Diffstat (limited to 'dviware/dvisvgm/src/FontWriter.cpp')
-rw-r--r-- | dviware/dvisvgm/src/FontWriter.cpp | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/dviware/dvisvgm/src/FontWriter.cpp b/dviware/dvisvgm/src/FontWriter.cpp index 863b142c5c..d93402baf5 100644 --- a/dviware/dvisvgm/src/FontWriter.cpp +++ b/dviware/dvisvgm/src/FontWriter.cpp @@ -95,33 +95,38 @@ FontWriter::FontWriter (const PhysicalFont &font) : _font(font) { } -struct SFDActions : Glyph::Actions { +struct SFDActions : Glyph::IterationActions { explicit SFDActions (ostream &os) : _os(os) {} - void draw (char cmd, const Glyph::Point *points, int n) override { - if (cmd == 'Q') { - // convert quadratic Bézier curve to cubic one - DPair p0(_currentPoint.x(), _currentPoint.y()); - DPair p1(points[0].x(), points[0].y()); - DPair p2(points[1].x(), points[1].y()); - Bezier bezier(p0, p1, p2); - for (int i=1; i < 4; i++) - _os << lround(bezier.point(i).x()) << ' ' << lround(bezier.point(i).y()) << ' '; - _os << 'c'; - } - else { - for (int i=0; i < n; i++) - _os << points[i].x() << ' ' << points[i].y() << ' '; - switch (cmd) { - case 'M': _os << 'm'; _startPoint = points[0]; break; - case 'L': _os << 'l'; break; - case 'C': _os << 'c'; break; - case 'Z': _os << _startPoint.x() << ' ' << _startPoint.y() << " l"; _currentPoint = _startPoint; break; - } - } - if (n > 0) - _currentPoint = points[n-1]; - _os << " 0\n"; + + using Point = Glyph::Point; + void moveto (const Point &p) override {write('m', p);} + void lineto (const Point &p) override {write('l', p);} + void cubicto (const Point &p1, const Point &p2, const Point &p3) override {write('c', p1, p2, p3); } + void closepath () override {write('m', startPoint());} + + void quadto (const Point &p1, const Point &p2) override { + // convert quadratic Bézier curve to cubic one + DPair pt0(currentPoint().x(), currentPoint().y()); + DPair pt1(p1.x(), p1.y()); + DPair pt2(p2.x(), p2.y()); + Bezier b(pt0, pt1, pt2); + write('c', round(b.point(0)), round(b.point(1)), round(b.point(2)), round(b.point(3))); } + + template <typename ...Args> + void write (char cmd, const Args& ...args) { + writeParams(args...); + _os << cmd << " 0\n"; + } + + static void writeParams () {} + + template <typename Pt, typename ...Args> + void writeParams (const Pt &p, const Args& ...args) const { + _os << p.x() << ' ' << p.y() << ' '; + writeParams(args...); + } + ostream &_os; Glyph::Point _startPoint, _currentPoint; }; |