From fe0fde65f066d5e9a107a26eaec8fdbfe195f92e Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Fri, 26 Feb 2010 15:04:49 +0200 Subject: Checksum loaded fonts Store checksums of already loaded fonts in the database to avoids reloading them, this isn't much faster but it avoids reloading the fonts and the huge memory consumption. Is there a faster way to hash a file? --- luaotfload-fonts.lua | 41 ++++++++++++++++++++++++++++++++--------- otfl-font-dum.lua | 2 +- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/luaotfload-fonts.lua b/luaotfload-fonts.lua index a24b6c2..cca4f28 100644 --- a/luaotfload-fonts.lua +++ b/luaotfload-fonts.lua @@ -30,6 +30,10 @@ dofile(luaextra_file) local splitpath, expandpath, glob, basename = file.split_path, kpse.expand_path, dir.glob, file.basename local upper, format, rep = string.upper, string.format, string.rep +function kpse.do_file(name) + return dofile(kpse.find_file(name)) +end + -- the file name of the font database luaotfload.fonts.basename = "otfl-names.lua" @@ -42,7 +46,7 @@ luaotfload.fonts.directory = kpse.expand_var("$TEXMFVAR") .. luaotfload.fonts.su -- the version of the database, to be checked by the lookup function of -- luaotfload -luaotfload.fonts.version = 2.002 +luaotfload.fonts.version = 2.003 -- Log facilities: -- - level 0 is quiet @@ -126,10 +130,17 @@ function fontloader.fullinfo(...) end local function load_font(filename, names, texmf) - log(3, "Loading font %s", filename) - local mappings = names.mappings - local families = names.families + log(3, "Loading font: %s", filename) + local mappings = names.mappings or { } + local families = names.families or { } + local checksums = names.checksums or { } if filename then + local checksum = file.checksum(filename) + if checksums[checksum] then + log(3, "Font already indexed: %s", filename) + return + end + checksums[checksum] = 1 local info = fontloader.info(filename) if info then if type(info) == "table" and #info > 1 then @@ -166,6 +177,9 @@ local function load_font(filename, names, texmf) else log(1, "Failed to load %s", filename) end + names.mappings = names.mappings or mappings + names.families = names.families or families + names.checksums = names.checksums or checksums end end @@ -307,14 +321,23 @@ local function scan_os_fonts(names, scanned_fonts) end end +local function fontnames_init() + return { + mappings = { }, + families = { }, + checksums = { }, + version = luaotfload.fonts.version, + } +end + -- The main function, scans everything and writes the file. local function generate() texio.write("luaotfload | Generating font names database.") - local fnames = { - mappings = { }, - families = { }, - version = luaotfload.fonts.version, - } + local fnames = kpse.do_file(luaotfload.fonts.basename) or fontnames_init() + if fnames.version ~= luaotfload.fonts.version then + log(2, "Old font names database version, generating new one") + fnames = fontnames_init() + end local savepath = luaotfload.fonts.directory savepath = path_normalize(savepath) if not lfs.isdir(savepath) then diff --git a/otfl-font-dum.lua b/otfl-font-dum.lua index 5b83b3b..5c0d1ed 100644 --- a/otfl-font-dum.lua +++ b/otfl-font-dum.lua @@ -48,7 +48,7 @@ end fonts.names = fonts.names or { } -fonts.names.version = 2.002 -- not the same as in context +fonts.names.version = 2.003 -- not the same as in context fonts.names.basename = "otfl-names.lua" fonts.names.new_to_old = { } fonts.names.old_to_new = { } -- cgit v1.2.3