1 #line 1 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
2 /*
3 * 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 "point.h"
40 #include "svg-path-parser.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 }
101 void _lineTo(Point p) {
102 _quad_tangent = _cubic_tangent = _current = p;
103 _sink.lineTo(p);
104 }
106 void _curveTo(Point c0, Point c1, Point p) {
107 _quad_tangent = _current = p;
108 _cubic_tangent = p + ( p - c1 );
109 _sink.curveTo(c0, c1, p);
110 }
112 void _quadTo(Point c, Point p) {
113 _cubic_tangent = _current = p;
114 _quad_tangent = p + ( p - c );
115 _sink.quadTo(c, p);
116 }
118 void _arcTo(double rx, double ry, double angle,
119 bool large_arc, bool sweep, Point p)
120 {
121 _quad_tangent = _cubic_tangent = _current = p;
122 _sink.arcTo(rx, ry, angle, large_arc, sweep, p);
123 }
125 void _closePath() {
126 _quad_tangent = _cubic_tangent = _current = _initial;
127 _sink.closePath();
128 }
129 };
132 #line 133 "/home/njh/svn/lib2geom/src/svg-path-parser.cpp"
133 static const char _svg_path_actions[] = {
134 0, 1, 0, 1, 1, 1, 2, 1,
135 3, 1, 4, 1, 5, 1, 15, 1,
136 16, 2, 1, 0, 2, 1, 2, 2,
137 1, 3, 2, 1, 6, 2, 1, 7,
138 2, 1, 8, 2, 1, 9, 2, 1,
139 10, 2, 1, 11, 2, 1, 12, 2,
140 1, 13, 2, 1, 14, 2, 2, 1,
141 2, 3, 1, 2, 4, 0, 2, 5,
142 0, 2, 15, 16, 3, 1, 6, 0,
143 3, 1, 6, 16, 3, 1, 7, 0,
144 3, 1, 7, 16, 3, 1, 8, 0,
145 3, 1, 8, 16, 3, 1, 9, 0,
146 3, 1, 9, 16, 3, 1, 10, 0,
147 3, 1, 10, 16, 3, 1, 11, 0,
148 3, 1, 11, 16, 3, 1, 12, 0,
149 3, 1, 12, 16, 3, 1, 13, 0,
150 3, 1, 13, 16, 3, 1, 14, 0,
151 3, 1, 14, 16
152 };
154 static const short _svg_path_key_offsets[] = {
155 0, 7, 7, 16, 25, 28, 30, 42,
156 52, 55, 57, 90, 121, 124, 126, 138,
157 148, 151, 153, 186, 195, 207, 216, 249,
158 256, 263, 265, 275, 283, 290, 292, 304,
159 314, 317, 319, 328, 335, 341, 346, 353,
160 359, 364, 374, 377, 379, 391, 401, 404,
161 406, 437, 466, 476, 488, 498, 507, 509,
162 521, 533, 544, 554, 561, 567, 572, 584,
163 595, 607, 617, 620, 622, 655, 664, 695,
164 704, 713, 716, 718, 730, 740, 743, 745,
165 757, 767, 770, 772, 784, 794, 797, 799,
166 811, 821, 824, 826, 838, 848, 851, 853,
167 886, 917, 929, 938, 950, 959, 971, 980,
168 992, 1001, 1013, 1022, 1055, 1059, 1061, 1092,
169 1101, 1110, 1113, 1115, 1148, 1179, 1182, 1184,
170 1217, 1226, 1259, 1263, 1265, 1296, 1305, 1314,
171 1323, 1326, 1328, 1340, 1350, 1353, 1355, 1367,
172 1377, 1380, 1382, 1394, 1404, 1407, 1409, 1442,
173 1473, 1485, 1494, 1506, 1515, 1527, 1536, 1569,
174 1573, 1575, 1606, 1615, 1624, 1627, 1629, 1641,
175 1651, 1654, 1656, 1668, 1678, 1681, 1683, 1695,
176 1705, 1708, 1710, 1743, 1774, 1786, 1795, 1807,
177 1816, 1828, 1837, 1870, 1874, 1876, 1907, 1916,
178 1925, 1928, 1930, 1942, 1952, 1955, 1957, 1990,
179 2021, 2033, 2042, 2075, 2079, 2081, 2112, 2121,
180 2130, 2133, 2135, 2168, 2199, 2202, 2204, 2237,
181 2246, 2279, 2283, 2285, 2316, 2341, 2366, 2373,
182 2382, 2391, 2424, 2428, 2430, 2461, 2494, 2503,
183 2512, 2524, 2533, 2566, 2570, 2572, 2603, 2612,
184 2621, 2630, 2639, 2672, 2676, 2678, 2709, 2742,
185 2746, 2748, 2758, 2791, 2795, 2797, 2807, 2811,
186 2813, 2823, 2827, 2829, 2839, 2843, 2845, 2855,
187 2859, 2861, 2871, 2875, 2877, 2887, 2891, 2893,
188 2903, 2936, 2940, 2942, 2952, 2956, 2958, 2968,
189 2972, 2974, 2984, 2988, 2990, 3000, 3004, 3006,
190 3016, 3020, 3022, 3051, 3055, 3057, 3088, 3121,
191 3130, 3142, 3146, 3148, 3158, 3170, 3175, 3185,
192 3189, 3191, 3198, 3208, 3212, 3214, 3224, 3236,
193 3248, 3260, 3264, 3266, 3276, 3288, 3292, 3294,
194 3304, 3313, 3317, 3319, 3327, 3336, 3341, 3346,
195 3358, 3362, 3364, 3395, 3399, 3401, 3411
196 };
198 static const char _svg_path_trans_keys[] = {
199 0, 13, 32, 77, 109, 9, 10, 13,
200 32, 43, 45, 46, 9, 10, 48, 57,
201 13, 32, 43, 45, 46, 9, 10, 48,
202 57, 46, 48, 57, 48, 57, 13, 32,
203 44, 46, 69, 101, 9, 10, 43, 45,
204 48, 57, 13, 32, 44, 46, 9, 10,
205 43, 45, 48, 57, 46, 48, 57, 48,
206 57, 0, 13, 32, 44, 46, 65, 67,
207 69, 72, 76, 77, 81, 83, 84, 86,
208 90, 97, 99, 101, 104, 108, 109, 113,
209 115, 116, 118, 122, 9, 10, 43, 45,
210 48, 57, 0, 13, 32, 44, 46, 65,
211 67, 72, 76, 77, 81, 83, 84, 86,
212 90, 97, 99, 104, 108, 109, 113, 115,
213 116, 118, 122, 9, 10, 43, 45, 48,
214 57, 46, 48, 57, 48, 57, 13, 32,
215 44, 46, 69, 101, 9, 10, 43, 45,
216 48, 57, 13, 32, 44, 46, 9, 10,
217 43, 45, 48, 57, 46, 48, 57, 48,
218 57, 0, 13, 32, 44, 46, 65, 67,
219 69, 72, 76, 77, 81, 83, 84, 86,
220 90, 97, 99, 101, 104, 108, 109, 113,
221 115, 116, 118, 122, 9, 10, 43, 45,
222 48, 57, 13, 32, 43, 45, 46, 9,
223 10, 48, 57, 13, 32, 44, 46, 69,
224 101, 9, 10, 43, 45, 48, 57, 13,
225 32, 43, 45, 46, 9, 10, 48, 57,
226 0, 13, 32, 44, 46, 65, 67, 69,
227 72, 76, 77, 81, 83, 84, 86, 90,
228 97, 99, 101, 104, 108, 109, 113, 115,
229 116, 118, 122, 9, 10, 43, 45, 48,
230 57, 13, 32, 46, 9, 10, 48, 57,
231 13, 32, 46, 9, 10, 48, 57, 48,
232 57, 13, 32, 44, 46, 69, 101, 9,
233 10, 48, 57, 13, 32, 44, 46, 9,
234 10, 48, 57, 13, 32, 46, 9, 10,
235 48, 57, 48, 57, 13, 32, 44, 46,
236 69, 101, 9, 10, 43, 45, 48, 57,
237 13, 32, 44, 46, 9, 10, 43, 45,
238 48, 57, 46, 48, 57, 48, 57, 13,
239 32, 44, 69, 101, 9, 10, 48, 57,
240 13, 32, 44, 48, 49, 9, 10, 13,
241 32, 48, 49, 9, 10, 13, 32, 44,
242 9, 10, 13, 32, 44, 48, 49, 9,
243 10, 13, 32, 48, 49, 9, 10, 13,
244 32, 44, 9, 10, 13, 32, 44, 46,
245 9, 10, 43, 45, 48, 57, 46, 48,
246 57, 48, 57, 13, 32, 44, 46, 69,
247 101, 9, 10, 43, 45, 48, 57, 13,
248 32, 44, 46, 9, 10, 43, 45, 48,
249 57, 46, 48, 57, 48, 57, 0, 13,
250 32, 44, 46, 65, 67, 69, 72, 76,
251 77, 81, 83, 84, 86, 90, 97, 99,
252 101, 104, 108, 109, 113, 115, 116, 118,
253 122, 9, 10, 48, 57, 0, 13, 32,
254 44, 46, 65, 67, 72, 76, 77, 81,
255 83, 84, 86, 90, 97, 99, 104, 108,
256 109, 113, 115, 116, 118, 122, 9, 10,
257 48, 57, 13, 32, 44, 46, 69, 101,
258 9, 10, 48, 57, 13, 32, 44, 46,
259 69, 101, 9, 10, 43, 45, 48, 57,
260 13, 32, 44, 46, 9, 10, 43, 45,
261 48, 57, 13, 32, 43, 45, 46, 9,
262 10, 48, 57, 48, 57, 13, 32, 44,
263 46, 69, 101, 9, 10, 43, 45, 48,
264 57, 13, 32, 44, 46, 48, 49, 9,
265 10, 43, 45, 50, 57, 13, 32, 43,
266 45, 46, 48, 49, 9, 10, 50, 57,
267 13, 32, 44, 46, 69, 101, 9, 10,
268 48, 57, 13, 32, 44, 48, 49, 9,
269 10, 13, 32, 48, 49, 9, 10, 13,
270 32, 44, 9, 10, 13, 32, 44, 46,
271 48, 49, 9, 10, 43, 45, 50, 57,
272 13, 32, 43, 45, 46, 48, 49, 9,
273 10, 50, 57, 13, 32, 44, 46, 69,
274 101, 9, 10, 43, 45, 48, 57, 13,
275 32, 44, 46, 9, 10, 43, 45, 48,
276 57, 46, 48, 57, 48, 57, 0, 13,
277 32, 44, 46, 65, 67, 69, 72, 76,
278 77, 81, 83, 84, 86, 90, 97, 99,
279 101, 104, 108, 109, 113, 115, 116, 118,
280 122, 9, 10, 43, 45, 48, 57, 13,
281 32, 43, 45, 46, 9, 10, 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, 48, 57, 13,
286 32, 43, 45, 46, 9, 10, 48, 57,
287 13, 32, 43, 45, 46, 9, 10, 48,
288 57, 46, 48, 57, 48, 57, 13, 32,
289 44, 46, 69, 101, 9, 10, 43, 45,
290 48, 57, 13, 32, 44, 46, 9, 10,
291 43, 45, 48, 57, 46, 48, 57, 48,
292 57, 13, 32, 44, 46, 69, 101, 9,
293 10, 43, 45, 48, 57, 13, 32, 44,
294 46, 9, 10, 43, 45, 48, 57, 46,
295 48, 57, 48, 57, 13, 32, 44, 46,
296 69, 101, 9, 10, 43, 45, 48, 57,
297 13, 32, 44, 46, 9, 10, 43, 45,
298 48, 57, 46, 48, 57, 48, 57, 13,
299 32, 44, 46, 69, 101, 9, 10, 43,
300 45, 48, 57, 13, 32, 44, 46, 9,
301 10, 43, 45, 48, 57, 46, 48, 57,
302 48, 57, 13, 32, 44, 46, 69, 101,
303 9, 10, 43, 45, 48, 57, 13, 32,
304 44, 46, 9, 10, 43, 45, 48, 57,
305 46, 48, 57, 48, 57, 0, 13, 32,
306 44, 46, 65, 67, 69, 72, 76, 77,
307 81, 83, 84, 86, 90, 97, 99, 101,
308 104, 108, 109, 113, 115, 116, 118, 122,
309 9, 10, 43, 45, 48, 57, 0, 13,
310 32, 44, 46, 65, 67, 72, 76, 77,
311 81, 83, 84, 86, 90, 97, 99, 104,
312 108, 109, 113, 115, 116, 118, 122, 9,
313 10, 43, 45, 48, 57, 13, 32, 44,
314 46, 69, 101, 9, 10, 43, 45, 48,
315 57, 13, 32, 43, 45, 46, 9, 10,
316 48, 57, 13, 32, 44, 46, 69, 101,
317 9, 10, 43, 45, 48, 57, 13, 32,
318 43, 45, 46, 9, 10, 48, 57, 13,
319 32, 44, 46, 69, 101, 9, 10, 43,
320 45, 48, 57, 13, 32, 43, 45, 46,
321 9, 10, 48, 57, 13, 32, 44, 46,
322 69, 101, 9, 10, 43, 45, 48, 57,
323 13, 32, 43, 45, 46, 9, 10, 48,
324 57, 13, 32, 44, 46, 69, 101, 9,
325 10, 43, 45, 48, 57, 13, 32, 43,
326 45, 46, 9, 10, 48, 57, 0, 13,
327 32, 44, 46, 65, 67, 69, 72, 76,
328 77, 81, 83, 84, 86, 90, 97, 99,
329 101, 104, 108, 109, 113, 115, 116, 118,
330 122, 9, 10, 43, 45, 48, 57, 43,
331 45, 48, 57, 48, 57, 0, 13, 32,
332 44, 46, 65, 67, 72, 76, 77, 81,
333 83, 84, 86, 90, 97, 99, 104, 108,
334 109, 113, 115, 116, 118, 122, 9, 10,
335 43, 45, 48, 57, 13, 32, 43, 45,
336 46, 9, 10, 48, 57, 13, 32, 43,
337 45, 46, 9, 10, 48, 57, 46, 48,
338 57, 48, 57, 0, 13, 32, 44, 46,
339 65, 67, 69, 72, 76, 77, 81, 83,
340 84, 86, 90, 97, 99, 101, 104, 108,
341 109, 113, 115, 116, 118, 122, 9, 10,
342 43, 45, 48, 57, 0, 13, 32, 44,
343 46, 65, 67, 72, 76, 77, 81, 83,
344 84, 86, 90, 97, 99, 104, 108, 109,
345 113, 115, 116, 118, 122, 9, 10, 43,
346 45, 48, 57, 46, 48, 57, 48, 57,
347 0, 13, 32, 44, 46, 65, 67, 69,
348 72, 76, 77, 81, 83, 84, 86, 90,
349 97, 99, 101, 104, 108, 109, 113, 115,
350 116, 118, 122, 9, 10, 43, 45, 48,
351 57, 13, 32, 43, 45, 46, 9, 10,
352 48, 57, 0, 13, 32, 44, 46, 65,
353 67, 69, 72, 76, 77, 81, 83, 84,
354 86, 90, 97, 99, 101, 104, 108, 109,
355 113, 115, 116, 118, 122, 9, 10, 43,
356 45, 48, 57, 43, 45, 48, 57, 48,
357 57, 0, 13, 32, 44, 46, 65, 67,
358 72, 76, 77, 81, 83, 84, 86, 90,
359 97, 99, 104, 108, 109, 113, 115, 116,
360 118, 122, 9, 10, 43, 45, 48, 57,
361 13, 32, 43, 45, 46, 9, 10, 48,
362 57, 13, 32, 43, 45, 46, 9, 10,
363 48, 57, 13, 32, 43, 45, 46, 9,
364 10, 48, 57, 46, 48, 57, 48, 57,
365 13, 32, 44, 46, 69, 101, 9, 10,
366 43, 45, 48, 57, 13, 32, 44, 46,
367 9, 10, 43, 45, 48, 57, 46, 48,
368 57, 48, 57, 13, 32, 44, 46, 69,
369 101, 9, 10, 43, 45, 48, 57, 13,
370 32, 44, 46, 9, 10, 43, 45, 48,
371 57, 46, 48, 57, 48, 57, 13, 32,
372 44, 46, 69, 101, 9, 10, 43, 45,
373 48, 57, 13, 32, 44, 46, 9, 10,
374 43, 45, 48, 57, 46, 48, 57, 48,
375 57, 0, 13, 32, 44, 46, 65, 67,
376 69, 72, 76, 77, 81, 83, 84, 86,
377 90, 97, 99, 101, 104, 108, 109, 113,
378 115, 116, 118, 122, 9, 10, 43, 45,
379 48, 57, 0, 13, 32, 44, 46, 65,
380 67, 72, 76, 77, 81, 83, 84, 86,
381 90, 97, 99, 104, 108, 109, 113, 115,
382 116, 118, 122, 9, 10, 43, 45, 48,
383 57, 13, 32, 44, 46, 69, 101, 9,
384 10, 43, 45, 48, 57, 13, 32, 43,
385 45, 46, 9, 10, 48, 57, 13, 32,
386 44, 46, 69, 101, 9, 10, 43, 45,
387 48, 57, 13, 32, 43, 45, 46, 9,
388 10, 48, 57, 13, 32, 44, 46, 69,
389 101, 9, 10, 43, 45, 48, 57, 13,
390 32, 43, 45, 46, 9, 10, 48, 57,
391 0, 13, 32, 44, 46, 65, 67, 69,
392 72, 76, 77, 81, 83, 84, 86, 90,
393 97, 99, 101, 104, 108, 109, 113, 115,
394 116, 118, 122, 9, 10, 43, 45, 48,
395 57, 43, 45, 48, 57, 48, 57, 0,
396 13, 32, 44, 46, 65, 67, 72, 76,
397 77, 81, 83, 84, 86, 90, 97, 99,
398 104, 108, 109, 113, 115, 116, 118, 122,
399 9, 10, 43, 45, 48, 57, 13, 32,
400 43, 45, 46, 9, 10, 48, 57, 13,
401 32, 43, 45, 46, 9, 10, 48, 57,
402 46, 48, 57, 48, 57, 13, 32, 44,
403 46, 69, 101, 9, 10, 43, 45, 48,
404 57, 13, 32, 44, 46, 9, 10, 43,
405 45, 48, 57, 46, 48, 57, 48, 57,
406 13, 32, 44, 46, 69, 101, 9, 10,
407 43, 45, 48, 57, 13, 32, 44, 46,
408 9, 10, 43, 45, 48, 57, 46, 48,
409 57, 48, 57, 13, 32, 44, 46, 69,
410 101, 9, 10, 43, 45, 48, 57, 13,
411 32, 44, 46, 9, 10, 43, 45, 48,
412 57, 46, 48, 57, 48, 57, 0, 13,
413 32, 44, 46, 65, 67, 69, 72, 76,
414 77, 81, 83, 84, 86, 90, 97, 99,
415 101, 104, 108, 109, 113, 115, 116, 118,
416 122, 9, 10, 43, 45, 48, 57, 0,
417 13, 32, 44, 46, 65, 67, 72, 76,
418 77, 81, 83, 84, 86, 90, 97, 99,
419 104, 108, 109, 113, 115, 116, 118, 122,
420 9, 10, 43, 45, 48, 57, 13, 32,
421 44, 46, 69, 101, 9, 10, 43, 45,
422 48, 57, 13, 32, 43, 45, 46, 9,
423 10, 48, 57, 13, 32, 44, 46, 69,
424 101, 9, 10, 43, 45, 48, 57, 13,
425 32, 43, 45, 46, 9, 10, 48, 57,
426 13, 32, 44, 46, 69, 101, 9, 10,
427 43, 45, 48, 57, 13, 32, 43, 45,
428 46, 9, 10, 48, 57, 0, 13, 32,
429 44, 46, 65, 67, 69, 72, 76, 77,
430 81, 83, 84, 86, 90, 97, 99, 101,
431 104, 108, 109, 113, 115, 116, 118, 122,
432 9, 10, 43, 45, 48, 57, 43, 45,
433 48, 57, 48, 57, 0, 13, 32, 44,
434 46, 65, 67, 72, 76, 77, 81, 83,
435 84, 86, 90, 97, 99, 104, 108, 109,
436 113, 115, 116, 118, 122, 9, 10, 43,
437 45, 48, 57, 13, 32, 43, 45, 46,
438 9, 10, 48, 57, 13, 32, 43, 45,
439 46, 9, 10, 48, 57, 46, 48, 57,
440 48, 57, 13, 32, 44, 46, 69, 101,
441 9, 10, 43, 45, 48, 57, 13, 32,
442 44, 46, 9, 10, 43, 45, 48, 57,
443 46, 48, 57, 48, 57, 0, 13, 32,
444 44, 46, 65, 67, 69, 72, 76, 77,
445 81, 83, 84, 86, 90, 97, 99, 101,
446 104, 108, 109, 113, 115, 116, 118, 122,
447 9, 10, 43, 45, 48, 57, 0, 13,
448 32, 44, 46, 65, 67, 72, 76, 77,
449 81, 83, 84, 86, 90, 97, 99, 104,
450 108, 109, 113, 115, 116, 118, 122, 9,
451 10, 43, 45, 48, 57, 13, 32, 44,
452 46, 69, 101, 9, 10, 43, 45, 48,
453 57, 13, 32, 43, 45, 46, 9, 10,
454 48, 57, 0, 13, 32, 44, 46, 65,
455 67, 69, 72, 76, 77, 81, 83, 84,
456 86, 90, 97, 99, 101, 104, 108, 109,
457 113, 115, 116, 118, 122, 9, 10, 43,
458 45, 48, 57, 43, 45, 48, 57, 48,
459 57, 0, 13, 32, 44, 46, 65, 67,
460 72, 76, 77, 81, 83, 84, 86, 90,
461 97, 99, 104, 108, 109, 113, 115, 116,
462 118, 122, 9, 10, 43, 45, 48, 57,
463 13, 32, 43, 45, 46, 9, 10, 48,
464 57, 13, 32, 43, 45, 46, 9, 10,
465 48, 57, 46, 48, 57, 48, 57, 0,
466 13, 32, 44, 46, 65, 67, 69, 72,
467 76, 77, 81, 83, 84, 86, 90, 97,
468 99, 101, 104, 108, 109, 113, 115, 116,
469 118, 122, 9, 10, 43, 45, 48, 57,
470 0, 13, 32, 44, 46, 65, 67, 72,
471 76, 77, 81, 83, 84, 86, 90, 97,
472 99, 104, 108, 109, 113, 115, 116, 118,
473 122, 9, 10, 43, 45, 48, 57, 46,
474 48, 57, 48, 57, 0, 13, 32, 44,
475 46, 65, 67, 69, 72, 76, 77, 81,
476 83, 84, 86, 90, 97, 99, 101, 104,
477 108, 109, 113, 115, 116, 118, 122, 9,
478 10, 43, 45, 48, 57, 13, 32, 43,
479 45, 46, 9, 10, 48, 57, 0, 13,
480 32, 44, 46, 65, 67, 69, 72, 76,
481 77, 81, 83, 84, 86, 90, 97, 99,
482 101, 104, 108, 109, 113, 115, 116, 118,
483 122, 9, 10, 43, 45, 48, 57, 43,
484 45, 48, 57, 48, 57, 0, 13, 32,
485 44, 46, 65, 67, 72, 76, 77, 81,
486 83, 84, 86, 90, 97, 99, 104, 108,
487 109, 113, 115, 116, 118, 122, 9, 10,
488 43, 45, 48, 57, 0, 13, 32, 65,
489 67, 72, 76, 77, 81, 83, 84, 86,
490 90, 97, 99, 104, 108, 109, 113, 115,
491 116, 118, 122, 9, 10, 0, 13, 32,
492 65, 67, 72, 76, 77, 81, 83, 84,
493 86, 90, 97, 99, 104, 108, 109, 113,
494 115, 116, 118, 122, 9, 10, 13, 32,
495 46, 9, 10, 48, 57, 13, 32, 43,
496 45, 46, 9, 10, 48, 57, 13, 32,
497 43, 45, 46, 9, 10, 48, 57, 0,
498 13, 32, 44, 46, 65, 67, 69, 72,
499 76, 77, 81, 83, 84, 86, 90, 97,
500 99, 101, 104, 108, 109, 113, 115, 116,
501 118, 122, 9, 10, 43, 45, 48, 57,
502 43, 45, 48, 57, 48, 57, 0, 13,
503 32, 44, 46, 65, 67, 72, 76, 77,
504 81, 83, 84, 86, 90, 97, 99, 104,
505 108, 109, 113, 115, 116, 118, 122, 9,
506 10, 43, 45, 48, 57, 0, 13, 32,
507 44, 46, 65, 67, 69, 72, 76, 77,
508 81, 83, 84, 86, 90, 97, 99, 101,
509 104, 108, 109, 113, 115, 116, 118, 122,
510 9, 10, 43, 45, 48, 57, 13, 32,
511 43, 45, 46, 9, 10, 48, 57, 13,
512 32, 43, 45, 46, 9, 10, 48, 57,
513 13, 32, 44, 46, 69, 101, 9, 10,
514 43, 45, 48, 57, 13, 32, 43, 45,
515 46, 9, 10, 48, 57, 0, 13, 32,
516 44, 46, 65, 67, 69, 72, 76, 77,
517 81, 83, 84, 86, 90, 97, 99, 101,
518 104, 108, 109, 113, 115, 116, 118, 122,
519 9, 10, 43, 45, 48, 57, 43, 45,
520 48, 57, 48, 57, 0, 13, 32, 44,
521 46, 65, 67, 72, 76, 77, 81, 83,
522 84, 86, 90, 97, 99, 104, 108, 109,
523 113, 115, 116, 118, 122, 9, 10, 43,
524 45, 48, 57, 13, 32, 43, 45, 46,
525 9, 10, 48, 57, 13, 32, 43, 45,
526 46, 9, 10, 48, 57, 13, 32, 43,
527 45, 46, 9, 10, 48, 57, 13, 32,
528 43, 45, 46, 9, 10, 48, 57, 0,
529 13, 32, 44, 46, 65, 67, 69, 72,
530 76, 77, 81, 83, 84, 86, 90, 97,
531 99, 101, 104, 108, 109, 113, 115, 116,
532 118, 122, 9, 10, 43, 45, 48, 57,
533 43, 45, 48, 57, 48, 57, 0, 13,
534 32, 44, 46, 65, 67, 72, 76, 77,
535 81, 83, 84, 86, 90, 97, 99, 104,
536 108, 109, 113, 115, 116, 118, 122, 9,
537 10, 43, 45, 48, 57, 0, 13, 32,
538 44, 46, 65, 67, 69, 72, 76, 77,
539 81, 83, 84, 86, 90, 97, 99, 101,
540 104, 108, 109, 113, 115, 116, 118, 122,
541 9, 10, 43, 45, 48, 57, 43, 45,
542 48, 57, 48, 57, 13, 32, 44, 46,
543 9, 10, 43, 45, 48, 57, 0, 13,
544 32, 44, 46, 65, 67, 69, 72, 76,
545 77, 81, 83, 84, 86, 90, 97, 99,
546 101, 104, 108, 109, 113, 115, 116, 118,
547 122, 9, 10, 43, 45, 48, 57, 43,
548 45, 48, 57, 48, 57, 13, 32, 44,
549 46, 9, 10, 43, 45, 48, 57, 43,
550 45, 48, 57, 48, 57, 13, 32, 44,
551 46, 9, 10, 43, 45, 48, 57, 43,
552 45, 48, 57, 48, 57, 13, 32, 44,
553 46, 9, 10, 43, 45, 48, 57, 43,
554 45, 48, 57, 48, 57, 13, 32, 44,
555 46, 9, 10, 43, 45, 48, 57, 43,
556 45, 48, 57, 48, 57, 13, 32, 44,
557 46, 9, 10, 43, 45, 48, 57, 43,
558 45, 48, 57, 48, 57, 13, 32, 44,
559 46, 9, 10, 43, 45, 48, 57, 43,
560 45, 48, 57, 48, 57, 13, 32, 44,
561 46, 9, 10, 43, 45, 48, 57, 0,
562 13, 32, 44, 46, 65, 67, 69, 72,
563 76, 77, 81, 83, 84, 86, 90, 97,
564 99, 101, 104, 108, 109, 113, 115, 116,
565 118, 122, 9, 10, 43, 45, 48, 57,
566 43, 45, 48, 57, 48, 57, 13, 32,
567 44, 46, 9, 10, 43, 45, 48, 57,
568 43, 45, 48, 57, 48, 57, 13, 32,
569 44, 46, 9, 10, 43, 45, 48, 57,
570 43, 45, 48, 57, 48, 57, 13, 32,
571 44, 46, 9, 10, 43, 45, 48, 57,
572 43, 45, 48, 57, 48, 57, 13, 32,
573 44, 46, 9, 10, 43, 45, 48, 57,
574 43, 45, 48, 57, 48, 57, 13, 32,
575 44, 46, 9, 10, 43, 45, 48, 57,
576 43, 45, 48, 57, 48, 57, 0, 13,
577 32, 44, 46, 65, 67, 72, 76, 77,
578 81, 83, 84, 86, 90, 97, 99, 104,
579 108, 109, 113, 115, 116, 118, 122, 9,
580 10, 48, 57, 43, 45, 48, 57, 48,
581 57, 0, 13, 32, 44, 46, 65, 67,
582 72, 76, 77, 81, 83, 84, 86, 90,
583 97, 99, 104, 108, 109, 113, 115, 116,
584 118, 122, 9, 10, 43, 45, 48, 57,
585 0, 13, 32, 44, 46, 65, 67, 69,
586 72, 76, 77, 81, 83, 84, 86, 90,
587 97, 99, 101, 104, 108, 109, 113, 115,
588 116, 118, 122, 9, 10, 43, 45, 48,
589 57, 13, 32, 43, 45, 46, 9, 10,
590 48, 57, 13, 32, 44, 46, 69, 101,
591 9, 10, 43, 45, 48, 57, 43, 45,
592 48, 57, 48, 57, 13, 32, 44, 46,
593 9, 10, 43, 45, 48, 57, 13, 32,
594 44, 46, 69, 101, 9, 10, 43, 45,
595 48, 57, 13, 32, 44, 9, 10, 13,
596 32, 44, 46, 69, 101, 9, 10, 48,
597 57, 43, 45, 48, 57, 48, 57, 13,
598 32, 44, 9, 10, 48, 57, 13, 32,
599 44, 46, 69, 101, 9, 10, 48, 57,
600 43, 45, 48, 57, 48, 57, 13, 32,
601 44, 46, 9, 10, 43, 45, 48, 57,
602 13, 32, 44, 46, 69, 101, 9, 10,
603 43, 45, 48, 57, 13, 32, 44, 46,
604 69, 101, 9, 10, 43, 45, 48, 57,
605 13, 32, 44, 46, 69, 101, 9, 10,
606 43, 45, 48, 57, 43, 45, 48, 57,
607 48, 57, 13, 32, 44, 46, 9, 10,
608 43, 45, 48, 57, 13, 32, 44, 46,
609 69, 101, 9, 10, 43, 45, 48, 57,
610 43, 45, 48, 57, 48, 57, 13, 32,
611 44, 46, 9, 10, 43, 45, 48, 57,
612 13, 32, 43, 45, 46, 9, 10, 48,
613 57, 43, 45, 48, 57, 48, 57, 13,
614 32, 44, 46, 9, 10, 48, 57, 13,
615 32, 43, 45, 46, 9, 10, 48, 57,
616 13, 32, 44, 9, 10, 13, 32, 44,
617 9, 10, 13, 32, 44, 46, 69, 101,
618 9, 10, 43, 45, 48, 57, 43, 45,
619 48, 57, 48, 57, 0, 13, 32, 44,
620 46, 65, 67, 72, 76, 77, 81, 83,
621 84, 86, 90, 97, 99, 104, 108, 109,
622 113, 115, 116, 118, 122, 9, 10, 43,
623 45, 48, 57, 43, 45, 48, 57, 48,
624 57, 13, 32, 44, 46, 9, 10, 43,
625 45, 48, 57, 0
626 };
628 static const char _svg_path_single_lengths[] = {
629 5, 0, 5, 5, 1, 0, 6, 4,
630 1, 0, 27, 25, 1, 0, 6, 4,
631 1, 0, 27, 5, 6, 5, 27, 3,
632 3, 0, 6, 4, 3, 0, 6, 4,
633 1, 0, 5, 5, 4, 3, 5, 4,
634 3, 4, 1, 0, 6, 4, 1, 0,
635 27, 25, 6, 6, 4, 5, 0, 6,
636 6, 7, 6, 5, 4, 3, 6, 7,
637 6, 4, 1, 0, 27, 5, 27, 5,
638 5, 1, 0, 6, 4, 1, 0, 6,
639 4, 1, 0, 6, 4, 1, 0, 6,
640 4, 1, 0, 6, 4, 1, 0, 27,
641 25, 6, 5, 6, 5, 6, 5, 6,
642 5, 6, 5, 27, 2, 0, 25, 5,
643 5, 1, 0, 27, 25, 1, 0, 27,
644 5, 27, 2, 0, 25, 5, 5, 5,
645 1, 0, 6, 4, 1, 0, 6, 4,
646 1, 0, 6, 4, 1, 0, 27, 25,
647 6, 5, 6, 5, 6, 5, 27, 2,
648 0, 25, 5, 5, 1, 0, 6, 4,
649 1, 0, 6, 4, 1, 0, 6, 4,
650 1, 0, 27, 25, 6, 5, 6, 5,
651 6, 5, 27, 2, 0, 25, 5, 5,
652 1, 0, 6, 4, 1, 0, 27, 25,
653 6, 5, 27, 2, 0, 25, 5, 5,
654 1, 0, 27, 25, 1, 0, 27, 5,
655 27, 2, 0, 25, 23, 23, 3, 5,
656 5, 27, 2, 0, 25, 27, 5, 5,
657 6, 5, 27, 2, 0, 25, 5, 5,
658 5, 5, 27, 2, 0, 25, 27, 2,
659 0, 4, 27, 2, 0, 4, 2, 0,
660 4, 2, 0, 4, 2, 0, 4, 2,
661 0, 4, 2, 0, 4, 2, 0, 4,
662 27, 2, 0, 4, 2, 0, 4, 2,
663 0, 4, 2, 0, 4, 2, 0, 4,
664 2, 0, 25, 2, 0, 25, 27, 5,
665 6, 2, 0, 4, 6, 3, 6, 2,
666 0, 3, 6, 2, 0, 4, 6, 6,
667 6, 2, 0, 4, 6, 2, 0, 4,
668 5, 2, 0, 4, 5, 3, 3, 6,
669 2, 0, 25, 2, 0, 4, 0
670 };
672 static const char _svg_path_range_lengths[] = {
673 1, 0, 2, 2, 1, 1, 3, 3,
674 1, 1, 3, 3, 1, 1, 3, 3,
675 1, 1, 3, 2, 3, 2, 3, 2,
676 2, 1, 2, 2, 2, 1, 3, 3,
677 1, 1, 2, 1, 1, 1, 1, 1,
678 1, 3, 1, 1, 3, 3, 1, 1,
679 2, 2, 2, 3, 3, 2, 1, 3,
680 3, 2, 2, 1, 1, 1, 3, 2,
681 3, 3, 1, 1, 3, 2, 2, 2,
682 2, 1, 1, 3, 3, 1, 1, 3,
683 3, 1, 1, 3, 3, 1, 1, 3,
684 3, 1, 1, 3, 3, 1, 1, 3,
685 3, 3, 2, 3, 2, 3, 2, 3,
686 2, 3, 2, 3, 1, 1, 3, 2,
687 2, 1, 1, 3, 3, 1, 1, 3,
688 2, 3, 1, 1, 3, 2, 2, 2,
689 1, 1, 3, 3, 1, 1, 3, 3,
690 1, 1, 3, 3, 1, 1, 3, 3,
691 3, 2, 3, 2, 3, 2, 3, 1,
692 1, 3, 2, 2, 1, 1, 3, 3,
693 1, 1, 3, 3, 1, 1, 3, 3,
694 1, 1, 3, 3, 3, 2, 3, 2,
695 3, 2, 3, 1, 1, 3, 2, 2,
696 1, 1, 3, 3, 1, 1, 3, 3,
697 3, 2, 3, 1, 1, 3, 2, 2,
698 1, 1, 3, 3, 1, 1, 3, 2,
699 3, 1, 1, 3, 1, 1, 2, 2,
700 2, 3, 1, 1, 3, 3, 2, 2,
701 3, 2, 3, 1, 1, 3, 2, 2,
702 2, 2, 3, 1, 1, 3, 3, 1,
703 1, 3, 3, 1, 1, 3, 1, 1,
704 3, 1, 1, 3, 1, 1, 3, 1,
705 1, 3, 1, 1, 3, 1, 1, 3,
706 3, 1, 1, 3, 1, 1, 3, 1,
707 1, 3, 1, 1, 3, 1, 1, 3,
708 1, 1, 2, 1, 1, 3, 3, 2,
709 3, 1, 1, 3, 3, 1, 2, 1,
710 1, 2, 2, 1, 1, 3, 3, 3,
711 3, 1, 1, 3, 3, 1, 1, 3,
712 2, 1, 1, 2, 2, 1, 1, 3,
713 1, 1, 3, 1, 1, 3, 0
714 };
716 static const short _svg_path_index_offsets[] = {
717 0, 7, 7, 15, 23, 26, 28, 38,
718 46, 49, 51, 82, 111, 114, 116, 126,
719 134, 137, 139, 170, 178, 188, 196, 227,
720 233, 239, 241, 250, 257, 263, 265, 275,
721 283, 286, 288, 296, 303, 309, 314, 321,
722 327, 332, 340, 343, 345, 355, 363, 366,
723 368, 398, 426, 435, 445, 453, 461, 463,
724 473, 483, 493, 502, 509, 515, 520, 530,
725 540, 550, 558, 561, 563, 594, 602, 632,
726 640, 648, 651, 653, 663, 671, 674, 676,
727 686, 694, 697, 699, 709, 717, 720, 722,
728 732, 740, 743, 745, 755, 763, 766, 768,
729 799, 828, 838, 846, 856, 864, 874, 882,
730 892, 900, 910, 918, 949, 953, 955, 984,
731 992, 1000, 1003, 1005, 1036, 1065, 1068, 1070,
732 1101, 1109, 1140, 1144, 1146, 1175, 1183, 1191,
733 1199, 1202, 1204, 1214, 1222, 1225, 1227, 1237,
734 1245, 1248, 1250, 1260, 1268, 1271, 1273, 1304,
735 1333, 1343, 1351, 1361, 1369, 1379, 1387, 1418,
736 1422, 1424, 1453, 1461, 1469, 1472, 1474, 1484,
737 1492, 1495, 1497, 1507, 1515, 1518, 1520, 1530,
738 1538, 1541, 1543, 1574, 1603, 1613, 1621, 1631,
739 1639, 1649, 1657, 1688, 1692, 1694, 1723, 1731,
740 1739, 1742, 1744, 1754, 1762, 1765, 1767, 1798,
741 1827, 1837, 1845, 1876, 1880, 1882, 1911, 1919,
742 1927, 1930, 1932, 1963, 1992, 1995, 1997, 2028,
743 2036, 2067, 2071, 2073, 2102, 2127, 2152, 2158,
744 2166, 2174, 2205, 2209, 2211, 2240, 2271, 2279,
745 2287, 2297, 2305, 2336, 2340, 2342, 2371, 2379,
746 2387, 2395, 2403, 2434, 2438, 2440, 2469, 2500,
747 2504, 2506, 2514, 2545, 2549, 2551, 2559, 2563,
748 2565, 2573, 2577, 2579, 2587, 2591, 2593, 2601,
749 2605, 2607, 2615, 2619, 2621, 2629, 2633, 2635,
750 2643, 2674, 2678, 2680, 2688, 2692, 2694, 2702,
751 2706, 2708, 2716, 2720, 2722, 2730, 2734, 2736,
752 2744, 2748, 2750, 2778, 2782, 2784, 2813, 2844,
753 2852, 2862, 2866, 2868, 2876, 2886, 2891, 2900,
754 2904, 2906, 2912, 2921, 2925, 2927, 2935, 2945,
755 2955, 2965, 2969, 2971, 2979, 2989, 2993, 2995,
756 3003, 3011, 3015, 3017, 3024, 3032, 3037, 3042,
757 3052, 3056, 3058, 3087, 3091, 3093, 3101
758 };
760 static const short _svg_path_indicies[] = {
761 73, 74, 74, 75, 76, 74, 0, 571,
762 571, 572, 572, 573, 571, 574, 0, 631,
763 631, 632, 632, 633, 631, 634, 0, 670,
764 513, 0, 512, 0, 509, 509, 511, 548,
765 514, 514, 509, 510, 512, 0, 490, 490,
766 434, 436, 490, 435, 437, 0, 393, 127,
767 0, 126, 0, 122, 123, 123, 125, 148,
768 128, 129, 130, 131, 132, 133, 134, 135,
769 136, 137, 138, 139, 140, 130, 141, 142,
770 143, 144, 145, 146, 147, 138, 123, 124,
771 126, 0, 73, 611, 611, 613, 614, 78,
772 79, 80, 81, 75, 82, 83, 84, 85,
773 86, 87, 88, 89, 90, 76, 91, 92,
774 93, 94, 86, 611, 612, 615, 0, 671,
775 519, 0, 518, 0, 515, 515, 517, 550,
776 520, 520, 515, 516, 518, 0, 491, 491,
777 438, 440, 491, 439, 441, 0, 394, 155,
778 0, 154, 0, 150, 151, 151, 153, 176,
779 156, 157, 158, 159, 160, 161, 162, 163,
780 164, 165, 166, 167, 168, 158, 169, 170,
781 171, 172, 173, 174, 175, 166, 151, 152,
782 154, 0, 613, 613, 612, 612, 614, 613,
783 615, 0, 515, 515, 517, 518, 520, 520,
784 515, 516, 519, 0, 438, 438, 439, 439,
785 440, 438, 441, 0, 150, 151, 151, 153,
786 154, 156, 157, 158, 159, 160, 161, 162,
787 163, 164, 165, 166, 167, 168, 158, 169,
788 170, 171, 172, 173, 174, 175, 166, 151,
789 152, 155, 0, 47, 47, 48, 47, 49,
790 0, 8, 8, 9, 8, 10, 0, 385,
791 0, 25, 25, 26, 27, 31, 31, 25,
792 498, 0, 12, 12, 13, 14, 12, 15,
793 0, 13, 13, 14, 13, 15, 0, 35,
794 0, 32, 32, 34, 38, 37, 37, 32,
795 33, 35, 0, 20, 20, 16, 18, 20,
796 17, 19, 0, 2, 3, 0, 23, 0,
797 21, 21, 22, 24, 24, 21, 23, 0,
798 11, 11, 5, 6, 7, 11, 0, 5,
799 5, 6, 7, 5, 0, 45, 45, 46,
800 45, 0, 722, 722, 716, 717, 718, 722,
801 0, 716, 716, 717, 718, 716, 0, 567,
802 567, 568, 567, 0, 651, 651, 647, 430,
803 651, 429, 433, 0, 676, 69, 0, 68,
804 0, 351, 351, 352, 375, 70, 70, 351,
805 66, 68, 0, 497, 497, 478, 480, 497,
806 479, 481, 0, 406, 380, 0, 379, 0,
807 350, 377, 377, 378, 382, 355, 356, 381,
808 358, 359, 360, 361, 362, 363, 364, 365,
809 366, 367, 381, 368, 369, 370, 371, 372,
810 373, 374, 365, 377, 379, 0, 73, 95,
811 95, 8, 9, 78, 79, 80, 81, 75,
812 82, 83, 84, 85, 86, 87, 88, 89,
813 90, 76, 91, 92, 93, 94, 86, 95,
814 10, 0, 25, 25, 26, 29, 31, 31,
815 25, 30, 0, 40, 40, 41, 562, 561,
816 561, 40, 33, 30, 0, 483, 483, 425,
817 426, 483, 17, 427, 0, 425, 425, 17,
818 17, 426, 425, 427, 0, 501, 0, 499,
819 499, 500, 38, 503, 503, 499, 33, 501,
820 0, 482, 482, 422, 18, 423, 424, 482,
821 17, 19, 0, 422, 422, 17, 17, 18,
822 423, 424, 422, 19, 0, 63, 63, 64,
823 23, 24, 24, 63, 3, 0, 723, 723,
824 719, 720, 721, 723, 0, 719, 719, 720,
825 721, 719, 0, 569, 569, 570, 569, 0,
826 489, 489, 428, 430, 431, 432, 489, 429,
827 433, 0, 428, 428, 429, 429, 430, 431,
828 432, 428, 433, 0, 71, 71, 72, 68,
829 70, 70, 71, 66, 69, 0, 496, 496,
830 474, 476, 496, 475, 477, 0, 405, 354,
831 0, 353, 0, 350, 351, 351, 352, 375,
832 355, 356, 357, 358, 359, 360, 361, 362,
833 363, 364, 365, 366, 367, 357, 368, 369,
834 370, 371, 372, 373, 374, 365, 351, 66,
835 353, 0, 478, 478, 479, 479, 480, 478,
836 481, 0, 350, 377, 377, 378, 379, 355,
837 356, 381, 358, 359, 360, 361, 362, 363,
838 364, 365, 366, 367, 381, 368, 369, 370,
839 371, 372, 373, 374, 365, 377, 380, 0,
840 50, 50, 51, 51, 52, 50, 53, 0,
841 98, 98, 97, 97, 99, 98, 100, 0,
842 391, 392, 0, 507, 0, 504, 504, 506,
843 546, 508, 508, 504, 505, 507, 0, 484,
844 484, 486, 487, 484, 485, 488, 0, 790,
845 788, 0, 755, 0, 751, 751, 753, 754,
846 756, 756, 751, 752, 755, 0, 787, 787,
847 773, 775, 787, 774, 776, 0, 748, 739,
848 0, 710, 0, 689, 689, 691, 692, 711,
849 711, 689, 690, 710, 0, 736, 736, 724,
850 726, 736, 725, 727, 0, 677, 656, 0,
851 655, 0, 652, 652, 654, 704, 657, 657,
852 652, 653, 655, 0, 648, 648, 635, 637,
853 648, 636, 638, 0, 672, 525, 0, 524,
854 0, 521, 521, 523, 552, 526, 526, 521,
855 522, 524, 0, 492, 492, 458, 460, 492,
856 459, 461, 0, 401, 243, 0, 242, 0,
857 238, 239, 239, 241, 264, 244, 245, 246,
858 247, 248, 249, 250, 251, 252, 253, 254,
859 255, 256, 246, 257, 258, 259, 260, 261,
860 262, 263, 254, 239, 240, 242, 0, 73,
861 96, 96, 98, 99, 78, 79, 80, 81,
862 75, 82, 83, 84, 85, 86, 87, 88,
863 89, 90, 76, 91, 92, 93, 94, 86,
864 96, 97, 100, 0, 504, 504, 506, 507,
865 508, 508, 504, 505, 392, 0, 486, 486,
866 485, 485, 487, 486, 488, 0, 751, 751,
867 753, 755, 756, 756, 751, 752, 788, 0,
868 773, 773, 774, 774, 775, 773, 776, 0,
869 689, 689, 691, 710, 711, 711, 689, 690,
870 739, 0, 724, 724, 725, 725, 726, 724,
871 727, 0, 652, 652, 654, 655, 657, 657,
872 652, 653, 656, 0, 635, 635, 636, 636,
873 637, 635, 638, 0, 521, 521, 523, 524,
874 526, 526, 521, 522, 525, 0, 458, 458,
875 459, 459, 460, 458, 461, 0, 238, 239,
876 239, 241, 242, 244, 245, 246, 247, 248,
877 249, 250, 251, 252, 253, 254, 255, 256,
878 246, 257, 258, 259, 260, 261, 262, 263,
879 254, 239, 240, 243, 0, 416, 416, 265,
880 0, 265, 0, 238, 239, 239, 241, 264,
881 244, 245, 247, 248, 249, 250, 251, 252,
882 253, 254, 255, 256, 257, 258, 259, 260,
883 261, 262, 263, 254, 239, 240, 265, 0,
884 583, 583, 584, 584, 585, 583, 586, 0,
885 446, 446, 447, 447, 448, 446, 449, 0,
886 396, 397, 0, 388, 0, 178, 179, 179,
887 181, 204, 184, 185, 624, 187, 188, 189,
888 190, 191, 192, 193, 194, 195, 196, 624,
889 197, 198, 199, 200, 201, 202, 203, 194,
890 179, 180, 623, 0, 73, 621, 621, 442,
891 444, 78, 79, 80, 81, 75, 82, 83,
892 84, 85, 86, 87, 88, 89, 90, 76,
893 91, 92, 93, 94, 86, 621, 443, 445,
894 0, 395, 183, 0, 182, 0, 178, 179,
895 179, 181, 204, 184, 185, 186, 187, 188,
896 189, 190, 191, 192, 193, 194, 195, 196,
897 186, 197, 198, 199, 200, 201, 202, 203,
898 194, 179, 180, 182, 0, 442, 442, 443,
899 443, 444, 442, 445, 0, 178, 179, 179,
900 181, 182, 184, 185, 186, 187, 188, 189,
901 190, 191, 192, 193, 194, 195, 196, 186,
902 197, 198, 199, 200, 201, 202, 203, 194,
903 179, 180, 183, 0, 412, 412, 205, 0,
904 205, 0, 178, 179, 179, 181, 204, 184,
905 185, 187, 188, 189, 190, 191, 192, 193,
906 194, 195, 196, 197, 198, 199, 200, 201,
907 202, 203, 194, 179, 180, 205, 0, 575,
908 575, 576, 576, 577, 575, 578, 0, 769,
909 769, 770, 770, 771, 769, 772, 0, 781,
910 781, 782, 782, 783, 781, 784, 0, 750,
911 741, 0, 714, 0, 699, 699, 701, 702,
912 715, 715, 699, 700, 714, 0, 738, 738,
913 732, 734, 738, 733, 735, 0, 679, 668,
914 0, 667, 0, 664, 664, 666, 708, 669,
915 669, 664, 665, 667, 0, 650, 650, 643,
916 645, 650, 644, 646, 0, 674, 537, 0,
917 536, 0, 533, 533, 535, 556, 538, 538,
918 533, 534, 536, 0, 494, 494, 466, 468,
919 494, 467, 469, 0, 403, 299, 0, 298,
920 0, 294, 295, 295, 297, 320, 300, 301,
921 302, 303, 304, 305, 306, 307, 308, 309,
922 310, 311, 312, 302, 313, 314, 315, 316,
923 317, 318, 319, 310, 295, 296, 298, 0,
924 73, 786, 786, 781, 783, 78, 79, 80,
925 81, 75, 82, 83, 84, 85, 86, 87,
926 88, 89, 90, 76, 91, 92, 93, 94,
927 86, 786, 782, 784, 0, 699, 699, 701,
928 714, 715, 715, 699, 700, 741, 0, 732,
929 732, 733, 733, 734, 732, 735, 0, 664,
930 664, 666, 667, 669, 669, 664, 665, 668,
931 0, 643, 643, 644, 644, 645, 643, 646,
932 0, 533, 533, 535, 536, 538, 538, 533,
933 534, 537, 0, 466, 466, 467, 467, 468,
934 466, 469, 0, 294, 295, 295, 297, 298,
935 300, 301, 302, 303, 304, 305, 306, 307,
936 308, 309, 310, 311, 312, 302, 313, 314,
937 315, 316, 317, 318, 319, 310, 295, 296,
938 299, 0, 418, 418, 321, 0, 321, 0,
939 294, 295, 295, 297, 320, 300, 301, 303,
940 304, 305, 306, 307, 308, 309, 310, 311,
941 312, 313, 314, 315, 316, 317, 318, 319,
942 310, 295, 296, 321, 0, 765, 765, 766,
943 766, 767, 765, 768, 0, 777, 777, 778,
944 778, 779, 777, 780, 0, 749, 740, 0,
945 712, 0, 694, 694, 696, 697, 713, 713,
946 694, 695, 712, 0, 737, 737, 728, 730,
947 737, 729, 731, 0, 678, 662, 0, 661,
948 0, 658, 658, 660, 706, 663, 663, 658,
949 659, 661, 0, 649, 649, 639, 641, 649,
950 640, 642, 0, 673, 531, 0, 530, 0,
951 527, 527, 529, 554, 532, 532, 527, 528,
952 530, 0, 493, 493, 462, 464, 493, 463,
953 465, 0, 402, 271, 0, 270, 0, 266,
954 267, 267, 269, 292, 272, 273, 274, 275,
955 276, 277, 278, 279, 280, 281, 282, 283,
956 284, 274, 285, 286, 287, 288, 289, 290,
957 291, 282, 267, 268, 270, 0, 73, 785,
958 785, 777, 779, 78, 79, 80, 81, 75,
959 82, 83, 84, 85, 86, 87, 88, 89,
960 90, 76, 91, 92, 93, 94, 86, 785,
961 778, 780, 0, 694, 694, 696, 712, 713,
962 713, 694, 695, 740, 0, 728, 728, 729,
963 729, 730, 728, 731, 0, 658, 658, 660,
964 661, 663, 663, 658, 659, 662, 0, 639,
965 639, 640, 640, 641, 639, 642, 0, 527,
966 527, 529, 530, 532, 532, 527, 528, 531,
967 0, 462, 462, 463, 463, 464, 462, 465,
968 0, 266, 267, 267, 269, 270, 272, 273,
969 274, 275, 276, 277, 278, 279, 280, 281,
970 282, 283, 284, 274, 285, 286, 287, 288,
971 289, 290, 291, 282, 267, 268, 271, 0,
972 417, 417, 293, 0, 293, 0, 266, 267,
973 267, 269, 292, 272, 273, 275, 276, 277,
974 278, 279, 280, 281, 282, 283, 284, 285,
975 286, 287, 288, 289, 290, 291, 282, 267,
976 268, 293, 0, 579, 579, 580, 580, 581,
977 579, 582, 0, 618, 618, 617, 617, 619,
978 618, 620, 0, 675, 543, 0, 542, 0,
979 539, 539, 541, 558, 544, 544, 539, 540,
980 542, 0, 495, 495, 470, 472, 495, 471,
981 473, 0, 404, 327, 0, 326, 0, 322,
982 323, 323, 325, 348, 328, 329, 330, 331,
983 332, 333, 334, 335, 336, 337, 338, 339,
984 340, 330, 341, 342, 343, 344, 345, 346,
985 347, 338, 323, 324, 326, 0, 73, 616,
986 616, 618, 619, 78, 79, 80, 81, 75,
987 82, 83, 84, 85, 86, 87, 88, 89,
988 90, 76, 91, 92, 93, 94, 86, 616,
989 617, 620, 0, 539, 539, 541, 542, 544,
990 544, 539, 540, 543, 0, 470, 470, 471,
991 471, 472, 470, 473, 0, 322, 323, 323,
992 325, 326, 328, 329, 330, 331, 332, 333,
993 334, 335, 336, 337, 338, 339, 340, 330,
994 341, 342, 343, 344, 345, 346, 347, 338,
995 323, 324, 327, 0, 419, 419, 349, 0,
996 349, 0, 322, 323, 323, 325, 348, 328,
997 329, 331, 332, 333, 334, 335, 336, 337,
998 338, 339, 340, 341, 342, 343, 344, 345,
999 346, 347, 338, 323, 324, 349, 0, 587,
1000 587, 588, 588, 589, 587, 590, 0, 454,
1001 454, 455, 455, 456, 454, 457, 0, 399,
1002 400, 0, 390, 0, 208, 209, 209, 211,
1003 234, 214, 215, 628, 217, 218, 219, 220,
1004 221, 222, 223, 224, 225, 226, 628, 227,
1005 228, 229, 230, 231, 232, 233, 224, 209,
1006 210, 627, 0, 73, 622, 622, 450, 452,
1007 78, 79, 80, 81, 75, 82, 83, 84,
1008 85, 86, 87, 88, 89, 90, 76, 91,
1009 92, 93, 94, 86, 622, 451, 453, 0,
1010 398, 213, 0, 212, 0, 208, 209, 209,
1011 211, 234, 214, 215, 216, 217, 218, 219,
1012 220, 221, 222, 223, 224, 225, 226, 216,
1013 227, 228, 229, 230, 231, 232, 233, 224,
1014 209, 210, 212, 0, 450, 450, 451, 451,
1015 452, 450, 453, 0, 208, 209, 209, 211,
1016 212, 214, 215, 216, 217, 218, 219, 220,
1017 221, 222, 223, 224, 225, 226, 216, 227,
1018 228, 229, 230, 231, 232, 233, 224, 209,
1019 210, 213, 0, 414, 414, 235, 0, 235,
1020 0, 208, 209, 209, 211, 234, 214, 215,
1021 217, 218, 219, 220, 221, 222, 223, 224,
1022 225, 226, 227, 228, 229, 230, 231, 232,
1023 233, 224, 209, 210, 235, 0, 101, 102,
1024 102, 103, 104, 105, 106, 107, 108, 109,
1025 110, 111, 112, 113, 114, 115, 116, 117,
1026 118, 119, 120, 121, 112, 102, 0, 73,
1027 77, 77, 78, 79, 80, 81, 75, 82,
1028 83, 84, 85, 86, 87, 88, 89, 90,
1029 76, 91, 92, 93, 94, 86, 77, 0,
1030 54, 54, 55, 54, 56, 0, 57, 57,
1031 58, 58, 59, 57, 60, 0, 603, 603,
1032 604, 604, 605, 603, 606, 0, 178, 179,
1033 179, 181, 625, 184, 185, 624, 187, 188,
1034 189, 190, 191, 192, 193, 194, 195, 196,
1035 624, 197, 198, 199, 200, 201, 202, 203,
1036 194, 179, 180, 626, 0, 413, 413, 387,
1037 0, 387, 0, 178, 179, 179, 181, 204,
1038 184, 185, 187, 188, 189, 190, 191, 192,
1039 193, 194, 195, 196, 197, 198, 199, 200,
1040 201, 202, 203, 194, 179, 180, 206, 0,
1041 178, 179, 179, 181, 207, 184, 185, 186,
1042 187, 188, 189, 190, 191, 192, 193, 194,
1043 195, 196, 186, 197, 198, 199, 200, 201,
1044 202, 203, 194, 179, 180, 206, 0, 595,
1045 595, 596, 596, 597, 595, 598, 0, 591,
1046 591, 592, 592, 593, 591, 594, 0, 509,
1047 509, 511, 512, 514, 514, 509, 510, 513,
1048 0, 434, 434, 435, 435, 436, 434, 437,
1049 0, 122, 123, 123, 125, 126, 128, 129,
1050 130, 131, 132, 133, 134, 135, 136, 137,
1051 138, 139, 140, 130, 141, 142, 143, 144,
1052 145, 146, 147, 138, 123, 124, 127, 0,
1053 410, 410, 149, 0, 149, 0, 122, 123,
1054 123, 125, 148, 128, 129, 131, 132, 133,
1055 134, 135, 136, 137, 138, 139, 140, 141,
1056 142, 143, 144, 145, 146, 147, 138, 123,
1057 124, 149, 0, 761, 761, 762, 762, 763,
1058 761, 764, 0, 757, 757, 758, 758, 759,
1059 757, 760, 0, 599, 599, 600, 600, 601,
1060 599, 602, 0, 607, 607, 608, 608, 609,
1061 607, 610, 0, 208, 209, 209, 211, 629,
1062 214, 215, 628, 217, 218, 219, 220, 221,
1063 222, 223, 224, 225, 226, 628, 227, 228,
1064 229, 230, 231, 232, 233, 224, 209, 210,
1065 630, 0, 415, 415, 389, 0, 389, 0,
1066 208, 209, 209, 211, 234, 214, 215, 217,
1067 218, 219, 220, 221, 222, 223, 224, 225,
1068 226, 227, 228, 229, 230, 231, 232, 233,
1069 224, 209, 210, 236, 0, 208, 209, 209,
1070 211, 237, 214, 215, 216, 217, 218, 219,
1071 220, 221, 222, 223, 224, 225, 226, 216,
1072 227, 228, 229, 230, 231, 232, 233, 224,
1073 209, 210, 236, 0, 682, 682, 549, 0,
1074 549, 0, 509, 509, 511, 548, 509, 510,
1075 549, 0, 208, 209, 209, 211, 237, 214,
1076 215, 628, 217, 218, 219, 220, 221, 222,
1077 223, 224, 225, 226, 628, 227, 228, 229,
1078 230, 231, 232, 233, 224, 209, 210, 627,
1079 0, 687, 687, 559, 0, 559, 0, 539,
1080 539, 541, 558, 539, 540, 559, 0, 685,
1081 685, 555, 0, 555, 0, 527, 527, 529,
1082 554, 527, 528, 555, 0, 746, 746, 707,
1083 0, 707, 0, 658, 658, 660, 706, 658,
1084 659, 707, 0, 743, 743, 698, 0, 698,
1085 0, 694, 694, 696, 697, 694, 695, 698,
1086 0, 686, 686, 557, 0, 557, 0, 533,
1087 533, 535, 556, 533, 534, 557, 0, 747,
1088 747, 709, 0, 709, 0, 664, 664, 666,
1089 708, 664, 665, 709, 0, 744, 744, 703,
1090 0, 703, 0, 699, 699, 701, 702, 699,
1091 700, 703, 0, 178, 179, 179, 181, 207,
1092 184, 185, 624, 187, 188, 189, 190, 191,
1093 192, 193, 194, 195, 196, 624, 197, 198,
1094 199, 200, 201, 202, 203, 194, 179, 180,
1095 623, 0, 684, 684, 553, 0, 553, 0,
1096 521, 521, 523, 552, 521, 522, 553, 0,
1097 745, 745, 705, 0, 705, 0, 652, 652,
1098 654, 704, 652, 653, 705, 0, 742, 742,
1099 693, 0, 693, 0, 689, 689, 691, 692,
1100 689, 690, 693, 0, 791, 791, 789, 0,
1101 789, 0, 751, 751, 753, 754, 751, 752,
1102 789, 0, 681, 681, 547, 0, 547, 0,
1103 504, 504, 506, 546, 504, 505, 547, 0,
1104 421, 421, 383, 0, 383, 0, 350, 377,
1105 377, 378, 382, 355, 356, 358, 359, 360,
1106 361, 362, 363, 364, 365, 366, 367, 368,
1107 369, 370, 371, 372, 373, 374, 365, 377,
1108 383, 0, 420, 420, 376, 0, 376, 0,
1109 350, 351, 351, 352, 375, 355, 356, 358,
1110 359, 360, 361, 362, 363, 364, 365, 366,
1111 367, 368, 369, 370, 371, 372, 373, 374,
1112 365, 351, 66, 376, 0, 350, 351, 351,
1113 352, 353, 355, 356, 357, 358, 359, 360,
1114 361, 362, 363, 364, 365, 366, 367, 357,
1115 368, 369, 370, 371, 372, 373, 374, 365,
1116 351, 66, 354, 0, 474, 474, 475, 475,
1117 476, 474, 477, 0, 351, 351, 352, 68,
1118 70, 70, 351, 66, 69, 0, 688, 688,
1119 560, 0, 560, 0, 351, 351, 352, 375,
1120 351, 66, 560, 0, 65, 65, 67, 68,
1121 70, 70, 65, 66, 69, 0, 565, 565,
1122 566, 565, 0, 21, 21, 22, 23, 24,
1123 24, 21, 3, 0, 4, 4, 1, 0,
1124 1, 0, 21, 21, 22, 21, 1, 0,
1125 61, 61, 62, 23, 24, 24, 61, 3,
1126 0, 680, 680, 545, 0, 545, 0, 499,
1127 499, 500, 38, 499, 33, 545, 0, 499,
1128 499, 500, 501, 503, 503, 499, 33, 502,
1129 0, 40, 40, 41, 27, 561, 561, 40,
1130 33, 498, 0, 40, 40, 41, 42, 561,
1131 561, 40, 33, 498, 0, 409, 409, 386,
1132 0, 386, 0, 40, 40, 41, 27, 40,
1133 33, 28, 0, 40, 40, 41, 42, 37,
1134 37, 40, 33, 28, 0, 408, 408, 39,
1135 0, 39, 0, 32, 32, 34, 38, 32,
1136 33, 39, 0, 16, 16, 17, 17, 18,
1137 16, 19, 0, 407, 407, 384, 0, 384,
1138 0, 25, 25, 26, 27, 25, 28, 0,
1139 647, 647, 429, 429, 430, 647, 433, 0,
1140 563, 563, 564, 563, 0, 43, 43, 44,
1141 43, 0, 32, 32, 34, 35, 37, 37,
1142 32, 33, 36, 0, 411, 411, 177, 0,
1143 177, 0, 150, 151, 151, 153, 176, 156,
1144 157, 159, 160, 161, 162, 163, 164, 165,
1145 166, 167, 168, 169, 170, 171, 172, 173,
1146 174, 175, 166, 151, 152, 177, 0, 683,
1147 683, 551, 0, 551, 0, 515, 515, 517,
1148 550, 515, 516, 551, 0, 0, 0
1149 };
1151 static const short _svg_path_trans_targs_wi[] = {
1152 1, 297, 33, 294, 296, 36, 37, 318,
1153 24, 25, 50, 35, 27, 28, 29, 319,
1154 312, 32, 33, 294, 31, 35, 36, 34,
1155 295, 27, 28, 29, 308, 26, 51, 313,
1156 31, 32, 312, 30, 319, 309, 33, 311,
1157 52, 53, 30, 38, 39, 38, 39, 24,
1158 25, 50, 72, 73, 74, 97, 24, 25,
1159 50, 72, 73, 74, 97, 59, 60, 59,
1160 60, 65, 46, 287, 44, 288, 289, 65,
1161 287, 326, 0, 2, 223, 213, 23, 71,
1162 111, 125, 126, 154, 182, 198, 212, 214,
1163 215, 216, 222, 230, 231, 232, 233, 49,
1164 96, 73, 72, 74, 97, 326, 213, 23,
1165 71, 111, 125, 2, 126, 154, 182, 198,
1166 212, 214, 215, 216, 222, 223, 230, 231,
1167 232, 233, 326, 11, 12, 19, 10, 226,
1168 23, 71, 227, 111, 125, 2, 126, 154,
1169 182, 198, 212, 214, 215, 216, 222, 223,
1170 230, 231, 232, 233, 13, 229, 326, 11,
1171 12, 19, 18, 22, 23, 71, 320, 111,
1172 125, 2, 126, 154, 182, 198, 212, 214,
1173 215, 216, 222, 223, 230, 231, 232, 233,
1174 13, 322, 326, 116, 117, 120, 119, 121,
1175 23, 71, 122, 111, 125, 2, 126, 154,
1176 182, 198, 212, 214, 215, 216, 222, 223,
1177 230, 231, 232, 233, 118, 124, 221, 119,
1178 326, 203, 204, 207, 206, 208, 23, 71,
1179 209, 111, 125, 2, 126, 154, 182, 198,
1180 212, 214, 215, 216, 222, 223, 230, 231,
1181 232, 233, 205, 211, 238, 206, 326, 96,
1182 73, 72, 95, 107, 23, 71, 108, 111,
1183 125, 2, 126, 154, 182, 198, 212, 214,
1184 215, 216, 222, 223, 230, 231, 232, 233,
1185 74, 110, 326, 171, 156, 155, 170, 178,
1186 23, 71, 179, 111, 125, 2, 126, 154,
1187 182, 198, 212, 214, 215, 216, 222, 223,
1188 230, 231, 232, 233, 157, 181, 326, 143,
1189 128, 127, 142, 150, 23, 71, 151, 111,
1190 125, 2, 126, 154, 182, 198, 212, 214,
1191 215, 216, 222, 223, 230, 231, 232, 233,
1192 129, 153, 326, 191, 184, 183, 190, 194,
1193 23, 71, 195, 111, 125, 2, 126, 154,
1194 182, 198, 212, 214, 215, 216, 222, 223,
1195 230, 231, 232, 233, 185, 197, 326, 45,
1196 69, 68, 286, 23, 71, 283, 111, 125,
1197 2, 126, 154, 182, 198, 212, 214, 215,
1198 216, 222, 223, 230, 231, 232, 233, 47,
1199 285, 49, 24, 48, 70, 280, 25, 282,
1200 315, 26, 307, 220, 115, 237, 202, 74,
1201 97, 9, 17, 118, 114, 217, 205, 201,
1202 234, 94, 169, 141, 189, 67, 47, 314,
1203 310, 306, 228, 321, 123, 219, 210, 236,
1204 109, 180, 152, 196, 284, 281, 57, 58,
1205 298, 53, 54, 302, 63, 42, 43, 64,
1206 292, 288, 225, 8, 9, 226, 21, 16,
1207 17, 22, 120, 117, 118, 121, 112, 113,
1208 114, 217, 207, 204, 205, 208, 199, 200,
1209 201, 234, 106, 93, 94, 107, 177, 168,
1210 169, 178, 149, 140, 141, 150, 193, 188,
1211 189, 194, 287, 66, 67, 286, 69, 46,
1212 47, 70, 56, 52, 76, 77, 98, 78,
1213 99, 62, 7, 15, 92, 167, 139, 187,
1214 65, 45, 304, 56, 57, 55, 302, 299,
1215 76, 77, 98, 75, 277, 7, 8, 225,
1216 6, 224, 239, 15, 16, 21, 14, 20,
1217 323, 92, 93, 106, 91, 105, 265, 167,
1218 168, 177, 166, 176, 246, 139, 140, 149,
1219 138, 148, 255, 187, 188, 193, 186, 192,
1220 243, 301, 78, 279, 9, 241, 17, 325,
1221 94, 267, 169, 248, 141, 257, 189, 245,
1222 291, 305, 303, 41, 316, 62, 63, 41,
1223 316, 62, 63, 3, 4, 5, 224, 19,
1224 12, 13, 20, 183, 184, 185, 192, 112,
1225 113, 114, 217, 199, 200, 201, 234, 3,
1226 4, 5, 224, 19, 12, 13, 20, 183,
1227 184, 185, 192, 112, 113, 114, 217, 199,
1228 200, 201, 234, 11, 12, 19, 13, 20,
1229 191, 184, 183, 185, 192, 116, 203, 264,
1230 218, 115, 217, 242, 235, 202, 234, 3,
1231 4, 5, 224, 104, 89, 90, 105, 175,
1232 164, 165, 176, 147, 136, 137, 148, 316,
1233 88, 163, 135, 41, 88, 89, 104, 87,
1234 103, 268, 163, 164, 175, 162, 174, 249,
1235 135, 136, 147, 134, 146, 258, 5, 13,
1236 90, 165, 137, 185, 43, 86, 161, 133,
1237 300, 278, 240, 324, 266, 247, 256, 244,
1238 290, 84, 85, 102, 86, 273, 159, 160,
1239 173, 161, 254, 131, 132, 145, 133, 263,
1240 90, 270, 165, 251, 137, 260, 83, 271,
1241 158, 252, 130, 261, 39, 40, 317, 60,
1242 61, 293, 38, 59, 102, 85, 86, 103,
1243 173, 160, 161, 174, 145, 132, 133, 146,
1244 84, 159, 131, 101, 172, 144, 272, 253,
1245 262, 269, 250, 259, 82, 157, 129, 80,
1246 81, 100, 82, 79, 274, 155, 156, 157,
1247 172, 127, 128, 129, 144, 155, 156, 157,
1248 172, 127, 128, 129, 144, 100, 81, 82,
1249 101, 155, 156, 157, 172, 127, 128, 129,
1250 144, 171, 143, 80, 99, 276, 78, 275
1251 };
1253 static const unsigned char _svg_path_trans_actions_wi[] = {
1254 0, 0, 0, 0, 0, 0, 0, 0,
1255 0, 1, 1, 0, 0, 0, 1, 1,
1256 0, 1, 1, 1, 0, 3, 3, 0,
1257 0, 3, 3, 17, 17, 17, 17, 0,
1258 3, 17, 3, 0, 0, 0, 17, 0,
1259 3, 3, 17, 5, 5, 7, 7, 9,
1260 59, 59, 9, 59, 59, 59, 11, 62,
1261 62, 11, 62, 62, 62, 20, 20, 23,
1262 23, 53, 17, 53, 0, 0, 0, 56,
1263 56, 15, 0, 0, 0, 0, 0, 0,
1264 0, 0, 0, 0, 0, 0, 0, 0,
1265 0, 0, 0, 0, 0, 0, 0, 0,
1266 0, 1, 0, 1, 1, 65, 13, 13,
1267 13, 13, 13, 13, 13, 13, 13, 13,
1268 13, 13, 13, 13, 13, 13, 13, 13,
1269 13, 13, 72, 26, 68, 26, 0, 0,
1270 26, 26, 0, 26, 26, 26, 26, 26,
1271 26, 26, 26, 26, 26, 26, 26, 26,
1272 26, 26, 26, 26, 68, 0, 80, 29,
1273 76, 29, 0, 0, 29, 29, 0, 29,
1274 29, 29, 29, 29, 29, 29, 29, 29,
1275 29, 29, 29, 29, 29, 29, 29, 29,
1276 76, 0, 88, 32, 84, 32, 0, 0,
1277 32, 32, 0, 32, 32, 32, 32, 32,
1278 32, 32, 32, 32, 32, 32, 32, 32,
1279 32, 32, 32, 32, 84, 0, 84, 84,
1280 96, 35, 92, 35, 0, 0, 35, 35,
1281 0, 35, 35, 35, 35, 35, 35, 35,
1282 35, 35, 35, 35, 35, 35, 35, 35,
1283 35, 35, 92, 0, 92, 92, 104, 38,
1284 100, 38, 0, 0, 38, 38, 0, 38,
1285 38, 38, 38, 38, 38, 38, 38, 38,
1286 38, 38, 38, 38, 38, 38, 38, 38,
1287 100, 0, 112, 41, 108, 41, 0, 0,
1288 41, 41, 0, 41, 41, 41, 41, 41,
1289 41, 41, 41, 41, 41, 41, 41, 41,
1290 41, 41, 41, 41, 108, 0, 120, 44,
1291 116, 44, 0, 0, 44, 44, 0, 44,
1292 44, 44, 44, 44, 44, 44, 44, 44,
1293 44, 44, 44, 44, 44, 44, 44, 44,
1294 116, 0, 128, 47, 124, 47, 0, 0,
1295 47, 47, 0, 47, 47, 47, 47, 47,
1296 47, 47, 47, 47, 47, 47, 47, 47,
1297 47, 47, 47, 47, 124, 0, 136, 3,
1298 3, 0, 0, 50, 50, 0, 50, 50,
1299 50, 50, 50, 50, 50, 50, 50, 50,
1300 50, 50, 50, 50, 50, 50, 50, 17,
1301 0, 50, 50, 0, 0, 0, 132, 0,
1302 0, 0, 0, 0, 0, 0, 0, 0,
1303 0, 0, 0, 0, 0, 0, 0, 0,
1304 0, 0, 0, 0, 0, 0, 0, 0,
1305 0, 0, 0, 0, 0, 0, 0, 0,
1306 0, 0, 0, 0, 0, 0, 0, 1,
1307 1, 0, 1, 1, 0, 1, 1, 1,
1308 1, 1, 0, 1, 1, 1, 0, 1,
1309 1, 1, 0, 1, 1, 1, 0, 1,
1310 1, 1, 0, 1, 1, 1, 0, 1,
1311 1, 1, 0, 1, 1, 1, 0, 1,
1312 1, 1, 0, 1, 1, 1, 0, 1,
1313 1, 1, 0, 1, 1, 1, 0, 1,
1314 1, 1, 0, 0, 0, 1, 0, 1,
1315 1, 0, 0, 0, 0, 0, 0, 0,
1316 0, 0, 17, 3, 3, 0, 0, 0,
1317 3, 17, 3, 0, 0, 3, 17, 3,
1318 0, 0, 0, 3, 17, 3, 0, 0,
1319 0, 3, 17, 3, 0, 0, 0, 3,
1320 17, 3, 0, 0, 0, 3, 17, 3,
1321 0, 0, 0, 3, 17, 3, 0, 0,
1322 0, 0, 17, 0, 17, 0, 17, 0,
1323 17, 0, 17, 0, 17, 0, 17, 0,
1324 0, 0, 17, 5, 5, 5, 5, 7,
1325 7, 7, 7, 9, 59, 59, 59, 9,
1326 59, 59, 59, 9, 59, 59, 59, 9,
1327 59, 59, 59, 9, 59, 59, 59, 11,
1328 62, 62, 62, 11, 62, 62, 62, 11,
1329 62, 62, 62, 11, 62, 62, 62, 11,
1330 62, 62, 62, 0, 1, 0, 1, 1,
1331 0, 1, 0, 1, 1, 0, 0, 84,
1332 0, 84, 84, 92, 0, 92, 92, 0,
1333 1, 1, 1, 0, 1, 1, 1, 0,
1334 1, 1, 1, 0, 1, 1, 1, 0,
1335 0, 0, 0, 0, 3, 17, 3, 0,
1336 0, 0, 3, 17, 3, 0, 0, 0,
1337 3, 17, 3, 0, 0, 0, 0, 0,
1338 0, 0, 0, 0, 0, 0, 0, 0,
1339 0, 0, 0, 0, 0, 0, 0, 0,
1340 0, 3, 17, 3, 17, 0, 3, 17,
1341 3, 17, 0, 3, 17, 3, 17, 0,
1342 17, 0, 17, 0, 17, 0, 0, 0,
1343 0, 0, 0, 0, 0, 0, 0, 0,
1344 0, 0, 0, 0, 0, 1, 1, 1,
1345 0, 1, 1, 1, 0, 1, 1, 1,
1346 0, 0, 0, 0, 0, 0, 0, 0,
1347 0, 0, 0, 0, 0, 0, 0, 3,
1348 17, 3, 17, 0, 0, 11, 62, 62,
1349 62, 11, 62, 62, 62, 9, 59, 59,
1350 59, 9, 59, 59, 59, 0, 1, 1,
1351 1, 0, 1, 1, 1, 0, 1, 1,
1352 1, 0, 0, 0, 0, 0, 0, 0
1353 };
1355 static const int svg_path_start = 0;
1357 static const int svg_path_first_final = 326;
1359 #line 133 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1362 void Parser::parse(char const *str)
1363 throw(SVGPathParseError)
1364 {
1365 char const *p = str;
1366 char const *start = NULL;
1367 int cs;
1369 _reset();
1372 #line 1373 "/home/njh/svn/lib2geom/src/svg-path-parser.cpp"
1373 {
1374 cs = svg_path_start;
1375 }
1376 {
1377 int _klen;
1378 unsigned int _trans;
1379 const char *_acts;
1380 unsigned int _nacts;
1381 const char *_keys;
1383 _resume:
1384 if ( cs == 1 )
1385 goto _out;
1386 _keys = _svg_path_trans_keys + _svg_path_key_offsets[cs];
1387 _trans = _svg_path_index_offsets[cs];
1389 _klen = _svg_path_single_lengths[cs];
1390 if ( _klen > 0 ) {
1391 const char *_lower = _keys;
1392 const char *_mid;
1393 const char *_upper = _keys + _klen - 1;
1394 while (1) {
1395 if ( _upper < _lower )
1396 break;
1398 _mid = _lower + ((_upper-_lower) >> 1);
1399 if ( (*p) < *_mid )
1400 _upper = _mid - 1;
1401 else if ( (*p) > *_mid )
1402 _lower = _mid + 1;
1403 else {
1404 _trans += (_mid - _keys);
1405 goto _match;
1406 }
1407 }
1408 _keys += _klen;
1409 _trans += _klen;
1410 }
1412 _klen = _svg_path_range_lengths[cs];
1413 if ( _klen > 0 ) {
1414 const char *_lower = _keys;
1415 const char *_mid;
1416 const char *_upper = _keys + (_klen<<1) - 2;
1417 while (1) {
1418 if ( _upper < _lower )
1419 break;
1421 _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1422 if ( (*p) < _mid[0] )
1423 _upper = _mid - 2;
1424 else if ( (*p) > _mid[1] )
1425 _lower = _mid + 2;
1426 else {
1427 _trans += ((_mid - _keys)>>1);
1428 goto _match;
1429 }
1430 }
1431 _trans += _klen;
1432 }
1434 _match:
1435 _trans = _svg_path_indicies[_trans];
1436 cs = _svg_path_trans_targs_wi[_trans];
1438 if ( _svg_path_trans_actions_wi[_trans] == 0 )
1439 goto _again;
1441 _acts = _svg_path_actions + _svg_path_trans_actions_wi[_trans];
1442 _nacts = (unsigned int) *_acts++;
1443 while ( _nacts-- > 0 )
1444 {
1445 switch ( *_acts++ )
1446 {
1447 case 0:
1448 #line 145 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1449 {
1450 start = p;
1451 }
1452 break;
1453 case 1:
1454 #line 149 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1455 {
1456 char const *end=p;
1457 std::string buf(start, end);
1458 _push(g_ascii_strtod(buf.c_str(), NULL));
1459 start = NULL;
1460 }
1461 break;
1462 case 2:
1463 #line 156 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1464 {
1465 _push(1.0);
1466 }
1467 break;
1468 case 3:
1469 #line 160 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1470 {
1471 _push(0.0);
1472 }
1473 break;
1474 case 4:
1475 #line 164 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1476 {
1477 _absolute = true;
1478 }
1479 break;
1480 case 5:
1481 #line 168 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1482 {
1483 _absolute = false;
1484 }
1485 break;
1486 case 6:
1487 #line 172 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1488 {
1489 _moveTo(_pop_point());
1490 }
1491 break;
1492 case 7:
1493 #line 176 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1494 {
1495 _lineTo(_pop_point());
1496 }
1497 break;
1498 case 8:
1499 #line 180 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1500 {
1501 _lineTo(Point(_pop_coord(X), _current[Y]));
1502 }
1503 break;
1504 case 9:
1505 #line 184 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1506 {
1507 _lineTo(Point(_current[X], _pop_coord(Y)));
1508 }
1509 break;
1510 case 10:
1511 #line 188 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1512 {
1513 Point p = _pop_point();
1514 Point c1 = _pop_point();
1515 Point c0 = _pop_point();
1516 _curveTo(c0, c1, p);
1517 }
1518 break;
1519 case 11:
1520 #line 195 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1521 {
1522 Point p = _pop_point();
1523 Point c1 = _pop_point();
1524 _curveTo(_cubic_tangent, c1, p);
1525 }
1526 break;
1527 case 12:
1528 #line 201 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1529 {
1530 Point p = _pop_point();
1531 Point c = _pop_point();
1532 _quadTo(c, p);
1533 }
1534 break;
1535 case 13:
1536 #line 207 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1537 {
1538 Point p = _pop_point();
1539 _quadTo(_quad_tangent, p);
1540 }
1541 break;
1542 case 14:
1543 #line 212 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1544 {
1545 Point point = _pop_point();
1546 bool sweep = _pop_flag();
1547 bool large_arc = _pop_flag();
1548 double angle = _pop();
1549 double ry = _pop();
1550 double rx = _pop();
1552 _arcTo(rx, ry, angle, large_arc, sweep, point);
1553 }
1554 break;
1555 case 15:
1556 #line 223 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1557 {
1558 _closePath();
1559 }
1560 break;
1561 case 16:
1562 #line 360 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1563 {goto _out;}
1564 break;
1565 #line 1566 "/home/njh/svn/lib2geom/src/svg-path-parser.cpp"
1566 }
1567 }
1569 _again:
1570 p += 1;
1571 goto _resume;
1572 _out: {}
1573 }
1574 #line 370 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1577 if ( cs < svg_path_first_final ) {
1578 throw SVGPathParseError();
1579 }
1580 }
1582 }
1584 void parse_svg_path(char const *str, SVGPathSink &sink)
1585 throw(SVGPathParseError)
1586 {
1587 Parser parser(sink);
1588 parser.parse(str);
1589 sink.finish();
1590 }
1592 }
1594 /*
1595 Local Variables:
1596 mode:c++
1597 c-file-style:"stroustrup"
1598 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
1599 indent-tabs-mode:nil
1600 fill-column:99
1601 End:
1602 */
1603 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :