summaryrefslogtreecommitdiff
path: root/tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-02-17 12:15:07 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-02-17 12:15:07 +0100
commitb13dd166ce8563c60c10affc97ab28940d6a7776 (patch)
tree6b15f0462d36ae916875ce1fbcdd990660d3f410 /tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua
parenta036ac2dd19b592316e1b479360e9e6c6700e935 (diff)
downloadcontext-b13dd166ce8563c60c10affc97ab28940d6a7776.tar.gz
2016-02-17 11:13:00
Diffstat (limited to 'tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua')
-rw-r--r--tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua76
1 files changed, 76 insertions, 0 deletions
diff --git a/tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua b/tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua
new file mode 100644
index 000000000..00fc636a1
--- /dev/null
+++ b/tex/generic/context/luatex/luatex-fonts-demo-vf-4.lua
@@ -0,0 +1,76 @@
+
+return function(specification)
+ local t = { }
+ for k, v in pairs(specification.features.normal) do
+ local n = tonumber(k)
+ if n then
+ t[n] = v
+ end
+ end
+ for k, v in ipairs(t) do
+ local name, rest = string.match(v,"^(.-){(.*)}$")
+ if rest then
+ t[k] = { name = name, list = { } }
+ for s in string.gmatch(rest,"([^%+]+)") do
+ local b, e = string.match(s,"^(.-)%-(.*)$")
+ if b and e then
+ b = tonumber(b)
+ e = tonumber(e)
+ else
+ b = tonumber(s)
+ e = b
+ end
+ if b and e then
+ table.insert(t[k].list,{ b = b, e = e })
+ end
+ end
+ else
+ t[k] = { name = v }
+ end
+ end
+ local ids = { }
+ for k, v in ipairs(t) do
+ local f, id
+ if tonumber(v.name) then
+ id = tonumber(v.name)
+ f = fonts.hashes.identifiers[id]
+ else
+ f, id = fonts.constructors.readanddefine(v.name,specification.size)
+ end
+ v.f = f
+ ids[k] = { id = id }
+ end
+ local one = t[1].f
+ if one then
+ one.properties.name = specification.name
+ one.properties.virtualized = true
+ one.fonts = ids
+ local chr = one.characters
+ for n, v in ipairs(t) do
+ if n == 1 then
+ -- use font 1 as base
+ elseif v.list and #v.list > 0 then
+ local chrs = v.f.characters
+ for k, v in ipairs(v.list) do
+ for u=v.b,v.e do
+ local c = chrs[u]
+ if c then
+ c.commands = {
+ { 'slot', n, u },
+ }
+ chr[u] = c
+ end
+ end
+ end
+ else
+ for u, c in ipairs(v.f.characters) do
+ c.commands = {
+ { 'slot', n, u },
+ }
+ chr[u] = c
+ end
+ end
+ end
+ end
+ return one
+end