% Copyright 2006 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[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/pgflibraryplothandlers.code.tex,v 1.15 2010/05/31 10:11:22 tantau Exp $

\newif\ifpgf@plot@started


% This handler converts each plot stream command into a curveto
% command, except for the first, which is converted to the previously
% specified action.
%
% Example:
%
% \pgfpathmoveto{\pgfpointorigin}
% \pgfsetlinetofirstplotpoint
% \pgfplothandlercurveto
% \pgfplotxyfile{mytable}

\def\pgfplothandlercurveto{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@initial%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgf@plot@curveto@handler@finish%
    \global\pgf@plot@startedfalse%
  }%
}

\def\pgf@plot@curveto@handler@initial#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \pgf@plot@first@action{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \xdef\pgf@plot@curveto@first{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \global\let\pgf@plot@curveto@first@support=\pgf@plot@curveto@first%
  \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@second%
}

\def\pgf@plot@curveto@handler@second#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@curveto@second{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@third%
  \global\pgf@plot@startedtrue%
}

\def\pgf@plot@curveto@handler@third#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@curveto@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  % compute difference vector:
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \pgf@process{\pgf@plot@curveto@first}
  \advance\pgf@xa by-\pgf@x%
  \advance\pgf@ya by-\pgf@y%
  % compute support directions:
  \pgf@xa=\pgf@plottension\pgf@xa%
  \pgf@ya=\pgf@plottension\pgf@ya%
  % first marshal:
  \pgf@process{\pgf@plot@curveto@second}%
  \pgf@xb=\pgf@x%
  \pgf@yb=\pgf@y%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \advance\pgf@xb by-\pgf@xa%
  \advance\pgf@yb by-\pgf@ya%
  \advance\pgf@xc by\pgf@xa%
  \advance\pgf@yc by\pgf@ya%
  \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@curveto@first@support}%
    {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@curveto@second}}%
  {\pgf@marshal}%
  % Prepare next:
  \global\let\pgf@plot@curveto@first=\pgf@plot@curveto@second%
  \global\let\pgf@plot@curveto@second=\pgf@plot@curveto@current%
  \xdef\pgf@plot@curveto@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
}

\def\pgf@plot@curveto@handler@finish{%
  \ifpgf@plot@started%
    \pgfpathcurveto{\pgf@plot@curveto@first@support}{\pgf@plot@curveto@second}{\pgf@plot@curveto@second}%
  \fi%
}


% This commands sets the tension for smoothing of plots.
%
% #1 = tension of curves. A value of 1 will yield a circle when the
%      control points are at quarters of a circle. A smaller value
%      will result in a tighter curve. Default is 0.5. 
%
% Example:
%
% \pgfsetplottension{0.2}

\def\pgfsetplottension#1{%
  \pgf@x=#1pt\relax%
  \pgf@x=0.2775\pgf@x\relax%
  \edef\pgf@plottension{\pgf@sys@tonumber\pgf@x}}
\pgfsetplottension{0.5}


% This handler converts the plot stream command into a curveto
% command that is closed using a closepath.
%
% Example:
%
% \pgfpathmoveto{\pgfpointorigin}
% \pgfplothandlerclosedcurve
% \pgfplotxyfile{mytable}

\def\pgfplothandlerclosedcurve{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@initial%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgf@plot@closedcurve@handler@finish%
  }%
}

\def\pgf@plot@closedcurve@handler@initial#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \xdef\pgf@plot@closedcurve@initial{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@second%
  \global\pgf@plot@startedfalse%
}

\def\pgf@plot@closedcurve@handler@second#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@closedcurve@after@initial{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  {\pgfpathmoveto{}}%
  \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@third%
}

\def\pgf@plot@closedcurve@handler@third#1{%
  \global\pgf@plot@startedtrue%
  \pgf@process{#1}%
  \xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  % compute difference vector:
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \pgf@process{\pgf@plot@closedcurve@initial}
  \advance\pgf@xa by-\pgf@x%
  \advance\pgf@ya by-\pgf@y%
  % compute support directions:
  \pgf@xa=\pgf@plottension\pgf@xa%
  \pgf@ya=\pgf@plottension\pgf@ya%
  % first marshal:
  \pgf@process{\pgf@plot@closedcurve@after@initial}%
  \pgf@xb=\pgf@x%
  \pgf@yb=\pgf@y%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \advance\pgf@xb by-\pgf@xa%
  \advance\pgf@yb by-\pgf@ya%
  \advance\pgf@xc by\pgf@xa%
  \advance\pgf@yc by\pgf@ya%
  \global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@after@initial%
  \global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current%
  \xdef\pgf@plot@closedcurve@after@initial@presupport{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
  \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
  \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@fourth%
}

\def\pgf@plot@closedcurve@handler@fourth#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  % compute difference vector:
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \pgf@process{\pgf@plot@closedcurve@first}
  \advance\pgf@xa by-\pgf@x%
  \advance\pgf@ya by-\pgf@y%
  % compute support directions:
  \pgf@xa=\pgf@plottension\pgf@xa%
  \pgf@ya=\pgf@plottension\pgf@ya%
  % first marshal:
  \pgf@process{\pgf@plot@closedcurve@second}%
  \pgf@xb=\pgf@x%
  \pgf@yb=\pgf@y%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \advance\pgf@xb by-\pgf@xa%
  \advance\pgf@yb by-\pgf@ya%
  \advance\pgf@xc by\pgf@xa%
  \advance\pgf@yc by\pgf@ya%
  \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
    {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}%
  {\pgf@marshal}%
  % Prepare next:
  \global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@second%
  \global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current%
  \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
}

\def\pgf@plot@closedcurve@handler@finish{%
  \ifpgf@plot@started
    %
    % first, draw line from 2nd last to last:
    %
    \pgf@process{\pgf@plot@closedcurve@initial}%
    % compute difference vector:
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \pgf@process{\pgf@plot@closedcurve@first}%
    \advance\pgf@xa by-\pgf@x%
    \advance\pgf@ya by-\pgf@y%
    % compute support directions:
    \pgf@xa=\pgf@plottension\pgf@xa%
    \pgf@ya=\pgf@plottension\pgf@ya%
    % first marshal:
    \pgf@process{\pgf@plot@closedcurve@second}%
    \pgf@xb=\pgf@x%
    \pgf@yb=\pgf@y%
    \pgf@xc=\pgf@x%
    \pgf@yc=\pgf@y%
    \advance\pgf@xb by-\pgf@xa%
    \advance\pgf@yb by-\pgf@ya%
    \advance\pgf@xc by\pgf@xa%
    \advance\pgf@yc by\pgf@ya%
    \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
      {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}%
    {\pgf@marshal}%
    \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
    %
    % second, draw line from last point to start:
    %
    \pgf@process{\pgf@plot@closedcurve@after@initial}%
    % compute difference vector:
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \pgf@process{\pgf@plot@closedcurve@second}%
    \advance\pgf@xa by-\pgf@x%
    \advance\pgf@ya by-\pgf@y%
    % compute support directions:
    \pgf@xa=\pgf@plottension\pgf@xa%
    \pgf@ya=\pgf@plottension\pgf@ya%
    % first marshal:
    \pgf@process{\pgf@plot@closedcurve@initial}%
    \pgf@xb=\pgf@x%
    \pgf@yb=\pgf@y%
    \pgf@xc=\pgf@x%
    \pgf@yc=\pgf@y%
    \advance\pgf@xb by-\pgf@xa%
    \advance\pgf@yb by-\pgf@ya%
    \advance\pgf@xc by\pgf@xa%
    \advance\pgf@yc by\pgf@ya%
    \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
      {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@initial}}%
    {\pgf@marshal}%
    %
    % third, draw line from first to second point:
    %
    \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      {\noexpand\pgf@plot@closedcurve@after@initial@presupport}{\noexpand\pgf@plot@closedcurve@after@initial}}%
    {\pgf@marshal}%
    \pgfpathclose%
  \fi%
}





% This handler converts each point in a stream into a line from the
% $y$-axis to the given points coordinate, resulting in a
% ``comb.'' 
%
% Example:
%
% \pgfplothandlerxcomb
% \pgfplotxyfile{mytable}

\def\pgfplothandlerxcomb{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@xcomb@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgfplotxzerolevelstreamend%
	\pgfplotxzerolevelstreamstart
  }%
}

\def\pgf@plot@xcomb@handler#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \begingroup
  \pgfplotxzerolevelstreamnext
  \endgroup
  \pgf@yb=\pgf@x
  \pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
}


% This handler converts each point in a stream into a line from the
% $x$-axis straight up to the given points coordinate, resulting in a
% ``comb.'' 
%
% Example:
%
% \pgfplothandlerycomb
% \pgfplotxyfile{mytable}

\def\pgfplothandlerycomb{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@ycomb@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgfplotyzerolevelstreamend%
	\pgfplotyzerolevelstreamstart
  }%
}

\def\pgf@plot@ycomb@handler#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \begingroup
  \pgfplotyzerolevelstreamnext
  \endgroup
  \pgf@yb=\pgf@x
  \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
}

% PGF Bar or comb plots usually draw something from zero to the current plot's coordinate.
% 
% The 'zero' offset can be changed using an input stream.
%
% There are two such streams which can be configured independently.
% The first one returns "zeros" for coordinate x, the second one
% returns "zeros" for coordinate y.
% 
% \pgfplotxzerolevelstreamstart
% \pgfplotxzerolevelstreamnext % assigns \pgf@x globally
% \pgfplotxzerolevelstreamnext
% \pgfplotxzerolevelstreamnext
% \pgfplotxzerolevelstreamend
%
% and 
% \pgfplotyzerolevelstreamstart
% \pgfplotyzerolevelstreamnext % assigns \pgf@x globally
% \pgfplotyzerolevelstreamend
%
\def\pgfplotxzerolevelstreamstart{\pgf@plotxzerolevelstreamstart}%
\def\pgfplotxzerolevelstreamend{\pgf@plotxzerolevelstreamend}%
\def\pgfplotxzerolevelstreamnext{\pgf@plotxzerolevelstreamnext}
\def\pgfplotyzerolevelstreamstart{\pgf@plotyzerolevelstreamstart}%
\def\pgfplotyzerolevelstreamend{\pgf@plotyzerolevelstreamend}%
\def\pgfplotyzerolevelstreamnext{\pgf@plotyzerolevelstreamnext}

% This zero level stream always returns '#1' (a dimension).
\def\pgfplotxzerolevelstreamconstant#1{%
	\edef\pgfplotxzerolevelstreamconstant@val{#1}%
	\def\pgf@plotxzerolevelstreamstart{%
		\global\let\pgf@plotxzerolevelstreamend=\relax
		\gdef\pgf@plotxzerolevelstreamnext{\global\pgf@x=\pgfplotxzerolevelstreamconstant@val\relax}%
	}%
}%
\pgfplotxzerolevelstreamconstant{0pt}%

% This zero level stream always returns '#1'.
\def\pgfplotyzerolevelstreamconstant#1{%
	\edef\pgfplotyzerolevelstreamconstant@val{#1}%
	\def\pgf@plotyzerolevelstreamstart{%
		\global\let\pgf@plotyzerolevelstreamend=\relax
		\gdef\pgf@plotyzerolevelstreamnext{\global\pgf@x=\pgfplotyzerolevelstreamconstant@val\relax}%
	}%
}%
\pgfplotyzerolevelstreamconstant{0pt}%

\def\pgfplotbarwidth{\pgfkeysvalueof{/pgf/bar width}}

\pgfqkeys{/pgf}{%
	bar width/.initial=10pt,
	bar shift/.initial=0pt,
	bar interval width/.initial=1,
	bar interval shift/.initial=0.5,
}

% This handler places a rectangle at each point in the plot stream, a
% rectangle which touches the x-axis at one end and the current point
% at the other end:
%    --(X)--
%    |     |
%    |     |
%    |     |
%    --(0)--
% Example:
%
% \pgfplothandlerybar
% \pgfplotxyfile{mytable}
\def\pgfplothandlerybar{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@ybar@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgfplotyzerolevelstreamend%
	\pgfmathparse{\pgfplotbarwidth}%
	\xdef\pgfplotbarwidth@{\pgfmathresult pt}%
	\pgfmathparse{\pgfkeysvalueof{/pgf/bar shift}}%
	\xdef\pgfplotbarshift@{\pgfmathresult pt}%
	\pgfplotyzerolevelstreamstart
  }%
}

\def\pgf@plot@ybar@handler#1{%
  \pgf@process{#1}%
  \pgf@ya=\pgf@y
  \expandafter\pgf@xb\pgfplotbarwidth@\relax
  \pgf@xc=\pgf@x
  \advance\pgf@xc by-.5\pgf@xb
  \advance\pgf@xc by\pgfplotbarshift@\relax
  \begingroup
  \pgfplotyzerolevelstreamnext
  \endgroup
  \pgf@yb=\pgf@x
  \advance\pgf@ya by-\pgf@yb
  \pgfpathrectangle
	{\pgfqpoint{\pgf@xc}{\pgf@yb}}%
	{\pgfqpoint{\pgf@xb}{\pgf@ya}}%
}

% This handler places a rectangle at each point in the plot stream, a
% rectangle which touches the y-axis at one end and the current point
% at the other end:
%    ---------
%    |       |
%   (0)     (X)
%    |       |
%    ---------
% Example:
%
% \pgfplothandlerxbar
% \pgfplotxyfile{mytable}
\def\pgfplothandlerxbar{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@xbar@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgfplotxzerolevelstreamend%
	\pgfmathparse{\pgfplotbarwidth}%
	\xdef\pgfplotbarwidth@{\pgfmathresult pt}%
	\pgfmathparse{\pgfkeysvalueof{/pgf/bar shift}}%
	\xdef\pgfplotbarshift@{\pgfmathresult pt}%
	\pgfplotxzerolevelstreamstart
  }%
}

\def\pgf@plot@xbar@handler#1{%
  \pgf@process{#1}%
  \pgf@ya=\pgf@x
  \expandafter\pgf@xb\pgfplotbarwidth@\relax
  \pgf@xc=\pgf@y
  \advance\pgf@xc by-.5\pgf@xb
  \advance\pgf@xc by\pgfplotbarshift@\relax
  \begingroup
  \pgfplotxzerolevelstreamnext
  \endgroup
  \pgf@yb=\pgf@x
  \advance\pgf@ya by-\pgf@yb
  \pgfpathrectangle
	{\pgfqpoint{\pgf@yb}{\pgf@xc}}%
	{\pgfqpoint{\pgf@ya}{\pgf@xb}}%
}

% This handler is a variant of \pgfplothandlerybar which works with
% intervals instead of points.
% 
% Bars are drawn between successive input coordinates and the width is
% determined relatively to the interval length.
%
% It looks like this:
%
%    |---|      |-----| 
%    |   |      |     |    
%    |   |      |     |     
%    |   |      |     |       
% (X)------(X)-----------(X)
%
% where (X) denotes the x-axis offsets of input coordinates.
%
% In more detail, if (x_i,y_i) and (x_{i+1},y_{i+1}) denote successive
% input coordinates, the bar will be placed above the
% interval [x_i,x_{i+1}], centered at
%
%    x_i + \pgfkeysvalueof{/pgf/bar interval shift} * (x_{i+1} - x_i)
%
% with width
%
%    \pgfkeysvalueof{/pgf/bar interval width} * (x_{i+1} - x_i).
%
% If you have N+1 input points, you will get N bars (one for each
% interval). The y_i value of the last bar will be ignored.
%
% Example:
%
% \pgfplothandlerybarinterval
% \pgfplotxyfile{mytable}
\def\pgfplothandlerybarinterval{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@ybarinterval@handler@first%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgfplotyzerolevelstreamend%
	\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}%
	\xdef\pgfplotbarintervalwidth@{\pgfmathresult}%
	\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}%
	\xdef\pgfplotbarintervalshift@{\pgfmathresult}%
	\pgfplotyzerolevelstreamstart
  }%
}

\def\pgf@plot@ybarinterval@handler@first#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}%
  \xdef\pgf@plot@barinterval@bar{\the\pgf@y}%
  \global\let\pgf@plotstreampoint=\pgf@plot@ybarinterval@handler%
}
\def\pgf@plot@ybarinterval@handler#1{%
  \pgf@process{#1}%
  \pgf@ya=\pgf@plot@barinterval@bar
  \xdef\pgf@plot@barinterval@bar{\the\pgf@y}%
  \pgf@xc=\pgf@plot@barinterval@intervalstart\relax
  \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}%
  \pgf@xb=\pgf@x
  \advance\pgf@xb by-\pgf@xc
  \advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb
  \pgf@xb=\pgfplotbarintervalwidth@\pgf@xb
  \advance\pgf@xc by-.5\pgf@xb% center
  \begingroup
  \pgfplotyzerolevelstreamnext
  \endgroup
  \pgf@yb=\pgf@x
  \advance\pgf@ya by-\pgf@yb
  \pgfpathrectangle
	{\pgfqpoint{\pgf@xc}{\pgf@yb}}%
	{\pgfqpoint{\pgf@xb}{\pgf@ya}}%
}

% Like \pgfplothandlerybarinterval but for xbar.
\def\pgfplothandlerxbarinterval{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@xbarinterval@handler@first%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgfplotxzerolevelstreamend%
	\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}%
	\xdef\pgfplotbarintervalwidth@{\pgfmathresult}%
	\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}%
	\xdef\pgfplotbarintervalshift@{\pgfmathresult}%
	\pgfplotxzerolevelstreamstart
  }%
}

\def\pgf@plot@xbarinterval@handler@first#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}%
  \xdef\pgf@plot@barinterval@bar{\the\pgf@x}%
  \global\let\pgf@plotstreampoint=\pgf@plot@xbarinterval@handler%
}
\def\pgf@plot@xbarinterval@handler#1{%
  \pgf@process{#1}%
  \pgf@ya=\pgf@plot@barinterval@bar
  \xdef\pgf@plot@barinterval@bar{\the\pgf@x}%
  \pgf@xc=\pgf@plot@barinterval@intervalstart\relax
  \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}%
  \pgf@xb=\pgf@y
  \advance\pgf@xb by-\pgf@xc
  \advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb
  \pgf@xb=\pgfplotbarintervalwidth@\pgf@xb
  \advance\pgf@xc by-.5\pgf@xb% center
  \begingroup
  \pgfplotxzerolevelstreamnext
  \endgroup
  \pgf@yb=\pgf@x
  \advance\pgf@ya by-\pgf@yb
  \pgfpathrectangle
	{\pgfqpoint{\pgf@yb}{\pgf@xc}}%
	{\pgfqpoint{\pgf@ya}{\pgf@xb}}%
}


% This handler is very similar to \pgfplothandlerlineto, but it
% produces CONSTANT connected pieces of the form
%
%          x
%          |
%   x---   |
%   |  x----
% x-|
%
% Example:
%
% \pgfplothandlerconstantlineto
% \pgfplotxyfile{mytable}
\def\pgfplothandlerconstantlineto{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@const@line@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}
\def\pgf@plot@const@line@handler#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@y}%
  \pgf@plot@first@action{}%
  \global\let\pgf@plotstreampoint=\pgf@plot@const@line@handler@@%
}
\def\pgf@plot@const@line@handler@@#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgf@yb\pgf@plot@const@line@handler@last\relax
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}%
}

% A variant of \pgfplothandlerconstantlineto which places its mark on
% the right line ends.
% 
%       |---x
% ---x  |
%    |--x
% x
%
% Example:
%
% \pgfplothandlerconstantlinetomarkright
% \pgfplotxyfile{mytable}
\def\pgfplothandlerconstantlinetomarkright{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@right@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}
\def\pgf@plot@const@line@mark@right@handler#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@x}%
  \pgf@plot@first@action{}%
  \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@right@handler@@%
}
\def\pgf@plot@const@line@mark@right@handler@@#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgf@yb\pgf@plot@const@line@handler@last\relax
  \pgfpathlineto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}%
}

% This handler is in fact a variant of \pgfplothandlerconstantlineto,
% but it does not draw vertical lines. It produces a sequence of
% line-to and move-to operations such that plot marks are placed at
% each right end:
%
%          ---x
%   ---x   
%       ---x
% --x
%
% Example:
%
% \pgfplothandlerjumpmarkright
% \pgfplotxyfile{mytable}
\def\pgfplothandlerjumpmarkright{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkright@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}
\def\pgf@plot@jumpmarkright@handler#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@x}%
  \pgf@plot@first@action{}%
  \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkright@handler@@%
}
\def\pgf@plot@jumpmarkright@handler@@#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgf@yb\pgf@plot@const@line@handler@last\relax
  \pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}%
}

% This handler is in fact a variant of \pgfplothandlerconstantlineto,
% but it does not draw vertical lines. It produces a sequence of
% line-to and move-to operations such that plot marks are placed at
% each left end:
%
%          x---
%   x---   
%       x---
% x--
%
% Example:
%
% \pgfplothandlerjumpmarkleft
% \pgfplotxyfile{mytable}
\def\pgfplothandlerjumpmarkleft{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkleft@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}
\def\pgf@plot@jumpmarkleft@handler#1{%
  \pgf@process{#1}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@y}%
  \pgf@plot@first@action{}%
  \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkleft@handler@@%
}
\def\pgf@plot@jumpmarkleft@handler@@#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgf@yb\pgf@plot@const@line@handler@last\relax
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
  \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}%
}



% This handler converts each point in a stream into a line from the
% origin to the point's coordinate, resulting in a ``star''.
%
% Example:
%
% \pgfplothandlerpolarcomb
% \pgfplotxyfile{mytable}

\def\pgfplothandlerpolarcomb{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@polarcomb@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}

\def\pgf@plot@polarcomb@handler#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \pgfpathmoveto{\pgfpointorigin}%
  \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
}




% This handler draws a given mark at each point. 
%
% #1 = some code to be executed at each point (with the coordinate
%      system translated to that point).
%      Typically, this code will be \pgfuseplotmark{whatever}.
%
% Example:
%
% \pgfplothandlermark{\pgfuseplotmark{*}}
% \pgfplotxyfile{mytable}

\def\pgfplothandlermark#1{%
  \pgf@plothandlermark{%
    \ifnum\pgf@plot@mark@count<\pgf@plot@mark@repeat\relax%
    \else%
      \global\pgf@plot@mark@count=0\relax%
      #1%
    \fi%
    }%
}

\newcount\pgf@plot@mark@count
\def\pgf@plot@mark@phase{0}

\def\pgf@plothandlermark#1{%
  \def\pgf@plot@mark{#1}%
  \def\pgf@plotstreamstart{%
    \global\pgf@plot@mark@count=\pgf@plot@mark@repeat\relax%
    \global\advance\pgf@plot@mark@count by-\pgf@plot@mark@phase\relax%
    \global\let\pgf@plotstreampoint=\pgf@plot@mark@handler%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}

\def\pgf@plot@mark@handler#1{%
  \global\advance\pgf@plot@mark@count by1\relax%
  {\pgftransformshift{#1}\pgf@plot@mark}%
}


% Set the repeat count for marks. For example, if 3 is given as a
% value, only every third point will get a mark.
%
% #1 = repeat count
%
% Example:
%
% \pgfsetplotmarkrepeat{2}

\def\pgfsetplotmarkrepeat#1{\def\pgf@plot@mark@repeat{#1}}
\pgfsetplotmarkrepeat{1}


% Set the phase for marks. For example, if 3 is the repeat and 3 is 
% the phase, already the first point will be marked. 
%
% #1 = the index of the first point that should be marked.
%
% Example:
%
% \pgfsetplotmarkphase{3}

\def\pgfsetplotmarkphase#1{\def\pgf@plot@mark@phase{#1}}
\pgfsetplotmarkphase{1}



% This handler draws a given mark at those points whose number is
% given in the (pgffor-like) list.
%
% #1 = some code to be executed at each point (with the coordinate
%      system translated to that point).
%      Typically, this code will be \pgfuseplotmark{whatever}.
% #2 = list of positions like "1,2,4,...,9,10"
%
% Example:
%
% \pgfplothandlermarklisted{\pgfuseplotmark{*}}{1,2,4,...,9}
% \pgfplotxyfile{mytable}

\def\pgfplothandlermarklisted#1#2{%
  \let\pgf@plot@mark@list=\pgfutil@empty%
  \edef\pgf@marshal{\noexpand\foreach\noexpand\pgf@temp in{#2}}
  \pgf@marshal{\xdef\pgf@plot@mark@list{\pgf@plot@mark@list(\pgf@temp)}}%
  \pgf@plothandlermark{%
    \edef\pgf@marshal{\noexpand\pgfutil@in@{(\the\pgf@plot@mark@count)}{\pgf@plot@mark@list}}%
    \pgf@marshal%
    \ifpgfutil@in@#1\fi}%
}


% Define a new plot mark for use with \pgfplotmark.
%
% #1 = a plot mark mnemonic
% #2 = code for drawing the mark
%
% Example:
%
% \pgfdeclareplotmark{*}{\pgfpathcircle{\pgfpointorigin}{2pt}\pgfusepathqfill}

\def\pgfdeclareplotmark#1#2{\expandafter\def\csname pgf@plot@mark@#1\endcsname{#2}}


% Set the size of plot marks. For circles, this will be the radius,
% for other shapes it should be about half the width/height.
%
% Example:
%
% \pgfsetplotmarksize{1pt}

\def\pgfsetplotmarksize#1{\pgfmathsetlength\pgfplotmarksize{#1}}

\newdimen\pgfplotmarksize
\pgfplotmarksize=2pt


% Insert a plot mark's code at the origin.
%
% #1 = plot mark mnemonic
%
% Example:
%
% \pgfuseplotmark{*}

\def\pgfuseplotmark#1{\csname pgf@plot@mark@#1\endcsname}


% A stroke-filled circle mark

\pgfdeclareplotmark{*}
{%
  \pgfpathcircle{\pgfpointorigin}{\pgfplotmarksize}
  \pgfusepathqfillstroke
}


% A plus-sign like mark

\pgfdeclareplotmark{+}
{%
  \pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}
  \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}
  \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}
  \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}
  \pgfusepathqstroke
}


% An x-shaped mark

\pgfdeclareplotmark{x}
{%
  \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}
  \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}
  \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}
  \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}
  \pgfusepathqstroke
}

% See pgflibraryplotmarks for more plot marks




% This handler turns creates a series of straight line segements
% between consecutive points, but leaving /pgf/gap around stream point
% space.
%
% Example:
%
% \pgfplothandlergaplineto
% \pgfplotxyfile{mytable}

\pgfkeys{/pgf/gap around stream point/.initial=1.5pt}

\def\pgfplothandlergaplineto{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler@initial%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\relax%
  }%
}

\def\pgf@plot@gap@lineto@handler@initial#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \xdef\pgf@plot@gap@lineto@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler%
}

\def\pgf@plot@gap@lineto@handler#1{%
  % Ok, compute normalized line vector
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \xdef\pgf@plot@gap@lineto@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@lineto@last}{\pgf@plot@gap@lineto@next}}}%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
          around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@lineto@last}}%
  \pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
          around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@lineto@next}}%
  \global\let\pgf@plot@gap@lineto@last=\pgf@plot@gap@lineto@next%
}




% This handler works like \pgfplothandlergaplineto, only the last
% point is connected to the first point, creating a closed curve
% space.
%
% Example:
%
% \pgfplothandlergapcycle
% \pgfplotxyfile{mytable}

\def\pgfplothandlergapcycle{%
  \def\pgf@plotstreamstart{%
    \global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler@initial%
    \global\let\pgf@plotstreamspecial=\pgfutil@gobble%
    \global\let\pgf@plotstreamend=\pgf@plot@gap@cycle@handler@finish%
    \global\let\pgf@plot@gap@cycle@first=\relax%
  }%
}

\def\pgf@plot@gap@cycle@handler@initial#1{%
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \xdef\pgf@plot@gap@cycle@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \global\let\pgf@plot@gap@cycle@first=\pgf@plot@gap@cycle@last%
  \global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler%
}

\def\pgf@plot@gap@cycle@handler#1{%
  % Ok, compute normalized line vector
  \pgf@process{#1}%
  \pgf@xa=\pgf@x%
  \pgf@ya=\pgf@y%
  \xdef\pgf@plot@gap@cycle@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@cycle@last}{\pgf@plot@gap@cycle@next}}}%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
          around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@cycle@last}}%
  \pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
          around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@cycle@next}}%
  \global\let\pgf@plot@gap@cycle@last=\pgf@plot@gap@cycle@next%
}

\def\pgf@plot@gap@cycle@handler@finish{%
  \ifx\pgf@plot@gap@cycle@first\relax%
  \else
    \pgf@plot@gap@cycle@handler{\pgf@plot@gap@cycle@first}%
  \fi
}



\endinput
