\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/systemlayer/pgfsys-dvips.def,v 1.9 2005/10/18 18:03:38 tantau Exp $

% Copyright 2005 by Till Tantau <tantau@cs.tu-berlin.de>.
%
% This program can be redistributed and/or modified under the terms
% of the GNU Public License, version 2.




% Driver commands for dvips

%
% Load common postscript commands:
%
\input pgfsys-common-postscript.def


%
% dvips-specific stuff:
%
\def\pgfsys@invoke#1{\special{ps:: #1}}
\def\pgfsys@outerinvoke#1{\special{ps: #1}}

\def\pgfsys@beginpicture{\special{ps: }\special{ps::[begin]}\pgfsys@invoke{pgfo}}
\def\pgfsys@endpicture{\pgfsys@invoke{pgfc}\special{ps::[end]}}
\def\pgfsys@hbox#1{%
  \pgfsys@invoke{pgfs}%
    \special{ps::[end]}%
      \wd#1=0pt%
      \ht#1=0pt%
      \dp#1=0pt%
      \box#1
    \special{ps::[begin]}%
  \pgfsys@invoke{pgfr}%
}
\def\pgfsys@begininvisible{%
  \special{ps::[begin]}%
  \pgfsys@invoke{gsave nulldevice}%
  \special{ps::[end]}}
\def\pgfsys@endinvisible{%
  \special{ps::[begin]}%
  \pgfsys@invoke{grestore}%
  \special{ps::[end]}%
}
\def\pgfsys@color@unstacked#1{\special{ps: \XC@usecolor{#1}}}
\newcount\pgf@objectcount
\def\pgfsys@defobject#1#2#3#4{%
  \global\advance\pgf@objectcount by 1
  \expandafter\xdef\csname#1\endcsname{\the\pgf@objectcount}
  \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
  {%
    \pgfsysprotocol@setcurrentprotocol\@empty%
    \pgfsysprotocol@bufferedtrue%
    #4%
    \pgfsysprotocol@getcurrentprotocol\pgfsys@@temp%
    \special{! /pgf\csname#1\endcsname{gsave exec \pgfsys@@temp\space grestore} bind def}%
  }%
  \pgfsysprotocol@setcurrentprotocol\pgfsys@temp%
}
\def\pgfsys@useobject#1#2{%
  \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
  {%
    \pgfsysprotocol@setcurrentprotocol\@empty%
    \pgfsysprotocol@bufferedfalse%
    #2%
    \pgfsysprotocol@invokecurrentprotocol%
    \pgfsys@invoke{pgf\csname#1\endcsname}%
  }%
  \pgfsysprotocol@setcurrentprotocol\pgfsys@temp}
\def\pgfsys@imagesuffixlist{epsi:eps:ps}
\def\pgfsys@horishading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \setlength\pgf@x{#2}%
    \pgf@xa=\pgf@x%
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@y=\pgf@max%
    \pgf@sys@bp@correct{\pgf@y}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{\hbox to \the\pgf@max{%
        \noexpand\vrule width0pt height\the\pgf@xa%
        \noexpand\pgfsys@beginpurepicture%
          \noexpand\pgfsys@rect{0pt}{0pt}{\the\pgf@y}{\the\pgf@x}%
          \noexpand\pgfsys@clipnext%
          \noexpand\pgfsys@discardpath%
          \noexpand\pgfsys@invoke{\pgf@domb\space \pgf@sys@tonumber{\pgf@x} pgfH \pgf@psfuncs\space pop}%
          \hss%
        \noexpand\pgfsys@endpurepicture}}%
  }%
}
\def\pgfsys@vertshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \setlength\pgf@x{#2}%
    \pgf@xa=\pgf@x%
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@y=\pgf@max%
    \pgf@sys@bp@correct{\pgf@y}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{\hbox to\the\pgf@xa{%
        \noexpand\vrule width0pt height\the\pgf@max%
        \noexpand\pgfsys@beginpurepicture%
          \noexpand\pgfsys@rect{0pt}{0pt}{\the\pgf@x}{\the\pgf@y}%
          \noexpand\pgfsys@clipnext%
          \noexpand\pgfsys@discardpath%
          \noexpand\pgfsys@invoke{\pgf@domb\space \pgf@sys@tonumber{\pgf@x} pgfV \pgf@psfuncs\space pop}%
          \hss%
        \noexpand\pgfsys@endpurepicture}}%
  }%
}
\def\pgfsys@radialshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgf@process{#2}%
    \pgf@xa=2\pgf@max%
    \pgf@sys@bp@correct{\pgf@max}%
    \advance\pgf@x by \pgf@max%
    \advance\pgf@y by \pgf@max%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{\hbox to \the\pgf@xa{%
        \noexpand\vrule width0pt height\the\pgf@xa%
        \noexpand\pgfsys@beginpurepicture%
          \noexpand\pgfsys@invoke{%
            \pgf@domb\space \pgf@sys@tonumber{\pgf@y} \pgf@sys@tonumber{\pgf@x} \pgf@sys@tonumber{\pgf@max} pgfR1
            \pgf@psfuncs\space \pgf@firstcolor\space \pgf@doma\space pgfR2}%
          \hss%
        \noexpand\pgfsys@endpurepicture}}%
  }%
}

\AtBeginDocument{
  % Always present specials.
  \special{!
    /pgfsc{}B% stroke color is empty by default
    /pgffc{}B% fill color is empty by default
    /pgfstr{stroke}B%
    /pgffill{fill}B%
    /pgfeofill{eofill}B%
    /pgfe{a dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}B% rectangle
    /pgfw{setlinewidth}B% setlinewidth
    /pgfs{save pgfpd 72 Resolution div 72 VResolution div neg scale 
      magscale{1 DVImag div dup scale}if 
      pgfx neg pgfy neg translate pgffoa .setopacityalpha}B% save
    /pgfr{pgfsd restore}B %restore
    userdict begin%
    /pgfo{pgfsd /pgfx currentpoint /pgfy exch def def @beginspecial}B %open
    /pgfc{newpath @endspecial pgfpd}B %close
    /pgfsd{globaldict /pgfdelta /delta where {pop delta} {0} ifelse put}B% save delta
    /pgfpd{/delta globaldict /pgfdelta get def}B % put delta
    /.setopacityalpha where {pop} {/.setopacityalpha{pop}def} ifelse % install .setopacityalpha 
    /.pgfsetfillopacityalpha{/pgffoa exch def
      /pgffill{gsave pgffoa .setopacityalpha fill 1 .setopacityalpha newpath fill grestore}B
      /pgfeofill{gsave pgffoa .setopacityalpha eofill1 .setopacityalpha newpath eofill grestore}B}B
    /.pgfsetstrokeopacityalpha{/pgfsoa exch def
      /pgfstr{gsave pgfsoa .setopacityalpha stroke grestore}B}B
    /pgffoa 1 def
    /pgfsoa 1 def
    end
    }
  
  % Parameters to horizontal pre axishade: \pgf@domb x
  \special{! /pgfH{%
      /pgfheight exch def 0.75 setlinewidth [] 0 setdash
      /pgfshade {pgfA} def /pgfdir { dup 0 moveto
        dup 5 index lineto } bind def} B}%
  
  % Parameters to vertical pre axishade: \pgf@domb x
  \special{! /pgfV{%
      /pgfheight exch def 0.75 setlinewidth [] 0 setdash
      /pgfshade {pgfA} def /pgfdir { dup 0 exch moveto dup 5 index
        exch lineto } bind def} B}%
  
  % Parameters to axishade: end x, start x, r-, g-, b- of first color, r-, g-, b- of second color
  % Stack afterwards: end x
  \special{! /pgfA{
      /pgfdiff 8 index round cvi 8 index round cvi sub 2 mul 1 add def
      2 index 6 index sub pgfdiff div % put red-step on stack
      2 index 6 index sub pgfdiff div % put green-step on stack
      2 index 6 index sub pgfdiff div % put green-step on stack
      pgfheight 9 index 9 index 9 index 14 index
      pgfdiff {
        3 index 3 index 3 index setrgbcolor % Set color
        pgfdir
        stroke
        4 -1 roll 7 index add % red += incred
        4 -1 roll 6 index add % green += incgreen
        4 -1 roll 5 index add % blue += incblue
        4 -1 roll .5 sub % x += 0.5
      } repeat      
      mark 15 1 roll cleartomark exch pop % leave only start x on stack
    }B }

  % Parameters to radialshade pre: \pgf@domb y x max
  \special{! /pgfR1{
      newpath dup dup dup 0 360 arc clip newpath
      dup /pgfendx exch def
      /pgfendy exch def
      0.875 setlinewidth
      [] 0 setdash
      /pgfshade {pgfR} def
      /pgfstartx exch def
      /pgfstarty exch def
      /pgfdiffx pgfendx pgfstartx sub def
      /pgfdiffy pgfendy pgfstarty sub def
      dup /pgfdomb exch def
    }B }

  % Parameters to radialshade post: \pgf@firstcolor \pgf@doma
  \special{! /pgfR2{ 
      newpath 0.5 add pgfcircx pgfcircy 3 2 roll 0 360 arc
      setrgbcolor fill pop}B }%

  % Parameters to radialshade: end x, start x, r-, g-, b- of first color, r-, g-, b- of second color
  % Stack afterwards: end x
  \special{! /pgfR{
      /pgfdiff 8 index round cvi 8 index round cvi sub 4 mul 1 add def
      /pgfcircx pgfstartx 9 index pgfdiffx pgfdomb div mul add def
      /pgfcircy pgfstarty 9 index pgfdiffy pgfdomb div mul add def
      /pgfcircxe pgfstartx 8 index pgfdiffx pgfdomb div mul add def
      /pgfcircye pgfstarty 8 index pgfdiffy pgfdomb div mul add def
      /pgfxstep pgfcircxe pgfcircx sub pgfdiff div def
      /pgfystep pgfcircye pgfcircy sub pgfdiff div def
      2 index 6 index sub pgfdiff div % put red-step on stack
      2 index 6 index sub pgfdiff div % put green-step on stack
      2 index 6 index sub pgfdiff div % put green-step on stack
      8 index 8 index 8 index 13 index
      pgfdiff {
        3 index 3 index 3 index setrgbcolor % Set color
        pgfcircx pgfcircy 2 index 0 360 arc closepath
        stroke
        4 -1 roll 6 index add % red += incred
        4 -1 roll 5 index add % green += incgreen
        4 -1 roll 4 index add % blue += incblue
        4 -1 roll .25 sub % x += 0.25
        /pgfcircx pgfcircx pgfxstep add def
        /pgfcircy pgfcircy pgfystep add def
      } repeat      
      mark 14 1 roll cleartomark exch pop % leave only start x on stack
    }B}
}

\endinput

%%% Local Variables: 
%%% mode: latex
%%% End: 
