% Copyright 2022 by Qrrbrbirlbel
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Free Documentation License.
%

\def\tikz@rectB#1{% originally from tikz.code.tex
  \tikz@make@last@position{#1}%
  \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \let\tikz@timer\tikz@timer@rectangle% %% Timer: new timer
  \tikz@@movetosave{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \tikz@path@lineto{\pgfqpoint{\pgf@xa}{\tikz@lasty}}%
  \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
  \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@ya}}%
  \iftikz@snaked
    \tikz@path@lineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \fi
  \pgfpathclose
          \tikz@@movetosave{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
  \def\pgfstrokehook{}%
  \let\tikz@tangent\relax
  \tikz@scan@next@command
}%

\def\tikz@@sine#1{% originally from tikz.code.tex
  \let\tikz@tangent\tikz@tangent@lookup
  \tikz@flush@moveto
  \edef\tikz@timer@start{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% %% Timer: save start position
  \pgf@process{#1}%
  \edef\tikz@timer@end{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% %% Timer: saver target position
  \pgf@xc=\pgf@x
  \pgf@yc=\pgf@y
  \advance\pgf@xc by-\tikz@lastx
  \advance\pgf@yc by-\tikz@lasty
  \advance\tikz@lastx by\pgf@xc
  \advance\tikz@lasty by\pgf@yc
  \tikz@lastxsaved=\tikz@lastx
  \tikz@lastysaved=\tikz@lasty
  \tikz@updatecurrenttrue
  \let\tikz@timer=\tikz@timer@sine% %% Timer: new timer
  \pgfpathsine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
  \tikz@scan@next@command
}

\def\tikz@@cosine#1{% originally from tikz.code.tex
  \let\tikz@tangent\tikz@tangent@lookup
  \tikz@flush@moveto
  \edef\tikz@timer@start{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% %% Timer: save start position
  \pgf@process{#1}%
  \edef\tikz@timer@end{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% %% Timer: save target position
  \pgf@xc=\pgf@x
  \pgf@yc=\pgf@y
  \advance\pgf@xc by-\tikz@lastx
  \advance\pgf@yc by-\tikz@lasty
  \advance\tikz@lastx by\pgf@xc
  \advance\tikz@lasty by\pgf@yc
  \tikz@lastxsaved=\tikz@lastx
  \tikz@lastysaved=\tikz@lasty
  \tikz@updatecurrenttrue
  \let\tikz@timer=\tikz@timer@cosine% %% Timer: new timer
  \pgfpathcosine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
  \tikz@scan@next@command
}

\def\tikzext@timer@rectangle{%
  \pgfutil@tempdima\tikz@time pt
  \ifdim\pgfutil@tempdima<.5pt\else % if we're at the return pos-ition we switch start and end
    \advance\pgfutil@tempdima-.5pt
    \let\pgf@tempa\tikz@timer@start
    \let\tikz@timer@start\tikz@timer@end
    \let\tikz@timer@end\pgf@tempa
  \fi
  \multiply\pgfutil@tempdima2
  \edef\tikz@time{\strip@pt\pgfutil@tempdima}%
  \tikz@timer@hvline}%

\def\tikz@parabola@semifinal#1{%
    \tikz@flush@moveto
    % Save original start:
    \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% %% Timer: save start position
    \pgf@xb=\tikz@lastx
    \pgf@yb=\tikz@lasty
    \tikz@make@last@position{#1}%
    \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% %% Timer: save target position
    \pgf@xc=\tikz@lastx
    \pgf@yc=\tikz@lasty
    \begingroup% now calculate bend:
        \let\tikz@after@path\pgfutil@empty
        \expandafter\tikzset\expandafter{\tikz@parabola@option}%
        \tikz@lastxsaved=\tikz@parabola@bend@factor\tikz@lastx
        \tikz@lastysaved=\tikz@parabola@bend@factor\tikz@lasty
        \advance\tikz@lastxsaved by\pgf@xb
        \advance\tikz@lastysaved by\pgf@yb
        \advance\tikz@lastxsaved by-\tikz@parabola@bend@factor\pgf@xb
        \advance\tikz@lastysaved by-\tikz@parabola@bend@factor\pgf@yb
        \expandafter\tikz@make@last@position\expandafter{\tikz@parabola@bend}%
        \edef\tikz@timer@middle{{\the\tikz@lastx}{\the\tikz@lasty}}% %% Timer: save bend postion
        % Calculate delta from bend
        \advance\pgf@xc by-\tikz@lastx
        \advance\pgf@yc by-\tikz@lasty
        % Ok, now calculate delta to bend
        \advance\tikz@lastx by-\pgf@xb
        \advance\tikz@lasty by-\pgf@yb
        \edef\tikz@marshall{%
          \noexpand\let\noexpand\tikz@timer\noexpand\tikz@timer@parabola
          \noexpand\edef\noexpand\tikz@timer@middle{\noexpand\pgfqpoint\tikz@timer@middle}%
          \noexpand\pgfpathparabola{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
        }%
    \expandafter\endgroup%
    \tikz@marshall
    \expandafter\tikz@scan@next@command\tikz@after@path%
}%

\def\tikz@timer@parabola{% following calculations, see \def of \pgfpathparabola in pgfcorepathconstruct.code.tex (l. 1261)
  \ifdim\tikz@time pt<.5pt\relax % first part
    \pgf@process{\tikz@timer@middle}%
    \pgf@xc\pgf@x\pgf@yc\pgf@y
    \pgf@xb\pgf@x\pgf@yb\pgf@y
    \pgf@process{\tikz@timer@start}%
    \advance\pgf@xc-\pgf@x\pgf@xc.1125\pgf@xc
    \advance\pgf@xc\pgf@x                 % = start_x + .1125 (middle_x - start_x)
    \advance\pgf@yc-\pgf@y\pgf@yc.225\pgf@yc
    \advance\pgf@yc\pgf@y                 % = start_y + .225 (middle_y - start_y)
    \advance\pgf@xb\pgf@x\pgf@xb.5\pgf@xb % = .5 (middle_x + start_x) = start_x + .5 (middle_x - start_x)
    \pgf@xa=\tikz@time pt%
    \pgf@xa=2\pgf@xa                      % = 2 * \tikz@time
    \edef\tikz@marshall{\noexpand\pgftransformcurveattime{\strip@pt\pgf@xa}{\noexpand\tikz@timer@start}%
      {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
      {\noexpand\tikz@timer@middle}}%
  \else % second part
    \pgf@process{\tikz@timer@end}%
    \pgf@xc\pgf@x
    \pgf@xb\pgf@x
    \pgf@yb\pgf@y
    \pgf@process{\tikz@timer@middle}%
    \advance\pgf@xc\pgf@x\pgf@xc.5\pgf@xc % = .5 (end_x + middle_x) = middle_x + .5 (end_x - middle_x)
    \advance\pgf@xb-\pgf@x\pgf@xb.8875\pgf@xb
    \advance\pgf@xb\pgf@x                 % = middle_x + .8875 (end_x - middle_x)
    \advance\pgf@yb-\pgf@y\pgf@yb.775\pgf@yb
    \advance\pgf@yb\pgf@y                 % = middle_y + .775 (end_y - middle_y)
    \pgf@xa=\tikz@time pt%
    \advance\pgf@xa-.5pt%
    \pgf@xa=2\pgf@xa                      % = 2 (\tikz@zime - .5)
    \edef\tikz@marshall{\noexpand\pgftransformcurveattime{\strip@pt\pgf@xa}{\noexpand\tikz@timer@middle}%
      {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@y}}%
      {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
      {\noexpand\tikz@timer@end}}%
  \fi
  \tikz@marshall
}

\def\tikz@timer@sine{% following calculations, see \def of \pgfpathsine in pgfcorepathconstruct.code.tex (l. 1315)
  \pgf@process{\tikz@timer@end}%
  \pgf@xc\pgf@x\pgf@yc\pgf@y
  \pgf@xb\pgf@x\pgf@yb\pgf@y
  \pgf@process{\tikz@timer@start}%
  \advance\pgf@xc-\pgf@x\pgf@xc.3260\pgf@xc
  \advance\pgf@xc\pgf@x                     % = start_x + .3260 (end_x - start_x)
  \advance\pgf@yc-\pgf@y\pgf@yc.5120\pgf@yc
  \advance\pgf@yc\pgf@y                     % = start_y + .5120 (end_y - start_y)
  \advance\pgf@xb-\pgf@x\pgf@xb.6380\pgf@xb % = start_x + .6380 (end_x - start_x)
  \advance\pgf@xb\pgf@x
  \edef\tikz@marshall{\noexpand\pgftransformcurveattime{\tikz@time}{\noexpand\tikz@timer@start}%
    {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
    {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
    {\noexpand\tikz@timer@end}}%
  \tikz@marshall
}
\def\tikz@timer@cosine{% following calculations, see \def of \pgfpathcosine in pgfcorepathconstruct.code.tex (l. 1345)
  \pgf@process{\tikz@timer@end}%
  \pgf@xc\pgf@x\pgf@yc\pgf@y
  \pgf@xb\pgf@x\pgf@yb\pgf@y
  \pgf@process{\tikz@timer@start}%
  \advance\pgf@xb-\pgf@x\pgf@xb.6740\pgf@xb
  \advance\pgf@xb\pgf@x                     % = start_x + .6740 (end_x - start_x)
  \advance\pgf@yb-\pgf@y\pgf@yb.4880\pgf@yb
  \advance\pgf@yb\pgf@y                     % = start_y + .4880 (end_y - start_y)
  \advance\pgf@xc-\pgf@x\pgf@xc.3620\pgf@xc % = start_x + .3620 (end_x - start_x)
  \advance\pgf@xc\pgf@x
  \edef\tikz@marshall{\noexpand\pgftransformcurveattime{\tikz@time}{\noexpand\tikz@timer@start}%
    {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@y}}%
    {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
    {\noexpand\tikz@timer@end}}%
  \tikz@marshall
}

\tikzset{
  rectangle timer/.is choice,
  rectangle timer/line/.code=\let\tikz@timer@rectangle\tikz@timer@line,
  rectangle timer/rectangle/.code=\let\tikz@timer@rectangle\tikzext@timer@rectangle,
  rectangle timer=rectangle
}
\endinput