#line 1 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" /** * \file * \brief parse SVG path specifications * * Copyright 2007 MenTaLguY * Copyright 2007 Aaron Spike * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * */ #include #include #include #include <2geom/point.h> #include <2geom/svg-path-parser.h> #include <2geom/angle.h> namespace Geom { namespace { class Parser { public: Parser(SVGPathSink &sink) : _sink(sink) {} void parse(char const *str) throw(SVGPathParseError); private: bool _absolute; Point _current; Point _initial; Point _cubic_tangent; Point _quad_tangent; std::vector _params; SVGPathSink &_sink; void _reset() { _absolute = false; _current = _initial = Point(0, 0); _quad_tangent = _cubic_tangent = Point(0, 0); _params.clear(); } void _push(double value) { _params.push_back(value); } double _pop() { double value = _params.back(); _params.pop_back(); return value; } bool _pop_flag() { return _pop() != 0.0; } double _pop_coord(Geom::Dim2 axis) { if (_absolute) { return _pop(); } else { return _pop() + _current[axis]; } } Point _pop_point() { double y = _pop_coord(Geom::Y); double x = _pop_coord(Geom::X); return Point(x, y); } void _moveTo(Point p) { _quad_tangent = _cubic_tangent = _current = _initial = p; _sink.moveTo(p); } void _hlineTo(Point p) { _quad_tangent = _cubic_tangent = _current = p; _sink.hlineTo(p[Geom::X]); } void _vlineTo(Point p) { _quad_tangent = _cubic_tangent = _current = p; _sink.vlineTo(p[Geom::Y]); } void _lineTo(Point p) { _quad_tangent = _cubic_tangent = _current = p; _sink.lineTo(p); } void _curveTo(Point c0, Point c1, Point p) { _quad_tangent = _current = p; _cubic_tangent = p + ( p - c1 ); _sink.curveTo(c0, c1, p); } void _quadTo(Point c, Point p) { _cubic_tangent = _current = p; _quad_tangent = p + ( p - c ); _sink.quadTo(c, p); } void _arcTo(double rx, double ry, double angle, bool large_arc, bool sweep, Point p) { _quad_tangent = _cubic_tangent = _current = p; _sink.arcTo(rx, ry, angle, large_arc, sweep, p); } void _closePath() { _quad_tangent = _cubic_tangent = _current = _initial; _sink.closePath(); } }; #line 144 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp" static const char _svg_path_actions[] = { 0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 15, 1, 16, 2, 1, 0, 2, 1, 6, 2, 1, 7, 2, 1, 8, 2, 1, 9, 2, 1, 10, 2, 1, 11, 2, 1, 12, 2, 1, 13, 2, 1, 14, 2, 4, 0, 2, 5, 0, 2, 15, 16, 3, 1, 6, 0, 3, 1, 6, 16, 3, 1, 7, 0, 3, 1, 7, 16, 3, 1, 8, 0, 3, 1, 8, 16, 3, 1, 9, 0, 3, 1, 9, 16, 3, 1, 10, 0, 3, 1, 10, 16, 3, 1, 11, 0, 3, 1, 11, 16, 3, 1, 12, 0, 3, 1, 12, 16, 3, 1, 13, 0, 3, 1, 13, 16, 3, 1, 14, 0, 3, 1, 14, 16 }; static const short _svg_path_key_offsets[] = { 0, 0, 7, 16, 25, 28, 30, 42, 52, 55, 57, 90, 121, 124, 126, 138, 148, 151, 153, 186, 195, 207, 216, 249, 256, 263, 265, 275, 283, 290, 292, 304, 314, 317, 319, 328, 335, 341, 346, 353, 359, 364, 374, 377, 379, 391, 401, 404, 406, 437, 466, 476, 480, 482, 490, 499, 508, 511, 513, 525, 535, 538, 540, 552, 562, 565, 567, 579, 589, 592, 594, 606, 616, 619, 621, 633, 643, 646, 648, 681, 712, 724, 733, 745, 754, 766, 775, 787, 796, 808, 817, 850, 854, 856, 887, 896, 905, 908, 910, 943, 974, 1007, 1011, 1013, 1044, 1053, 1062, 1071, 1074, 1076, 1088, 1098, 1101, 1103, 1115, 1125, 1128, 1130, 1142, 1152, 1155, 1157, 1190, 1221, 1233, 1242, 1254, 1263, 1275, 1284, 1317, 1321, 1323, 1354, 1363, 1372, 1375, 1377, 1389, 1399, 1402, 1404, 1416, 1426, 1429, 1431, 1443, 1453, 1456, 1458, 1491, 1522, 1534, 1543, 1555, 1564, 1576, 1585, 1618, 1622, 1624, 1655, 1664, 1673, 1676, 1678, 1690, 1700, 1703, 1705, 1738, 1769, 1781, 1790, 1823, 1827, 1829, 1860, 1869, 1878, 1881, 1883, 1916, 1947, 1980, 1984, 1986, 2017, 2042, 2067, 2074, 2083, 2092, 2101, 2110, 2122, 2131, 2164, 2168, 2170, 2201, 2210, 2219, 2228, 2237, 2241, 2243, 2253, 2257, 2259, 2269, 2273, 2275, 2285, 2289, 2291, 2301, 2305, 2307, 2317, 2321, 2323, 2333, 2337, 2339, 2349, 2353, 2355, 2365, 2369, 2371, 2381, 2385, 2387, 2397, 2401, 2403, 2413, 2417, 2419, 2429, 2433, 2435, 2445, 2449, 2451, 2480, 2511, 2520, 2524, 2526, 2536, 2548, 2557, 2562, 2567, 2571, 2573, 2580, 2590, 2599, 2603, 2605, 2615, 2627, 2631, 2633, 2664, 2668, 2670, 2680 }; static const char _svg_path_trans_keys[] = { 0, 13, 32, 77, 109, 9, 10, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 46, 9, 10, 48, 57, 13, 32, 46, 9, 10, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 48, 57, 13, 32, 44, 46, 9, 10, 48, 57, 13, 32, 46, 9, 10, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 69, 101, 9, 10, 48, 57, 13, 32, 44, 48, 49, 9, 10, 13, 32, 48, 49, 9, 10, 13, 32, 44, 9, 10, 13, 32, 44, 48, 49, 9, 10, 13, 32, 48, 49, 9, 10, 13, 32, 44, 9, 10, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 46, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 0, 13, 32, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 0, 13, 32, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 13, 32, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 48, 57, 0, 13, 32, 44, 46, 65, 67, 69, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 101, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 13, 32, 44, 9, 10, 13, 32, 44, 9, 10, 43, 45, 48, 57, 48, 57, 13, 32, 44, 9, 10, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 48, 57, 13, 32, 43, 45, 46, 9, 10, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 13, 32, 44, 46, 69, 101, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 0, 13, 32, 44, 46, 65, 67, 72, 76, 77, 81, 83, 84, 86, 90, 97, 99, 104, 108, 109, 113, 115, 116, 118, 122, 9, 10, 43, 45, 48, 57, 43, 45, 48, 57, 48, 57, 13, 32, 44, 46, 9, 10, 43, 45, 48, 57, 0 }; static const char _svg_path_single_lengths[] = { 0, 5, 5, 5, 1, 0, 6, 4, 1, 0, 27, 25, 1, 0, 6, 4, 1, 0, 27, 5, 6, 5, 27, 3, 3, 0, 6, 4, 3, 0, 6, 4, 1, 0, 5, 5, 4, 3, 5, 4, 3, 4, 1, 0, 6, 4, 1, 0, 27, 25, 6, 2, 0, 4, 5, 5, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 27, 25, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 27, 2, 0, 25, 5, 5, 1, 0, 27, 25, 27, 2, 0, 25, 5, 5, 5, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 27, 25, 6, 5, 6, 5, 6, 5, 27, 2, 0, 25, 5, 5, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 6, 4, 1, 0, 27, 25, 6, 5, 6, 5, 6, 5, 27, 2, 0, 25, 5, 5, 1, 0, 6, 4, 1, 0, 27, 25, 6, 5, 27, 2, 0, 25, 5, 5, 1, 0, 27, 25, 27, 2, 0, 25, 23, 23, 3, 5, 5, 5, 5, 6, 5, 27, 2, 0, 25, 5, 5, 5, 5, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 0, 25, 27, 5, 2, 0, 4, 6, 5, 3, 3, 2, 0, 3, 6, 5, 2, 0, 4, 6, 2, 0, 25, 2, 0, 4, 0 }; static const char _svg_path_range_lengths[] = { 0, 1, 2, 2, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 2, 3, 2, 3, 2, 2, 1, 2, 2, 2, 1, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1, 3, 2, 2, 1, 1, 3, 3, 3, 1, 1, 3, 2, 2, 2, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 3, 2, 3, 2, 3, 2, 3, 1, 1, 3, 2, 2, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 3, 2, 3, 2, 3, 2, 3, 1, 1, 3, 2, 2, 1, 1, 3, 3, 1, 1, 3, 3, 3, 2, 3, 1, 1, 3, 2, 2, 1, 1, 3, 3, 3, 1, 1, 3, 1, 1, 2, 2, 2, 2, 2, 3, 2, 3, 1, 1, 3, 2, 2, 2, 2, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 2, 2, 2, 1, 1, 3, 3, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 0 }; static const short _svg_path_index_offsets[] = { 0, 0, 7, 15, 23, 26, 28, 38, 46, 49, 51, 82, 111, 114, 116, 126, 134, 137, 139, 170, 178, 188, 196, 227, 233, 239, 241, 250, 257, 263, 265, 275, 283, 286, 288, 296, 303, 309, 314, 321, 327, 332, 340, 343, 345, 355, 363, 366, 368, 398, 426, 435, 439, 441, 448, 456, 464, 467, 469, 479, 487, 490, 492, 502, 510, 513, 515, 525, 533, 536, 538, 548, 556, 559, 561, 571, 579, 582, 584, 615, 644, 654, 662, 672, 680, 690, 698, 708, 716, 726, 734, 765, 769, 771, 800, 808, 816, 819, 821, 852, 881, 912, 916, 918, 947, 955, 963, 971, 974, 976, 986, 994, 997, 999, 1009, 1017, 1020, 1022, 1032, 1040, 1043, 1045, 1076, 1105, 1115, 1123, 1133, 1141, 1151, 1159, 1190, 1194, 1196, 1225, 1233, 1241, 1244, 1246, 1256, 1264, 1267, 1269, 1279, 1287, 1290, 1292, 1302, 1310, 1313, 1315, 1346, 1375, 1385, 1393, 1403, 1411, 1421, 1429, 1460, 1464, 1466, 1495, 1503, 1511, 1514, 1516, 1526, 1534, 1537, 1539, 1570, 1599, 1609, 1617, 1648, 1652, 1654, 1683, 1691, 1699, 1702, 1704, 1735, 1764, 1795, 1799, 1801, 1830, 1855, 1880, 1886, 1894, 1902, 1910, 1918, 1928, 1936, 1967, 1971, 1973, 2002, 2010, 2018, 2026, 2034, 2038, 2040, 2048, 2052, 2054, 2062, 2066, 2068, 2076, 2080, 2082, 2090, 2094, 2096, 2104, 2108, 2110, 2118, 2122, 2124, 2132, 2136, 2138, 2146, 2150, 2152, 2160, 2164, 2166, 2174, 2178, 2180, 2188, 2192, 2194, 2202, 2206, 2208, 2216, 2220, 2222, 2250, 2280, 2288, 2292, 2294, 2302, 2312, 2320, 2325, 2330, 2334, 2336, 2342, 2351, 2359, 2363, 2365, 2373, 2383, 2387, 2389, 2418, 2422, 2424, 2432 }; static const short _svg_path_indicies[] = { 0, 2, 2, 3, 4, 2, 1, 5, 5, 6, 6, 7, 5, 8, 1, 9, 9, 10, 10, 11, 9, 12, 1, 13, 14, 1, 15, 1, 16, 16, 18, 19, 20, 20, 16, 17, 15, 1, 21, 21, 23, 24, 21, 22, 25, 1, 26, 27, 1, 28, 1, 29, 30, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 36, 47, 48, 49, 50, 51, 52, 53, 44, 30, 31, 28, 1, 0, 54, 54, 56, 57, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 54, 55, 58, 1, 76, 77, 1, 78, 1, 79, 79, 81, 82, 83, 83, 79, 80, 78, 1, 84, 84, 86, 87, 84, 85, 88, 1, 89, 90, 1, 91, 1, 92, 93, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 99, 110, 111, 112, 113, 114, 115, 116, 107, 93, 94, 91, 1, 56, 56, 55, 55, 57, 56, 58, 1, 79, 79, 81, 78, 83, 83, 79, 80, 77, 1, 86, 86, 85, 85, 87, 86, 88, 1, 92, 93, 93, 95, 91, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 99, 110, 111, 112, 113, 114, 115, 116, 107, 93, 94, 90, 1, 117, 117, 118, 117, 119, 1, 120, 120, 121, 120, 122, 1, 123, 1, 124, 124, 125, 126, 127, 127, 124, 123, 1, 128, 128, 129, 130, 128, 131, 1, 129, 129, 130, 129, 131, 1, 132, 1, 133, 133, 135, 136, 137, 137, 133, 134, 132, 1, 138, 138, 140, 141, 138, 139, 142, 1, 143, 144, 1, 145, 1, 146, 146, 147, 148, 148, 146, 145, 1, 149, 149, 150, 151, 152, 149, 1, 150, 150, 151, 152, 150, 1, 153, 153, 154, 153, 1, 155, 155, 156, 157, 158, 155, 1, 156, 156, 157, 158, 156, 1, 159, 159, 160, 159, 1, 161, 161, 163, 164, 161, 162, 165, 1, 166, 167, 1, 168, 1, 169, 169, 171, 172, 173, 173, 169, 170, 168, 1, 174, 174, 176, 177, 174, 175, 178, 1, 179, 180, 1, 181, 1, 182, 183, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 188, 199, 200, 201, 202, 203, 204, 205, 196, 183, 181, 1, 0, 206, 206, 120, 121, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 206, 122, 1, 124, 124, 125, 123, 127, 127, 124, 207, 1, 208, 208, 209, 1, 209, 1, 124, 124, 125, 126, 124, 209, 1, 210, 210, 211, 211, 212, 210, 213, 1, 214, 214, 215, 215, 216, 214, 217, 1, 218, 219, 1, 220, 1, 221, 221, 223, 224, 225, 225, 221, 222, 220, 1, 226, 226, 228, 229, 226, 227, 230, 1, 231, 232, 1, 233, 1, 234, 234, 236, 237, 238, 238, 234, 235, 233, 1, 239, 239, 241, 242, 239, 240, 243, 1, 244, 245, 1, 246, 1, 247, 247, 249, 250, 251, 251, 247, 248, 246, 1, 252, 252, 254, 255, 252, 253, 256, 1, 257, 258, 1, 259, 1, 260, 260, 262, 263, 264, 264, 260, 261, 259, 1, 265, 265, 267, 268, 265, 266, 269, 1, 270, 271, 1, 272, 1, 273, 273, 275, 276, 277, 277, 273, 274, 272, 1, 278, 278, 280, 281, 278, 279, 282, 1, 283, 284, 1, 285, 1, 286, 287, 287, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 293, 304, 305, 306, 307, 308, 309, 310, 301, 287, 288, 285, 1, 0, 311, 311, 214, 216, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 311, 215, 217, 1, 221, 221, 223, 220, 225, 225, 221, 222, 219, 1, 228, 228, 227, 227, 229, 228, 230, 1, 234, 234, 236, 233, 238, 238, 234, 235, 232, 1, 241, 241, 240, 240, 242, 241, 243, 1, 247, 247, 249, 246, 251, 251, 247, 248, 245, 1, 254, 254, 253, 253, 255, 254, 256, 1, 260, 260, 262, 259, 264, 264, 260, 261, 258, 1, 267, 267, 266, 266, 268, 267, 269, 1, 273, 273, 275, 272, 277, 277, 273, 274, 271, 1, 280, 280, 279, 279, 281, 280, 282, 1, 286, 287, 287, 289, 285, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 293, 304, 305, 306, 307, 308, 309, 310, 301, 287, 288, 284, 1, 312, 312, 313, 1, 313, 1, 286, 287, 287, 289, 290, 291, 292, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 301, 287, 288, 313, 1, 314, 314, 315, 315, 316, 314, 317, 1, 318, 318, 319, 319, 320, 318, 321, 1, 322, 323, 1, 324, 1, 325, 326, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 332, 343, 344, 345, 346, 347, 348, 349, 340, 326, 327, 324, 1, 0, 350, 350, 318, 320, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 350, 319, 321, 1, 325, 326, 326, 328, 324, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 332, 343, 344, 345, 346, 347, 348, 349, 340, 326, 327, 323, 1, 351, 351, 352, 1, 352, 1, 325, 326, 326, 328, 329, 330, 331, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 340, 326, 327, 352, 1, 353, 353, 354, 354, 355, 353, 356, 1, 357, 357, 358, 358, 359, 357, 360, 1, 361, 361, 362, 362, 363, 361, 364, 1, 365, 366, 1, 367, 1, 368, 368, 370, 371, 372, 372, 368, 369, 367, 1, 373, 373, 375, 376, 373, 374, 377, 1, 378, 379, 1, 380, 1, 381, 381, 383, 384, 385, 385, 381, 382, 380, 1, 386, 386, 388, 389, 386, 387, 390, 1, 391, 392, 1, 393, 1, 394, 394, 396, 397, 398, 398, 394, 395, 393, 1, 399, 399, 401, 402, 399, 400, 403, 1, 404, 405, 1, 406, 1, 407, 408, 408, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 414, 425, 426, 427, 428, 429, 430, 431, 422, 408, 409, 406, 1, 0, 432, 432, 361, 363, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 432, 362, 364, 1, 368, 368, 370, 367, 372, 372, 368, 369, 366, 1, 375, 375, 374, 374, 376, 375, 377, 1, 381, 381, 383, 380, 385, 385, 381, 382, 379, 1, 388, 388, 387, 387, 389, 388, 390, 1, 394, 394, 396, 393, 398, 398, 394, 395, 392, 1, 401, 401, 400, 400, 402, 401, 403, 1, 407, 408, 408, 410, 406, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 414, 425, 426, 427, 428, 429, 430, 431, 422, 408, 409, 405, 1, 433, 433, 434, 1, 434, 1, 407, 408, 408, 410, 411, 412, 413, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 422, 408, 409, 434, 1, 435, 435, 436, 436, 437, 435, 438, 1, 439, 439, 440, 440, 441, 439, 442, 1, 443, 444, 1, 445, 1, 446, 446, 448, 449, 450, 450, 446, 447, 445, 1, 451, 451, 453, 454, 451, 452, 455, 1, 456, 457, 1, 458, 1, 459, 459, 461, 462, 463, 463, 459, 460, 458, 1, 464, 464, 466, 467, 464, 465, 468, 1, 469, 470, 1, 471, 1, 472, 472, 474, 475, 476, 476, 472, 473, 471, 1, 477, 477, 479, 480, 477, 478, 481, 1, 482, 483, 1, 484, 1, 485, 486, 486, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 492, 503, 504, 505, 506, 507, 508, 509, 500, 486, 487, 484, 1, 0, 510, 510, 439, 441, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 510, 440, 442, 1, 446, 446, 448, 445, 450, 450, 446, 447, 444, 1, 453, 453, 452, 452, 454, 453, 455, 1, 459, 459, 461, 458, 463, 463, 459, 460, 457, 1, 466, 466, 465, 465, 467, 466, 468, 1, 472, 472, 474, 471, 476, 476, 472, 473, 470, 1, 479, 479, 478, 478, 480, 479, 481, 1, 485, 486, 486, 488, 484, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 492, 503, 504, 505, 506, 507, 508, 509, 500, 486, 487, 483, 1, 511, 511, 512, 1, 512, 1, 485, 486, 486, 488, 489, 490, 491, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 500, 486, 487, 512, 1, 513, 513, 514, 514, 515, 513, 516, 1, 517, 517, 518, 518, 519, 517, 520, 1, 521, 522, 1, 523, 1, 524, 524, 526, 527, 528, 528, 524, 525, 523, 1, 529, 529, 531, 532, 529, 530, 533, 1, 534, 535, 1, 536, 1, 537, 538, 538, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 544, 555, 556, 557, 558, 559, 560, 561, 552, 538, 539, 536, 1, 0, 562, 562, 517, 519, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 562, 518, 520, 1, 524, 524, 526, 523, 528, 528, 524, 525, 522, 1, 531, 531, 530, 530, 532, 531, 533, 1, 537, 538, 538, 540, 536, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 544, 555, 556, 557, 558, 559, 560, 561, 552, 538, 539, 535, 1, 563, 563, 564, 1, 564, 1, 537, 538, 538, 540, 541, 542, 543, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 552, 538, 539, 564, 1, 565, 565, 566, 566, 567, 565, 568, 1, 569, 569, 570, 570, 571, 569, 572, 1, 573, 574, 1, 575, 1, 576, 577, 577, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 583, 594, 595, 596, 597, 598, 599, 600, 591, 577, 578, 575, 1, 0, 601, 601, 569, 571, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 601, 570, 572, 1, 576, 577, 577, 579, 575, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 583, 594, 595, 596, 597, 598, 599, 600, 591, 577, 578, 574, 1, 602, 602, 603, 1, 603, 1, 576, 577, 577, 579, 580, 581, 582, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 591, 577, 578, 603, 1, 604, 605, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 615, 605, 1, 0, 625, 625, 59, 60, 61, 62, 3, 63, 64, 65, 66, 67, 68, 69, 70, 71, 4, 72, 73, 74, 75, 67, 625, 1, 626, 626, 627, 626, 628, 1, 629, 629, 630, 630, 631, 629, 632, 1, 633, 633, 634, 634, 635, 633, 636, 1, 637, 637, 638, 638, 639, 637, 640, 1, 641, 641, 642, 642, 643, 641, 644, 1, 16, 16, 18, 15, 20, 20, 16, 17, 14, 1, 23, 23, 22, 22, 24, 23, 25, 1, 29, 30, 30, 32, 28, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 36, 47, 48, 49, 50, 51, 52, 53, 44, 30, 31, 27, 1, 645, 645, 646, 1, 646, 1, 29, 30, 30, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 44, 30, 31, 646, 1, 647, 647, 648, 648, 649, 647, 650, 1, 651, 651, 652, 652, 653, 651, 654, 1, 655, 655, 656, 656, 657, 655, 658, 1, 659, 659, 660, 660, 661, 659, 662, 1, 663, 663, 664, 1, 664, 1, 16, 16, 18, 19, 16, 17, 664, 1, 665, 665, 666, 1, 666, 1, 524, 524, 526, 527, 524, 525, 666, 1, 667, 667, 668, 1, 668, 1, 472, 472, 474, 475, 472, 473, 668, 1, 669, 669, 670, 1, 670, 1, 459, 459, 461, 462, 459, 460, 670, 1, 671, 671, 672, 1, 672, 1, 446, 446, 448, 449, 446, 447, 672, 1, 673, 673, 674, 1, 674, 1, 394, 394, 396, 397, 394, 395, 674, 1, 675, 675, 676, 1, 676, 1, 381, 381, 383, 384, 381, 382, 676, 1, 677, 677, 678, 1, 678, 1, 368, 368, 370, 371, 368, 369, 678, 1, 679, 679, 680, 1, 680, 1, 273, 273, 275, 276, 273, 274, 680, 1, 681, 681, 682, 1, 682, 1, 260, 260, 262, 263, 260, 261, 682, 1, 683, 683, 684, 1, 684, 1, 247, 247, 249, 250, 247, 248, 684, 1, 685, 685, 686, 1, 686, 1, 234, 234, 236, 237, 234, 235, 686, 1, 687, 687, 688, 1, 688, 1, 221, 221, 223, 224, 221, 222, 688, 1, 689, 689, 690, 1, 690, 1, 182, 183, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 196, 183, 690, 1, 182, 183, 183, 184, 181, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 188, 199, 200, 201, 202, 203, 204, 205, 196, 183, 180, 1, 176, 176, 175, 175, 177, 176, 178, 1, 691, 691, 692, 1, 692, 1, 169, 169, 171, 172, 169, 170, 692, 1, 169, 169, 171, 168, 173, 173, 169, 170, 167, 1, 163, 163, 162, 162, 164, 163, 165, 1, 693, 693, 694, 693, 1, 695, 695, 696, 695, 1, 697, 697, 698, 1, 698, 1, 146, 146, 147, 146, 698, 1, 146, 146, 147, 145, 148, 148, 146, 144, 1, 140, 140, 139, 139, 141, 140, 142, 1, 699, 699, 700, 1, 700, 1, 133, 133, 135, 136, 133, 134, 700, 1, 133, 133, 135, 132, 137, 137, 133, 134, 701, 1, 702, 702, 703, 1, 703, 1, 92, 93, 93, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 107, 93, 94, 703, 1, 704, 704, 705, 1, 705, 1, 79, 79, 81, 82, 79, 80, 705, 1, 1, 0 }; static const short _svg_path_trans_targs_wi[] = { 270, 0, 1, 2, 193, 3, 4, 5, 194, 3, 4, 5, 194, 5, 194, 6, 7, 8, 195, 9, 204, 7, 8, 195, 9, 196, 9, 196, 10, 270, 11, 12, 19, 13, 23, 54, 197, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 11, 12, 19, 13, 20, 23, 54, 94, 104, 105, 133, 161, 177, 187, 189, 190, 191, 192, 200, 201, 202, 203, 13, 20, 14, 15, 16, 21, 17, 267, 15, 16, 21, 17, 22, 17, 22, 18, 270, 11, 12, 19, 13, 23, 54, 264, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 24, 25, 50, 24, 25, 50, 26, 27, 28, 29, 51, 27, 28, 29, 263, 30, 31, 32, 259, 33, 260, 31, 32, 259, 33, 258, 33, 258, 34, 35, 36, 255, 35, 36, 37, 254, 38, 39, 38, 39, 40, 253, 41, 252, 41, 42, 252, 43, 251, 43, 251, 44, 45, 46, 247, 47, 248, 45, 46, 247, 47, 246, 47, 246, 48, 270, 49, 24, 25, 23, 54, 243, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 49, 50, 52, 53, 55, 56, 57, 80, 55, 56, 57, 80, 57, 80, 58, 59, 60, 81, 61, 240, 59, 60, 81, 61, 82, 61, 82, 62, 63, 64, 83, 65, 237, 63, 64, 83, 65, 84, 65, 84, 66, 67, 68, 85, 69, 234, 67, 68, 85, 69, 86, 69, 86, 70, 71, 72, 87, 73, 231, 71, 72, 87, 73, 88, 73, 88, 74, 75, 76, 89, 77, 228, 75, 76, 89, 77, 90, 77, 90, 78, 270, 79, 56, 55, 57, 23, 54, 91, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 79, 92, 93, 95, 96, 97, 100, 95, 96, 97, 100, 97, 100, 98, 270, 99, 96, 95, 97, 23, 54, 101, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 99, 102, 103, 19, 12, 13, 20, 106, 107, 108, 123, 106, 107, 108, 123, 108, 123, 109, 110, 111, 124, 112, 225, 110, 111, 124, 112, 125, 112, 125, 113, 114, 115, 126, 116, 222, 114, 115, 126, 116, 127, 116, 127, 117, 118, 119, 128, 120, 219, 118, 119, 128, 120, 129, 120, 129, 121, 270, 122, 107, 106, 108, 23, 54, 130, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 122, 131, 132, 134, 135, 136, 151, 134, 135, 136, 151, 136, 151, 137, 138, 139, 152, 140, 216, 138, 139, 152, 140, 153, 140, 153, 141, 142, 143, 154, 144, 213, 142, 143, 154, 144, 155, 144, 155, 145, 146, 147, 156, 148, 210, 146, 147, 156, 148, 157, 148, 157, 149, 270, 150, 135, 134, 136, 23, 54, 158, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 150, 159, 160, 162, 163, 164, 171, 162, 163, 164, 171, 164, 171, 165, 166, 167, 172, 168, 207, 166, 167, 172, 168, 173, 168, 173, 169, 270, 170, 163, 162, 164, 23, 54, 174, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 170, 175, 176, 178, 179, 180, 183, 178, 179, 180, 183, 180, 183, 181, 270, 182, 179, 178, 180, 23, 54, 184, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 182, 185, 186, 270, 188, 23, 54, 94, 104, 2, 105, 133, 161, 177, 187, 189, 190, 191, 192, 193, 200, 201, 202, 203, 188, 24, 25, 50, 55, 56, 57, 80, 95, 96, 97, 100, 19, 12, 13, 20, 3, 4, 5, 194, 198, 199, 106, 107, 108, 123, 134, 135, 136, 151, 162, 163, 164, 171, 178, 179, 180, 183, 205, 206, 208, 209, 211, 212, 214, 215, 217, 218, 220, 221, 223, 224, 226, 227, 229, 230, 232, 233, 235, 236, 238, 239, 241, 242, 244, 245, 249, 250, 41, 252, 38, 39, 256, 257, 261, 262, 263, 265, 266, 268, 269 }; static const char _svg_path_trans_actions_wi[] = { 15, 0, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 60, 20, 56, 20, 56, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 68, 23, 64, 23, 64, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 9, 47, 47, 0, 1, 1, 0, 3, 3, 17, 0, 0, 0, 1, 1, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 7, 7, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 124, 44, 44, 120, 44, 44, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 92, 32, 88, 32, 88, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 76, 26, 72, 26, 72, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 9, 47, 47, 47, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 108, 38, 104, 38, 104, 38, 38, 0, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 100, 35, 96, 35, 96, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, 1, 1, 0, 0, 0, 116, 41, 112, 41, 112, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 84, 29, 80, 29, 80, 29, 29, 0, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0, 0, 53, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 11, 50, 50, 11, 50, 50, 50, 11, 50, 50, 50, 11, 50, 50, 50, 11, 50, 50, 50, 0, 0, 11, 50, 50, 50, 11, 50, 50, 50, 11, 50, 50, 50, 11, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static const int svg_path_start = 1; static const int svg_path_first_final = 270; static const int svg_path_en_main = 1; #line 144 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" void Parser::parse(char const *str) throw(SVGPathParseError) { char const *p = str; char const *start = NULL; int cs; _reset(); #line 1162 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp" { cs = svg_path_start; } #line 1167 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp" { int _klen; unsigned int _trans; const char *_acts; unsigned int _nacts; const char *_keys; if ( cs == 0 ) goto _out; _resume: _keys = _svg_path_trans_keys + _svg_path_key_offsets[cs]; _trans = _svg_path_index_offsets[cs]; _klen = _svg_path_single_lengths[cs]; if ( _klen > 0 ) { const char *_lower = _keys; const char *_mid; const char *_upper = _keys + _klen - 1; while (1) { if ( _upper < _lower ) break; _mid = _lower + ((_upper-_lower) >> 1); if ( (*p) < *_mid ) _upper = _mid - 1; else if ( (*p) > *_mid ) _lower = _mid + 1; else { _trans += (_mid - _keys); goto _match; } } _keys += _klen; _trans += _klen; } _klen = _svg_path_range_lengths[cs]; if ( _klen > 0 ) { const char *_lower = _keys; const char *_mid; const char *_upper = _keys + (_klen<<1) - 2; while (1) { if ( _upper < _lower ) break; _mid = _lower + (((_upper-_lower) >> 1) & ~1); if ( (*p) < _mid[0] ) _upper = _mid - 2; else if ( (*p) > _mid[1] ) _lower = _mid + 2; else { _trans += ((_mid - _keys)>>1); goto _match; } } _trans += _klen; } _match: _trans = _svg_path_indicies[_trans]; cs = _svg_path_trans_targs_wi[_trans]; if ( _svg_path_trans_actions_wi[_trans] == 0 ) goto _again; _acts = _svg_path_actions + _svg_path_trans_actions_wi[_trans]; _nacts = (unsigned int) *_acts++; while ( _nacts-- > 0 ) { switch ( *_acts++ ) { case 0: #line 156 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { start = p; } break; case 1: #line 160 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { char const *end=p; std::string buf(start, end); _push(g_ascii_strtod(buf.c_str(), NULL)); start = NULL; } break; case 2: #line 167 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _push(1.0); } break; case 3: #line 171 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _push(0.0); } break; case 4: #line 175 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _absolute = true; } break; case 5: #line 179 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _absolute = false; } break; case 6: #line 183 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _moveTo(_pop_point()); } break; case 7: #line 187 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _lineTo(_pop_point()); } break; case 8: #line 191 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _hlineTo(Point(_pop_coord(X), _current[Y])); } break; case 9: #line 195 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _vlineTo(Point(_current[X], _pop_coord(Y))); } break; case 10: #line 199 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); Point c1 = _pop_point(); Point c0 = _pop_point(); _curveTo(c0, c1, p); } break; case 11: #line 206 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); Point c1 = _pop_point(); _curveTo(_cubic_tangent, c1, p); } break; case 12: #line 212 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); Point c = _pop_point(); _quadTo(c, p); } break; case 13: #line 218 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); _quadTo(_quad_tangent, p); } break; case 14: #line 223 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { Point point = _pop_point(); bool sweep = _pop_flag(); bool large_arc = _pop_flag(); double angle = deg_to_rad(_pop()); double ry = _pop(); double rx = _pop(); _arcTo(rx, ry, angle, large_arc, sweep, point); } break; case 15: #line 234 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" { _closePath(); } break; case 16: #line 370 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" {goto _out;} break; #line 1357 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.cpp" } } _again: if ( cs == 0 ) goto _out; p += 1; goto _resume; _out: {} } #line 380 "/home/njh/svn/lib2geom/src/2geom/svg-path-parser.rl" if ( cs < svg_path_first_final ) { throw SVGPathParseError(); } } } void parse_svg_path(char const *str, SVGPathSink &sink) throw(SVGPathParseError) { Parser parser(sink); parser.parse(str); sink.finish(); } } /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :