Rev 15347 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
15347 | fschmid | 1 | /* |
2 | * callback interface for SVG path data |
||
12065 | fschmid | 3 | * |
4 | * Copyright 2007 MenTaLguY <mental@rydia.net> |
||
5 | * |
||
6 | * This library is free software; you can redistribute it and/or |
||
7 | * modify it either under the terms of the GNU Lesser General Public |
||
8 | * License version 2.1 as published by the Free Software Foundation |
||
9 | * (the "LGPL") or, at your option, under the terms of the Mozilla |
||
10 | * Public License Version 1.1 (the "MPL"). If you do not alter this |
||
11 | * notice, a recipient may use your version of this file under either |
||
12 | * the MPL or the LGPL. |
||
13 | * |
||
14 | * You should have received a copy of the LGPL along with this library |
||
15 | * in the file COPYING-LGPL-2.1; if not, write to the Free Software |
||
18122 | mrdocs | 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
12065 | fschmid | 17 | * You should have received a copy of the MPL along with this library |
18 | * in the file COPYING-MPL-1.1 |
||
19 | * |
||
20 | * The contents of this file are subject to the Mozilla Public License |
||
21 | * Version 1.1 (the "License"); you may not use this file except in |
||
22 | * compliance with the License. You may obtain a copy of the License at |
||
23 | * http://www.mozilla.org/MPL/ |
||
24 | * |
||
25 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY |
||
26 | * OF ANY KIND, either express or implied. See the LGPL or the MPL for |
||
27 | * the specific language governing rights and limitations. |
||
28 | * |
||
29 | */ |
||
30 | |||
31 | #ifndef SEEN_SVG_PATH_H |
||
32 | #define SEEN_SVG_PATH_H |
||
33 | |||
34 | #include "path.h" |
||
35 | #include <iterator> |
||
36 | |||
37 | namespace Geom { |
||
38 | |||
39 | class SVGPathSink { |
||
40 | public: |
||
41 | virtual void moveTo(Point p) = 0; |
||
42 | virtual void lineTo(Point p) = 0; |
||
43 | virtual void curveTo(Point c0, Point c1, Point p) = 0; |
||
44 | virtual void quadTo(Point c, Point p) = 0; |
||
45 | virtual void arcTo(double rx, double ry, double angle, |
||
46 | bool large_arc, bool sweep, Point p) = 0; |
||
47 | virtual void closePath() = 0; |
||
48 | virtual void finish() = 0; |
||
49 | virtual ~SVGPathSink() {} |
||
50 | }; |
||
51 | |||
52 | void output_svg_path(Path &path, SVGPathSink &sink); |
||
53 | |||
54 | template <typename OutputIterator> |
||
55 | class SVGPathGenerator : public SVGPathSink { |
||
56 | public: |
||
57 | explicit SVGPathGenerator(OutputIterator out) |
||
58 | : _in_path(false), _out(out) {} |
||
59 | |||
60 | void moveTo(Point p) { |
||
61 | finish(); |
||
62 | _path.start(p); |
||
63 | _in_path = true; |
||
64 | } |
||
65 | //TODO: what if _in_path = false? |
||
66 | void lineTo(Point p) { |
||
67 | _path.template appendNew<LineSegment>(p); |
||
68 | } |
||
69 | |||
70 | void quadTo(Point c, Point p) { |
||
71 | _path.template appendNew<QuadraticBezier>(c, p); |
||
72 | } |
||
73 | |||
74 | void curveTo(Point c0, Point c1, Point p) { |
||
75 | _path.template appendNew<CubicBezier>(c0, c1, p); |
||
76 | } |
||
77 | |||
78 | void arcTo(double rx, double ry, double angle, |
||
79 | bool large_arc, bool sweep, Point p) |
||
80 | { |
||
81 | _path.template appendNew<SVGEllipticalArc>(rx, ry, angle, |
||
82 | large_arc, sweep, p); |
||
83 | } |
||
84 | |||
85 | void closePath() { |
||
86 | _path.close(); |
||
87 | finish(); |
||
88 | } |
||
89 | |||
90 | void finish() { |
||
91 | if (_in_path) { |
||
92 | _in_path = false; |
||
93 | *_out = _path; |
||
94 | _path.clear(); |
||
95 | _path.close(false); |
||
96 | } |
||
97 | } |
||
98 | |||
99 | protected: |
||
100 | bool _in_path; |
||
101 | OutputIterator _out; |
||
102 | Path _path; |
||
103 | }; |
||
104 | |||
105 | typedef std::back_insert_iterator<std::vector<Path> > iter; |
||
106 | |||
107 | class PathBuilder : public SVGPathGenerator<iter> { |
||
108 | private: |
||
109 | std::vector<Path> _pathset; |
||
110 | public: |
||
111 | PathBuilder() : SVGPathGenerator<iter>(iter(_pathset)) {} |
||
112 | std::vector<Path> const &peek() const {return _pathset;} |
||
113 | }; |
||
114 | |||
115 | } |
||
116 | |||
117 | #endif |
||
118 | /* |
||
119 | Local Variables: |
||
120 | mode:c++ |
||
121 | c-file-style:"stroustrup" |
||
122 | c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) |
||
123 | indent-tabs-mode:nil |
||
124 | fill-column:99 |
||
125 | End: |
||
126 | */ |
||
127 | // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : |