summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/typo-fkr.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/typo-fkr.lmt')
-rw-r--r--tex/context/base/mkxl/typo-fkr.lmt122
1 files changed, 122 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/typo-fkr.lmt b/tex/context/base/mkxl/typo-fkr.lmt
new file mode 100644
index 000000000..3491c9eff
--- /dev/null
+++ b/tex/context/base/mkxl/typo-fkr.lmt
@@ -0,0 +1,122 @@
+if not modules then modules = { } end modules ['typo-fkr'] = {
+ version = 1.001,
+ comment = "companion to typo-fkr.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local nuts = nodes.nuts
+local getid = nuts.getid
+local getnext = nuts.getnext
+local getattr = nuts.getattr
+local isglyph = nuts.isglyph
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+
+local fontdata = fonts.hashes.identifiers
+local getkernpair = fonts.handlers.otf.getkern
+
+local insertbefore = nuts.insertbefore
+local new_kern = nuts.pool.fontkern
+
+local enableaction = nodes.tasks.enableaction
+
+local a_extrakern = attributes.private("extrafontkern")
+
+-- 0=none 1=min 2=max 3=mixed
+
+typesetters.fontkerns = { }
+
+function typesetters.fontkerns.handler(head)
+ local current = head
+ local lastfont = nil
+ local lastchar = nil
+ local lastdata = nil
+ while current do
+ local char, font = isglyph(current)
+ if char then
+ local a = getattr(current,a_extrakern)
+ if a then
+ if font ~= lastfont then
+ if a > 0 and lastchar then
+ if not lastdata then
+ lastdata = fontdata[lastfont]
+ end
+ local kern = nil
+ local data = fontdata[font]
+ local kern1 = getkernpair(lastdata,lastchar,char)
+ local kern2 = getkernpair(data,lastchar,char)
+ if a == 1 then
+ kern = kern1 > kern2 and kern2 or kern1 -- min
+ elseif a == 2 then
+ kern = kern1 > kern2 and kern1 or kern2 -- max
+ else -- 3
+ kern = (kern1 + kern2)/2 -- mixed
+ end
+ if kern ~= 0 then
+ head = insertbefore(head,current,new_kern(kern))
+ end
+ lastdata = data
+ else
+ lastdata = nil
+ end
+ elseif lastchar then
+ if not lastdata then
+ lastdata = fontdata[lastfont]
+ end
+ local kern = getkernpair(lastdata,lastchar,char)
+ if kern ~= 0 then
+ head = insertbefore(head,current,new_kern(kern))
+ end
+ end
+ lastchar = char
+ lastfont = font
+ elseif lastfont then
+ lastfont = nil
+ lastchar = nil
+ lastdata = nil
+ end
+ elseif lastfont then
+ lastfont = nil
+ lastchar = nil
+ lastdata = nil
+ end
+ current = getnext(current)
+ end
+ return head
+end
+
+do
+
+ local variables = interfaces.variables
+ local unsetvalue = attributes.unsetvalue
+ local enabled = false
+ local setattribute = tex.setattribute
+
+ local values = {
+ [variables.none ] = 0,
+ [variables.min ] = 1,
+ [variables.max ] = 2,
+ [variables.mixed] = 3,
+ [variables.reset] = unsetvalue,
+ }
+
+ local function setextrafontkerns(str)
+ if not enabled then
+ enableaction("processors","typesetters.fontkerns.handler")
+ enabled = true
+ end
+ setattribute(a_extrakern,str and values[str] or unsetvalue)
+ end
+
+ interfaces.implement {
+ name = "setextrafontkerns",
+ public = true,
+ protected = true,
+ arguments = "optional",
+ actions = setextrafontkerns,
+ }
+
+end