From 190afdecb3f4d133e472fd17a140c57100219b7b Mon Sep 17 00:00:00 2001
From: Elie Roux
Date: Thu, 23 Apr 2009 15:22:25 +0200
Subject: sync with the latest ConTeXt beta, and using luaotfload in DVI mode
too (for dvipdfmx)
---
luaotfload.dtx | 23 ++-------
otfl-data-con.lua | 118 ++++++++++++++++++++++++++++++++++++++++++
otfl-font-cid.lua | 2 +-
otfl-font-def.lua | 15 +++---
otfl-font-dum.lua | 2 +-
otfl-font-ota.lua | 47 +++++++++++------
otfl-font-otf.lua | 27 ++++++----
otfl-font-otn.lua | 14 ++---
otfl-font-tfm.lua | 152 +++++++++++++++++++++++++++---------------------------
otfl-luat-con.lua | 118 ------------------------------------------
otfl-luat-dum.lua | 11 ++--
otfl-node-inj.lua | 2 +
12 files changed, 268 insertions(+), 263 deletions(-)
create mode 100644 otfl-data-con.lua
delete mode 100644 otfl-luat-con.lua
diff --git a/luaotfload.dtx b/luaotfload.dtx
index 7422158..ab04b2c 100644
--- a/luaotfload.dtx
+++ b/luaotfload.dtx
@@ -4,7 +4,7 @@
%
% This work is under the CC0 license.
%
-% This work consists of the main source file luamcallbacks.dtx
+% This work consists of the main source file luaotfload.dtx
% and the derived files
% luaotfload.sty, luaotfload.lua
%
@@ -49,7 +49,7 @@ Copyright (C) 2009 by Elie Roux
This work is under the CC0 license.
-This work consists of the main source file luainputenc.dtx
+This work consists of the main source file luaotfload.dtx
and the derived files
luaotfload.sty, luaotfload.lua
@@ -278,7 +278,7 @@ end
% \begin{macrocode}
luaotfload.loadmodule('luat-dum.lua') -- not used in context at all
-luaotfload.loadmodule('luat-con.lua') -- maybe some day we don't need this one
+luaotfload.loadmodule('data-con.lua') -- maybe some day we don't need this one
% \end{macrocode}
%
@@ -308,6 +308,7 @@ end
%
% \begin{macrocode}
+luaotfload.loadmodule('node-res.lua')
luaotfload.loadmodule('node-inj.lua')
luaotfload.loadmodule('node-fnt.lua')
luaotfload.loadmodule('node-dum.lua')
@@ -395,22 +396,6 @@ end
\RequirePackage{luatextra}
\fi
-% \end{macrocode}
-%
-% We print a warning if we are not in PDF mode.
-%
-% \begin{macrocode}
-
-\ifnum\pdfoutput<1
- \expandafter\ifx\csname PackageWarning\endcsname\relax
- \write16{}
- \write16{Warning: luaotfload only works in PDF mode, otf fonts won't work.}
- \write16{}
- \else
- \PackageWarning{luaotfload}{luaotfload only works in PDF mode, otf fonts won't work.}
- \fi
-\fi
-
\expandafter\edef\csname otfl@AtEnd\endcsname{%
\catcode64 \the\catcode64\relax
}
diff --git a/otfl-data-con.lua b/otfl-data-con.lua
new file mode 100644
index 0000000..ec146f0
--- /dev/null
+++ b/otfl-data-con.lua
@@ -0,0 +1,118 @@
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, lower, gsub = string.format, string.lower, string.gsub
+
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+local trace_containers = false trackers.register("resolvers.containers", function(v) trace_containers = v end)
+local trace_storage = false trackers.register("resolvers.storage", function(v) trace_storage = v end)
+local trace_verbose = false trackers.register("resolvers.verbose", function(v) trace_verbose = v end)
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v trackers.enable("resolvers.verbose") end)
+
+--[[ldx--
+Once we found ourselves defining similar cache constructs
+several times, containers were introduced. Containers are used
+to collect tables in memory and reuse them when possible based
+on (unique) hashes (to be provided by the calling function).
+
+Caching to disk is disabled by default. Version numbers are
+stored in the saved table which makes it possible to change the
+table structures without bothering about the disk cache.
+
+Examples of usage can be found in the font related code.
+--ldx]]--
+
+containers = containers or { }
+
+containers.usecache = true
+
+local function report(container,tag,name)
+ if trace_cache or trace_containers then
+ logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ end
+end
+
+local allocated = { }
+
+-- tracing
+
+function containers.define(category, subcategory, version, enabled)
+ return function()
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or 1.000,
+ trace = false,
+ path = caches and caches.setpath(category,subcategory),
+ }
+ c[subcategory] = s
+ end
+ return s
+ else
+ return nil
+ end
+ end
+end
+
+function containers.is_usable(container, name)
+ return container.enabled and caches and caches.iswritable(container.path, name)
+end
+
+function containers.is_valid(container, name)
+ if name and name ~= "" then
+ local storage = container.storage[name]
+ return storage and not table.is_empty(storage) and storage.cache_version == container.version
+ else
+ return false
+ end
+end
+
+function containers.read(container,name)
+ if container.enabled and caches and not container.storage[name] and containers.usecache then
+ container.storage[name] = caches.loaddata(container.path,name)
+ if containers.is_valid(container,name) then
+ report(container,"loaded",name)
+ else
+ container.storage[name] = nil
+ end
+ end
+ if container.storage[name] then
+ report(container,"reusing",name)
+ end
+ return container.storage[name]
+end
+
+function containers.write(container, name, data)
+ if data then
+ data.cache_version = container.version
+ if container.enabled and caches then
+ local unique, shared = data.unique, data.shared
+ data.unique, data.shared = nil, nil
+ caches.savedata(container.path, name, data)
+ report(container,"saved",name)
+ data.unique, data.shared = unique, shared
+ end
+ report(container,"stored",name)
+ container.storage[name] = data
+ end
+ return data
+end
+
+function containers.content(container,name)
+ return container.storage[name]
+end
diff --git a/otfl-font-cid.lua b/otfl-font-cid.lua
index 88de5fd..b1ddaae 100644
--- a/otfl-font-cid.lua
+++ b/otfl-font-cid.lua
@@ -85,7 +85,7 @@ local function locate(registry,ordering,supplement)
if trace_loading then
logs.report("load otf","checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
end
- local fullname = input.find_file(filename,'cid') or ""
+ local fullname = resolvers.find_file(filename,'cid') or ""
if fullname ~= "" then
cidmap = fonts.cid.load(fullname)
if cidmap then
diff --git a/otfl-font-def.lua b/otfl-font-def.lua
index f6bcb54..284f8ef 100644
--- a/otfl-font-def.lua
+++ b/otfl-font-def.lua
@@ -323,7 +323,7 @@ evolved. Each one has its own way of dealing with its format.
local function check_tfm(specification,fullname)
-- ofm directive blocks local path search unless set
- fullname = input.findbinfile(fullname, 'tfm') or "" -- just to be sure
+ fullname = resolvers.findbinfile(fullname, 'tfm') or "" -- just to be sure
if fullname ~= "" then
specification.filename, specification.format = fullname, "ofm"
return tfm.read_from_tfm(specification)
@@ -331,7 +331,7 @@ local function check_tfm(specification,fullname)
end
local function check_afm(specification,fullname)
- fullname = input.findbinfile(fullname, 'afm') or "" -- just to be sure
+ fullname = resolvers.findbinfile(fullname, 'afm') or "" -- just to be sure
if fullname ~= "" then
specification.filename, specification.format = fullname, "afm"
return tfm.read_from_afm(specification)
@@ -380,17 +380,17 @@ function readers.afm(specification,method)
end
local function check_otf(specification,suffix,what)
- local fullname, tfmtable = input.findbinfile(specification.name,suffix) or "", nil
+ local fullname, tfmtable = resolvers.findbinfile(specification.name,suffix) or "", nil
if fullname == "" then
local fb = fonts.names.old_to_new[specification.name]
if fb then
- fullname = input.findbinfile(fb,suffix) or ""
+ fullname = resolvers.findbinfile(fb,suffix) or ""
end
end
if fullname == "" then
local fb = fonts.names.new_to_old[specification.name]
if fb then
- fullname = input.findbinfile(fb,suffix) or ""
+ fullname = resolvers.findbinfile(fb,suffix) or ""
end
end
if fullname ~= "" then
@@ -515,6 +515,7 @@ function define.read(specification,size,id) -- id can be optional, name can alre
end
if fontdata then
fontdata.hash = hash
+ fontdata.cache = "no"
if id then
define.register(fontdata,id)
end
@@ -546,7 +547,7 @@ function vf.find(name)
if trace_defining then
logs.report("define font","locating vf for %s",name)
end
- return input.findbinfile(name,"ovf")
+ return resolvers.findbinfile(name,"ovf")
else
if trace_defining then
logs.report("define font","vf for %s is already taken care of",name)
@@ -557,7 +558,7 @@ function vf.find(name)
if trace_defining then
logs.report("define font","locating vf for %s",name)
end
- return input.findbinfile(name,"ovf")
+ return resolvers.findbinfile(name,"ovf")
end
end
diff --git a/otfl-font-dum.lua b/otfl-font-dum.lua
index f364152..0dedc85 100644
--- a/otfl-font-dum.lua
+++ b/otfl-font-dum.lua
@@ -53,7 +53,7 @@ function fonts.names.resolve(name,sub)
local basename = fonts.names.basename
if basename and basename ~= "" then
for _, format in ipairs { "lua", "tex", "other text files" } do
- local foundname = input.find_file(basename,format) or ""
+ local foundname = resolvers.find_file(basename,format) or ""
if foundname ~= "" then
data = dofile(foundname)
if data then
diff --git a/otfl-font-ota.lua b/otfl-font-ota.lua
index c6a5b29..72e7414 100644
--- a/otfl-font-ota.lua
+++ b/otfl-font-ota.lua
@@ -32,10 +32,14 @@ local glyph = node.id('glyph')
local glue = node.id('glue')
local penalty = node.id('penalty')
-local set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
-local traverse_id = node.traverse_id
-local remove_node = nodes.remove
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local delete_node = nodes.delete
+local replace_node = nodes.replace
+local insert_node_after = node.insert_after
+local insert_node_before = node.insert_before
+local traverse_node_list = node.traverse
local fontdata = fonts.ids
local state = attributes.private('state')
@@ -46,12 +50,6 @@ local fcr = (fonts.color and fonts.color.reset) or function() end
local a_to_script = otf.a_to_script
local a_to_language = otf.a_to_language
-local remove_node = node.remove
-local delete_node = nodes.delete
-local insert_node_after = node.insert_after
-local insert_node_before = node.insert_before
-local traverse_node_list = node.traverse
-
-- in the future we will use language/script attributes instead of the
-- font related value, but then we also need dynamic features which is
-- somewhat slower; and .. we need a chain of them
@@ -239,17 +237,23 @@ end
function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
local tfmdata = fontdata[font]
---~ local marks = tfmdata.shared.otfdata.luatex.marks
local marks = tfmdata.marks
local first, last, current, done = nil, nil, head, false
- local removejoiners = otf.remove_joiners
- local joiners = { }
+ local joiners, nonjoiners
+ local removejoiners = tfmdata.remove_joiners -- or otf.remove_joiners
+ if removejoiners then
+ joiners, nonjoiners = { }, { }
+ end
while current do
if current.id == glyph and current.subtype<256 and current.font == font and not has_attribute(current,state) then
done = true
local char = current.char
- if removejoiners and char == zwj or char == zwnj then
- joiners[#joiners+1] = current
+ if removejoiners then
+ if char == zwj then
+ joiners[#joiners+1] = current
+ elseif char == zwnj then
+ nonjoiners[#nonjoiners+1] = current
+ end
end
if marks[char] then
set_attribute(current,state,5) -- mark
@@ -298,8 +302,19 @@ function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special ve
first, last = finish(first,last)
if removejoiners then
for i=1,#joiners do
- head = delete_node(head,joiners[i]) -- was remove so no free
+ head = delete_node(head,joiners[i])
+ end
+ for i=1,#nonjoiners do
+ head = replace_node(head,nonjoiners[i],nodes.glue(0)) -- or maybe a kern
end
end
return head, done
end
+
+table.insert(fonts.manipulators,"joiners")
+
+function fonts.initializers.node.otf.joiners(tfmdata,value)
+ if value == "strip" then
+ tfmdata.remove_joiners = true
+ end
+end
diff --git a/otfl-font-otf.lua b/otfl-font-otf.lua
index 9c1e6f0..a63b9e3 100644
--- a/otfl-font-otf.lua
+++ b/otfl-font-otf.lua
@@ -79,9 +79,8 @@ otf.features.default = otf.features.default or { }
otf.enhancers = otf.enhancers or { }
-otf.version = 2.617
+otf.version = 2.619
otf.pack = true
-otf.enhance_data = false
otf.syncspace = true
otf.notdef = false
otf.cache = containers.define("fonts", "otf", otf.version, true)
@@ -173,7 +172,7 @@ otf.tables.valid_fields = {
local function load_featurefile(ff,featurefile)
if featurefile then
- featurefile = input.find_file(file.addsuffix(featurefile,'fea')) -- "FONTFEATURES"
+ featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea')) -- "FONTFEATURES"
if featurefile and featurefile ~= "" then
if trace_loading then
logs.report("load otf", "featurefile: %s", featurefile)
@@ -1203,6 +1202,7 @@ function otf.otf_to_tfm(specification)
local features = specification.features.normal
local cache_id = specification.hash
local tfmdata = containers.read(tfm.cache(),cache_id)
+--~ print(cache_id)
if not tfmdata then
local otfdata = otf.load(filename,format,sub,features and features.featurefile)
if not table.is_empty(otfdata) then
@@ -1211,7 +1211,7 @@ function otf.otf_to_tfm(specification)
anchorhash = { },
initialized = false,
}
- tfmdata = otf.copy_to_tfm(otfdata)
+ tfmdata = otf.copy_to_tfm(otfdata,cache_id)
if not table.is_empty(tfmdata) then
tfmdata.unique = tfmdata.unique or { }
tfmdata.shared = tfmdata.shared or { } -- combine
@@ -1261,7 +1261,10 @@ end
-- the first version made a top/mid/not extensible table, now we just pass on the variants data
-- and deal with it in the tfm scaler (there is no longer an extensible table anyway)
-function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
+-- we cannot share descriptions as virtual fonts might extend them (ok, we could
+-- use a cache with a hash
+
+function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
if data then
local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { }
local luatex = data.luatex
@@ -1278,9 +1281,8 @@ function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to
}
-- indices maps from unicodes to indices
for u, i in next, indices do
- local d = glyphs[i]
characters[u] = { } -- we need this because for instance we add protruding info
- descriptions[u] = d
+ descriptions[u] = glyphs[i]
end
-- math
if metadata.math then
@@ -1292,7 +1294,8 @@ function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to
for u, char in next, characters do
local d = descriptions[u]
local m = d.math
- -- we could prepare the variants
+ -- we have them shared because that packs nicer
+ -- we could prepare the variants and keep 'm in descriptions
if m then
local variants = m.horiz_variants
if variants then
@@ -1319,6 +1322,10 @@ function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to
c.vert_variants = m.vert_parts
end
end
+ local kerns = m.kerns
+ if kerns then
+ char.mathkerns = kerns
+ end
end
end
end
@@ -1330,7 +1337,7 @@ function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to
local spaceunits = 500
tfm.units = metadata.units_per_em or 1000
-- we need a runtime lookup because of running from cdrom or zip, brrr
- tfm.filename = input.findbinfile(luatex.filename,"") or luatex.filename
+ tfm.filename = resolvers.findbinfile(luatex.filename,"") or luatex.filename
tfm.fullname = metadata.fontname or metadata.fullname
tfm.encodingbytes = 2
tfm.cidinfo = data.cidinfo
@@ -1456,7 +1463,7 @@ function tfm.read_from_open_type(specification)
end
if filename then
tfmtable.encodingbytes = 2
- tfmtable.filename = input.findbinfile(filename,"") or filename
+ tfmtable.filename = resolvers.findbinfile(filename,"") or filename
tfmtable.fullname = otfdata.metadata.fontname or otfdata.metadata.fullname
local order = otfdata and otfdata.metadata.order2
if order == 0 then
diff --git a/otfl-font-otn.lua b/otfl-font-otn.lua
index 91deb87..c4c42fa 100644
--- a/otfl-font-otn.lua
+++ b/otfl-font-otn.lua
@@ -752,9 +752,6 @@ end
function handlers.gpos_pair(start,kind,lookupname,kerns,sequence)
-- todo: kerns in disc nodes: pre, post, replace -> loop over disc too
-- todo: kerns in components of ligatures
---~ local alreadydone = cursonce and has_attribute(start,curscurs)
-local alreadydone = false
-if not alreadydone then
local snext = start.next
if not snext then
return start, false
@@ -763,7 +760,8 @@ if not alreadydone then
local factor = tfmdata.factor
while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
local nextchar = snext.char
- if marks[nextchar] then
+local krn = kerns[nextchar]
+ if not krn and marks[nextchar] then
prev = snext
snext = snext.next
else
@@ -813,9 +811,6 @@ if not alreadydone then
end
return start, done
end
-else
-return start, false
-end
end
--[[ldx--
@@ -1428,11 +1423,12 @@ function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,cur
local factor = tfmdata.factor
while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
local nextchar = snext.char
- if marks[nextchar] then
+local krn = kerns[nextchar]
+ if not krn and marks[nextchar] then
prev = snext
snext = snext.next
else
- local krn = kerns[nextchar]
+--~ local krn = kerns[nextchar]
if not krn then
-- skip
elseif type(krn) == "table" then
diff --git a/otfl-font-tfm.lua b/otfl-font-tfm.lua
index 1d81602..ab8a4db 100644
--- a/otfl-font-tfm.lua
+++ b/otfl-font-tfm.lua
@@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['font-tfm'] = {
local utf = unicode.utf8
local next, format, match, lower = next, string.format, string.match, string.lower
-local concat, sortedkeys, utfbyte = table.concat, table.sortedkeys, utf.byte
+local concat, sortedkeys, utfbyte, serialize = table.concat, table.sortedkeys, utf.byte, table.serialize
local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
@@ -25,7 +25,7 @@ local trace_scaling = false trackers.register("fonts.scaling" , function(v) tr
fonts = fonts or { }
fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
+fonts.ids = fonts.ids or { }
local tfm = fonts.tfm
@@ -86,7 +86,7 @@ function tfm.read_from_tfm(specification)
tfmdata.descriptions = tfmdata.descriptions or { }
if tfm.resolve_vf then
fonts.logger.save(tfmdata,file.extname(fname),specification) -- strange, why here
- fname = input.findbinfile(specification.name, 'ovf')
+ fname = resolvers.findbinfile(specification.name, 'ovf')
if fname and fname ~= "" then
local vfdata = font.read_vf(fname,specification.size) -- not cached, fast enough
if vfdata then
@@ -219,6 +219,13 @@ function tfm.prepare_base_kerns(tfmdata)
end
end
+-- we can have cache scaled characters when we are in node mode and don't have
+-- protruding and expansion: hash == fullname @ size @ protruding @ expansion
+-- but in practice (except from mk) the otf hash will be enough already so it
+-- makes no sense to mess up the code now
+
+local charactercache = { }
+
function tfm.do_scale(tfmtable, scaledpoints)
tfm.prepare_base_kerns(tfmtable) -- optimalization
if scaledpoints < 0 then
@@ -263,14 +270,6 @@ function tfm.do_scale(tfmtable, scaledpoints)
tp.x_height = (tfmp.x_height or tfmp[5] or 0)*delta
tp.quad = (tfmp.quad or tfmp[6] or 0)*delta
tp.extra_space = (tfmp.extra_space or tfmp[7] or 0)*delta
---~ texio.write_nl("START")
---~ texio.write_nl(tfmtable.designsize)
---~ texio.write_nl(scaledpoints)
---~ texio.write_nl(tfmtable.units)
---~ texio.write_nl(delta)
---~ texio.write_nl(tfmtable.math_parameters.AxisHeight or "?")
--- t.MathConstants = tfm.scaled_math_parameters(tfmtable.math_parameters,delta)
---~ texio.write_nl(t.MathConstants.AxisHeight or "?")
local protrusionfactor = (tp.quad ~= 0 and 1000/tp.quad) or 0
local tc = t.characters
local characters = tfmtable.characters
@@ -361,7 +360,7 @@ function tfm.do_scale(tfmtable, scaledpoints)
if hasquality then
local ve = v.expansion_factor
if ve then
- chr.expansion_factor = ve*1000 -- expansionfactor
+ chr.expansion_factor = ve*1000 -- expansionfactor, hm, can happen elsewhere
end
local vl = v.left_protruding
if vl then
@@ -378,77 +377,76 @@ function tfm.do_scale(tfmtable, scaledpoints)
chr.italic = vi*delta
end
-- to be tested
-if hasmath then
-
- -- todo, just operate on descriptions.math
- local vn = v.next
- if vn then
- chr.next = vn
- else
- local vv = v.vert_variants
- if vv then
- local t = { }
- for i=1,#vv do
- local vvi = vv[i]
- t[i] = {
- ["start"] = (vvi["start"] or 0)*delta,
- ["end"] = (vvi["end"] or 0)*delta,
- ["advance"] = (vvi["advance"] or 0)*delta,
- ["extender"] = vvi["extender"],
- ["glyph"] = vvi["glyph"],
- }
- end
- chr.vert_variants = t
+ if hasmath then
+ -- todo, just operate on descriptions.math
+ local vn = v.next
+ if vn then
+ chr.next = vn
else
- local hv = v.horiz_variants
- if hv then
+ local vv = v.vert_variants
+ if vv then
local t = { }
- for i=1,#hv do
- local hvi = hv[i]
+ for i=1,#vv do
+ local vvi = vv[i]
t[i] = {
- ["start"] = (hvi["start"] or 0)*delta,
- ["end"] = (hvi["end"] or 0)*delta,
- ["advance"] = (hvi["advance"] or 0)*delta,
- ["extender"] = hvi["extender"],
- ["glyph"] = hvi["glyph"],
+ ["start"] = (vvi["start"] or 0)*delta,
+ ["end"] = (vvi["end"] or 0)*delta,
+ ["advance"] = (vvi["advance"] or 0)*delta,
+ ["extender"] = vvi["extender"],
+ ["glyph"] = vvi["glyph"],
}
end
- chr.horiz_variants = t
+ chr.vert_variants = t
+ else
+ local hv = v.horiz_variants
+ if hv then
+ local t = { }
+ for i=1,#hv do
+ local hvi = hv[i]
+ t[i] = {
+ ["start"] = (hvi["start"] or 0)*delta,
+ ["end"] = (hvi["end"] or 0)*delta,
+ ["advance"] = (hvi["advance"] or 0)*delta,
+ ["extender"] = hvi["extender"],
+ ["glyph"] = hvi["glyph"],
+ }
+ end
+ chr.horiz_variants = t
+ end
end
end
- end
- local vt = description.top_accent
- if vt then
- chr.top_accent = delta*vt
- end
- if stackmath then
- local mk = v.mathkerns
- if mk then
- local kerns = { }
- -- for k, v in next, mk do
- -- local kk = { }
- -- for i=1,#v do
- -- local vi = v[i]
- -- kk[i] = { height = delta*vi.height, kern = delta*vi.kern }
- -- end
- -- kerns[k] = kk
- -- end
- local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = delta*vi.height, kern = delta*vi.kern }
- end kerns.top_right = k end
- local v = mk.top_left if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = delta*vi.height, kern = delta*vi.kern }
- end kerns.top_left = k end
- local v = mk.bottom_left if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = delta*vi.height, kern = delta*vi.kern }
- end kerns.bottom_left = k end
- local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = delta*vi.height, kern = delta*vi.kern }
- end kerns.bottom_right = k end
- chr.mathkern = kerns -- singular
+ local vt = description.top_accent
+ if vt then
+ chr.top_accent = delta*vt
+ end
+ if stackmath then
+ local mk = v.mathkerns
+ if mk then
+ local kerns = { }
+ -- for k, v in next, mk do
+ -- local kk = { }
+ -- for i=1,#v do
+ -- local vi = v[i]
+ -- kk[i] = { height = delta*vi.height, kern = delta*vi.kern }
+ -- end
+ -- kerns[k] = kk
+ -- end
+ local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = delta*vi.height, kern = delta*vi.kern }
+ end kerns.top_right = k end
+ local v = mk.top_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = delta*vi.height, kern = delta*vi.kern }
+ end kerns.top_left = k end
+ local v = mk.bottom_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = delta*vi.height, kern = delta*vi.kern }
+ end kerns.bottom_left = k end
+ local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = delta*vi.height, kern = delta*vi.kern }
+ end kerns.bottom_right = k end
+ chr.mathkern = kerns -- singular
+ end
end
end
-end
if not nodemode then
local vk = v.kerns
if vk then
@@ -558,7 +556,7 @@ local lastfont = nil
-- base mode) but it complicates vf building where the new characters
-- demand this data
---~ for id, f in pairs(fonts.ids) do
+--~ for id, f in pairs(fonts.ids) do -- or font.fonts
--~ local ffi = font.fonts[id]
--~ f.characters = ffi.characters
--~ f.kerns = ffi.kerns
@@ -809,5 +807,7 @@ fonts.initializers.node.tfm.remap = tfm.remap
-- status info
statistics.register("fonts load time", function()
- return format("%s seconds",statistics.elapsedtime(fonts))
+ if statistics.elapsedindeed(fonts) then
+ return format("%s seconds",statistics.elapsedtime(fonts))
+ end
end)
diff --git a/otfl-luat-con.lua b/otfl-luat-con.lua
deleted file mode 100644
index e93e920..0000000
--- a/otfl-luat-con.lua
+++ /dev/null
@@ -1,118 +0,0 @@
-if not modules then modules = { } end modules ['luat-loc'] = {
- version = 1.001,
- comment = "companion to luat-lib.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("input.cache", function(v) trace_cache = v end)
-local trace_containers = false trackers.register("input.containers", function(v) trace_containers = v end)
-local trace_storage = false trackers.register("input.storage", function(v) trace_storage = v end)
-local trace_verbose = false trackers.register("input.verbose", function(v) trace_verbose = v end)
-local trace_locating = false trackers.register("input.locating", function(v) trace_locating = v trace_verbose = v end)
-
---[[ldx--
-Once we found ourselves defining similar cache constructs
-several times, containers were introduced. Containers are used
-to collect tables in memory and reuse them when possible based
-on (unique) hashes (to be provided by the calling function).
-
-Caching to disk is disabled by default. Version numbers are
-stored in the saved table which makes it possible to change the
-table structures without bothering about the disk cache.
-
-Examples of usage can be found in the font related code.
---ldx]]--
-
-containers = containers or { }
-
-containers.usecache = true
-
-local function report(container,tag,name)
- if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
- end
-end
-
-local allocated = { }
-
--- tracing
-
-function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
- end
- end
-end
-
-function containers.is_usable(container, name)
- return container.enabled and caches and caches.is_writable(container.path, name)
-end
-
-function containers.is_valid(container, name)
- if name and name ~= "" then
- local storage = container.storage[name]
- return storage and not table.is_empty(storage) and storage.cache_version == container.version
- else
- return false
- end
-end
-
-function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
- report(container,"loaded",name)
- else
- container.storage[name] = nil
- end
- end
- if container.storage[name] then
- report(container,"reusing",name)
- end
- return container.storage[name]
-end
-
-function containers.write(container, name, data)
- if data then
- data.cache_version = container.version
- if container.enabled and caches then
- local unique, shared = data.unique, data.shared
- data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
- report(container,"saved",name)
- data.unique, data.shared = unique, shared
- end
- report(container,"stored",name)
- container.storage[name] = data
- end
- return data
-end
-
-function containers.content(container,name)
- return container.storage[name]
-end
diff --git a/otfl-luat-dum.lua b/otfl-luat-dum.lua
index 5c53115..4d7d9c5 100644
--- a/otfl-luat-dum.lua
+++ b/otfl-luat-dum.lua
@@ -32,12 +32,11 @@ tasks = {
prependaction = dummyfunction,
}
-
-- we need to cheat a bit here
texconfig.kpse_init = true
-input = { } -- no fancy file helpers used
+resolvers = resolvers or { } -- no fancy file helpers used
local remapper = {
otf = "opentype fonts",
@@ -45,14 +44,14 @@ local remapper = {
ttc = "truetype fonts"
}
-function input.find_file(name,kind)
- name = name:gsub("\\","\/")
+function resolvers.find_file(name,kind)
+ name = string.gsub(name,"\\","\/")
return kpse.find_file(name,(kind ~= "" and kind) or "tex")
end
-function input.findbinfile(name,kind)
+function resolvers.findbinfile(name,kind)
if not kind or kind == "" then
kind = file.extname(name) -- string.match(name,"%.([^%.]-)$")
end
- return input.find_file(name,(kind and remapper[kind]) or kind)
+ return resolvers.find_file(name,(kind and remapper[kind]) or kind)
end
diff --git a/otfl-node-inj.lua b/otfl-node-inj.lua
index 6fd93fa..6ba21b3 100644
--- a/otfl-node-inj.lua
+++ b/otfl-node-inj.lua
@@ -166,6 +166,8 @@ function nodes.trace_injection(head)
report("end run")
end
+-- todo: reuse tables (i.e. no collection), but will be extra fields anyway
+
function nodes.inject_kerns(head,tail,keep)
if trace_injections then
nodes.trace_injection(head)
--
cgit v1.2.3