% 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.

\ProvidesFileRCS{tikzlibraryspy.code.tex}



% Spy styles

\tikzset{
  spy using outlines/.style={
    spy scope={
      every spy on node/.style={very thin,draw},
      every spy in node/.style={thick,draw},
      #1
    }
  },
  spy using overlays/.style={
    spy scope={
      every spy on node/.style={fill,fill opacity=0.2,text opacity=1},
      every spy in node/.style={fill,fill opacity=0.2,text opacity=1},
      #1
    }
  },
  connect spies/.style={
    spy connection path={\draw[thin] (tikzspyonnode) -- (tikzspyinnode);}
  }
}%

\newbox\tikz@lib@spybox

\let\tikz@lib@spy@collection=\pgfutil@empty%

\tikzset{spy scope/.style={
    size/.style={minimum size=##1},
    height/.style={minimum height=##1},
    width/.style={minimum width=##1},
    execute at begin scope={%
      \let\tikz@lib@spy@save=\tikz@lib@spy@collection%
      \setbox\tikz@lib@spybox=\hbox\bgroup\bgroup%
      \let\spy=\tikz@lib@spy@parse},
    execute at end scope={%
      \egroup\egroup%
      {%
        \copy\tikz@lib@spybox%
        \tikz@lib@spy@collection%
      }%
      \global\let\tikz@lib@spy@collection=\tikz@lib@spy@save%
    },%
    tikz@lib@spy@style/.style={#1},
    tikz@lib@reset@gs
  },
  lens/.store in=\tikz@lib@spy@lens,
  lens=,
  magnification/.style={lens={scale=#1}},
  spy connection path/.store in=\tikz@lib@spy@path,
  spy connection path=
}%

\tikzset{
  tikz@lib@reset@gs/.style={black,thin,solid,opaque,line cap=butt,line join=miter}
}%

\def\tikz@lib@spy@parse{%
  \pgfutil@ifnextchar[{\tikz@lib@spy@parse@opt}{\tikz@lib@spy@parse@opt[]}%]
}%
\def\tikz@lib@spy@parse@opt[#1]{
  \pgfutil@ifnextchar x{\tikz@lib@spy@parse@opta[#1]}{\tikz@lib@spy@parse@opta[#1]}%]
}%
\def\tikz@lib@spy@parse@opta[#1]on#2in node#3;{%
  \pgfutil@g@addto@macro\tikz@lib@spy@collection{\tikz@lib@spy@do{#1}{#2}{#3}}%
}%

\def\tikz@lib@spy@do#1#2#3{%
  \scope[tikz@lib@spy@style,#1]
    \node [alias=tikzspyonnode,inner sep=0pt,outer sep=0pt,every spy on node/.try,
    /utils/exec={
      {%
        \let\tikz@transform=\relax
        \pgftransformreset%
        \expandafter\tikzset\expandafter{\tikz@lib@spy@lens}
        \pgftransforminvert%
        \pgfgettransformentries\a\b\c\d\e\f%
        \global\let\pgf@lib@svg@a=\a%
        \global\let\pgf@lib@svg@b=\b%
        \global\let\pgf@lib@svg@c=\c%
        \global\let\pgf@lib@svg@d=\d%
      }%
      \tikz@addtransform{%
        \tikz@scan@one@point\pgftransformshift#2%
        \pgftransformcm{\pgf@lib@svg@a}{\pgf@lib@svg@b}{\pgf@lib@svg@c}{\pgf@lib@svg@d}{\pgfpointorigin}%
      }
    }]{};
    \expandafter\pgfutil@switch\expandafter\pgfutil@ifstrequal\expandafter{\tikz@anchor}{%
      {north}     {\def\tikz@spy@anchor{south}}%
      {north east}{\def\tikz@spy@anchor{south west}}%
      {east}      {\def\tikz@spy@anchor{west}}%
      {south east}{\def\tikz@spy@anchor{north west}}%
      {south}     {\def\tikz@spy@anchor{north}}%
      {south west}{\def\tikz@spy@anchor{north east}}%
      {west}      {\def\tikz@spy@anchor{east}}%
      {north west}{\def\tikz@spy@anchor{south east}}%
    }{}{\def\tikz@spy@anchor{center}}%
    \node [alias=tikzspyinnode,inner sep=0pt,outer sep=0pt,at={#2},every spy in node/.try,
    path picture={\node[anchor=\tikz@spy@anchor,tikz@lib@reset@gs]{\nullfont%
        \pgfpicture\relax\pgfsetbaseline{default}\pgfsettrimleft{default}\pgfsettrimright{default}%
        \pgftransformreset%
        \let\tikz@transform=\relax%
        \expandafter\tikzset\expandafter{\tikz@lib@spy@lens}%
        \pgflowlevelsynccm%
        \tikz@scan@one@point\tikz@lib@spy@shift#2%
        \pgflowlevelsynccm%
        \copy\tikz@lib@spybox%
        \endpgfpicture};}]#3{};
    \tikz@lib@spy@path
  \endscope
}%

\def\tikz@lib@spy@shift#1{%
  \pgf@process{#1}%
  \pgf@x=-\pgf@x%
  \pgf@y=-\pgf@y%
  \pgftransformshift{}%
}%



\endinput
