%% %% This is file `tikzlibraryshadows.blur.code.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% pgf-blur.dtx (with options: `texfile') %% Copyright 2012 Martin Giese, martingi@ifi.uio.no %% Copyright 2012 Andrew Stacey %% Copyright 2018 Norbert Preining, norbert@preining.info %% %% This file is under the LaTeX Project Public License %% See CTAN archives in directory macros/latex/base/lppl.txt. %% %% DESCRIPTION: %% `pgf-blur' adds blurred/faded/fuzzy shadows to TikZ/PGF %% \def\fileversion{1.02} \def\filedate{2012/12/09} \message{ v\fileversion, \filedate} \usetikzlibrary{shadows} \usetikzlibrary{calc} \newif\ifpgfbs@invert@fading \newcount\pgfbs@fading@count \pgfbs@fading@count=0\relax \tikzset{ /tikz/shadow blur radius/.store in=\pgfbs@radius, /tikz/shadow blur radius=.4ex, /tikz/shadow blur extra rounding/.store in=\pgfbs@extra@rounding, /tikz/shadow blur extra rounding=\pgfutil@empty, /tikz/shadow blur extra rounding/.default=\pgfbs@radius, /tikz/shadow blur steps/.store in=\pgfbs@steps, /tikz/shadow blur steps=4, /tikz/shadow blur invert/.is if=pgfbs@invert@fading, /tikz/shadow opacity/.store in=\pgfbs@opacity, /tikz/shadow opacity=40, /tikz/blur shadow/.style={ shadow scale=1, shadow xshift=.5ex, shadow yshift=-.5ex, preaction=render blur shadow, every shadow, #1, }, /tikz/render blur shadow/.code={ \pgfbs@savebb \global\advance\pgfbs@fading@count by 1\relax \pgfsyssoftpath@getcurrentpath{\pgfbs@input@path}% \pgfbs@compute@shadow@bbox \pgfbs@process@rounding{\pgfbs@input@path}{\pgfbs@fadepath}% \pgfbs@apply@canvas@transform \colorlet{pstb@shadow@color}{white!\pgfbs@opacity!black}% \ifpgfbs@invert@fading \pgfdeclarefading{shadowfading-\the\pgfbs@fading@count}{\pgfbs@paint@invert@fading}% \else \pgfdeclarefading{shadowfading-\the\pgfbs@fading@count}{\pgfbs@paint@fading}% \fi \pgfsetfillcolor{black}% \pgfsetfading{shadowfading-\the\pgfbs@fading@count}% {\pgftransformshift{\pgfpoint{\pgfbs@midx}{\pgfbs@midy}}}% \pgfbs@usebbox{fill}% \pgfbs@restorebb }, } \def\pgfbs@savebb{% \edef\pgfbs@restorebb{% \global\pgf@picminx=\the\pgf@picminx\relax \global\pgf@picmaxx=\the\pgf@picmaxx\relax \global\pgf@picminy=\the\pgf@picminy\relax \global\pgf@picmaxy=\the\pgf@picmaxy\relax }% } \def\restorebb{}% \def\pgfbs@process@rounding#1#2{ \expandafter\ifx\pgfbs@extra@rounding\pgfutil@empty% \pgfprocessround{#1}{#2}% \else% \pgfmathsetmacro\pgfbs@exrd@val{\pgfbs@extra@rounding}% \pgfbs@roundpath{#1}{\pgfbs@exrd@val pt}% \pgfsyssoftpath@getcurrentpath{\pgfbs@extraroundedpath}% \pgfprocessround{\pgfbs@extraroundedpath}{#2}% \fi% } \def\pgfbs@roundpath#1#2{% {% \def\pgfbs@rp@skipround{% \let\pgfbs@rp@possibleround\pgfbs@rp@insertround}% \def\pgfbs@rp@insertround{\pgfsyssoftpath@specialround{#2}{#2}}% \let\pgfbs@rp@possibleround\pgfbs@rp@insertround% % \def\pgfsyssoftpath@movetotoken##1##2{% \pgfsyssoftpath@moveto{##1}{##2}}% \def\pgfsyssoftpath@linetotoken##1##2{% \pgfbs@rp@possibleround\pgfsyssoftpath@lineto{##1}{##2}}% \def\pgfsyssoftpath@rectcornertoken##1##2##3##4##5{% \pgf@xa=##1\relax% \advance\pgf@xa by##4% \pgf@ya=##2\relax% \advance\pgf@ya by##5% \pgfsyssoftpath@moveto{##1}{##2}% \pgfbs@rp@possibleround% \pgfsyssoftpath@lineto{\the\pgf@xa}{##2}% \pgfbs@rp@possibleround% \pgfsyssoftpath@lineto{\the\pgf@xa}{\the\pgf@ya}% \pgfbs@rp@possibleround% \pgfsyssoftpath@lineto{##1}{\the\pgf@ya}% \pgfbs@rp@possibleround% \pgfsyssoftpath@closepath}% \def\pgfsyssoftpath@curvetosupportatoken% ##1##2##3##4##5##6##7##8{% \pgfbs@rp@possibleround% \pgfsyssoftpath@curveto{##1}{##2}{##4}{##5}{##7}{##8}}% \def\pgfsyssoftpath@closepathtoken##1##2{% \pgfbs@rp@possibleround\pgfsyssoftpath@closepath}% \def\pgfsyssoftpath@specialroundtoken##1##2{% \pgfmathsetmacro\pgfbs@rp@ra{max(##1,#2)}% \pgfmathsetmacro\pgfbs@rp@rb{max(##2,#2)}% \pgfsyssoftpath@specialround% {\pgfbs@rp@ra pt}{\pgfbs@rp@rb pt}% \let\pgfbs@rp@possibleround\pgfbs@rp@skipround% } #1% } } \def\pgfbs@compute@shadow@bbox{% \edef\pgfbs@minx{\the\pgf@pathminx}% \edef\pgfbs@miny{\the\pgf@pathminy}% \edef\pgfbs@maxx{\the\pgf@pathmaxx}% \edef\pgfbs@maxy{\the\pgf@pathmaxy}% \pgfmathsetmacro\pgfbs@midx{0.5*(\pgfbs@minx + \pgfbs@maxx)}% \pgfmathsetmacro\pgfbs@midy{0.5*(\pgfbs@miny + \pgfbs@maxy)}% \pgfmathsetmacro\pgfbs@minx{\pgfbs@minx - 2*\pgfbs@radius}% \pgfmathsetmacro\pgfbs@miny{\pgfbs@miny - 2*\pgfbs@radius}% \pgfmathsetmacro\pgfbs@maxx{\pgfbs@maxx + 2*\pgfbs@radius}% \pgfmathsetmacro\pgfbs@maxy{\pgfbs@maxy + 2*\pgfbs@radius}% \pgfmathsetmacro\pgfbs@wd{\pgfbs@maxx - \pgfbs@minx}% \pgfmathsetmacro\pgfbs@ht{\pgfbs@maxy - \pgfbs@miny}% \pgfsyssoftpath@setcurrentpath\pgfutil@empty% \pgfsyssoftpath@rect{\pgfbs@minx pt}{\pgfbs@miny pt}% {\pgfbs@wd pt}{\pgfbs@ht pt}% \pgfsyssoftpath@getcurrentpath{\pgfbs@shadow@bbox}% \pgfsyssoftpath@setcurrentpath\pgfutil@empty% } \def\pgfbs@set@fading@pic@bbox{ \global\pgf@picminx=\pgfbs@minx pt\relax \global\pgf@picminy=\pgfbs@miny pt\relax \global\pgf@picmaxx=\pgfbs@maxx pt\relax \global\pgf@picmaxy=\pgfbs@maxy pt\relax } \def\pgfbs@usefadepath#1{% \pgfsyssoftpath@setcurrentpath{\pgfbs@fadepath}% \pgfsyssoftpath@flushcurrentpath% \pgfusepath{#1}% } \def\pgfbs@usebbox#1{% \pgfsyssoftpath@setcurrentpath{\pgfbs@shadow@bbox}% \pgfsyssoftpath@flushcurrentpath% \pgfusepath{#1}% } \def\pgfbs@usefadeandbbox#1{% \let\pgfbs@temppath\pgfbs@fadepath \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfbs@temppath\expandafter\expandafter\expandafter{\expandafter\pgfbs@temppath\pgfbs@shadow@bbox}% \pgfsyssoftpath@setcurrentpath{\pgfbs@temppath}% \pgfsyssoftpath@flushcurrentpath% \pgfusepath{#1}% } \def\pgfbs@apply@canvas@transform{ \pgflowlevel{ \pgftransformshift{\pgfpoint{\pgfbs@midx}{\pgfbs@midy}} \pgftransformscale{\pgfkeysvalueof{/tikz/shadow scale}} \pgftransformshift{\pgfpoint% {\pgfkeysvalueof{/tikz/shadow xshift}-\pgfbs@midx} {\pgfkeysvalueof{/tikz/shadow yshift}-\pgfbs@midy} } } } \def\pgfbs@paint@fading{ \pgfpicture \pgfsetbaseline{\pgf@picminy}% % fix bounding box. \pgfbs@set@fading@pic@bbox % compute increments for line width and opacity \pgfmathsetmacro\pgfbs@op@step{50/\pgfbs@steps} \pgfmathsetmacro\pgfbs@wth@step{4*\pgfbs@radius/(2*\pgfbs@steps-1)} % draw the outer part of the fading, % starting with lightest, outermost line \pgfsetroundjoin \pgfmathsetmacro\pgfbs@max@i{\pgfbs@steps-2} \pgfmathsetmacro\pgfbs@wth{2*\pgfbs@radius} \pgfmathsetmacro\pgfbs@op{100-0.5*\pgfbs@op@step} \foreach \pgfbs@i in {0,...,\pgfbs@max@i} { \pgfsetlinewidth{\pgfbs@wth pt} \pgfsetstrokecolor{black!\pgfbs@op!pstb@shadow@color} \pgfbs@usefadepath{stroke} \pgfmathsetmacro\pgfbs@wth{\pgfbs@wth-\pgfbs@wth@step} \global\let\pgfbs@wth=\pgfbs@wth \pgfmathsetmacro\pgfbs@op{\pgfbs@op-\pgfbs@op@step} \global\let\pgfbs@op=\pgfbs@op } % clip to inside of path \scope \pgfbs@usefadepath{clip} % fill inside with final darkest shadow color \pgfsetfillcolor{pstb@shadow@color} \pgfbs@usebbox{fill} % draw the inner part of the fading, % starting with the darkest, innermost line \pgfmathsetmacro\pgfbs@wth{2*\pgfbs@radius} \pgfmathsetmacro\pgfbs@op{0.5*\pgfbs@op@step} \foreach \pgfbs@i in {0,...,\pgfbs@max@i} { \pgfsetlinewidth{\pgfbs@wth pt} \pgfsetstrokecolor{black!\pgfbs@op!pstb@shadow@color} \pgfbs@usefadepath{stroke} \pgfmathsetmacro\pgfbs@wth{\pgfbs@wth-\pgfbs@wth@step} \global\let\pgfbs@wth=\pgfbs@wth \pgfmathsetmacro\pgfbs@op{\pgfbs@op+\pgfbs@op@step} \global\let\pgfbs@op=\pgfbs@op } \endscope % a final stroke to hide clip/antialiasing artifcats \pgfsetstrokecolor{black!50!pstb@shadow@color} \pgfsetlinewidth{0.5*\pgfbs@wth@step} \pgfbs@usefadepath{stroke} \endpgfpicture } \def\pgfbs@paint@invert@fading{ \pgfpicture \pgfsetbaseline{\pgf@picminy}% % fix bounding box. \pgfbs@set@fading@pic@bbox % compute increments for line width and opacity \pgfmathsetmacro\pgfbs@op@step{50/\pgfbs@steps} \pgfmathsetmacro\pgfbs@wth@step{4*\pgfbs@radius/(2*\pgfbs@steps-1)} % draw the outer part of the fading, % starting with lightest, outermost line \pgfsetroundjoin \pgfmathsetmacro\pgfbs@max@i{\pgfbs@steps-2} \pgfmathsetmacro\pgfbs@wth{2*\pgfbs@radius} \pgfmathsetmacro\pgfbs@op{0.5*\pgfbs@op@step} \foreach \pgfbs@i in {0,...,\pgfbs@max@i} { \pgfsetlinewidth{\pgfbs@wth pt} \pgfsetstrokecolor{black!\pgfbs@op!pstb@shadow@color} \pgfbs@usefadepath{stroke} \pgfmathsetmacro\pgfbs@wth{\pgfbs@wth-\pgfbs@wth@step} \global\let\pgfbs@wth=\pgfbs@wth \pgfmathsetmacro\pgfbs@op{\pgfbs@op+\pgfbs@op@step} \global\let\pgfbs@op=\pgfbs@op } % clip to inside of path \scope \pgfseteorule \pgfbs@usefadeandbbox{clip} % fill inside with final darkest shadow color \pgfsetfillcolor{pstb@shadow@color} \pgfbs@usebbox{fill} \endscope \scope \pgfbs@usefadepath{clip} % draw the inner part of the fading, % starting with the darkest, innermost line \pgfmathsetmacro\pgfbs@wth{2*\pgfbs@radius} \pgfmathsetmacro\pgfbs@op{100-0.5*\pgfbs@op@step} \foreach \pgfbs@i in {0,...,\pgfbs@max@i} { \pgfsetlinewidth{\pgfbs@wth pt} \pgfsetstrokecolor{black!\pgfbs@op!pstb@shadow@color} \pgfbs@usefadepath{stroke} \pgfmathsetmacro\pgfbs@wth{\pgfbs@wth-\pgfbs@wth@step} \global\let\pgfbs@wth=\pgfbs@wth \pgfmathsetmacro\pgfbs@op{\pgfbs@op-\pgfbs@op@step} \global\let\pgfbs@op=\pgfbs@op } \endscope % a final stroke to hide clip/antialiasing artifcats \pgfsetstrokecolor{black!50!pstb@shadow@color} \pgfsetlinewidth{0.5*\pgfbs@wth@step} \pgfbs@usefadepath{stroke} \endpgfpicture } \endinput %% %% End of file `tikzlibraryshadows.blur.code.tex'.