%D \module
%D   [       file=m-visual,
%D        version=2000.01.10,
%D          title=\CONTEXT\ Extra Modules,
%D       subtitle=Visualization and Faking,
%D         author={Hans Hagen \& Ton Otten},
%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.

\unprotect

%D This module collect a few more visual debugger features. I
%D needed them for manuals and styles. The macros are documented
%D in a my way document.

\definecolor[fakerulecolor]     [black]
\definecolor[fakebaselinecolor] [green]
\definecolor[fakeparindentcolor][blue]

\newif\iffakebaseline \fakebaselinetrue

\def\fakerule#1%
  {\strut
%    \startcolor[fakerulecolor]%
   \iffakebaseline
     \vrule\!!height1.25ex\!!depth-.05ex\!!width#1%
     \kern-#1%
     \vrule\!!height-.05ex\!!depth .25ex\!!width#1%
   \else
     \vrule\!!height1.25ex\!!depth .25ex\!!width#1%
   \fi
   \stopcolor
   \allowbreak}

% can be used in hbox, so %'s are really needed

\unexpanded\def\fakelines#1#2% min max / 3 10
  {\fakeparindent
   \scratchdimen\hsize
   \ifindentation
     \advance\scratchdimen -\parindent
   \fi
   \fakerule\scratchdimen\break
   \getrandomcount\scratchcounter{\ifcase0#1 3\else#1\fi}{\ifcase0#2 10\else#2\fi}%
   \dorecurse\scratchcounter{\fakerule\hsize}%
   \getrandomdimen\scratchdimen{.25\hsize}\hsize
   \fakerule\scratchdimen
   \par} % indeed

\unexpanded\def\fakewords
  {\ifvmode\fakeparindent\fi\onlyfakewords}

\definepalet
  [fakerule]
  [fr1c=darkred,
   fr2c=darkgreen,
   fr3c=darkblue,
   fr4c=darkyellow,
   fr5c=darkgray]

\unexpanded\def\onlyfakewords#1#2% min max / 10 40
  {\getrandomcount\scratchcounter{\ifcase0#1 10\else#1\fi}{\ifcase0#2 40\else#2\fi}%
   \dofakewords\scratchcounter
   } % no \par

\unexpanded\def\fakenwords#1#2% words seed
  {\fakeparindent
   \getrandomseed\fakedwordseed
   \setrandomseed{\ifcase0#2 #1\else#2\fi}%
   \dofakewords{#1}%
   \setrandomseed\fakedwordseed
   } % no \par

\def\dofakewords#1%
  {\bgroup
   \dorecurse{#1}
     {\getrandomcount\scratchcounter{1}{5}%
      \dorecurse\scratchcounter
        {\getrandomdimen\scratchdimen{.5em}{1.25em}%
         \fakerule\scratchdimen}%
      \space}%
   \removeunwantedspaces
   \egroup}

\def\doshowfakewords#1%
  {\bgroup
   \setuppalet[fakerule]%
   \definecolor[fakerulecolor]%
   \dorecurse{#1}
     {\getrandomcount\scratchcounter{1}{5}%
      \dorecurse\scratchcounter
        {\getrandomdimen\scratchdimen{.5em}{1.25em}%
         \color[fr\recurselevel c]{\fakerule\scratchdimen}}%
      \space}%
   \removeunwantedspaces
   \egroup}

\def\showfakewords{\let\dofakewords\doshowfakewords}

\def\fakeword
  {\fakewords{1}{1}} % no \plusone

\def\fakeparindent
  {\noindent
   \ifindentation
     \ifx\dofakedroppedcaps\relax
       {\fakeparindentcolor
        \vrule
          \!!height \strutheight % not longer .5ex
          \!!depth  \strutdepth  % not longer 0pt
          \!!width  \parindent}%
     \else
       \dofakedroppedcaps \let\dofakedroppedcaps\relax
     \fi
%    \else
%      \dontleavehmode
   \fi}

\let\dofakedroppedcaps\relax

\unexpanded\def\fakedroppedcaps#1%
  {\ifnum#1>0
     \def\dofakedroppedcaps
       {\setbox\scratchbox\hbox
          {\setbox\scratchbox\hbox{W}%
           \scratchdimen#1\lineheight
           \advance\scratchdimen -\lineheight
           \advance\scratchdimen \dp\strutbox
           \vrule
             \!!width#1\wd\scratchbox
             \!!height\ht\scratchbox
             \!!depth\scratchdimen}%
        \ht\scratchbox\ht\strutbox
        \dp\scratchbox\dp\strutbox
        \hangindent\wd\scratchbox
        \advance\hangindent .5em
        \wd\scratchbox\hangindent
        \hangafter-#1\noindent
        \llap{\fakeparindentcolor\box\scratchbox}}%
   \fi}

\newcounter\noffakedfigures

\unexpanded\def\showfakefigure
  {\donetrue\dodoubleempty\dofakefigure}

\unexpanded\def\fakefigure
  {\donefalse\dodoubleempty\dofakefigure}

\def\dofakefigure[#1][#2]#3#4#5#6% [] [] minwidth maxwidth minheight maxheight
  {\doglobal\increment\noffakedfigures
   \ifdone
     \endgraf
     \hbox to \hsize
      {\hss\fakeparindentcolor
       \strut\bf Figure \noffakedfigures
       \doifsomething{#1}{\space(#1)}%
       \hss}
     \endgraf
   \fi
   \getvalue{\e!place\v!figure}
     [#1][#2]%
     {\freezerandomseed
      \let\endstrut\relax
      \let\begstrut\relax
      \doifinsetelse{#1}{\v!left,\v!right}
        {\fakewords{2}{4}}
        {\fakewords{4}{10}}}%
     {\getrandomdimen{\dimen0}{#3}{#4}%
      \getrandomdimen{\dimen2}{#5}{#6}%
      \doifinset{#1}{\v!left,\v!right}
        {\dimen0=.75\dimen0
         \ifdim\dimen0>.6\hsize \dimen0=.5\hsize\fi
         \ifdim\dimen0<.3\hsize \dimen0=.3\hsize\fi}%
      \framed
        [\c!width=\dimen0,
         \c!height=\dimen2,
         \c!frame=\ifincolor\v!off\else\v!on\fi,
         \c!background=\v!color,
         \c!backgroundcolor=fakeparindentcolor]
        {\bf\white#1}}%
   \defrostrandomseed}

\def\fakeformula
  {\dimen0\zeropoint
   \getrandomcount\scratchcounter{3}{6}%
   \dorecurse\scratchcounter
     {\getrandomdimen\scratchdimen{1em}{3em}%
      \mathinner{\red\fakerule\scratchdimen}%
      \ifnum\recurselevel<\scratchcounter+\fi
      \advance\scratchdimen\dimen0}%
   =\mathinner{\red\fakerule\scratchdimen}}

\def\fakespacingformula
  {\color[fakebaselinecolor]{\ruledbaseline}\fakeformula}

%D test \bodyfontgrid\space test
%D test \emexgrid    \space test

\def\smashedgrid
  {\dosingleempty\dosmashedgrid}

\def\dosmashedgrid[#1]%
  {\hsmashed
     {\setbox\scratchbox=\hbox
        {\basegrid
           [\c!nx=10,\c!ny=10,\c!dx=1,\c!dy=1,
            \c!unit=\bodyfontsize,#1]}%
      \hbox to \zeropoint
        {\hss\lower.5\ht\scratchbox\box\scratchbox\hss}%
      \hbox to \zeropoint
        {\hss
         \black\vrule\!!width6\linewidth\!!height3\linewidth\!!depth3\linewidth
         \hss}}}

\def\bodyfontgrid
  {\hbox
     {{\linewidth.1pt\yellow\smashedgrid[\c!nx=30,\c!ny=30,\c!scale=.3333]}%
      {\linewidth.2pt\green \smashedgrid[\c!nx=20,\c!ny=20,\c!scale=.5]}%
      {\linewidth.3pt\red   \smashedgrid[\c!nx=10,\c!ny=10,\c!scale=1]}}}

\def\emexgrid
  {\hbox
     {{\linewidth.15pt\green\smashedgrid[\c!nx=20,\c!ny=20,\c!unit=ex]}%
      {\linewidth.15pt\red  \smashedgrid[\c!nx=10,\c!ny=10,\c!unit=em]}}}

%D The next few macros are not really public and kind of low
%D level. They are obscure and a bit perverse.

\definecolor[llblack][s=0.01]

\def\lowlevelstream#1#2#3%
  {\ifinotr \else
     \dontleavehmode
     \prewordbreak
     \bgroup\bgroup % make sure aftergroup stuff is handled
    %\let#1#2\optimizetransparencyfalse\black
     \infofont\clap{\vl}\ignorespaces#3\unskip\clap{\vl}%
     \egroup\egroup
     \prewordbreak
   \fi
   #2{#3}}

\let\normalPDFcode\PDFcode
\let\normalspecial\special

\def\showlowlevelstream
  {\def\PDFcode{\lowlevelstream\PDFcode\normalPDFcode}%
   \def\special{\lowlevelstream\special\normalspecial}}

\def\showlowlevelstreamonly
  {\def\PDFcode{\lowlevelstream\PDFcode\gobbleoneargument}%
   \def\special{\lowlevelstream\special\gobbleoneargument}}

\let\normaldostartgraymode     \dostartgraymode
\let\normaldostartgraycolormode\dostartgraycolormode
\let\normaldostartrgbcolormode \dostartrgbcolormode
\let\normaldostartcmykcolormode\dostartcmykcolormode
\let\normaldostartspotcolormode\dostartspotcolormode

\def\traceddostartgraymode#1%
  {#1\normaldostartgraymode{#1}}

\def\traceddostartgraycolormode#1%
  {#1\normaldostartgraycolormode{#1}}

\def\traceddostartrgbcolormode#1#2#3%
  {#1 #2 #3\normaldostartrgbcolormode{#1}{#2}{#3}}

\def\traceddostartcmykcolormode#1#2#3#4%
  {#1 #2 #3 #4\normaldostartcmykcolormode{#1}{#2}{#3}{#4}}

\def\traceddostartspotcolormode#1#2%
  {#1 #2\normaldostartspotcolormode{#1}{#2}}

\def\showcolormodes
  {\let\dostartgraymode     \traceddostartgraymode
   \let\dostartgraycolormode\traceddostartgraycolormode
   \let\dostartrgbcolormode \traceddostartrgbcolormode
   \let\dostartcmykcolormode\traceddostartcmykcolormode
   \let\dostartspotcolormode\traceddostartspotcolormode}

\protect \endinput
