%D \module
%D   [       file=prop-mis,
%D        version=2004.05.29, % some code moved from private modules
%D          title=\CONTEXT\ Property Macros,
%D       subtitle=Miscelaneous,
%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.

\writestatus{loading}{Context Property Macros / initialization}

%D This module contains some code that has been in use in some
%D private modules (p-*). These features depend on the fact
%D that pdftex writes the page content as one stream.

%D EXPERIMENTAL

\unprotect

%D Stream based overprint and knockout:

\defineproperty[\v!overprint][\s!overprint] [\c!method=\v!command]
\defineproperty[\v!knockout] [\s!overprint] [\c!method=\v!command]

\definepropertyhandler \v!overprint {\dostartoverprint}
\definepropertyhandler \v!knockout  {\dostopoverprint }

\def\startoverprintproperty
  {\ifincolor
     \propertyhandler\currentproperty
     \dooverprintmark\currentproperty
   \fi}

\def\stopoverprintproperty
  {\ifincolor
     \ifcase\currentpropertylevel\or
       \dostopoverprint
       \dooverprintmark\empty
     \else
       \propertyhandler\previousproperty
       \dooverprintmark\previousproperty
     \fi
   \fi}

\rawnewmark\overprintmark

\def\dooverprintmark#1%
  {\ifinpagebody \else \ifinframed \else
     \expanded{\rawsetmark\noexpand\overprintmark{#1}}%
   \fi \fi}

\def\pushoverprintproperty
  {\doifsomething{\rawgetbotmark\overprintmark}\dostopoverprint}

\def\popoverprintproperty
  {\doifsomething{\rawgetbotmark\overprintmark}%
     {\propertyhandler{\rawgetbotmark\overprintmark}}}

\def\popsplitoverprintproperty
  {\getsplitmarks\overprintmark  % hier wel
   \doifsomething{\rawgetsplitbotmark\overprintmark}%
     {\propertyhandler{\rawgetsplitbotmark\overprintmark}}}

\appendtoks \pushoverprintproperty     \to \everypushproperties
\appendtoks \popoverprintproperty      \to \everypopproperties
\appendtoks \popsplitoverprintproperty \to \everypopsplitproperties

%D Negation.

\defineproperty [\v!negative] [\s!negative] [\c!method=\v!command]
\defineproperty [\v!positive] [\s!negative] [\c!method=\v!command]

\definepropertyhandler \v!negative {\dostartnegative}
\definepropertyhandler \v!positive {\dostopnegative }

\def\startnegativeproperty
  {\ifincolor
     \propertyhandler\currentproperty
     \donegativemark\currentproperty
   \fi}

\def\stopnegativeproperty
  {\ifincolor
     \ifcase\currentpropertylevel\or
       \dostopnegative
       \donegativemark\empty
     \else
       \propertyhandler\previousproperty
       \donegativemark\previousproperty
     \fi
   \fi}

\rawnewmark\negativemark

\def\donegativemark#1%
  {\ifinpagebody \else \ifinframed \else
     \expanded{\rawsetmark\noexpand\negativemark{#1}}%
   \fi \fi}

\def\pushnegativeproperty
  {\doifsomething{\rawgetbotmark\negativemark}\dostopnegative}

\def\popnegativeproperty
  {\doifsomething{\rawgetbotmark\overprintmark}%
     {\propertyhandler{\rawgetbotmark\negativemark}}}

\def\popsplitnegativeproperty
  {\getsplitmarks\negativemark  % hier wel
   \doifsomething{\rawgetsplitbotmark\negativemark}%
     {\propertyhandler{\rawgetsplitbotmark\negativemark}}}

\appendtoks \pushnegativeproperty     \to \everypushproperties
\appendtoks \popnegativeproperty      \to \everypopproperties
\appendtoks \popsplitnegativeproperty \to \everypopsplitproperties

%D Special font effects.

\setupproperty
  [\s!effect]
  [\c!rulethickness=.25pt,
   \c!stretch=1]

\defineproperty [\v!inner]  [\s!effect]
\defineproperty [\v!outer]  [\s!effect]
\defineproperty [\v!both]   [\s!effect]
\defineproperty [\v!normal] [\s!effect]
\defineproperty [\v!hidden] [\s!effect]

\definepropertyhandler \v!normal {0}
\definepropertyhandler \v!inner  {0}
\definepropertyhandler \v!outer  {1}
\definepropertyhandler \v!both   {2}
\definepropertyhandler \v!hidden {3}

% \def\handleeffectproperty#1%
%   {\expanded{\dostartfonteffect
%      {\propertyhandler{#1}}%
%      {\propertyparameter{#1}\c!lijndikte}%
%      {\propertyparameter{#1}\c!rek}}}

% \def\starteffectproperty
%   {\handleeffectproperty\currentproperty
%    \doeffectmark\currentproperty}

% \def\stopeffectproperty
%   {\dostopfonteffect
%    \ifcase\currentpropertylevel\or
%      \doeffectmark\empty
%    \else
%      \handleeffectproperty\previousproperty
%      \doeffectmark\previousproperty
%    \fi}

% \rawnewmark\effectmark

% \def\doeffectmark#1%
%   {\ifinpagebody \else \ifinframed \else
%      \expanded{\rawsetmark\noexpand\effectmark{#1}}% could be number
%    \fi \fi}

% \def\pusheffectproperty
%   {\doifsomething{\rawgetbotmark\effectmark}\dostopfonteffect}

% \def\popeffectproperty
%   {\doifsomething{\rawgetbotmark\effectmark}%
%      {\handleeffectproperty{\rawgetbotmark\effectmark}}}

% \def\popspliteffectproperty
%   {\getsplitmarks\effectmark
%    \doifsomething{\rawgetsplitbotmark\effectmark}%
%      {\handleeffectproperty{\rawgetsplitbotmark\effectmark}}}

% \appendtoks \pusheffectproperty     \to \everypushproperties
% \appendtoks \popeffectproperty      \to \everypopproperties
% \appendtoks \popspliteffectproperty \to \everypopsplitproperties

% %

\def\effectpropertydata#1%
  {{\propertyhandler{#1}}%
   {\propertyparameter{#1}\c!rulethickness}%
   {\propertyparameter{#1}\c!stretch}}

\def\starteffectproperty
  {\expanded{\dostartfonteffect\effectpropertydata\currentproperty}%
   \doeffectmark{\effectpropertydata\currentproperty}}

\def\stopeffectproperty
  {\dostopfonteffect
   \ifcase\currentpropertylevel\or
     \doeffectmark\empty
   \else
     \expanded{\dostartfonteffect\effectpropertydata\previousproperty}%
     \doeffectmark{\effectpropertydata\previousproperty}%
   \fi}

\rawnewmark\effectmark

\def\doeffectmark#1%
  {\ifinpagebody \else \ifinframed \else
     \expanded{\rawsetmark\noexpand\effectmark{#1}}% could be number
   \fi \fi}

\def\pusheffectproperty
  {\doifsomething{\rawgetbotmark\effectmark}\dostopfonteffect}

\def\popeffectproperty
  {\doifsomething{\rawgetbotmark\effectmark}%
     {\expanded{\dostartfonteffect\rawgetbotmark\effectmark}}}

\def\popspliteffectproperty
  {\getsplitmarks\effectmark
   \doifsomething{\rawgetsplitbotmark\effectmark}%
     {\expanded{\dostartfonteffect\rawgetsplitbotmark\effectmark}}}

\appendtoks \pusheffectproperty     \to \everypushproperties
\appendtoks \popeffectproperty      \to \everypopproperties
\appendtoks \popspliteffectproperty \to \everypopsplitproperties

\protect \endinput
