summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src/FontWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvisvgm/src/FontWriter.cpp')
-rw-r--r--dviware/dvisvgm/src/FontWriter.cpp55
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;
};