%D \module
%D   [       file=font-col,
%D        version=2008.06.11,
%D          title=\CONTEXT\ Font Macros,
%D       subtitle=Fallbacks (collections),
%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.

% ! EXPERIMENTAL ! code will be made more nice
%
% actually we can now do more at the lua end

% todo: missing only, force always, multiple fallbacks with test, scale
%
% \resetfontfallback [whatever]
%
% \definefontfallback [whatever] [Slanted]     [0x0060-0x007F] [force=yes]
% \definefontfallback [whatever] [Bold]        [0x0080-0x00FF,0x00A0-0x00AF] [rscale=1.2]
% \definefontfallback [whatever] [BoldSlanted] [0x00C0-0x00C7] [check=yes,force=yes]

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

\registerctxluafile{font-col}{1.001}

\unprotect

\unexpanded\def\definefontfallback{\doquadrupleempty\font_fallbacks_define}
\unexpanded\def\resetfontfallback {\dodoubleempty   \font_fallbacks_reset }

\def\font_fallbacks_define[#name][#font][#ranges][#settings]%
  {\ctxcommand{fontcollectiondefine("#name","#font",\!!bs#ranges\!!es,\!!bs#settings\!!es)}}

\def\font_fallbacks_reset[#name][#font]%
  {\ctxcommand{fontcollectionreset("#name","#font")}}

\def\font_fallbacks_prepare#name%
  {\ctxcommand{fontcollectionprepare("#name")}} % add fallbacks to last font

% we might as well move the handling to lua but then we need to pass the
% fallbacks, skewchar etc.

\newconditional\c_font_fallbacks_in_progress

\def\font_fallbacks_prepare_indeed#fallbacks%
  {\begingroup
     \settrue\c_font_fallbacks_in_progress
     \lastrawfontcall % sets current font id
     \font_fallbacks_prepare#fallbacks%
   \endgroup}

\let\m_font_fallbacks\empty % set in the font-ini

\appendtoks
    \ifconditional\c_font_fallbacks_in_progress\else
        \ifx\m_font_fallbacks\empty
            \ifx\m_font_class_fallbacks\empty
            \else
                \font_fallbacks_prepare_indeed\m_font_class_fallbacks
            \fi
        \else
            \font_fallbacks_prepare_indeed\m_font_fallbacks
        \fi
   \fi
\to\everydefinefont

\def\font_fallbacks_start_cloning
  {\begingroup
   \let\savedfontspec\somefontspec}

\def\font_fallbacks_stop_cloning
  {\endgroup}

\def\font_fallbacks_clone_unique#specification#scale% kind of dododefinefont
  {\ctxcommand{fontcollectionreport("defining #specification (relative scale: #scale)")}% brrr
   \setfalse\c_font_auto_size
   \let\lastfontidentifier\s!dummy
   \def\v_font_size_relative{#scale}%
   \let\v_font_size_absolute\fontbody
   \font_helpers_low_level_define{#specification}\v_font_identifier_basic
   \csname\v_font_identifier_basic\endcsname
   \setfalse\c_font_auto_size} % no \setfontcharacteristics and \the\everyfontswitch needed

\def\font_fallbacks_clone_inherited#font% also a second argument
  {\font_fallbacks_clone_unique{#font \savedfontspec}}

\def\font_fallbacks_register_main        #name{\ctxcommand{fontcollectionregister("#name")}}
\def\font_fallbacks_prepare_clone_vectors#name{\ctxcommand{fontcollectionclone("#name")}}

% check : only replace when present in replacement font (default: no)
% force : force replacent even when basefont has glyph  (default: yes)

% \definefontfallback [whatever] [Slanted]     [0x0060-0x007F] [force=yes]
% \definefontfallback [whatever] [Bold]        [0x0080:0x00FF,0x00A0:0x00AF] [rscale=2.0]
% \definefontfallback [whatever] [BoldSlanted] ["00C0-"00C7] [check=yes,force=yes]
% \definefontfallback [whatever] [Mono]        [latinextendeda] [force=yes] % 0x0100:0x017F
% \definefontfallback [whatever] [Mono]        [latin extended a] [force=yes] % 0x0100:0x017F
%
% \definefontsynonym[SerifPlus][Serif][fallbacks=whatever]
%
% \showfont[SerifPlus][all]

% \definefontfeature[zh][mode=node,script=hang,lang=zhs]
% \definefontfallback[serifwhatever]          [lmroman10-regular]   [0x0000-0x0400][force=yes]
% \definefontfallback[serifboldwhatever]      [lmroman10-bold]      [0x0000-0x0400][force=yes]
% \definefontfallback[serifitalicwhatever]    [lmroman10-italic]    [0x0000-0x0400][force=yes]
% \definefontfallback[serifbolditalicwhatever][lmroman10-bolditalic][0x0000-0x0400][force=yes]
%
% \starttypescript [serif] [zhfont]
%    \definefontsynonym [zhserif]          [AdobeSongStd-Light]   [features=zh,fallbacks=serifwhatever]
%    \definefontsynonym [zhserifbold]      [AdobeHeitiStd-Regular][features=zh,fallbacks=serifboldwhatever]
%    \definefontsynonym [zhserifitalic]    [AdobeKaitiStd-Regular][features=zh,fallbacks=serifitalicwhatever]
%    \definefontsynonym [zhserifbolditalic][AdobeHeitiStd-Regular][features=zh,fallbacks=serifbolditalicwhatever]
% \stoptypescript
%
% \starttypescript [serif][zhfont][name]
%    \definefontsynonym[Serif]             [zhserif]             % [fallbacks=serifwhatever]
%    \definefontsynonym[SerifBold]         [zhserifbold]         % [fallbacks=serifboldwhatever]
%    \definefontsynonym[SerifItalic]       [zhserifitalic]       % [fallbacks=serifitalicwhatever]
%    \definefontsynonym[SerifBoldItalic]   [zhserifbolditalic]   % [fallbacks=serifbolditalicwhatever]
% \stoptypescript
%
% \starttypescript[myfont]
%    \definetypeface[myfont][rm][serif][zhfont]
% \stoptypescript
%
% \usetypescript[myfont] \setupbodyfont[myfont,rm,12pt]
%
% \starttext
%   fonts {\bf fonts} {\bi fonts} {\it fonts}
% \stoptext

\protect \endinput
