Current File : //usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibrarypatterns.meta.code.tex |
% Copyright 2019 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.
\def\pgf@pat@type@uncolored{0}%
\def\pgf@pat@type@colored{1}%
\newif\ifpgf@pat@makepatternimmutable
\pgfkeys{/pgf/patterns/.cd,
name/.store in=\pgf@pat@name,
number ../.store in=\pgf@pat@number,
type/.is choice,
type/uncolored/.code={\let\pgf@pat@type=\pgf@pat@type@uncolored},
type/colored/.code={\let\pgf@pat@type=\pgf@pat@type@colored},
type/form only/.style={/pgf/patterns/type=uncolored},
type/inherently colored/.style={/pgf/patterns/type=colored},
x/.store in=\pgf@pat@xvec,
y/.store in=\pgf@pat@yvec,
parameters/.store in=\pgf@pat@parameters,
defaults/.store in=\pgf@pat@defaults,
append to defaults/.code={%
\pgf@pat@addto@macro\pgf@pat@defaults{,#1}%
},
bottom left/.store in=\pgf@pat@bottomleft,
top right/.store in=\pgf@pat@topright,
tile size/.store in=\pgf@pat@tilesize,
tile transformation/.store in=\pgf@pat@transformation,
code/.store in=\pgf@pat@code,
set up code/.store in=\pgf@pat@declarebefore,
%
name=,
number ..=,
type=uncolored,
x=1cm, y=1cm,
parameters=,
defaults=,
bottom left=,
top right=,
tile size=,
tile transformation=,
code=,
set up code=,
}%
\def\pgf@pat@name@prefix{pgf@pattern@name@meta@}%
\def\pgfifpatternundefined#1{%
\pgfutil@ifundefined{\pgf@pat@name@prefix#1}%
}%
\def\pgf@pat@adddef@to@macro#1#2{%
\expandafter\expandafter\expandafter\def%
\expandafter\expandafter\expandafter#1%
\expandafter\expandafter\expandafter{\expandafter#1\expandafter%
\def\expandafter#2\expandafter{#2}}%
}%
\def\pgf@pat@addto@macro#1#2{%
\expandafter\def\expandafter#1\expandafter{#1#2}}%
\def\pgf@pat@process#1{%
\pgf@process{#1}%
}%
\def\pgf@pat@doifnotempty#1{%
\ifx#1\pgfutil@empty%
\let\pgf@pat@next=\relax%
\else%
\let\pgf@pat@next=#1%
\fi%
\pgf@pat@next%
}%
\def\pgf@pat@processtransformations#1{#1}%
\def\pgf@pat@processpoint#1{%
\pgf@process{#1}%
}%
\def\pgfdeclarepattern#1{%
\begingroup%
\nullfont%
\def\pgf@pat@options{,#1}%
\pgfkeys{/pgf/patterns/.cd,#1}%
\ifx\pgf@pat@name\pgfutil@empty
\pgferror{Declaring unnamed pattern}%
\fi
\ifx\pgf@pat@bottomleft\pgfutil@empty
\pgferror{Bottom left corner of the bounding box unset}%
\fi
\ifx\pgf@pat@topright\pgfutil@empty
\pgferror{Top right corner of the bounding box unset}%
\fi
\ifx\pgf@pat@tilesize\pgfutil@empty
\pgferror{Tile size unset}%
\fi
\ifx\pgf@pat@code\pgfutil@empty
\pgferror{Pattern code is empty}%
\fi
\pgf@declarepattern@meta%
\endgroup%
}%
\def\pgf@declarepattern@meta{%
\pgfifpatternundefined{\pgf@pat@name}{%
\ifx\pgf@pat@parameters\pgfutil@empty%
% No parameters, so pattern is declared now.
\pgf@pat@declare%
\edef\pgf@marshal{%
\noexpand\pgf@pat@addto@macro\noexpand\pgf@pat@options{,number ..=\pgf@pattern@number}}%
\pgf@marshal%
\fi%
% It is a bit inefficient that all the options for
% immutable patterns are saved when only the type
% and number are needed.
\expandafter\global\expandafter\let\csname\pgf@pat@name@prefix\pgf@pat@name\endcsname=\pgf@pat@options%
}{%
\pgferror{Pattern `\pgf@pat@name' already defined}%
}%
}%
\let\pgf@pat@declarebefore=\pgfutil@empty
\let\pgf@pat@declareafter=\pgfutil@empty
\let\pgf@pat@codebefore=\pgfutil@empty
\let\pgf@pat@codeafter=\pgfutil@empty
\def\pgf@pat@declare{%
\pgfsysprotocol@getcurrentprotocol\pgf@pattern@temp%
{%
% Set up x and y vectors. Should use a scope rather than TeX group?
% Vectors may be needed when the tile bounding box is
% calculated.
\pgfsetxvec{\pgfpoint{\pgf@pat@xvec}{+0pt}}%
\pgfsetyvec{\pgfpoint{+0pt}{\pgf@pat@yvec}}%
\pgf@pat@doifnotempty\pgf@pat@declarebefore%
\pgfinterruptpath%
\pgfpicturetrue%
\pgf@relevantforpicturesizetrue%
\pgftransformreset%
\pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
\pgfsysprotocol@bufferedtrue%
\pgfsys@beginscope%
\pgfinterruptboundingbox%
\pgfsetarrows{-}%
\pgf@pat@doifnotempty\pgf@pat@codebefore
\pgf@pat@code%
\pgf@pat@doifnotempty\pgf@pat@codeafter%
\endpgfinterruptboundingbox%
\pgfsys@endscope%
\pgfsysprotocol@getcurrentprotocol\pgf@pattern@code%
\global\let\pgf@pattern@code=\pgf@pattern@code%
\endpgfinterruptpath%
\pgf@pat@doifnotempty\pgf@pat@declareafter%
\pgf@pat@processpoint{\pgf@pat@bottomleft}%
\pgf@xa=\pgf@x%
\pgf@ya=\pgf@y%
\pgf@pat@processpoint{\pgf@pat@topright}%
\pgf@xb=\pgf@x%
\pgf@yb=\pgf@y%
\pgf@pat@processpoint{\pgf@pat@tilesize}%
\pgf@xc=\pgf@x%
\pgf@yc=\pgf@y%
\begingroup%
\pgftransformreset%
\pgf@pat@processtransformations\pgf@pat@transformation%
\pgfgettransformentries\aa\ab\ba\bb\shiftx\shifty%
\global\edef\pgf@pattern@matrix{{\aa}{\ab}{\ba}{\bb}{\shiftx}{\shifty}}%
\endgroup%
% Now, build a name for the pattern
\pgfutil@tempcnta=\pgf@pattern@number\relax%
\advance\pgfutil@tempcnta by1\relax%
\xdef\pgf@pattern@number{\the\pgfutil@tempcnta}%
\xdef\pgf@marshal{\noexpand\pgfsys@declarepattern%
{\pgf@pattern@number}%
{\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}{\the\pgf@xc}{\the\pgf@yc}\pgf@pattern@matrix{\pgf@pattern@code}{\pgf@pat@type}}%
}%
\pgf@marshal%
\pgfsysprotocol@setcurrentprotocol\pgf@pattern@temp%
}%
\def\pgf@pat@checkname#1{%
\pgf@pat@@checkname#1[]\pgf@patstop}%
\def\pgf@pat@@checkname#1[#2]#3\pgf@patstop{%
\expandafter\def\expandafter\pgf@pat@onlinename\expandafter{\romannumeral-`0\pgfutil@trimspaces{#1}}%
\def\pgf@pat@onlineoptions{#2}%
}%
\def\pgf@pat@unravel#1/{%
\pgfutil@ifnextchar\pgf@stop{\def\pgf@pat@unravelled{#1}}{\pgf@pat@unravel}}%
\pgfkeys{/handlers/.pattern/.code={%
\expandafter\expandafter\expandafter\pgf@pat@unravel\pgfkeyscurrentpath/\pgf@stop%
\pgfpatternalias{#1}{\pgf@pat@unravelled}%
}}%
\def\pgfpatternalias#1#2{%
\begingroup%
\pgf@pat@checkname{#1}%
\expandafter\let\expandafter\pgf@pat@options\expandafter=%
\csname\pgf@pat@name@prefix\pgf@pat@onlinename\endcsname%
\pgf@pat@macroaskeys{/pgf/patterns/.cd}{\pgf@pat@options}%
\pgfutil@toks@\expandafter{\pgf@pat@onlineoptions}%
\edef\pgf@pat@tmp{append to defaults={\the\pgfutil@toks@}}%
\expandafter\pgf@pat@addto@macro\expandafter\pgf@pat@options\expandafter{\expandafter,\pgf@pat@tmp}%
\pgf@pat@addto@macro\pgf@pat@options{,name=#2}%
\expandafter\global\expandafter\let\csname\pgf@pat@name@prefix#2\endcsname=\pgf@pat@options%
\endgroup%
}%
\let\pgfsetfillpattern@old=\pgfsetfillpattern
\def\pgf@pat@macroaskeys#1#2{%
\pgfutil@toks@\expandafter{#2}%
\edef\pgf@marshal{\noexpand\pgfkeys{,#1,\the\pgfutil@toks@}}%
\pgf@marshal%
}%
\def\pgfsetfillpattern#1#2{%
\pgf@pat@checkname{#1}%
\pgfutil@ifundefined{\pgf@pat@name@prefix\pgf@pat@onlinename}{%
\pgfsetfillpattern@old{\pgf@pat@onlinename}{#2}%
}{%
\let\pgf@pat@parameters=\pgfutil@empty%
% Get pattern parameters, type, and number
\expandafter\let\expandafter\pgf@pat@options\expandafter=%
\csname\pgf@pat@name@prefix\pgf@pat@onlinename\endcsname%
\pgf@pat@macroaskeys{/pgf/patterns/.cd}{\pgf@pat@options}%
\ifx\pgf@pat@parameters\pgfutil@empty%
% Immutable pattern. Do nothing.
\else%
% Mutable. Do a *lot*.
\begingroup%
\pgf@pat@macroaskeys{/pgf/pattern keys/.cd}{\pgf@pat@defaults}%
\pgf@pat@macroaskeys{/pgf/pattern keys/.cd}{\pgf@pat@onlineoptions}%
% ...to get the values of the current parameters...
\edef\pgf@pat@current@parameters{\pgf@pat@parameters}%
% ...and the internal pattern name.
\edef\pgf@pat@onlinename{\pgf@pat@onlinename\pgf@pat@current@parameters}%
\let\pgf@pat@name=\pgf@pat@onlinename%
\pgfutil@ifundefined{\pgf@pat@name@prefix\pgf@pat@onlinename}{%
%\ifpgf@pat@makepatternimmutable%
\let\pgf@pat@parameters=\pgfutil@empty%
%\fi%
\pgf@declarepattern@meta%
}{}%
\expandafter%
\endgroup%
\expandafter\def\expandafter\pgf@pat@onlinename\expandafter{\pgf@pat@onlinename}%
\expandafter\let\expandafter\pgf@pat@options\expandafter=%
\csname\pgf@pat@name@prefix\pgf@pat@onlinename\endcsname%
\pgf@pat@macroaskeys{/pgf/patterns/.cd}{\pgf@pat@options}%
\fi%
\ifx\pgf@pat@type\pgf@pat@type@uncolored%
\pgf@pat@setpatternuncolored{\pgf@pat@number}{#2}%
\else%
\pgfsys@setpatterncolored{\pgf@pat@number}%
\fi%
}%
}%
\def\pgf@pat@setpatternuncolored#1#2{%
\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@pat@set@fill@patternuncolored\pgf@rgbcolor\relax{#1}%
}%
\def\pgf@pat@set@fill@patternuncolored#1,#2,#3\relax#4{%
\pgfsys@setpatternuncolored{#4}{#1}{#2}{#3}%
}%
% Predefined patterns
\pgfdeclarepattern{
name=Lines,
parameters={
\pgfkeysvalueof{/pgf/pattern keys/distance},
\pgfkeysvalueof{/pgf/pattern keys/angle},
\pgfkeysvalueof{/pgf/pattern keys/xshift},
\pgfkeysvalueof{/pgf/pattern keys/yshift},
\pgfkeysvalueof{/pgf/pattern keys/line width},
},
bottom left={%
\pgfpoint
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
top right={%
\pgfpoint
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
tile size={%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/distance}}%
{\pgfkeysvalueof{/pgf/pattern keys/distance}}},
tile transformation={%
\pgftransformshift{%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/xshift}}%
{\pgfkeysvalueof{/pgf/pattern keys/yshift}}}%
\pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}},
defaults={
distance/.initial=3pt,
angle/.initial=0,
xshift/.initial=0pt,
yshift/.initial=0pt,
line width/.initial=\the\pgflinewidth,
},
code={%
\pgfsetlinewidth{\pgfkeysvalueof{/pgf/pattern keys/line width}}%
\pgfpathmoveto{\pgfpoint{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}%
\pgfpathlineto{\pgfpoint{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}%
\pgfusepath{stroke}%
},
}
\pgfdeclarepattern{
name=Hatch,
parameters={
\pgfkeysvalueof{/pgf/pattern keys/distance},
\pgfkeysvalueof{/pgf/pattern keys/angle},
\pgfkeysvalueof{/pgf/pattern keys/xshift},
\pgfkeysvalueof{/pgf/pattern keys/yshift},
\pgfkeysvalueof{/pgf/pattern keys/line width},
},
bottom left={%
\pgfpoint
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
top right={%
\pgfpoint
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
tile size={%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/distance}}%
{\pgfkeysvalueof{/pgf/pattern keys/distance}}},
tile transformation={%
\pgftransformshift{%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/xshift}}%
{\pgfkeysvalueof{/pgf/pattern keys/yshift}}}%
\pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}},
defaults={
distance/.initial=3pt,
angle/.initial=0,
xshift/.initial=0pt,
yshift/.initial=0pt,
line width/.initial=\the\pgflinewidth,
},
code={%
\pgfsetlinewidth{\pgfkeysvalueof{/pgf/pattern keys/line width}}%
\pgfpathmoveto{\pgfpoint{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}%
\pgfpathlineto{\pgfpoint{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}{0pt}}%
\pgfpathmoveto{\pgfpoint{0pt}{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}%
\pgfpathlineto{\pgfpoint{0pt}{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}}%
\pgfusepath{stroke}%
},
}
\pgfdeclarepattern{
name=Dots,
parameters={
\pgfkeysvalueof{/pgf/pattern keys/distance},
\pgfkeysvalueof{/pgf/pattern keys/angle},
\pgfkeysvalueof{/pgf/pattern keys/xshift},
\pgfkeysvalueof{/pgf/pattern keys/yshift},
\pgfkeysvalueof{/pgf/pattern keys/radius},
},
bottom left={%
\pgfpoint
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
top right={%
\pgfpoint
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
tile size={%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/distance}}%
{\pgfkeysvalueof{/pgf/pattern keys/distance}}},
tile transformation={%
\pgftransformshift{%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/xshift}}%
{\pgfkeysvalueof{/pgf/pattern keys/yshift}}}%
\pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}},
defaults={
distance/.initial=3pt,
angle/.initial=0,
xshift/.initial=0pt,
yshift/.initial=0pt,
radius/.initial=.5pt,
},
code={%
\pgfpathcircle%
{\pgfpointorigin}%
{\pgfkeysvalueof{/pgf/pattern keys/radius}}
\pgfusepath{fill}%
},
}
\pgfdeclarepattern{
name=Stars,
parameters={
\pgfkeysvalueof{/pgf/pattern keys/distance},
\pgfkeysvalueof{/pgf/pattern keys/angle},
\pgfkeysvalueof{/pgf/pattern keys/xshift},
\pgfkeysvalueof{/pgf/pattern keys/yshift},
\pgfkeysvalueof{/pgf/pattern keys/radius},
\pgfkeysvalueof{/pgf/pattern keys/points},
},
bottom left={%
\pgfpoint
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{-.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
top right={%
\pgfpoint
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}%
{.5*(\pgfkeysvalueof{/pgf/pattern keys/distance})}},
tile size={%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/distance}}%
{\pgfkeysvalueof{/pgf/pattern keys/distance}}},
tile transformation={%
\pgftransformshift{%
\pgfpoint
{\pgfkeysvalueof{/pgf/pattern keys/xshift}}%
{\pgfkeysvalueof{/pgf/pattern keys/yshift}}}%
\pgftransformrotate{\pgfkeysvalueof{/pgf/pattern keys/angle}}},
defaults={
distance/.initial=3mm,
angle/.initial=0,
xshift/.initial=0pt,
yshift/.initial=0pt,
radius/.initial=1mm,
points/.initial=5,
},
code={%
\pgfmathsetmacro\a{180/(\pgfkeysvalueof{/pgf/pattern keys/points})}%
\pgfpathmoveto{\pgfpointpolar{90}{\pgfkeysvalueof{/pgf/pattern keys/radius}}}%
\foreach \i in {1,...,\pgfkeysvalueof{/pgf/pattern keys/points}}{%
\pgfpathlineto{\pgfpointpolar{90+2*\i*\a-\a}{.5*(\pgfkeysvalueof{/pgf/pattern keys/radius})}}%
\pgfpathlineto{\pgfpointpolar{90+2*\i*\a}{\pgfkeysvalueof{/pgf/pattern keys/radius}}}%
}%
\pgfpathclose%
\pgfusepath{fill}%
},
}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End: