You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
9.5 KiB
301 lines
9.5 KiB
% 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{pgfcorepatterns.code.tex}
|
|
|
|
% Creates a new uncolored pattern
|
|
%
|
|
% [#1] = optional list of variables.
|
|
% #2 = pattern name
|
|
% #3 = lower left of bounding box
|
|
% #4 = upper right of bounding box
|
|
% #5 = step vector
|
|
% #6 = pattern code
|
|
%
|
|
% Description:
|
|
%
|
|
% Declares a new uncolored pattern. An uncolored pattern is a pattern
|
|
% that has no inherent color. When the pattern is used, a color for
|
|
% the pattern must be supplied.
|
|
%
|
|
% See the pdf-manual for more details on uncolored patterns.
|
|
%
|
|
% Specifying a variable list makes the pattern ``mutable''.
|
|
%
|
|
% The bounding box must be a bounding box of the pattern cell.
|
|
%
|
|
% The step vector must provide the x- and y-step by which the cells
|
|
% are spaced.
|
|
%
|
|
% The pattern code should be pgf code that can be protocolled.
|
|
%
|
|
% The transformation matrix will be reset prior to invoking the
|
|
% pattern code.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfdeclarepatternformonly{stars}{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
|
|
% {\pgfpoint{1cm}{1cm}}{
|
|
% \pgftransformshift{\pgfpoint{.5cm}{.5cm}}
|
|
% \pgfpathmoveto{\pgfpointpolar{0}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{144}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{288}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{72}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{216}{4mm}}
|
|
% \pgfpathclose%
|
|
% \pgfusepath{stroke}
|
|
% }
|
|
%
|
|
\def\pgfdeclarepatternformonly{%
|
|
\def\pgf@pattern@type{formonly}%
|
|
\pgfutil@ifnextchar[{\pgf@declarepattern@checkarg}{\pgf@declarepattern@checkarg[]}%
|
|
}
|
|
|
|
|
|
% Creates a new colored pattern
|
|
%
|
|
% [#1] = optional list of variables.
|
|
% #2 = pattern name
|
|
% #3 = lower left of bounding box
|
|
% #4 = upper right of bounding box
|
|
% #5 = step vector
|
|
% #6 = pattern code
|
|
%
|
|
% Description:
|
|
%
|
|
% Declares a new colored pattern. Such patterns have a one or more
|
|
% fixed inherent colors. See the pdf-manual for more details on
|
|
% uncolored patterns.
|
|
%
|
|
% The parameters have the same effect as for uncolored patterns.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfdeclarepatterninherentlycolored{red stars}{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
|
|
% {\pgfpoint{1cm}{1cm}}{
|
|
% \pgfsetfillcolor{red}
|
|
% \pgfsetstrokecolor{black}
|
|
% \pgftransformshift{\pgfpoint{.5cm}{.5cm}}
|
|
% \pgfpathmoveto{\pgfpointpolar{0}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{144}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{288}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{72}{4mm}}
|
|
% \pgfpathlineto{\pgfpointpolar{216}{4mm}}
|
|
% \pgfpathclose%
|
|
% \pgfusepath{stroke,fill}
|
|
% }
|
|
%
|
|
\def\pgfdeclarepatterninherentlycolored{%
|
|
\def\pgf@pattern@type{inherentlycolored}%
|
|
\pgfutil@ifnextchar[{\pgf@declarepattern@checkarg}{\pgf@declarepattern@checkarg[]}%
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
\def\pgf@declarepattern@checkarg[#1]{%
|
|
\def\pgf@pattern@tempvars{#1}%
|
|
\ifx\pgf@pattern@tempvars\pgfutil@empty%
|
|
\expandafter\let\expandafter\pgf@next\csname pgf@declarepattern\pgf@pattern@type\endcsname%
|
|
\else%
|
|
\expandafter\let\expandafter\pgf@next\csname pgf@declarepattern\pgf@pattern@type @mutable\endcsname%
|
|
\fi%
|
|
\pgf@next}
|
|
|
|
\long\def\pgf@declarepatternformonly#1#2#3#4#5{\pgf@declarepattern{#1}{#2}{#3}{#4}{#5}{0}}
|
|
|
|
\long\def\pgf@declarepatterninherentlycolored#1#2#3#4#5{\pgf@declarepattern{#1}{#2}{#3}{#4}{#5}{1}}
|
|
|
|
\long\def\pgf@declarepatternformonly@mutable#1#2#3#4#5{%
|
|
\def\pgf@marshal{\pgf@declarepatternmutable{#1}}%
|
|
\expandafter\pgf@marshal\expandafter{\pgf@pattern@tempvars}{#2}{#3}{#4}{#5}{2}%
|
|
}
|
|
|
|
\long\def\pgf@declarepatterninherentlycolored@mutable#1#2#3#4#5#6{%
|
|
\def\pgf@marshal{\pgf@declarepatternmutable{#1}}%
|
|
\expandafter\pgf@marshal\expandafter{\pgf@pattern@tempvars}{#2}{#3}{#4}{#5}{3}%
|
|
}
|
|
|
|
\def\pgfsys@patternmatrix{{1.0}{0.0}{0.0}{1.0}{0.0pt}{0.0pt}}
|
|
\def\pgf@declarepattern#1#2#3#4#5#6{%
|
|
\pgfutil@ifundefined{pgf@pattern@name@#1}{%
|
|
\pgfsysprotocol@getcurrentprotocol\pgf@pattern@temp%
|
|
{%
|
|
\pgfinterruptpath%
|
|
\pgfpicturetrue%
|
|
\pgf@relevantforpicturesizefalse%
|
|
\pgftransformreset%
|
|
\pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
|
|
\pgfsysprotocol@bufferedtrue%
|
|
\pgfsys@beginscope%
|
|
\pgfsetarrows{-}%
|
|
#5%
|
|
\pgfsys@endscope%
|
|
\pgfsysprotocol@getcurrentprotocol\pgf@pattern@code%
|
|
\global\let\pgf@pattern@code=\pgf@pattern@code%
|
|
\endpgfinterruptpath%
|
|
\pgf@process{#2}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{#3}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@process{#4}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
% Now, build a name for the pattern
|
|
\pgfutil@tempcnta=\pgf@pattern@number%
|
|
\advance\pgfutil@tempcnta by1\relax%
|
|
\xdef\pgf@pattern@number{\the\pgfutil@tempcnta}%
|
|
\expandafter\xdef\csname pgf@pattern@name@#1\endcsname{\the\pgfutil@tempcnta}%
|
|
\expandafter\gdef\csname pgf@pattern@type@#1\endcsname{#6}%
|
|
\xdef\pgf@marshal{\noexpand\pgfsys@declarepattern
|
|
{\csname pgf@pattern@name@#1\endcsname}% name
|
|
{\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}% bbox
|
|
{\the\pgf@xc}{\the\pgf@yc}% x/y step
|
|
\pgfsys@patternmatrix% transformation matrix
|
|
{\pgf@pattern@code}{#6}}%
|
|
}%
|
|
\pgfsysprotocol@setcurrentprotocol\pgf@pattern@temp%
|
|
\expandafter\global\expandafter\let\csname pgf@pattern@instantiate@#1\endcsname=\pgf@marshal%
|
|
}
|
|
{%
|
|
\pgferror{Pattern `#1' already defined}%
|
|
}%
|
|
}
|
|
|
|
\def\pgf@pattern@number{0}%
|
|
|
|
\def\pgf@declarepatternmutable#1#2#3#4#5#6#7{%
|
|
\pgfutil@ifundefined{pgf@pattern@name@#1}{%
|
|
\expandafter\gdef\csname pgf@pattern@name@#1\endcsname{#1}%
|
|
\expandafter\gdef\csname pgf@pattern@variables@#1\endcsname{#2}%
|
|
\expandafter\gdef\csname pgf@pattern@lowerleft@#1\endcsname{#3}%
|
|
\expandafter\gdef\csname pgf@pattern@upperright@#1\endcsname{#4}%
|
|
\expandafter\gdef\csname pgf@pattern@tilesize@#1\endcsname{#5}%
|
|
\expandafter\long\expandafter\gdef\csname pgf@pattern@code@#1\endcsname{#6}%
|
|
\expandafter\gdef\csname pgf@pattern@type@#1\endcsname{7}%
|
|
}{\pgferror{The pattern `#1' is already defined}}%
|
|
}
|
|
|
|
\def\pgf@ifpatternisinherentlycolored#1#2#3{%
|
|
\expandafter\ifodd\csname pgf@pattern@type@#1\endcsname\relax#2\else#3\fi%
|
|
}
|
|
|
|
\def\pgf@ifpatternismutable#1#2#3{%
|
|
\expandafter\ifnum\csname pgf@pattern@type@#1\endcsname>1\relax#2\else#3\fi%
|
|
}
|
|
|
|
\def\pgfpatternreleasename#1{\expandafter\let\csname pgf@pattern@name@#1\endcsname\relax}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% Set an pattern as fill color
|
|
%
|
|
% #1 = Name of the pattern
|
|
% #2 = Color to be used for the pattern. If the pattern is already
|
|
% colored, this parameter is ignored.
|
|
%
|
|
% Description:
|
|
%
|
|
% Sets the pattern for subsequent filling operations.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetfillpattern{stars}{red}
|
|
%
|
|
\def\pgfsetfillpattern#1#2{%
|
|
\pgfutil@ifundefined{pgf@pattern@name@#1}%
|
|
{%
|
|
\pgferror{Undefined pattern `#1'}%
|
|
}%
|
|
{%
|
|
\pgf@ifpatternismutable{#1}%
|
|
{%
|
|
% So, a mutable pattern. Check to see if the pattern
|
|
% has been used with the current variable values...
|
|
\let\pgf@pattern@tempvars\pgfutil@empty%
|
|
\expandafter\expandafter\expandafter\pgf@pattern@check@vars%
|
|
\csname pgf@pattern@variables@#1\endcsname,\pgf@stop,%
|
|
\edef\pgf@pattern@nametemp{pgf@pattern@#1@\pgf@pattern@tempvars}%
|
|
\expandafter\pgfutil@ifundefined\expandafter{\pgf@pattern@nametemp}%
|
|
{%
|
|
% ...Nope. So declare a new instance of the mutable pattern.
|
|
\pgf@ifpatternisinherentlycolored{#1}%
|
|
{\let\pgf@set@fillpattern@declare\pgfdeclarepatterninherentlycolored}%
|
|
{\let\pgf@set@fillpattern@declare\pgfdeclarepatternformonly}%
|
|
\pgf@set@fillpattern@declare%
|
|
{\pgf@pattern@nametemp}%
|
|
{\csname pgf@pattern@lowerleft@#1\endcsname}%
|
|
{\csname pgf@pattern@upperright@#1\endcsname}%
|
|
{\csname pgf@pattern@tilesize@#1\endcsname}%
|
|
{\csname pgf@pattern@code@#1\endcsname}%
|
|
}%
|
|
{%
|
|
% ...Yep. So do nothing.
|
|
}%
|
|
\expandafter\pgf@set@fillpattern\expandafter{\pgf@pattern@nametemp}{#2}%
|
|
\expandafter\gdef\csname\pgf@pattern@nametemp\endcsname{#1}%
|
|
}%
|
|
{%
|
|
% A non-mutable pattern.
|
|
\pgf@set@fillpattern{#1}{#2}%
|
|
}%
|
|
}%
|
|
}
|
|
|
|
|
|
\def\pgf@set@fillpattern#1#2{%
|
|
\pgfutil@ifundefined{pgf@pattern@name@#1}{%
|
|
\pgferror{Undefined pattern `#1'}}
|
|
{%
|
|
\csname pgf@pattern@instantiate@#1\endcsname%
|
|
\expandafter\global\expandafter\let\csname pgf@pattern@instantiate@#1\endcsname=\relax%
|
|
\pgf@ifpatternisinherentlycolored{#1}{%
|
|
\pgfsys@setpatterncolored{\csname pgf@pattern@name@#1\endcsname}%
|
|
}{%
|
|
\pgfutil@colorlet{pgf@tempcolor}{#2}%
|
|
\pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@tempcolor}}%
|
|
\pgfutil@extractcolorspec{pgf@tempcolor}{\pgf@tempcolor}%
|
|
\expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}%
|
|
\expandafter\pgf@set@fill@patternuncolored\pgf@rgbcolor\relax{#1}%
|
|
}%
|
|
}%
|
|
}
|
|
|
|
\def\pgf@set@fill@patternuncolored#1,#2,#3\relax#4{%
|
|
\pgfsys@setpatternuncolored{\csname pgf@pattern@name@#4\endcsname}{#1}{#2}{#3}%
|
|
}
|
|
|
|
\def\pgf@pattern@check@vars#1,{%
|
|
\ifx#1\pgf@stop%
|
|
\let\pgf@next\relax%
|
|
\else%
|
|
\afterassignment\pgfmath@gobbletilpgfmath@%
|
|
\expandafter\let\expandafter\pgf@pattern@char#1#1\pgfmath@%
|
|
\ifx\pgf@pattern@char/%
|
|
\edef\pgf@pattern@tempvar{(\pgfkeysvalueof{#1})}%
|
|
\else%
|
|
\expandafter\ifcat\pgf@pattern@char\relax%
|
|
\edef\pgf@pattern@tempvar{(\the#1)}%
|
|
\else%
|
|
\edef\pgf@pattern@tempvar{(#1)}%
|
|
\fi%
|
|
\fi%
|
|
\edef\pgf@pattern@tempvars{\pgf@pattern@tempvars\pgf@pattern@tempvar}%
|
|
\let\pgf@next\pgf@pattern@check@vars%
|
|
\fi%
|
|
\pgf@next%
|
|
}
|
|
|
|
\endinput
|
|
|