%D \module
%D   [       file=colo-hex,
%D        version=2004.06.23,
%D          title=\CONTEXT\ Color Macros,
%D       subtitle=Hex Colors,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\ifx\dodododefinecolor\undefined
  \beginTEX \endinput \endTEX
\else
  \endinput
\fi

\writestatus{loading}{Context Color Macros / hexadecimal}

% \edef\testcolor{\string#FFC0C0}
% \edef\testcolor{\string#55}
%
% \setupcolors[state=start]
%
% \expanded{\definecolor[thehexcolor][\hexcolorspec\testcolor]}
%
% \checkhexcolor[\testcolor]
%
% \definecolor[thehexcolor][\testcolor]
%
% \starttext
%
% test \color[thehexcolor]{rood}
% test \color[red]{rood}
% test \color[\testcolor]{rood}
%
% \stoptext

\unprotect

\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr(1pt/256)

\chardef\hexcolorprefix=`#

\def\hexcolorspec   #1{\expandafter\dohexcolorspec   #1\empty\empty\empty\empty\relax}
\def\hexcolorpattern#1{\expandafter\dohexcolorpattern#1\empty\empty\empty\empty\relax}

\ifx\dohexstringtonumber\undefined \def\dohexstringtonumber{"} \fi

\def\hexcolorcomponent#1#2%
  {\ifnum\dohexstringtonumber#1#2=\zerocount0\else\ifnum\dohexstringtonumber#1#2=\plusone1\else
     \expandafter\withoutpt\the\dimexpr(\dohexstringtonumber#1#2\hexcolorfraction)%
   \fi\fi}

\def\dohexcolorspec#1#2#3#4#5#6#7#8\relax
  {\ifx#4\empty
     s=\hexcolorcomponent#2#3%
   \else
     r=\hexcolorcomponent#2#3,g=\hexcolorcomponent#4#5,b=\hexcolorcomponent#6#7%
   \fi}

\def\dohexcolorpattern#1#2#3#4#5#6#7#8\relax
  {0\ifx#4\empty
     S:\hexcolorcomponent#2#3%
   \else
     R:\hexcolorcomponent#2#3:\hexcolorcomponent#4#5:\hexcolorcomponent#6#7%
   \fi:0:0}

\def\doifhexcolorelse#1%
  {\expandafter\dodoifhexcolorelse#10\od} % 0 is a dirty trick to catch an empty #1

\def\dodoifhexcolorelse#1#2\od
  {\ifnum`#1=\hexcolorprefix
     \expandafter\firstoftwoarguments
   \else
     \expandafter\secondoftwoarguments
   \fi}

\def\docheckhexcolor#1%
  {\doifhexcolorelse{#1}{\doifundefined{#1}{\setxvalue{\??cr#1}{\hexcolorpattern{#1}}}}\donothing}

\def\checkhexcolor[#1]%
  {\expanded{\docheckhexcolor{#1}}}

\def\colorHpattern{\@EA\hexcolorpattern\@EA{\@EA*\@@cl@@h}} % * == dummy placeholder

\let\dodododefinecolor\dododefinecolor % we will overload this one

\def\dododefinecolor#1#2#3#4[#5][#6]%
  {\doifhexcolorelse{#6}
     {\setxvalue{\??cr#5}{\hexcolorpattern{#6}}}
     {\dodododefinecolor#1#2#3#4[#5][#6]}}

%D For Adam Lindsay and his XeTeX special driver:

% because we intercept the zero condition, the .23pt in 1.23pt will disappear in the
% ifcase zero part branch

\def\colorhexcomponent#1%
  {\ifdim#1\points<.005\points
     00\else\lchexnumbers{\the\dimexpr(255\dimexpr(#1\points)\relax+.5\points)\relax}%
   \fi}

% the faster one

\newdimen\hex@color@a \hex@color@a=.005pt
\newdimen\hex@color@b \hex@color@b=.5pt
\chardef \hex@color@c             =255

\def\colorhexcomponent#1%
  {\ifdim#1\points<\hex@color@a
     00\else\lchexnumbers{\the\dimexpr(#1\points*\hex@color@c+\hex@color@b)\relax}%
   \fi}

\protect \endinput
