% Copyright 2018 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{tikzlibrarybackgrounds.code.tex}


% Layers

\pgfdeclarelayer{background}%
\pgfsetlayers{background,main}%


% Switch command
\tikzset{on background layer/.style={
    execute at begin scope={%
      \pgfonlayer{background}%
      \let\tikz@options=\pgfutil@empty%
      \tikzset{every on background layer/.try,#1}%
      \tikz@options},
    execute at end scope={\endpgfonlayer}
  }
}%


% Main style

\tikzset{background rectangle/.style= {draw}}%
\tikzset{background top/.style=       {draw}}%
\tikzset{background bottom/.style=    {draw}}%
\tikzset{background left/.style=      {draw}}%
\tikzset{background right/.style=     {draw}}%
\tikzset{background grid/.style=      {help lines,draw}}%

\tikzoption{inner frame sep}{\def\tikz@framexsep{#1}\def\tikz@frameysep{#1}}%
\tikzoption{inner frame xsep}{\def\tikz@framexsep{#1}}%
\tikzoption{inner frame ysep}{\def\tikz@frameysep{#1}}%
\def\tikz@framexsep{1ex}%
\def\tikz@frameysep{1ex}%

\tikzoption{outer frame sep}{\def\tikz@outerframexsep{#1}\def\tikz@outerframeysep{#1}}%
\tikzoption{outer frame xsep}{\def\tikz@outerframexsep{#1}}%
\tikzoption{outer frame ysep}{\def\tikz@outerframeysep{#1}}%
\def\tikz@outerframexsep{0ex}%
\def\tikz@outerframeysep{0ex}%


% Looseness

\tikzset{loose background/.style=     {inner frame sep=2ex}}%
\tikzset{tight background/.style=     {inner frame sep=0ex}}%



% Showing background styles

\tikzset{framed/.style=                   {style=show background rectangle}}%
\tikzset{gridded/.style=                  {style=show background grid}}%

\tikzset{show background rectangle/.style={execute at end picture=\tikz@background@framed}}%
\tikzset{show background top/.style=      {execute at end picture=\tikz@background@top}}%
\tikzset{show background bottom/.style=   {execute at end picture=\tikz@background@bottom}}%
\tikzset{show background left/.style=     {execute at end picture=\tikz@background@left}}%
\tikzset{show background right/.style=    {execute at end picture=\tikz@background@right}}%
\tikzset{show background grid/.style=     {execute at end picture=\tikz@background@grid}}%


% Implementation

\def\tikz@background@save{%
  \pgftransformreset%
  \ifx\tikz@bg@minx\@undefined%
    \pgf@xb=\pgf@picminx%
    \pgf@yb=\pgf@picminy%
    \pgf@xc=\pgf@picmaxx%
    \pgf@yc=\pgf@picmaxy%
    \pgfmathsetlength{\pgf@x}{\tikz@framexsep}%
    \pgfmathsetlength{\pgf@y}{\tikz@frameysep}%
    \advance\pgf@xb by-\pgf@x%
    \advance\pgf@yb by-\pgf@y%
    \advance\pgf@xc by\pgf@x%
    \advance\pgf@yc by\pgf@y%
    \edef\tikz@bg@minx{\the\pgf@xb}%
    \edef\tikz@bg@miny{\the\pgf@yb}%
    \edef\tikz@bg@maxx{\the\pgf@xc}%
    \edef\tikz@bg@maxy{\the\pgf@yc}%
    \pgfmathsetlength{\pgf@x}{\tikz@outerframexsep}%
    \pgfmathsetlength{\pgf@y}{\tikz@outerframeysep}%
    \advance\pgf@xb by-\pgf@x%
    \advance\pgf@yb by-\pgf@y%
    \advance\pgf@xc by\pgf@x%
    \advance\pgf@yc by\pgf@y%
    \edef\tikz@bg@outerminx{\the\pgf@xb}%
    \edef\tikz@bg@outerminy{\the\pgf@yb}%
    \edef\tikz@bg@outermaxx{\the\pgf@xc}%
    \edef\tikz@bg@outermaxy{\the\pgf@yc}%
  \fi%
}%

\def\tikz@background@framed{%
  \tikz@background@save%
  \pgfonlayer{background}
    \path[style=background rectangle] (\tikz@bg@minx,\tikz@bg@miny) rectangle (\tikz@bg@maxx,\tikz@bg@maxy);
  \endpgfonlayer
}%

\def\tikz@background@top{%
  \tikz@background@save%
  \pgfonlayer{background}
    \path[style=background top] (\tikz@bg@outerminx,\tikz@bg@maxy) -- (\tikz@bg@outermaxx,\tikz@bg@maxy);
  \endpgfonlayer
}%

\def\tikz@background@bottom{%
  \tikz@background@save%
  \pgfonlayer{background}
    \path[style=background bottom] (\tikz@bg@outerminx,\tikz@bg@miny) -- (\tikz@bg@outermaxx,\tikz@bg@miny);
  \endpgfonlayer
}%

\def\tikz@background@left{%
  \tikz@background@save%
  \pgfonlayer{background}
    \path[style=background left] (\tikz@bg@minx,\tikz@bg@outerminy) -- (\tikz@bg@minx,\tikz@bg@outermaxy);
  \endpgfonlayer
}%

\def\tikz@background@right{%
  \tikz@background@save%
  \pgfonlayer{background}
    \path[style=background right] (\tikz@bg@maxx,\tikz@bg@outerminy) -- (\tikz@bg@maxx,\tikz@bg@outermaxy);
  \endpgfonlayer
}%

\def\tikz@background@grid{%
  \tikz@background@save%
  \pgfonlayer{background}
    \path[style=background grid] (\tikz@bg@minx,\tikz@bg@miny) grid (\tikz@bg@maxx,\tikz@bg@maxy);
  \endpgfonlayer
}%


\endinput
