From d26a285e185facdfdbbf7aa52a485663f3036c21 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 16 May 2013 14:17:12 +0200 Subject: add functions for retrieving information about loaded fonts --- luaotfload-auxiliary.lua | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'luaotfload-auxiliary.lua') diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index dde5686..c8f1299 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -484,6 +484,8 @@ aux.sprint_math_dimension = sprint_math_dimension local namesresolve = fonts.names.resolve local namesscan_dir = fonts.names.scan_dir +--- local directories ------------------------------------------------- + --- migrated from luaotfload-database.lua --- https://github.com/lualatex/luaotfload/pull/61#issuecomment-17776975 @@ -506,6 +508,8 @@ end aux.scan_external_dir = scan_external_dir +--- db queries -------------------------------------------------------- + --- https://github.com/lualatex/luaotfload/issues/74 --- string -> (string * int) local resolve_fontname = function (name) @@ -542,4 +546,72 @@ end aux.resolve_fontlist = resolve_fontlist +--- loaded fonts ------------------------------------------------------ + +--- just a proof of concept + +--- fontobj -> string list -> (string list) list +local get_font_data get_font_data = function (tfmdata, keys, acc, n) + if not acc then + return get_font_data(tfmdata, keys, {}, 1) + end + local key = keys[n] + if key then + local val = tfmdata[key] + if val then + acc[#acc+1] = val + else + acc[#acc+1] = false + end + return get_font_data(tfmdata, keys, acc, n+1) + end + return acc +end + +--[[doc-- + + The next one operates on the fonts.hashes.identifiers table. + It returns a list containing tuples of font ids and the + contents of the fields specified in the first argument. + Font table entries that were created indirectly -- e.g. by + \letterspacefont or during font expansion -- will not be + listed. + +--doc]]-- + +local default_keys = { "fullname" } + +--- string list -> (int * string list) list +local get_loaded_fonts get_loaded_fonts = function (keys, acc, lastid) + if not acc then + if not keys then + keys = default_keys + end + return get_loaded_fonts(keys, {}, lastid) + end + local id, tfmdata = next(identifiers, lastid) + if id then + local data = get_font_data(tfmdata, keys) + acc[#acc+1] = { id, data } + return get_loaded_fonts (keys, acc, id) + end + return acc +end + +aux.get_loaded_fonts = get_loaded_fonts + +--- Raw access to the font.* namespace is unsafe so no documentation on +--- this one. +local get_raw_fonts = function ( ) + local res = { } + for i, v in font.each() do + if v.filename then + res[#res+1] = { i, v } + end + end + return res +end + +aux.get_raw_fonts = get_raw_fonts + -- vim:tw=71:sw=2:ts=2:expandtab -- cgit v1.2.3 From 52711d3284f2d0de886fc3ab2d693a2ad69589d7 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 16 May 2013 15:56:00 +0200 Subject: add unsafe glyph checker --- luaotfload-auxiliary.lua | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'luaotfload-auxiliary.lua') diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index c8f1299..f0d5a04 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -230,6 +230,8 @@ luatexbase.add_to_callback( --- glyphs ----------------------------------------------------------------------- +local agl = fonts.encodings.agl + --- int -> int -> bool local font_has_glyph = function (font_id, codepoint) local fontdata = fonts.hashes.identifiers[font_id] @@ -241,6 +243,20 @@ end aux.font_has_glyph = font_has_glyph +--- undocumented + +local raw_slot_of_name = function (font_id, glyphname) + local fontdata = font.fonts[font_id] + if fontdata.type == "virtual" then --- get base font for glyph idx + local codepoint = agl.unicodes[glyphname] + local glyph = fontdata.characters[codepoint] + if fontdata.characters[codepoint] then + return codepoint + end + end + return false +end + --[[doc-- This one is approximately “name_to_slot” from the microtype package; @@ -249,10 +265,14 @@ aux.font_has_glyph = font_has_glyph http://www.adobe.com/devnet/opentype/archives/glyph.html + The “unsafe” switch triggers a fallback lookup in the raw fonts + table. As some of the information is stored as references, this may + have unpredictable side-effects. + --doc]]-- ---- int -> string -> (int | false) -local slot_of_name = function (font_id, glyphname) +--- int -> string -> bool -> (int | false) +local slot_of_name = function (font_id, glyphname, unsafe) local fontdata = identifiers[font_id] if fontdata then local unicode = fontdata.resources.unicodes[glyphname] @@ -261,6 +281,8 @@ local slot_of_name = function (font_id, glyphname) else return unicode[1] --- for multiple components end + elseif unsafe == true then -- for Robert + return raw_slot_of_name(font_id, glyphname) end return false end @@ -283,7 +305,7 @@ local indices --- int -> (string | false) local name_of_slot = function (codepoint) if not indices then --- this will load the glyph list - local unicodes = fonts.encodings.agl.unicodes + local unicodes = agl.unicodes indices = table.swapped(unicodes) end local glyphname = indices[codepoint] -- cgit v1.2.3 From ee4c3dd630ae4228b5e222f7099055e327785f97 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 16 May 2013 20:32:10 +0200 Subject: fix behavior of ``aux.slot_of_name()`` for missing glyphs spotted by Robert --- luaotfload-auxiliary.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'luaotfload-auxiliary.lua') diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index f0d5a04..64fac90 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -276,10 +276,14 @@ local slot_of_name = function (font_id, glyphname, unsafe) local fontdata = identifiers[font_id] if fontdata then local unicode = fontdata.resources.unicodes[glyphname] - if unicode and type(unicode) == "number" then - return unicode - else - return unicode[1] --- for multiple components + if unicode then + if type(unicode) == "number" then + return unicode + else + return unicode[1] --- for multiple components + end +-- else +-- --- missing end elseif unsafe == true then -- for Robert return raw_slot_of_name(font_id, glyphname) -- cgit v1.2.3 From ad95948e09bde3357faf57b6b13e63ae74fe60bb Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 17 May 2013 14:56:59 +0200 Subject: load character data on demand --- luaotfload-auxiliary.lua | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'luaotfload-auxiliary.lua') diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index 64fac90..1a48914 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -26,6 +26,9 @@ local identifiers = fonts.hashes.identifiers local fontid = font.id local texsprint = tex.sprint +local dofile = dofile +local getmetatable = getmetatable +local setmetatable = setmetatable local utf8 = unicode.utf8 local stringlower = string.lower local stringformat = string.format @@ -227,7 +230,7 @@ luatexbase.add_to_callback( "luaotfload.aux.set_capheight") ----------------------------------------------------------------------- ---- glyphs +--- glyphs and characters ----------------------------------------------------------------------- local agl = fonts.encodings.agl @@ -321,6 +324,43 @@ end aux.name_of_slot = name_of_slot +--[[doc-- + + In Context, characters.data is where the data from char-def.lua + resides. The file is huge (>3.7 MB as of 2013) and not part of the + isolated font loader. Nevertheless, we include a partial version + generated by the mkcharacters script that contains only the + “direction” and “mirror” fields of each character defined. + +--doc]]-- + +characters = characters or { } --- should be created in basics-gen +characters.data = { } +local chardef = "luaotfload-characters" + +do + local chardata + local index = function (t, k) + if chardata == nil then + log("Loading character metadata from %s.", chardef) + chardata = dofile(kpse.find_file("luaotfload-characters.lua")) + if chardata == nil then + warning("Could not load %s; continuing with empty character table.", + chardef) + chardata = { } + end + end + return chardata[k] + end + + local mt = getmetatable(characters.data) + if mt then + mt.__index = index + else + setmetatable(characters.data, { __index = index }) + end +end + ----------------------------------------------------------------------- --- features / scripts / languages ----------------------------------------------------------------------- -- cgit v1.2.3 From aceb8a22bd3e7c53de492d3e806ae265942ccfa6 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 17 May 2013 15:39:51 +0200 Subject: add ``get_quad()`` --- luaotfload-auxiliary.lua | 52 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) (limited to 'luaotfload-auxiliary.lua') diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index 1a48914..2bfcbf0 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -21,7 +21,8 @@ config.luaotfload = config.luaotfload or { } local aux = luaotfload.aux local log = luaotfload.log local warning = luaotfload.log -local identifiers = fonts.hashes.identifiers +local fonthashes = fonts.hashes +local identifiers = fonthashes.identifiers local fontid = font.id local texsprint = tex.sprint @@ -680,4 +681,53 @@ end aux.get_raw_fonts = get_raw_fonts +----------------------------------------------------------------------- +--- font parameters +----------------------------------------------------------------------- +--- analogy of font-hsh + +fonthashes.parameters = fonthashes.parameters or { } +fonthashes.quads = fonthashes.quads or { } + +local parameters = fonthashes.parameters or { } +local quads = fonthashes.quads or { } + +setmetatable(parameters, { __index = function (t, font_id) + local tfmdata = identifiers[font_id] + if not tfmdata then --- unsafe; avoid + tfmdata = font.fonts[font_id] + end + if tfmdata and type(tfmdata) == "table" then + local fontparameters = tfmdata.parameters + t[font_id] = fontparameters + return fontparameters + end + return nil +end}) + +--[[doc-- + + Note that the reason as to why we prefer functions over table indices + is that functions are much safer against unintended manipulation. + This justifies the overhead they cost. + +--doc]]-- + +--- int -> (number | false) +local get_quad = function (font_id) + local quad = quads[font_id] + if quad then + return quad + end + local fontparameters = parameters[font_id] + if fontparameters then + local quad = fontparameters.quad or 0 + quads[font_id] = quad + return quad + end + return false +end + +aux.get_quad = get_quad + -- vim:tw=71:sw=2:ts=2:expandtab -- cgit v1.2.3