%D \module
%D   [       file=font-tra,
%D        version=2009.01.02, % or so
%D          title=\CONTEXT\ Font Macros,
%D       subtitle=Tracing,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%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

\writestatus{loading}{ConTeXt Font Macros / Tracing}

%D just use fontid

%D \macros
%D   {showbodyfont}
%D
%D One can call for a rather simple overview of a bodyfont and the
%D relations between its alternative fonts.
%D
%D \showsetup{showbodyfont}
%D
%D The current bodyfont (here we omitted the argument) looks like:
%D
%D \showbodyfont
%D
%D The implementation is rather straightforward in using
%D \type{\halign}.

\fetchruntimecommand \showbodyfont  \f!font_run

%D \macros
%D   {showfontstrip, testminimalbaseline, showminimalbaseline}
%D
%D The next command can come in handy when combining
%D different fonts into a collection (typeface) and
%D determining optimal baseline distances.
%D
%D \showfontstrip \blank \showminimalbaseline

\fetchruntimecommand \showfontstrip       \f!font_run
\fetchruntimecommand \testminimalbaseline \f!font_run
\fetchruntimecommand \showminimalbaseline \f!font_run

%D \macros
%D   {showkerning}
%D
%D A goody is:
%D
%D \showkerning{Can you guess what kerning is?}

\fetchruntimecommand \showkerning \f!font_run

%D \macros
%D   {showbodyfontenvironment,showfont,showfontstyle,showligatures}
%D
%D The current bodyfontenvironment is:
%D
%D \showbodyfontenvironment
%D
%D This overview is generated using:
%D
%D \showsetup{showbodyfontenvironment}

\fetchruntimecommand \showbodyfontenvironment \f!font_run

%D
%D The following command generates a fontmap:
%D
%D \startbuffer
%D \showfont[SansBold at 12pt]
%D \stopbuffer
%D
%D \typebuffer
%D \getbuffer

\fetchruntimecommand \showfont           \f!font_run
\fetchruntimecommand \showfontstyle      \f!font_run
\fetchruntimecommand \showligature       \f!font_run
\fetchruntimecommand \showligatures      \f!font_run
\fetchruntimecommand \showcharratio      \f!font_run
\fetchruntimecommand \showfontparameters \f!font_run

\unexpanded\def\showchardata          #1{\ctxcommand{showchardata("#1")}}
\unexpanded\def\showfontdata            {\ctxcommand{showfontparameters()}}

%D \macros
%D   {doiffontpresentelse}
%D
%D \starttyping
%D \doiffontpresentelse{texnansi-lmr10}{YES}{NO}
%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
%D \stoptyping

\unexpanded\def\doifelsefontpresent#1{\clf_doifelsefontpresent{#1}}

\let\doiffontpresentelse\doifelsefontpresent

% experimental, maybe this becomes a module

\newbox\otfcollector

\unexpanded\def\startotfcollecting{\ctxlua{nodes.tracers.steppers.start()}}
\unexpanded\def\stopotfcollecting {\ctxlua{nodes.tracers.steppers.stop()}}
\unexpanded\def\resetotfcollecting{\ctxlua{nodes.tracers.steppers.reset()}}

% Rather experimental:
%
% \page \showotfcomposition{arabtype*arab-default at 48pt}{-1}{الضَّرَّ} \page
% \page \showotfcomposition{arabtype*arab-default at 48pt}{-1}{لِلّٰهِ}   \page

\unexpanded\def\showotfstepglyphs#1%
  {\ctxlua{nodes.tracers.steppers.glyphs(\number\otfcollector,#1)}%
   \unhbox\otfcollector}

\unexpanded\def\otfstepspace
  {\removeunwantedspaces
   \hskip.5\emwidth \s!plus .125\emwidth \s!minus .125\emwidth\relax}

\unexpanded\def\otfstepcharcommand#1#2#3% font char class
  {\otfstepspace
   \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:%
   \setbox\scratchbox\hbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
   \ifzeropt\wd\scratchbox
     \scratchwidth.125\onepoint
     \scratchdistance\dimexpr(\emwidth/2-\scratchwidth)\relax
     \kern\scratchdistance
     \ruledhbox to \scratchwidth{\hss\box\scratchbox\hss}%
     \kern-\scratchwidth
     \hskip\scratchdistance
   \else
     \ruledhbox{\box\scratchbox}%
   \fi
   \otfstepspace}

\unexpanded\def\otfstepfontcommand#1#2#3% id font size
  {\begingroup
   \tttf #1: #2 @ \the\dimexpr#3\scaledpoint\relax
   \endgroup}

\unexpanded\def\otfstepmessagecommand#1#2%
  {\begingroup
   \tttf\language\minusone
   \veryraggedright
   \forgetparindent
   \forgeteverypar
   \hangindent\emwidth
   \hangafter\plusone
   \dontleavehmode\detokenize{#1}\removeunwantedspaces
   \doifsomething{#2}{,\space\detokenize{#2}}\endgraf
   \endgroup
   \blank}

\unexpanded\def\showotfstepfont
  {\ctxlua{nodes.tracers.steppers.font("otfstepfontcommand")}}

\unexpanded\def\showotfstepchars#1%
  {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand","otfstepspace")}}

\unexpanded\def\showotfstepmessages#1%
  {\ctxlua{nodes.tracers.steppers.messages(#1,"otfstepmessagecommand",true)}}

\unexpanded\def\showotfstepfeatures
  {\ctxlua{nodes.tracers.steppers.features()}}

\unexpanded\def\otfnoffeaturesteps
  {\ctxlua{nodes.tracers.steppers.nofsteps()}}

% \unexpanded\def\showotfsteps
%   {\begingroup
%    \veryraggedright
%    \forgetparindent
%    \forgeteverypar
%    \dontleavehmode\bgroup\tttf \language\minusone features: \showotfstepfeatures\egroup
%    \blank
%    \dontleavehmode\bgroup\tttf result:\egroup
%    \blank
%    \startlinecorrection
%    \ruledhbox\bgroup\box\otfcompositionbox\egroup
%    \stoplinecorrection
%    \dorecurse\otfnoffeaturesteps
%      {\blank
%       \showotfstepmessages\recurselevel
%       \blank
%       \startlinecorrection
%       \dontleavehmode\bgroup\resetallattributes\lefttoright\tttf\recurselevel: \showotfstepchars\recurselevel\egroup
%       \stoplinecorrection
%       \blank
%       \startlinecorrection
%       \ruledhbox % can be mode
%         \bgroup\resetallattributes\showotfstepglyphs\recurselevel\egroup % reset is new, we don't want additional processing
%       \stoplinecorrection
%       \blank}%
%    \endgroup}

\newconstant\showotfstepsmode  \showotfstepsmode\plusfour

\unexpanded\def\showotfsteps_n
  {\blank
   \begingroup
     \advance\leftskip6\emwidth
     \showotfstepmessages\recurselevel
     \par
   \endgroup
   \blank
   \dontleavehmode
   \hbox to \hsize \bgroup
     \hbox to 6\emwidth \bgroup
       \bf
       \ifnum\recurselevel=\scratchcounter result\else step \recurselevel\fi
       \hss
     \egroup
     \vtop \bgroup
       \hsize\dimexpr\hsize-6\emwidth\relax
       \resetallattributes
       \lefttoright
       \dontleavehmode
       \ifnum\recurselevel=\scratchcounter
         \ruledhbox{\box\otfcompositionbox}%
       \else
         \ruledhbox{\showotfstepglyphs\recurselevel}%
       \fi
       \quad
       \showotfstepchars\recurselevel
       \hfill
       \par
     \egroup
   \egroup
   \blank}

\unexpanded\def\showotfsteps
  {\begingroup
   \veryraggedright
   \forgetparindent
   \forgeteverypar
   \tt
   \lefttoright
   \hbox to \hsize \bgroup
     \hbox to 6\emwidth{\bf font\hss}%
     \vtop \bgroup
       \hsize\dimexpr\hsize-6\emwidth\relax
       \language\minusone
       \bf
       \showotfstepfont
     \egroup
   \egroup
   \blank
   \hbox to \hsize \bgroup
     \hbox to 6\emwidth{\bf features\hss}%
     \vtop \bgroup
       \hsize\dimexpr\hsize-6\emwidth\relax
       \language\minusone
       \showotfstepfeatures
     \egroup
   \egroup
   \blank
   \scratchcounter\otfnoffeaturesteps\relax
   \dorecurse\scratchcounter
     {\ifcase\showotfstepsmode
      \or % 1 = only first
        \ifnum\recurselevel=\plusone
          \showotfsteps_n
        \fi
      \or % 2 = only last
        \ifnum\recurselevel=\scratchcounter
          \showotfsteps_n
        \fi
      \or % 3 = first and last
        \ifnum\recurselevel=\plusone
          \showotfsteps_n
        \else\ifnum\recurselevel=\scratchcounter
          \showotfsteps_n
        \fi\fi
      \else % everything
        \showotfsteps_n
      \fi}%
   \endgroup}

\unexpanded\def\startotfsample
  {\enabletrackers[otf.sample.silent]% beware, kind of global
   \startotfcollecting
   \begingroup
   \veryraggedright
   \forgetparindent
   \forgeteverypar}

\unexpanded\def\stopotfsample
  {\endgroup
   \stopotfcollecting
   \disabletrackers[otf.sample]% beware, kind of global: otf.sample
   \showotfsteps
   \resetotfcollecting}

\newbox\otfcompositionbox

% this should go in spac-ali:

\installcorenamespace{otfcompositiondir}

\letvalue{\??otfcompositiondir  -1}\righttoleft
\letvalue{\??otfcompositiondir r2l}\righttoleft
\letvalue{\??otfcompositiondir l2r}\lefttoright
\letvalue{\??otfcompositiondir  +1}\lefttoright
\letvalue{\??otfcompositiondir   1}\lefttoright

\unexpanded\def\setotfcompositiondirection#1%
 {\begincsname\??otfcompositiondir#1\endcsname}

\unexpanded\def\showotfcomposition#1#2#3% {font*features at size}, rl=-1, text
  {\begingroup
   \forgetparindent
   \forgeteverypar
 % \setupcolors[\c!state=\v!start]%
   \setupalign[\v!verytolerant,\v!flushleft]%
   \startotfsample
   \nohyphens
   \global\setbox\otfcompositionbox\hbox{\definedfont[#1]\relax\setotfcompositiondirection{#2}\relax#3}%
   \stopotfsample
   \endgroup}

%D \startbuffer
%D \startotfcompositionlist{Serif*default @ 11pt}{l2r}%
%D     \showotfcompositionsample{effe}
%D \stopotfcompositionlist
%D \stopbuffer
%D
%D \typebuffer \getbuffer

\unexpanded\def\showotfcompositionlist#1#2#3%
  {\begingroup
   \definedfont[#1]%
   \setbox\scratchbox\hbox\bgroup
     \setotfcompositiondirection{#2}%
     #3%
   \egroup
   \strut
   \def|##1|{\kern\onepoint\string|\kern\onepoint##1\kern\onepoint\string|\kern\onepoint}%
   \cldcontext{nodes.listtoutf(tex.box[\number\scratchbox].list,"{\\kern\\onepoint}",true)}%
   \endgroup}

\unexpanded\def\startotfcompositionlist#1#2#3\stopotfcompositionlist
  {\begingroup
   \unexpanded\def\showotfcompositionsample##1%
     {\NC\type{##1}%
      \NC\showotfcompositionlist{Mono}{#2}{##1}%
      \NC\showotfcompositionlist{#1}{#2}{##1}%
      \NC\definedfont[#1]##1%
      \NC\NR}%
   \starttabulate[|||||]%
     #3%
   \stoptabulate
   \endgroup}

\let\stopotfcompositionlist\relax

% new

\unexpanded\def\savefont[#1]% not yet in i-*.xml
  {\begingroup
   \getdummyparameters[#1]%
   \clf_savefont {
      filename {\dummyparameter\c!file}
      fontname {\dummyparameter\c!name}
      method   {\dummyparameter\c!method}
   }%
   \endgroup}

\protect \endinput
