summaryrefslogtreecommitdiff
path: root/tex/context/base/colo-ini.tex
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2002-12-20 00:00:00 +0100
committerHans Hagen <pragma@wxs.nl>2002-12-20 00:00:00 +0100
commitd66c6c7f5bf3b189c2b194ba167fb39f548742e5 (patch)
tree23d545dc0956f461418b7e738a018fe046077c32 /tex/context/base/colo-ini.tex
parentd4d7f62e436c20b5ea3ee7f8c9fc3bbacd5dda43 (diff)
downloadcontext-d66c6c7f5bf3b189c2b194ba167fb39f548742e5.tar.gz
stable 2002.12.20
Diffstat (limited to 'tex/context/base/colo-ini.tex')
-rw-r--r--tex/context/base/colo-ini.tex1076
1 files changed, 845 insertions, 231 deletions
diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex
index f88d3b094..c23efdf38 100644
--- a/tex/context/base/colo-ini.tex
+++ b/tex/context/base/colo-ini.tex
@@ -14,6 +14,7 @@
\writestatus{loading}{Context Color Macros}
%D To do: stroke versus fill color
+%D 1000 100 10 -> constants
\unprotect
@@ -219,7 +220,10 @@
%D \setvalue{\??cr name}{S:s:a:t}
%D \stoptypen
-\let\colorlist\empty
+\newif\iffreezecolors \freezecolorsfalse
+
+\let\colorlist \empty
+\let\currentspotcolor\empty
\def\@@cl@@z{0}
\def\@@cl@@o{1}
@@ -227,36 +231,168 @@
\def\@@resetcolorparameters
{\let\@@cl@@r\@@cl@@z\let\@@cl@@g\@@cl@@z\let\@@cl@@b\@@cl@@z
\let\@@cl@@c\@@cl@@z\let\@@cl@@m\@@cl@@z\let\@@cl@@y\@@cl@@z
- \let\@@cl@@k\@@cl@@z\let\@@cl@@s\@@cl@@z
- \let\@@cl@@t\@@cl@@z\let\@@cl@@a\@@cl@@z}
+ \let\@@cl@@k\@@cl@@z\let\@@cl@@s\@@cl@@z\let\@@cl@@p\@@cl@@o
+ \let\@@cl@@t\@@cl@@z\let\@@cl@@a\@@cl@@z\let\@@cl@@n\empty}
\def\@@cl@@A{\@@cl@@a} % a hook for symbolic conversion, see below
-\def\colorZpattern{S:\@@cl@@z:\@@cl@@A:\@@cl@@t}
-\def\colorSpattern{S:\@@cl@@s:\@@cl@@A:\@@cl@@t}
-\def\colorCpattern{C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k:\@@cl@@A:\@@cl@@t}
-\def\colorRpattern{R:\@@cl@@r:\@@cl@@g:\@@cl@@b:\@@cl@@A:\@@cl@@t}
+%D Handling a few nested \type{\cs}'s is no problem (\type
+%D {\@EA\@EAEAEA\@EA}) but we need a full expansion, so I
+%D tried one of the fully expandable primitives using a sort
+%D of delimited thing. I tried \type {\number} first, but this
+%D does not work, but \type {\romannumeral} does. Actually,
+%D \type{\romannumeral0} returns nothing, so it's a perfect
+%D candidate for this kind of hackery. This reminds me that I
+%D have to look into David Karstrup's (check spelling)
+%D Euro\TeX\ 2002 article because he is using \type
+%D {\romannumeral} for loops (repetitive \quote {m} stuff).
+
+% \def\x{\y}\def\y{\z}\def\z{0:1:1:1}
+%
+% \def\bla #1:#2:#3\end{}
+%
+% \@EA\bla\romannumeral\x\end
+
+\def\colorXpattern{0S:\@@cl@@z:\@@cl@@z:\@@cl@@z}
+\def\colorZpattern{0S:\@@cl@@z:\@@cl@@A:\@@cl@@t}
+\def\colorSpattern{0S:\@@cl@@s:\@@cl@@A:\@@cl@@t}
+\def\colorCpattern{0C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k:\@@cl@@A:\@@cl@@t}
+\def\colorRpattern{0R:\@@cl@@r:\@@cl@@g:\@@cl@@b:\@@cl@@A:\@@cl@@t}
+\def\colorPpattern{0P:\@@cl@@n:\@@cl@@p:\@@cl@@A:\@@cl@@t}
-\def\definecolor
- {\dodoubleargument\dodefinecolor}
+%D The extra 0 catches empty colors specs (needed for the
+%D \type {\MPcolor} and \type {\PDFcolor} conversion (\type
+%D {\@@cr} equals \type {\relax}!).
+
+\def\handlecolorwith#1{\@EA#1\romannumeral0}
-\def\dodefinecolor[#1][#2]%
- {\addtocommalist{#1}\colorlist
- \doifassignmentelse{#2}
+%D Next comes the main definition macro.
+
+\def\definecolor {\dodoubleargument\dodefinecolor}
+\def\defineglobalcolor{\dodoubleargument\dodefineglobalcolor}
+\def\definenamedcolor {\dodoubleargument\dodefinenamedcolor}
+
+\def\dodefinecolor {\dododefinecolor\relax \setvalue \setevalue1}
+\def\dodefineglobalcolor{\dododefinecolor\doglobal\setgvalue\setxvalue1}
+\def\dodefinenamedcolor {\dododefinecolor\doglobal\setvalue \setevalue0}
+
+% keep this for readability
+%
+% \def\dodefinecolor[#1][#2]%
+% {\addtocommalist{#1}\colorlist
+% \doifassignmentelse{#2}
+% {\@@resetcolorparameters
+% \getparameters[\??cl @@][#2]%
+% \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
+% {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
+% {\doifelse\@@cl@@s\@@cl@@z
+% {\showmessage\m!colors8{{[#2]},#1}%
+% \setevalue{\??cr#1}{\colorZpattern}}
+% {\setevalue{\??cr#1}{\colorSpattern}}}
+% {\setevalue{\??cr#1}{\colorCpattern}}}
+% {\setevalue{\??cr#1}{\colorRpattern}}}
+% {\doifdefinedelse{\??cr#2}
+% {\doifelse{#1}{#2}
+% {% this way we can freeze \definecolor[somecolor][somecolor]
+% % and still prevent cyclic definitions
+% \iffreezecolors\setevalue{\??cr#1}{\getvalue{\??cr#2}}\fi}
+% {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi
+% {\??cr#1}{\getvalue{\??cr#2}}}}
+% {\showmessage\m!colors3{#1}}}%
+% \unexpanded\setvalue{#1}{\color[#1]}} % \unexpanded toegevoegd
+
+\def\dododefinecolor#1#2#3#4[#5][#6]% #2==set(g)value #3==set[e|x]value
+ {#1\addtocommalist{#5}\colorlist
+ \doifassignmentelse{#6}
{\@@resetcolorparameters
- \getparameters[\??cl @@][#2]%
+ \getparameters[\??cl @@][#6]%
\doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
{\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@s}{\@@cl@@z}
- {\showmessage{\m!colors}{8}{{[#2]},#1}%
- \setevalue{\??cr#1}{\colorZpattern}}
- {\setevalue{\??cr#1}{\colorSpattern}}}
- {\setevalue{\??cr#1}{\colorCpattern}}}
- {\setevalue{\??cr#1}{\colorRpattern}}}
- {\doifdefinedelse{\??cr#2}
- {\setevalue{\??cr#1}{\getvalue{\??cr#2}}}
- {\showmessage{\m!colors}{3}{#1}}}%
- \unexpanded\setvalue{#1}{\color[#1]}} % \unexpanded toegevoegd
+ {\doifelse\@@cl@@s\@@cl@@z
+ {\showmessage\m!colors8{{[#6]},#5}%
+ #3{\??cr#5}{\colorZpattern}}
+ {#3{\??cr#5}{\colorSpattern}}}
+ {#3{\??cr#5}{\colorCpattern}}}
+ {#3{\??cr#5}{\colorRpattern}}}
+ {\doifdefinedelse{\??cr#6}
+ {\doifelse{#5}{#6}
+ {% this way we can freeze \definecolor[somecolor][somecolor]
+ % and still prevent cyclic definitions
+ \iffreezecolors#3{\??cr#5}{\getvalue{\??cr#6}}\fi}
+ {\iffreezecolors\@EA#3\else\@EA#2\fi
+ {\??cr#5}{\getvalue{\??cr#6}}}}
+ {\showmessage\m!colors3{#5}}}%
+ \ifcase#4\or
+ \unexpanded#2{#5}{\switchtocolor[#5]}% \unexpanded toegevoegd
+ \fi}
+
+%D New and experimental.
+
+\let\allspotcolors\empty
+
+\def\definespotcolor % [name] [color] [p=,t=,a=]
+ {\dotripleempty\dodefinespotcolor}
+
+\def\dodefinespotcolor[#1][#2][#3]%
+ {\doifnot{#1}{#2}
+ {\@@resetcolorparameters
+ \edef\@@cl@@n{#2}%
+ \getparameters[\??cl @@][#3]%
+ \doifnothing\@@cl@@p{\let\@@cl@@p\!!plusone}%
+ \doglobal\addtocommalist{#2}\allspotcolors
+ \setevalue{\??cr#1}{\colorPpattern}%
+ \setvalue{#1}{\switchtocolor[#1]}}}
+
+\let\usedspotcolors\empty
+
+\def\registerusedspotcolors
+ {\ifx\allspotcolors\empty \else
+ \bgroup
+ \let\usedspotcolors\empty
+ \def\docommando##1%
+ {\doifdefined{\??cs##1}{\addtocommalist{##1}\usedspotcolors}}%
+ \processcommacommand[\allspotcolors]\docommando
+ \savecurrentvalue\usedspotcolors\usedspotcolors
+ \egroup
+ \fi}
+
+\let\usedcolorchannels\empty
+
+\def\registerusedcolorchannels
+ {\bgroup
+ \doifdefinedelse{\??cs c}
+ {\def\usedcolorchannels{c,m,y,k}}%
+ {\let\usedcolorchannels\empty}%
+ \doifdefined{\??cs r}
+ {\addtocommalist{r,g,b}\usedcolorchannels}%
+ \doifdefined{\??cs s}
+ {\ExpandBothAfter\doifnotinset{k}\usedcolorchannels
+ {\addtocommalist{s}\usedcolorchannels}}%
+ \savecurrentvalue\usedcolorchannels\usedcolorchannels
+ \egroup}
+
+\prependtoks
+ \registerusedspotcolors
+ \registerusedcolorchannels
+\to \everylastshipout
+
+\def\registerusedspotcolor#1%
+ {\global\@EA\chardef\csname\??cs#1\endcsname\zerocount}
+
+%D We now redefine the color definition macro so that you
+%D can define both normal and spotcolors.
+
+\def\definecolor
+ {\dotripleempty\dodefinewhatevercolor}
+
+\def\dodefinewhatevercolor[#1][#2][#3]%
+ {\ifthirdargument
+ \doifassignmentelse{#2}
+ {\dododefinecolor[#1][#2,#3]}% actually this is an error
+ {\dodefinespotcolor[#1][#2][#3]}%
+ \else
+ \dodefinecolor[#1][#2]%
+ \fi}
%D The names of colors are stored in a comma separated list
%D only for the purpose of showing them with \type {\showcolor}.
@@ -264,8 +400,24 @@
%D \typebuffer
%D \haalbuffer
%D
-%D This color shows up as \color[SomeKindOfRed]{some kind
+%D This color shows up as \color [SomeKindOfRed] {some kind
%D of red}.
+%D
+%D \starttypen
+%D \setupcolors[state=start]
+%D
+%D \definecolor[mygreen][green]
+%D \definecolor[green][g=.5]
+%D
+%D \startcolor[mygreen]test\stopcolor
+%D
+%D \setupcolors[expansion=no]
+%D
+%D \definecolor[mygreen][green]
+%D \definecolor[green][g=.5]
+%D
+%D \startcolor[mygreen]test\stopcolor
+%D \stoptypen
%D \macros
%D {setupcolor}
@@ -290,11 +442,11 @@
\let\colorstyle\empty
-\def\setupcolor%
+\def\setupcolor
{\dosingleargument\dosetupcolor}
\def\dosetupcolor[#1]%
- {\doifnot{#1}{\colorstyle}
+ {\doifnot{#1}\colorstyle
{\def\colorstyle{#1}%
\processcommalist[#1]\dodosetupcolor}}
@@ -327,6 +479,7 @@
\newif\ifRGBsupported
\newif\ifCMYKsupported
+\newif\ifSPOTsupported
\newif\ifpreferGRAY
\newif\ifGRAYprefered
\newif\ifreduceCMYK
@@ -381,9 +534,9 @@
\def\dowithcolor#1#2% #1=\action #2=color
{\ifincolor\ifpermitcolormode
\ifcsname\??cr\currentpalet#2\endcsname
- \@EAEAEA#1\csname\??cr\currentpalet#2\endcsname\od
+ \handlecolorwith#1\csname\??cr\currentpalet#2\endcsname\od
\else\ifcsname\??cr#2\endcsname
- \@EAEAEA#1\csname\??cr#2\endcsname\od
+ \handlecolorwith#1\csname\??cr#2\endcsname\od
\fi\fi
\fi\fi}
@@ -395,22 +548,33 @@
{\ifincolor\ifpermitcolormode
\@EA\ifx\csname\??cr\currentpalet#2\endcsname\relax
\@EA\ifx\csname\??cr#2\endcsname\relax \else
- \@EAEAEA#1\csname\??cr#2\endcsname\od
+ \handlecolorwith#1\csname\??cr#2\endcsname\od
\fi
\else
- \@EAEAEA#1\csname\??cr\currentpalet#2\endcsname\od
+ \handlecolorwith#1\csname\??cr\currentpalet#2\endcsname\od
\fi
\fi\fi}
\endTEX
\def\startcolormode % includes \ifincolor\ifpermitcolormode
- {\dowithcolor\execcolorRCS}
+ {%\dostoptransparency % needed for: {test \trans test \notrans test}
+ \conditionalstoptransparency
+ \dowithcolor\execcolorRCSP}
\def\stopcolormode
{\ifincolor\ifpermitcolormode
+ \dostoptransparency
+ \dostopcolormode
+ \fi\fi}
+
+\def\restorecolormode
+ {\ifincolor\ifpermitcolormode
\dostoptransparency
\dostopcolormode
+ \ifx\maintextcolor\empty \else
+ \startcolormode\maintextcolor
+ \fi
\fi\fi}
%D Color modes are entered using the next set of commands.
@@ -420,54 +584,277 @@
%D The, for this module redundant, check if we are in color
%D mode is needed when we use these macros in other modules.
-\def\execcolorRCS#1:%
+\chardef\currentcolorchannel=0
+
+\newif\iffilterspotcolor \filterspotcolorfalse
+\newif\ifdoingspotcolor \doingspotcolorfalse
+
+\def\registercolorchannel#1%
+ {\ifdoingspotcolor \else
+ \global\expandafter\chardef\csname\??cs#1\endcsname\zerocount
+ \fi}
+
+\def\execcolorRCSP#1:%
{\csname execcolor#1\endcsname}
-\def\execcolorR#1:#2:#3:%
+\def\execcolorR
+ {\iffilterspotcolor
+ \@EA\noexeccolor
+ \else
+ \@EA\doexeccolorR
+ \fi}
+
+\def\execcolorC
+ {\iffilterspotcolor
+ \@EA\noexeccolor
+ \else
+ \@EA\doexeccolorC
+ \fi}
+
+\def\execcolorS
+ {\iffilterspotcolor
+ \@EA\noexeccolorS
+ \else
+ \@EA\doexeccolorS
+ \fi}
+
+\def\execcolorP
+ {\iffilterspotcolor
+ \@EA\doexeccolorPP
+ \else\ifcase\currentcolorchannel
+ \@EAEAEA\doexeccolorP
+ \else
+ \@EAEAEA\noexeccolorP
+ \fi\fi}
+
+\def\doexeccolorR#1:#2:#3:%
{\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
\ifpreferGRAY\ifx\@@cl@@r\@@cr@@g\ifx\@@cl@@r\@@cl@@b
\GRAYpreferedtrue
\fi\fi\fi
\ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
\ifGRAYprefered
- \dostartgraycolormode\@@cl@@r
+ \registercolorchannel\c!s
+ \let\@@cl@@s\@@cl@@r
+ \normalizeGRAY
+ \doexeccolorgray
\else\ifRGBsupported
- \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
+ \registercolorchannel\c!r
+ \normalizeRGB
+ \doexeccolorrgb
\else\ifCMYKsupported
+ \registercolorchannel\c!c
\convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+\normalizeCMYK
+ \doexeccolorcmyk
\else
+ \registercolorchannel\c!s
\convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
- \dostartgraycolormode\@@cl@@s
+\normalizeGRAY
+ \doexeccolorgray
\fi\fi\fi
\exectransparency}
-
-\def\execcolorC#1:#2:#3:#4:%
+
+\def\doexeccolorC#1:#2:#3:#4:%
{\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
\ifpreferGRAY\ifx\@@cl@@k\@@cl@@z\ifx\@@cl@@c\@@cr@@m\ifx\@@cl@@c\@@cl@@y
\GRAYpreferedtrue
\fi\fi\fi\fi
\ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
\ifGRAYprefered
- \dostartgraycolormode\@@cl@@c
+ \registercolorchannel\c!s
+ \let\@@cl@@s\@@cl@@c
+ \normalizeGRAY
+ \doexeccolorgray
\else\ifCMYKsupported
+ \registercolorchannel\c!c
\ifreduceCMYK
\convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \fi
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+% \else
+% \normalizeCMYK
+% \fi
+\fi
+\normalizeCMYK
+ \doexeccolorcmyk
\else\ifRGBsupported
+ \registercolorchannel\c!r
\convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
+\normalizeRGB
+ \doexeccolorrgb
\else
+ \registercolorchannel\c!s
\convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \dostartgraycolormode\@@cl@@s
+\normalizeGRAY
+ \doexeccolorgray
\fi\fi\fi
\exectransparency}
-
-\def\execcolorS#1:%
- {\dostartgraycolormode{#1}%
+
+\def\doexeccolorS#1:%
+ {\edef\@@cl@@s{#1}%
+ \registercolorchannel\c!s
+ \normalizeGRAY
+ \doexeccolorgray
\exectransparency}
+\def\doexeccolorP#1:#2:%
+ {\edef\@@cl@@n{#1}%
+ \edef\@@cl@@p{#2}%
+ \registerusedspotcolor\@@cl@@n
+ \ifSPOTsupported
+ \dowithcolor\registerspotcolor\@@cl@@n
+ \dostartspotcolormode\@@cl@@n\@@cl@@p
+ \else
+ \doingspotcolortrue
+ \let\spotcolorfactor\@@cl@@p
+ \factorizecolortrue % using counter and array
+ \dowithcolor\execcolorRCSP\@@cl@@n
+ \factorizecolorfalse
+\let\spotcolorfactor\@@cl@@o
+ \doingspotcolorfalse
+ \fi
+ \exectransparency}
+
+\def\doexeccolorPP#1:#2:%
+ {\edef\@@cl@@n{#1}%
+ \edef\@@cl@@p{#2}%
+ \registerusedspotcolor\@@cl@@n
+ \ifx\@@cl@@n\currentspotcolor
+ \normalizeSPOT
+ \dostartgraycolormode\@@cl@@p % was spotcolormode
+ \else
+ \dostartgraycolormode\@@cl@@o
+ \fi
+ \exectransparency}
+
+\def\doexeccolorrgb
+ {\ifcase\currentcolorchannel
+ \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
+ \or \or \or \or
+ \or \dostartgraycolormode\@@cl@@r
+ \or \dostartgraycolormode\@@cl@@g
+ \or \dostartgraycolormode\@@cl@@b
+ \fi}
+
+\def\doexeccolorcmyk
+ {\ifcase\currentcolorchannel
+ \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \or \negatecolorcomponent\@@cl@@c\dostartgraycolormode\@@cl@@c
+ \or \negatecolorcomponent\@@cl@@m\dostartgraycolormode\@@cl@@m
+ \or \negatecolorcomponent\@@cl@@y\dostartgraycolormode\@@cl@@y
+ \or \negatecolorcomponent\@@cl@@k\dostartgraycolormode\@@cl@@k
+ \fi}
+
+\def\doexeccolorgray
+ {\ifcase\currentcolorchannel
+ \dostartgraycolormode\@@cl@@s
+ \or \or \or
+ \or \dostartgraycolormode\@@cl@@s
+ \or \or \or
+ \or \dostartgraycolormode\@@cl@@s
+ \fi}
+
+%D When filtering colors, we need to either erase
+%D the background, or ignore the foreground.
+
+\newif\ifhidesplitcolor \hidesplitcolortrue
+
+\def\noexeccolor#1\od
+ {\dostartgraycolormode\@@cl@@o}
+
+\let\noexeccolorS\noexeccolor
+\let\noexeccolorP\noexeccolor
+
+%D For the sake of postprocessing (i.e.\ color separation)
+%D we can normalize colors, which comes down to giving equal
+%D values an equal accuracy and format. This feature is
+%D turned off by default due to a speed penalty. This macro
+%D also handles spot color precentages.
+
+\newif\iffactorizecolor
+\newif\ifnormalizecolor
+
+\def\spotcolorfactor{1}
+
+\def\normalizecolor#1%
+ {\colordimen#1\thousandpoint
+ \colordimen\spotcolorfactor\colordimen
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard
+ \edef#1{\realcolorvalue\colorcount}}
+
+\def\normalizespotcolor#1%
+ {\colordimen-#1\thousandpoint
+ \advance\colordimen\thousandpoint
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard
+ \edef#1{\realcolorvalue\colorcount}}
+
+\def\donormalizeRGB
+ {\normalizecolor\@@cl@@r
+ \normalizecolor\@@cl@@g
+ \normalizecolor\@@cl@@b}
+
+\def\normalizeRGB
+ {\ifnormalizecolor
+ \donormalizeRGB
+ \else\iffactorizecolor
+ \donormalizeRGB
+ \fi\fi}
+
+\def\donormalizeCMYK
+ {\normalizecolor\@@cl@@c
+ \normalizecolor\@@cl@@m
+ \normalizecolor\@@cl@@y
+ \normalizecolor\@@cl@@k}
+
+\def\normalizeCMYK
+ {\ifnormalizecolor
+ \donormalizeCMYK
+ \else\iffactorizecolor
+ \donormalizeCMYK
+ \fi\fi}
+
+\def\donormalizeGRAY
+ {\normalizecolor\@@cl@@s}
+
+\def\normalizeGRAY
+ {\ifnormalizecolor
+ \donormalizeGRAY
+ \else\iffactorizecolor
+ \donormalizeGRAY
+ \fi\fi}
+
+\def\normalizeSPOT
+ {\normalizespotcolor\@@cl@@p}
+
+%D We need to register spot colors (i.e.\ resources need to
+%D be created.
+
+\def\registerspotcolor#1:%
+ {\ifundefined{\??cl:\c!p:\@@cl@@n}%
+ \letgvalue{\??cl:\c!p:\@@cl@@n}\empty
+ \@EA\@EA\csname registerspotcolor#1\endcsname
+ \else
+ \@EA\dontregistersplotcolor
+ \fi}
+
+\def\dontregistersplotcolor#1\od
+ {}
+
+\def\registerspotcolorR#1:#2:#3:#4\od
+ {\doregisterrgbspotcolor\@@cl@@n{#1}{#2}{#3}}
+
+\def\registerspotcolorC#1:#2:#3:#4:#5\od
+ {\doregistercmykspotcolor\@@cl@@n{#1}{#2}{#3}{#4}}
+
+\def\registerspotcolorS#1:#2\od
+ {\doregistergrayspotcolor\@@cl@@n{#1}}
+
+\def\registerspotcolorP#1:#2:#3\od
+ {\doregistergrayspotcolor\@@cl@@n{#2}}
+
%D Transparency is handled similar for all three color modes. We
%D can turn transparency off with the following switch:
@@ -480,24 +867,46 @@
\expandafter\noexectransparency
\fi}
+%\def\doexectransparency#1:#2\od
+% {\global\@EA\chardef\csname\@@currenttransparent\endcsname % nasty
+% \ifcase#1\space
+% \zerocount
+% \else
+% \plusone
+% \dostarttransparency{#1}{#2}%
+% \fi}
+
\def\doexectransparency#1:#2\od
- {\global\@EA\chardef\csname\@@currenttransparent\endcsname % nasty
- \ifcase#1\space
- \zerocount
+ {\ifcase#1\space
+ \global\intransparentfalse
\else
- \plusone
+ \global\intransparentfalse
\dostarttransparency{#1}{#2}%
+ \global\intransparenttrue
\fi}
\def\noexectransparency#1\od
{}
-%D Todo: minimize resets.
+%D Experimental: minimize transparency resets.
-\def\conditionalstoptransparancy
- {\ifcase\csname\@@currenttransparent\endcsname\or
+\newif\ifintransparent \newif\ifoptimizetransparency
+
+\def\conditionalstoptransparency
+ {\iffilterspotcolor
\dostoptransparency
- \fi}
+ \else\ifcase\currentcolorchannel
+ \ifoptimizetransparency
+ \ifintransparent
+ \dostoptransparency
+ \global\intransparentfalse
+ \fi
+ \else
+ \dostoptransparency
+ \fi
+ \else
+ \dostoptransparency
+ \fi\fi}
%D We now use the \type {\@@cl@@A} hook to implement
%D symbolic names. These are converted into numbers
@@ -566,20 +975,38 @@
%D \stopregistercolor
%D \stoptypen
-\let\maintextcolor\empty
+\let\maintextcolor\empty \def\defaulttextcolor{black}
+
+% \def\starttextcolor[#1]%
+% {\doifsomething{#1}
+% {\bgroup
+% \def\stoptextcolor % also goes ok with \page after
+% {\let\maintextcolor\empty % this one because the top of
+% \stopregistercolor % page sets the color right (side
+% \egroup}% % effect)
+% \def\starttextcolor[##1]%
+% {\bgroup
+% \let\stoptextcolor\egroup}%
+% \startregistercolor[#1]%
+% \edef\maintextcolor{#1}}}
-\def\starttextcolor[#1]%
+\def\@@themaintextcolor{themaintextcolor}
+
+\def\starttextcolor[#1]%
{\doifsomething{#1}
{\bgroup
- \def\stoptextcolor % also goes ok with \page after
- {\let\maintextcolor\empty % this one because the top of
- \stopregistercolor % page sets the color right (side
- \egroup}% % effect)
+ \def\stoptextcolor % also goes ok with \page after
+ {\let\maintextcolor\empty % this one because the top of
+ \stopregistercolor % page sets the color right (side
+ \egroup}% % effect)
\def\starttextcolor[##1]%
{\bgroup
- \let\stoptextcolor\egroup}%
- \startregistercolor[#1]%
- \def\maintextcolor{#1}}}
+ % \@@themaintextcolor==##1 is catched in \definecolor
+ \definecolor[\@@themaintextcolor][##1]%
+ \let\stoptextcolor\egroup}%
+ \startregistercolor[\@@themaintextcolor]%
+ \definecolor[\@@themaintextcolor][#1]%
+ \let\maintextcolor\@@themaintextcolor}}
\let\stoptextcolor\relax
@@ -589,20 +1016,42 @@
\ifx\initializemaintextcolor\undefined
- % \let\initializemaintextcolor\relax
+% \def\initializemaintextcolor
+% {\doifsomething\@@cltekstkleur
+% {\appendtoks\starttextcolor[\@@cltekstkleur]\to\everystarttext
+% \appendtoks\stoptextcolor \to\everystoptext
+% \let\initializemaintextcolor\relax}}
- \def\initializemaintextcolor
- {\doifsomething{\@@cltekstkleur}
- {\appendtoks\starttextcolor[\@@cltekstkleur]\to\everystarttext
- \appendtoks\stoptextcolor \to\everystoptext
- \let\initializemaintextcolor\relax}}
+ % global ?
+ \def\initializemaintextcolor
+ {\doifelsenothing\@@cltekstkleur
+ {\let\maintextcolor\empty}
+ {\let\maintextcolor\@@themaintextcolor
+ \definecolor[\@@themaintextcolor][\@@cltekstkleur]%
+ \doinitializemaintextcolor}}
+
+ \def\doinitializemaintextcolor
+ {\appendtoks\starttextcolor[\@@themaintextcolor]\to\everystarttext
+ \appendtoks\stoptextcolor \to\everystoptext
+ \let\doinitializemaintextcolor\relax}
+
\fi
%D The next macro can be used to return to the (normal)
%D page color. This macro is used in the same way as
%D \type {\color}.
+\def\localstarttextcolor
+ {\ifx\maintextcolor\empty
+ \startcolormode\defaulttextcolor
+ \else
+ \startcolormode\maintextcolor
+ \fi}
+
+\def\localstoptextcolor
+ {\stopcolormode}
+
\def\restoretextcolor
{\ifx\maintextcolor\empty
\expandafter\dorestoretextcolor
@@ -611,7 +1060,7 @@
\fi}
\def\dorestoretextcolor
- {\color[black]}
+ {\color[\defaulttextcolor]}
%D We use some reserved names for local color components.
%D Consistent use of these scratch variables saves us
@@ -665,17 +1114,17 @@
\else 0\fi}
\def\doconvertCMYKtoRGB#1\k#2\to#3%
- {\ifdim#2\s!pt<#1\s!pt
+ {\ifdim#2\s!pt>#1\s!pt % >= problem, repaired 2/12/2002
+ \let#3\@@cl@@z % k >= color
+ \else
\colordimen1\s!pt
\advance\colordimen -#1\s!pt
\advance\colordimen -#2\s!pt
- \multiply\colordimen 1000
+ \multiply\colordimen \!!thousand\relax % 1000
\colorcount\colordimen
\advance\colorcount \medcard
\divide\colorcount \maxcard
\edef#3{\realcolorvalue\colorcount}%
- \else % k >= color
- \let#3\@@cl@@z
\fi}
\def\convertCMYKtoRGB#1#2#3#4%
@@ -685,12 +1134,12 @@
\def\doconvertRGBtoCMYK#1\to#2%
{\colordimen#1\s!pt
- \multiply\colordimen 1000
+ \multiply\colordimen \!!thousand\relax % 1000
\colorcount\colordimen
\advance\colorcount \medcard
\divide\colorcount \maxcard
\colorcount-\colorcount
- \advance\colorcount 1000
+ \advance\colorcount \!!thousand\relax % 1000
\edef#2{\realcolorvalue\colorcount}}
\def\convertRGBtoCMYK#1#2#3%
@@ -735,7 +1184,7 @@
%\else
% \colordimen\colordimen
\fi
- \multiply\colordimen 1000
+ \multiply\colordimen \!!thousand\relax % 1000
\colorcount\colordimen
\advance\colorcount \medcard
\divide\colorcount \maxcard
@@ -752,71 +1201,112 @@
%D booleans that control local and global behavior (more on
%D that later) and conversion to other color spaces.
+\let\currentspotcolor \empty
+\let\previousspotcolor\empty
+
\newif\ifincolor
\newif\iflocalcolor
-\def\setupcolors%
+\def\setupcolors
{\dosingleargument\dosetupcolors}
+\def\resetcolorsplitting
+ {\chardef\currentcolorchannel\zerocount
+ \let\currentspotcolor\empty
+ \filterspotcolorfalse}
+
+\def\colorsplitsuffix{\ifcase\currentcolorchannel\else-\@@clsplitsen\fi}
+\def\colorsplitprefix{\ifcase\currentcolorchannel\else\@@clsplitsen-\fi}
+
+\ifx\resetsystemmode\undefined
+ \let\setsystemmode \gobbleoneargument
+ \let\resetsystemmode\gobbleoneargument
+\fi
+
+\def\setcolorsplitting
+ {\resetsystemmode{\v!kleur\colorsplitsuffix}%
+ \resetcolorsplitting
+ \processaction
+ [\@@clsplitsen]
+ [ c=>\chardef\currentcolorchannel1,%
+ m=>\chardef\currentcolorchannel2,%
+ y=>\chardef\currentcolorchannel3,%
+ k=>\chardef\currentcolorchannel4,%
+ r=>\chardef\currentcolorchannel5,%
+ g=>\chardef\currentcolorchannel6,%
+ b=>\chardef\currentcolorchannel7,%
+ s=>\chardef\currentcolorchannel8,%
+ \v!nee=>,% \currentcolorchannel0,% all colors
+ \s!default=>,% \currentcolorchannel0,% all colors
+ \s!unknown=>\filterspotcolortrue
+ \edef\currentspotcolor{\commalistelement}]%
+ \setsystemmode{\v!kleur\colorsplitsuffix}%
+ \iffilterspotcolor \let\@@clrgb\v!nee \fi}
+
\def\dosetupcolors[#1]%
- {\getparameters[\??cl][#1]%
- \doifelse\@@clreductie\v!ja
- \reduceCMYKtrue
- \reduceCMYKfalse
- \doifelse\@@clrgb\v!nee
- {\ifRGBsupported \showmessage\m!colors {9}\v!rgb\RGBsupportedfalse\fi}
- {\ifRGBsupported\else\showmessage\m!colors{10}\v!rgb\RGBsupportedtrue \fi}%
- \doifelse\@@clcmyk\v!nee
- {\ifCMYKsupported \showmessage\m!colors {9}\v!cmyk\CMYKsupportedfalse\fi}
- {\ifCMYKsupported\else\showmessage\m!colors{10}\v!cmyk\CMYKsupportedtrue \fi}%
- \doifelse\@@clmpcmyk\v!nee
- {\ifMPcmyk \showmessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykfalse\fi}
- {\ifMPcmyk\else\showmessage\m!colors{10}{\v!mp\v!cmyk}\MPcmyktrue \fi}%
-% \processaction
-% [\@@clconversie]
-% [ \v!ja=>\preferGRAYtrue,
-% \v!nee=>\preferGRAYfalse,
-% \v!altijd=>\preferGRAYtrue
-% \RGBsupportedfalse
-% \CMYKsupportedfalse,
-% \s!default=>\preferGRAYfalse,
-% \s!unknown=>\preferGRAYfalse]%
-%
- \preferGRAYfalse
- \processaction
- [\@@clconversie]
- [ \v!ja=>\preferGRAYtrue,
- \v!altijd=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
-%
- \ifRGBsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \else\ifCMYKsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \convertMPcolorstrue
- \ifreduceCMYK
- \reduceMPcolorstrue
- \fi
- \else
- \ifconverttoGRAY\else\showmessage\m!colors{11}\empty\fi
- \converttoGRAYtrue
- \forcegrayMPcolorstrue
- \convertMPcolorsfalse
- \reduceMPcolorsfalse
- \fi\fi
- \processaction
- [\@@clstatus]
- [\v!globaal=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
- \incolortrue\localcolorfalse,
- \v!lokaal=>\ifincolor\else\showmessage\m!colors2\colorstyle\fi
- \incolortrue\localcolortrue,
- \v!start=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
- \incolortrue\localcolorfalse
- \let\@@clstatus\v!globaal,
- \v!stop=>\incolorfalse\localcolorfalse
- \forcegrayMPcolorstrue]%
- \initializemaintextcolor}
+ {\getparameters[\??cl][#1]%
+ \doifelse\@@clspot\v!ja
+ \SPOTsupportedtrue
+ \SPOTsupportedfalse
+ \doifelsenothing\@@clsplitsen
+ \resetcolorsplitting
+ \setcolorsplitting
+ \doifelse\@@clreductie\v!ja
+ \reduceCMYKtrue
+ \reduceCMYKfalse
+ \doifelse\@@clexpansie\v!ja
+ \freezecolorstrue
+ \freezecolorsfalse
+ \doifelse\@@clcriterium\v!alles
+ \hidesplitcolortrue
+ \hidesplitcolorfalse
+ \doifelse\@@clrgb\v!nee
+ {\ifRGBsupported \showmessage\m!colors {9}\v!rgb\RGBsupportedfalse\fi}
+ {\ifRGBsupported\else\showmessage\m!colors{10}\v!rgb\RGBsupportedtrue \fi}%
+ \doifelse\@@clcmyk\v!nee
+ {\ifCMYKsupported \showmessage\m!colors {9}\v!cmyk\CMYKsupportedfalse\fi}
+ {\ifCMYKsupported\else\showmessage\m!colors{10}\v!cmyk\CMYKsupportedtrue \fi}%
+ % todo : mpspot
+ \doifelse\@@clmpcmyk\v!nee
+ {\ifMPcmykcolors \showmessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse\fi}
+ {\ifMPcmykcolors\else\showmessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue \fi}%
+ \doifelse\@@clmpspot\v!nee
+ {\ifMPspotcolors \showmessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse\fi}
+ {\ifMPspotcolors\else\showmessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue \fi}%
+ \preferGRAYfalse
+ \processaction
+ [\@@clconversie]
+ [ \v!ja=>\preferGRAYtrue,
+ \v!altijd=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
+ \ifRGBsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \else\ifCMYKsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \convertMPcolorstrue
+ \ifreduceCMYK
+ \reduceMPcolorstrue
+ \fi
+ \else
+ \ifconverttoGRAY\else\showmessage\m!colors{11}\empty\fi
+ \converttoGRAYtrue
+ \forcegrayMPcolorstrue
+ \convertMPcolorsfalse
+ \reduceMPcolorsfalse
+ \fi\fi
+ \processaction
+ [\@@clstatus]
+ [\v!globaal=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
+ \incolortrue\localcolorfalse,
+ \v!lokaal=>\ifincolor\else\showmessage\m!colors2\colorstyle\fi
+ \incolortrue\localcolortrue,
+ \v!start=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
+ \incolortrue\localcolorfalse
+ \let\@@clstatus\v!globaal,
+ \v!stop=>\incolorfalse\localcolorfalse
+ \forcegrayMPcolorstrue]%
+ \initializemaintextcolor}
%D \macros
%D {doifcolorelse}
@@ -929,16 +1419,21 @@
\def\@@currentcolorstop {\??cl\the\colorlevel S}
\def\@@currenttransparent{\??cl\the\colorlevel T}
+\def\currentcolor
+ {\csname
+ \ifundefined\@@currentcolorname\s!empty\else\@@currentcolorname\fi
+ \endcsname}
+
\def\dodoglobalstartcolor
- {\global\@EA\let\@EA\currentcolor\csname\@@currentcolorname\endcsname
+ {\global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
\global\advance\colorlevel \@@colorplus
\global\@EA\let\csname\@@currentcolorname\endcsname\@@askedcolor
- %\debuggerinfo{\m!colors}
+ %\debuggerinfo\m!colors
% {start \@@askedcolor\space at level \the\colorlevel}%
\ifx\@@askedcolor\empty
- \global\@EA\let\csname\@@currentcolorname\endcsname\currentcolor
+ \global\@EA\let\csname\@@currentcolorname\endcsname\@@currentcolor
\global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \else\ifx\@@askedcolor\currentcolor
+ \else\ifx\@@askedcolor\@@currentcolor
\global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
\else
\doifcolorelse\@@askedcolor
@@ -968,35 +1463,43 @@
\def\dodoglobalstopcolor
{\ifcase\colorlevel \else
\donoglobalstopcolor
- \global\@EA\let\@EA\previouscolor\csname\@@currentcolorname\endcsname
+ \global\@EA\let\@EA\@@previouscolor\csname\@@currentcolorname\endcsname
\ifcase\colorlevel\relax
- \docolormark\empty
- \dostoptransparency
- \dostopcolormode
- \else % let's do a bit redundant testing here
- \docolormark\previouscolor
- \ifx\previouscolor\empty
- \dostoptransparency
+ \ifpermitcolormode
+ \docolormark\empty
+ \conditionalstoptransparency
\dostopcolormode
+ \fi
+ \else % let's do a bit redundant testing here
+ \docolormark\@@previouscolor
+ \ifx\@@previouscolor\empty
+ \ifpermitcolormode
+ \conditionalstoptransparency
+ \dostopcolormode
+ \fi
\else
- \doifcolorelse\previouscolor
- {\ifx\currentcolor\previouscolor\else
+ \doifcolorelse\@@previouscolor
+ {\ifx\@@currentcolor\@@previouscolor\else
% alternatively we could let \startcolormode handle this
- \dostoptransparency % really needed
- % \dostopcolormode % less safe but more efficient
- \startcolormode\previouscolor
+ \ifpermitcolormode
+ \conditionalstoptransparency % really needed
+ % more safe but less efficient: \dostopcolormode
+ \fi
+ \startcolormode\@@previouscolor
\fi}
- {\dostoptransparency
- \dostopcolormode}%
+ {\ifpermitcolormode
+ \conditionalstoptransparency
+ \dostopcolormode
+ \fi}%
\fi
\fi
\fi}
\def\donoglobalstopcolor
{\ifcase\colorlevel \else
- \global\@EA\let\@EA\currentcolor\csname\@@currentcolorname\endcsname
+ \global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
%\debuggerinfo{\m!colors}
- % {stop \currentcolor\normalspace at level \the\colorlevel}%
+ % {stop \@@currentcolor\normalspace at level \the\colorlevel}%
\global\advance\colorlevel \@@colorminus
\fi}
@@ -1068,14 +1571,14 @@
%D the colors temporary have to be reset. After the page is
%D shipped out, we have to revive the current color.
%D
-%D We use \type{\marks} to keep track of colors across page
+%D We use \type{\mark}s to keep track of colors across page
%D boundaries. Unfortunately standard \TEX\ supports only one mark,
%D and using this one for color support only would be a waste.
%D We therefore use an adapted version of J.~Fox's multiple mark
%D mechanism as (re|)|implemented in \module{supp-mrk}.
-\doifdefinedelse{newmark}
- {\newmark\colormark}
+\doifdefinedelse{rawnewmark}
+ {\rawnewmark\colormark}
{\let\colormark\gobbleoneargument}
%D Using this mark mechanism with lots of colors has one
@@ -1107,7 +1610,7 @@
{\edef\newcolormark{#1}%
\ifx\newcolormark\lastcolormark\else
\global\let\lastcolormark\newcolormark
- \@EA\setmark\@EA\colormark\@EA{\lastcolormark}%
+ \@EA\rawsetmark\@EA\colormark\@EA{\lastcolormark}%
\fi}
%D \macros
@@ -1117,21 +1620,35 @@
%D to resetting the color to black, while popping restores the
%D color state to that of before the break.
-\def\topofpagecolor{\getbotmark\colormark} % see postponing
+\def\topofpagecolor{\rawgetbotmark\colormark} % see postponing
\def\pushcolor
{\stopcolormode}
\def\popcolor
- {\doifsomething{\getbotmark\colormark}
- {%\debuggerinfo{\m!colors}{popping \getbotmark\colormark}%
- \startcolormode{\getbotmark\colormark}}}
+ {\doifsomething{\rawgetbotmark\colormark}
+ {%\debuggerinfo\m!colors{popping \getbotmark\colormark}%
+ \startcolormode{\rawgetbotmark\colormark}}}
-\def\popsplitcolor%
+\def\popsplitcolor
{\getsplitmarks\colormark % hier wel
- \doifsomething{\getsplitbotmark\colormark}
- {%\debuggerinfo{\m!colors}{split popping \getsplitbotmark\colormark}%
- \startcolormode{\getsplitbotmark\colormark}}}
+ \doifsomething{\rawgetsplitbotmark\colormark}
+ {%\debuggerinfo\m!colors{split popping \getsplitbotmark\colormark}%
+ \startcolormode{\rawgetsplitbotmark\colormark}}}
+
+% Private macro: only needed in test cases (like multiple
+% seprations in one file); no user command!
+
+\def\resynccolor
+ {\ifdim\pagetotal=\zeropoint
+ \popcolor
+ \else\ifx\@@currentcolor\empty
+ \ifx\maintextcolor\empty\else
+ \startcolormode\maintextcolor
+ \fi
+ \else
+ \startcolormode\@@currentcolor
+ \fi\fi}
%D \macros
%D {startcolorpage, stopcolorpage}
@@ -1143,16 +1660,20 @@
%D easy. It also supports nested colors in page backgrounds
%D and texts.
-\def\startcolorpage%
+\def\startcolorpage
{\bgroup
\let\@@colorplus \minusone
\let\@@colorminus\plusone
\let\docolormark\gobbleoneargument
\edef\savedcolorlevel{\the\colorlevel}%
\global\colorlevel\zerocount % before \localstartcolor of
- \localstartcolor[black]} % course, ugly bug removed
+ \ifx\maintextcolor\empty % course, ugly bug removed
+ \localstartcolor[\defaulttextcolor]%
+ \else
+ \localstartcolor[\maintextcolor]%
+ \fi}
-\def\stopcolorpage%
+\def\stopcolorpage
{\localstopcolor
\global\colorlevel\savedcolorlevel
\egroup}
@@ -1173,6 +1694,8 @@
{\groupedcommand
{\startcolor[#1]}\stopcolor}
+\let\switchtocolor\color
+
\unexpanded\def\graycolor[#1]% not \gray because this is a color
{\groupedcommand
{\RGBsupportedfalse\CMYKsupportedfalse\startcolor[#1]}\stopcolor}
@@ -1258,6 +1781,9 @@
\def\doformatgrayS#1:#2:#3\od
{\dodoformatcolor{#1}}
+\def\doformatgrayP#1:#2:#3:#4\od
+ {\dowithcolor\doformatcolor{#1}}
+
\def\doformatgray#1:%
{\getvalue{doformatgray#1}}
@@ -1278,7 +1804,7 @@
\def\localstartraster[#1]%
{\doifelsenothing{#1}
- {\dostartgraymode{\@@rsraster}}
+ {\dostartgraymode\@@rsraster}
{\dostartgraymode{#1}}}
\def\localstopraster
@@ -1352,21 +1878,22 @@
%D This saves us some typing in for instance the modules that
%D deal with pretty verbatim typesetting.
-\def\definepalet%
+\def\definepalet
{\dodoubleargument\dodefinepalet}
\def\dodefinepalet[#1][#2]%
{\doifassignmentelse{#2}
- {\setvalue{\??pa#1}{}%
+ {\showmessage\m!colors6{#1}%
+ \letvalue{\??pa#1}\empty
\setevalue{\??pa\??pa#1}{#2}%
- \showmessage{\m!colors}{6}{#1}%
\def\dodododefinepalet[##1=##2]%
{\doifvaluesomething{\??pa#1}
{\setevalue{\??pa#1}{\getvalue{\??pa#1},}}%
\setevalue{\??pa#1}{\getvalue{\??pa#1}##1}%
\doifdefinedelse{\??cr##2}
- {\setevalue{\??cr#1:##1}{\getvalue{\??cr##2}}}
- {\setevalue{\??cr#1:##1}{S:0:0:0}}}%
+ {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi
+ {\??cr#1:##1}{\getvalue{\??cr##2}}}
+ {\letvalue{\??cr#1:##1}\colorXpattern}}%
\def\dododefinepalet##1%
{\dodododefinepalet[##1]}%
\processcommalist[#2]\dododefinepalet}
@@ -1440,7 +1967,7 @@
%D defining each color separate, it also loads faster and takes
%D less bytes.
-\def\definecolorgroup%
+\def\definecolorgroup
{\dotripleempty\dodefinecolorgroup}
\def\dodefinecolorgroup[#1][#2][#3]%
@@ -1450,11 +1977,12 @@
[ \v!cmyk=>\edef\currentcolorspace{C},
\v!rgb=>\edef\currentcolorspace{R},
\v!gray=>\edef\currentcolorspace{S},
+ \v!spot=>\edef\currentcolorspace{P},
\v!s=>\edef\currentcolorspace{S},
\s!unknown=>\edef\currentcolorspace{R}]%
- \colorcount=0
+ \colorcount\zerocount
\def\dododefinecolorgroup##1%
- {\advance\colorcount 1
+ {\advance\colorcount \plusone
\setevalue{\??cr#1:\the\colorcount}{\currentcolorspace:##1:0:0}}%
\processcommalist[#3]\dododefinecolorgroup
\else
@@ -1589,7 +2117,7 @@
\fetchruntimecommand \showcolor {\f!colorprefix\s!run}
%D \macros
-%D {negativecolorbox}
+%D {negatecolorcomponent, negativecolorbox}
%D
%D Sometimes, especially when we deal with typesetting
%D devices, we want to reverse the color scheme. Instead of
@@ -1602,8 +2130,13 @@
%D
%D will negate the colors in box zero.
+\def\negatecolorcomponent#1% #1 = \macro
+ {\scratchdimen\!!onepoint\advance\scratchdimen-#1\s!pt
+ \ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
+ \edef#1{\@EA\withoutpt\the\scratchdimen}}
+
\def\negatecolorbox#1%
- {\setbox#1=\hbox
+ {\setbox#1\hbox
{\dostartnegative
\localstartcolor[white]%
\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1%
@@ -1612,7 +2145,7 @@
\box#1\dostopnegative}}
%D \macros
-%D {ifMPgraphics, ifMPcmyk, MPcolor}
+%D {ifMPgraphics, ifMPcmykcolors, MPcolor}
%D
%D A very special macro is \type{\MPcolor}. This one can be
%D used to pass a \CONTEXT\ color to \METAPOST.
@@ -1626,81 +2159,97 @@
%D {MPcmyk}, only \kap{RGB} colors and gray scales are
%D supported.
-\newif\ifMPcmyk % \MPcmykfalse
+\newif\ifMPcmykcolors % \MPcmykcolorsfalse
+\newif\ifMPspotcolors % \MPspotcolorsfalse
\beginTEX
-\def\MPcolor#1%
+\def\scaledMPcolor#1#2%
{\ifMPgraphics
- \@EA\@EA\@EA\doMPcolor
+ \handlecolorwith\doMPcolor
\csname\??cr\@EA
- \ifx\csname\??cr\currentpalet#1\endcsname\relax\else\currentpalet\fi
- #1\endcsname
- :::::::\end
+ \ifx\csname\??cr\currentpalet#2\endcsname\relax\else\currentpalet\fi
+ #2\endcsname
+ :::::::\end#1\end
\else
- #1%
+ #2%
\fi}
\endTEX
\beginETEX \ifcsname
-\def\MPcolor#1%
+\def\scaledMPcolor#1#2%
{\ifMPgraphics
- \@EA\@EA\@EA\doMPcolor
+ \handlecolorwith\doMPcolor
\csname\??cr
- \ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi
- #1\endcsname
- :::::::\end
+ \ifcsname\??cr\currentpalet#2\endcsname\currentpalet\fi
+ #2\endcsname
+ :::::::\end#1\end
\else
- #1%
+ #2%
\fi}
\endETEX
+\def\MPcolor{\scaledMPcolor1}
+
%D Before we had transparancy available, the following
%D conversion macro was available:
%D
%D \starttypen
%D \def\doMPcolor#1:#2:#3:#4:#5:#6:#7:#8\end
%D {\if #1R(#2,#3,#4)%
-%D \else\if#1C\ifMPcmyk cmyk(#2,#3,#4,#5)\else(1-#2-#5,1-#3-#5,1-#4-#5)\fi
+%D \else\if#1C\ifMPcmykcolors cmyk(#2,#3,#4,#5)\else(1-#2-#5,1-#3-#5,1-#4-#5)\fi
%D \else\if#1S(#2,#2,#2)%
%D \else (0,0,0)%
%D \fi\fi\fi}
%D \stoptypen
%D
%D In order to be useful, this macro is to be fully
-%D expandabele. The next alternative also handles transparant
-%D colors. We could have packaged everything in one macro, but
-%D splitting it up is not only more readable, but also faster
-%D (because less arguments have to be skipped)
-
-\def\doMPcolor#1:%
- {\if#1R%
- \@EA\doMPrgb
- \else\if#1C\ifMPcmyk
- \@EA\@EAEAEA\@EA\doMPcmykY
- \else
- \@EA\@EAEAEA\@EA\doMPcmykN
- \fi\else\if#1S%
- \@EA\@EAEAEA\@EA\doMPgray
- \else
- \@EA\@EAEAEA\@EA\doMPblack
- \fi\fi\fi}
-
-\def\transparentMP{transparent}
-\def\cmykspecialMP{cmyk}
+%D expandabele.
+
+\def\doMPcolor#1:% #1 can be \relax ! ! ! i.e. an empty color
+ {\csname
+ MPc\@EA\ifx\csname MPc\string#1\endcsname\relax B\else#1\fi
+ \endcsname}
+
+\def\MPcR{\doMPrgb}
+\def\MPcC{\ifMPcmykcolors\@EA\doMPcmykY\else\@EA\doMPcmykN\fi}
+\def\MPcS{\doMPgray}
+\def\MPcP{\ifMPspotcolors\@EA\doMPspotY\else\@EA\doMPspotN\fi}
+\def\MPcB{\doMPblack}
+
+\def\transparentMP {transparent}
+\def\cmykMP {scaledcmyk}
+\def\cmykASrgbMP {scaledcmykasrgb} % not really needed any more
+\def\rgbMP {scaledrgb}
+\def\grayMP {scaledgray}
+\def\processMP {spotcolor}
\def\doMPtransparent#1#2:#3:#4\end
{\ifcase#2\space(#1)\else\transparentMP(#2,#3,(#1))\fi}
-\def\doMPgray #1:{\doMPtransparent{#1,#1,#1}}
-\def\doMPrgb #1:#2:#3:{\doMPtransparent{#1,#2,#3}}
-\def\doMPcmykY#1:#2:#3:#4:{\doMPtransparent{\cmykspecialMP(#1,#2,#3,#4)}}
-\def\doMPcmykN#1:#2:#3:#4:{\doMPtransparent{1-#1-#4,1-#2-#4,1-#3-#4}}
+\def\doMPgray#1:#2\end#3\end
+ {\doMPtransparent{\grayMP(#1,#3)}#2\end}
+
+\def\doMPrgb#1:#2:#3:#4\end#5\end
+ {\doMPtransparent{\rgbMP(#1,#2,#3,#5)}#4\end}
+
+\def\doMPcmykY#1:#2:#3:#4:#5\end#6\end
+ {\doMPtransparent{\cmykMP(#1,#2,#3,#4,#6)}#5\end}
+
+\def\doMPcmykN#1:#2:#3:#4:#5\end#6\end
+ {\doMPtransparent{\cmykASrgbMP(#1,#2,#3,#4,#6)}#5\end}
-\def\doMPblack#1:#2:#3:#4:#5:#6:#7\end{(0,0,0)}
+\def\doMPspotY#1:#2:#3\end#4\end
+ {\doMPtransparent{\processMP("#1",#2)}#3\end}
+
+\def\doMPspotN#1:#2:#3\end#4\end
+ {\scaledMPcolor{#2}{#1}}
+
+\def\doMPblack#1\end#2\end
+ {(0,0,0)}
%D \macros
%D {PDFcolor,FDFcolor}
@@ -1708,24 +2257,37 @@
%D Similar alternatives are avaliable for \PDF:
\def\PDFcolor#1%
- {\@EA\@EA\@EA\doPDFcolor\csname\??cr#1\endcsname:::::::\end}
+ {\handlecolorwith\doPDFcolor\csname\??cr#1\endcsname:::::::\end}
\def\doPDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
{\if #1R#2 #3 #4 rg%
\else\if#1C#2 #3 #4 #5 k%
\else\if#1S#2 g%
- \else 0 g%
- \fi\fi\fi}
+ \else\if#1P#3 g% todo
+ \else 0 g%
+ \fi\fi\fi\fi}
+
+\def\PDFcolorvalue#1%
+ {\handlecolorwith\doPDFcolorvalue\csname\??cr#1\endcsname:::::::\end}
+
+\def\doPDFcolorvalue#1:#2:#3:#4:#5:#6:#7:#8\end
+ {\if #1R#2 #3 #4%
+ \else\if#1C#2 #3 #4 #5%
+ \else\if#1S#2%
+ \else\if#1P#3%
+ \else 0%
+ \fi\fi\fi\fi}
\def\FDFcolor#1%
- {\@EA\@EA\@EA\doFDFcolor\csname\??cr#1\endcsname:::::::\end}
+ {\handlecolorwith\doFDFcolor\csname\??cr#1\endcsname:::::::\end}
\def\doFDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
{[\if #1R#2 #3 #4%
\else\if#1C#2 #3 #4 #5%
\else\if#1S#2%
- \else 0%
- \fi\fi\fi]}
+ \else\if#1P#3% todo
+ \else 0%
+ \fi\fi\fi\fi]}
%D \macros
%D {everyshapebox}
@@ -1744,12 +2306,64 @@
\c!reductie=\v!nee,
\c!rgb=\v!ja,
\c!cmyk=\v!ja,
+ \c!spot=\v!ja,
\c!mp\c!cmyk=\@@clcmyk,
- \c!tekstkleur=]
+ \c!mp\c!spot=\@@clspot,
+ \c!expansie=\v!nee,
+ \c!tekstkleur=,
+ \c!splitsen=\v!nee,
+ \c!criterium=\v!alles]
\setupcolor
[\v!rgb]
+%D For the moment we keep the next downward compatibility
+%D switch, i.e.\ expanded colors. However, predefined colors
+%D and palets are no longer expanded (which is what I wanted
+%D in the first place).
+%D
+%D Well, in case we want to do color separation and use CMYK
+%D colors only, this is dangerous since unwanted remapping may
+%D take place. Especially when we redefine already defined
+%D colors in another color space (e.g. darkgreen is
+%D predefined in RGB color space, so a redefinition in CMYK
+%D coordinates before RGB mode is disabled, would give
+%D unexpected results due to the already frozen color spec.)
+%D
+%D So, from now on, colors are not frozen any more!
+
+% \appendtoks\setupcolors[\c!expansie=\v!ja]\to\everyjob
+
+%D The next macro is for instance used in figure splitting:
+
+\def\doifseparatingcolorselse
+ {\iffilterspotcolor
+ \@EA\firstoftwoarguments
+ \else\ifcase\currentcolorchannel
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
+
+\def\doifcolorchannelelse#1%
+ {\doifseparatingcolorselse
+ {\doifelsenothing{#1}
+ \secondoftwoarguments
+ {\doifelse{#1}\@@clsplitsen
+ \firstoftwoarguments
+ \secondoftwoarguments}}
+ \secondoftwoarguments}
+
+\def\resetcolorseparation
+ {\filterspotcolorfalse
+ \chardef\currentcolorchannel\zerocount}
+
+%D These can be used in selecting specific files (like
+%D figuredatabases).
+
+\def\colorchannelprefix{\doifseparatingcolorselse\@@clsplitsen\empty-}
+\def\colorchannelsuffix{-\doifseparatingcolorselse\@@clsplitsen\empty}
+
%D As we can see, color support is turned off by default.
%D Reduction of gray colors to gray scales is turned on.