Current File : //usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex |
% Copyright 2018 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{pgfcoretransparency.code.tex}
% Sets the opacity of stroking operations.
%
% #1 = opacity, where 1 means fully opaque and 0 means fully
% transparent.
%
% Example:
%
% \pgfsetstrokeopacity{0.5}
\def\pgfsetstrokeopacity#1{%
\pgfmathparse{#1}%
\expandafter\pgfsys@stroke@opacity\expandafter{\pgfmathresult}}
% Sets the opacity of stroking operations.
%
% #1 = opacity, where 1 means fully opaque and 0 means fully
% transparent.
%
% Example:
%
% \pgfsetfillopacity{0.5}
\def\pgfsetfillopacity#1{%
\pgfmathparse{#1}%
\expandafter\pgfsys@fill@opacity\expandafter{\pgfmathresult}}
% Sets the current blend mode. See Section 7.2.4 of the PDF
% Specification 1.7 for an introduction to blend modes in general.
%
% #1 = One of the following modes, see also section 7.2.4 of the
% PDF Specification 1.7. (The PGF names, which are all lowercase with
% spaces as usual, must be mapped to the PDF or SVG by the drivers.)
%
% normal
% multiply
% screen
% overlay
% darken
% lighten
% color dodge
% color burn
% hard light
% soft light
% difference
% exclusion
% saturation
% color
% hue
% luminosity
%
% Example:
%
% \pgfsetblendmode{multiply}
\def\pgfsetblendmode#1{\pgfsys@blend@mode{#1}}
% Declares a new fading based on the contents of a box.
%
% #1 = name of the fading
% #2 = content of a TeX box that specifies the fading
%
% Description:
%
% This command declares a new fading based on the contents of
% the TeX box. The mask can later be used to mask other graphics.
%
% The box is used to determine where the mask is opaque: At the
% beginning, the mask is completely transparent. Wherever the box
% contains something (like text or a picture or whatever), the
% luminosity of the text/graphic is used to determine how opaque the
% point will be. The greater the luminosity, the more opaque. The net
% effect is that white corresponds to "completely opaque" and black to
% "completely transparent". This is rather counterintuitive. Because
% of this, the special color "pgftransparent" is defined, which is the
% same as black. By setting the color to, say,
% \color{pgftransparent!10} you get something that is 10% transparent
% and \color{pgftransparent!90} gives you 90% transparency.
%
% By default, the drawing color is set to opaque.
%
% Example:
%
% \pgfdeclarefading{mymask}{
% \fontsize{200}{200}\bfseries
% Ti\emph{k}Z
% }
% \pgfdeclarefading{myothermask}{
% \tikz \shade [left color=transparent,right color=transparent!0]
% (0,0) rectangle (5,5);
% }
\def\pgfdeclarefading#1#2{%
\setbox\pgfutil@tempboxa=\hbox{{\pgfsys@beginscope\pgfutil@color{white}\ignorespaces#2\pgfsys@endscope}}%
\pgfsys@fadingfrombox{#1}\pgfutil@tempboxa%
}
\pgfutil@colorlet{pgftransparent}{black}
% Use a previously declared fading.
%
% #1 = name of the fading
% #2 = transformation code
%
% Description:
%
% The command should be used *inside* a pgfpicture to install a
% fading. The fading is a part of the graphic state. (This command
% works much like \pgfsetstrokeopacity).
%
% The mask will be centered on the origin. The transformation code #2 is
% applied to the mask (but not the contents of the actual picture).
\def\pgfsetfading#1#2{%
{%
\pgftransformreset%
#2%
\pgfgettransform{\pgftrans@temp}%
\edef\pgf@marshal{\noexpand\pgfsys@usefading{#1}\pgftrans@temp}%
\pgf@marshal%
}%
}
% Use a previously declared fading scaled for the current path.
%
% #1 - an fading
% #2 - extra transformations
%
% Description:
%
% This command works a bit like \pgfshadepath. "Works a bit like"
% means the following: The masks's original size should
% completely cover the area between (0,0) and (100bp,100bp). The
% mask is then rescaled so that it completely covers the path. Then
% the additional transformation #2 is applied. Finally, the mask is
% made part of the graphic state (as with \pgfsetfading). The path
% used for computation purposes only -- it is not drawn or otherwise
% used.
%
% If no transformations occur, the lower left corner of the path will
% lie on (25bp, 25bp), the upper right corner on (75bp, 75bp).
%
% If the path was empty, the fading will be used at its natural size,
% centered on the origin.
%
% Example:
%
% \pgfdeclarefading{fade right}
% {\tikz[left color=transparent!0,right color=transparent!100]
% (0,0) rectangle (100bp,100bp);}
%
% \pgfpathmoveto{\pgforigin}
% \pgfpathlineto{\pgfxy(1,0)}
% \pgfpathlineto{\pgfxy(1,1)}
% \pgfsetfadingforcurrentpath{fade right}{}
% \pgfusepath{fill}
\def\pgfsetfadingforcurrentpath#1#2{%
\ifdim\pgf@pathminx=16000pt%
% Path was empty -> use natural size
\pgfsetfading{#1}{#2}%
\else%
\pgfsetfading{#1}{%
% Calculate center:
\pgf@xb=.5\pgf@pathmaxx%
\advance\pgf@xb by.5\pgf@pathminx%
\pgf@yb=.5\pgf@pathmaxy%
\advance\pgf@yb by.5\pgf@pathminy%
% Calculate scaling:
\pgf@xc=\pgf@pathmaxx%
\advance\pgf@xc by-\pgf@pathminx%
\ifdim\pgf@xc<0.1pt\pgf@xc=0.1pt\fi%
\pgf@yc=\pgf@pathmaxy%
\advance\pgf@yc by-\pgf@pathminy%
\ifdim\pgf@yc<0.1pt\pgf@yc=0.1pt\fi%
\pgf@xc=.02\pgf@xc%
\pgf@yc=.02\pgf@yc%
% Compute new transformation matrix:
\pgftransformcm{1}{0}{0}{1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
\pgftransformcm{\pgf@sys@tonumber{\pgf@xc}}{0}{0}{\pgf@sys@tonumber{\pgf@yc}}{\pgfpointorigin}%
\pgfsys@clipfading%
#2%
}%
\fi%
}
% Use a previously declared fading scaled for the current path.
%
% #1 - an fading
% #2 - extra transformations
%
% Description:
%
% This command works like \pgfsetfadingforcurrentpath, only it takes
% the current line width into account: Before the path is considered,
% it is enlarged by half the line width in all directions.
\def\pgfsetfadingforcurrentpathstroked#1#2{%
\ifdim\pgf@pathminx=16000pt%
% Path was empty -> use natural size
\pgfsetfading{#1}{#2}%
\else%
\pgfsetfading{#1}{%
% Calculate center:
\pgf@xb=.5\pgf@pathmaxx%
\advance\pgf@xb by.5\pgf@pathminx%
\pgf@yb=.5\pgf@pathmaxy%
\advance\pgf@yb by.5\pgf@pathminy%
% Calculate scaling:
\pgf@xc=\pgf@pathmaxx%
\advance\pgf@xc by-\pgf@pathminx%
\advance\pgf@xc by\pgflinewidth%
\ifdim\pgf@xc<0.1pt\pgf@xc=0.1pt\fi%
\pgf@yc=\pgf@pathmaxy%
\advance\pgf@yc by-\pgf@pathminy%
\advance\pgf@yc by\pgflinewidth%
\ifdim\pgf@yc<0.1pt\pgf@yc=0.1pt\fi%
\pgf@xc=.02\pgf@xc%
\pgf@yc=.02\pgf@yc%
% Compute new transformation matrix:
\pgftransformcm{1}{0}{0}{1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
\pgftransformcm{\pgf@sys@tonumber{\pgf@xc}}{0}{0}{\pgf@sys@tonumber{\pgf@yc}}{\pgfpointorigin}%
\pgfsys@clipfading%
#2%
}%
\fi%
}
% Group things in a a transparency group
%
% Description:
%
% This takes groups pgf commands inside a pgfpicture in a transparency
% group. This means that any transparency settings apply to commands a
% whole. For instance, if a box contains two overlapping black
% circles and you draw them normally with 50% transparency, then the
% overlap will be darker than the rest. By comparison, if the circles
% are part of a transparency group, the overlap will get the same
% color as the rest.
%
%
\def\pgftransparencygroup{%
\pgfutil@ifnextchar[{\pgftransparencygroup@}{\pgftransparencygroup@[]}%
}
\def\pgftransparencygroup@[#1]{%
\begingroup%
\pgfkeys{/pgf/transparency group options/.cd,%
isolated=false,
knockout=false,
#1}%
\setbox\pgfutil@tempboxa=\hbox\bgroup%
}
\pgfkeys{
/pgf/transparency group options/.cd,
isolated/.is if=pgfsys@transparency@group@isolated,
knockout/.is if=pgfsys@transparency@group@knockout
}
\def\endpgftransparencygroup{%
\egroup%
% Now compute the correct position. This is a bit tricky...
\ifdim\pgf@picminx=16000pt%
% Nothing needs to be done
\else%
% Safety margin to avoid clipping:
\advance\pgf@picminx by-1cm%
\advance\pgf@picmaxx by1cm%
\advance\pgf@picminy by-1cm%
\advance\pgf@picmaxy by1cm%
% Ok, set the box size to current picture size.
\setbox\pgfutil@tempboxa=\hbox{%
\vrule width0pt height\pgf@picmaxy depth-\pgf@picminy%
\hskip-\pgf@picminx%
\box\pgfutil@tempboxa%
\hskip\pgf@picmaxx%
}%
\pgfsys@transparencygroupfrombox\pgfutil@tempboxa%
\wd\pgfutil@tempboxa=0pt%
\ht\pgfutil@tempboxa=0pt%
\dp\pgfutil@tempboxa=0pt%
\hskip\pgf@picminx\box\pgfutil@tempboxa\hskip-\pgf@picminx%
\fi%
\endgroup%
}
\let\startpgftransparencygroup=\pgftransparencygroup
\let\stoppgftransparencygroup=\endpgftransparencygroup
\endinput