Code

Super duper mega (fun!) commit: replaced encoding=utf-8 with fileencoding=utf-8 in...
[inkscape.git] / src / 2geom / svg-path-parser.cpp
1 /**
2  * \file
3  * \brief parse SVG path specifications
4  *
5  * Copyright 2007 MenTaLguY <mental@rydia.net>
6  * Copyright 2007 Aaron Spike <aaron@ekips.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it either under the terms of the GNU Lesser General Public
10  * License version 2.1 as published by the Free Software Foundation
11  * (the "LGPL") or, at your option, under the terms of the Mozilla
12  * Public License Version 1.1 (the "MPL"). If you do not alter this
13  * notice, a recipient may use your version of this file under either
14  * the MPL or the LGPL.
15  *
16  * You should have received a copy of the LGPL along with this library
17  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  * You should have received a copy of the MPL along with this library
20  * in the file COPYING-MPL-1.1
21  *
22  * The contents of this file are subject to the Mozilla Public License
23  * Version 1.1 (the "License"); you may not use this file except in
24  * compliance with the License. You may obtain a copy of the License at
25  * http://www.mozilla.org/MPL/
26  *
27  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
28  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
29  * the specific language governing rights and limitations.
30  *
31  */
34 #include <cmath>
35 #include <vector>
36 #include <glib.h>
38 #include <2geom/point.h>
39 #include <2geom/svg-path-parser.h>
40 #include <2geom/angle.h>
42 namespace Geom {
44 namespace {
46 class Parser {
47 public:
48     Parser(SVGPathSink &sink) : _sink(sink) {}
50     void parse(char const *str) throw(SVGPathParseError);
52 private:
53     bool _absolute;
54     Point _current;
55     Point _initial;
56     Point _cubic_tangent;
57     Point _quad_tangent;
58     std::vector<double> _params;
59     SVGPathSink &_sink;
61     void _reset() {
62         _absolute = false;
63         _current = _initial = Point(0, 0);
64         _quad_tangent = _cubic_tangent = Point(0, 0);
65         _params.clear();
66     }
68     void _push(double value) {
69         _params.push_back(value);
70     }
72     double _pop() {
73         double value = _params.back();
74         _params.pop_back();
75         return value;
76     }
78     bool _pop_flag() {
79         return _pop() != 0.0;
80     }
82     double _pop_coord(Geom::Dim2 axis) {
83         if (_absolute) {
84             return _pop();
85         } else {
86             return _pop() + _current[axis];
87         }
88     }
90     Point _pop_point() {
91         double y = _pop_coord(Geom::Y);
92         double x = _pop_coord(Geom::X);
93         return Point(x, y);
94     }
96     void _moveTo(Point p) {
97         _quad_tangent = _cubic_tangent = _current = _initial = p;
98         _sink.moveTo(p);
99     }
100     
101     void _hlineTo(Point p) {
102         _quad_tangent = _cubic_tangent = _current = p;
103         _sink.hlineTo(p[Geom::X]);
104     }
105     
106     void _vlineTo(Point p) {
107         _quad_tangent = _cubic_tangent = _current = p;
108         _sink.vlineTo(p[Geom::Y]);
109     }
111     void _lineTo(Point p) {
112         _quad_tangent = _cubic_tangent = _current = p;
113         _sink.lineTo(p);
114     }
116     void _curveTo(Point c0, Point c1, Point p) {
117         _quad_tangent = _current = p;
118         _cubic_tangent = p + ( p - c1 );
119         _sink.curveTo(c0, c1, p);
120     }
122     void _quadTo(Point c, Point p) {
123         _cubic_tangent = _current = p;
124         _quad_tangent = p + ( p - c );
125         _sink.quadTo(c, p);
126     }
128     void _arcTo(double rx, double ry, double angle,
129                 bool large_arc, bool sweep, Point p)
130     {
131         _quad_tangent = _cubic_tangent = _current = p;
132         _sink.arcTo(rx, ry, angle, large_arc, sweep, p);
133     }
135     void _closePath() {
136         _quad_tangent = _cubic_tangent = _current = _initial;
137         _sink.closePath();
138     }
139 };
142 #line 144 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp"
143 static const char _svg_path_actions[] = {
144         0, 1, 0, 1, 1, 1, 2, 1, 
145         3, 1, 4, 1, 5, 1, 15, 1, 
146         16, 2, 1, 0, 2, 1, 6, 2, 
147         1, 7, 2, 1, 8, 2, 1, 9, 
148         2, 1, 10, 2, 1, 11, 2, 1, 
149         12, 2, 1, 13, 2, 1, 14, 2, 
150         4, 0, 2, 5, 0, 2, 15, 16, 
151         3, 1, 6, 0, 3, 1, 6, 16, 
152         3, 1, 7, 0, 3, 1, 7, 16, 
153         3, 1, 8, 0, 3, 1, 8, 16, 
154         3, 1, 9, 0, 3, 1, 9, 16, 
155         3, 1, 10, 0, 3, 1, 10, 16, 
156         3, 1, 11, 0, 3, 1, 11, 16, 
157         3, 1, 12, 0, 3, 1, 12, 16, 
158         3, 1, 13, 0, 3, 1, 13, 16, 
159         3, 1, 14, 0, 3, 1, 14, 16
160         
161 };
163 static const short _svg_path_key_offsets[] = {
164         0, 0, 7, 16, 25, 28, 30, 42, 
165         52, 55, 57, 90, 121, 124, 126, 138, 
166         148, 151, 153, 186, 195, 207, 216, 249, 
167         256, 263, 265, 275, 283, 290, 292, 304, 
168         314, 317, 319, 328, 335, 341, 346, 353, 
169         359, 364, 374, 377, 379, 391, 401, 404, 
170         406, 437, 466, 476, 480, 482, 490, 499, 
171         508, 511, 513, 525, 535, 538, 540, 552, 
172         562, 565, 567, 579, 589, 592, 594, 606, 
173         616, 619, 621, 633, 643, 646, 648, 681, 
174         712, 724, 733, 745, 754, 766, 775, 787, 
175         796, 808, 817, 850, 854, 856, 887, 896, 
176         905, 908, 910, 943, 974, 1007, 1011, 1013, 
177         1044, 1053, 1062, 1071, 1074, 1076, 1088, 1098, 
178         1101, 1103, 1115, 1125, 1128, 1130, 1142, 1152, 
179         1155, 1157, 1190, 1221, 1233, 1242, 1254, 1263, 
180         1275, 1284, 1317, 1321, 1323, 1354, 1363, 1372, 
181         1375, 1377, 1389, 1399, 1402, 1404, 1416, 1426, 
182         1429, 1431, 1443, 1453, 1456, 1458, 1491, 1522, 
183         1534, 1543, 1555, 1564, 1576, 1585, 1618, 1622, 
184         1624, 1655, 1664, 1673, 1676, 1678, 1690, 1700, 
185         1703, 1705, 1738, 1769, 1781, 1790, 1823, 1827, 
186         1829, 1860, 1869, 1878, 1881, 1883, 1916, 1947, 
187         1980, 1984, 1986, 2017, 2042, 2067, 2074, 2083, 
188         2092, 2101, 2110, 2122, 2131, 2164, 2168, 2170, 
189         2201, 2210, 2219, 2228, 2237, 2241, 2243, 2253, 
190         2257, 2259, 2269, 2273, 2275, 2285, 2289, 2291, 
191         2301, 2305, 2307, 2317, 2321, 2323, 2333, 2337, 
192         2339, 2349, 2353, 2355, 2365, 2369, 2371, 2381, 
193         2385, 2387, 2397, 2401, 2403, 2413, 2417, 2419, 
194         2429, 2433, 2435, 2445, 2449, 2451, 2480, 2511, 
195         2520, 2524, 2526, 2536, 2548, 2557, 2562, 2567, 
196         2571, 2573, 2580, 2590, 2599, 2603, 2605, 2615, 
197         2627, 2631, 2633, 2664, 2668, 2670, 2680
198 };
200 static const char _svg_path_trans_keys[] = {
201         0, 13, 32, 77, 109, 9, 10, 13, 
202         32, 43, 45, 46, 9, 10, 48, 57, 
203         13, 32, 43, 45, 46, 9, 10, 48, 
204         57, 46, 48, 57, 48, 57, 13, 32, 
205         44, 46, 69, 101, 9, 10, 43, 45, 
206         48, 57, 13, 32, 44, 46, 9, 10, 
207         43, 45, 48, 57, 46, 48, 57, 48, 
208         57, 0, 13, 32, 44, 46, 65, 67, 
209         69, 72, 76, 77, 81, 83, 84, 86, 
210         90, 97, 99, 101, 104, 108, 109, 113, 
211         115, 116, 118, 122, 9, 10, 43, 45, 
212         48, 57, 0, 13, 32, 44, 46, 65, 
213         67, 72, 76, 77, 81, 83, 84, 86, 
214         90, 97, 99, 104, 108, 109, 113, 115, 
215         116, 118, 122, 9, 10, 43, 45, 48, 
216         57, 46, 48, 57, 48, 57, 13, 32, 
217         44, 46, 69, 101, 9, 10, 43, 45, 
218         48, 57, 13, 32, 44, 46, 9, 10, 
219         43, 45, 48, 57, 46, 48, 57, 48, 
220         57, 0, 13, 32, 44, 46, 65, 67, 
221         69, 72, 76, 77, 81, 83, 84, 86, 
222         90, 97, 99, 101, 104, 108, 109, 113, 
223         115, 116, 118, 122, 9, 10, 43, 45, 
224         48, 57, 13, 32, 43, 45, 46, 9, 
225         10, 48, 57, 13, 32, 44, 46, 69, 
226         101, 9, 10, 43, 45, 48, 57, 13, 
227         32, 43, 45, 46, 9, 10, 48, 57, 
228         0, 13, 32, 44, 46, 65, 67, 69, 
229         72, 76, 77, 81, 83, 84, 86, 90, 
230         97, 99, 101, 104, 108, 109, 113, 115, 
231         116, 118, 122, 9, 10, 43, 45, 48, 
232         57, 13, 32, 46, 9, 10, 48, 57, 
233         13, 32, 46, 9, 10, 48, 57, 48, 
234         57, 13, 32, 44, 46, 69, 101, 9, 
235         10, 48, 57, 13, 32, 44, 46, 9, 
236         10, 48, 57, 13, 32, 46, 9, 10, 
237         48, 57, 48, 57, 13, 32, 44, 46, 
238         69, 101, 9, 10, 43, 45, 48, 57, 
239         13, 32, 44, 46, 9, 10, 43, 45, 
240         48, 57, 46, 48, 57, 48, 57, 13, 
241         32, 44, 69, 101, 9, 10, 48, 57, 
242         13, 32, 44, 48, 49, 9, 10, 13, 
243         32, 48, 49, 9, 10, 13, 32, 44, 
244         9, 10, 13, 32, 44, 48, 49, 9, 
245         10, 13, 32, 48, 49, 9, 10, 13, 
246         32, 44, 9, 10, 13, 32, 44, 46, 
247         9, 10, 43, 45, 48, 57, 46, 48, 
248         57, 48, 57, 13, 32, 44, 46, 69, 
249         101, 9, 10, 43, 45, 48, 57, 13, 
250         32, 44, 46, 9, 10, 43, 45, 48, 
251         57, 46, 48, 57, 48, 57, 0, 13, 
252         32, 44, 46, 65, 67, 69, 72, 76, 
253         77, 81, 83, 84, 86, 90, 97, 99, 
254         101, 104, 108, 109, 113, 115, 116, 118, 
255         122, 9, 10, 48, 57, 0, 13, 32, 
256         44, 46, 65, 67, 72, 76, 77, 81, 
257         83, 84, 86, 90, 97, 99, 104, 108, 
258         109, 113, 115, 116, 118, 122, 9, 10, 
259         48, 57, 13, 32, 44, 46, 69, 101, 
260         9, 10, 48, 57, 43, 45, 48, 57, 
261         48, 57, 13, 32, 44, 46, 9, 10, 
262         48, 57, 13, 32, 43, 45, 46, 9, 
263         10, 48, 57, 13, 32, 43, 45, 46, 
264         9, 10, 48, 57, 46, 48, 57, 48, 
265         57, 13, 32, 44, 46, 69, 101, 9, 
266         10, 43, 45, 48, 57, 13, 32, 44, 
267         46, 9, 10, 43, 45, 48, 57, 46, 
268         48, 57, 48, 57, 13, 32, 44, 46, 
269         69, 101, 9, 10, 43, 45, 48, 57, 
270         13, 32, 44, 46, 9, 10, 43, 45, 
271         48, 57, 46, 48, 57, 48, 57, 13, 
272         32, 44, 46, 69, 101, 9, 10, 43, 
273         45, 48, 57, 13, 32, 44, 46, 9, 
274         10, 43, 45, 48, 57, 46, 48, 57, 
275         48, 57, 13, 32, 44, 46, 69, 101, 
276         9, 10, 43, 45, 48, 57, 13, 32, 
277         44, 46, 9, 10, 43, 45, 48, 57, 
278         46, 48, 57, 48, 57, 13, 32, 44, 
279         46, 69, 101, 9, 10, 43, 45, 48, 
280         57, 13, 32, 44, 46, 9, 10, 43, 
281         45, 48, 57, 46, 48, 57, 48, 57, 
282         0, 13, 32, 44, 46, 65, 67, 69, 
283         72, 76, 77, 81, 83, 84, 86, 90, 
284         97, 99, 101, 104, 108, 109, 113, 115, 
285         116, 118, 122, 9, 10, 43, 45, 48, 
286         57, 0, 13, 32, 44, 46, 65, 67, 
287         72, 76, 77, 81, 83, 84, 86, 90, 
288         97, 99, 104, 108, 109, 113, 115, 116, 
289         118, 122, 9, 10, 43, 45, 48, 57, 
290         13, 32, 44, 46, 69, 101, 9, 10, 
291         43, 45, 48, 57, 13, 32, 43, 45, 
292         46, 9, 10, 48, 57, 13, 32, 44, 
293         46, 69, 101, 9, 10, 43, 45, 48, 
294         57, 13, 32, 43, 45, 46, 9, 10, 
295         48, 57, 13, 32, 44, 46, 69, 101, 
296         9, 10, 43, 45, 48, 57, 13, 32, 
297         43, 45, 46, 9, 10, 48, 57, 13, 
298         32, 44, 46, 69, 101, 9, 10, 43, 
299         45, 48, 57, 13, 32, 43, 45, 46, 
300         9, 10, 48, 57, 13, 32, 44, 46, 
301         69, 101, 9, 10, 43, 45, 48, 57, 
302         13, 32, 43, 45, 46, 9, 10, 48, 
303         57, 0, 13, 32, 44, 46, 65, 67, 
304         69, 72, 76, 77, 81, 83, 84, 86, 
305         90, 97, 99, 101, 104, 108, 109, 113, 
306         115, 116, 118, 122, 9, 10, 43, 45, 
307         48, 57, 43, 45, 48, 57, 48, 57, 
308         0, 13, 32, 44, 46, 65, 67, 72, 
309         76, 77, 81, 83, 84, 86, 90, 97, 
310         99, 104, 108, 109, 113, 115, 116, 118, 
311         122, 9, 10, 43, 45, 48, 57, 13, 
312         32, 43, 45, 46, 9, 10, 48, 57, 
313         13, 32, 43, 45, 46, 9, 10, 48, 
314         57, 46, 48, 57, 48, 57, 0, 13, 
315         32, 44, 46, 65, 67, 69, 72, 76, 
316         77, 81, 83, 84, 86, 90, 97, 99, 
317         101, 104, 108, 109, 113, 115, 116, 118, 
318         122, 9, 10, 43, 45, 48, 57, 0, 
319         13, 32, 44, 46, 65, 67, 72, 76, 
320         77, 81, 83, 84, 86, 90, 97, 99, 
321         104, 108, 109, 113, 115, 116, 118, 122, 
322         9, 10, 43, 45, 48, 57, 0, 13, 
323         32, 44, 46, 65, 67, 69, 72, 76, 
324         77, 81, 83, 84, 86, 90, 97, 99, 
325         101, 104, 108, 109, 113, 115, 116, 118, 
326         122, 9, 10, 43, 45, 48, 57, 43, 
327         45, 48, 57, 48, 57, 0, 13, 32, 
328         44, 46, 65, 67, 72, 76, 77, 81, 
329         83, 84, 86, 90, 97, 99, 104, 108, 
330         109, 113, 115, 116, 118, 122, 9, 10, 
331         43, 45, 48, 57, 13, 32, 43, 45, 
332         46, 9, 10, 48, 57, 13, 32, 43, 
333         45, 46, 9, 10, 48, 57, 13, 32, 
334         43, 45, 46, 9, 10, 48, 57, 46, 
335         48, 57, 48, 57, 13, 32, 44, 46, 
336         69, 101, 9, 10, 43, 45, 48, 57, 
337         13, 32, 44, 46, 9, 10, 43, 45, 
338         48, 57, 46, 48, 57, 48, 57, 13, 
339         32, 44, 46, 69, 101, 9, 10, 43, 
340         45, 48, 57, 13, 32, 44, 46, 9, 
341         10, 43, 45, 48, 57, 46, 48, 57, 
342         48, 57, 13, 32, 44, 46, 69, 101, 
343         9, 10, 43, 45, 48, 57, 13, 32, 
344         44, 46, 9, 10, 43, 45, 48, 57, 
345         46, 48, 57, 48, 57, 0, 13, 32, 
346         44, 46, 65, 67, 69, 72, 76, 77, 
347         81, 83, 84, 86, 90, 97, 99, 101, 
348         104, 108, 109, 113, 115, 116, 118, 122, 
349         9, 10, 43, 45, 48, 57, 0, 13, 
350         32, 44, 46, 65, 67, 72, 76, 77, 
351         81, 83, 84, 86, 90, 97, 99, 104, 
352         108, 109, 113, 115, 116, 118, 122, 9, 
353         10, 43, 45, 48, 57, 13, 32, 44, 
354         46, 69, 101, 9, 10, 43, 45, 48, 
355         57, 13, 32, 43, 45, 46, 9, 10, 
356         48, 57, 13, 32, 44, 46, 69, 101, 
357         9, 10, 43, 45, 48, 57, 13, 32, 
358         43, 45, 46, 9, 10, 48, 57, 13, 
359         32, 44, 46, 69, 101, 9, 10, 43, 
360         45, 48, 57, 13, 32, 43, 45, 46, 
361         9, 10, 48, 57, 0, 13, 32, 44, 
362         46, 65, 67, 69, 72, 76, 77, 81, 
363         83, 84, 86, 90, 97, 99, 101, 104, 
364         108, 109, 113, 115, 116, 118, 122, 9, 
365         10, 43, 45, 48, 57, 43, 45, 48, 
366         57, 48, 57, 0, 13, 32, 44, 46, 
367         65, 67, 72, 76, 77, 81, 83, 84, 
368         86, 90, 97, 99, 104, 108, 109, 113, 
369         115, 116, 118, 122, 9, 10, 43, 45, 
370         48, 57, 13, 32, 43, 45, 46, 9, 
371         10, 48, 57, 13, 32, 43, 45, 46, 
372         9, 10, 48, 57, 46, 48, 57, 48, 
373         57, 13, 32, 44, 46, 69, 101, 9, 
374         10, 43, 45, 48, 57, 13, 32, 44, 
375         46, 9, 10, 43, 45, 48, 57, 46, 
376         48, 57, 48, 57, 13, 32, 44, 46, 
377         69, 101, 9, 10, 43, 45, 48, 57, 
378         13, 32, 44, 46, 9, 10, 43, 45, 
379         48, 57, 46, 48, 57, 48, 57, 13, 
380         32, 44, 46, 69, 101, 9, 10, 43, 
381         45, 48, 57, 13, 32, 44, 46, 9, 
382         10, 43, 45, 48, 57, 46, 48, 57, 
383         48, 57, 0, 13, 32, 44, 46, 65, 
384         67, 69, 72, 76, 77, 81, 83, 84, 
385         86, 90, 97, 99, 101, 104, 108, 109, 
386         113, 115, 116, 118, 122, 9, 10, 43, 
387         45, 48, 57, 0, 13, 32, 44, 46, 
388         65, 67, 72, 76, 77, 81, 83, 84, 
389         86, 90, 97, 99, 104, 108, 109, 113, 
390         115, 116, 118, 122, 9, 10, 43, 45, 
391         48, 57, 13, 32, 44, 46, 69, 101, 
392         9, 10, 43, 45, 48, 57, 13, 32, 
393         43, 45, 46, 9, 10, 48, 57, 13, 
394         32, 44, 46, 69, 101, 9, 10, 43, 
395         45, 48, 57, 13, 32, 43, 45, 46, 
396         9, 10, 48, 57, 13, 32, 44, 46, 
397         69, 101, 9, 10, 43, 45, 48, 57, 
398         13, 32, 43, 45, 46, 9, 10, 48, 
399         57, 0, 13, 32, 44, 46, 65, 67, 
400         69, 72, 76, 77, 81, 83, 84, 86, 
401         90, 97, 99, 101, 104, 108, 109, 113, 
402         115, 116, 118, 122, 9, 10, 43, 45, 
403         48, 57, 43, 45, 48, 57, 48, 57, 
404         0, 13, 32, 44, 46, 65, 67, 72, 
405         76, 77, 81, 83, 84, 86, 90, 97, 
406         99, 104, 108, 109, 113, 115, 116, 118, 
407         122, 9, 10, 43, 45, 48, 57, 13, 
408         32, 43, 45, 46, 9, 10, 48, 57, 
409         13, 32, 43, 45, 46, 9, 10, 48, 
410         57, 46, 48, 57, 48, 57, 13, 32, 
411         44, 46, 69, 101, 9, 10, 43, 45, 
412         48, 57, 13, 32, 44, 46, 9, 10, 
413         43, 45, 48, 57, 46, 48, 57, 48, 
414         57, 0, 13, 32, 44, 46, 65, 67, 
415         69, 72, 76, 77, 81, 83, 84, 86, 
416         90, 97, 99, 101, 104, 108, 109, 113, 
417         115, 116, 118, 122, 9, 10, 43, 45, 
418         48, 57, 0, 13, 32, 44, 46, 65, 
419         67, 72, 76, 77, 81, 83, 84, 86, 
420         90, 97, 99, 104, 108, 109, 113, 115, 
421         116, 118, 122, 9, 10, 43, 45, 48, 
422         57, 13, 32, 44, 46, 69, 101, 9, 
423         10, 43, 45, 48, 57, 13, 32, 43, 
424         45, 46, 9, 10, 48, 57, 0, 13, 
425         32, 44, 46, 65, 67, 69, 72, 76, 
426         77, 81, 83, 84, 86, 90, 97, 99, 
427         101, 104, 108, 109, 113, 115, 116, 118, 
428         122, 9, 10, 43, 45, 48, 57, 43, 
429         45, 48, 57, 48, 57, 0, 13, 32, 
430         44, 46, 65, 67, 72, 76, 77, 81, 
431         83, 84, 86, 90, 97, 99, 104, 108, 
432         109, 113, 115, 116, 118, 122, 9, 10, 
433         43, 45, 48, 57, 13, 32, 43, 45, 
434         46, 9, 10, 48, 57, 13, 32, 43, 
435         45, 46, 9, 10, 48, 57, 46, 48, 
436         57, 48, 57, 0, 13, 32, 44, 46, 
437         65, 67, 69, 72, 76, 77, 81, 83, 
438         84, 86, 90, 97, 99, 101, 104, 108, 
439         109, 113, 115, 116, 118, 122, 9, 10, 
440         43, 45, 48, 57, 0, 13, 32, 44, 
441         46, 65, 67, 72, 76, 77, 81, 83, 
442         84, 86, 90, 97, 99, 104, 108, 109, 
443         113, 115, 116, 118, 122, 9, 10, 43, 
444         45, 48, 57, 0, 13, 32, 44, 46, 
445         65, 67, 69, 72, 76, 77, 81, 83, 
446         84, 86, 90, 97, 99, 101, 104, 108, 
447         109, 113, 115, 116, 118, 122, 9, 10, 
448         43, 45, 48, 57, 43, 45, 48, 57, 
449         48, 57, 0, 13, 32, 44, 46, 65, 
450         67, 72, 76, 77, 81, 83, 84, 86, 
451         90, 97, 99, 104, 108, 109, 113, 115, 
452         116, 118, 122, 9, 10, 43, 45, 48, 
453         57, 0, 13, 32, 65, 67, 72, 76, 
454         77, 81, 83, 84, 86, 90, 97, 99, 
455         104, 108, 109, 113, 115, 116, 118, 122, 
456         9, 10, 0, 13, 32, 65, 67, 72, 
457         76, 77, 81, 83, 84, 86, 90, 97, 
458         99, 104, 108, 109, 113, 115, 116, 118, 
459         122, 9, 10, 13, 32, 46, 9, 10, 
460         48, 57, 13, 32, 43, 45, 46, 9, 
461         10, 48, 57, 13, 32, 43, 45, 46, 
462         9, 10, 48, 57, 13, 32, 43, 45, 
463         46, 9, 10, 48, 57, 13, 32, 43, 
464         45, 46, 9, 10, 48, 57, 13, 32, 
465         44, 46, 69, 101, 9, 10, 43, 45, 
466         48, 57, 13, 32, 43, 45, 46, 9, 
467         10, 48, 57, 0, 13, 32, 44, 46, 
468         65, 67, 69, 72, 76, 77, 81, 83, 
469         84, 86, 90, 97, 99, 101, 104, 108, 
470         109, 113, 115, 116, 118, 122, 9, 10, 
471         43, 45, 48, 57, 43, 45, 48, 57, 
472         48, 57, 0, 13, 32, 44, 46, 65, 
473         67, 72, 76, 77, 81, 83, 84, 86, 
474         90, 97, 99, 104, 108, 109, 113, 115, 
475         116, 118, 122, 9, 10, 43, 45, 48, 
476         57, 13, 32, 43, 45, 46, 9, 10, 
477         48, 57, 13, 32, 43, 45, 46, 9, 
478         10, 48, 57, 13, 32, 43, 45, 46, 
479         9, 10, 48, 57, 13, 32, 43, 45, 
480         46, 9, 10, 48, 57, 43, 45, 48, 
481         57, 48, 57, 13, 32, 44, 46, 9, 
482         10, 43, 45, 48, 57, 43, 45, 48, 
483         57, 48, 57, 13, 32, 44, 46, 9, 
484         10, 43, 45, 48, 57, 43, 45, 48, 
485         57, 48, 57, 13, 32, 44, 46, 9, 
486         10, 43, 45, 48, 57, 43, 45, 48, 
487         57, 48, 57, 13, 32, 44, 46, 9, 
488         10, 43, 45, 48, 57, 43, 45, 48, 
489         57, 48, 57, 13, 32, 44, 46, 9, 
490         10, 43, 45, 48, 57, 43, 45, 48, 
491         57, 48, 57, 13, 32, 44, 46, 9, 
492         10, 43, 45, 48, 57, 43, 45, 48, 
493         57, 48, 57, 13, 32, 44, 46, 9, 
494         10, 43, 45, 48, 57, 43, 45, 48, 
495         57, 48, 57, 13, 32, 44, 46, 9, 
496         10, 43, 45, 48, 57, 43, 45, 48, 
497         57, 48, 57, 13, 32, 44, 46, 9, 
498         10, 43, 45, 48, 57, 43, 45, 48, 
499         57, 48, 57, 13, 32, 44, 46, 9, 
500         10, 43, 45, 48, 57, 43, 45, 48, 
501         57, 48, 57, 13, 32, 44, 46, 9, 
502         10, 43, 45, 48, 57, 43, 45, 48, 
503         57, 48, 57, 13, 32, 44, 46, 9, 
504         10, 43, 45, 48, 57, 43, 45, 48, 
505         57, 48, 57, 13, 32, 44, 46, 9, 
506         10, 43, 45, 48, 57, 43, 45, 48, 
507         57, 48, 57, 0, 13, 32, 44, 46, 
508         65, 67, 72, 76, 77, 81, 83, 84, 
509         86, 90, 97, 99, 104, 108, 109, 113, 
510         115, 116, 118, 122, 9, 10, 48, 57, 
511         0, 13, 32, 44, 46, 65, 67, 69, 
512         72, 76, 77, 81, 83, 84, 86, 90, 
513         97, 99, 101, 104, 108, 109, 113, 115, 
514         116, 118, 122, 9, 10, 48, 57, 13, 
515         32, 43, 45, 46, 9, 10, 48, 57, 
516         43, 45, 48, 57, 48, 57, 13, 32, 
517         44, 46, 9, 10, 43, 45, 48, 57, 
518         13, 32, 44, 46, 69, 101, 9, 10, 
519         43, 45, 48, 57, 13, 32, 43, 45, 
520         46, 9, 10, 48, 57, 13, 32, 44, 
521         9, 10, 13, 32, 44, 9, 10, 43, 
522         45, 48, 57, 48, 57, 13, 32, 44, 
523         9, 10, 48, 57, 13, 32, 44, 46, 
524         69, 101, 9, 10, 48, 57, 13, 32, 
525         43, 45, 46, 9, 10, 48, 57, 43, 
526         45, 48, 57, 48, 57, 13, 32, 44, 
527         46, 9, 10, 43, 45, 48, 57, 13, 
528         32, 44, 46, 69, 101, 9, 10, 43, 
529         45, 48, 57, 43, 45, 48, 57, 48, 
530         57, 0, 13, 32, 44, 46, 65, 67, 
531         72, 76, 77, 81, 83, 84, 86, 90, 
532         97, 99, 104, 108, 109, 113, 115, 116, 
533         118, 122, 9, 10, 43, 45, 48, 57, 
534         43, 45, 48, 57, 48, 57, 13, 32, 
535         44, 46, 9, 10, 43, 45, 48, 57, 
536         0
537 };
539 static const char _svg_path_single_lengths[] = {
540         0, 5, 5, 5, 1, 0, 6, 4, 
541         1, 0, 27, 25, 1, 0, 6, 4, 
542         1, 0, 27, 5, 6, 5, 27, 3, 
543         3, 0, 6, 4, 3, 0, 6, 4, 
544         1, 0, 5, 5, 4, 3, 5, 4, 
545         3, 4, 1, 0, 6, 4, 1, 0, 
546         27, 25, 6, 2, 0, 4, 5, 5, 
547         1, 0, 6, 4, 1, 0, 6, 4, 
548         1, 0, 6, 4, 1, 0, 6, 4, 
549         1, 0, 6, 4, 1, 0, 27, 25, 
550         6, 5, 6, 5, 6, 5, 6, 5, 
551         6, 5, 27, 2, 0, 25, 5, 5, 
552         1, 0, 27, 25, 27, 2, 0, 25, 
553         5, 5, 5, 1, 0, 6, 4, 1, 
554         0, 6, 4, 1, 0, 6, 4, 1, 
555         0, 27, 25, 6, 5, 6, 5, 6, 
556         5, 27, 2, 0, 25, 5, 5, 1, 
557         0, 6, 4, 1, 0, 6, 4, 1, 
558         0, 6, 4, 1, 0, 27, 25, 6, 
559         5, 6, 5, 6, 5, 27, 2, 0, 
560         25, 5, 5, 1, 0, 6, 4, 1, 
561         0, 27, 25, 6, 5, 27, 2, 0, 
562         25, 5, 5, 1, 0, 27, 25, 27, 
563         2, 0, 25, 23, 23, 3, 5, 5, 
564         5, 5, 6, 5, 27, 2, 0, 25, 
565         5, 5, 5, 5, 2, 0, 4, 2, 
566         0, 4, 2, 0, 4, 2, 0, 4, 
567         2, 0, 4, 2, 0, 4, 2, 0, 
568         4, 2, 0, 4, 2, 0, 4, 2, 
569         0, 4, 2, 0, 4, 2, 0, 4, 
570         2, 0, 4, 2, 0, 25, 27, 5, 
571         2, 0, 4, 6, 5, 3, 3, 2, 
572         0, 3, 6, 5, 2, 0, 4, 6, 
573         2, 0, 25, 2, 0, 4, 0
574 };
576 static const char _svg_path_range_lengths[] = {
577         0, 1, 2, 2, 1, 1, 3, 3, 
578         1, 1, 3, 3, 1, 1, 3, 3, 
579         1, 1, 3, 2, 3, 2, 3, 2, 
580         2, 1, 2, 2, 2, 1, 3, 3, 
581         1, 1, 2, 1, 1, 1, 1, 1, 
582         1, 3, 1, 1, 3, 3, 1, 1, 
583         2, 2, 2, 1, 1, 2, 2, 2, 
584         1, 1, 3, 3, 1, 1, 3, 3, 
585         1, 1, 3, 3, 1, 1, 3, 3, 
586         1, 1, 3, 3, 1, 1, 3, 3, 
587         3, 2, 3, 2, 3, 2, 3, 2, 
588         3, 2, 3, 1, 1, 3, 2, 2, 
589         1, 1, 3, 3, 3, 1, 1, 3, 
590         2, 2, 2, 1, 1, 3, 3, 1, 
591         1, 3, 3, 1, 1, 3, 3, 1, 
592         1, 3, 3, 3, 2, 3, 2, 3, 
593         2, 3, 1, 1, 3, 2, 2, 1, 
594         1, 3, 3, 1, 1, 3, 3, 1, 
595         1, 3, 3, 1, 1, 3, 3, 3, 
596         2, 3, 2, 3, 2, 3, 1, 1, 
597         3, 2, 2, 1, 1, 3, 3, 1, 
598         1, 3, 3, 3, 2, 3, 1, 1, 
599         3, 2, 2, 1, 1, 3, 3, 3, 
600         1, 1, 3, 1, 1, 2, 2, 2, 
601         2, 2, 3, 2, 3, 1, 1, 3, 
602         2, 2, 2, 2, 1, 1, 3, 1, 
603         1, 3, 1, 1, 3, 1, 1, 3, 
604         1, 1, 3, 1, 1, 3, 1, 1, 
605         3, 1, 1, 3, 1, 1, 3, 1, 
606         1, 3, 1, 1, 3, 1, 1, 3, 
607         1, 1, 3, 1, 1, 2, 2, 2, 
608         1, 1, 3, 3, 2, 1, 1, 1, 
609         1, 2, 2, 2, 1, 1, 3, 3, 
610         1, 1, 3, 1, 1, 3, 0
611 };
613 static const short _svg_path_index_offsets[] = {
614         0, 0, 7, 15, 23, 26, 28, 38, 
615         46, 49, 51, 82, 111, 114, 116, 126, 
616         134, 137, 139, 170, 178, 188, 196, 227, 
617         233, 239, 241, 250, 257, 263, 265, 275, 
618         283, 286, 288, 296, 303, 309, 314, 321, 
619         327, 332, 340, 343, 345, 355, 363, 366, 
620         368, 398, 426, 435, 439, 441, 448, 456, 
621         464, 467, 469, 479, 487, 490, 492, 502, 
622         510, 513, 515, 525, 533, 536, 538, 548, 
623         556, 559, 561, 571, 579, 582, 584, 615, 
624         644, 654, 662, 672, 680, 690, 698, 708, 
625         716, 726, 734, 765, 769, 771, 800, 808, 
626         816, 819, 821, 852, 881, 912, 916, 918, 
627         947, 955, 963, 971, 974, 976, 986, 994, 
628         997, 999, 1009, 1017, 1020, 1022, 1032, 1040, 
629         1043, 1045, 1076, 1105, 1115, 1123, 1133, 1141, 
630         1151, 1159, 1190, 1194, 1196, 1225, 1233, 1241, 
631         1244, 1246, 1256, 1264, 1267, 1269, 1279, 1287, 
632         1290, 1292, 1302, 1310, 1313, 1315, 1346, 1375, 
633         1385, 1393, 1403, 1411, 1421, 1429, 1460, 1464, 
634         1466, 1495, 1503, 1511, 1514, 1516, 1526, 1534, 
635         1537, 1539, 1570, 1599, 1609, 1617, 1648, 1652, 
636         1654, 1683, 1691, 1699, 1702, 1704, 1735, 1764, 
637         1795, 1799, 1801, 1830, 1855, 1880, 1886, 1894, 
638         1902, 1910, 1918, 1928, 1936, 1967, 1971, 1973, 
639         2002, 2010, 2018, 2026, 2034, 2038, 2040, 2048, 
640         2052, 2054, 2062, 2066, 2068, 2076, 2080, 2082, 
641         2090, 2094, 2096, 2104, 2108, 2110, 2118, 2122, 
642         2124, 2132, 2136, 2138, 2146, 2150, 2152, 2160, 
643         2164, 2166, 2174, 2178, 2180, 2188, 2192, 2194, 
644         2202, 2206, 2208, 2216, 2220, 2222, 2250, 2280, 
645         2288, 2292, 2294, 2302, 2312, 2320, 2325, 2330, 
646         2334, 2336, 2342, 2351, 2359, 2363, 2365, 2373, 
647         2383, 2387, 2389, 2418, 2422, 2424, 2432
648 };
650 static const short _svg_path_indicies[] = {
651         0, 2, 2, 3, 4, 2, 1, 5, 
652         5, 6, 6, 7, 5, 8, 1, 9, 
653         9, 10, 10, 11, 9, 12, 1, 13, 
654         14, 1, 15, 1, 16, 16, 18, 19, 
655         20, 20, 16, 17, 15, 1, 21, 21, 
656         23, 24, 21, 22, 25, 1, 26, 27, 
657         1, 28, 1, 29, 30, 30, 32, 33, 
658         34, 35, 36, 37, 38, 39, 40, 41, 
659         42, 43, 44, 45, 46, 36, 47, 48, 
660         49, 50, 51, 52, 53, 44, 30, 31, 
661         28, 1, 0, 54, 54, 56, 57, 59, 
662         60, 61, 62, 3, 63, 64, 65, 66, 
663         67, 68, 69, 70, 71, 4, 72, 73, 
664         74, 75, 67, 54, 55, 58, 1, 76, 
665         77, 1, 78, 1, 79, 79, 81, 82, 
666         83, 83, 79, 80, 78, 1, 84, 84, 
667         86, 87, 84, 85, 88, 1, 89, 90, 
668         1, 91, 1, 92, 93, 93, 95, 96, 
669         97, 98, 99, 100, 101, 102, 103, 104, 
670         105, 106, 107, 108, 109, 99, 110, 111, 
671         112, 113, 114, 115, 116, 107, 93, 94, 
672         91, 1, 56, 56, 55, 55, 57, 56, 
673         58, 1, 79, 79, 81, 78, 83, 83, 
674         79, 80, 77, 1, 86, 86, 85, 85, 
675         87, 86, 88, 1, 92, 93, 93, 95, 
676         91, 97, 98, 99, 100, 101, 102, 103, 
677         104, 105, 106, 107, 108, 109, 99, 110, 
678         111, 112, 113, 114, 115, 116, 107, 93, 
679         94, 90, 1, 117, 117, 118, 117, 119, 
680         1, 120, 120, 121, 120, 122, 1, 123, 
681         1, 124, 124, 125, 126, 127, 127, 124, 
682         123, 1, 128, 128, 129, 130, 128, 131, 
683         1, 129, 129, 130, 129, 131, 1, 132, 
684         1, 133, 133, 135, 136, 137, 137, 133, 
685         134, 132, 1, 138, 138, 140, 141, 138, 
686         139, 142, 1, 143, 144, 1, 145, 1, 
687         146, 146, 147, 148, 148, 146, 145, 1, 
688         149, 149, 150, 151, 152, 149, 1, 150, 
689         150, 151, 152, 150, 1, 153, 153, 154, 
690         153, 1, 155, 155, 156, 157, 158, 155, 
691         1, 156, 156, 157, 158, 156, 1, 159, 
692         159, 160, 159, 1, 161, 161, 163, 164, 
693         161, 162, 165, 1, 166, 167, 1, 168, 
694         1, 169, 169, 171, 172, 173, 173, 169, 
695         170, 168, 1, 174, 174, 176, 177, 174, 
696         175, 178, 1, 179, 180, 1, 181, 1, 
697         182, 183, 183, 184, 185, 186, 187, 188, 
698         189, 190, 191, 192, 193, 194, 195, 196, 
699         197, 198, 188, 199, 200, 201, 202, 203, 
700         204, 205, 196, 183, 181, 1, 0, 206, 
701         206, 120, 121, 59, 60, 61, 62, 3, 
702         63, 64, 65, 66, 67, 68, 69, 70, 
703         71, 4, 72, 73, 74, 75, 67, 206, 
704         122, 1, 124, 124, 125, 123, 127, 127, 
705         124, 207, 1, 208, 208, 209, 1, 209, 
706         1, 124, 124, 125, 126, 124, 209, 1, 
707         210, 210, 211, 211, 212, 210, 213, 1, 
708         214, 214, 215, 215, 216, 214, 217, 1, 
709         218, 219, 1, 220, 1, 221, 221, 223, 
710         224, 225, 225, 221, 222, 220, 1, 226, 
711         226, 228, 229, 226, 227, 230, 1, 231, 
712         232, 1, 233, 1, 234, 234, 236, 237, 
713         238, 238, 234, 235, 233, 1, 239, 239, 
714         241, 242, 239, 240, 243, 1, 244, 245, 
715         1, 246, 1, 247, 247, 249, 250, 251, 
716         251, 247, 248, 246, 1, 252, 252, 254, 
717         255, 252, 253, 256, 1, 257, 258, 1, 
718         259, 1, 260, 260, 262, 263, 264, 264, 
719         260, 261, 259, 1, 265, 265, 267, 268, 
720         265, 266, 269, 1, 270, 271, 1, 272, 
721         1, 273, 273, 275, 276, 277, 277, 273, 
722         274, 272, 1, 278, 278, 280, 281, 278, 
723         279, 282, 1, 283, 284, 1, 285, 1, 
724         286, 287, 287, 289, 290, 291, 292, 293, 
725         294, 295, 296, 297, 298, 299, 300, 301, 
726         302, 303, 293, 304, 305, 306, 307, 308, 
727         309, 310, 301, 287, 288, 285, 1, 0, 
728         311, 311, 214, 216, 59, 60, 61, 62, 
729         3, 63, 64, 65, 66, 67, 68, 69, 
730         70, 71, 4, 72, 73, 74, 75, 67, 
731         311, 215, 217, 1, 221, 221, 223, 220, 
732         225, 225, 221, 222, 219, 1, 228, 228, 
733         227, 227, 229, 228, 230, 1, 234, 234, 
734         236, 233, 238, 238, 234, 235, 232, 1, 
735         241, 241, 240, 240, 242, 241, 243, 1, 
736         247, 247, 249, 246, 251, 251, 247, 248, 
737         245, 1, 254, 254, 253, 253, 255, 254, 
738         256, 1, 260, 260, 262, 259, 264, 264, 
739         260, 261, 258, 1, 267, 267, 266, 266, 
740         268, 267, 269, 1, 273, 273, 275, 272, 
741         277, 277, 273, 274, 271, 1, 280, 280, 
742         279, 279, 281, 280, 282, 1, 286, 287, 
743         287, 289, 285, 291, 292, 293, 294, 295, 
744         296, 297, 298, 299, 300, 301, 302, 303, 
745         293, 304, 305, 306, 307, 308, 309, 310, 
746         301, 287, 288, 284, 1, 312, 312, 313, 
747         1, 313, 1, 286, 287, 287, 289, 290, 
748         291, 292, 294, 295, 296, 297, 298, 299, 
749         300, 301, 302, 303, 304, 305, 306, 307, 
750         308, 309, 310, 301, 287, 288, 313, 1, 
751         314, 314, 315, 315, 316, 314, 317, 1, 
752         318, 318, 319, 319, 320, 318, 321, 1, 
753         322, 323, 1, 324, 1, 325, 326, 326, 
754         328, 329, 330, 331, 332, 333, 334, 335, 
755         336, 337, 338, 339, 340, 341, 342, 332, 
756         343, 344, 345, 346, 347, 348, 349, 340, 
757         326, 327, 324, 1, 0, 350, 350, 318, 
758         320, 59, 60, 61, 62, 3, 63, 64, 
759         65, 66, 67, 68, 69, 70, 71, 4, 
760         72, 73, 74, 75, 67, 350, 319, 321, 
761         1, 325, 326, 326, 328, 324, 330, 331, 
762         332, 333, 334, 335, 336, 337, 338, 339, 
763         340, 341, 342, 332, 343, 344, 345, 346, 
764         347, 348, 349, 340, 326, 327, 323, 1, 
765         351, 351, 352, 1, 352, 1, 325, 326, 
766         326, 328, 329, 330, 331, 333, 334, 335, 
767         336, 337, 338, 339, 340, 341, 342, 343, 
768         344, 345, 346, 347, 348, 349, 340, 326, 
769         327, 352, 1, 353, 353, 354, 354, 355, 
770         353, 356, 1, 357, 357, 358, 358, 359, 
771         357, 360, 1, 361, 361, 362, 362, 363, 
772         361, 364, 1, 365, 366, 1, 367, 1, 
773         368, 368, 370, 371, 372, 372, 368, 369, 
774         367, 1, 373, 373, 375, 376, 373, 374, 
775         377, 1, 378, 379, 1, 380, 1, 381, 
776         381, 383, 384, 385, 385, 381, 382, 380, 
777         1, 386, 386, 388, 389, 386, 387, 390, 
778         1, 391, 392, 1, 393, 1, 394, 394, 
779         396, 397, 398, 398, 394, 395, 393, 1, 
780         399, 399, 401, 402, 399, 400, 403, 1, 
781         404, 405, 1, 406, 1, 407, 408, 408, 
782         410, 411, 412, 413, 414, 415, 416, 417, 
783         418, 419, 420, 421, 422, 423, 424, 414, 
784         425, 426, 427, 428, 429, 430, 431, 422, 
785         408, 409, 406, 1, 0, 432, 432, 361, 
786         363, 59, 60, 61, 62, 3, 63, 64, 
787         65, 66, 67, 68, 69, 70, 71, 4, 
788         72, 73, 74, 75, 67, 432, 362, 364, 
789         1, 368, 368, 370, 367, 372, 372, 368, 
790         369, 366, 1, 375, 375, 374, 374, 376, 
791         375, 377, 1, 381, 381, 383, 380, 385, 
792         385, 381, 382, 379, 1, 388, 388, 387, 
793         387, 389, 388, 390, 1, 394, 394, 396, 
794         393, 398, 398, 394, 395, 392, 1, 401, 
795         401, 400, 400, 402, 401, 403, 1, 407, 
796         408, 408, 410, 406, 412, 413, 414, 415, 
797         416, 417, 418, 419, 420, 421, 422, 423, 
798         424, 414, 425, 426, 427, 428, 429, 430, 
799         431, 422, 408, 409, 405, 1, 433, 433, 
800         434, 1, 434, 1, 407, 408, 408, 410, 
801         411, 412, 413, 415, 416, 417, 418, 419, 
802         420, 421, 422, 423, 424, 425, 426, 427, 
803         428, 429, 430, 431, 422, 408, 409, 434, 
804         1, 435, 435, 436, 436, 437, 435, 438, 
805         1, 439, 439, 440, 440, 441, 439, 442, 
806         1, 443, 444, 1, 445, 1, 446, 446, 
807         448, 449, 450, 450, 446, 447, 445, 1, 
808         451, 451, 453, 454, 451, 452, 455, 1, 
809         456, 457, 1, 458, 1, 459, 459, 461, 
810         462, 463, 463, 459, 460, 458, 1, 464, 
811         464, 466, 467, 464, 465, 468, 1, 469, 
812         470, 1, 471, 1, 472, 472, 474, 475, 
813         476, 476, 472, 473, 471, 1, 477, 477, 
814         479, 480, 477, 478, 481, 1, 482, 483, 
815         1, 484, 1, 485, 486, 486, 488, 489, 
816         490, 491, 492, 493, 494, 495, 496, 497, 
817         498, 499, 500, 501, 502, 492, 503, 504, 
818         505, 506, 507, 508, 509, 500, 486, 487, 
819         484, 1, 0, 510, 510, 439, 441, 59, 
820         60, 61, 62, 3, 63, 64, 65, 66, 
821         67, 68, 69, 70, 71, 4, 72, 73, 
822         74, 75, 67, 510, 440, 442, 1, 446, 
823         446, 448, 445, 450, 450, 446, 447, 444, 
824         1, 453, 453, 452, 452, 454, 453, 455, 
825         1, 459, 459, 461, 458, 463, 463, 459, 
826         460, 457, 1, 466, 466, 465, 465, 467, 
827         466, 468, 1, 472, 472, 474, 471, 476, 
828         476, 472, 473, 470, 1, 479, 479, 478, 
829         478, 480, 479, 481, 1, 485, 486, 486, 
830         488, 484, 490, 491, 492, 493, 494, 495, 
831         496, 497, 498, 499, 500, 501, 502, 492, 
832         503, 504, 505, 506, 507, 508, 509, 500, 
833         486, 487, 483, 1, 511, 511, 512, 1, 
834         512, 1, 485, 486, 486, 488, 489, 490, 
835         491, 493, 494, 495, 496, 497, 498, 499, 
836         500, 501, 502, 503, 504, 505, 506, 507, 
837         508, 509, 500, 486, 487, 512, 1, 513, 
838         513, 514, 514, 515, 513, 516, 1, 517, 
839         517, 518, 518, 519, 517, 520, 1, 521, 
840         522, 1, 523, 1, 524, 524, 526, 527, 
841         528, 528, 524, 525, 523, 1, 529, 529, 
842         531, 532, 529, 530, 533, 1, 534, 535, 
843         1, 536, 1, 537, 538, 538, 540, 541, 
844         542, 543, 544, 545, 546, 547, 548, 549, 
845         550, 551, 552, 553, 554, 544, 555, 556, 
846         557, 558, 559, 560, 561, 552, 538, 539, 
847         536, 1, 0, 562, 562, 517, 519, 59, 
848         60, 61, 62, 3, 63, 64, 65, 66, 
849         67, 68, 69, 70, 71, 4, 72, 73, 
850         74, 75, 67, 562, 518, 520, 1, 524, 
851         524, 526, 523, 528, 528, 524, 525, 522, 
852         1, 531, 531, 530, 530, 532, 531, 533, 
853         1, 537, 538, 538, 540, 536, 542, 543, 
854         544, 545, 546, 547, 548, 549, 550, 551, 
855         552, 553, 554, 544, 555, 556, 557, 558, 
856         559, 560, 561, 552, 538, 539, 535, 1, 
857         563, 563, 564, 1, 564, 1, 537, 538, 
858         538, 540, 541, 542, 543, 545, 546, 547, 
859         548, 549, 550, 551, 552, 553, 554, 555, 
860         556, 557, 558, 559, 560, 561, 552, 538, 
861         539, 564, 1, 565, 565, 566, 566, 567, 
862         565, 568, 1, 569, 569, 570, 570, 571, 
863         569, 572, 1, 573, 574, 1, 575, 1, 
864         576, 577, 577, 579, 580, 581, 582, 583, 
865         584, 585, 586, 587, 588, 589, 590, 591, 
866         592, 593, 583, 594, 595, 596, 597, 598, 
867         599, 600, 591, 577, 578, 575, 1, 0, 
868         601, 601, 569, 571, 59, 60, 61, 62, 
869         3, 63, 64, 65, 66, 67, 68, 69, 
870         70, 71, 4, 72, 73, 74, 75, 67, 
871         601, 570, 572, 1, 576, 577, 577, 579, 
872         575, 581, 582, 583, 584, 585, 586, 587, 
873         588, 589, 590, 591, 592, 593, 583, 594, 
874         595, 596, 597, 598, 599, 600, 591, 577, 
875         578, 574, 1, 602, 602, 603, 1, 603, 
876         1, 576, 577, 577, 579, 580, 581, 582, 
877         584, 585, 586, 587, 588, 589, 590, 591, 
878         592, 593, 594, 595, 596, 597, 598, 599, 
879         600, 591, 577, 578, 603, 1, 604, 605, 
880         605, 606, 607, 608, 609, 610, 611, 612, 
881         613, 614, 615, 616, 617, 618, 619, 620, 
882         621, 622, 623, 624, 615, 605, 1, 0, 
883         625, 625, 59, 60, 61, 62, 3, 63, 
884         64, 65, 66, 67, 68, 69, 70, 71, 
885         4, 72, 73, 74, 75, 67, 625, 1, 
886         626, 626, 627, 626, 628, 1, 629, 629, 
887         630, 630, 631, 629, 632, 1, 633, 633, 
888         634, 634, 635, 633, 636, 1, 637, 637, 
889         638, 638, 639, 637, 640, 1, 641, 641, 
890         642, 642, 643, 641, 644, 1, 16, 16, 
891         18, 15, 20, 20, 16, 17, 14, 1, 
892         23, 23, 22, 22, 24, 23, 25, 1, 
893         29, 30, 30, 32, 28, 34, 35, 36, 
894         37, 38, 39, 40, 41, 42, 43, 44, 
895         45, 46, 36, 47, 48, 49, 50, 51, 
896         52, 53, 44, 30, 31, 27, 1, 645, 
897         645, 646, 1, 646, 1, 29, 30, 30, 
898         32, 33, 34, 35, 37, 38, 39, 40, 
899         41, 42, 43, 44, 45, 46, 47, 48, 
900         49, 50, 51, 52, 53, 44, 30, 31, 
901         646, 1, 647, 647, 648, 648, 649, 647, 
902         650, 1, 651, 651, 652, 652, 653, 651, 
903         654, 1, 655, 655, 656, 656, 657, 655, 
904         658, 1, 659, 659, 660, 660, 661, 659, 
905         662, 1, 663, 663, 664, 1, 664, 1, 
906         16, 16, 18, 19, 16, 17, 664, 1, 
907         665, 665, 666, 1, 666, 1, 524, 524, 
908         526, 527, 524, 525, 666, 1, 667, 667, 
909         668, 1, 668, 1, 472, 472, 474, 475, 
910         472, 473, 668, 1, 669, 669, 670, 1, 
911         670, 1, 459, 459, 461, 462, 459, 460, 
912         670, 1, 671, 671, 672, 1, 672, 1, 
913         446, 446, 448, 449, 446, 447, 672, 1, 
914         673, 673, 674, 1, 674, 1, 394, 394, 
915         396, 397, 394, 395, 674, 1, 675, 675, 
916         676, 1, 676, 1, 381, 381, 383, 384, 
917         381, 382, 676, 1, 677, 677, 678, 1, 
918         678, 1, 368, 368, 370, 371, 368, 369, 
919         678, 1, 679, 679, 680, 1, 680, 1, 
920         273, 273, 275, 276, 273, 274, 680, 1, 
921         681, 681, 682, 1, 682, 1, 260, 260, 
922         262, 263, 260, 261, 682, 1, 683, 683, 
923         684, 1, 684, 1, 247, 247, 249, 250, 
924         247, 248, 684, 1, 685, 685, 686, 1, 
925         686, 1, 234, 234, 236, 237, 234, 235, 
926         686, 1, 687, 687, 688, 1, 688, 1, 
927         221, 221, 223, 224, 221, 222, 688, 1, 
928         689, 689, 690, 1, 690, 1, 182, 183, 
929         183, 184, 185, 186, 187, 189, 190, 191, 
930         192, 193, 194, 195, 196, 197, 198, 199, 
931         200, 201, 202, 203, 204, 205, 196, 183, 
932         690, 1, 182, 183, 183, 184, 181, 186, 
933         187, 188, 189, 190, 191, 192, 193, 194, 
934         195, 196, 197, 198, 188, 199, 200, 201, 
935         202, 203, 204, 205, 196, 183, 180, 1, 
936         176, 176, 175, 175, 177, 176, 178, 1, 
937         691, 691, 692, 1, 692, 1, 169, 169, 
938         171, 172, 169, 170, 692, 1, 169, 169, 
939         171, 168, 173, 173, 169, 170, 167, 1, 
940         163, 163, 162, 162, 164, 163, 165, 1, 
941         693, 693, 694, 693, 1, 695, 695, 696, 
942         695, 1, 697, 697, 698, 1, 698, 1, 
943         146, 146, 147, 146, 698, 1, 146, 146, 
944         147, 145, 148, 148, 146, 144, 1, 140, 
945         140, 139, 139, 141, 140, 142, 1, 699, 
946         699, 700, 1, 700, 1, 133, 133, 135, 
947         136, 133, 134, 700, 1, 133, 133, 135, 
948         132, 137, 137, 133, 134, 701, 1, 702, 
949         702, 703, 1, 703, 1, 92, 93, 93, 
950         95, 96, 97, 98, 100, 101, 102, 103, 
951         104, 105, 106, 107, 108, 109, 110, 111, 
952         112, 113, 114, 115, 116, 107, 93, 94, 
953         703, 1, 704, 704, 705, 1, 705, 1, 
954         79, 79, 81, 82, 79, 80, 705, 1, 
955         1, 0
956 };
958 static const short _svg_path_trans_targs_wi[] = {
959         270, 0, 1, 2, 193, 3, 4, 5, 
960         194, 3, 4, 5, 194, 5, 194, 6, 
961         7, 8, 195, 9, 204, 7, 8, 195, 
962         9, 196, 9, 196, 10, 270, 11, 12, 
963         19, 13, 23, 54, 197, 94, 104, 2, 
964         105, 133, 161, 177, 187, 189, 190, 191, 
965         192, 193, 200, 201, 202, 203, 11, 12, 
966         19, 13, 20, 23, 54, 94, 104, 105, 
967         133, 161, 177, 187, 189, 190, 191, 192, 
968         200, 201, 202, 203, 13, 20, 14, 15, 
969         16, 21, 17, 267, 15, 16, 21, 17, 
970         22, 17, 22, 18, 270, 11, 12, 19, 
971         13, 23, 54, 264, 94, 104, 2, 105, 
972         133, 161, 177, 187, 189, 190, 191, 192, 
973         193, 200, 201, 202, 203, 24, 25, 50, 
974         24, 25, 50, 26, 27, 28, 29, 51, 
975         27, 28, 29, 263, 30, 31, 32, 259, 
976         33, 260, 31, 32, 259, 33, 258, 33, 
977         258, 34, 35, 36, 255, 35, 36, 37, 
978         254, 38, 39, 38, 39, 40, 253, 41, 
979         252, 41, 42, 252, 43, 251, 43, 251, 
980         44, 45, 46, 247, 47, 248, 45, 46, 
981         247, 47, 246, 47, 246, 48, 270, 49, 
982         24, 25, 23, 54, 243, 94, 104, 2, 
983         105, 133, 161, 177, 187, 189, 190, 191, 
984         192, 193, 200, 201, 202, 203, 49, 50, 
985         52, 53, 55, 56, 57, 80, 55, 56, 
986         57, 80, 57, 80, 58, 59, 60, 81, 
987         61, 240, 59, 60, 81, 61, 82, 61, 
988         82, 62, 63, 64, 83, 65, 237, 63, 
989         64, 83, 65, 84, 65, 84, 66, 67, 
990         68, 85, 69, 234, 67, 68, 85, 69, 
991         86, 69, 86, 70, 71, 72, 87, 73, 
992         231, 71, 72, 87, 73, 88, 73, 88, 
993         74, 75, 76, 89, 77, 228, 75, 76, 
994         89, 77, 90, 77, 90, 78, 270, 79, 
995         56, 55, 57, 23, 54, 91, 94, 104, 
996         2, 105, 133, 161, 177, 187, 189, 190, 
997         191, 192, 193, 200, 201, 202, 203, 79, 
998         92, 93, 95, 96, 97, 100, 95, 96, 
999         97, 100, 97, 100, 98, 270, 99, 96, 
1000         95, 97, 23, 54, 101, 94, 104, 2, 
1001         105, 133, 161, 177, 187, 189, 190, 191, 
1002         192, 193, 200, 201, 202, 203, 99, 102, 
1003         103, 19, 12, 13, 20, 106, 107, 108, 
1004         123, 106, 107, 108, 123, 108, 123, 109, 
1005         110, 111, 124, 112, 225, 110, 111, 124, 
1006         112, 125, 112, 125, 113, 114, 115, 126, 
1007         116, 222, 114, 115, 126, 116, 127, 116, 
1008         127, 117, 118, 119, 128, 120, 219, 118, 
1009         119, 128, 120, 129, 120, 129, 121, 270, 
1010         122, 107, 106, 108, 23, 54, 130, 94, 
1011         104, 2, 105, 133, 161, 177, 187, 189, 
1012         190, 191, 192, 193, 200, 201, 202, 203, 
1013         122, 131, 132, 134, 135, 136, 151, 134, 
1014         135, 136, 151, 136, 151, 137, 138, 139, 
1015         152, 140, 216, 138, 139, 152, 140, 153, 
1016         140, 153, 141, 142, 143, 154, 144, 213, 
1017         142, 143, 154, 144, 155, 144, 155, 145, 
1018         146, 147, 156, 148, 210, 146, 147, 156, 
1019         148, 157, 148, 157, 149, 270, 150, 135, 
1020         134, 136, 23, 54, 158, 94, 104, 2, 
1021         105, 133, 161, 177, 187, 189, 190, 191, 
1022         192, 193, 200, 201, 202, 203, 150, 159, 
1023         160, 162, 163, 164, 171, 162, 163, 164, 
1024         171, 164, 171, 165, 166, 167, 172, 168, 
1025         207, 166, 167, 172, 168, 173, 168, 173, 
1026         169, 270, 170, 163, 162, 164, 23, 54, 
1027         174, 94, 104, 2, 105, 133, 161, 177, 
1028         187, 189, 190, 191, 192, 193, 200, 201, 
1029         202, 203, 170, 175, 176, 178, 179, 180, 
1030         183, 178, 179, 180, 183, 180, 183, 181, 
1031         270, 182, 179, 178, 180, 23, 54, 184, 
1032         94, 104, 2, 105, 133, 161, 177, 187, 
1033         189, 190, 191, 192, 193, 200, 201, 202, 
1034         203, 182, 185, 186, 270, 188, 23, 54, 
1035         94, 104, 2, 105, 133, 161, 177, 187, 
1036         189, 190, 191, 192, 193, 200, 201, 202, 
1037         203, 188, 24, 25, 50, 55, 56, 57, 
1038         80, 95, 96, 97, 100, 19, 12, 13, 
1039         20, 3, 4, 5, 194, 198, 199, 106, 
1040         107, 108, 123, 134, 135, 136, 151, 162, 
1041         163, 164, 171, 178, 179, 180, 183, 205, 
1042         206, 208, 209, 211, 212, 214, 215, 217, 
1043         218, 220, 221, 223, 224, 226, 227, 229, 
1044         230, 232, 233, 235, 236, 238, 239, 241, 
1045         242, 244, 245, 249, 250, 41, 252, 38, 
1046         39, 256, 257, 261, 262, 263, 265, 266, 
1047         268, 269
1048 };
1050 static const char _svg_path_trans_actions_wi[] = {
1051         15, 0, 0, 0, 0, 9, 47, 47, 
1052         47, 0, 1, 1, 1, 0, 0, 0, 
1053         3, 17, 3, 17, 0, 0, 1, 0, 
1054         1, 1, 0, 0, 0, 60, 20, 56, 
1055         20, 56, 20, 20, 0, 20, 20, 20, 
1056         20, 20, 20, 20, 20, 20, 20, 20, 
1057         20, 20, 20, 20, 20, 20, 0, 1, 
1058         0, 1, 1, 0, 0, 0, 0, 0, 
1059         0, 0, 0, 0, 0, 0, 0, 0, 
1060         0, 0, 0, 0, 0, 0, 0, 3, 
1061         17, 3, 17, 0, 0, 1, 0, 1, 
1062         1, 0, 0, 0, 68, 23, 64, 23, 
1063         64, 23, 23, 0, 23, 23, 23, 23, 
1064         23, 23, 23, 23, 23, 23, 23, 23, 
1065         23, 23, 23, 23, 23, 9, 47, 47, 
1066         0, 1, 1, 0, 3, 3, 17, 0, 
1067         0, 0, 1, 1, 0, 3, 17, 3, 
1068         17, 0, 0, 1, 0, 1, 1, 0, 
1069         0, 0, 3, 3, 0, 0, 0, 0, 
1070         0, 7, 7, 0, 0, 0, 0, 7, 
1071         7, 0, 1, 0, 1, 1, 0, 0, 
1072         0, 3, 17, 3, 17, 0, 0, 1, 
1073         0, 1, 1, 0, 0, 0, 124, 44, 
1074         44, 120, 44, 44, 0, 44, 44, 44, 
1075         44, 44, 44, 44, 44, 44, 44, 44, 
1076         44, 44, 44, 44, 44, 44, 0, 0, 
1077         0, 0, 9, 47, 47, 47, 0, 1, 
1078         1, 1, 0, 0, 0, 3, 17, 3, 
1079         17, 0, 0, 1, 0, 1, 1, 0, 
1080         0, 0, 3, 17, 3, 17, 0, 0, 
1081         1, 0, 1, 1, 0, 0, 0, 3, 
1082         17, 3, 17, 0, 0, 1, 0, 1, 
1083         1, 0, 0, 0, 3, 17, 3, 17, 
1084         0, 0, 1, 0, 1, 1, 0, 0, 
1085         0, 3, 17, 3, 17, 0, 0, 1, 
1086         0, 1, 1, 0, 0, 0, 92, 32, 
1087         88, 32, 88, 32, 32, 0, 32, 32, 
1088         32, 32, 32, 32, 32, 32, 32, 32, 
1089         32, 32, 32, 32, 32, 32, 32, 0, 
1090         0, 0, 9, 47, 47, 47, 0, 1, 
1091         1, 1, 0, 0, 0, 76, 26, 72, 
1092         26, 72, 26, 26, 0, 26, 26, 26, 
1093         26, 26, 26, 26, 26, 26, 26, 26, 
1094         26, 26, 26, 26, 26, 26, 0, 0, 
1095         0, 9, 47, 47, 47, 9, 47, 47, 
1096         47, 0, 1, 1, 1, 0, 0, 0, 
1097         3, 17, 3, 17, 0, 0, 1, 0, 
1098         1, 1, 0, 0, 0, 3, 17, 3, 
1099         17, 0, 0, 1, 0, 1, 1, 0, 
1100         0, 0, 3, 17, 3, 17, 0, 0, 
1101         1, 0, 1, 1, 0, 0, 0, 108, 
1102         38, 104, 38, 104, 38, 38, 0, 38, 
1103         38, 38, 38, 38, 38, 38, 38, 38, 
1104         38, 38, 38, 38, 38, 38, 38, 38, 
1105         0, 0, 0, 9, 47, 47, 47, 0, 
1106         1, 1, 1, 0, 0, 0, 3, 17, 
1107         3, 17, 0, 0, 1, 0, 1, 1, 
1108         0, 0, 0, 3, 17, 3, 17, 0, 
1109         0, 1, 0, 1, 1, 0, 0, 0, 
1110         3, 17, 3, 17, 0, 0, 1, 0, 
1111         1, 1, 0, 0, 0, 100, 35, 96, 
1112         35, 96, 35, 35, 0, 35, 35, 35, 
1113         35, 35, 35, 35, 35, 35, 35, 35, 
1114         35, 35, 35, 35, 35, 35, 0, 0, 
1115         0, 9, 47, 47, 47, 0, 1, 1, 
1116         1, 0, 0, 0, 3, 17, 3, 17, 
1117         0, 0, 1, 0, 1, 1, 0, 0, 
1118         0, 116, 41, 112, 41, 112, 41, 41, 
1119         0, 41, 41, 41, 41, 41, 41, 41, 
1120         41, 41, 41, 41, 41, 41, 41, 41, 
1121         41, 41, 0, 0, 0, 9, 47, 47, 
1122         47, 0, 1, 1, 1, 0, 0, 0, 
1123         84, 29, 80, 29, 80, 29, 29, 0, 
1124         29, 29, 29, 29, 29, 29, 29, 29, 
1125         29, 29, 29, 29, 29, 29, 29, 29, 
1126         29, 0, 0, 0, 53, 13, 13, 13, 
1127         13, 13, 13, 13, 13, 13, 13, 13, 
1128         13, 13, 13, 13, 13, 13, 13, 13, 
1129         13, 0, 11, 50, 50, 11, 50, 50, 
1130         50, 11, 50, 50, 50, 11, 50, 50, 
1131         50, 11, 50, 50, 50, 0, 0, 11, 
1132         50, 50, 50, 11, 50, 50, 50, 11, 
1133         50, 50, 50, 11, 50, 50, 50, 0, 
1134         0, 0, 0, 0, 0, 0, 0, 0, 
1135         0, 0, 0, 0, 0, 0, 0, 0, 
1136         0, 0, 0, 0, 0, 0, 0, 0, 
1137         0, 0, 0, 0, 0, 5, 5, 5, 
1138         5, 0, 0, 0, 0, 0, 0, 0, 
1139         0, 0
1140 };
1142 static const int svg_path_start = 1;
1143 static const int svg_path_first_final = 270;
1145 static const int svg_path_en_main = 1;
1147 #line 144 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1150 void Parser::parse(char const *str)
1151 throw(SVGPathParseError)
1153     char const *p = str;
1154     char const *start = NULL;
1155     int cs;
1157     _reset();
1159     
1160 #line 1162 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp"
1161         {
1162         cs = svg_path_start;
1163         }
1165 #line 1167 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp"
1166         {
1167         int _klen;
1168         unsigned int _trans;
1169         const char *_acts;
1170         unsigned int _nacts;
1171         const char *_keys;
1173         if ( cs == 0 )
1174                 goto _out;
1175 _resume:
1176         _keys = _svg_path_trans_keys + _svg_path_key_offsets[cs];
1177         _trans = _svg_path_index_offsets[cs];
1179         _klen = _svg_path_single_lengths[cs];
1180         if ( _klen > 0 ) {
1181                 const char *_lower = _keys;
1182                 const char *_mid;
1183                 const char *_upper = _keys + _klen - 1;
1184                 while (1) {
1185                         if ( _upper < _lower )
1186                                 break;
1188                         _mid = _lower + ((_upper-_lower) >> 1);
1189                         if ( (*p) < *_mid )
1190                                 _upper = _mid - 1;
1191                         else if ( (*p) > *_mid )
1192                                 _lower = _mid + 1;
1193                         else {
1194                                 _trans += (_mid - _keys);
1195                                 goto _match;
1196                         }
1197                 }
1198                 _keys += _klen;
1199                 _trans += _klen;
1200         }
1202         _klen = _svg_path_range_lengths[cs];
1203         if ( _klen > 0 ) {
1204                 const char *_lower = _keys;
1205                 const char *_mid;
1206                 const char *_upper = _keys + (_klen<<1) - 2;
1207                 while (1) {
1208                         if ( _upper < _lower )
1209                                 break;
1211                         _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1212                         if ( (*p) < _mid[0] )
1213                                 _upper = _mid - 2;
1214                         else if ( (*p) > _mid[1] )
1215                                 _lower = _mid + 2;
1216                         else {
1217                                 _trans += ((_mid - _keys)>>1);
1218                                 goto _match;
1219                         }
1220                 }
1221                 _trans += _klen;
1222         }
1224 _match:
1225         _trans = _svg_path_indicies[_trans];
1226         cs = _svg_path_trans_targs_wi[_trans];
1228         if ( _svg_path_trans_actions_wi[_trans] == 0 )
1229                 goto _again;
1231         _acts = _svg_path_actions + _svg_path_trans_actions_wi[_trans];
1232         _nacts = (unsigned int) *_acts++;
1233         while ( _nacts-- > 0 )
1234         {
1235                 switch ( *_acts++ )
1236                 {
1237         case 0:
1238 #line 156 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1239         {
1240             start = p;
1241         }
1242         break;
1243         case 1:
1244 #line 160 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1245         {
1246             char const *end=p;
1247             std::string buf(start, end);
1248             _push(g_ascii_strtod(buf.c_str(), NULL));
1249             start = NULL;
1250         }
1251         break;
1252         case 2:
1253 #line 167 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1254         {
1255             _push(1.0);
1256         }
1257         break;
1258         case 3:
1259 #line 171 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1260         {
1261             _push(0.0);
1262         }
1263         break;
1264         case 4:
1265 #line 175 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1266         {
1267             _absolute = true;
1268         }
1269         break;
1270         case 5:
1271 #line 179 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1272         {
1273             _absolute = false;
1274         }
1275         break;
1276         case 6:
1277 #line 183 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1278         {
1279             _moveTo(_pop_point());
1280         }
1281         break;
1282         case 7:
1283 #line 187 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1284         {
1285             _lineTo(_pop_point());
1286         }
1287         break;
1288         case 8:
1289 #line 191 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1290         {
1291             _hlineTo(Point(_pop_coord(X), _current[Y]));
1292         }
1293         break;
1294         case 9:
1295 #line 195 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1296         {
1297             _vlineTo(Point(_current[X], _pop_coord(Y)));
1298         }
1299         break;
1300         case 10:
1301 #line 199 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1302         {
1303             Point p = _pop_point();
1304             Point c1 = _pop_point();
1305             Point c0 = _pop_point();
1306             _curveTo(c0, c1, p);
1307         }
1308         break;
1309         case 11:
1310 #line 206 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1311         {
1312             Point p = _pop_point();
1313             Point c1 = _pop_point();
1314             _curveTo(_cubic_tangent, c1, p);
1315         }
1316         break;
1317         case 12:
1318 #line 212 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1319         {
1320             Point p = _pop_point();
1321             Point c = _pop_point();
1322             _quadTo(c, p);
1323         }
1324         break;
1325         case 13:
1326 #line 218 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1327         {
1328             Point p = _pop_point();
1329             _quadTo(_quad_tangent, p);
1330         }
1331         break;
1332         case 14:
1333 #line 223 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1334         {
1335             Point point = _pop_point();
1336             bool sweep = _pop_flag();
1337             bool large_arc = _pop_flag();
1338             double angle = deg_to_rad(_pop());
1339             double ry = _pop();
1340             double rx = _pop();
1342             _arcTo(rx, ry, angle, large_arc, sweep, point);
1343         }
1344         break;
1345         case 15:
1346 #line 234 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1347         {
1348             _closePath();
1349         }
1350         break;
1351         case 16:
1352 #line 370 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1353         {goto _out;}
1354         break;
1355 #line 1357 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp"
1356                 }
1357         }
1359 _again:
1360         if ( cs == 0 )
1361                 goto _out;
1362         p += 1;
1363         goto _resume;
1364         _out: {}
1365         }
1366 #line 380 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl"
1369     if ( cs < svg_path_first_final ) {
1370         throw SVGPathParseError();
1371     }
1376 void parse_svg_path(char const *str, SVGPathSink &sink)
1377 throw(SVGPathParseError)
1379     Parser parser(sink);
1380     parser.parse(str);
1381     sink.finish();
1386 /*
1387   Local Variables:
1388   mode:c++
1389   c-file-style:"stroustrup"
1390   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
1391   indent-tabs-mode:nil
1392   fill-column:99
1393   End:
1394 */
1395 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :