diff options
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.tex | 829 |
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}}% |