%% BEGIN pst-fill.tex
%%
%% Defines the \psboxfill macro.
%% For use with PSTricks v0.94 (or perhaps later).
%%
\def\fileversion{0.94-97}
\def\filedate{1997/04/08}
%%
%% COPYRIGHT 1994, by Timothy Van Zandt, tvz@Princeton.EDU
%% See pstricks.tex or pstricks.doc for copying restrictions.

%% Note (D.G. - 8 April 97):
%% * Without \PstTilingtrue defined (or "tiling" optional parameter
%%   on \usepackage[tiling]{pst-fill}), this file run exactly as
%%   the original boxfill.tex file from Timothy, version 0.94,
%%   except a correction in \pst@ManualFillCycle to avoid
%%   a division by 0.
%%   It's the default.
%% * With \PstTilingtrue defined (or "tiling" optional parameter
%%   on \usepackage[tiling]{pst-fill}) there are several add-ons
%%   and changes to do `tiling' rather than `filling'
%%   (we must fix position of beginning of tiling and we allow
%%   overriding of tiles using fillmovex and fillmovey parameters).

% Preliminaries:

\message{ v\fileversion, \filedate}

\csname PSTboxfillLoaded\endcsname
\let\PSTboxfillLoaded\endinput

\ifx\PSTricksLoaded\endinput\else
  \def\next{\input pstricks.tex}
  \expandafter\next
\fi

\edef\TheAtCode{\the\catcode`\@}
\catcode`\@=11

% The box:

\newbox\pst@fillbox
\def\psboxfill{\pst@killglue\pst@makebox\psboxfill@i}
\def\psboxfill@i{\setbox\pst@fillbox\box\pst@hbox\ignorespaces}

% Parameters:

\def\psset@boxfillsize#1{%
  \def\pst@tempg{#1}\def\pst@temph{auto}%
  \ifx\pst@tempg\pst@temph
    \let\psk@boxfillsize\relax
  \else
    \psset@@boxfillsize#1(\z@,\z@)\@empty(\z@,\z@)(\@nil
  \fi}
\def\psset@@boxfillsize#1(#2,#3)#4(#5,#6)#7(#8\@nil{%
  \begingroup
    \ifx\@empty#7\relax
      \pst@dima\z@
      \pst@dimb\z@
      \pssetxlength\pst@dimc{#2}%
      \pssetylength\pst@dimd{#3}%
    \else
      \pssetxlength\pst@dima{#2}%
      \pssetylength\pst@dimb{#3}%
      \pssetxlength\pst@dimc{#5}%
      \pssetylength\pst@dimd{#6}%
    \fi
    \xdef\pst@tempg{%
      \pst@dima=\number\pst@dima sp
      \pst@dimb=\number\pst@dimb sp
      \pst@dimc=\number\pst@dimc sp
      \pst@dimd=\number\pst@dimd sp }%
  \endgroup
  \let\psk@boxfillsize\pst@tempg}

\psset{boxfillsize={(-15cm,-15cm)(15cm,15cm)}}

\def\psset@boxfillcolor#1{\pst@getcolor{#1}\psboxfillcolor}
\psset@boxfillcolor{black}

\def\psset@boxfillangle#1{\pst@getangle{#1}\psk@boxfillangle}
\psset@boxfillangle{0}

\def\psset@fillsepx#1{\pst@getlength{#1}\psk@fillsepx}
\def\psset@fillsepy#1{\pst@getlength{#1}\psk@fillsepy}
\def\psset@fillsep#1{\psset@fillsepx{#1}\let\psk@fillsepy\psk@fillsepx}
\psset@fillsep{2pt}

\def\psset@fillcycle#1{\pst@getint{#1}\psk@fillcycle}
\psset@fillcycle{0}

% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> -  8 Apr. 1997
\ifx\PstTiling\@undefined
\else
% Define fillloopcoef parameter
\def\psset@fillloopcoef#1{\pst@getint{#1}\psk@fillloopcoef}
\psset@fillloopcoef{12}
% Define fillmove, fillmovex and fillmovey parameters for tiling
\def\psset@fillmovex#1{\pst@getlength{#1}\psk@fillmovex}
\def\psset@fillmovey#1{\pst@getlength{#1}\psk@fillmovey}
\def\psset@fillmove#1{\psset@fillmovex{#1}\let\psk@fillmovey\psk@fillmovex}
\psset@fillmove{0pt}
\fi
% End modification D.G.

% Main macro:

\def\psfs@boxfill{%
  \ifvoid\pst@fillbox
    \@pstrickserr{Fill box is empty. Use \string\psboxfill\space first.}\@ehpa
  \else
    \ifx\psk@boxfillsize\relax
      \pst@AutoBoxFill
    \else
      \pst@ManualBoxFill
    \fi
  \fi}

% Manual box fill:

\def\pst@ManualBoxFill{%
  \leavevmode
  \begingroup
    \pst@FlushCode
    \begin@psclip
    \pstVerb{clip}%
    \expandafter\pst@AddFillBox\psk@boxfillsize
    \end@psclip
  \endgroup}

\def\pst@FlushCode{%
  \pst@Verb{%
    /mtrxc CM def
    CP CP T
    \tx@STV
    \psk@origin
    \psk@swapaxes
    \pst@newpath
    \pst@code
    mtrxc setmatrix
    moveto
    0 setgray}%
  \gdef\pst@code{}}

\def\pst@AddFillBox#1 #2 #3 #4 {%
  \begingroup
    \setbox\pst@fillbox=\vbox{%
      \hbox{\unhcopy\pst@fillbox\kern\psk@fillsepx\p@}%
      \vskip\psk@fillsepy\p@}%
    \psk@boxfillsize
    \pst@cnta=\pst@dimc
    \advance\pst@cnta-\pst@dima
    \divide\pst@cnta\wd\pst@fillbox
    \pst@cntb=\pst@dimd
    \advance\pst@cntb-\pst@dimb
    \pst@dimd=\ht\pst@fillbox
    \divide\pst@cntb\pst@dimd
    \def\pst@tempa{%
      \pst@tempg
      \copy\pst@fillbox
      \advance\pst@cntc\@ne
      \ifnum\pst@cntc<\pst@cntd\expandafter\pst@tempa\fi}%
    \let\pst@tempg\relax
    \pst@cntc-\tw@
    \pst@cntd\pst@cnta
    \setbox\pst@fillbox=\hbox to \z@{%
      \kern\pst@dima
      \kern-\wd\pst@fillbox
      \pst@tempa
      \hss}%
    \pst@cntd\pst@cntb
    \ifnum\psk@fillcycle=\z@\pst@ManualFillCycle\fi
    \global\setbox\pst@boxg=\vbox to\z@{%
      \offinterlineskip
      \vss
      \pst@tempa
      \vskip\pst@dimb}%
  \endgroup
  \setbox\pst@fillbox\box\pst@boxg
  \pst@rotate\psk@boxfillangle\pst@fillbox
  \box\pst@fillbox}

\def\pst@ManualFillCycle{%
  \pst@cntg=\psk@fillcycle
  \pst@dimg=\wd\pst@fillbox
% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> - 20 Mar. 1997
% To avoid division by 0
%  \divide\pst@dimg\pst@cntg
  \ifnum\pst@cntg=\z@
  \else
  \divide\pst@dimg\pst@cntg
  \fi
% End modification D.G.
  \ifnum\pst@cntg<\z@\pst@cntg=-\pst@cntg\fi
  \advance\pst@cntg\m@ne
  \pst@cnth=\pst@cntg
  \def\pst@tempg{%
    \ifnum\pst@cnth<\pst@cntg\advance\pst@cnth\@ne\else\pst@cnth\z@\fi
    \moveright\pst@cnth\pst@dimg}}

% Auto box fill:        !! Fix dictionary

\pst@def{AutoFillCycle}<%
  /c ED
  /n 0 def
  /s {
    /x x w c div n mul add def
    /n n c abs 1 sub lt { n 1 add } { 0 } ifelse def
  } def>

% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> -  8 Apr. 1997
\ifx\PstTiling\@undefined
% Original version
\pst@def{BoxFill}<%
  gsave
    gsave \tx@STV CM grestore dtransform CM idtransform
    abs /h ED abs /w ED
    pathbbox
    h div round 2 add cvi /y2 ED
    w div round 2 add cvi /x2 ED
    h div round 2 sub cvi /y1 ED
    w div round 2 sub cvi /x1 ED
    /y2 y2 y1 sub def
    /x2 x2 x1 sub def
    CP
    y1 h mul sub neg /y1 ED
    x1 w mul sub neg /x1 ED
    clip
    y2 {
      /x x1 def
      s
      x2 {
        save CP x y1 T moveto Box restore
        /x x w add def
      } repeat
      /y1 y1 h add def
    } repeat
% Next line not useful... To see that, suppress clipping (D.G.)
    CP x y1 T moveto Box
  currentpoint currentfont grestore setfont moveto>
\else
% Modified version (D.G.)
\pst@def{BoxFill}<%
  gsave
    gsave \tx@STV CM grestore dtransform CM idtransform
    abs /h ED abs /w ED
    pathbbox
    h div round 2 add cvi /y2 ED
    w div round 2 add cvi /x2 ED
    h div round 2 sub cvi /y1 ED
    w div round 2 sub cvi /x1 ED
% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> -  6 Mar. 1997
% We must fix the origin of tiling, and it must not vary according other stuff
% in the page!
% It's clearly not the best solution and it slow it really but nevertheless
% it's better than nothing...
%    /y2 y2 y1 sub def
%    /x2 x2 x1 sub def
    w x1 \psk@fillloopcoef add mul h y1 \psk@fillloopcoef add mul moveto
    /y2 y2 y1 sub \psk@fillloopcoef add def
    /x2 x2 x1 sub \psk@fillloopcoef add def
% End modification D.G.
    CP
    y1 h mul sub neg /y1 ED
    x1 w mul sub neg /x1 ED
    clip
% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> -  8 Apr. 1997
%    y2 {
%      /x x1 def
%      s
%      x2 {
%        save CP x y1 T moveto Box restore
%        /x x w add def
%      } repeat
%      /y1 y1 h add def
%    } repeat
%    CP x y1 T moveto Box
    \psk@fillmovex \psk@fillmovey
    gsave \tx@STV CM grestore dtransform CM idtransform
    /hmove ED /wmove ED
    save
    y2 {
       /x x1 def
       s
       save
       x2 {
          save CP x y1 T moveto Box restore
          /x x w add def
          0 hmove translate
          } repeat
       restore
       /y1 y1 h add def
       wmove 0 translate
       } repeat
    restore
% End modification D.G.
  currentpoint currentfont grestore setfont moveto>
\fi

\def\pst@AutoBoxFill{%
  \leavevmode
  \begingroup
    \pst@FlushCode
    \pst@Verb{\psk@boxfillangle \tx@RotBegin}%
    \pstVerb{\pst@dict /Box \pslbrace end}%
% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> - 10 Mar. 1997
    \ifx\PstTiling\@undefined
    \else
      \def\pst@temph{0}%
      \ifx\pst@tempa\pst@temph
      \else
        \pstVerb{/TR{pop pop currentpoint translate \pst@tempa translate}def}%
      \fi
    \fi
% End modification D.G.
    \hbox to \z@{\vbox to\z@{\vss\copy\pst@fillbox\vskip-\dp\pst@fillbox}\hss}%
    \pstVerb{%
        tx@Dict begin \psrbrace def
        \ifnum\psk@fillcycle=\z@
          /s {} def
        \else
          \psk@fillcycle \tx@AutoFillCycle
        \fi
        \pst@number{\wd\pst@fillbox}%
        \psk@fillsepx add
        \pst@number{\ht\pst@fillbox}%
        \pst@number{\dp\pst@fillbox}%
        \psk@fillsepy add add
        \tx@BoxFill
      end}%
    \pst@Verb{\tx@RotEnd}%
  \endgroup}

\catcode`\@=\TheAtCode\relax

\endinput

%% END pst-fill.tex
