% Copyright 2007 by Mark Wibrow
%
% 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.



% Keys for callouts
%
% Common to all callouts:
%	/pgf/callout absolute pointer
%	/pgf/callout relative pointer
%
% ellipse callout only:
%	/pgf/callout pointer arc    
%
% rectangle callout only:    
%	/pgf/callout pointer width      
%
% cloud callout only:
%	/pgf/callout pointer start size
%	/pgf/callout pointer end size
%	/pgf/callout pointer segments
%
\newif\ifpgf@lib@callout@absolutepointer
\pgfkeys{/pgf/.cd,
	callout pointer arc/.initial=15,
	callout pointer width/.initial=.25cm,
	callout pointer start size/.initial=.2 of callout,
	callout pointer end size/.initial=.1 of callout,
	callout pointer segments/.initial=2,
	callout absolute pointer/.code={\pgf@lib@callout@makeabsolutepointer{#1}},
	callout relative pointer/.code={\pgf@lib@callout@makerelativepointer{#1}},
	callout pointer shorten/.initial=0cm
}



\def\pgf@lib@callout@makeabsolutepointer#1{%
	\pgf@lib@callout@absolutepointertrue%
	{%
		\pgftransformshift{#1}%
		\pgfmultipartnode{coordinate}{center}{pgf@lib@callout@pointer}{}%
	}%
}

\def\pgf@lib@callout@makerelativepointer#1{%
	\pgf@lib@callout@absolutepointerfalse%
	\def\pgf@lib@callout@relativepointer{#1}%
}
\pgfkeys{/pgf/callout relative pointer=\pgfpointpolar{300}{.5cm}}


% Shape ellipse callout
%
%
\pgfdeclareshape{ellipse callout}{%
	\savedmacro\ellipsecalloutpoints{%
		%
		% Get the larger of the outer sep.
		%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
		\pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
		\ifdim\pgf@x>\pgf@y%
			\edef\outersep{\the\pgf@x}%
		\else%
			\edef\outersep{\the\pgf@y}%
		\fi%
		\addtosavedmacro\outersep%
		%
		% Calculate the node dimensions...
		%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
		\advance\pgf@x.5\wd\pgfnodeparttextbox%
    \pgf@x1.4142136\pgf@x%
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
    \ifdim\pgf@x<.5\pgf@xa%
      \pgf@x.5\pgf@xa%
    \fi%
    %
   	\pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%    
		\advance\pgf@y.5\ht\pgfnodeparttextbox%
    \advance\pgf@y.5\dp\pgfnodeparttextbox%
    \pgf@y1.4142136\pgf@y%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
    \ifdim\pgf@y<.5\pgf@ya%
      \pgf@y.5\pgf@ya%
    \fi%
    %
    % ...without outer sep...
    %
    \edef\xpathradius{\the\pgf@x}%
    \edef\ypathradius{\the\pgf@y}%
    %
    % ...and width outer sep.
    %
    \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
    \edef\xradius{\the\pgf@x}%
    \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
    \edef\yradius{\the\pgf@y}%
    %
    \addtosavedmacro\xradius%
    \addtosavedmacro\xpathradius%
    \addtosavedmacro\yradius% 
    \addtosavedmacro\ypathradius%
  	%
	  \pgfmathsetmacro\pointerarc{\pgfkeysvalueof{/pgf/callout pointer arc}}%
		\addtosavedmacro\pointerarc%
	  %
	  \pgfextract@process\centerpoint{%
	    \pgf@x.5\wd\pgfnodeparttextbox%
	    \pgf@y.5\ht\pgfnodeparttextbox%
	    \advance\pgf@y-.5\dp\pgfnodeparttextbox%
	  }%
	  %
	  % Get the realtive pointer.
	  %
	  \ifpgf@lib@callout@absolutepointer%
	  \else%
	   	\pgfextract@process\calloutpointer{%
				\pgfextract@process\borderpoint{%
					\expandafter\pgfpointborderellipse\expandafter{\pgf@lib@callout@relativepointer}{\pgfqpoint{\xpathradius}{\ypathradius}}%
				}%
				\pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
				\let\pointerangle\pgfmathresult%
				\expandafter\pgf@process\expandafter{\pgf@lib@callout@relativepointer}%
				\pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
				\edef\pointerradius{\pgfmathresult pt}%
				\pgfpointadd{\borderpoint}{\pgfqpointpolar{\pointerangle}{\pointerradius}}%
				\pgf@xa\pgf@x%
				\pgf@ya\pgf@y%
				\centerpoint%
				\advance\pgf@x\pgf@xa%
				\advance\pgf@y\pgf@ya%
			}%
			%
			\addtosavedmacro\calloutpointer%
			\pgf@lib@callouts@shortenpointer%
			\pgf@lib@ellipsecallout@getpoints%
	  	\addtosavedmacro\calloutpointeranchor%
	  	\addtosavedmacro\beforecalloutangle%
	  	\addtosavedmacro\aftercalloutangle%
  	\fi%
  }%
  \savedanchor\centerpoint{%
    \pgf@x.5\wd\pgfnodeparttextbox%
    \pgf@y.5\ht\pgfnodeparttextbox%
    \advance\pgf@y-.5\dp\pgfnodeparttextbox%
  }
  \savedanchor\midpoint{%
    \pgf@x.5\wd\pgfnodeparttextbox%
    \pgfmathsetlength\pgf@y{+.5ex}%
  }
  \savedanchor\basepoint{%
    \pgf@x.5\wd\pgfnodeparttextbox%
    \pgf@y0pt\relax%
  }
  \anchor{center}{\centerpoint}%
  \anchor{mid}{\midpoint}%
  \anchor{mid east}{%
  	\ellipsecalloutpoints%
  	\pgfmathpointintersectionoflineandarc{\midpoint\advance\pgf@x\xradius}{\midpoint}%
  		{\centerpoint}{270}{450}{\xradius and \yradius}%
  }%
  \anchor{mid west}{%
  	\ellipsecalloutpoints%
  	\pgfmathpointintersectionoflineandarc{\midpoint\advance\pgf@x-\xradius}{\midpoint}%
  		{\centerpoint}{90}{270}{\xradius and \yradius}%
  }%
  \anchor{base}{\basepoint}%
  \anchor{base east}{%
  	\ellipsecalloutpoints%
  	\pgfmathpointintersectionoflineandarc{\basepoint\advance\pgf@x\xradius}{\basepoint}%
  		{\centerpoint}{270}{450}{\xradius and \yradius}%
  }%
  \anchor{base west}{%
  	\ellipsecalloutpoints%
  	\pgfmathpointintersectionoflineandarc{\basepoint\advance\pgf@x-\xradius}{\basepoint}%
  		{\centerpoint}{90}{270}{\xradius and \yradius}%
  }%
  \anchor{north}{%
  	\ellipsecalloutpoints%
  	\centerpoint%
  	\advance\pgf@y\yradius\relax%
  }
  \anchor{south}{%
  	\ellipsecalloutpoints%
  	\centerpoint%
  	\advance\pgf@y-\yradius\relax%
  }
  \anchor{east}{%
  	\ellipsecalloutpoints%
  	\centerpoint%
  	\advance\pgf@x\xradius\relax%
  }
  \anchor{west}{%
  	\ellipsecalloutpoints%
  	\centerpoint%
  	\advance\pgf@x-\xradius\relax%
  }
  \anchor{north west}{%
  	\ellipsecalloutpoints%
  	\pgf@xa\xradius\relax%
  	\pgf@ya\yradius\relax%
  	\centerpoint%
  	\advance\pgf@y0.7071067\pgf@ya%
  	\advance\pgf@x-0.7071067\pgf@xa%
  }
  \anchor{north east}{%
  	\ellipsecalloutpoints%
  	\pgf@xa\xradius\relax%
  	\pgf@ya\yradius\relax%
  	\centerpoint%
  	\advance\pgf@y0.7071067\pgf@ya%
  	\advance\pgf@x0.7071067\pgf@xa%
  }
  \anchor{south west}{%
  	\ellipsecalloutpoints%
  	\pgf@xa\xradius\relax%
  	\pgf@ya\yradius\relax%
  	\centerpoint%
  	\advance\pgf@y-0.7071067\pgf@ya%
  	\advance\pgf@x-0.7071067\pgf@xa%
  }
  \anchor{south east}{%
  	\ellipsecalloutpoints%
  	\pgf@xa\xradius\relax%
  	\pgf@ya\yradius\relax%
  	\centerpoint%
  	\advance\pgf@y-0.7071067\pgf@ya%
  	\advance\pgf@x0.7071067\pgf@xa%
  }
  \anchor{pointer}{%
  	\ellipsecalloutpoints%
  	\calloutpointeranchor%
	}%
  \backgroundpath{%
  	\ellipsecalloutpoints%
   	\ifpgf@lib@callout@absolutepointer%
   		\pgfextract@process\calloutpointer{%
				\pgfpointanchor{pgf@lib@callout@pointer}{center}%
			}%
			\pgf@lib@callouts@shortenpointer%
			\pgf@lib@ellipsecallout@getpoints%	
			\calloutpointeranchor%	
			\ifx\pgf@test\pgfutil@empty%
			\else%
				\edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@test\noexpand\endcsname}%
				\edef\pgf@sh@@@temp{%
					\noexpand\def\noexpand\calloutpointeranchor{%
						\noexpand\pgf@x\the\pgf@x%
						\noexpand\pgf@y\the\pgf@y%
					}%
				}%
				\expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}
			\fi%
		\fi%
		\pgfpathmoveto{\calloutpointer}%
		\pgfpathlineto{\aftercalloutpointer}%
		\ifdim\aftercalloutangle pt<\beforecalloutangle pt\relax%
			\pgfpatharc{\aftercalloutangle}{\beforecalloutangle}{\xpathradius and \ypathradius}%
		\else%
			\pgfpatharc{\aftercalloutangle}{360}{\xpathradius and \ypathradius}%
			\pgfpatharc{0}{\beforecalloutangle}{\xpathradius and \ypathradius}%
		\fi%
		\pgfpathclose%
  }%    
  \anchorborder{%
  	\pgfextract@process\externalpoint{}%
  	\ellipsecalloutpoints%
   	\pgfpointadd{\pgfpointborderellipse{\externalpoint}{\pgfpoint{\xradius}{\yradius}}%
  	}{\centerpoint}%  		
  }%
}

% Internal macro for calculating the points for the
% ellipse callout pointer.
%
% The following must be set up:
%
% \centerpoint    - the center of the ellipse.
% \calloutpointer - the location of the callout point.
% \pointerarc     - the width of the pointer.
% \xpathradius    - the x radius of the ellipse.
% \ypathradius    - the y radius of the ellipse.
%
\def\pgf@lib@ellipsecallout@getpoints{%
	\pgfextract@process\borderpoint{%
		\pgfpointborderellipse{%
			\centerpoint%
			\pgf@xa\pgf@x%
			\pgf@ya\pgf@y%
			\calloutpointer%
			\advance\pgf@x-\pgf@xa%
			\advance\pgf@y-\pgf@ya%
		}{\pgfqpoint{\xpathradius}{\ypathradius}}%
	}%
	\pgfmathangleonellipse{\borderpoint}{\xpathradius and \ypathradius}%
	\pgfutil@tempdima\pointerarc pt\relax%
	\pgfutil@tempdimb\pgfmathresult pt\relax%
	\advance\pgfutil@tempdimb-.5\pgfutil@tempdima%
	\ifdim\pgfutil@tempdimb<0pt\relax%
		\advance\pgfutil@tempdimb360pt\relax%
	\fi%
	\edef\beforecalloutangle{\pgfmath@tonumber{\pgfutil@tempdimb}}%
	\advance\pgfutil@tempdimb\pgfutil@tempdima%
	\ifdim\pgfutil@tempdimb<360pt\relax%
	\else%
		\advance\pgfutil@tempdimb-360pt\relax%
	\fi%
	\edef\aftercalloutangle{\pgfmath@tonumber{\pgfutil@tempdimb}}%	
	%
	\pgfextract@process\beforecalloutpointer{%
		\pgfpointadd{\centerpoint}{%
			\pgfpointpolar{\beforecalloutangle}{\xpathradius and \ypathradius}%
		}%
	}%
	\pgfextract@process\aftercalloutpointer{%
		\pgfpointadd{\centerpoint}{%
			\pgfpointpolar{\aftercalloutangle}{\xpathradius and \ypathradius}%
		}%
	}%
	%
	% Calculate the pointer anchor.
	%
	\pgf@lib@callouts@pointeranchor%
}


% If the callout pointer is very pointed and stroked, the anchor will be 
% miles away from the end of the pointer which will (typically) be
% bevelled. 
% Using outer sep=0pt is one solution, however, another is provided
% using this special key:
%
% /pgf/callout pointer anchor aspect
% 
% which takes a value from 0 (ignore any outer sep) to 1 (use
% the full outer sep).

\pgfkeys{/pgf/callout pointer anchor aspect/.initial=1}

% Internal macro for calculating the anchor for the callout pointer.
%
% Requires the following to be set up (points are anti-clockwise)
%
% \beforecalloutpointer - point on the border before the callout pointer 
% \calloutpointer    
% \aftercalloutpointer  - point on the border after the callout pointer
% \outersep             - the largest of the outer xsep or ysep.
%
\def\pgf@lib@callouts@pointeranchor{%
	\pgfutil@tempdimb\outersep\relax%
	%
	\pgfmathanglebetweenlines{\calloutpointer}{\aftercalloutpointer}{\calloutpointer}{\beforecalloutpointer}%
	\pgfmathdivide@{\pgfmathresult}{2}%
	\pgfutil@tempdima\pgfmathresult pt\relax%
	\pgfmathcosec@{\pgfmathresult}%
	\pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
	\pgfmathanglebetweenpoints{\calloutpointer}{\aftercalloutpointer}%
	\advance\pgfutil@tempdima\pgfmathresult pt\relax%
	\advance\pgfutil@tempdima180pt\relax%
	%	
	\pgfextract@process\calloutpointeranchor{%
		\pgfpointadd{%
			\pgfmathparse{\pgfkeysvalueof{/pgf/callout pointer anchor aspect}}%
			\pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
			\pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
		}{%
			\calloutpointer%
		}%
	}%	
}%

\def\pgf@lib@callouts@shortenpointer{%
	\pgfextract@process\calloutpointer{%
		\pgfmathanglebetweenpoints{\calloutpointer}{\centerpoint}%
		\let\angle\pgfmathresult%
		\pgfmathsin@{\angle}%
		\let\sinpointerangle\pgfmathresult%
		\pgfmathcos@{\angle}%
		\let\cospointerangle\pgfmathresult%	
		\pgfpointadd{\calloutpointer}{%
			\pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/callout pointer shorten}}%
			\pgf@x\cospointerangle\pgfutil@tempdima%
			\pgf@y\sinpointerangle\pgfutil@tempdima%
		}%
	}%
}%
	

\pgfdeclareshape{rectangle callout}{%
	\savedmacro\rectanglecalloutpoints{%
		%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
		\advance\pgf@x.5\wd\pgfnodeparttextbox%
		\pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
		\ifdim\pgf@x<.5\pgf@xa%
			\pgf@x.5\pgf@xa%
		\fi%
		\edef\xtemp{\the\pgf@x}%
		\pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
		%
		\pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
		\advance\pgf@y.5\ht\pgfnodeparttextbox%
		\advance\pgf@y.5\dp\pgfnodeparttextbox%
		\pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
		\ifdim\pgf@y<.5\pgf@ya%
			\pgf@y.5\pgf@ya%
		\fi%
		\edef\ytemp{\the\pgf@y}%
		\pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
		%
		\edef\xlength{\the\pgf@x}%
		\edef\ylength{\the\pgf@y}%
		\addtosavedmacro\xlength%
		\addtosavedmacro\ylength%
		%
		\pgfmathsetlengthmacro\pointerwidth{\pgfkeysvalueof{/pgf/callout pointer width}}%
		\addtosavedmacro\pointerwidth%
		%
		\pgfextract@process\centerpoint{%
			\pgf@x.5\wd\pgfnodeparttextbox%
			\pgf@y.5\ht\pgfnodeparttextbox%
			\advance\pgf@y-.5\dp\pgfnodeparttextbox%
		}%
		%
		% Process the relative callout pointer.
		%
		\ifpgf@lib@callout@absolutepointer%
		\else%
			\pgfextract@process\calloutpointer{%
				\pgfextract@process\borderpoint{%
					\expandafter\pgfpointborderrectangle\expandafter{\pgf@lib@callout@relativepointer}%
						{\pgfqpoint{\xtemp}{\ytemp}}%
				}%
				\pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
				\let\pointerangle\pgfmathresult%
				\expandafter\pgf@process\expandafter{\pgf@lib@callout@relativepointer}%
				\pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
				\edef\pointerradius{\pgfmathresult pt}%
				\pgfpointadd{\borderpoint}{\pgfqpointpolar{\pointerangle}{\pointerradius}}%
				\pgf@xa\pgf@x%
				\pgf@ya\pgf@y%
				\centerpoint%
				\advance\pgf@x\pgf@xa%
				\advance\pgf@y\pgf@ya%
			}%
			\pgf@lib@callouts@shortenpointer%
			\addtosavedmacro\calloutpointer%
			\pgf@lib@rectanglecallout@pointer%
			\addtosavedmacro\calloutpointeranchor%
			\addtosavedmacro\beforecalloutpointer%
			\addtosavedmacro\aftercalloutpointer%
			\addtosavedmacro\firstpoint%
			\addtosavedmacro\secondpoint%
			\addtosavedmacro\thirdpoint%
			\addtosavedmacro\fourthpoint%
		\fi%
	}
	\savedanchor\centerpoint{%
		\pgf@x.5\wd\pgfnodeparttextbox%
		\pgf@y.5\ht\pgfnodeparttextbox%
		\advance\pgf@y-.5\dp\pgfnodeparttextbox%
	}
	\savedanchor\basepoint{%
		\pgf@x.5\wd\pgfnodeparttextbox%
		\pgf@y0pt\relax%
	}
	\savedanchor\midpoint{%
		\pgf@x.5\wd\pgfnodeparttextbox%
		\pgfmathsetlength\pgf@y{+.5em}%
	}
	\anchor{center}{\centerpoint}
	\anchor{mid}{\midpoint}
	\anchor{mid east}{%
		\rectanglecalloutpoints%
		\midpoint%
		\advance\pgf@x\xlength\relax%		
	}
	\anchor{mid west}{%
		\rectanglecalloutpoints%
		\midpoint%
		\advance\pgf@x-\xlength\relax%		
	}
	\anchor{base}{\basepoint}
	\anchor{base east}{%
		\rectanglecalloutpoints%
		\basepoint%
		\advance\pgf@x\xlength\relax%		
	}
	\anchor{base west}{%
		\rectanglecalloutpoints%
		\basepoint%
		\advance\pgf@x-\xlength\relax%		
	}
	\anchor{north}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@y\ylength\relax%
	}%
	\anchor{south}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@y-\ylength\relax%
	}%
	\anchor{east}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@x\xlength\relax%
	}%
	\anchor{west}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@x-\xlength\relax%
	}%
	\anchor{north east}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@x\xlength\relax%
		\advance\pgf@y\ylength\relax%
	}%
	\anchor{south west}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@x-\xlength\relax%
		\advance\pgf@y-\ylength\relax%
	}%
	\anchor{south east}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@x\xlength\relax%
		\advance\pgf@y-\ylength\relax%
	}%
	\anchor{north west}{%
		\rectanglecalloutpoints%
		\centerpoint%
		\advance\pgf@x-\xlength\relax%
		\advance\pgf@y\ylength\relax%
	}%
	\anchor{pointer}{%
		\rectanglecalloutpoints%
		\calloutpointeranchor%
	}%
	\backgroundpath{%
		\rectanglecalloutpoints%
		\pgf@x\xlength\relax%
		\pgf@y\ylength\relax%
		\pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
		\pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
		\edef\xtemp{\the\pgf@x}%
		\edef\ytemp{\the\pgf@y}%
		%
		% The absolute pointer must be calculated here because the
		% anchor of the shape (which is calculated after the saved
		% macros and points) affects how the pointer joins the 
		% main rectangle. 
		%
		\ifpgf@lib@callout@absolutepointer%
			\pgfextract@process\calloutpointer{%
				\pgfpointanchor{pgf@lib@callout@pointer}{center}%
			}%
			\pgf@lib@callouts@shortenpointer%
			\pgfmathsetlengthmacro\pointerwidth{\pgfkeysvalueof{/pgf/callout pointer width}}%
			\pgf@lib@rectanglecallout@pointer%
			%
			% \pgf@test = the shape name (from \pgfmultipartnode)
			%
			\ifx\pgf@test\pgfutil@empty%
			\else%
				%
				% Now hack an extra saved anchor \calloutpointeranchor,
				% with the new anchor for the callout pointer.
				%
				\edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@test\noexpand\endcsname}%
				\edef\pgf@sh@@@temp{%
					\noexpand\def\noexpand\calloutpointeranchor{%
						\noexpand\pgf@x\the\pgf@x%
						\noexpand\pgf@y\the\pgf@y%
					}%
				}%
				\expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}%
			\fi%
		\fi%
		{%
			\pgfsetcornersarced{\pgfqpoint{0pt}{0pt}}%
			\pgfpathmoveto{\beforecalloutpointer}%
		}%
		\pgfpathlineto{\calloutpointer}%
		{%
			\pgfsetcornersarced{\pgfqpoint{0pt}{0pt}}%
			\pgfpathlineto{\aftercalloutpointer}%
		}%
		{%
			\pgftransformshift{\centerpoint}%
			\pgfpathlineto{\firstpoint}%
			\pgfpathlineto{\secondpoint}%
			\pgfpathlineto{\thirdpoint}%
			\pgfpathlineto{\fourthpoint}%
			{%
				\pgfsetcornersarced{\pgfqpoint{0pt}{0pt}}%
				\pgfpathclose%
			}%
		}			
	}
	\anchorborder{%
		\pgfextract@process\externalpoint{}%
		\rectanglecalloutpoints%
		\pgfpointadd{\centerpoint}%
		{%
			\pgfpointborderrectangle{\pgfpointadd{\centerpoint}{\externalpoint}}%
			{\pgfqpoint{\xlength}{\ylength}}%
		}%
	}%
}



% \pgf@lib@rectanglecallout@pointer
%
% Internal macro for calculations relating to the rectangle callout.
%
% Requires the following to be set up:
%
% \calloutpointer - the location of the callout point.
% \xtemp          - the half width of the rectangle
% \ytemp          - the half height of the rectangle
% \pointerwidth   - the width of the pointer.
%
\def\pgf@lib@rectanglecallout@pointer{%
	%
	% Ensure that the pointer never connects to the main shape
	% too near to a corner. This is done for two reasons:
	% 1. It can look ugly.
	% 2. If the corners are rounded, a mess can result.
	%
	\pgfextract@process\borderpoint{%
			\pgfpointborderrectangle{%
				\centerpoint%
				\pgf@xa\pgf@x%
				\pgf@ya\pgf@y%
				\calloutpointer%
				\advance\pgf@x-\pgf@xa%
				\advance\pgf@y-\pgf@ya%
			}{\pgfqpoint{\xtemp}{\ytemp}}%
		}%
	\pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
	\let\borderangle\pgfmathresult%
	%
	\pgfutil@tempdima\pointerwidth\relax%
	\pgf@xa\xtemp\relax%
	\advance\pgf@xa-\pgfutil@tempdima%
	\pgf@ya\ytemp\relax%
	\advance\pgf@ya-\pgfutil@tempdima%
	%
	\pgf@process{%
		\pgfutil@ifundefined{pgf@corner@arc}{\pgfpointorigin}{%
			\expandafter\pgfqpoint\pgf@corner@arc}%
	}%
	\advance\pgf@xa-\pgf@x%
	\advance\pgf@ya-\pgf@y%
	%
	\borderpoint%
	\pgf@xb\pgf@x%
	\pgf@yb\pgf@y%
	%
	\pgf@xc0pt\relax%
	\pgf@yc0pt\relax%
	%
	\pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{\xtemp}{\ytemp}}%
	\ifdim\borderangle pt<\pgfmathresult pt\relax%
		\pgf@yc.5\pgfutil@tempdima%
		\ifdim\pgf@yb>\pgf@ya%
			\pgf@yb\pgf@ya%
		\fi%
		%
		% Establish the order for drawing the rectangle corners.
		%
		\edef\firstpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
		\edef\secondpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
		\edef\thirdpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
		\edef\fourthpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
	\else%
		\pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{-\xtemp}{\ytemp}}%
		\ifdim\borderangle pt<\pgfmathresult pt\relax%
			\pgf@xc-.5\pgfutil@tempdima%
			\ifdim\pgf@xb>\pgf@xa%
				\pgf@xb\pgf@xa%
			\else%
				\ifdim\pgf@xb<-\pgf@xa%
					\pgf@xb-\pgf@xa%
				\fi%
			\fi%
			\edef\firstpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
			\edef\secondpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
			\edef\thirdpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
			\edef\fourthpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
		\else%
			\pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{-\xtemp}{-\ytemp}}%
			\ifdim\borderangle pt<\pgfmathresult pt\relax%
				\pgf@yc-.5\pgfutil@tempdima%
				\ifdim\pgf@yb>\pgf@ya%
					\pgf@yb\pgf@ya%
				\else%
					\ifdim\pgf@yb<-\pgf@ya%
						\pgf@yb-\pgf@ya%
					\fi%
				\fi%
				\edef\firstpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
				\edef\secondpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
				\edef\thirdpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
				\edef\fourthpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
			\else%
				\pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{\xtemp}{-\ytemp}}%
				\ifdim\borderangle pt<\pgfmathresult pt\relax%
					\pgf@xc.5\pgfutil@tempdima%
					\ifdim\pgf@xb>\pgf@xa%
						\pgf@xb\pgf@xa%
					\else%
						\ifdim\pgf@xb<-\pgf@xa%
							\pgf@xb-\pgf@xa%
						\fi%
					\fi%
					\edef\firstpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
					\edef\secondpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
					\edef\thirdpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
					\edef\fourthpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
				\else%
					\pgf@yc.5\pgfutil@tempdima%
					\ifdim\pgf@yb<-\pgf@ya%
						\pgf@yb-\pgf@ya%
					\fi%
					\edef\firstpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
					\edef\secondpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
					\edef\thirdpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
					\edef\fourthpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
				\fi%
			\fi%
		\fi%
	\fi%
	\pgfextract@process\beforecalloutpointer{%
		\centerpoint%
		\advance\pgf@x\pgf@xb%
		\advance\pgf@y\pgf@yb%
		\advance\pgf@x-\pgf@xc%		
		\advance\pgf@y-\pgf@yc%
	}%	
	\pgfextract@process\aftercalloutpointer{%
		\centerpoint%
		\advance\pgf@x\pgf@xb%
		\advance\pgf@y\pgf@yb%
		\advance\pgf@x\pgf@xc%		
		\advance\pgf@y\pgf@yc%
	}%	
	%
	% Now calculate the pointer anchor.
	%
	\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
	\pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
	\ifdim\pgf@x>\pgf@y%
		\edef\outersep{\the\pgf@x}%
	\else%
		\edef\outersep{\the\pgf@y}%
	\fi%
	\pgf@lib@callouts@pointeranchor%
}


% Internal macro for parsing the size of 
% the cloud callout pointer.
%
% \pgf@x and \pgf@y should be set up as the
% width and height of the main shape.
%
% \pgf@xa and \pgf@ya are returned appropriately.
%
\def\pgf@lib@callout@setpointersize#1{%
	\edef\pgf@lib@callout@temp{#1}%
	\edef\pgf@marshall{\noexpand\pgfutil@in@{of callout}{\pgf@lib@callout@temp}}%
	\pgf@marshall%
	\ifpgfutil@in@%
		\expandafter\pgf@xa\expandafter\pgf@lib@callout@setpointerrelativesize%
			\pgf@lib@callout@temp\pgf@lib@stop\pgf@x%
		\expandafter\pgf@ya\expandafter\pgf@lib@callout@setpointerrelativesize%
			\pgf@lib@callout@temp\pgf@lib@stop\pgf@y%
	\else%
		\edef\pgf@marshall{\noexpand\pgfutil@in@{and}{\pgf@lib@callout@temp}}%
		\pgf@marshall%
		\ifpgfutil@in@%
			\expandafter\pgf@lib@callout@setpointerbothsizes\pgf@lib@callout@temp\pgf@lib@stop%
		\else%
			\pgfmathsetlength\pgf@xa{#1}%
			\pgfmathsetlength\pgf@ya{#1}%
		\fi%
	\fi%		 
}
\def\pgf@lib@callout@setpointerrelativesize#1of callout#2\pgf@lib@stop{#1}%
\def\pgf@lib@callout@setpointerbothsizes#1and#2\pgf@lib@stop{%
	\pgfmathsetlength\pgf@xa{#2}%
	\pgfmathsetlength\pgf@ya{#2}%
}

% Shape: cloud callout.
%
\pgfdeclareshape{cloud callout}{%
	\savedanchor\calloutpointer{%
		\pgfutil@ifundefined{pgf@sh@s@cloud}{%
			\PackageError{PGF}{I cannot find the cloud shape. Please load the `symbol shapes' library}{}}{}%
		\pgf@sh@s@cloud%
		\pgf@sh@savedmacros%
		%
		\pgfextract@process\centerpoint{%
			\pgf@x.5\wd\pgfnodeparttextbox%
			\pgf@y.5\ht\pgfnodeparttextbox%
			\advance\pgf@y-.5\dp\pgfnodeparttextbox%
		}%
		\ifpgf@lib@callout@absolutepointer%
	  \else%
	  	\pgfextract@process\calloutpointer{%
				\pgfextract@process\borderpoint{%
					\expandafter\pgfpointborderellipse\expandafter{\pgf@lib@callout@relativepointer}%
						{\pgfqpoint{\xouterradius}{\youterradius}}%
				}%
				\pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
				\let\pointerangle\pgfmathresult%
				\expandafter\pgf@process\expandafter{\pgf@lib@callout@relativepointer}%
				\pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
				\edef\pointerradius{\pgfmathresult pt}%
				\pgfpointadd{\borderpoint}{\pgfqpointpolar{\pointerangle}{\pointerradius}}%
				\pgf@xa\pgf@x%
				\pgf@ya\pgf@y%
				\centerpoint%
				\advance\pgf@x\pgf@xa%
				\advance\pgf@y\pgf@ya%
			}%
			\pgf@lib@callouts@shortenpointer%
		\fi%
	}
	\anchor{pointer}{%
		\calloutpointer%
	}%
	\inheritsavedanchors[from=cloud]
	\inheritanchor[from=cloud]{center}
	\inheritanchor[from=cloud]{base}
	\inheritanchor[from=cloud]{mid}
	\inheritanchor[from=cloud]{north}
	\inheritanchor[from=cloud]{south}
	\inheritanchor[from=cloud]{east}
	\inheritanchor[from=cloud]{west}
	\inheritanchor[from=cloud]{north east}
	\inheritanchor[from=cloud]{south west}
	\inheritanchor[from=cloud]{south east}
	\inheritanchor[from=cloud]{north west}
	\inheritanchorborder[from=cloud]
	\backgroundpath{%
		\pgf@sh@bg@cloud%
		\ifpgf@lib@callout@absolutepointer%
   		\pgfextract@process\calloutpointer{%
				\pgfpointanchor{pgf@lib@callout@pointer}{center}%
			}%
			\ifx\pgf@test\pgfutil@empty%
			\else%
				\edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@test\noexpand\endcsname}%
				\edef\pgf@sh@@@temp{%
					\noexpand\def\noexpand\calloutpointeranchor{%
						\noexpand\pgf@x\the\pgf@x%
						\noexpand\pgf@y\the\pgf@y%
					}%
				}%
				\expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}
			\fi%
		\fi%
		%
		\pgfextract@process\borderpoint{%
			\pgfpointadd{%
				\pgfpointborderellipse{\pgfpointdiff{\centerpoint}{\calloutpointer}}%
						{\pgfqpoint{\xouterradius}{\youterradius}}%
			}{\centerpoint}%
		}%
		\pgf@lib@callouts@shortenpointer%
		\pgfmathanglebetweenpoints{\calloutpointer}{\centerpoint}%
		\let\angle\pgfmathresult%
		\pgfmathsin@{\angle}%
		\let\sinpointerangle\pgfmathresult%
		\pgfmathcos@{\angle}%
		\let\cospointerangle\pgfmathresult%	
		%
		\pgf@x\xouterradius\relax%
		\pgf@x2.0\pgf@x%
		\pgf@y\yinnerradius\relax%
		\pgf@y2.0\pgf@y%
		\pgf@lib@callout@setpointersize{\pgfkeysvalueof{/pgf/callout pointer start size}}%
		\pgf@xb\pgf@xa%
		\pgf@yb\pgf@ya%
		\pgf@lib@callout@setpointersize{\pgfkeysvalueof{/pgf/callout pointer end size}}%
		\advance\pgf@xb-\pgf@xa%
		\advance\pgf@yb-\pgf@ya%
		%
		\pgfmathsetcount\c@pgf@counta{\pgfkeysvalueof{/pgf/callout pointer segments}}%
		\divide\pgf@xb\c@pgf@counta%
		\divide\pgf@yb\c@pgf@counta%
		%
		\pgf@process{\pgfpointdiff{\borderpoint}{\calloutpointer}}%
		\pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
		\pgfutil@tempdima\pgfmathresult pt\relax%
		\divide\pgfutil@tempdima\c@pgf@counta%
		%
		\pgfutil@tempdimb0pt\relax%
		\pgfmathloop%
		\ifnum\pgfmathcounter>\c@pgf@counta%
		\else%
			{%
				\pgf@xa.5\pgf@xa%
				\pgf@ya.5\pgf@ya%
				\edef\tempxradius{\the\pgf@xa}%
				\edef\tempyradius{\the\pgf@ya}%
				\pgfpathellipse%
					{%
						\calloutpointer%
						\advance\pgf@x\cospointerangle\pgfutil@tempdimb%
						\advance\pgf@y\sinpointerangle\pgfutil@tempdimb%
					}%
					{\pgfqpoint{\tempxradius}{0pt}}{\pgfqpoint{0pt}{\tempyradius}}%
			}%
			\advance\pgf@xa\pgf@xb%
			\advance\pgf@ya\pgf@yb%
			\advance\pgfutil@tempdimb\pgfutil@tempdima%
		\repeatpgfmathloop%
	}%
	%
	% Hack the puff anchors for the callout.
	%
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@cloud callout\endcsname{%
		\c@pgf@counta\puffs\relax%
		\pgfmathloop%
			\ifnum\c@pgf@counta>0\relax%
				\pgfutil@ifundefined{pgf@anchor@cloud callout@puff\space\the\c@pgf@counta}{%
				\expandafter\xdef\csname pgf@anchor@cloud callout@puff\space\the\c@pgf@counta\endcsname{%
					\noexpand\pgf@sh@@cloudpuffanchor{\the\c@pgf@counta}%
				}%
			}{\c@pgf@counta0\relax}%
			\advance\c@pgf@counta-1\relax%
		\repeatpgfmathloop%	
	}%
}

\endinput
