summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex585
1 files changed, 480 insertions, 105 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
index 971752304a7..67f11b2bc36 100644
--- a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
+++ b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
@@ -1,4 +1,5 @@
% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
%
% This file may be distributed and/or modified
%
@@ -16,8 +17,8 @@
\newcount\pgf@sys@shading@range@num
\def\pgf@parsefunc#1{%
\edef\temp{{#1}}%
- \expandafter\pgf@convertrgbstring\temp%
- \edef\temp{{\pgf@rgbconv}}%
+ \expandafter\pgf@convertstring\temp%
+ \edef\temp{{\pgf@conv}}%
\expandafter\pgf@@parsefunc\temp}
\def\pgf@@parsefunc#1{%
\let\pgf@bounds=\pgfutil@empty%
@@ -26,9 +27,9 @@
\let\pgf@encode=\pgfutil@empty%
\let\pgf@sys@shading@ranges=\pgfutil@empty%
\pgf@sys@shading@range@num=0\relax%
- \pgf@parsefirst[#1; ]%
- \pgf@parselastdom[#1; ]%
- \pgf@parsemid[#1; ]%
+ \csname pgf@parsefirst\pgf@shading@model\endcsname[#1; ]%
+ \csname pgf@parselastdom\pgf@shading@model\endcsname[#1; ]%
+ \csname pgf@parsemid\pgf@shading@model\endcsname[#1; ]%
\ifx\pgf@bounds\pgfutil@empty%
\edef\pgf@pdfparseddomain{0 1}%
\edef\pgf@pdfparsedfunction{\pgf@singlefunc\space}%
@@ -41,7 +42,7 @@
\fi%
\xdef\pgf@psfuncs{\pgf@psfuncs}%
}
-\def\pgf@parsefirst[rgb(#1)=(#2,#3,#4)#5]{%
+\def\pgf@parsefirstrgb[rgb(#1)=(#2,#3,#4)#5]{%
\pgfmathsetlength\pgf@x{#1}%
\edef\pgf@sys@shading@start@pos{\the\pgf@x}%
\pgf@sys@bp@correct\pgf@x%
@@ -53,7 +54,7 @@
\let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
\edef\pgf@prevcolor{\pgf@rgb}%
\edef\pgf@firstcolor{\pgf@rgb}}
-\def\pgf@parselastdom[rgb(#1)=(#2,#3,#4); {%
+\def\pgf@parselastdomrgb[rgb(#1)=(#2,#3,#4); {%
\pgfutil@ifnextchar]{%
\pgfmathsetlength\pgf@x{#1}%
\edef\pgf@sys@shading@end@pos{\the\pgf@x}%
@@ -62,9 +63,9 @@
\edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
\pgf@getrgbtuplewithmixin{#2}{#3}{#4}%
\edef\pgf@sys@shading@end@rgb{\pgf@sys@rgb}%
- \pgfutil@gobble}{\pgf@parselastdom[}}
-\def\pgf@parsemid[rgb(#1)=(#2,#3,#4); {\pgf@parserest[}
-\def\pgf@parserest[rgb(#1)=(#2,#3,#4); {%
+ \pgfutil@gobble}{\pgf@parselastdomrgb[}}
+\def\pgf@parsemidrgb[rgb(#1)=(#2,#3,#4); {\pgf@parserestrgb[}
+\def\pgf@parserestrgb[rgb(#1)=(#2,#3,#4); {%
\advance\pgf@sys@shading@range@num by1\relax%
\pgfutil@ifnextchar]{%
\pgf@getrgbtuplewithmixin{#2}{#3}{#4}%
@@ -97,7 +98,7 @@
<< /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
[\pgf@prevcolor] /C1 [\pgf@rgb] /N 1 >> }% <<
\edef\pgf@prevcolor{\pgf@rgb}%
- \pgf@parserest[}}
+ \pgf@parserestrgb[}}
\def\pgf@getrgbtuplewithmixin#1#2#3{%
\pgfutil@definecolor{pgfshadetemp}{rgb}{#1,#2,#3}%
@@ -110,52 +111,267 @@
\def\pgf@sys@rgb{{#1}{#2}{#3}}%
}
+\def\pgf@parsefirstcmyk[cmyk(#1)=(#2,#3,#4,#5)#6]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@sys@shading@start@cmyk{\pgf@sys@cmyk}%
+ \let\pgf@sys@prevcolor=\pgf@sys@shading@start@cmyk%
+ \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
+ \edef\pgf@prevcolor{\pgf@cmyk}%
+ \edef\pgf@firstcolor{\pgf@cmyk}}
+\def\pgf@parselastdomcmyk[cmyk(#1)=(#2,#3,#4,#5); {%
+ \pgfutil@ifnextchar]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
+ \pgf@max=\pgf@x\relax%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@sys@shading@end@cmyk{\pgf@sys@cmyk}%
+ \pgfutil@gobble}{\pgf@parselastdomcmyk[}}
+\def\pgf@parsemidcmyk[cmyk(#1)=(#2,#3,#4,#5); {\pgf@parserestcmyk[}
+\def\pgf@parserestcmyk[cmyk(#1)=(#2,#3,#4,#5); {%
+ \advance\pgf@sys@shading@range@num by1\relax%
+ \pgfutil@ifnextchar]{%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@psfuncs{\pgf@prevx\space
+ \pgf@cmyk\space \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@cmyk}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@cmyk%
+ \pgfutil@gobble}{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@cmyk}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@cmyk%
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@cmyk\space
+ \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@encode{\pgf@encode\space0 1}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@prevcolor{\pgf@cmyk}%
+ \pgf@parserestcmyk[}}
+
+\def\pgf@getcmyktuplewithmixin#1#2#3#4{%
+ \pgfutil@definecolor{pgfshadetemp}{cmyk}{#1,#2,#3,#4}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
+ \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
+ \expandafter\pgf@getcmyk@@\pgf@cmykcolor!}
+\def\pgf@getcmyk@@#1,#2,#3,#4!{%
+ \def\pgf@cmyk{#1 #2 #3 #4}%
+ \def\pgf@sys@cmyk{{#1}{#2}{#3}{#4}}%
+}
+
+\def\pgf@parsefirstgray[gray(#1)=(#2)#3]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@sys@shading@start@gray{\pgf@sys@gray}%
+ \let\pgf@sys@prevcolor=\pgf@sys@shading@start@gray%
+ \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
+ \edef\pgf@prevcolor{\pgf@gray}%
+ \edef\pgf@firstcolor{\pgf@gray}}
+\def\pgf@parselastdomgray[gray(#1)=(#2); {%
+ \pgfutil@ifnextchar]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
+ \pgf@max=\pgf@x\relax%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@sys@shading@end@gray{\pgf@sys@gray}%
+ \pgfutil@gobble}{\pgf@parselastdomgray[}}
+\def\pgf@parsemidgray[gray(#1)=(#2); {\pgf@parserestgray[}
+\def\pgf@parserestgray[gray(#1)=(#2); {%
+ \advance\pgf@sys@shading@range@num by1\relax%
+ \pgfutil@ifnextchar]{%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@gray\space
+ \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@gray}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@gray%
+ \pgfutil@gobble}{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@gray}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@gray%
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@gray\space
+ \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@encode{\pgf@encode\space0 1}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@prevcolor{\pgf@gray}%
+ \pgf@parserestgray[}}
+
+\def\pgf@getgraytuplewithmixin#1{%
+ \pgfutil@definecolor{pgfshadetemp}{gray}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
+ \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{gray}{\pgf@graycolor}%
+ \expandafter\pgf@getgray@@\pgf@graycolor!}
+\def\pgf@getgray@@#1!{%
+ \def\pgf@gray{#1}%
+ \def\pgf@sys@gray{{#1}}%
+}
% Normalized a <color specification> argument for shadings into a
-% series of rgb color specifications and writes the result into
-% \pgf@rgbconv.
+% series of color specifications in the current xcolor color model and write
+% the result into \pgf@conv.
%
% Example:
-% \pgf@convertrgbstring{rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); rgb(4cm)=(0,0,1); gray(1cm)=(3); color(2cm)=(green); }
+% \pgf@convertstring{rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); cmyk(4cm)=(1,0,0,0); gray(1cm)=(3); color(2cm)=(green); }
% ->
-% \pgf@rgbconv = macro:->'rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); rgb(4cm)=(0,0,1); rgb(1cm)=(3,3,3); rgb(2cm)=(0,1,0); '
-\def\pgf@convertrgbstring#1{%
- \def\pgf@rgbconv{}%
- \pgf@converttorgb#1]%
+% \pgf@conv = macro:->'rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); rgb(4cm)=(0,1,1); rgb(1cm)=(3,3,3); rgb(2cm)=(0,1,0); '
+\def\pgf@convertstring#1{%
+ \def\pgf@conv{}%
+ \pgf@convert#1]%
}
-\def\pgf@converttorgb{%
+\def\pgf@convert{%
\pgfutil@ifnextchar]{\pgfutil@gobble}%done!
{%
\pgfutil@ifnextchar;{\pgf@grabsemicolor}%
{%
- \pgfutil@ifnextchar r{\pgf@grabrgb}%
+ \pgfutil@ifnextchar c{\pgf@gobblec}%
{%
\pgfutil@ifnextchar g{\pgf@grabgray}%
{%
- \pgfutil@ifnextchar c{\pgf@grabcolor}%
- {\pgferror{Illformed shading
- specification}\pgf@converttorgb}%
+ \pgfutil@ifnextchar o{\pgf@grabcolor}%
+ {%
+ \pgfutil@ifnextchar m{\pgf@grabcmyk}%
+ {%
+ \pgfutil@ifnextchar r{\pgf@grabrgb}%
+ {\pgferror{Illformed shading
+ specification}\pgf@convert}%
+ }%
+ }%
}%
}%
}%
}%
}
+\def\pgf@savecolor#1{%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor
+ {\pgf@shading@model}{\pgf@color}%
+ \expandafter\pgf@convget@\expandafter{\pgf@color}{#1}%
+}
\def\pgf@grabsemicolor;{%
- \edef\pgf@rgbconv{\pgf@rgbconv; }\pgf@converttorgb}
+ \edef\pgf@conv{\pgf@conv; }\pgf@convert}
+\def\pgf@gobblec c{\pgf@convert}
\def\pgf@grabrgb rgb(#1)=(#2,#3,#4){%
- \edef\pgf@rgbconv{\pgf@rgbconv rgb(#1)=(#2,#3,#4)}\pgf@converttorgb}
+ \pgfutil@definecolor{pgf@tempcol}{rgb}{#2,#3,#4}%
+ \pgf@savecolor{#1}%
+}
+\def\pgf@grabcmyk myk(#1)=(#2,#3,#4,#5){%
+ \pgfutil@definecolor{pgf@tempcol}{cmyk}{#2,#3,#4,#5}%
+ \pgf@savecolor{#1}%
+}
\def\pgf@grabgray gray(#1)=(#2){%
- \edef\pgf@rgbconv{\pgf@rgbconv rgb(#1)=(#2,#2,#2)}\pgf@converttorgb}
-\def\pgf@grabcolor color(#1)=(#2){%
+ \pgfutil@definecolor{pgf@tempcol}{gray}{#2}%
+ \pgf@savecolor{#1}%
+}
+\def\pgf@grabcolor olor(#1)=(#2){%
\pgfutil@colorlet{pgf@tempcol}{#2}%
- \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
- \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}%
- \expandafter\pgf@convgetrgb@\expandafter{\pgf@rgbcolor}{#1}%
+ \pgf@savecolor{#1}%
}
-\def\pgf@convgetrgb@#1#2{%
- \edef\pgf@rgbconv{\pgf@rgbconv rgb(#2)=(#1)}\pgf@converttorgb}
+\def\pgf@convget@#1#2{%
+ \edef\pgf@conv{\pgf@conv \pgf@shading@model(#2)=(#1)}\pgf@convert}
+
+\newcount\pgf@shadingcount
+\pgf@shadingcount=0
+{
+ \catcode`\/=0
+ \catcode`\\=12
+ /gdef/pgf@shadingnum{\/the/pgf@shadingcount\}
+}
+% Set up shading properties based on the current xcolor color model. This is
+% called when shadings are declared and used. \ifpgfshadingmodelrgb,
+% \ifpgfshadingmodelcmyk, and \ifpgfshadingmodelgray are set so that the type
+% 4 function in functional shadings can be converted to the current color
+% model. See \pgffuncshading*to* macros.
+
+\newif\ifpgfshadingmodelrgb
+\newif\ifpgfshadingmodelcmyk
+\newif\ifpgfshadingmodelgray
+\def\pgf@setup@shading@model{%
+ \pgfshadingmodelrgbtrue
+ \pgfshadingmodelcmykfalse
+ \pgfshadingmodelgrayfalse
+ \XC@sdef\pgf@mod@test{\XC@tgt@mod{natural}}%
+ \def\pgf@shading@device{/DeviceRGB}%
+ \def\pgf@shading@ps@device{setrgbcolor}%
+ \def\pgf@shading@functional@range{0 1 0 1 0 1}%
+ \def\pgf@shading@model{rgb}%
+ \ifx\pgf@mod@test\XC@mod@cmyk
+ \def\pgf@shading@device{/DeviceCMYK}%
+ \def\pgf@shading@ps@device{setcmykcolor}%
+ \def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
+ \def\pgf@shading@model{cmyk}%
+ \pgfshadingmodelrgbfalse
+ \pgfshadingmodelcmyktrue
+ \fi
+ \ifx\pgf@mod@test\XC@mod@gray
+ \def\pgf@shading@device{/DeviceGray}%
+ \def\pgf@shading@ps@device{setgray}%
+ \def\pgf@shading@functional@range{0 1}%
+ \def\pgf@shading@model{gray}%
+ \pgfshadingmodelrgbfalse
+ \pgfshadingmodelgraytrue
+ \fi
+ \edef\pgf@sys@driver@dvisvgm{pgfsys-dvisvgm.def}%
+ \ifx\pgfsysdriver\pgf@sys@driver@dvisvgm
+ \def\pgf@shading@model{rgb}%
+ \fi
+ \edef\pgf@sys@driver@texforht{pgfsys-tex4ht.def}%
+ \ifx\pgfsysdriver\pgf@sys@driver@texforht
+ \def\pgf@shading@model{rgb}%
+ \fi
+}
% Declares a horizontal shading for later use. The shading is a
@@ -192,12 +408,18 @@
% The following bar is 2cm long: \pgfuseshading{redtogreentoblue}.
% \end{document}
-\def\pgfdeclarehorizontalshading{\pgfutil@ifnextchar[\pgf@declarehorizontalshading{\pgf@declarehorizontalshading[]}}%
+\def\pgfdeclarehorizontalshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declarehorizontalshading{\pgf@declarehorizontalshading[]}}
\def\pgf@declarehorizontalshading[#1]#2#3#4{%
\expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
\expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname\pgfutil@empty
\pgfsys@horishading{#2}{#3}{#4}%
\else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
\expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfsys@horishading}%
\expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}}%
\expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
@@ -222,12 +444,18 @@
% The following bar is 2cm high: \pgfuseshading{redtogreentoblue}.
% \end{document}
-\def\pgfdeclareverticalshading{\pgfutil@ifnextchar[\pgf@declareverticalshading{\pgf@declareverticalshading[]}}%
+\def\pgfdeclareverticalshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declareverticalshading{\pgf@declareverticalshading[]}}
\def\pgf@declareverticalshading[#1]#2#3#4{%
\expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
\expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty
\pgfsys@vertshading{#2}{#3}{#4}%
\else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
\expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfsys@vertshading}%
\expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}}%
\expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
@@ -265,12 +493,18 @@
% The following ball has diameter 3cm: \pgfuseshading{redtogreentoblue}.
% \end{document}
-\def\pgfdeclareradialshading{\pgfutil@ifnextchar[\pgf@declareradialshading{\pgf@declareradialshading[]}}%
+\def\pgfdeclareradialshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declareradialshading{\pgf@declareradialshading[]}}
\def\pgf@declareradialshading[#1]#2#3#4{%
\expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
\expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty
\pgfsys@radialshading{#2}{#3}{#4}%
\else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
\expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfsys@radialshading}%
\expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}}%
\expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
@@ -306,10 +540,12 @@
% The function gets the coordinates of a point as input (as bp). This
% input consists of the top two elements of an otherwise empty
% (virtual, PostScript) stack. The function should then replace these
-% two values by three values, representing the red, green, and blue
-% color of the point. The numbers should be real values, not integers
-% since Apple's PDF renderer is broken in this regard (use cvr at the
-% end if necessary).
+% two values by one value representing the gray color of the point for a
+% grayscale shading, three values, representing the red, green, and blue color
+% of the point for an RGB shading, or four values, representing the cyan,
+% magenta, yellow, and black color of the point for a CMYK shading. The
+% numbers should be real values, not integers since Apple's PDF renderer is
+% broken in this regard (use cvr at the end if necessary).
%
% Conceptually, the function will be evaluated once for each point of
% the rectangle (#3) to (#4). A renderer may choose to evaluate the
@@ -317,7 +553,7 @@
% evaluated for each pixel independently.
%
% Because of the rather difficult PostScript syntax, use this macro
-% only *if you know what you are doing* (or if you are advanterous, of
+% only *if you know what you are doing* (or if you are adventurous, of
% course).
%
% As for other shadings, the optional dependencies argument is used to
@@ -330,9 +566,10 @@
%
% Inside the PostScript function #6 you cannot use colors
% directly. Rather, you must push the color components on the
-% stack. For this, it is useful to call \pgfshadergb in the startup
+% stack. For this, it is useful to call \pgfshadecolortorgb,
+% \pgfshadecolortocmyk, or \pgfshadecolortogray in the startup
% code #4. The macro takes a color name as input and stores the color's
-% red/green/blue components real numbers between 0.0 and 1.0 separated
+% component real numbers between 0.0 and 1.0 separated
% by spaces (which is exactly what you need if you want to push it on
% a stack) in a macro.
%
@@ -372,21 +609,28 @@
% and in \colorlet{mycol}{red!50!blue}\pgfuseshading{sweep} in red/blue.
% \end{document}
-\def\pgfdeclarefunctionalshading{\pgfutil@ifnextchar[\pgf@declarefunctionalshading{\pgf@declarefunctionalshading[]}}%
+\def\pgfdeclarefunctionalshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declarefunctionalshading{\pgf@declarefunctionalshading[]}}
\def\pgf@declarefunctionalshading[#1]#2#3#4#5#6{%
\expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
\expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty
\pgfshade@functionaldo{#2}{#3}{#4}{#5}{#6}%
\else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
\expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfshade@functionaldo}%
\expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}{#5}{#6}}%
\expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
\fi}
\def\pgfshade@functionaldo#1#2#3#4#5{%
- {%
+ \begingroup
#4%
\pgfsys@functionalshading{#1}{#2}{#3}{#5}%
- }%
+ \expandafter\pgfmath@smuggleone\csname @pgfshading#1!\endcsname
+ \endgroup
}
\def\pgfshadecolortorgb#1#2{%
@@ -408,8 +652,110 @@
\pgf@xc=#3pt%
}
+\def\pgfshadecolortocmyk#1#2{%
+ \pgfutil@colorlet{pgf@tempcol}{#1}%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
+ \expandafter\pgfshading@cmyk\pgf@cmykcolor\relax%
+ \edef#2{\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space
+ \pgf@sys@tonumber{\pgf@xc}\space\pgf@sys@tonumber{\pgf@xd}\space}%
+ \c@pgf@counta\escapechar%
+ \escapechar-1\relax%
+ \expandafter\edef\csname\string#2cyan\endcsname{%
+ \pgf@sys@tonumber{\pgf@xa}\space}%
+ \expandafter\edef\csname\string#2magenta\endcsname{%
+ \pgf@sys@tonumber{\pgf@xb}\space}%
+ \expandafter\edef\csname\string#2yellow\endcsname{%
+ \pgf@sys@tonumber{\pgf@xc}\space}%
+ \expandafter\edef\csname\string#2black\endcsname{%
+ \pgf@sys@tonumber{\pgf@xd}\space}%
+ \escapechar\c@pgf@counta
+}
+\def\pgfshading@cmyk#1,#2,#3,#4\relax{%
+ \pgf@xa=#1pt%
+ \pgf@xb=#2pt%
+ \pgf@xc=#3pt%
+ \pgf@xd=#4pt%
+}
+
+\def\pgfshadecolortogray#1#2{%
+ \pgfutil@colorlet{pgf@tempcol}{#1}%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{gray}{\pgf@graycolor}%
+ \expandafter\pgfshading@gray\pgf@graycolor\relax
+ \edef#2{\pgf@sys@tonumber{\pgf@xa}\space}%
+ \c@pgf@counta\escapechar
+ \escapechar-1\relax
+ \expandafter\edef\csname\string#2gray\endcsname{%
+ \pgf@sys@tonumber{\pgf@xa}\space}%
+ \escapechar\c@pgf@counta
+}
+\def\pgfshading@gray#1\relax{%
+ \pgf@xa=#1pt%
+}
+
+% Functions to convert between color models in the type 4 PostScript data of
+% functional shadings.
+
+\def\pgffuncshadingrgbtocmyk{%
+ 1.0 exch sub 3 1 roll
+ 1.0 exch sub 3 1 roll
+ 1.0 exch sub 3 1 roll
+ 3 copy
+ 2 copy gt { exch } if pop
+ 2 copy gt { exch } if pop
+ dup 3 1 roll sub
+ 0.0 2 copy lt { exch } if pop
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ dup 3 1 roll sub
+ 0.0 2 copy lt { exch } if pop
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ dup 3 1 roll sub
+ 0.0 2 copy lt { exch } if pop
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+}
+
+\def\pgffuncshadingrgbtogray{%
+ 0.11 mul exch 0.59 mul add exch 0.3 mul add
+}
+
+\def\pgffuncshadingcmyktorgb{%
+ % covert to CMY
+ dup 3 1 roll add
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ dup 3 1 roll add
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ add
+ 1.0 2 copy gt { exch } if pop
+ 3 1 roll
+ % covert to RGB
+ 1.0 exch sub
+ 3 1 roll
+ 1.0 exch sub
+ 3 1 roll
+ 1.0 exch sub
+ 3 1 roll
+}
+
+\def\pgffuncshadingcmyktogray{%
+ exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add
+ 1.0 2 copy gt { exch } if pop
+ 1.0 exch sub
+}
+\def\pgffuncshadinggraytorgb{%
+ dup dup
+}
+\def\pgffuncshadinggraytocmyk{%
+ 0.0 0.0 0.0
+ 4 3 roll
+}
% Inserts a box into the text that contains a previously defined
% shading.
@@ -426,38 +772,39 @@
\expandafter\pgfutil@ifundefined\expandafter{\pgf@shadingname}%
{\pgferror{Undefined shading "#1"}}%
{%
+ \edef\pgf@shade@adds{\csname pgf@num\pgf@shadingname\endcsname}%
+ \pgfutil@ifundefined{pgf@deps\pgf@shadingname}%
+ {}%
{%
- \pgfutil@globalcolorsfalse%
- \def\pgf@shade@adds{}%
- \pgfutil@ifundefined{pgf@deps\pgf@shadingname}%
- {}%
- {%
+ \pgf@setup@shading@model
+ \begingroup
+ \pgfutil@globalcolorsfalse
\edef\@list{\csname pgf@deps\pgf@shadingname\endcsname}%
\pgfutil@for\@temp:=\@list\do{%
- {%
- \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{\@temp}}%
- \pgfutil@extractcolorspec{\@temp}{\pgf@tempcolor}%
- \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}%
- \xdef\pgf@shade@adds{\pgf@shade@adds,\pgf@rgbcolor}%
- }%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{\@temp}}%
+ \pgfutil@extractcolorspec{\@temp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{\pgf@shading@model}{\pgf@color}%
+ \edef\pgf@shade@adds{\pgf@shade@adds,\pgf@color}%
}%
- }%
- \expandafter\pgf@strip@shadename\pgf@shadingname!!%
- \pgfutil@ifundefined{@pgfshading\pgf@basename\pgf@shade@adds!}%
- {%
- {%
- \expandafter\def\expandafter\@temp\expandafter{\csname pgf@func\pgf@shadingname\endcsname}%
- \edef\@args{{\pgf@basename\pgf@shade@adds}}%
- \expandafter\expandafter\expandafter\def%
- \expandafter\expandafter\expandafter\@@args%
- \expandafter\expandafter\expandafter{\csname pgf@args\pgf@shadingname\endcsname}%
- \expandafter\expandafter\expandafter\@temp\expandafter\@args\@@args%
- %
- }%
- }%
- {}%
- \pgf@invokeshading{\csname @pgfshading\pgf@basename\pgf@shade@adds!\endcsname}%
+ \pgfmath@smuggleone\pgf@shade@adds
+ \endgroup
+ }%
+ \expandafter\pgf@strip@shadename\pgf@shadingname!!%
+ \edef\pgf@shadingxname{@pgfshading\pgf@basename\pgf@shade@adds!}%
+ \pgfutil@ifundefined{\pgf@shadingxname}%
+ {%
+ \begingroup
+ \edef\@temp{\expandafter\noexpand\csname pgf@func\pgf@shadingname\endcsname}%
+ \edef\@args{{\pgf@basename\pgf@shade@adds}}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\@@args
+ \expandafter\expandafter\expandafter{\csname pgf@args\pgf@shadingname\endcsname}%
+ \expandafter\expandafter\expandafter\@temp\expandafter\@args\@@args
+ \expandafter\pgfmath@smuggleone\csname\pgf@shadingxname\endcsname
+ \endgroup
}%
+ {}%
+ \pgf@invokeshading{\csname\pgf@shadingxname\endcsname}%
}%
}
@@ -484,6 +831,8 @@
\def\pgfaliasshading#1#2{%
\expandafter\let\expandafter\pgf@temp\expandafter=\csname @pgfshading#2!\endcsname%
\expandafter\let\csname @pgfshading#1!\endcsname=\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@num@pgfshading#2!\endcsname%
+ \expandafter\let\csname pgf@num@pgfshading#1!\endcsname=\pgf@temp%
\expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@deps@pgfshading#2!\endcsname%
\expandafter\let\csname pgf@deps@pgfshading#1!\endcsname=\pgf@temp%
\expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@func@pgfshading#2!\endcsname%
@@ -539,40 +888,66 @@
\advance\pgf@xb by.5\pgf@pathminx%
\pgf@yb=.5\pgf@pathmaxy%
\advance\pgf@yb by.5\pgf@pathminy%
+ % Calculate rotation:
+ \pgfmathparse{#2}%
+ \let\pgfshade@angle=\pgfmathresult
+ \pgfmathsin@\pgfshade@angle
+ \let\pgfshade@sin=\pgfmathresult
+ \pgfmathcos@\pgfshade@angle
+ \let\pgfshade@cos=\pgfmathresult
+ % width and height of the bounding box
+ \pgf@xa=\pgf@pathmaxx
+ \advance\pgf@xa by-\pgf@pathminx
+ \pgf@ya=\pgf@pathmaxy
+ \advance\pgf@ya by-\pgf@pathminy
% Calculate scaling:
- \pgf@xc=\pgf@pathmaxx%
- \advance\pgf@xc by-\pgf@pathminx%
- \pgf@yc=\pgf@pathmaxy%
- \advance\pgf@yc by-\pgf@pathminy%
- \pgf@xc=.01992528\pgf@xc%
- \pgf@yc=.01992528\pgf@yc%
- \ifdim\pgf@xc<0.0001pt\relax\ifdim\pgf@xc>-0.0001pt\relax\pgf@no@shadetrue\fi\fi%
- \ifdim\pgf@yc<0.0001pt\relax\ifdim\pgf@yc>-0.0001pt\relax\pgf@no@shadetrue\fi\fi%
- \ifpgf@no@shade\else%
- \pgfsys@beginscope%
- \pgfsyssoftpath@invokecurrentpath%
- \pgfsys@clipnext%
- \pgfsys@discardpath%
- % Compute new transformation matrix:
- \pgfsys@transformcm{1}{0}{0}{1}{\pgf@xb}{\pgf@yb}%
- \pgfsys@transformcm%
- {\pgf@sys@tonumber{\pgf@xc}}{0}%
- {0}{\pgf@sys@tonumber{\pgf@yc}}{0pt}{0pt}%
- \pgfmathparse{#2}%
- \let\pgfshade@angle=\pgfmathresult%
- \pgfmathsin@{\pgfshade@angle}%
- \let\pgfshade@sin=\pgfmathresult%
- \pgfmathcos@{\pgfshade@angle}%
- \let\pgfshade@cos=\pgfmathresult%
- \pgf@x=\pgfshade@sin pt%
- \pgf@xa=-\pgf@x%
- \pgfsys@transformcm{\pgfshade@cos}{\pgfshade@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgfshade@cos}{0pt}{0pt}%
- \ifx\pgf@shade@extra@transform\pgfutil@empty%
- \else%
- \pgflowlevel{\pgf@shade@extra@transform}%
- \fi%
- \pgfuseshading{#1}%
- \pgfsys@endscope%
+ % xscale = 1pt/50bp * (w*|cos(a)|+h*|sin(a)|)/(|cos(a)|+|sin(a)|)
+ % yscale = 1pt/50bp * (w*|sin(a)|+h*|cos(a)|)/(|cos(a)|+|sin(a)|)
+ % 1pt/50bp = .01992528
+ \pgfmathabs@\pgfshade@sin
+ \let\pgfshade@abssin=\pgfmathresult
+ \pgfmathabs@\pgfshade@cos
+ \let\pgfshade@abscos=\pgfmathresult
+ \pgf@xc=\pgfshade@abscos\pgf@xa
+ \advance\pgf@xc by\pgfshade@abssin\pgf@ya
+ \pgf@yc=\pgfshade@abssin\pgf@xa
+ \advance\pgf@yc by\pgfshade@abscos\pgf@ya
+ \pgfmathadd@\pgfshade@abscos\pgfshade@abssin
+ \pgfmathdivide@{.01992528}{\pgfmathresult}%
+ \pgf@xc=\pgfmathresult\pgf@xc
+ \pgf@yc=\pgfmathresult\pgf@yc
+ \ifdim\pgf@xc<0.0001pt
+ \ifdim\pgf@xc>-0.0001pt
+ \pgf@no@shadetrue
+ \fi
+ \fi
+ \ifdim\pgf@yc<0.0001pt
+ \ifdim\pgf@yc>-0.0001pt
+ \pgf@no@shadetrue
+ \fi
+ \fi
+ \ifpgf@no@shade\else
+ \pgfsys@beginscope
+ \pgfsyssoftpath@invokecurrentpath
+ \pgfsys@clipnext
+ \pgfsys@discardpath
+ % Compute new transformation matrix:
+ % shift
+ \pgfsys@transformcm{1}{0}{0}{1}{\the\pgf@xb}{\the\pgf@yb}%
+ % rotation
+ \pgf@x=\pgfshade@sin pt%
+ \pgf@xa=-\pgf@x%
+ \pgfsys@transformcm{\pgfshade@cos}{\pgfshade@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgfshade@cos}{0pt}{0pt}%
+ % scaling
+ \pgfsys@transformcm{\pgf@sys@tonumber{\pgf@xc}}{0}{0}{\pgf@sys@tonumber{\pgf@yc}}{0pt}{0pt}%
+ % This will actually be the first transformation of the shading.
+ % Should it be applied first so that it becomes the last one?
+ \ifx\pgf@shade@extra@transform\pgfutil@empty%
+ \else%
+ \pgflowlevel{\pgf@shade@extra@transform}%
+ \fi%
+ \pgfuseshading{#1}%
+ \pgfsys@endscope%
\fi%
\endgroup%
\fi%