summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Gesang <phg42.2a@gmail.com>2013-04-29 14:52:53 +0200
committerPhilipp Gesang <phg42.2a@gmail.com>2013-04-29 14:52:53 +0200
commite79f34d859d48be485589f19fc6905afa5872a53 (patch)
tree1ac9aacf0256dd3bc89785a669a5f5d32d912670
parent19164c39c9f98d9e51a13d5d698f575879f3dfee (diff)
downloadluaotfload-e79f34d859d48be485589f19fc6905afa5872a53.tar.gz
only cache ``name:`` lookups
-rw-r--r--luaotfload-database.lua72
-rw-r--r--luaotfload-features.lua3
-rw-r--r--luaotfload.dtx18
-rw-r--r--tests/pln-request-5-cached.tex3
4 files changed, 32 insertions, 64 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua
index 4aa966a..abf06a2 100644
--- a/luaotfload-database.lua
+++ b/luaotfload-database.lua
@@ -240,6 +240,7 @@ local load_names
local read_fonts_conf
local reload_db
local resolve
+local resolve_cached
local save_names
local scan_external_dir
local update_names
@@ -380,22 +381,6 @@ TODO:
9) ???
n) PROFIT!!!
---doc]]--
-
---- the resolver is called after the font request is parsed
---- this is where we insert the cache
-local normal_resolver = fonts.definers.resolve
-local dummy_resolver = function (specification)
- --- this ensures that the db is always loaded
- --- before a lookup occurs
- if not names.data then names.data = load_names() end
- --inspect(specification)
- local resolved = normal_resolver(specification)
- --inspect(resolved)
- return resolved
-end
-
---[[doc--
The name lookup requires both the “name” and some other
keys, so we’ll concatenate them.
The spec is modified in place (ugh), so we’ll have to catalogue what
@@ -428,33 +413,29 @@ We’ll just cache a deep copy of the entire spec as it leaves the
resolver, lest we want to worry if we caught all the details.
--doc]]--
---- spec -> spec
-local cached_resolver = function (specification)
+--- 'a -> 'a -> table -> (string * int|boolean * boolean)
+resolve_cached = function (_, _, specification)
if not names.data then names.data = load_names() end
local request_cache = names.data.request_cache
local request = specification.specification
- report("log", 4, "cache",
- "looking for “%s” in cache ...",
+ report("log", 4, "cache", "looking for “%s” in cache ...",
request)
+
local found = names.data.request_cache[request]
+
+ --- case 1) cache positive ----------------------------------------
if found then --- replay fields from cache hit
report("info", 4, "cache", "found!")
- for i=1, #cache_fields do
- local f = cache_fields[i]
- if found[f] then specification[f] = found[f] end
- end
- return specification
+ return found[1], found[2], true
end
report("log", 4, "cache", "not cached; resolving")
+ --- case 2) cache negative ----------------------------------------
--- first we resolve normally ...
- local resolved_spec = normal_resolver(specification)
- --- ... then we add the fields to the cache
- local entry = { }
- for i=1, #cache_fields do
- local f = cache_fields[i]
- entry[f] = resolved_spec[f]
- end
+ local filename, subfont, success = resolve(nil, nil, specification)
+ if not success then return filename, subfont, false end
+ --- ... then we add the fields to the cache ... ...
+ local entry = { filename, subfont }
report("log", 4, "cache", "new entry: %s", request)
names.data.request_cache[request] = entry
@@ -463,21 +444,13 @@ local cached_resolver = function (specification)
--- whenever the cache is updated.
--- TODO this should trigger a save only once the
--- document is compiled (finish_pdffile callback?)
+ --- TODO we should speed up writing by separating
+ --- the cache from the db
report("log", 5, "cache", "saving updated cache")
save_names()
- return resolved_spec
+ return filename, subfont, true
end
-local resolvers = {
- dummy = dummy_resolver,
- normal = normal_resolver,
- cached = cached_resolver,
-}
-
-fonts.definers.resolve = resolvers[config.luaotfload.resolver]
---fonts.definers.resolve = resolvers.cached
---fonts.definers.resolve = resolvers.dummy
-
--[[doc--
Luatex-fonts, the font-loader package luaotfload imports, comes with
@@ -1390,9 +1363,16 @@ names.update = update_names
names.crude_file_lookup = crude_file_lookup
names.crude_file_lookup_verbose = crude_file_lookup_verbose
-names.resolve = resolve --- replace the resolver from luatex-fonts
-names.resolvespec = resolve
-names.find_closest = find_closest
+--- replace the resolver from luatex-fonts
+if config.luaotfload.resolver == "cached" then
+ report("info", 0, "cache", "caching of name: lookups active")
+ names.resolve = resolve_cached
+ names.resolvespec = resolve_cached
+else
+ names.resolve = resolve
+ names.resolvespec = resolve
+end
+names.find_closest = find_closest
--- dummy required by luatex-fonts (cf. luatex-fonts-syn.lua)
diff --git a/luaotfload-features.lua b/luaotfload-features.lua
index b11bf22..6cbfdf4 100644
--- a/luaotfload-features.lua
+++ b/luaotfload-features.lua
@@ -416,7 +416,8 @@ local font_request = Ct(path_lookup * (colon^-1 * features)^-1
local import_values = {
--- That’s what the 1.x parser did, not quite as graciously,
--- with an array of branch expressions.
- "style", "optsize", "lookup", "sub" --[[‽]], "mode",
+ -- "style", "optsize",--> from slashed notation; handled otherwise
+ "lookup", "sub" --[[‽]], "mode",
}
local lookup_types = { "anon", "file", "name", "path" }
diff --git a/luaotfload.dtx b/luaotfload.dtx
index abc737c..6392c64 100644
--- a/luaotfload.dtx
+++ b/luaotfload.dtx
@@ -540,8 +540,8 @@ and the derived files
% \end{quote}
%
% \noindent
-% If style modifiers are present (\XETEX style), they must precede \meta{font
-% features}.
+% If style modifiers are present (\XETEX style), they must precede
+% \meta{font features}.
%
% The element \meta{font features} is a semicolon-separated list of feature
% tags\footnote{%
@@ -1532,19 +1532,6 @@ loadmodule"database.lua" --- “font-nms”
loadmodule"colors.lua" --- “font-clr”
% \end{macrocode}
-% This hack makes fonts called with file method found by fonts.names.resolve
-% instead of just trying to find them with \identifier{kpse}.
-% It is necessary in cases when font files are not reachable by
-% \identifier{kpse} but present in the database, a quite common case
-% under Linux.
-%
-% As of 2013-04-24 we have a workaround in the resolver that handles
-% \verb|file:| lookups diverted this way.
-% It requires some overhead due to additional extra data saved in the
-% names database, and might vanish entirely once the font request syntax
-% is understood.
-% Until then it is considered a kludge, like the hack below.
-%
% Relying on the \verb|name:| resolver for everything has been the source
% of permanent trouble with the database.
% With the introduction of the new syntax parser we now have enough
@@ -1715,7 +1702,6 @@ local patch_defined_font = function (specification, size, id)
if type(tfmdata) == "table" then
call_callback("luaotfload.patch_font", tfmdata)
end
- -- inspect(table.keys(tfmdata))
return tfmdata
end
diff --git a/tests/pln-request-5-cached.tex b/tests/pln-request-5-cached.tex
index 437b20d..8ba4a5e 100644
--- a/tests/pln-request-5-cached.tex
+++ b/tests/pln-request-5-cached.tex
@@ -1,6 +1,7 @@
\ifdefined\directlua
\directlua{config = config or { luaotfload = { } }
- config.luaotfload.resolver = "cached" }
+ config.luaotfload.resolver = "cached"
+ config.luaotfload.loglevel = 5 }
\input luaotfload.sty
\fi