summaryrefslogtreecommitdiff
path: root/graphics/pgf/base/tex/generic/libraries/pgflibrarysvg.path.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/base/tex/generic/libraries/pgflibrarysvg.path.code.tex')
-rw-r--r--graphics/pgf/base/tex/generic/libraries/pgflibrarysvg.path.code.tex829
1 files changed, 829 insertions, 0 deletions
diff --git a/graphics/pgf/base/tex/generic/libraries/pgflibrarysvg.path.code.tex b/graphics/pgf/base/tex/generic/libraries/pgflibrarysvg.path.code.tex
new file mode 100644
index 0000000000..e802ca778e
--- /dev/null
+++ b/graphics/pgf/base/tex/generic/libraries/pgflibrarysvg.path.code.tex
@@ -0,0 +1,829 @@
+% Copyright 2019 by Till Tantau
+% Copyright 2019 by Jonathan P. Spratte
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Public License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\ProvidesFileRCS{pgflibrarysvg.path.code.tex}
+
+
+\usepgfmodule{parser}%
+
+
+% Scan an SVG-Path
+%
+% #1 = the path
+%
+% Description:
+%
+% This command takes a path in the compressed SVG-syntax. It then
+% issues a sequences of appropriate \pgfpath commands for this
+% path. For a description of the compressed svg path syntax, see a
+% book on svg.
+%
+% The notion of a pixel used by svg makes no sense in pgf (actually
+% it does not really make sense in svg either, but never mind), and
+% instead of pixels "pt" is used as the basic unit. Use coordinate
+% transformation to change this.
+%
+% Example:
+%
+% \pgfpathsvg{M10 20 L 30-20 0 1}
+%
+% % this has the same effect as
+%
+% \pgfpathmoveto{\pgfpoint{10pt}{20pt}}
+% \pgfpathlineto{\pgfpint{30pt}{-20pt}}
+% \pgfpathlineto{\pgfpint{0pt}{1pt}}
+%
+
+\def\pgfpathsvg#1{%
+ \let\pgf@lib@svg@finish@prev\relax%
+ {%
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@path@lastx}{\pgf@path@lasty}}}%
+ }%
+ \pgf@lib@svg@last@x\pgf@x%
+ \pgf@lib@svg@last@y\pgf@y%
+ \let\pgf@lib@svg@num=\pgfutil@empty%
+ \let\pgf@lib@svg@exp=\pgfutil@empty%
+ \pgfparserparse{svgpath}#1"%
+}%
+
+
+
+\newdimen\pgf@lib@svg@last@x
+\newdimen\pgf@lib@svg@last@y
+\newdimen\pgf@lib@svg@last@c@x
+\newdimen\pgf@lib@svg@last@c@y
+
+\newcount\pgf@lib@svg@count
+\newcount\pgf@lib@svg@max@num
+
+\newif\pgf@lib@svg@relative
+
+
+
+% For the smooth commands (S, s, T, t) we need to keep track of the
+% previous control points. This is done in the following two
+% variables. If they are empty, there was no previous control point of
+% the desired kind, in which case the specification prescribes that
+% the start point is used.
+
+\def\pgf@lib@svg@clear@bezier@quad{%
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty
+}%
+\pgf@lib@svg@clear@bezier@quad
+
+%
+% Here comes the DFA:
+%
+
+% Handle a moveto:
+
+\pgfparserdef{svgpath}{all}{the letter M}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@moveto}%
+}%
+
+\def\pgf@lib@svg@moveto{%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt%
+ \pgfpathmoveto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}%
+}%
+
+
+% Handle a relative moveto:
+
+\pgfparserdef{svgpath}{all}{the letter m}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@moveto@rel}%
+}%
+
+\def\pgf@lib@svg@moveto@rel{%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt%
+ \pgfpathmoveto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}%
+}%
+
+
+% Handle a lineto:
+
+\pgfparserdef{svgpath}{all}{the letter L}
+{%
+ \pgf@lib@svg@finish@prev%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}%
+}%
+
+\def\pgf@lib@svg@lineto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}%
+ \fi
+}%
+
+
+% Handle a relative lineto:
+
+\pgfparserdef{svgpath}{all}{the letter l}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}%
+}%
+
+\def\pgf@lib@svg@lineto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}%
+ \fi
+}%
+
+
+% Handle a closepath:
+
+\pgfparserdef{svgpath}{all}{the letter Z}
+{%
+ \pgf@lib@svg@closepath
+}%
+
+\pgfparserdef{svgpath}{all}{the letter z}
+{%
+ \pgf@lib@svg@closepath
+}%
+
+\def\pgf@lib@svg@closepath{%
+ \pgf@lib@svg@finish@prev
+ \pgfpathclose
+ \let\pgf@lib@svg@finish@prev=\relax
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgfparserswitch{initial}%
+}%
+
+
+% Ignore spaces if no other rules says differently:
+
+\pgfparserdef{svgpath}{all}{blank space \space}{}%
+
+
+
+
+% Handle a horizontal lineto:
+
+\pgfparserdef{svgpath}{all}{the letter H}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto}%
+}%
+
+\def\pgf@lib@svg@hlineto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto}%
+ \fi
+}%
+
+\pgfparserdef{svgpath}{all}{the letter h}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto@rel}%
+}%
+
+\def\pgf@lib@svg@hlineto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto@rel}%
+ \fi
+}%
+
+
+% Handle a horizontal lineto:
+
+\pgfparserdef{svgpath}{all}{the letter V}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto}%
+}%
+
+\def\pgf@lib@svg@vlineto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto}%
+ \fi
+}%
+
+\pgfparserdef{svgpath}{all}{the letter v}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto@rel}%
+}%
+
+\def\pgf@lib@svg@vlineto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto@rel}%
+ \fi
+}%
+
+
+
+
+% Handle a Bezier curve:
+
+\pgfparserdef{svgpath}{all}{the letter C}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto}%
+}%
+
+\def\pgf@lib@svg@curveto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \edef\pgf@lib@svg@bezier@last{%
+ \noexpand\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}%
+ % Draw curve
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{4}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{5}pt%
+ \pgfpathcurveto
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter c}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto@rel}%
+}%
+
+\def\pgf@lib@svg@curveto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ \edef\pgf@lib@svg@bezier@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % Draw curve
+ \pgfpathcurveto
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{4}pt}{\pgf@lib@svg@get@num{5}pt}}}%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{4}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{5}pt%
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto@rel}%
+ \fi
+}%
+
+
+
+
+
+\pgfparserdef{svgpath}{all}{the letter S}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@smooth}%
+}%
+
+\def\pgf@lib@svg@curveto@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \ifx\pgf@lib@svg@bezier@last\pgfutil@empty%
+ \def\pgf@lib@svg@first@cp{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \else
+ \def\pgf@lib@svg@first@cp{%
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@bezier@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ }%
+ \fi
+ \pgfpathcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \edef\pgf@lib@svg@bezier@last{%
+ \noexpand\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ % Update
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{2}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{3}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@smooth}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter s}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@rel@smooth}%
+}%
+
+\def\pgf@lib@svg@curveto@rel@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \ifx\pgf@lib@svg@bezier@last\pgfutil@empty%
+ \def\pgf@lib@svg@first@cp{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \else
+ \def\pgf@lib@svg@first@cp{%
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@bezier@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ }%
+ \fi
+ \pgfpathcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ \edef\pgf@lib@svg@bezier@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % update
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{2}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{3}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@rel@smooth}%
+ \fi
+}%
+
+
+
+
+% Handle a quadratic curve:
+
+\pgfparserdef{svgpath}{all}{the letter Q}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto}%
+}%
+
+\def\pgf@lib@svg@quad@curveto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear bezier last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \edef\pgf@lib@svg@quad@last{%
+ \noexpand\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ % Draw curve
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{2}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{3}pt%
+ \pgfpathquadraticcurveto
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter q}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto@rel}%
+}%
+
+\def\pgf@lib@svg@quad@curveto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ \edef\pgf@lib@svg@quad@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % Draw curve
+ \pgfpathquadraticcurveto
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{2}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{3}pt%
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto@rel}%
+ \fi
+}%
+
+
+
+
+\pgfparserdef{svgpath}{all}{the letter T}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@smooth}%
+}%
+
+\def\pgf@lib@svg@quad@curveto@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \pgf@process{%
+ \ifx\pgf@lib@svg@quad@last\pgfutil@empty%
+ \pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}%
+ \else
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@quad@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ \fi
+ }%
+ \edef\pgf@lib@svg@first@cp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfpathquadraticcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \let\pgf@lib@svg@quad@last=\pgf@lib@svg@first@cp%
+ % Update
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@smooth}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter t}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@rel@smooth}%
+}%
+
+\def\pgf@lib@svg@quad@curveto@rel@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \pgf@process{%
+ \ifx\pgf@lib@svg@quad@last\pgfutil@empty%
+ \pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}%
+ \else
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@quad@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ \fi
+ }%
+ \edef\pgf@lib@svg@first@cp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfpathquadraticcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \let\pgf@lib@svg@quad@last=\pgf@lib@svg@first@cp%
+ % update
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@rel@smooth}%
+ \fi
+}%
+
+
+
+% Handle an arcto:
+
+\pgfparserdef{svgpath}{all}{the letter A}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto}%
+}%
+
+\def\pgf@lib@svg@arcto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear bezier last point and save new last control point:
+ \pgf@lib@svg@clear@bezier@quad%
+ % Draw curve
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{5}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{6}pt%
+ \pgfpatharcto
+ {\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}%
+ {\pgf@lib@svg@get@num{2}}%
+ {\pgf@lib@svg@get@num{3}}%
+ {\pgf@lib@svg@get@num{4}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto}%
+ \fi
+}%
+
+\pgfparserdef{svgpath}{all}{the letter a}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto@rel}%
+}%
+
+\def\pgf@lib@svg@arcto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear bezier last point and save new last control point:
+ \pgf@lib@svg@clear@bezier@quad%
+ % Draw curve
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{5}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{6}pt%
+ \pgfpatharcto
+ {\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}%
+ {\pgf@lib@svg@get@num{2}}%
+ {\pgf@lib@svg@get@num{3}}%
+ {\pgf@lib@svg@get@num{4}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto@rel}%
+ \fi
+}%
+
+
+
+
+
+% Handle to end of the world
+
+\pgfparserdef{svgpath}{all}{the character "}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgfparserswitch{final}%
+}%
+
+
+
+
+% Handle spacers for numbers
+
+\def\pgf@lib@svg@read@nums#1#2{% get #1 number symbols, then do #2
+ \pgf@lib@svg@count=0\relax
+ \pgf@lib@svg@max@num=#1\relax
+ \pgfparserswitch{num}%
+ \def\pgf@lib@svg@finish@prev{%
+ \ifx\pgf@lib@svg@num\pgfutil@empty%
+ \else%
+ \ifx\pgf@lib@svg@exp\pgfutil@empty
+ \else
+ \pgfmathfloatparsenumber{\pgf@lib@svg@num e\pgf@lib@svg@exp}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \let\pgf@lib@svg@num=\pgfmathresult
+ \fi
+ \expandafter\let\csname pgf@lib@svg@num@\the\pgf@lib@svg@count\endcsname=\pgf@lib@svg@num
+ \advance\pgf@lib@svg@count by1\relax%
+ \let\pgf@lib@svg@num=\pgfutil@empty%
+ \let\pgf@lib@svg@exp=\pgfutil@empty%
+ \fi
+ #2%
+ }%
+}%
+
+\def\pgf@lib@svg@get@num#1{\csname pgf@lib@svg@num@#1\endcsname}%
+
+
+\pgfparserdef{svgpath}{num}{the character ,}
+{%
+ \pgf@lib@svg@handle@spacer
+}%
+\pgfparserlet{svgpath}{after.}{the character ,}[num]{the character ,}
+\pgfparserlet{svgpath}{exp},[num],
+\pgfparserlet{svgpath}{exp sign},[num],
+
+\pgfparserdef{svgpath}{num}{\meaning\pgfutil@sptoken}
+{%
+ \pgf@lib@svg@handle@spacer
+}%
+\pgfparserlet{svgpath}{after.}{blank space}[num]{blank space}
+\pgfparserlet{svgpath}{exp}{blank space},
+\pgfparserlet{svgpath}{exp sign}{blank space},
+
+\pgfparserdef{svgpath}{num}{the character -}
+{%
+ \pgf@lib@svg@handle@spacer
+ \def\pgf@lib@svg@num{-}%
+}%
+\pgfparserlet{svgpath}{after.}{the character -}[num]{the character -}
+\pgfparserlet{svgpath}{exp}-[num]-
+\pgfparserdef{svgpath}{num}{the character +}
+{%
+ \pgf@lib@svg@handle@spacer
+ \def\pgf@lib@svg@num{+}%
+}
+\pgfparserlet{svgpath}{after.}{the character +}[num]{the character +}
+\pgfparserlet{svgpath}{exp}+[num]+
+
+\def\pgf@lib@svg@handle@spacer{%
+ \ifx\pgf@lib@svg@num\pgfutil@empty%
+ % ignore
+ \else
+ \ifx\pgf@lib@svg@exp\pgfutil@empty
+ \else
+ \pgfmathfloatparsenumber{\pgf@lib@svg@num e\pgf@lib@svg@exp}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \let\pgf@lib@svg@num=\pgfmathresult
+ \fi
+ \expandafter\let\csname pgf@lib@svg@num@\the\pgf@lib@svg@count\endcsname=\pgf@lib@svg@num
+ \advance\pgf@lib@svg@count by1\relax%
+ \ifnum\pgf@lib@svg@count=\pgf@lib@svg@max@num\relax%
+ \pgf@lib@svg@finish@prev%
+ \fi
+ \let\pgf@lib@svg@num=\pgfutil@empty%
+ \let\pgf@lib@svg@exp=\pgfutil@empty%
+ \pgfparserswitch{num}%
+ \fi
+}%
+
+
+% Handle digits
+
+\pgfparserdef{svgpath}{num}e
+ {%
+ \pgfparserswitch{exp sign}%
+ \let\pgf@lib@svg@exp=\pgfutil@empty
+ }
+\pgfparserlet{svgpath}{after.}e[num]e
+\pgfparserdef{svgpath}{exp sign}-
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp-}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}+
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp+}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}0
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp0}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}1
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp1}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}2
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp2}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}3
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp3}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}4
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp4}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}5
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp5}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}6
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp6}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}7
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp7}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}8
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp8}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}9
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp9}%
+ \pgfparserswitch{exp}%
+ }
+
+\pgfparserdef{svgpath}{exp}0
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp0}%
+ }
+\pgfparserdef{svgpath}{exp}1
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp1}%
+ }
+\pgfparserdef{svgpath}{exp}2
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp2}%
+ }
+\pgfparserdef{svgpath}{exp}3
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp3}%
+ }
+\pgfparserdef{svgpath}{exp}4
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp4}%
+ }
+\pgfparserdef{svgpath}{exp}5
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp5}%
+ }
+\pgfparserdef{svgpath}{exp}6
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp6}%
+ }
+\pgfparserdef{svgpath}{exp}7
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp7}%
+ }
+\pgfparserdef{svgpath}{exp}8
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp8}%
+ }
+\pgfparserdef{svgpath}{exp}9
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp9}%
+ }
+
+\pgfparserdef{svgpath}{num}{the character .}
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num.}%
+ \pgfparserswitch{after.}%
+ }%
+\pgfparserdef{svgpath}{after.}{the character .}
+ {%
+ \pgf@lib@svg@handle@spacer
+ \def\pgf@lib@svg@num{.}%
+ \pgfparserswitch{after.}%
+ }%
+\pgfparserlet{svgpath}{exp}{the character .}[after.]{the character .}
+
+\pgfparserdef{svgpath}{all}{the character 0}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num0}}%
+
+\pgfparserdef{svgpath}{all}{the character 1}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num1}}%
+
+\pgfparserdef{svgpath}{all}{the character 2}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num2}}%
+
+\pgfparserdef{svgpath}{all}{the character 3}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num3}}%
+
+\pgfparserdef{svgpath}{all}{the character 4}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num4}}%
+
+\pgfparserdef{svgpath}{all}{the character 5}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num5}}%
+
+\pgfparserdef{svgpath}{all}{the character 6}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num6}}%
+
+\pgfparserdef{svgpath}{all}{the character 7}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num7}}%
+
+\pgfparserdef{svgpath}{all}{the character 8}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num8}}%
+
+\pgfparserdef{svgpath}{all}{the character 9}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num9}}%