Current File : //usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysanimations.code.tex |
% Copyright 2019 by Till Tantau
%
% 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.
% Guard against reading twice
\ifx\pgfsysanimationsloaded\pgfutil@undefined
\let\pgfsysanimationsloaded=\relax
\else
\expandafter\endinput
\fi
% We need some support:
\usepgfmodule{decorations}
% Animation abstraction layer
%
% This layer provides an abstraction of the
% \pgfsys@anim... commands. The idea is to provide an interface that
% can map animation commands either to "real" animations (for instance
% in the sense of SVG) or to "snapshots" of animations, which are
% especially useful for printing. For these snapshots, instead of
% adding an animation property to a scope, the property is actually
% set to a certain value computed by \TeX.
%
% For each \pgfsys@animation@... command there is a corresponding
% \pgfsysanim command.
% Set the current time to a snapshot time
%
% #1 = a global snapshot time (a dimensionless number, measured in
% seconds).
%
% Description:
%
% When this command is used in a scope, instead of creating an
% animation, pgf will insert appropriate commands that show the state
% of the animation at the given time.
%
% The value #1 can be thought of as the "global time", which can be
% thought of as the time that elapsed since the "onload" event.
%
% The command \pgfsysanimsnapshotafter works the same way as
% pgfsysanimsnapshot, only the time #1 is interpreted as "global time
% #1 + epsilon". This means that when two or more values are specified
% for time #1, the last of them is used rather than the
% first. Likewise, when a non-freezing timeline ends at time #1,
% \pgfsysanimsnapshot will set the value to the last value in the
% timeline, while \pgfsysanimsnapshotafter removes the animation.
%
% The following commands and effect for animations are ignored / not
% implemented for snapshots (meaning that even if the "real" animation
% would look in a certain way because of one of the following commands
% or effects, the snapshot will not reflect this):
%
% - Events and restarts are ignored. For the snapshot, all animations
% start at global time 0, except if the command
% \pgfsysanimkeysnapshotstart is used to specify a different
% start for a specific animation.
% - The "current value" as starting value (pgf has no real chance of
% determining the correct value of this). Using this with a snapshot
% will raise an error.
%
% Example:
%
% {
% \pgfsyssnapshot{2}%
% \pgfsysanimkeytime{0}{1}{1}{0}{0}
% \pgfsysanimvalscalar{1}
% \pgfsysanimkeytime{5}{1}{1}{0}{0}
% \pgfsysanimvalscalar{0}
% \pgfsysanimkeywhom{\someid}{}
% \pgfsysanimate{fillopacity}%
% % Will set the opacity of \someid to 0.6
% }
\def\pgfsysanimsnapshot#1{%
\def\pgfsysanim@snaptime{#1}%
\pgfsysanim@snap@firsttrue%
\pgfsysanim@is@snaptrue%
}
\def\pgfsysanimsnapshotafter#1{%
\def\pgfsysanim@snaptime{#1}%
\pgfsysanim@snap@firstfalse%
\pgfsysanim@is@snaptrue%
}
\newif\ifpgfsysanim@is@snap
\newif\ifpgfsysanim@snap@first
% Companion for \pgfsys@animate
%
% #1 = attribute
%
% Description:
%
% If not snapshot is set, \pgfsys@animate is simply called. Otherwise,
% appropriate code is generated that sets the specified attribute of
% the whom object to the value it would have during the animation at
% the moment of the snapshot.
\def\pgfsysanimate#1{%
\csname pgfsysanim@checks@#1\endcsname%
\ifpgfsysanim@is@snap%
\pgfsysanim@do@snap{#1}%
\else%
\pgfsys@animate{#1}%
\fi%
}
\def\pgfsysanim@do@snap#1{%
{%
\expandafter\ifx\csname pgfsysanim@prep@attr@#1\endcsname\pgfutil@undefined%
\else%
% First, compute time frame:
\pgfsysanim@compute@interval%
% Second, compute code:
\let\pgfsysanim@code@begin\relax%
\let\pgfsysanim@code@end\pgfutil@empty%
\csname pgfsysanim@prep@attr@#1\endcsname%
\ifx\pgfsysanim@code@begin\relax%
\else%
% Attach to object:
\expandafter\expandafter\expandafter\pgfsysanim@call@attacher%
\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@code@begin\expandafter}\expandafter{\pgfsysanim@code@end}{}%
\fi%
\fi%
}%
}
\def\pgfsysanim@call@attacher{\pgfsys@attach@to@id{\pgfsysanim@whom@id}{\pgfsysanim@whom@type}}
% Do some checks:
\def\pgfsysanim@checks@path{%
\expandafter\global\expandafter\let\csname pgfsysanim@path@is@animated@\pgfsysanim@whom@id @\pgfsysanim@whom@type\endcsname\pgfutil@empty%
}
% Companions for \pgfsys@animation@restart@...
%
% Description:
%
% These commands just call \pgfsys@animation@restart@... and they are
% *ignored* when it comes to snapshots.
\def\pgfsysanimkeyrestartalways{\pgfsys@animation@restart@always}
\def\pgfsysanimkeyrestartnever{\pgfsys@animation@restart@never}
\def\pgfsysanimkeyrestartwhennotactive{\pgfsys@animation@restart@whennotactive}
% Companions for \pgfsys@animation@repeat...
%
% Description:
%
% These commands call \pgfsys@animation@repeat... and, if there is a
% snapshot installed, the passed values are taken into consideration.
\def\pgfsysanimkeyrepeat#1{%
\pgfsys@animation@repeat{#1}%
% Snapshot
\let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@normal%
{%
\pgf@x#1pt\relax%
\expandafter}%
\expandafter\def\expandafter\pgfsysanim@snap@repeat@arg\expandafter{\the\pgf@x}%
}
\def\pgfsysanimkeyrepeatindefinite{%
\pgfsys@animation@repeat@indefinite%
% Snapshot
\let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@indefinite%
\let\pgfsysanim@snap@repeat@arg\pgfutil@empty%
}
\def\pgfsysanimkeyrepeatdur#1{%
\pgfsys@animation@repeat@dur{#1}%
% Snapshot
\let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@dur%
{%
\pgf@x#1pt\relax%
\expandafter}%
\expandafter\def\expandafter\pgfsysanim@snap@repeat@arg\expandafter{\the\pgf@x}%
}
\def\pgfsysanim@snap@repeat@none{n}%
\def\pgfsysanim@snap@repeat@normal{m}%
\def\pgfsysanim@snap@repeat@indefinite{i}%
\def\pgfsysanim@snap@repeat@dur{d}%
\let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@none
\let\pgfsysanim@snap@repeat@arg\pgfutil@empty
% Companions for \pgfsys@animation@freezeatend and
% \pgfsys@animation@removeatend
%
% Description:
%
% These commands call the two system commands and, if there is a
% snapshot installed, the settings are taken into consideration.
\def\pgfsysanimkeyfreezeatend{\pgfsys@animation@freezeatend\pgfsysanim@freezeatendtrue}
\def\pgfsysanimkeyremoveatend{\pgfsys@animation@removeatend\pgfsysanim@freezeatendfalse}
\newif\ifpgfsysanim@freezeatend
% Companion for \pgfsys@animation@time
%
% #1 to #5 = as in \pgfsys@animation@time
%
% Description:
%
% Calls \pgfsys@animation@time. Furthermore, the specified times are
% recorded so that they can later be analysed for the computation
% needed for a snapshot.
\def\pgfsysanimkeytime#1#2#3#4#5{%
% Setup animation
\pgfsys@animation@time{#1}{#2}{#3}{#4}{#5}%
% and remember for snapshots
\def\pgfsysanim@time{{#1}{#2}{#3}{#4}{#5}}%
}
% Sets the base value
%
% Description:
%
% This will set the "base" value for an animation, which is installed
% prior to any animation of the attribute.
\def\pgfsysanimkeybase{%
\pgfsys@animation@base%
\let\pgfsysanim@time\pgfsysanim@base@text%
}
\def\pgfsysanim@base@text{base}%
% Sets the beginning of the timeline for snapshots
%
% #1 = a time (a scalar)
%
% Description:
%
% Sets the start of current animation to #1 for snapshots. For
% instance, if #1 is 5 (=five seconds), and you say
% \pgfsysanimsnapshot{6}, the attribute will be set to whatever the
% animation specifies after one second.
\def\pgfsysanimkeysnapshotstart#1{%
\def\pgfsysanim@snapshotstart{#1}%
}
\def\pgfsysanim@snapshotstart{0}
% Companion for \pgfsys@animation@offset
%
% #1, #2 = as in \pgfsys@animation@offset
%
% Description:
%
% Calls \pgfsys@animation@offset.
\def\pgfsysanimkeyoffset#1#2{%
\pgfsys@animation@offset{#1}{#2}%
}
% Companion for \pgfsys@animation@sync(begin|end)
%
% #1 to #4 = as in \pgfsys@animation@sync(begin|end)
%
% Description:
%
% Calls \pgfsys@animation@sync(begin|end).
\def\pgfsysanimkeysyncbegin#1#2#3#4{%
\pgfsys@animation@syncbegin{#1}{#2}{#3}{#4}%
}
\def\pgfsysanimkeysyncend#1#2#3#4{%
\pgfsys@animation@syncend{#1}{#2}{#3}{#4}%
}
% Companion for \pgfsys@animation@event
%
% #1 to #5 = as in \pgfsys@animation@event
%
% Description:
%
% Calls \pgfsys@animation@event.
\def\pgfsysanimkeyevent#1#2#3#4#5{%
\pgfsys@animation@event{#1}{#2}{#3}{#4}{#5}%
}
% Companion for \pgfsys@animation@repeat@event
%
% #1 to #5 = as in \pgfsys@animation@repeat@event
%
% Description:
%
% Calls \pgfsys@animation@repeat@event.
\def\pgfsysanimkeyrepeatevent#1#2#3#4#5{%
\pgfsys@animation@repeat@event{#1}{#2}{#3}{#4}{#5}%
}
% Companion for \pgfsys@animation@accesskey
%
% #1 to #3 = as in \pgfsys@animation@accesskey
%
% Description:
%
% Calls \pgfsys@animation@accesskey.
\def\pgfsysanimkeyaccesskey#1#2#3{%
\pgfsys@animation@accesskey{#1}{#2}{#3}%
}
% Companions for \pgfsys@animation@(no)accumulate
%
% Description:
%
% Calls \pgfsys@animaion@(no)accumulate and records the setting for
% snapshots.
\def\pgfsysanimkeyaccumulate{\pgfsys@animation@accumulate\pgfsysanim@accumulatetrue}
\def\pgfsysanimkeynoaccumulate{\pgfsys@animation@noaccumulate\pgfsysanim@accumulatefalse}
\newif\ifpgfsysanim@accumulate
% Companion for \pgfsys@animation@whom
%
% #1 and #2 = as for \pgfsys@animation@whom
%
% Description:
%
% Calls \pgfsys@animation@whom and records the setting for snapshots.
\def\pgfsysanimkeywhom#1#2{%
\pgfsys@register@type{#2}%
\pgfsys@animation@whom{#1}{#2}%
% Snapshots
\def\pgfsysanim@whom@id{#1}%
\def\pgfsysanim@whom@type{#2}%
}
% Companions for \pgfsys@animation@rotatealong and
% \pgfsys@animation@norotatealong
%
% Description:
%
% Calls the system layer command and records the setting for
% snapshots.
\def\pgfsysanimkeyrotatealong{\pgfsys@animation@rotatealong\pgfsysanim@rotatealongtrue}
\def\pgfsysanimkeynorotatealong{\pgfsys@animation@norotatealong\pgfsysanim@rotatealongfalse}
\newif\ifpgfsysanim@rotatealong
% Companion for \pgfsys@animation@movealong
%
% #1 = the path
%
% Description:
%
% Calls the system layer command and records the setting for
% snapshots.
\def\pgfsysanimkeymovealong#1{%
\pgfsys@animation@movealong{#1}%
% Snapshot
\def\pgfsysanim@snap@movealong{#1}%
}
% Companion for \pgfsys@animation@tip@markers
%
% #1, #2 = the markers
%
% Description:
%
% Calls the system layer command and records the setting for
% snapshots.
\def\pgfsysanimkeytipmarkers#1#2{%
\pgfsys@animation@tip@markers{#1}{#2}%
% Snapshot
\def\pgfsysanim@snap@tip@start{#1}%
\def\pgfsysanim@snap@tip@end{#2}%
}
\let\pgfsysanim@snap@tip@start\pgfutil@empty%
\let\pgfsysanim@snap@tip@end\pgfutil@empty%
% Companion for \pgfsys@animation@canvas@transform
%
% Description:
%
% Calls the system layer command and records the setting for
% snapshots.
\def\pgfsysanimkeycanvastransform#1#2{%
\pgfsys@animation@canvas@transform{#1}{#2}%
% Snapshot
\def\pgfsysanim@snap@canvas@transform@pre{#1}%
\def\pgfsysanim@snap@canvas@transform@post{#2}%
}
\let\pgfsysanim@snap@canvas@transform@pre\relax
\let\pgfsysanim@snap@canvas@transform@post\relax
% Companion for \pgfsys@animation@val@current
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% an error results.
\def\pgfsysanimvalcurrent{%
\pgfsys@animation@val@current%
\ifpgfsysanim@is@snap%
\pgferror{You may not use "current value" with an animation snapshot}%
\fi%
}
% Suppresses the animation value
%
% Description:
%
% The animation value is simply ignored.
\def\pgfsysanimvalnone{%
}
% Companion for \pgfsys@animation@val@text
%
% #1 = as for \pgfsys@animation@val@text
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvaltext#1{%
\pgfsys@animation@val@text{#1}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{#1}%
\fi%
}
% Companion for \pgfsys@animation@val@scalar
%
% #1 = as for \pgfsys@animation@val@scalar
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalscalar#1{%
\pgfsys@animation@val@scalar{#1}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{#1}%
\fi%
}
% Companion for \pgfsys@animation@val@dimension
%
% #1 = as for \pgfsys@animation@val@dimension
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvaldimension#1{%
\pgfsys@animation@val@dimension{#1}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{#1}%
\fi%
}
% Dispatcher for different color values
%
% #1 = a color value (like "red" or "black!20")
%
% Description:
%
% This macro transforms #1 into its correct color model and, then,
% calls the correct \pgfsysanimcolor... macro.
\def\pgfsysanimvalcolor#1{%
\pgfutil@colorlet{pgf@anim@temp}{#1}%
\pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@anim@temp}}%
\expandafter\let\expandafter\pgf@sys@temp\csname\string\color@pgf@anim@temp\endcsname
\expandafter\pgfanim@parse@type@color@\pgf@sys@temp%
}
\def\pgfanim@parse@type@color@#1#2#3#4#5{%
\expandafter\ifx\csname pgfsysanimvalcolor#4\endcsname\relax%
\pgferror{Unsupported color model `#4'}%
\else%
\edef\pgf@sys@colmarshal{\expandafter\noexpand\csname pgfsysanimvalcolor#4\endcsname}%
\pgf@sys@uncomma#5,,%
\pgf@sys@colmarshal%
\fi%
}
\def\pgf@sys@uncomma#1,{%
\def\pgf@sys@coltest{#1}%
\ifx\pgf@sys@coltest\pgfutil@empty%
\else%
\expandafter\def\expandafter\pgf@sys@colmarshal\expandafter{\pgf@sys@colmarshal{#1}}%
\expandafter\pgf@sys@uncomma%
\fi%
}
% Companion for \pgfsys@animation@val@color@rgb
%
% #1, #2, #3 = as for \pgfsys@animation@val@color@rgb
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalcolorrgb#1#2#3{%
\pgfsys@animation@val@color@rgb{#1}{#2}{#3}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{{#1}{#2}{#3}}%
\fi%
}
% Companion for \pgfsys@animation@val@color@cmyk
%
% #1, #2, #3, #4 = as for \pgfsys@animation@val@color@cmyk
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalcolorcmyk#1#2#3#4{%
\pgfsys@animation@val@color@cmyk{#1}{#2}{#3}{#4}%
\ifpgfsysanim@is@snap%
{%
\pgf@xa=1pt%
\advance\pgf@xa by-#1pt%
\advance\pgf@xa by-#4pt\relax%
\ifdim\pgf@xa<0pt\pgf@xa0pt\fi%
\pgf@xb=1pt%
\advance\pgf@xb by-#1pt%
\advance\pgf@xb by-#4pt\relax%
\ifdim\pgf@xb<0pt\pgf@xb0pt\fi%
\pgf@xc=1pt%
\advance\pgf@xc by-#1pt%
\advance\pgf@xc by-#4pt\relax%
\ifdim\pgf@xc<0pt\pgf@xc0pt\fi%
\edef\pgfsys@temp{{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xc}}%
\expandafter}%
\expandafter\pgfsysanim@esnap@record\expandafter{\pgfsys@temp}%
\fi%
}
% Companion for \pgfsys@animation@val@color@cmy
%
% #1, #2, #3 = as for \pgfsys@animation@val@color@cmy
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalcolorcmy#1#2#3{%
\pgfsys@animation@val@color@cmy{#1}{#2}{#3}%
\ifpgfsysanim@is@snap%
{%
\pgf@xa=1pt%
\advance\pgf@xa by-#1pt%
\pgf@xb=1pt%
\advance\pgf@xb by-#1pt%
\pgf@xc=1pt%
\advance\pgf@xc by-#1pt%
\edef\pgfsys@temp{{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xc}}%
\expandafter}%
\expandafter\pgfsysanim@esnap@record\expandafter{\pgfsys@temp}%
\fi%
}
% Companion for \pgfsys@animation@val@color@gray
%
% #1 = as for \pgfsys@animation@val@color@gray
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalcolorgray#1{%
\pgfsys@animation@val@color@gray{#1}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{{#1}{#1}{#1}}%
\fi%
}
% Special companion for \pgfsys@animation@val@path
%
% #1 = as for \pgfsys@animation@val@path
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalpath#1{%
\pgfsys@animation@val@path{#1}%
\ifpgfsysanim@is@snap%
\pgfsysanim@snap@record{#1}%
\fi%
}
% Companion for \pgfsys@animation@val@translate
%
% #1, #2 = as for \pgfsys@animation@val@translate
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvaltranslate#1#2{%
\pgfsys@animation@val@translate{#1}{#2}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{{#1}{#2}}%
\fi%
}
% Companion for \pgfsys@animation@val@scale
%
% #1, #2 = as for \pgfsys@animation@val@scale
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalscale#1#2{%
\pgfsys@animation@val@scale{#1}{#2}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{{#1}{#2}}%
\fi%
}
% Companion for \pgfsys@animation@val@viewbox
%
% #1, #2, #3, #4 = as for \pgfsys@animation@val@viewbox
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvalviewbox#1#2#3#4{%
\pgfsys@animation@val@viewbox{#1}{#2}{#3}{#4}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{{#1}{#2}{#3}{#4}}%
\fi%
}
% Companion for \pgfsys@animation@val@dash
%
% #1, #2 = as for \pgfsys@animation@val@dash
%
% Description:
%
% Calls the system layer command. If a snapshot is currently active,
% the value is recorded in the timeline.
\def\pgfsysanimvaldash#1#2{%
\pgfsys@animation@val@dash{#1}{#2}%
\ifpgfsysanim@is@snap%
\pgfsysanim@esnap@record{{#1}{#2}}%
\fi%
}
%
% Recording mechanism: We record entries in an array.
%
\def\pgfsysanim@esnap@record#1{% records a new entry for the timeline
\edef\pgfsysanim@temp{#1}%
\expandafter\pgfsysanim@snap@record\expandafter{\pgfsysanim@temp}%
}
\def\pgfsysanim@snap@record#1{% records a new entry for the timeline
\ifx\pgfsysanim@time\pgfsysanim@base@text%
\def\pgfsysanim@base@value{#1}%
\else%
\advance\pgfsysanim@snap@count by1\relax%
\expandafter\def\expandafter\pgfsysanim@temp\expandafter{\pgfsysanim@time{#1}}%
\expandafter\let\csname pgfsysanim@snap@\the\pgfsysanim@snap@count\endcsname\pgfsysanim@temp%
\fi%
}
\newcount\pgfsysanim@snap@count
\let\pgfsysanim@base@value\pgfutil@empty%
% Compute the time-value interval of the snapshot: Based on the value of \pgfsysanim@snaptime,
% computes the interval containing the specified time. This interval
% will start at \pgfsysanim@prev@time and end at
% \pgfsysanim@next@time. The values will be \pgfsysanim@prev@val and
% \pgfsysanim@next@val.
%
\def\pgfsysanim@compute@interval{%
\let\pgfsysanim@prev@val\relax%
\let\pgfsysanim@prev@time\relax%
\let\pgfsysanim@prev@spline\pgfsysanim@default@spline%
\let\pgfsysanim@next@val\relax%
\let\pgfsysanim@next@time\relax%
\let\pgfsysanim@next@spline\pgfsysanim@default@spline%
\let\pgfsysanim@first@time\relax%
\let\pgfsysanim@last@time\relax%
\let\pgfsysanim@last@val\relax%
\ifnum\pgfsysanim@snap@count>0\relax%
\pgf@xc\pgfsysanim@snaptime pt\relax%
\pgf@x\pgfsysanim@snapshotstart pt\relax%
\advance\pgf@xc-\pgf@x\relax%
% Compute the start and end times:
\pgfsysanim@compute@start@end%
\pgfsysanim@compute@value%
\fi%
% Test whether a valid interval has been found:
\pgfsysanim@valid@snapshot@timefalse%
\ifx\pgfsysanim@prev@time\relax%
\else\ifx\pgfsysanim@next@time\relax%
\else\pgfsysanim@valid@snapshot@timetrue%
\fi\fi%
\ifpgfsysanim@valid@snapshot@time%
% ok, computed later
\else%
\ifx\pgfsysanim@base@value\pgfutil@empty%
\else%
% Ah, use base value!
\let\pgfsysanim@prev@val\pgfsysanim@base@value%
\def\pgfsysanim@prev@time{0}%
\let\pgfsysanim@prev@spline\pgfsysanim@default@spline%
\let\pgfsysanim@next@val\pgfsysanim@base@value%
\let\pgfsysanim@next@time\pgfsysanim@prev@time%
\let\pgfsysanim@next@spline\pgfsysanim@default@spline%
\def\pgfsysanim@first@time{-16382}%
\let\pgfsysanim@last@time\pgfsysanim@prev@time%
\let\pgfsysanim@last@val\pgfsysanim@base@value%
\def\pgfsysanim@frac@a{1}%
\def\pgfsysanim@frac@b{0}%
\pgfsysanim@valid@snapshot@timetrue% counts as valid!
\fi%
\fi%
}
\newif\ifpgfsysanim@cont%
\newif\ifpgfsysanim@valid@snapshot@time
\def\pgfsysanim@default@spline{{0}{0}{1}{1}}
\def\pgfsysanim@compute@start@end{%
\expandafter\expandafter\expandafter\pgfsysanim@compute@start\csname pgfsysanim@snap@1\endcsname%
\expandafter\expandafter\expandafter\pgfsysanim@compute@end\csname pgfsysanim@snap@\the\pgfsysanim@snap@count\endcsname%
}
\def\pgfsysanim@compute@start#1#2#3#4#5#6{%
\def\pgfsysanim@first@time{#1}%
}
\def\pgfsysanim@compute@end#1#2#3#4#5#6{%
\def\pgfsysanim@last@time{#1}%
\def\pgfsysanim@last@val{#6}%
}
\def\pgfsysanim@compute@value{%
% First, are we before start?
\ifdim\pgf@xc<\pgfsysanim@first@time pt\relax%
% snapshot time (xc) is before start of animation. So, nothing happens:
\else%
\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@none%
\pgfsysanim@handle@repeat@none%
\else\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@normal%
\pgfsysanim@handle@repeat@normal%
\else\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@indefinite%
\pgfsysanim@handle@repeat@indefinite%
\else\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@dur%
\pgfsysanim@handle@repeat@dur%
\fi\fi\fi\fi%
\fi%
}
\def\pgfsysanim@handle@repeat@none{%
\ifdim\pgf@xc<\pgfsysanim@last@time pt\relax%
\pgfsysanim@compute@time%
\else%
\ifdim\pgf@xc=\pgfsysanim@last@time pt\relax%
% A bit tricky:
\ifpgfsysanim@snap@first%
\pgfsysanim@compute@time%
\else%
\ifpgfsysanim@freezeatend%
\let\pgfsysanim@prev@val\pgfsysanim@last@val%
\let\pgfsysanim@prev@time\pgfsysanim@last@time%
\let\pgfsysanim@next@val\pgfsysanim@last@val%
\let\pgfsysanim@next@time\pgfsysanim@last@time%
\fi%
\fi%
\else%
% Called when we are past the end.
\ifpgfsysanim@freezeatend%
\let\pgfsysanim@prev@val\pgfsysanim@last@val%
\let\pgfsysanim@prev@time\pgfsysanim@last@time%
\let\pgfsysanim@next@val\pgfsysanim@last@val%
\let\pgfsysanim@next@time\pgfsysanim@last@time%
\fi%
\fi%
\fi%
}
\def\pgfsysanim@handle@repeat@indefinite{%
\ifdim\pgf@xc<\pgfsysanim@last@time pt\relax%
\pgfsysanim@compute@time%
\else%
% Compute interval length
\pgf@xa=\pgfsysanim@last@time pt%
\pgf@xb=\pgfsysanim@first@time pt%
\advance\pgf@xa by-\pgf@xb%
% Compute repeat count and fraction:
\pgf@ya\pgf@xc%
\advance\pgf@ya by-\pgf@xb%
\ifdim\pgf@xa<0.01pt\relax%
% Interval too small: Goto end of interval
\def\pgfmathresult{1.0}%
\else%
\pgfmathdivide@{\pgf@ya}{\pgf@xa}%
\fi%
\pgf@x\pgfmathresult pt\relax%
\expandafter\pgfsysanim@splitter\the\pgf@x%
\pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
\advance\pgf@xc by\pgf@xb%
\pgfsysanim@compute@time%
\fi%
}
{\catcode`\p=12\catcode`\t=12\gdef\Pgfsysanim@sPliTTer#1.#2pt{\Pgfsysanim@seTTer{#1}{#2}}}
\let\pgfsysanim@splitter\Pgfsysanim@sPliTTer
\def\Pgfsysanim@seTTer#1#2{%
\def\pgfsysanim@repeat@decimal{#1}%
\def\pgfsysanim@repeat@frac{.#2}%
\ifdim\pgfsysanim@repeat@frac pt=0pt% goto one before:
\c@pgf@counta\pgfsysanim@repeat@decimal%
\advance\c@pgf@counta by-1\relax%
\edef\pgfsysanim@repeat@decimal{\the\c@pgf@counta}%
\def\pgfsysanim@repeat@frac{1}%
\fi%
}
\def\pgfsysanim@repeat@decimal{0}%
\def\pgfsysanim@handle@repeat@normal{%
% Compute interval length
\pgf@xa=\pgfsysanim@last@time pt%
\pgf@xb=\pgfsysanim@first@time pt%
\advance\pgf@xa by-\pgf@xb%
% Compute repeat count and fraction:
\pgf@ya\pgf@xc%
\advance\pgf@ya by-\pgf@xb%
\ifdim\pgf@xa<0.01pt\relax%
% Interval too small: Goto end of interval
\def\pgfmathresult{1.0}%
\else%
\pgfmathdivide@{\pgf@ya}{\pgf@xa}%
\fi%
\pgf@x\pgfmathresult pt\relax%
\expandafter\pgfsysanim@splitter\the\pgf@x%
% Cases:
\ifdim\pgfmathresult pt<\pgfsysanim@snap@repeat@arg\relax%
% Ok! Compute!
\pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
\advance\pgf@xc by\pgf@xb%
\pgfsysanim@compute@time%
\else%
% Hmm. Freeze?
\ifpgfsysanim@freezeatend%
\expandafter\pgfsysanim@splitter\pgfsysanim@snap@repeat@arg%
\pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
\advance\pgf@xc by\pgf@xb%
\pgfsysanim@compute@time%
\else%
\ifdim\pgfmathresult pt=\pgfsysanim@snap@repeat@arg\relax%
\ifpgfsysanim@snap@first%
\expandafter\pgfsysanim@splitter\pgfsysanim@snap@repeat@arg%
\pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
\advance\pgf@xc by\pgf@xb%
\pgfsysanim@compute@time%
\fi%
% else: nothing!
\fi%
\fi%
\fi%
}
\def\pgfsysanim@handle@repeat@dur{%
\pgf@yb=\pgfsysanim@first@time pt%
\advance\pgf@yb by\pgfsysanim@snap@repeat@arg\relax%
\ifdim\pgf@xc<\pgf@yb% inside interval
\pgf@xa=\pgfsysanim@last@time pt%
\pgf@xb=\pgfsysanim@first@time pt%
\advance\pgf@xa by-\pgf@xb%
% Compute repeat count and fraction:
\pgf@ya\pgf@xc%
\advance\pgf@ya by-\pgf@xb%
\ifdim\pgf@xa<0.01pt\relax%
% Interval too small: Goto end of interval
\def\pgfmathresult{1.0}%
\else%
\pgfmathdivide@{\pgf@ya}{\pgf@xa}%
\fi%
\pgf@x\pgfmathresult pt\relax%
\expandafter\pgfsysanim@splitter\the\pgf@x%
%
\pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
\advance\pgf@xc by\pgf@xb%
\pgfsysanim@compute@time%
\else%
\ifpgfsysanim@freezeatend%
\pgfsysanim@handle@repeat@dur@freeze%
\else%
\ifdim\pgf@xc=\pgf@yb%
\ifpgfsysanim@snap@first%
\pgfsysanim@handle@repeat@dur@freeze%
\fi%
\fi%
\fi%
\fi%
}
\def\pgfsysanim@handle@repeat@dur@freeze{%
\pgf@xa=\pgfsysanim@last@time pt%
\pgf@xb=\pgfsysanim@first@time pt%
\advance\pgf@xa by-\pgf@xb%
% Compute repeat count and fraction:
\ifdim\pgf@xa<0.01pt\relax%
% Interval too small: Goto end of interval
\def\pgfmathresult{1.0}%
\else%
\pgfmathdivide@{\pgfsysanim@snap@repeat@arg}{\pgf@xa}%
\fi%
\pgf@x\pgfmathresult pt\relax%
\expandafter\pgfsysanim@splitter\the\pgf@x%
%
\pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
\advance\pgf@xc by\pgf@xb%
\pgfsysanim@compute@time%
}
\def\pgfsysanim@compute@time{%
% Ok, let us iterate over all points of time.
\pgfutil@tempcnta=1\relax%
\pgfsysanim@conttrue%
\pgfutil@loop%
\ifnum\pgfutil@tempcnta>\pgfsysanim@snap@count%
\pgfsysanim@contfalse%
\else%
\expandafter\let\expandafter\pgfsys@temp\csname pgfsysanim@snap@\the\pgfutil@tempcnta\endcsname%
\expandafter\pgfsysanim@test@time\pgfsys@temp%
\fi%
\ifpgfsysanim@cont%
\advance\pgfutil@tempcnta by1\relax%
\pgfutil@repeat%
}
\def\pgfsysanim@test@time#1#2#3#4#5#6{%
% #1 = time in seconds
% #2 to #5 = spline controls
% #6 = value
\ifdim#1pt<\pgf@xc%
% snap time not yet reached. Update previous:
\def\pgfsysanim@prev@val{#6}%
\def\pgfsysanim@prev@time{#1}%
\def\pgfsysanim@prev@spline{{#2}{#3}{#4}{#5}}%
\else%
\ifdim#1pt=\pgf@xc%
\ifpgfsysanim@snap@first%
\ifx\pgfsysanim@next@val\relax%
% first? Save!
\def\pgfsysanim@prev@val{#6}%
\def\pgfsysanim@prev@time{#1}%
\def\pgfsysanim@prev@spline{{#2}{#3}{#4}{#5}}%
\let\pgfsysanim@next@val\pgfsysanim@prev@val%
\let\pgfsysanim@next@time\pgfsysanim@prev@time%
\let\pgfsysanim@next@spline\pgfsysanim@prev@spline%
\pgfsysanim@contfalse%
% else, do nothing
\fi
\else%
% always overwrite:
\def\pgfsysanim@prev@val{#6}%
\def\pgfsysanim@prev@time{#1}%
\def\pgfsysanim@prev@spline{{#2}{#3}{#4}{#5}}%
\let\pgfsysanim@next@val\pgfsysanim@prev@val%
\let\pgfsysanim@next@time\pgfsysanim@prev@time%
\let\pgfsysanim@next@spline\pgfsysanim@prev@spline%
\fi%
\else%
% we passed the time!
\ifx\pgfsysanim@next@val\relax%
% first? Then save!
\def\pgfsysanim@next@val{#6}%
\def\pgfsysanim@next@time{#1}%
\def\pgfsysanim@next@spline{{#2}{#3}{#4}{#5}}%
\else%
% ignore later times!
\pgfsysanim@contfalse%
\fi%
\fi%
\fi%
}
\let\pgfsysanim@prev@val\relax%
\let\pgfsysanim@prev@time\relax%
\let\pgfsysanim@next@val\relax%
\let\pgfsysanim@next@time\relax%
% Help function
\def\pgfsysanim@attach#1#2#3{%
\expandafter\pgfsysanim@prep@beg\expandafter{\pgfsysanim@first@time}{#2}{#3}%
\expandafter\def\expandafter\pgfsysanim@code@main\expandafter{\csname pgfsysanim@main@of@\pgfsysanim@whom@id @\pgfsysanim@whom@type @#1\endcsname}%
\expandafter\ifx\pgfsysanim@code@main\relax%
\edef\pgfsysanim@code@begin{%
\let\noexpand\pgfsysanim@c@begin\noexpand\pgfutil@empty%
\let\noexpand\pgfsysanim@c@end\noexpand\pgfutil@empty%
\pgfsysanim@lasttime-16383pt\relax%
\expandafter\noexpand\pgfsysanim@code@main%
\global\let\expandafter\noexpand\pgfsysanim@code@main\relax%
\noexpand\pgfsysanim@c@begin%
}%
\let\pgfsysanim@code@end\pgfsysanim@code@closer%
\expandafter\global\expandafter\let\pgfsysanim@code@main\pgfutil@empty%
\else%
\let\pgfsysanim@code@begin\relax%
\let\pgfsysanim@code@end\relax%
\fi%
\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfsysanim@new@main%
\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@code@main\pgfsysanim@add@main}
\expandafter\global\expandafter\let\pgfsysanim@code@main\pgfsysanim@new@main%
}
\def\pgfsysanim@code@closer{\pgfsysanim@c@end}
\def\pgfsysanim@prep@beg#1#2#3{%
\edef\pgfsysanim@add@main{%
\noexpand\ifdim\pgfsysanim@lasttime>#1pt%
% ignore!
\noexpand\else%
\pgfsysanim@lasttime#1pt%
\def\noexpand\pgfsysanim@c@begin{#2}%
\def\noexpand\pgfsysanim@c@end{#3}%
\noexpand\fi%
}
}
\def\pgfsysanim@prep@beg@special#1#2{%
\def\pgfsysanim@add@main{%
\ifdim\pgfsysanim@lasttime>#1pt%
% ignore!
\else%
\pgfsysanim@lasttime#1pt%
\def\pgfsysanim@c@begin{#2}%
\fi%
}
}
\def\pgfsysanim@attach@special#1#2{%
\expandafter\expandafter\expandafter\pgfsysanim@prep@beg@special\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@first@time\expandafter}\expandafter{#2}%
\ifx#1\relax%
\def#1{%
\pgfsysanim@lasttime-16383pt\relax%
\let\pgfsysanim@c@begin\pgfutil@empty%
}%
\fi%
\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{\expandafter#1\pgfsysanim@add@main}%
}
\newdimen\pgfsysanim@lasttime
\def\pgfsysanim@add@trans{%
\ifx\pgfsysanim@snap@canvas@transform@pre\relax%
\else%
\ifx\pgfsysanim@code@begin\relax%
\let\pgfsysanim@code@begin\pgfutil@empty%
\fi%
\pgfsysanim@add@trans@%
\fi%
}
\def\pgfsysanim@add@trans@{%
\toks0\expandafter{\pgfsysanim@snap@canvas@transform@pre}%
\toks1\expandafter{\pgfsysanim@code@begin}%
\toks2\expandafter{\pgfsysanim@snap@canvas@transform@post}%
\edef\pgfsysanim@code@begin{{\the\toks0 \the\toks1 \the\toks2}}%
}
% The code for the different attributes
\def\pgfsysanim@prep@attr@opacity{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scalar%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
\pgfsysanim@attach{opacity}{\noexpand\pgfsys@opacity{\pgfsysanim@x@val}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@fillopacity{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scalar%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
\pgfsysanim@attach{fillopacity}{\noexpand\pgfsys@fill@opacity{\pgfsysanim@x@val}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@strokeopacity{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scalar%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
\pgfsysanim@attach{strokeopacity}{\noexpand\pgfsys@stroke@opacity{\pgfsysanim@x@val}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@visibility{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@text%
\ifx\pgfsysanim@text@val\pgf@hidden@text%
\pgfsysanim@attach{visibility}{\noexpand\pgfsys@begininvisiblescope}{\noexpand\pgfsys@endinvisiblescope}%
\else%
\pgfsysanim@attach{visibility}{}{}%
\fi%
\fi%
}
\def\pgf@hidden@text{hidden}
\def\pgfsysanim@prep@attr@linewidth{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@dimension%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{16382}%
\pgfsysanim@attach{linewidth}{\noexpand\pgfsys@setlinewidth{\pgfsysanim@x@val pt}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@dash{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@dash%
\pgfsysanim@attach{dash}{\noexpand\pgfsys@setdash{\pgfsysanim@dash@vals}{\pgfsysanim@x@val pt}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@translate{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@translate%
\edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformshift{\pgfsysanim@x@val pt}{\pgfsysanim@y@val pt}}%
\fi%
\pgfsysanim@add@trans%
}
\def\pgfsysanim@prep@attr@scale{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scale%
\edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformxyscale{\pgfsysanim@x@val}{\pgfsysanim@y@val}}%
\fi%
\pgfsysanim@add@trans%
}
\def\pgfsysanim@prep@attr@rotate{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scalar%
{%
\pgfmathsin@{\pgfsysanim@x@val}%
\let\pgftransform@sin=\pgfmathresult%
\pgfmathcos@{\pgfsysanim@x@val}%
\let\pgftransform@cos=\pgfmathresult%
\pgf@x=\pgftransform@sin pt%
\pgf@xa=-\pgf@x%
\edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformcm{\pgftransform@cos}{\pgftransform@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgftransform@cos}{0pt}{0pt}}%
\expandafter}%
\expandafter\def\expandafter\pgfsysanim@code@begin\expandafter{\pgfsysanim@code@begin}%
\fi%
\pgfsysanim@add@trans%
}
\def\pgfsysanim@prep@attr@skewx{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scalar%
{%
\pgfmathtan@{\pgfsysanim@x@val}%
\edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformcm{1}{0}{\pgfmathresult}{1}{0pt}{0pt}}%
\expandafter}%
\expandafter\def\expandafter\pgfsysanim@code@begin\expandafter{\pgfsysanim@code@begin}%
\fi%
\pgfsysanim@add@trans%
}
\def\pgfsysanim@prep@attr@skewy{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@scalar%
{%
\pgfmathtan@{\pgfsysanim@x@val}%
\edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformcm{1}{\pgfmathresult}{0}{1}{0pt}{0pt}}%
\expandafter}%
\expandafter\def\expandafter\pgfsysanim@code@begin\expandafter{\pgfsysanim@code@begin}%
\fi%
\pgfsysanim@add@trans%
}
\def\pgfsysanim@prep@attr@motion{%
\ifx\pgfsysanim@base@value\pgfutil@empty%
\else%
\pgferror{You may not provide a base value for a motion}%
\let\pgfsysanim@base@value\pgfutil@empty%
\fi%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@motion%
\expandafter\pgfsysanim@prep@attr@motion@\pgfsysanim@motion@trans%
\fi%
\pgfsysanim@add@trans%
}
\def\pgfsysanim@prep@attr@motion@#1#2#3#4#5#6{%
\ifpgfsysanim@rotatealong%
\def\pgfsysanim@code@begin{\pgfsys@transformcm{#1}{#2}{#3}{#4}{#5}{#6}}%
\else%
\def\pgfsysanim@code@begin{\pgfsys@transformshift{#5}{#6}}%
\fi%
}
\def\pgfsysanim@prep@attr@strokecolor{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@color%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
\pgfsysanim@cap@scalar{\pgfsysanim@y@val}{0}{1}%
\pgfsysanim@cap@scalar{\pgfsysanim@z@val}{0}{1}%
\pgfsysanim@attach{strokecolor}{\noexpand\pgfsys@color@rgb@stroke{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@fillcolor{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@color%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
\pgfsysanim@cap@scalar{\pgfsysanim@y@val}{0}{1}%
\pgfsysanim@cap@scalar{\pgfsysanim@z@val}{0}{1}%
\pgfsysanim@attach{fillcolor}{\noexpand\pgfsys@color@rgb@fill{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}}{}%
\fi%
}
\def\pgfsysanim@prep@attr@color{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@color%
\pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
\pgfsysanim@cap@scalar{\pgfsysanim@y@val}{0}{1}%
\pgfsysanim@cap@scalar{\pgfsysanim@z@val}{0}{1}%
\pgfsysanim@attach{color}{\noexpand\pgfsys@color@rgb{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}}{}%
\fi%
}
\newif\ifpgfsys@animation@view@hooked
\def\pgfsysanim@prep@attr@viewbox{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@viewbox%
\pgfsys@attach@to@id{\pgfsysanim@whom@id}{}{%
\ifpgfsys@animation@view@hooked%
\else%
% Hook into viewbox systems layer commands
\let\pgfsys@viewboxmeet@orig\pgfsys@viewboxmeet%
\let\pgfsys@viewboxmeet\pgfsysanim@hooked@viewboxmeet%
\let\pgfsys@viewboxslice@orig\pgfsys@viewboxslice%
\let\pgfsys@viewboxslice\pgfsysanim@hooked@viewboxslice%
\pgfsys@animation@view@hookedtrue%
\fi%
}{}{}%
\edef\pgfsysanim@temp{{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}{\pgfsysanim@w@val}}%
\expandafter\pgfsysanim@attach@special\csname pgfsysanim@hook@for@\pgfsys@id@ref{\pgfsysanim@whom@id}{\pgfsysanim@whom@type}\endcsname\pgfsysanim@temp%
\fi%
}
\def\pgfsysanim@hooked@viewboxmeet#1#2#3#4#5#6#7#8{%
\expandafter\ifx\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
\pgfsys@viewboxmeet@orig{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
\else%
\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname%
\ifx\pgfsysanim@c@begin\pgfutil@empty%
% should not happen, but, then, ignore
\else%
\expandafter\pgfsysanim@hooked@viewboxmeet@\pgfsysanim@c@begin{#1}{#2}{#3}{#4}%
\fi%
\expandafter\global\expandafter\let\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
\fi%
}
\def\pgfsysanim@hooked@viewboxmeet@#1#2#3#4#5#6#7#8{%
\pgfsys@viewboxmeet@orig{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
}
\def\pgfsysanim@hooked@viewboxslice#1#2#3#4#5#6#7#8{%
\expandafter\ifx\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
\pgfsys@viewboxslice@orig{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
\else%
\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname%
\expandafter\pgfsysanim@hooked@viewboxslice@\pgfsysanim@c@begin{#1}{#2}{#3}{#4}%
\expandafter\global\expandafter\let\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
\fi%
}
\def\pgfsysanim@hooked@viewboxslice@#1#2#3#4#5#6#7#8{%
\pgfsys@viewboxslice@orig{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
}
\newif\ifpgfsys@animation@path@hooked
\def\pgfsysanim@prep@attr@path{%
\ifpgfsysanim@valid@snapshot@time%
\pgfsysanim@comp@path%
\pgfsys@attach@to@id{\pgfsysanim@whom@id}{}{%
\ifpgfsys@animation@path@hooked%
\else%
% Hook into path systems layer commands
\let\pgfsys@discardpath@orig\pgfsys@discardpath%
\let\pgfsys@stroke@orig\pgfsys@stroke%
\let\pgfsys@fill@orig\pgfsys@fill%
\let\pgfsys@fillstroke@orig\pgfsys@fillstroke%
\let\pgfsys@closestroke@orig\pgfsys@closestroke%
\let\pgfsys@discardpath\pgfsys@discardpath@hook%
\let\pgfsys@stroke\pgfsys@stroke@hook%
\let\pgfsys@fill\pgfsys@fill@hook%
\let\pgfsys@fillstroke\pgfsys@fillstroke@hook%
\let\pgfsys@closestroke\pgfsys@closestroke@hook%
\pgfsys@animation@path@hookedtrue%
\fi%
}{}{}%
\expandafter\pgfsysanim@attach@special\csname pgfsysanim@phook@for@\pgfsys@id@ref{\pgfsysanim@whom@id}{\pgfsysanim@whom@type}\endcsname\pgfsysanim@path@all%
\fi%
}
\def\pgfsys@stroke@hook{\pgfsysanim@with@tipstrue\pgfsysanim@path@hooks\pgfsys@stroke@orig}
\def\pgfsys@fill@hook{\pgfsysanim@with@tipsfalse\pgfsysanim@path@hooks\pgfsys@fill@orig}
\def\pgfsys@fillstroke@hook{\pgfsysanim@with@tipstrue\pgfsysanim@path@hooks\pgfsys@fillstroke@orig}
\def\pgfsys@closestroke@hook{\pgfsysanim@with@tipsfalse\pgfsysanim@path@hooks\pgfsys@closestroke@orig}
\def\pgfsys@discardpath@hook{\pgfsysanim@with@tipsfalse\pgfsysanim@path@hooks\pgfsys@discardpath@orig}
\newif\ifpgfsysanim@with@tips
\def\pgfsysanim@path@hooks#1{%
{%
\expandafter\ifx\csname pgfsysanim@phook@for@\pgfsys@id@refcurrent\endcsname\relax%
#1%
\else%
\pgfsys@discardpath@orig%
\csname pgfsysanim@phook@for@\pgfsys@id@refcurrent\endcsname%
\pgfsysanim@c@begin%
\pgfsysanim@path@val%
#1%
\ifpgfsysanim@with@tips%
\ifx\pgfsysanim@path@val\pgfutil@empty\else%
\pgfsysanim@prepare@end@of@path%
\begingroup%
\pgfsysanim@prepare@start@of@path%
\pgfsysanim@add@marker@at@start%
\endgroup%
\pgfsysanim@add@marker@at@end%
\fi%
\fi%
\expandafter\global\expandafter\let\csname pgfsysanim@phook@for@\pgfsys@id@refcurrent\endcsname\relax%
\fi%
}%
}
\def\pgfsysanim@prepare@start@of@path{%
\ifx\pgfsysanim@snap@tip@start\pgfutil@empty\else
%
% Step 1: Split
%
\ifx\pgfprocessresultpathsuffix\relax%
% Ok, still need to compute the split:
\pgfprocesssplitpath{\pgf@arrowpath}%
\fi%
%
% Step 2: extract
%
\expandafter\pgf@parse@start\pgfprocessresultpathsuffix\pgf@stop\pgf@stop\pgf@stop%
%
% Step 3: prep
%
\pgf@prep@start%
\fi%
}
\def\pgfsysanim@add@marker@at@start{%
\ifx\pgfsysanim@snap@tip@start\pgfutil@empty\else
%
% Step 4: draw
%
{%
\pgftransformreset%
\pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
\pgfsys@beginscope%
\pgflowlevelsynccm%
\pgfsys@marker@use{\pgfsysanim@snap@tip@start}%
\pgfsys@endscope%
}%
\fi%
}
\def\pgfsysanim@prepare@end@of@path{%
\let\pgfprocessresultpathsuffix\relax% flag that nothing has happened...
\let\pgfprocessresultsubpathsuffix\relax%
\pgf@precise@shorteningfalse%
\edef\pgf@path@shortening@distance{0pt}%
\ifx\pgfsysanim@snap@tip@end\pgfutil@empty\else
%
% Step 1: Split
%
\pgfprocesssplitpath{\pgfsysanim@path@val}%
\pgfprocesssplitsubpath{\pgfprocessresultpathsuffix}%
%
% Step 2: extract
%
\expandafter\pgf@parse@end\pgfprocessresultsubpathsuffix\pgf@stop\pgf@stop\pgf@stop%
%
% Step 3: prep
%
\pgf@prep@end%
\fi%
}
\def\pgfsysanim@add@marker@at@end{%
\ifx\pgfsysanim@snap@tip@end\pgfutil@empty\else
%
% Step 4: draw
%
{%
\pgftransformreset%
\pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
\pgfsys@beginscope%
\pgflowlevelsynccm%
\pgfsys@marker@use{\pgfsysanim@snap@tip@end}%
\pgfsys@endscope%
}%
\fi%
}
%
% Interpolation functions
%
% Scalar interpolation
\def\pgfsysanim@comp@scalar{%
\pgfsysanim@compute@fractions%
\pgfsysanim@mix@scalar%
\ifpgfsysanim@accumulate%
\ifnum\pgfsysanim@repeat@decimal=0\else%
\let\pgfsysanim@frac@b\pgfsysanim@one%
\let\pgfsysanim@prev@val\pgfsysanim@x@val%
\let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
\let\pgfsysanim@next@val\pgfsysanim@last@val%
\pgfsysanim@mix@scalar%
\fi%
\fi%
}
\def\pgfsysanim@one{1}
\def\pgfsysanim@mix@scalar{%
\pgf@x\pgfsysanim@prev@val pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y\pgfsysanim@next@val pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
}
\def\pgfsysanim@cap@scalar#1#2#3{%
\ifdim#1 pt<#2 pt%
\def#1{#2}%
\else\ifdim#1 pt>#3 pt%
\def#1{#3}%
\fi\fi%
}
% Scale interpolation
\def\pgfsysanim@comp@scale{%
\pgfsysanim@compute@fractions%
\expandafter\expandafter\expandafter\pgfsysanim@mix@scale\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
\ifpgfsysanim@accumulate%
\ifnum\pgfsysanim@repeat@decimal=0\else%
\let\pgfsysanim@frac@b\pgfsysanim@one%
\let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
\expandafter\pgfsysanim@mix@scale\expandafter\pgfsysanim@x@val\expandafter\pgfsysanim@y@val\pgfsysanim@last@val%
\fi%
\fi%
}
\def\pgfsysanim@mix@scale#1#2#3#4{%
\pgf@x#1pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#3pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
\pgf@x#2pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#4pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@y@val{\pgf@sys@tonumber\pgf@x}%
}
% Dimension interpolation
\def\pgfsysanim@comp@dimension{%
\pgfsysanim@compute@fractions%
\pgfsysanim@mix@dimension%
\ifpgfsysanim@accumulate%
\ifnum\pgfsysanim@repeat@decimal=0\else%
\let\pgfsysanim@frac@b\pgfsysanim@one%
\def\pgfsysanim@prev@val{\pgfsysanim@x@val pt}%
\let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
\let\pgfsysanim@next@val\pgfsysanim@last@val%
\pgfsysanim@mix@dimension%
\fi%
\fi%
}
\def\pgfsysanim@mix@dimension{%
\pgf@x\pgfsysanim@prev@val%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y\pgfsysanim@next@val%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
}
% Translate interpolation
\def\pgfsysanim@comp@translate{%
\pgfsysanim@compute@fractions%
\expandafter\expandafter\expandafter\pgfsysanim@mix@translate\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
\ifpgfsysanim@accumulate%
\ifnum\pgfsysanim@repeat@decimal=0\else%
\let\pgfsysanim@frac@b\pgfsysanim@one%
\let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
\edef\pgfsysanim@prev@val{{\pgfsysanim@x@val pt}{\pgfsysanim@y@val pt}}
\expandafter\expandafter\expandafter\pgfsysanim@mix@translate\expandafter\pgfsysanim@prev@val\pgfsysanim@last@val%
\fi%
\fi%
}
\def\pgfsysanim@mix@translate#1#2#3#4{%
\pgf@x#1%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#3%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
\pgf@x#2%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#4%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@y@val{\pgf@sys@tonumber\pgf@x}%
}
% Color interpolation
\def\pgfsysanim@comp@color{%
\pgfsysanim@compute@fractions%
\expandafter\expandafter\expandafter\pgfsysanim@mix@color\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
\ifpgfsysanim@accumulate%
\ifnum\pgfsysanim@repeat@decimal=0\else%
\let\pgfsysanim@frac@b\pgfsysanim@one%
\let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
\expandafter\pgfsysanim@mix@color\expandafter\pgfsysanim@x@val\expandafter\pgfsysanim@y@val\expandafter\pgfsysanim@z@val\pgfsysanim@last@val%
\fi%
\fi%
}
\def\pgfsysanim@mix@color#1#2#3#4#5#6{%
\pgf@x#1pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#4pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
\pgf@x#2pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#5pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@y@val{\pgf@sys@tonumber\pgf@x}%
\pgf@x#3pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#6pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@z@val{\pgf@sys@tonumber\pgf@x}%
}
% Text interpolation
\def\pgfsysanim@comp@text{%
\let\pgfsysanim@text@val\pgfsysanim@prev@val%
}
% Dash interpolation
\def\pgfsysanim@comp@dash{%
\pgfsysanim@compute@fractions%
\expandafter\expandafter\expandafter\pgfsysanim@mix@dash\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
\ifpgfsysanim@accumulate%
\ifnum\pgfsysanim@repeat@decimal=0\else%
\let\pgfsysanim@frac@b\pgfsysanim@one%
\let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
\edef\pgfsysanim@prev@val{{\pgfsysanim@dash@vals}{\pgfsysanim@x@val pt}}%
\expandafter\expandafter\expandafter\pgfsysanim@mix@dash\expandafter\pgfsysanim@prev@val\pgfsysanim@last@val%
\fi%
\fi%
}
\def\pgfsysanim@mix@dash#1#2#3#4{%
\pgf@x#2\relax%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#4\relax%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
\let\pgfsysanim@dash@vals\pgfutil@empty%
\pgfsysanim@parse@dash#1,\pgf@stop#3,\pgf@stop%
}
\def\pgfsysanim@parse@dash{\pgfutil@ifnextchar\pgf@stop\pgfsysanim@parse@dash@done\pgfsysanim@parse@dash@first}
\def\pgfsysanim@parse@dash@done\pgf@stop\pgf@stop{}%
\def\pgfsysanim@parse@dash@first#1,#2\pgf@stop#3\pgf@stop{%
\pgf@x#1\relax%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgfsysanim@parse@dash@second#3\pgf@stop{#2}%
}
\def\pgfsysanim@parse@dash@second#1,#2\pgf@stop#3{%
\pgf@y#1\relax%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\def\pgfsys@temp{#2}%
\edef\pgfsysanim@dash@vals{\pgfsysanim@dash@vals\the\pgf@x\ifx\pgfsys@temp\pgfutil@empty\else,\fi}%
\pgfsysanim@parse@dash#3\pgf@stop#2\pgf@stop%
}
% Viewbox interpolation
\def\pgfsysanim@comp@viewbox{%
\pgfsysanim@compute@fractions%
\expandafter\expandafter\expandafter\pgfsysanim@mix@viewbox\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
\ifpgfsysanim@accumulate%
\pgferror{viewbox animations cannot accumulate / add}%
\fi%
}
\def\pgfsysanim@mix@viewbox#1#2#3#4#5#6#7#8{%
\pgf@x#1%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#5%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\the\pgf@x}%
\pgf@x#2%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#6%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@y@val{\the\pgf@x}%
\pgf@x#3%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#7%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@z@val{\the\pgf@x}%
\pgf@x#4%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#8%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@w@val{\the\pgf@x}%
}
% Path interpolation
\def\pgfsysanim@comp@path{%
\pgfsysanim@compute@fractions%
\edef\pgfsysanim@path@tips{%
\def\noexpand\pgfsysanim@snap@tip@start{\pgfsysanim@snap@tip@start}%
\def\noexpand\pgfsysanim@snap@tip@end{\pgfsysanim@snap@tip@end}%
}%
\let\pgfsysanim@path@val\pgfutil@empty%
\expandafter\expandafter\expandafter\pgfsysanim@parse@path\expandafter\pgfsysanim@prev@val\expandafter\pgf@stop\expandafter\relax\pgfsysanim@next@val\pgf@stop\relax%
\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsysanim@path@all\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsysanim@path@val\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@path@val\expandafter}\pgfsysanim@path@tips}%
\ifpgfsysanim@accumulate%
\pgferror{path animations cannot accumulate / add}%
\fi%
}
\def\pgfsysanim@parse@path{\pgfutil@ifnextchar\pgf@stop\pgfsysanim@parse@path@done\pgfsysanim@parse@path@first}
\def\pgfsysanim@parse@path@done\pgf@stop\relax\pgf@stop\relax{}%
\def\pgfsysanim@parse@path@first{\pgfutil@ifnextchar\bgroup\pgfsysanim@parse@path@first@num\pgfsysanim@parse@path@token}
\def\pgfsysanim@parse@path@token#1#2\relax#3#4\relax{%
\expandafter\def\expandafter\pgfsysanim@path@val\expandafter{\pgfsysanim@path@val#1}%
\pgfsysanim@parse@path#2\relax#4\relax%
}
\def\pgfsysanim@parse@path@first@num#1#2\relax#3#4\relax{%
\pgf@x#1%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y#3%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsysanim@path@val\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@path@val\expandafter{\the\pgf@x}}%
\pgfsysanim@parse@path#2\relax#4\relax%
}
% Motion interpolation
\def\pgfsysanim@comp@motion{%
\pgfsysanim@compute@fractions%
\pgf@x\pgfsysanim@prev@val pt%
\pgf@x\pgfsysanim@frac@b\pgf@x%
\pgf@y\pgfsysanim@next@val pt%
\advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
\edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
\ifdim\pgfsysanim@x@val pt=1pt%
\def\pgfsysanim@x@val{0.9999}% because of rounding problems in decorations
\fi%
\pgf@relevantforpicturesizefalse%
\pgfdecoratepath{pgfsysanim@motion}{%
\pgfsyssoftpath@setcurrentpath\pgfsysanim@snap@movealong%
}%
\ifpgfsysanim@accumulate%
\pgferror{motion animations cannot accumulate / add}%
\fi%
}
\pgfdeclaredecoration{pgfsysanim@motion}{s}{%
\state{s}[width=\pgfsysanim@x@val\pgfdecoratedremainingdistance,next state=final]{}%
\state{final}{\pgfgettransform\pgfsysanim@motion@trans\global\let\pgfsysanim@motion@trans\pgfsysanim@motion@trans}%
}
% Compute fractions and splines:
\def\pgfsysanim@compute@fractions{%
\ifdim\pgf@xc=\pgfsysanim@prev@time pt%
\def\pgfsysanim@frac@a{0}%
\def\pgfsysanim@frac@b{1}%
\else%
\pgfmathsubtract@{\pgfsysanim@next@time}{\pgfsysanim@prev@time}%
\ifdim\pgfmathresult pt<0.01pt%
\def\pgfsysanim@frac@a{0}%
\def\pgfsysanim@frac@b{1}%
\else%
\let\pgfsysanim@divby\pgfmathresult%
\pgfmathsubtract@{\pgf@xc}{\pgfsysanim@prev@time}%
\pgfmathdivide@{\pgfmathresult}{\pgfsysanim@divby}%
\ifdim\pgfmathresult pt<0pt\def\pgfmathresult{0}\fi%
\ifdim\pgfmathresult pt>1pt\def\pgfmathresult{1}\fi%
\let\pgfsysanim@frac@a\pgfmathresult%
\pgfmathsubtract@{1}{\pgfmathresult}%
\let\pgfsysanim@frac@b\pgfmathresult%
\fi%
\fi%
\ifdim\pgfsysanim@frac@a pt=0pt%
\else\ifdim\pgfsysanim@frac@b pt=0pt%
\else%
\expandafter\expandafter\expandafter\pgfsysanim@apply@spline\expandafter\pgfsysanim@prev@spline\pgfsysanim@next@spline%
\fi\fi%
}
\def\pgfsysanim@apply@spline#1#2#3#4#5#6#7#8{%
\edef\pgfsys@temp{#3,#5,#4,#6}%
\ifx\pgfsys@temp\pgfsysanim@id@spline%
\else%
\def\pgfsysanim@prev@out@time{{#3}{#4}}%
\def\pgfsysanim@next@in@time{{#5}{#6}}%
\ifx\pgfsysanim@prev@out@time\pgfsys@stay@text%
\pgfsysanim@jump@splines%
\else\ifx\pgfsysanim@next@in@time\pgfsys@jump@text%
\pgfsysanim@jump@splines%
\else%
\pgf@xa#3pt%
\pgf@xb#5pt%
% #4 is val support a
% #6 is val support b
% our first approximation
\let\pgfsysanim@t\pgfsysanim@frac@a%
\let\pgfsysanim@s\pgfsysanim@frac@b%
\pgfsysanim@eval@spline%
\edef\pgfsysanim@ft{\the\pgf@x}%
\pgf@x\pgfsysanim@t pt%
\advance\pgf@x by256sp%
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
\pgfsysanim@eval@spline%
% Ok, now do Newton one step
\advance\pgf@x by-\pgfsysanim@ft%
\pgf@x256\pgf@x%
% \pgf@x is f'(t)
% must compute t - (f(t)-frac@a)/f'(t)
\pgf@ya\pgfsysanim@ft%
\advance\pgf@ya by-\pgfsysanim@frac@a pt%
\pgf@yb\pgf@x
\pgfmathreciprocal@{\pgf@yb}%
\ifdim\pgfmathresult pt>2.5pt%
\def\pgfmathresult{2.5}%
\fi%
\ifdim\pgfmathresult pt<-2.5pt%
\def\pgfmathresult{-2.5}%
\fi%
\pgf@x\pgfsysanim@t pt%
\advance\pgf@x by-\pgfmathresult\pgf@ya%
% \pgf@x is new t:
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
\pgfsysanim@eval@spline%
\edef\pgfsysanim@ft{\the\pgf@x}%
\pgf@x\pgfsysanim@t pt%
\advance\pgf@x by256sp%
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
\pgfsysanim@eval@spline%
% Ok, now do Newton one step2
\advance\pgf@x by-\pgfsysanim@ft%
\pgf@x256\pgf@x%
% \pgf@x is f'(t)
% must compute t - (f(t)-frac@a)/f'(t)
\pgf@ya\pgfsysanim@ft%
\advance\pgf@ya by-\pgfsysanim@frac@a pt%
\pgf@yb\pgf@x
\pgfmathreciprocal@{\pgf@yb}%
\ifdim\pgfmathresult pt>2.5pt%
\def\pgfmathresult{2.5}%
\fi%
\ifdim\pgfmathresult pt<-2.5pt%
\def\pgfmathresult{-2.5}%
\fi%
\pgf@x\pgfsysanim@t pt%
\advance\pgf@x by-\pgfmathresult\pgf@ya%
% \pgf@x is new t:
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
% Third Newton:
\pgfsysanim@eval@spline%
\edef\pgfsysanim@ft{\the\pgf@x}%
\pgf@x\pgfsysanim@t pt%
\advance\pgf@x by256sp%
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
\pgfsysanim@eval@spline%
% Ok, now do Newton one step2
\advance\pgf@x by-\pgfsysanim@ft%
\pgf@x256\pgf@x%
% \pgf@x is f'(t)
% must compute t - (f(t)-frac@a)/f'(t)
\pgf@ya\pgfsysanim@ft%
\advance\pgf@ya by-\pgfsysanim@frac@a pt%
\pgf@yb\pgf@x
\pgfmathreciprocal@{\pgf@yb}%
\ifdim\pgfmathresult pt>2.5pt%
\def\pgfmathresult{2.5}%
\fi%
\ifdim\pgfmathresult pt<-2.5pt%
\def\pgfmathresult{-2.5}%
\fi%
\pgf@x\pgfsysanim@t pt%
\advance\pgf@x by-\pgfmathresult\pgf@ya%
% \pgf@x is new t:
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
% now, evaluate target:
\pgf@xa#4pt%
\pgf@xb#6pt%
\pgfsysanim@eval@spline%
% \pgf@x is result:
\pgf@y1pt%
\advance\pgf@y by-\pgf@x%
\edef\pgfsysanim@frac@a{\pgf@sys@tonumber\pgf@x}%
\edef\pgfsysanim@frac@b{\pgf@sys@tonumber\pgf@y}%
\fi\fi%
\fi%
}
\def\pgfsysanim@id@spline{0,1,0,1}
\def\pgfsysanim@eval@spline{%
% Iteration one: (0,#1,#2,1) reduced to (ya,yb,yc)
\pgf@ya\pgfsysanim@t\pgf@xa%
\pgf@yb\pgfsysanim@t\pgf@xb%
\advance\pgf@yb by\pgfsysanim@s\pgf@xa%
\pgf@yc\pgfsysanim@t pt%
\advance\pgf@yc by\pgfsysanim@s\pgf@xb%
% Iteration two: (ya,yb,yc) reduced to (y,xc)
\pgf@y\pgfsysanim@t\pgf@yb%
\advance\pgf@y by\pgfsysanim@s\pgf@ya%
\pgf@xc\pgfsysanim@t\pgf@yc%
\advance\pgf@xc by\pgfsysanim@s\pgf@yb%
% Iteration three: (y,xc) reduced to (x)
\pgf@x\pgfsysanim@t\pgf@xc%
\advance\pgf@x by\pgfsysanim@s\pgf@y%
}
\def\pgfsysanim@jump@splines{%
\ifx\pgfsysanim@prev@out@time\pgfsys@stay@text%
\ifx\pgfsysanim@next@in@time\pgfsys@jump@text%
\ifdim\pgfsysanim@frac@a pt<0.5pt%
\def\pgfsysanim@frac@a{0}%
\def\pgfsysanim@frac@b{1}%
\else%
\def\pgfsysanim@frac@a{1}%
\def\pgfsysanim@frac@b{0}%
\fi%
\else%
% Only stay, so go to begin
\def\pgfsysanim@frac@a{0}%
\def\pgfsysanim@frac@b{1}%
\fi%
\else
% Only jump, so go to end
\def\pgfsysanim@frac@a{1}%
\def\pgfsysanim@frac@b{0}%
\fi%
}
\endinput