From 9010a8546ee30db8fb7ab61c0862105ab12c8c49 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 31 May 2013 14:23:29 +0200 Subject: reorganize db record structure --- luaotfload-database.lua | 85 +++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/luaotfload-database.lua b/luaotfload-database.lua index d5e2a7b..150d30d 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -74,7 +74,7 @@ fonts.definers = fonts.definers or { } local names = fonts.names -names.version = 2.205 +names.version = 2.206 names.data = nil --- contains the loaded database names.lookups = nil --- contains the lookup cache names.path = { @@ -165,9 +165,10 @@ This is a sketch of the luaotfload db: texmf : bool; weight : int; width : int; - units_per_em : int; // mainly 1000, but also 2048 or 256 + units_per_em : int; // mainly 1000, but also 2048 or 256 } - and filestatus = (fullname, { index : int list; timestamp : int }) dict + and filestatus = (fullname, + { index : int list; timestamp : int }) dict beware that this is a reconstruction and may be incomplete. @@ -517,13 +518,22 @@ Existence of the resolved file name is verified differently depending on whether the index entry has a texmf flag set. --doc]]-- -local is_file = function (filename, texmf) - if texmf == true then - return kpselookup(filename) +local get_font_file = function (fullnames, entry) + if entry.texmf == true then + local basename = entry.basename + if kpselookup(basename) then + return true, basename, entry.subfont + end + else + local fullname = fullnames[entry.index] + if lfsisfile(fullname) then + return true, fullname, entry.subfont + end end - return lfsisfile(filename) + return false end + --[[doc-- Luatex-fonts, the font-loader package luaotfload imports, comes with @@ -688,13 +698,13 @@ resolve = function (_,_,specification) -- the 1st two parameters are used by Con if #found == 1 then --- “found” is really synonymous with “registered in the db”. local entry = found[1] - local filename = entry.filename[1] - if is_file(filename, entry.texmf) then + local success, filename, subfont = get_font_file(data.filenames.full, entry) + if success == true then report("log", 0, "resolve", "font family='%s', subfamily='%s' found: %s", name, style, filename ) - return filename, entry.filename[2], true + return filename, subfont, true end elseif #found > 1 then -- we found matching font(s) but not in the requested optical @@ -710,13 +720,13 @@ resolve = function (_,_,specification) -- the 1st two parameters are used by Con least = difference end end - local filename = closest.filename[1] - if is_file(filename, closest.texmf) then + local success, filename, subfont = get_font_file(data.filenames.full, closest) + if success == true then report("log", 0, "resolve", "font family='%s', subfamily='%s' found: %s", name, style, filename ) - return filename, closest.filename[2], true + return filename, subfont, true end elseif found.fallback then return found.fallback.filename[1], @@ -725,13 +735,13 @@ resolve = function (_,_,specification) -- the 1st two parameters are used by Con elseif next(candidates) then --- pick the first candidate encountered local entry = candidates[1] - local filename = entry.filename[1] - if is_file(filename, entry.texmf) then + local success, filename, subfont = get_font_file(data.filenames.full, entry) + if success == true then report("log", 0, "resolve", "font family='%s', subfamily='%s' found: %s", name, style, filename ) - return filename, entry.filename[2], true + return filename, subfont, true end end @@ -927,13 +937,6 @@ font_fullinfo = function (filename, subfont, texmf, basename) tfmdata.fontname = metadata.fontname tfmdata.fullname = metadata.fullname tfmdata.familyname = metadata.familyname - if texmf == true then --- ugh, ugliness levels peaking here - tfmdata.filename = { basename, subfont } - tfmdata.texmf = true - else - tfmdata.filename = { filename, subfont } - tfmdata.texmf = false - end tfmdata.weight = metadata.pfminfo.weight tfmdata.width = metadata.pfminfo.width tfmdata.slant = metadata.italicangle @@ -946,6 +949,13 @@ font_fullinfo = function (filename, subfont, texmf, basename) metadata.design_range_top ~= 0 and metadata.design_range_top or nil, metadata.design_range_bottom ~= 0 and metadata.design_range_bottom or nil, } + + --- file location data (used to be filename field) + tfmdata.filename = filename --> sys + tfmdata.basename = basename --> texmf + tfmdata.texmf = texmf or false + tfmdata.subfont = subfont + return tfmdata end @@ -1489,15 +1499,21 @@ local gen_fast_lookups = function (fontnames) for idx = 1, nmappings do local entry = mappings[idx] - local filename = entry.filename[1] + local filename = entry.filename + local basename = entry.basename + local bare = filenameonly(filename) + local subfont = entry.subfont + + entry.index = idx +--- unfortunately, the sys/texmf schism prevents us from +--- doing away the full name, so we cannot avoid the +--- substantial duplication +-- entry.filename = nil + if entry.texmf == true then - bare = filenameonly(filename) - texmf[#texmf+1] = { idx, filename, bare, true, nil } + texmf[#texmf+1] = { idx, basename, bare, true, nil } else - --- filename contains full path - base = filebasename(filename) - bare = filenameonly(filename) - sys[#sys+1] = { idx, base, bare, false, filename } + sys[#sys+1] = { idx, basename, bare, false, filename } end end @@ -1587,11 +1603,10 @@ update_names = function (fontnames, force, dry_run) n_scanned = n_scanned + scanned n_new = n_new + new - if force or n_new > 0 then - newfontnames = gen_fast_lookups(newfontnames) - else - newfontnames.filenames = fontnames.filenames - end + --- we always generate the file lookup tables because + --- non-texmf entries are redirected there and the mapping + --- needs to be 100% consistent + newfontnames = gen_fast_lookups(newfontnames) --- stats: --- before rewrite | after rewrite -- cgit v1.2.3