>From 289f7e85fd2048716f411d0730bb5787f2b56b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 12 Dec 2019 13:52:53 +0100 Subject: [PATCH] Add `nocache` parameter for font.getfont --- manual/luatex-fonts.tex | 6 ++++-- source/texk/web2c/luatexdir/font/luafont.c | 6 +++--- source/texk/web2c/luatexdir/lua/lfontlib.c | 7 ++++--- source/texk/web2c/luatexdir/lua/luatex-api.h | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manual/luatex-fonts.tex b/manual/luatex-fonts.tex index e5b6e1cb2..5eeec2034 100644 --- a/manual/luatex-fonts.tex +++ b/manual/luatex-fonts.tex @@ -722,13 +722,15 @@ below for the \type {font.each} iterator. The two metatable functions implementing the virtual array are: \startfunctioncall - f = font.getfont( n) +
f = font.getfont([ nocache, ] n) font.setfont( n,
f) \stopfunctioncall Note that at the moment, each access to the \type {font.fonts} or call to \type {font.getfont} creates a \LUA\ table for the whole font unless you cached it. -This process can be quite slow. +This process can be quite slow. If the optional nocache parameter is set to +\type {true} for \type {font.getfont}, a new table will be created even if a +cached table exists. \startfunctioncall
p = font.getparameters( n) diff --git a/source/texk/web2c/luatexdir/font/luafont.c b/source/texk/web2c/luatexdir/font/luafont.c index 14efbf8a7..1d31847e5 100644 --- a/source/texk/web2c/luatexdir/font/luafont.c +++ b/source/texk/web2c/luatexdir/font/luafont.c @@ -432,11 +432,11 @@ static void write_lua_math_parameters(lua_State * L, int f) lua_rawset(L, -3); } -int font_to_lua(lua_State * L, int f) +int font_to_lua(lua_State * L, int f, boolean bypass_cache) { int k; charinfo *co; - if (font_cache_id(f) > 0) { + if (!bypass_cache && font_cache_id(f) > 0) { /*tex Fetch the table from the registry if it was saved there by |font_from_lua|. */ lua_rawgeti(L, LUA_REGISTRYINDEX, font_cache_id(f)); return 1; @@ -523,7 +523,7 @@ int font_to_lua(lua_State * L, int f) } } lua_rawset(L, -3); - if (font_cache_id(f) == 0) { + if (!bypass_cache && font_cache_id(f) == 0) { /*tex Renew the cache. */ int r; lua_pushvalue(L, -1); diff --git a/source/texk/web2c/luatexdir/lua/lfontlib.c b/source/texk/web2c/luatexdir/lua/lfontlib.c index b3ac2aa53..392f3ca77 100644 --- a/source/texk/web2c/luatexdir/lua/lfontlib.c +++ b/source/texk/web2c/luatexdir/lua/lfontlib.c @@ -44,7 +44,7 @@ static int font_read_tfm(lua_State * L) if (strlen(cnom)) { internal_font_number f = get_fontid(); if (read_tfm_info(f, cnom, s)) { - int k = font_to_lua(L, f); + int k = font_to_lua(L, f, false); delete_font(f); return k; } else { @@ -118,7 +118,7 @@ static int tex_each_font_next(lua_State * L) return 1; } else { lua_pushinteger(L, i); - if (!font_to_lua(L, i)) + if (!font_to_lua(L, i, false)) lua_pushnil(L); return 2; } @@ -250,8 +250,9 @@ static int nextfontid(lua_State * L) static int getfont(lua_State * L) { + boolean bypass_cache = lua_gettop(L) == 2 && lua_toboolean(L, -2); int i = luaL_checkinteger(L, -1); - if (i && is_valid_font(i) && font_to_lua(L, i)) + if (i && is_valid_font(i) && font_to_lua(L, i, bypass_cache)) return 1; lua_pushnil(L); return 1; diff --git a/source/texk/web2c/luatexdir/lua/luatex-api.h b/source/texk/web2c/luatexdir/lua/luatex-api.h index bebf088af..44b765f62 100644 --- a/source/texk/web2c/luatexdir/lua/luatex-api.h +++ b/source/texk/web2c/luatexdir/lua/luatex-api.h @@ -155,7 +155,7 @@ extern int luaopen_stats(lua_State * L); extern int luaopen_font(lua_State * L); extern int luaopen_vf(lua_State * L); extern int font_parameters_to_lua(lua_State * L, int f); -extern int font_to_lua(lua_State * L, int f); +extern int font_to_lua(lua_State * L, int f, int bypass_cache); /* third arg is boolean */ extern int font_from_lua(lua_State * L, int f); /* return is boolean */ extern int characters_from_lua(lua_State * L, int f); /* return is boolean */ -- 2.24.1