diff options
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.tex | 585 |
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% |