% language=uk

\setuppapersize
  [S6]

\setupbackgrounds
  [page]
  [background=color,
   backgroundcolor=darkblue]

\setuplayout
  [backspace=24pt,
   topspace=20pt,
   bottomspace=8pt,
   width=middle,
   height=middle,
   footerdistance=8pt,
   footer=8pt,
   header=0pt]

\setupcolors
  [textcolor=white]

\setupbodyfont
  [dejavu,14.4pt]

\definecolor[trace:o] [s=1]
\definecolor[trace:r] [s=1]
\definecolor[trace:do][s=1]
\definecolor[trace:dr][s=1]

\usemodule[abr-03]

\definefontfeature[noligatures][liga=no]

\setuphead
  [section]
  [page=yes,
   style=\bfb,
   after={\blank[3*medium]}]

\setuphead
  [subsection]
  [page=no,
   style=\bf\addfeature{noligatures},
   before={\blank[3*medium]},
   after={\blank}]

\setupfooter
  [strut=no,
   style=\bf]

\startuseMPgraphic{pagenumber}
    if LastPageNumber > 0 :
        draw outlinetext.f
            (decimal RealPageNumber)
            (withcolor "darkgray")
            xysized ((RealPageNumber/LastPageNumber) * TextWidth/2,FooterHeight) ;
    fi ;
\stopuseMPgraphic

\setupfootertexts
  [\useMPgraphic{pagenumber}]

\startdocument
  [title={Variable Fonts},
   subtitle={we're ready for them},
   author={Hans Hagen},
   occasion={BachoTUG 2017}]

\startstandardmakeup
    \vskip32pt
    \bfd \setupinterlinespace
    \documentvariable{title}
    \crlf
    \bfb \setupinterlinespace
    \vskip12pt
    \documentvariable{subtitle}
    \vfill
    \bfb \setupinterlinespace
    \documentvariable{author}
    \crlf
    \documentvariable{occasion}
\stopstandardmakeup

\startsubject[title=A Summary]

\startitemize
\startitem
    {\bf the macro package's view:} just a font but with many possible variations
    in shapes (width, weight, slope, etc) and therefore a bit more complex user
    interface
\stopitem
\startitem
    {\bf the engine's view:} an abstraction not different from other fonts but
    that needs a special treatment in the backend
\stopitem
\startitem
    {\bf the viewer's view:} a font to be displayed like any other with outlines
    in cff of ttf format
\stopitem
\startitem
    {\bf the user's view:} an opentype font with possibly surprising shapes of
    which you need to know a bit more than usual if you want to profit from it
\stopitem
\stopitemize

So, in practice, for most \TEX\ users it's just a font that has to be supported by
\TEX\ and friends.

\stopsubject

\startsubject[title=Starting point]

\startitemize
\startitem
    The OpenType 1.8 specification at the MicroSoft website defined the extra
    tables and explains bits and pieces.
\stopitem
\startitem
    There a few fonts that have relevant tables (not all) and implement variants
    as well as features.
\stopitem
\startitem
    There are some posts on the internet that show a bit about axis and other things
    that go on in these fonts.
\stopitem
\startitem
    Luckily we have ways (in \CONTEXT) to explore what goes on in these fonts and
    how they could look.
\stopitem
\startitem
    Condition: no tricks, no fuzzy heuristics, just the specification should be
    enough.
\stopitem
\stopitemize

\stopsubject

\startsubject[title=Implementation steps]

\startitemize
\startitem
    First try to render variants in order to see what we're dealing with. This was not too
    hard (starting with cff) because we have already virtual font support.
\stopitem
\startitem
    Next try to load the relevant tables and figure out what these deltas and such really
    mean and how axis and regions and \unknown\ have to be applied.
\stopitem
\startitem
    Try to make it all work on a real piece of text, so not only shapes but also features
    and dimensions.
\stopitem
\startitem
    Finally make sure that the font can get embedded as a normal font and not as inline
    (tagged) graphic.
\stopitem
\startitem
    Also, try to generalize the helpers and methods in such ways that we can experiment
    with additional tricks (after all, \TEX\ is about control).
\stopitem
\startitem
    Todo: once there are more fonts (with the right data tables), check the code with the
    specification.
\stopitem
\stopitemize

\stopsubject

\setupTABLE[c][1][style=tttf,align={flushleft,lohi}]

\startsubject[title=Adobe Variable Font Prototype (cff)]

\unexpanded\def\SampleFont#1#2% weight / contrast
  {\definedfont[name:adobevariablefontprototype#1*default at 32pt]It looks like this!}

\bTABLE[distance=2em,frame=off]
\bTR \bTD extralight               0/0   \eTD \bTD \SampleFont {extralight}          \eTD \eTR
\bTR \bTD light                  150/0   \eTD \bTD \SampleFont {light}               \eTD \eTR
\bTR \bTD regular                394/0   \eTD \bTD \SampleFont {regular}             \eTD \eTR
\bTR \bTD semibold               600/0   \eTD \bTD \SampleFont {semibold}            \eTD \eTR
\bTR \bTD bold                   824/0   \eTD \bTD \SampleFont {bold}                \eTD \eTR
\bTR \bTD black high contrast   1000/100 \eTD \bTD \SampleFont {blackhighcontrast}   \eTD \eTR
\bTR \bTD black medium contrast 1000/50  \eTD \bTD \SampleFont {blackmediumcontrast} \eTD \eTR
\bTR \bTD black                 1000/0   \eTD \bTD \SampleFont {black}               \eTD \eTR
\eTABLE

\stopsubject

% \starttyping
% \definefont
%   [MyLightFont]
%   [name:adobevariablefontprototypelight*default]
% \stoptyping

\unexpanded\def\SampleFont#1#2% weight / width
  {\definedfont[name:avenirnextvariable#1*default at 32pt]It looks like this!}

\startsubject[title=Avenir Next Variable (ttf)]

\bTABLE[distance=2em,frame=off]
\bTR \bTD regular           400/100 \eTD \bTD \SampleFont {regular}         \eTD \eTR
\bTR \bTD medium            500/100 \eTD \bTD \SampleFont {medium}          \eTD \eTR
\bTR \bTD bold              700/100 \eTD \bTD \SampleFont {bold}            \eTD \eTR
\bTR \bTD heavy             900/100 \eTD \bTD \SampleFont {heavy}           \eTD \eTR
\bTR \bTD condensed         400/75  \eTD \bTD \SampleFont {condensed}       \eTD \eTR
\bTR \bTD medium condensed  500/75  \eTD \bTD \SampleFont {mediumcondensed} \eTD \eTR
\bTR \bTD bold condensed    700/75  \eTD \bTD \SampleFont {boldcondensed}   \eTD \eTR
\bTR \bTD heavy condensed   900/75  \eTD \bTD \SampleFont {heavycondensed}  \eTD \eTR
\eTABLE

\stopsubject

\startbuffer[both]
\vfill
\startMPcode
  draw outlinetext.b
    ("\getbuffer[a]")
    (withcolor "white")
    (withcolor "red" withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
\vfill
\startMPcode
  draw outlinetext.b
    ("\getbuffer[b]")
    (withcolor "white")
    (withcolor "red" withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
\vfill
\startMPcode
  draw outlinetext.b
    ("\getbuffer[c]")
    (withcolor "white")
    (withcolor "red" withpen pencircle scaled 1/10)
    xsized .90TextWidth ;
\stopMPcode
\vfill
\stopbuffer

\startbuffer[fill]
\vfill
\startMPcode
  draw outlinetext.f
    ("\getbuffer[a]")
    (withcolor "white")
    xsized .9TextWidth ;
\stopMPcode
\vfill
\startMPcode
  draw outlinetext.f
    ("\getbuffer[b]")
    (withcolor "white")
    xsized .9TextWidth ;
\stopMPcode
\vfill
\startMPcode
  draw outlinetext.f
    ("\getbuffer[c]")
    (withcolor "white")
    xsized .9TextWidth ;
\stopMPcode
\vfill
\stopbuffer

\startbuffer[draw]
\vfill
\startMPcode
  draw outlinetext.d
    ("\getbuffer[a]")
    (withcolor "white" withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
\vfill
\startMPcode
  draw outlinetext.d
    ("\getbuffer[b]")
    (withcolor "white" withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
\vfill
\startMPcode
  draw outlinetext.d
    ("\getbuffer[c]")
    (withcolor "white" withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
\vfill
\stopbuffer

\startbuffer[overlay]
\startoverlay{%
\startMPcode
  draw outlinetext.d
    ("\getbuffer[a]")
    (withcolor "green" withtransparency (3,0.5) withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
}{%
\startMPcode
  draw outlinetext.d
    ("\getbuffer[b]")
    (withcolor "yellow" withtransparency (3,0.5) withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
}{%
\startMPcode
  draw outlinetext.d
    ("\getbuffer[c]")
    (withcolor "red" withtransparency (3,0.5) withpen pencircle scaled 1/10)
    xsized .9TextWidth ;
\stopMPcode
}
\stopoverlay
\stopbuffer

\startbuffer[a]
\definedfont[name:adobevariablefontprototypeextralight]bachotex%
\stopbuffer

\startbuffer[b]
\definedfont[name:adobevariablefontprototypelight]bachotex%
\stopbuffer

\startbuffer[c]
\definedfont[name:adobevariablefontprototypebold]bachotex%
\stopbuffer

\startsubject[title=Metafontisch overlap (1)]
    \getbuffer[both]
\stopsubject

\startbuffer[a]
\definefontfeature[whatever][axis={weight:50}]%
\definedfont[name:adobevariablefontprototype*whatever]bachotex%
\stopbuffer

\startbuffer[b]
\definefontfeature[whatever][axis={weight:300}]%
\definedfont[name:adobevariablefontprototype*whatever]bachotex%
\stopbuffer

\startbuffer[c]
\definefontfeature[whatever][axis={weight:700}]%
\definedfont[name:adobevariablefontprototype*whatever]bachotex%
\stopbuffer

\startsubject[title=Metafontisch overlap (2)]
    \getbuffer[both]
\stopsubject
\startsubject[title=Fills hide the details]
    \getbuffer[fill]
\stopsubject
\startsubject[title=Unsuitable outlines]
    \getbuffer[draw]
\stopsubject

\startbuffer[a]
\definefontfeature[whatever][axis={weight:100,contrast:0}]%
\definedfont[name:adobevariablefontprototype*whatever]bachotex%
\stopbuffer

\startbuffer[b]
\definefontfeature[whatever][axis={weight:200,contrast:20}]%
\definedfont[name:adobevariablefontprototype*whatever]bachotex%
\stopbuffer

\startbuffer[c]
\definefontfeature[whatever][axis={weight:200,contrast:50}]%
\definedfont[name:adobevariablefontprototype*whatever]bachotex%
\stopbuffer

\startsubject[title=Stay within specification]
    \getbuffer[draw]
\stopsubject

\startsubject[title=Subjective choices]
    \getbuffer[fill]
\stopsubject

\startbuffer[a]
\definefontfeature[whatever][axis={weight:100,contrast:0}]%
\definedfont[name:adobevariablefontprototype*whatever]tex%
\stopbuffer

\startbuffer[b]
\definefontfeature[whatever][axis={weight:200,contrast:20}]%
\definedfont[name:adobevariablefontprototype*whatever]tex%
\stopbuffer

\startbuffer[c]
\definefontfeature[whatever][axis={weight:200,contrast:50}]%
\definedfont[name:adobevariablefontprototype*whatever]tex%
\stopbuffer

\startsubject[title=Difficult choices]
    \getbuffer[overlay]
\stopsubject

\startsubject[title=Definitions (1)]

\startbuffer
\definefontfeature
  [default:shaped]
  [default]
  [axis={width:10}]

\definefont
  [SomeFont]
  [file:avenirnextvariable*default:shaped]
\stopbuffer

\typebuffer \getbuffer

\start \setupinterlinespace \showglyphs \showfontkerns \SomeFont \input zapf \wordright{Hermann Zapf}\par \stop

\stopsubject

\startsubject[title=Definitions (2)]

\startbuffer
\definefontfeature
  [default:shaped]
  [default]
  [axis={width:100,weight=200}]

\definefont
  [SomeFont]
  [file:avenirnextvariable*default:shaped @ 12pt]
\stopbuffer

\typebuffer \getbuffer

\start \setupinterlinespace  \showglyphs \showfontkerns \SomeFont \input zapf \wordright{Hermann Zapf}\par \stop

\stopsubject

\startsubject[title=Transformations]

\subsubject{correction:}

\startformula
    x^\prime = x
             + s_{x1} \cdot x_1
             + s_{x2} \cdot x_2
             + s_{x3} \cdot x_3
             + s_{x4} \cdot x_4
\stopformula

\startformula
    y^\prime = y
             + s_{y1} \cdot y_1
             + s_{y2} \cdot y_2
             + s_{y3} \cdot y_3
             + s_{y4} \cdot y_4
\stopformula

\subsubject{internal cff:}

\starttyping
1 <setvstore>
120 [10 -30 40 -60] 1 <blend> ... <operator>
100 120 [10 -30 40 -60] [30 -10 -30 20] 2 <blend> .. <operator>
\stoptyping

\subsubject{external ttf:}

\starttyping
apply x deltas [10 -30 40 -60] to x 120
apply y deltas [30 -10 -30 20] to y 100
\stoptyping

\stopsubject

\startsubject[title=Follow up]

\startitemize
\startitem
    Performance is quite okay because we cache instances. I might come up with an
    alternative way but there is not much to gain.
\stopitem
\startitem
    Once fonts show up alternative interfaces to axis and scaling can be explored
    and provided.
\stopitem
\startitem
    I will look into ways to do all the backend font code in \CONTEXT\ in \LUA\
    (easier to update and more flexible).
\stopitem
\startitem
    Luigi and I will play with variable fonts defined in the traditional meta tools
    that come with \TEX.
\stopitem
\stopitemize

\stopsubject

\stopdocument

