summaryrefslogtreecommitdiff
path: root/graphics/pgf/base/tex/generic/libraries/pgflibraryshadings.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/base/tex/generic/libraries/pgflibraryshadings.code.tex')
-rw-r--r--graphics/pgf/base/tex/generic/libraries/pgflibraryshadings.code.tex444
1 files changed, 444 insertions, 0 deletions
diff --git a/graphics/pgf/base/tex/generic/libraries/pgflibraryshadings.code.tex b/graphics/pgf/base/tex/generic/libraries/pgflibraryshadings.code.tex
new file mode 100644
index 0000000000..81e0386a60
--- /dev/null
+++ b/graphics/pgf/base/tex/generic/libraries/pgflibraryshadings.code.tex
@@ -0,0 +1,444 @@
+% Copyright 2019 by Till Tantau and others
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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{pgflibraryshadings.code.tex}
+
+
+%
+% An hsv color wheel. Initial code graciously donated by Ken Starks.
+%
+
+\pgfdeclarefunctionalshading[black]{color wheel white center}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}
+{}
+{ % x y
+ 2 copy % ... x y x y
+ 2 copy abs exch abs add 0.0001 ge
+ {atan 360.0 div} % ... x y heading; heading being in
+ %the interval [0, 1.0]
+ { pop } % silently deal with error: return
+ % arbitrary heading of zero for origin
+ ifelse % because we will use it for 'Hue'
+ 3 1 roll % ... heading x y
+ dup mul % ... heading x y*y
+ exch dup mul % ... heading y*y x*x
+ add sqrt % ... heading ra_pt (distance from origin in points)
+ 25.0 div % scale it means a ra of 25bp
+ dup 1.0 ge % BOOLEAN. ready to clamp to interval [0, 1.0]
+ { pop 1.0 }{} ifelse % We shall use the scaled ra as 'Saturation'
+ %2.5 mul 0.25 sub % now, Ra in [0.1, 0.5] --> Saturation
+ % in [0.0, 1.0]. Saturation varies between the two radii
+ 1.0 % ... H S V ( with 'Value' set to literal constant of 1.0 )
+ % C version to use as model:
+ % H' = H * 6
+ % i = floor(H')
+ % f = H' - i
+ % P = V * (1.0 - S)
+ % Q = V * (1.0 - (S*f))
+ % T = V * (1.0 - (S * (1.0 - f)))
+ 3 2 roll 6.0 mul dup 4 1 roll % H' S V H'
+ floor cvr % H' S V i
+ dup 5 1 roll % i H' S V i
+ 3 index sub neg % i H' S V f
+ 1.0 3 index sub % i H' S V f (1.0 - S )
+ 2 index mul % i H' S V f P
+ 6 1 roll % P i H' S V f
+ dup 3 index mul neg 1.0 add % P i H' S V f ( 1.0 - (f*S))
+ 2 index mul % P i H' S V f Q
+ 7 1 roll % Q P i H' S V f
+ neg 1.0 add % Q P i H' S V (1.0 - f)
+ 2 index mul neg 1.0 add % Q P i H' S V (1.0 - S * (1.0 - f))
+ 1 index mul % Q P i H' S V T
+ 7 2 roll % V T Q P i H' S
+ pop pop % V T Q P i
+ %%%
+ % end of BLOCK B. The rest is just stack manipulation
+ dup 0.5 le % TEST II [ i == 0 ]
+ { % BLOCK C [ take stack to V T P ]
+ pop exch pop
+ }
+ { dup 1.5 le % TEST III [ i == 1 ]
+ { % BLOCK D [ take stack to Q V P ]
+ pop exch 4 1 roll exch pop
+ }
+ { dup 2.5 le % TEST IV [ i == 2 ]
+ { % BLOCK E [ take stack to P V T ]
+ pop 4 1 roll pop
+ }
+ { dup 3.5 le % TEST V [ i == 3 ]
+ { % BLOCK F [ take stack to P Q V ]
+ pop exch 4 2 roll pop
+ }
+ { dup 4.5 le % TEST VI [ i == 4 ]
+ { % BLOCK G [ take stack to T P V ]
+ pop exch pop 3 -1 roll
+ }
+ { % BLOCK H [ take stack to V P Q ]
+ pop 3 1 roll exch pop
+ }
+ ifelse
+ }
+ ifelse % for V
+ }
+ ifelse % for IV
+ }
+ ifelse % for III
+ }
+ ifelse % for II
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+\pgfdeclarefunctionalshading[black]{color wheel black center}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}
+{}
+{ % x y
+ 2 copy % ... x y x y
+ 2 copy abs exch abs add 0.0001 ge
+ {atan 360.0 div} % ... x y heading; heading being in
+ %the interval [0, 1.0]
+ { pop } % silently deal with error: return
+ % arbitrary heading of zero for origin
+ ifelse % because we will use it for 'Hue'
+ 3 1 roll % ... heading x y
+ dup mul % ... heading x y*y
+ exch dup mul % ... heading y*y x*x
+ add sqrt % ... heading ra_pt (distance from origin in points)
+ 25.0 div % scale it means a ra of 25bp
+ dup 1.0 ge % BOOLEAN. ready to clamp to interval [0, 1.0]
+ { pop 1.0 }{} ifelse % We shall use the scaled ra as 'Saturation'
+ %2.5 mul 0.25 sub % now, Ra in [0.1, 0.5] --> Saturation
+ % in [0.0, 1.0]. Saturation varies between the two radii
+ 1.0 exch % ... H S V ( with 'Value' set to literal constant of 1.0 )
+ % C version to use as model:
+ % H' = H * 6
+ % i = floor(H')
+ % f = H' - i
+ % P = V * (1.0 - S)
+ % Q = V * (1.0 - (S*f))
+ % T = V * (1.0 - (S * (1.0 - f)))
+ 3 2 roll 6.0 mul dup 4 1 roll % H' S V H'
+ floor cvr % H' S V i
+ dup 5 1 roll % i H' S V i
+ 3 index sub neg % i H' S V f
+ 1.0 3 index sub % i H' S V f (1.0 - S )
+ 2 index mul % i H' S V f P
+ 6 1 roll % P i H' S V f
+ dup 3 index mul neg 1.0 add % P i H' S V f ( 1.0 - (f*S))
+ 2 index mul % P i H' S V f Q
+ 7 1 roll % Q P i H' S V f
+ neg 1.0 add % Q P i H' S V (1.0 - f)
+ 2 index mul neg 1.0 add % Q P i H' S V (1.0 - S * (1.0 - f))
+ 1 index mul % Q P i H' S V T
+ 7 2 roll % V T Q P i H' S
+ pop pop % V T Q P i
+ %%%
+ % end of BLOCK B. The rest is just stack manipulation
+ dup 0.5 le % TEST II [ i == 0 ]
+ { % BLOCK C [ take stack to V T P ]
+ pop exch pop
+ }
+ { dup 1.5 le % TEST III [ i == 1 ]
+ { % BLOCK D [ take stack to Q V P ]
+ pop exch 4 1 roll exch pop
+ }
+ { dup 2.5 le % TEST IV [ i == 2 ]
+ { % BLOCK E [ take stack to P V T ]
+ pop 4 1 roll pop
+ }
+ { dup 3.5 le % TEST V [ i == 3 ]
+ { % BLOCK F [ take stack to P Q V ]
+ pop exch 4 2 roll pop
+ }
+ { dup 4.5 le % TEST VI [ i == 4 ]
+ { % BLOCK G [ take stack to T P V ]
+ pop exch pop 3 -1 roll
+ }
+ { % BLOCK H [ take stack to V P Q ]
+ pop 3 1 roll exch pop
+ }
+ ifelse
+ }
+ ifelse % for V
+ }
+ ifelse % for IV
+ }
+ ifelse % for III
+ }
+ ifelse % for II
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+\pgfdeclarefunctionalshading[black]{color wheel}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}
+{}
+{ % x y
+ 2 copy abs exch abs add 0.0001 ge
+ {atan 360.0 div} % ... x y heading; heading being in
+ %the interval [0, 1.0]
+ { pop } % silently deal with error: return
+ % arbitrary heading of zero for origin
+ ifelse % because we will use it for 'Hue'
+ 1.0 1.0 % ... H S V
+ % C version to use as model:
+ % H' = H * 6
+ % i = floor(H')
+ % f = H' - i
+ % P = V * (1.0 - S)
+ % Q = V * (1.0 - (S*f))
+ % T = V * (1.0 - (S * (1.0 - f)))
+ 3 2 roll 6.0 mul dup 4 1 roll % H' S V H'
+ floor cvr % H' S V i
+ dup 5 1 roll % i H' S V i
+ 3 index sub neg % i H' S V f
+ 1.0 3 index sub % i H' S V f (1.0 - S )
+ 2 index mul % i H' S V f P
+ 6 1 roll % P i H' S V f
+ dup 3 index mul neg 1.0 add % P i H' S V f ( 1.0 - (f*S))
+ 2 index mul % P i H' S V f Q
+ 7 1 roll % Q P i H' S V f
+ neg 1.0 add % Q P i H' S V (1.0 - f)
+ 2 index mul neg 1.0 add % Q P i H' S V (1.0 - S * (1.0 - f))
+ 1 index mul % Q P i H' S V T
+ 7 2 roll % V T Q P i H' S
+ pop pop % V T Q P i
+ %%%
+ % end of BLOCK B. The rest is just stack manipulation
+ dup 0.5 le % TEST II [ i == 0 ]
+ { % BLOCK C [ take stack to V T P ]
+ pop exch pop
+ }
+ { dup 1.5 le % TEST III [ i == 1 ]
+ { % BLOCK D [ take stack to Q V P ]
+ pop exch 4 1 roll exch pop
+ }
+ { dup 2.5 le % TEST IV [ i == 2 ]
+ { % BLOCK E [ take stack to P V T ]
+ pop 4 1 roll pop
+ }
+ { dup 3.5 le % TEST V [ i == 3 ]
+ { % BLOCK F [ take stack to P Q V ]
+ pop exch 4 2 roll pop
+ }
+ { dup 4.5 le % TEST VI [ i == 4 ]
+ { % BLOCK G [ take stack to T P V ]
+ pop exch pop 3 -1 roll
+ }
+ { % BLOCK H [ take stack to V P Q ]
+ pop 3 1 roll exch pop
+ }
+ ifelse
+ }
+ ifelse % for V
+ }
+ ifelse % for IV
+ }
+ ifelse % for III
+ }
+ ifelse % for II
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+
+%
+% A bilinear interpolation.
+%
+
+\colorlet{lower left}{white}%
+\colorlet{lower right}{white}%
+\colorlet{upper left}{white}%
+\colorlet{upper right}{white}%
+
+\pgfdeclarefunctionalshading[lower left,lower right,upper left,upper right]{bilinear interpolation}
+{\pgfpointorigin}
+{\pgfpoint{100bp}{100bp}}
+{
+ \pgfshadecolortorgb{lower left}{\pgf@lib@shadings@ll}\pgfshadecolortorgb{lower right}{\pgf@lib@shadings@lr}
+ \pgfshadecolortorgb{upper right}{\pgf@lib@shadings@ur}\pgfshadecolortorgb{upper left}{\pgf@lib@shadings@ul}
+}{
+ 25 sub 50 div exch 25 sub 50 div 2 copy % Calculate y/100 x/100.
+% 100 div exch 100 div 2 copy % Calculate y/100 x/100.
+ neg 1 add exch neg 1 add % Calculate 1-y/100 1-x/100.
+ 3 1 roll 2 copy exch 5 2 roll 6 copy 6 copy % Set up stack.
+ \pgf@lib@shadings@llred mul exch \pgf@lib@shadings@lrred mul add mul % Process red component.
+ 4 1 roll
+ \pgf@lib@shadings@urred mul exch \pgf@lib@shadings@ulred mul add mul
+ add
+ 13 1 roll
+ \pgf@lib@shadings@llgreen mul exch \pgf@lib@shadings@lrgreen mul add mul % Process green component.
+ 4 1 roll
+ \pgf@lib@shadings@urgreen mul exch \pgf@lib@shadings@ulgreen mul add mul
+ add
+ 7 1 roll
+ \pgf@lib@shadings@llblue mul exch \pgf@lib@shadings@lrblue mul add mul % Process blue component.
+ 4 1 roll
+ \pgf@lib@shadings@urblue mul exch \pgf@lib@shadings@ulblue mul add mul
+ add
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+
+%
+% A Mandelbrot set shading. Just for fun...
+%
+
+\pgfdeclarefunctionalshading[black]{Mandelbrot set}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}{}
+{
+ 12.5 div exch 12.5 div exch
+ 1 index 1 index
+ % Stack: c_r c_i z_r z_i
+ % Formula: z' = z^2 + c = (z_r + i z_i)^2 + c_r + i c_i
+ % = (z_r^2 - z_i^2 + c_r) + i (2 z_r z_i + c_i)
+ %
+ % First iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Second iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Third iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Fourth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Check for break (to avoid too large numbers)
+ 1 index dup mul 1 index dup mul add
+ 4 lt {
+ % Fifth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Sixth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Seventh iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Check for break (to avoid too large numbers)
+ 1 index dup mul 1 index dup mul add
+ 4 lt {
+ % Eighth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Ninth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Tenth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ } { pop pop 1000.0 1000.0 } ifelse
+ } { pop pop 1000.0 1000.0 } ifelse
+ % Compute distance
+ dup mul exch
+ dup mul
+ add sqrt
+ dup 4 1 roll
+ 2 gt { pop pop 2.0 exch div 1.0 exch sub dup dup} {pop pop pop 0.0 0.0 0.0} ifelse
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%