summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/colorspace/colorspace.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/colorspace/colorspace.sty')
-rw-r--r--macros/latex/contrib/colorspace/colorspace.sty614
1 files changed, 614 insertions, 0 deletions
diff --git a/macros/latex/contrib/colorspace/colorspace.sty b/macros/latex/contrib/colorspace/colorspace.sty
new file mode 100644
index 0000000000..40e2948f3b
--- /dev/null
+++ b/macros/latex/contrib/colorspace/colorspace.sty
@@ -0,0 +1,614 @@
+%
+% Copyright (C) 2015-2019 Javier Bezos http://www.texnia.com
+%
+% This file may be distributed and/or modified under the conditions of
+% the MIT License. A version can be found at the end of this file.
+%
+% Repository: https://github.com/jbezos/colorspace
+%
+
+\ProvidesPackage{colorspace}[2019/03/25 v1.3 PDF color spaces]
+
+\edef\spc@savedcatcodes{%
+ \catcode`\noexpand\/=\the\catcode`\/
+ \catcode`\noexpand\&=\the\catcode`\& % & is 'other' here!
+ \catcode`\noexpand\<=\the\catcode`\<
+ \catcode`\noexpand\>=\the\catcode`\>}
+\catcode`\/=12
+\catcode`\>=12
+\catcode`\<=12
+\catcode`\&=11 % we use it in macro names
+
+% pdftex vs luatex compatibility
+
+\ifx\pdfextension\@undefined
+ \let\spc@Pageresources\pdfpageresources
+ \let\spc@Obj\pdfobj
+ \let\spc@Lastobj\pdflastobj
+ \let\spc@Colorstack\pdfcolorstack
+ \let\spc@Colorstackinit\pdfcolorstackinit
+\else
+ \edef\spc@Pageresources{\pdfvariable pageresources}
+ \protected\def\spc@Obj{\pdfextension obj }
+ \protected\def\spc@Lastobj{\numexpr\pdffeedback lastobj\relax}
+ \protected\def\spc@Colorstack{\pdfextension colorstack}
+ \def\spc@Colorstackinit{\pdffeedback colorstackinit}
+\fi
+
+\def\spc@unknown#1#2{%
+ \@ifundefined{#1}%
+ {\PackageError{colorspace}{Unknown #2}%
+ {You haven't defined it or perhaps you misspelled it.}}%
+ {}}
+
+\@ifundefined{XC@sdef}{\RequirePackage{xcolor}}{}
+
+\long\def\spc@afterfi#1\fi{\fi#1}
+% Trim spaces in strings and normalize to single spaces
+\def\spc@spaces#1 #2{%
+ #1\ifx\@empty#2\else\spc@afterfi\spc@spaces@i{#1}#2\fi}
+\def\spc@spaces@i#1{%
+ \ifx\\#1\\\else\space\fi\spc@spaces}
+\def\spc@dospaces#1{%
+ \edef#1{#1\space}%
+ \edef#1{\expandafter\spc@spaces#1\@empty}}
+
+% Define a pseudo-model for spot colors. We need define the following
+% 3 macros:
+
+\XC@sdef\XC@mod@&spot{&spot}
+\def\color@&spot#1#2{%
+ \ifx\spc@ir\@undefined
+ \expandafter\spc@getref\current@color\@@
+ \fi
+ \c@lor@arg{#2}%
+ \edef#1{\spc@ir\space cs \spc@ir\space CS #2 sc #2 SC}}
+\def\XC@clr@&spot@white{0}
+
+% A somewhat dirty hack for converting cmyk to spot. The internal
+% format is {}{/&Color cs /&Color CS n sc n SC}{spot}{n}, where n=1 is
+% a tint of 100%. The original CMYK values are stored in
+% \spc@ascmyk@<name>.
+
+\def\spc@cmyktospot#1#2{%
+ \begingroup
+ \def\spc@tempc##1 ##2 ##3 ##4 k##5\@@{##1 ##2 ##3 ##4}%
+ \def\xcolor@##1##2##3##4{%
+ \expandafter\protected@xdef\csname\string\color@#1\endcsname{%
+ \noexpand\xcolor@{##1}{/&#2 cs /&#2 CS 1 sc 1 SC}{&spot}{1}}%
+ \xdef\spc@tempa{\spc@tempc##2\@@}%
+ \expandafter\xdef\csname spc@ascmyk@#1\endcsname{##4}}%
+ \csname\string\color@#1\endcsname
+ \endgroup}
+
+% The internal PDF name (which is like the public one with a &
+% prepended) is available in the first argument of \xcolor@. The
+% following macros extract it.
+
+\def\spc@getir#1{%
+ \begingroup
+ \def\xcolor@##1##2##3##4{\spc@getref##2\@@}%
+ \@nameuse{#1}%
+ \endgroup}
+\def\spc@getref#1 #2\@@{\gdef\spc@ir{#1}}
+
+% We need to redefine an xcolor macro for the tint operator ! to be
+% recognized. It's done in a more modular way than xcolor:
+
+\def\spc@infl@cmyk{\let\spc@inflcommas\@empty}% 4 values=4-4 commas
+\def\spc@infl@gray{\def\spc@inflcommas{,,,}}% 1 value=4-1 commas
+\def\spc@infl@&spot{%
+ \spc@getir{\string\color@\@@nam}%
+ \def\spc@inflcommas{,,,}}%
+
+\def\XC@inflate#1#2#3#4{%
+ \def\spc@inflcommas{,}% Assume 3 values=4-3 commas
+ \@nameuse{spc@infl@\@@mod}%
+ \edef#4{#2,\spc@inflcommas#3\spc@inflcommas}}
+
+% The following macro stores all spot colors, with the LaTeX name. It
+% also stores other color spaces. Internally is an \spc@elt list.
+
+\let\spc@csall\@empty
+
+% Now the main command for defining spot colors. \spc@ir@<latex-name>
+% contains {/&Spot X 0 R}
+
+\newcommand\definespotcolor[2]{\protected@edef\spc@tempa{{#1}{#2}}\spc@defsc}
+\newcommand\spc@defsc[2][cmyk]{\expandafter\spc@defsc@i\spc@tempa{#1}{#2}}
+
+\def\spc@splitbar#1#2#3/#4\@nil{%
+ \def#1{#3}%
+ \def#2{#4}}
+
+\let\spc@lab@values\relax
+
+\@namedef{spc@opt@alt=lab}#1{%
+ \@expandtwoargs\in@{/}{#1}%
+ \ifin@
+ \spc@splitbar\spc@lab@values\spc@the@cmyk#1\@nil
+ \else
+ \def\spc@lab@values{#1}%
+ \def\spc@the@cmyk{0,0,0,0}% dummy
+ \fi
+ \def\spc@tempd##1,{% comma -> space
+ \ifx\@empty##1\else##1 \expandafter\spc@tempd\fi}%
+ \edef\spc@lab@values{\expandafter\spc@tempd\spc@lab@values,\@empty,}}
+
+\def\spc@defsc@i#1#2#3#4{%
+ \def\spc@tempc##1 ##2{% Converts spaces to #20
+ ##1%
+ \ifx\@empty##2\else
+ \ifx\\##1\\\string####20\else\string####20\fi
+ \spc@afterfi\spc@tempc##2%
+ \fi}%
+ \edef\spc@tempb{\spc@tempc#2 \@empty}% Apply to convert
+ \def\spc@elt##1##2{%
+ \@expandtwoargs\in@{/&\spc@tempb\space}{\@nameuse{spc@ir@##2}}%
+ \ifin@
+ \PackageError{colorspace}{Duplicated spot name `#2'}%
+ {This spot name was taken by `##2'.}%
+ \fi}
+ \spc@csall
+ \@ifundefined{spc@opt@\zap@space#3 \@empty}%
+ {\definecolor{#1}{cmyk:#3}{#4}}%
+ {\@nameuse{spc@opt@\zap@space#3 \@empty}{#4}%
+ \definecolor{#1}{cmyk}{\spc@the@cmyk}}%
+ \expandafter\spc@cmyktospot{#1}\spc@tempb % Convert cmyk > spot
+ \ifx\spc@lab@values\relax
+ \immediate\spc@Obj{[ /Separation /\spc@tempb\space
+ /DeviceCMYK << /FunctionType 2 /Domain [0 1]
+ /C0 [0 0 0 0] /C1 [\spc@tempa] /N 1 >> ]}% pdf separation
+ \else
+ \immediate\spc@Obj{[ /Separation /\spc@tempb\space
+ \spc@illum@ref << /FunctionType 2 /Domain [0 1]
+ /Range[0 100 -128 127 -128 127]
+ /C0 [100 0 0] /C1 [\spc@lab@values] /N 1 >> ]}% pdf separation
+ \global\let\spc@lab@values\relax
+ \fi
+ \expandafter\xdef\csname spc@ir@#1\endcsname{%
+ /&\spc@tempb\space\the\spc@Lastobj\space 0 R}% save ref to obj
+ \let\spc@elt\relax
+ \xdef\spc@csall{\spc@csall\spc@elt2{#1}}}
+
+% The pgf stuff *must* go before \resetpagecolorspace
+\AtBeginDocument{%
+ \ifx\spc@csall\@empty\else % ie, if spot/iccbased colors only
+ \ifx\pgf@sys@pgf@resource@list@colorspaces\@undefined\else
+ \def\spc@everycs{\pgf@sys@pgf@resource@list@colorspaces}%
+ \edef\spc@tempa{% Remove pgf "static" ColorSpace
+ \noexpand\spc@remcs\the\spc@Pageresources
+ \noexpand\spc@remcs{\pgf@sys@pdf@colrospaces@objnum}}%
+ \spc@tempa
+ \fi
+ \resetpagecolorspace
+ \fi}
+
+% Options for illuminants:
+
+\def\spc@illum@obj#1{%
+ \immediate\spc@Obj{[ /Lab
+ << /WhitePoint [#1] /Range [-128 127 -128 127] >> ]}%
+ \xdef\spc@illum@ref{\the\spc@Lastobj\space 0 R }}
+
+% 1931, 2-degree observer. c is deprecated
+
+\DeclareOption{illuminant=a}{\spc@illum@obj{1.0985 1 0.3558}}
+\DeclareOption{illuminant=c}{\spc@illum@obj{0.9807 1 1.1822}}
+\DeclareOption{illuminant=e}{\spc@illum@obj{1 1 1}}
+\DeclareOption{illuminant=d50}{\spc@illum@obj{0.9642 1 0.8251}}
+\DeclareOption{illuminant=d55}{\spc@illum@obj{0.9568 1 0.9214}}
+\DeclareOption{illuminant=d65}{\spc@illum@obj{0.9504 1 1.0888}}
+\DeclareOption{illuminant=d75}{\spc@illum@obj{0.9497 1 1.2261}}
+
+% Page color spaces. The arrays mapping the spot colors to the obj
+% refs are saved into the pdf as objects, and then we also save its
+% reference for later recovery. Well, \pdfpageresources is not
+% exactly "programmer"-friendy. We add the /ColorSpace, but if we
+% switch from a previoss one, the latter must be removed, too. This
+% is what \spc@remcs does. We also make sure a color space is
+% defined once: first we rebuild the argument without spaces and
+% then form the macro name using the order in csall, which is
+% fixed. The macro name is built with the PDF names.
+
+\let\spc@currcs\@empty
+\let\spc@cs@\@empty
+
+\let\spc@everycs\@empty
+
+\newcommand\pagecolorspace[1]{%
+ \protected@edef\spc@tempa{{#1}}%
+ \expandafter\spc@pagecs\spc@tempa}
+
+\def\spc@pagecs#1{%
+ \ifx\spc@currcs\@empty\else
+ \edef\spc@tempa{%
+ \noexpand\spc@remcs\the\spc@Pageresources
+ \noexpand\spc@remcs{\spc@currcs}}%
+ \spc@tempa
+ \fi
+ \let\spc@tempd\@empty % list with known spaces
+ \@for\spc@tempa:=#1\do{%
+ \ifx\spc@tempa\@empty\else
+ \spc@dospaces\spc@tempa
+ \spc@unknown{spc@ir@\spc@tempa}{color (space) `\spc@tempa'}%
+ \edef\spc@tempd{,\spc@tempd,\spc@tempa,}%
+ \fi}%
+ \let\spc@tempb\@empty % elements in /ColorSpace
+ \let\spc@tempc\@empty % name for macro (\..&..&) with pdf ref
+ \def\spc@elt##1##2{%
+ \@expandtwoargs\in@{,##2,}{\spc@tempd}%
+ \ifin@
+ \protected@edef\spc@tempb{%
+ \spc@tempb\@nameuse{spc@ir@##2}\space}%
+ \protected@edef\spc@tempc{%
+ \spc@tempc\@nameuse{spc@ir@##2}&}%
+ \fi}%
+ \spc@csall % Uses \spc@elt
+ \@ifundefined{spc@cs@\spc@tempc}%
+ {\immediate\spc@Obj{<< \spc@everycs\space\spc@tempb>>}%
+ \expandafter\xdef\csname spc@cs@\spc@tempc\endcsname{\the\spc@Lastobj}}%
+ {}%
+ \expandafter\let\expandafter\spc@currcs\csname spc@cs@\spc@tempc\endcsname
+ \ifx\spc@currcs\@empty\else
+ \edef\spc@tempa{\spc@Pageresources{%
+ \the\spc@Pageresources\space/ColorSpace \@nameuse{spc@cs@\spc@tempc} 0 R}}%
+ \spc@tempa
+ \fi}
+
+\newcommand\resetpagecolorspace{%
+ \def\spc@elt##1##2{\ifnum##1>1 ##2,\fi}%
+ \edef\spc@tempa{{\spc@csall}}%
+ \expandafter\pagecolorspace\spc@tempa}
+
+\def\spc@remcs#1\spc@remcs#2{%
+ \def\spc@tempc##1 /ColorSpace #2 ##2 R##3\spc@tempc{%
+ \spc@Pageresources{##1##3}}%
+ \spc@tempc#1\spc@tempc}
+
+% Support for pgf (I hope--)
+
+\def\pgfsys@color@&spot@stroke#1{%
+ \spc@getir{\string\color@pgfstrokecolor}%
+ \pgfsysprotocol@literal{\spc@ir\space CS}%
+ \pgfsysprotocol@literal{#1 SC}}
+\def\pgfsys@color@&spot@fill#1{%
+ \spc@getir{\string\color@pgffillcolor}%
+ \pgfsysprotocol@literal{\spc@ir\space cs}%
+ \pgfsysprotocol@literal{#1 sc}}
+\def\pgfsys@color@&spot#1{%
+ \pgfsys@color@&spot@stroke{#1}%
+ \pgfsys@color@&spot@fill{#1}}
+
+% ==== Mixed colors ====
+
+% xspace assumes color models have 1, 3 or 4 components. We need
+% modify a couple of macros, but we'll do it only if a 2-component
+% space is defined:
+
+\def\spc@twocomps{%
+ \let\spc@twocomps\relax
+ \gdef\XC@vec##1,##2,##3,##4,##5,##6,##7,##8,##9{%
+ \def\@@tmp{}%
+ \XC@vec@{##1}{##5}%
+ \ifx,##2,\else\XC@vec@{##2}{##6}%
+ \ifx,##3,\else\XC@vec@{##3}{##7}%
+ \ifx,##4,\else\XC@vec@{##4}{##8}%
+ \fi\fi\fi
+ \aftergroupdef##9\@@tmp}%
+ \gdef\XC@calc@##1,##2,##3,##4,##5:##6{%
+ \XC@let@Nc\@@cmd{XC@calc##6}%
+ \@@cmd{##1}\@@tmp
+ \ifx,##2,%
+ \else\@@cmd{##2}\@tempa
+ \ifx,##3,\edef\@@tmp{\@@tmp,\@tempa}%
+ \else\@@cmd{##3}\@tempb
+ \ifx,##4,\edef\@@tmp{\@@tmp,\@tempa,\@tempb}%
+ \else\@@cmd{##4}\@tempc\edef\@@tmp{\@@tmp,\@tempa,\@tempb,\@tempc}%
+ \fi\fi\fi}}
+
+% The following macros define models with 1 to 4 components. It's
+% written with the "copypaste" pattern, so it should be
+% improved. Here, the limitations of xcolor become aparent, because
+% 5 components would require "-1" commas.
+
+\def\spc@mix@i#1#2{%
+ \expandafter\XC@sdef\csname XC@mod@#1\endcsname{#1}%
+ \@namedef{color@#1}##1##2{\@nameuse{c@lor@@#1}##2\@@##1}%
+ \@namedef{c@lor@@#1}##1\@@##2{%
+ \c@lor@arg{##1}%
+ \edef##2{#2 cs #2 CS ##1 scn ##1 SCN}}%
+ \@namedef{XC@clr@#1@white}{0}%
+ \@namedef{spc@infl@#1}{\def\spc@inflcommas{,,,}}} % 1 value = 4 - 1 commas
+
+\def\spc@mix@ii#1#2{%
+ \expandafter\XC@sdef\csname XC@mod@#1\endcsname{#1}%
+ \@namedef{color@#1}##1##2{\@nameuse{c@lor@@#1}##2\@@##1}%
+ \@namedef{c@lor@@#1}##1,##2\@@##3{%
+ \c@lor@arg{##1}%
+ \c@lor@arg{##2}%
+ \edef##3{#2 cs #2 CS ##1 ##2 scn ##1 ##2 SCN}}%
+ \@namedef{XC@clr@#1@white}{0,0}%
+ \@namedef{spc@infl@#1}{\def\spc@inflcommas{,,}}} % 2 values = 4 - 2 commas
+
+\def\spc@mix@iii#1#2{%
+ \expandafter\XC@sdef\csname XC@mod@#1\endcsname{#1}%
+ \@namedef{color@#1}##1##2{\@nameuse{c@lor@@#1}##2\@@##1}%
+ \@namedef{c@lor@@#1}##1,##2,##3\@@##4{%
+ \c@lor@arg{##1}%
+ \c@lor@arg{##2}%
+ \c@lor@arg{##3}%
+ \edef##4{#2 cs #2 CS ##1 ##2 ##3 scn ##1 ##2 ##3 SCN}}%
+ \@namedef{XC@clr@#1@white}{0,0,0}%
+ \@namedef{spc@infl@#1}{\def\spc@inflcommas{,}}} % 3 values = 4 - 1 commas
+
+\def\spc@mix@iv#1#2{%
+ \expandafter\XC@sdef\csname XC@mod@#1\endcsname{#1}%
+ \@namedef{color@#1}##1##2{\@nameuse{c@lor@@#1}##2\@@##1}%
+ \@namedef{c@lor@@#1}##1,##2,##3,##4\@@##5{%
+ \c@lor@arg{##1}%
+ \c@lor@arg{##2}%
+ \c@lor@arg{##3}%
+ \c@lor@arg{##4}%
+ \edef##5{#2 cs #2 CS ##1 ##2 ##3 ##4 scn ##1 ##2 ##3 ##4 SCN}}%
+ \@namedef{XC@clr@#1@white}{0,0,0,0}%
+ \@namedef{spc@infl@#1}{\let\spc@inflcommas\@empty}} % 4 value = 4 -
+ % 0 commas
+
+% A few auxliary macros:
+
+\def\spc@nl{^^J}
+
+\def\spc@getirbase/&#1 #2\@@{#1}
+\def\spc@getirbaseC/&#1 #2\@@{#1 #2}
+
+\def\spc@writecomp#1#2{%
+ \advance\@tempcntb\@ne
+ \edef#1{#1
+ \the\numexpr\@tempcntb-\@tempcnta\relax\space
+ index -#2\space mul 1.0 add mul\spc@nl}}
+
+\def\spc@writecmykcomps#1,#2,#3,#4\@@{%
+ \spc@writecomp\spc@@cyan{#1}%
+ \spc@writecomp\spc@@magenta{#2}%
+ \spc@writecomp\spc@@yellow{#3}%
+ \spc@writecomp\spc@@black{#4}}
+
+% And the main macro:
+
+\newif\ifspc@dflt
+
+\newcommand\definecolorspace{%
+ \@ifstar
+ {\spc@dflttrue\spc@defcs}%
+ {\spc@dfltfalse\spc@defcs}}
+
+\@onlypreamble\definecolorspace
+
+\def\spc@defcs#1#2#3{%
+ \@ifundefined{spc@defcs@#2}%
+ {\spc@unknown{spc@defcs@#2}{color space type `#2'}}%
+ {\protected@edef\spc@tempa{%
+ \expandafter\noexpand\csname spc@defcs@#2\endcsname
+ {#1}{#3}}%
+ \spc@tempa}}
+
+\def\spc@defcs@mixed#1#2{%
+ \ifspc@dflt
+ \PackageError{colorspace}{Unsupported}%
+ {`mixed' only works with the unstarred command}%
+ \fi
+ \begingroup
+ % the process part of the tint transform:
+ \def\spc@@Pcyan{1.0\spc@nl}\def\spc@@Pmagenta{1.0\spc@nl}%
+ \def\spc@@Pyellow{1.0\spc@nl}\def\spc@@Pblack{1.0\spc@nl}%
+ % the spot part:
+ \let\spc@@cyan\@empty\let\spc@@magenta\@empty
+ \let\spc@@yellow\@empty\let\spc@@black\@empty
+ % position on stack
+ \edef\spc@@poscyan{0}\edef\spc@@posmagenta{1}%
+ \edef\spc@@posyellow{2}\edef\spc@@posblack{3}%
+ \@tempcntb\z@ % Number of colors
+ \let\spc@pdfdoms\@empty % stores /Domain
+ \let\spc@@pops\@empty
+ \@for\spc@tempa:=#2\do{%
+ \advance\@tempcntb\@ne % Count colors
+ \edef\spc@@pops{\spc@@pops\space pop}%
+ \edef\spc@pdfdoms{\spc@pdfdoms0 1 }}%
+ \ifcase\@tempcntb\or1\or\spc@twocomps\or\or\else
+ \PackageError{colorspace}{Too many inks}%
+ {Currently, only up to 4 components are supported}%
+ \fi
+ \@tempcnta\z@ % position on stack
+ \let\spc@pdfdevn\@empty % stores names for /DeviceN
+ \let\spc@pdfclrnts\@empty % stores /Colorants
+ \let\spc@name\@empty % stores name for page /ColorSpace
+ \def\spc@ir@cyan{Cyan}\def\spc@ir@magenta{Magenta}%
+ \def\spc@ir@yellow{Yellow}\def\spc@ir@black{Black}%
+ \@for\spc@tempa:=#2\do{%
+ \spc@dospaces\spc@tempa
+ \advance\@tempcnta\@ne
+ \edef\spc@ir{\csname spc@ir@\spc@tempa\endcsname}%
+ \@expandtwoargs\in@{,\spc@tempa,}{,cyan,magenta,yellow,black,}%
+ \ifin@
+ \edef\spc@pdfdevn{\spc@pdfdevn\space/\spc@ir}%
+ \edef\spc@name{\spc@name &\spc@ir}%
+ \expandafter
+ \edef\csname spc@@P\spc@tempa\endcsname{%
+ \the\numexpr\@tempcntb+\@nameuse{spc@@pos\spc@tempa}%
+ -\@tempcnta\relax\space
+ index neg 1.0 add\spc@nl}% ==========
+ \else
+ \@ifundefined{spc@ascmyk@\spc@tempa}%
+ {\spc@unknown{spc@ascmyk@\spc@tempa}{spot color
+ `\spc@tempa'}}%
+ {}%
+ \edef\spc@pdfdevn{\spc@pdfdevn\space
+ /\expandafter\spc@getirbase\spc@ir\@@}%
+ \edef\spc@pdfclrnts{\spc@pdfclrnts\space
+ /\expandafter\spc@getirbaseC\spc@ir\@@}%
+ \edef\spc@name{\spc@name
+ &\expandafter\spc@getirbase\spc@ir\@@}%
+ \expandafter\expandafter\expandafter\spc@writecmykcomps
+ \csname spc@ascmyk@\spc@tempa\endcsname\@@
+ \advance\@tempcntb-4\relax
+ \fi}%
+ \immediate\spc@Obj stream attr
+ {/FunctionType 4
+ /Domain [ \spc@pdfdoms]
+ /Range [ 0 1 0 1 0 1 0 1 ]}%
+ {\string{\space
+ \spc@@Pcyan\spc@@cyan neg 1.0 add\spc@nl
+ \spc@@Pmagenta\spc@@magenta neg 1.0 add\spc@nl
+ \spc@@Pyellow\spc@@yellow neg 1.0 add\spc@nl
+ \spc@@Pblack\spc@@black neg 1.0 add\spc@nl
+ \the\numexpr4+\@tempcntb\relax\space 4 roll\spc@@pops
+ \space\string}}%
+ \immediate\spc@Obj{[ /DeviceN [\spc@pdfdevn\space] /DeviceCMYK
+ \the\spc@Lastobj\space0 R
+ << /Colorants <<\spc@pdfclrnts\space >> >> ]}%
+ \expandafter\xdef\csname spc@ir@#1\endcsname{%
+ /\spc@name\space\the\spc@Lastobj\space 0 R}% save ref to obj
+ \let\spc@elt\relax
+ \xdef\spc@csall{\spc@csall\spc@elt2{#1}}%
+ \xdef\spc@tempa{%
+ \expandafter\noexpand
+ \csname spc@mix@\romannumeral\@tempcntb\endcsname
+ {#1}{/\spc@name}}%
+ \endgroup
+ \spc@tempa}
+
+% === ICC based default spaces ===
+
+% luatex removed pdffiledump, so we use lua code.
+
+\def\spc@defcs@iccbased#1#2{%
+ \ifspc@dflt\else
+ \PackageError{colorspace}{Unsupported}%
+ {`iccbased' only works with the starred command}%
+ \fi
+ \begingroup
+ % hex equivalents (which is the filedump format) and literal
+ % (which is the lua format)
+ \@namedef{spc@@47524159}{0}\@namedef{spc@@GRAY}{0}%
+ \@namedef{spc@@52474220}{1}\@namedef{spc@@RGB }{1}%
+ \@namedef{spc@@434D594B}{2}\@namedef{spc@@CMYK}{2}%
+ \def\spc@@space{\ifcase\spc@tempa Gray\or RGB\or CMYK\fi}%
+ \def\spc@@spacelc{\ifcase\spc@tempa gray\or rgb\or cmyk\fi}%
+ % read the icc file and extract the space it applies to
+ \ifx\pdffiledump\@undefined
+ \directlua{
+ local icc = io.open([[#2]], "r")
+ if icc then
+ icc:seek("set", 16)
+ tex.print([[\noexpand\csname @namedef\endcsname{spc@tempa}{]]
+ .. icc:read(4) .. [[}]])
+ end}%
+ \else
+ \edef\spc@tempa{\pdffiledump offset 16 length 4 {#2}}%
+ \fi
+ \@ifundefined{spc@@\spc@tempa}%
+ {\PackageError{colorspace}{Unsupported ICC space}%
+ {Currently, only Gray, RGB and CMYK are supported}}%
+ {\edef\spc@tempa{\@nameuse{spc@@\spc@tempa}}}%
+ \immediate\spc@Obj
+ stream attr {\ifcase\spc@tempa
+ /N 1 /Alternate /DeviceGray\or
+ /N 3 /Alternate /DeviceRGB\or
+ /N 4 /Alternate /DeviceCMYK\fi}%
+ file {#2}%
+ \immediate\spc@Obj{[ /ICCBased \the\spc@Lastobj\space 0 R ]}%
+ % to the default color list, add an intermediate name *<model>
+ % (only once) containing the last setting (add also the
+ % actual name with flag 1 instead of 2)
+ \let\spc@elt\relax
+ \@ifundefined{spc@ir@*\spc@@spacelc}%
+ {\xdef\spc@csall{\spc@csall\spc@elt2{*\spc@@spacelc}}}%
+ {} % -- do nothing
+ \expandafter\xdef\csname spc@ir@*\spc@@spacelc\endcsname{%
+ /Default\spc@@space\space\the\spc@Lastobj\space 0 R}%
+ \xdef\spc@csall{\spc@csall\spc@elt1{#1}}%
+ \expandafter\xdef\csname spc@ir@#1\endcsname{%
+ /Default\spc@@space\space\the\spc@Lastobj\space 0 R}%
+ \endgroup}
+
+% ==== Overprint/Knokout ====
+
+\DeclareOption{overprint}{\def\spc@op{1}}
+\DeclareOption{opm=0}{\def\spc@op{0}\def\spc@opm{0}}
+\DeclareOption{opm=1}{}
+\DeclareOption{knockout}{\def\spc@op{2}} % After opm!
+\def\spc@opm{1}
+\ProcessOptions\relax
+
+\ifx\spc@op\@undefined
+ \spc@savedcatcodes
+\endinput\fi % One line!
+
+\def\spc@op@no{2}
+\@namedef{spc@op@1}{1}
+\@namedef{spc@op@0}{0}
+
+\newcommand\overprintstate[1]{%
+ \spc@unknown{spc@op@#1}{overprint state `#1'}%
+ \ifnum\csname spc@op@#1\endcsname=\spc@op\else
+ \expandafter\let\expandafter\spc@op\csname spc@op@#1\endcsname
+ \spc@setop
+ \fi}
+
+\newcommand\textoverprint[2][\spc@opm]{{\overprintstate{#1}#2}}
+
+\immediate\spc@Obj{<< /Type /ExtGState /op false /OP false >>}%
+\edef\spc@tempa{/SPCko \the\spc@Lastobj\space 0 R }%
+\immediate\spc@Obj{<< /Type /ExtGState /op true /OP true /OPM 0 >>}%
+\edef\spc@tempa{\spc@tempa/SPCmz \the\spc@Lastobj\space 0 R }%
+\immediate\spc@Obj{<< /Type /ExtGState /op true /OP true /OPM 1 >>}%
+\edef\spc@tempa{\spc@tempa/SPCop \the\spc@Lastobj\space 0 R }%
+\immediate\spc@Obj{<< \spc@tempa>>}%
+\edef\spc@op@saveobj{\the\spc@Lastobj}
+
+\AtBeginDocument{%
+ \edef\spc@tempa{\global\spc@Pageresources{\the\spc@Pageresources
+ \space /ExtGState \spc@op@saveobj\space 0 R }}%
+ \spc@tempa}
+
+\def\spc@setop{%
+ \spc@Colorstack\spc@opstack push{\spc@getop}%
+ \aftergroup\spc@resetop}
+\def\spc@resetop{\spc@Colorstack\spc@opstack pop\relax}
+\def\spc@getop{%
+ \ifcase\spc@op
+ /SPCmz gs
+ \or
+ /SPCop gs
+ \or
+ /SPCko gs
+ \fi}
+
+\chardef\spc@opstack\spc@Colorstackinit page direct{\spc@getop}
+
+\spc@savedcatcodes
+
+\endinput
+
+MIT License
+-----------
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.