summaryrefslogtreecommitdiff
path: root/tex/context/modules/mkiv/s-fonts-kerns.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/modules/mkiv/s-fonts-kerns.mkiv')
-rw-r--r--tex/context/modules/mkiv/s-fonts-kerns.mkiv215
1 files changed, 215 insertions, 0 deletions
diff --git a/tex/context/modules/mkiv/s-fonts-kerns.mkiv b/tex/context/modules/mkiv/s-fonts-kerns.mkiv
new file mode 100644
index 000000000..c3a5637c3
--- /dev/null
+++ b/tex/context/modules/mkiv/s-fonts-kerns.mkiv
@@ -0,0 +1,215 @@
+%D \module
+%D [ file=s-fonts-kerns,
+%D version=2018.02.20, % was s-fnt-40 (given the kin dof code < 2010)
+%D title=\CONTEXT\ Style File,
+%D subtitle=Show Fonts Kerns,
+%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.
+
+%D This is real old code but we keep it around for educational purposes. it's
+%D not that efficient and we have better ways.
+%D
+%D \starttyping
+%D \showfontkerns
+%D \stoptyping
+%D
+%D This one shows all kerns so it's s bit different and as we use it in the
+%D manual \unknown
+
+\startluacode
+
+ local nodecodes = nodes.nodecodes
+
+ local disc_code = nodecodes.disc
+ local kern_code = nodecodes.kern
+ local glyph_code = nodecodes.glyph
+ local hlist_code = nodecodes.hlist
+
+ -- local function flatten(l)
+ -- while l do
+ -- local id = l.id
+ -- if id == disc_code then
+ -- local r = l.replace
+ -- if r then
+ -- local p = l.prev
+ -- local n = l.next
+ -- if n and p and n.id == glyph_code and p.id == glyph_code then
+ -- local s = node.slide(r)
+ -- p.next = r
+ -- n.prev = s
+ -- r.prev = p
+ -- s.next= n
+ -- l.replace = nil
+ -- node.free(l)
+ -- end
+ -- end
+ -- elseif id == hlist_code then
+ -- flatten(l.list)
+ -- end
+ -- l = l.next
+ -- end
+ -- end
+
+ local function mark(l,c)
+ while l do
+ local id = l.id
+ if id == kern_code then
+ context.showkern(l.kern,c)
+ elseif id == disc_code then
+ mark(l.pre,2)
+ mark(l.post,3)
+ mark(l.replace,4)
+ elseif id == hlist_code then
+ mark(l.list,c)
+ end
+ l = l.next
+ end
+ end
+
+ local function collect(l)
+ local m = { }
+ while l do
+ local id = l.id
+ if id == hlist_code then
+ m[#m+1] = l
+ end
+ l = l.next
+ end
+ return m
+ end
+
+ local function inject(l,m,i)
+ local x = l
+ i = i or 0
+ while l do
+ local id = l.id
+ if id == kern_code then
+ i = i + 1
+ node.insert_before(x,l,node.copy(m[i]))
+ elseif id == disc_code then
+ i = inject(l.pre,m,i)
+ i = inject(l.post,m,i)
+ i = inject(l.replace,m,i)
+ elseif id == hlist_code then
+ i = inject(l.list,m,i)
+ end
+ l = l.next
+ end
+ return i
+ end
+
+ moduledata.fonts = moduledata.fonts or { }
+ moduledata.fonts.kerns = moduledata.fonts.kerns or { }
+
+ function moduledata.fonts.kerns._show_(n)
+ inject(tex.box[n].list,collect(tex.box[6].list))
+ end
+
+ function moduledata.fonts.kerns.show(n)
+ context("\\bgroup")
+ context("\\setbox6\\vbox\\bgroup\\forgetall")
+ -- flatten(tex.box[n].list)
+ mark(tex.box[n].list,1)
+ context("\\egroup")
+ context("\\ctxlua{moduledata.fonts.kerns._show_('%s')}",n)
+ context("\\egroup")
+ end
+
+\stopluacode
+
+\setupcolors[state=start]
+
+\definefont[VerySmall][Mono at 4pt]
+
+\definecolor[kern:0][s=.5]
+\definecolor[kern:1][b=.5]
+\definecolor[kern:2][r=.5]
+\definecolor[kern:3][g=.5]
+\definecolor[kern:4][r=.5,g=.5]
+
+\def\showkernwidthfactor{1}
+
+\newconditional\showkernstate
+\settrue \showexplicitkerns
+
+\unexpanded\def\showkern#1#2%
+ {\begingroup
+ \dontcomplain
+ \setbox\scratchbox\hbox to \zeropoint \bgroup
+ \ifcase#2\or
+ \ifconditional\showkernstate
+ \color[kern:0]{\dovlwdhtdp\showkernwidthfactor{0.75}{0.5}}%
+ \global\setfalse\showkernstate
+ \raise.8\strutht
+ \else
+ \color[kern:0]{\dovlwdhtdp\showkernwidthfactor{1.05}{0.5}}%
+ \global\settrue\showkernstate
+ \raise1.1\strutht
+ \fi
+ \else\ifconditional\showexplicitkerns % if other kerns
+ \color[kern:0]{\dovlwdhtdp\showkernwidthfactor{0.75}{0.5}}%
+ \lower1.2\strutdp
+ \fi\fi
+ \hbox to 0pt{\hss\VerySmall\color[kern:#2]{\expandafter\withoutpt\the\dimexpr#1sp}\hss}%
+ \egroup
+ \smashbox\scratchbox
+ \box\scratchbox
+ \endgroup
+ \par}
+
+\newbox\KernBox
+
+\unexpanded\def\ShowKerns#1%
+ {\global\setfalse
+ \showkernstate\ctxlua{moduledata.fonts.kerns.show("#1")}}
+
+\unexpanded\def\ShowKernedVBox#1%
+ {\global\setfalse\showkernstate
+ \setbox\KernBox\vbox{#1}%
+ \ShowKerns{KernBox}%
+ \unvbox\KernBox}
+
+\unexpanded\def\ShowKernedHBox#1%
+ {\global\setfalse\showkernstate
+ \setbox\KernBox\hbox{#1}%
+ \ShowKerns{KernBox}%
+ \unhbox\KernBox}
+
+\continueifinputfile{s-fonts-kerns.mkiv}
+
+\setupinterlinespace[1.5] % \setfalse\showexplicitkerns
+
+\definefontfeature[default][default][mode=node] % ,script=latn]
+
+\starttext
+
+% \enabletrackers[otf.kerns]
+
+\setuplayout[width=middle,height=middle]
+
+\usetypescript[modern] \setupbodyfont[modern]
+\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank
+
+\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.}
+
+\usetypescript[cambria] \setupbodyfont[cambria]
+\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank
+
+\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.}
+
+\usetypescript[palatino] \setupbodyfont[palatino]
+\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank
+
+\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.}
+
+\usetypescript[dejavu] \setupbodyfont[dejavu]
+\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank
+
+\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.}
+
+\stoptext