From 40d45da8c22aa1699c3b62989eb881e5e2c67467 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 29 Jan 2017 19:46:29 +0100 Subject: [db] move design size handling into lookup Store design sizes in sp in index. Lookups are performed using sp so the design size factor can be applied at runtime. --- src/luaotfload-database.lua | 89 +++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/luaotfload-database.lua b/src/luaotfload-database.lua index 14fe4b3..66755d3 100644 --- a/src/luaotfload-database.lua +++ b/src/luaotfload-database.lua @@ -111,7 +111,7 @@ if not modules then modules = { } end modules ['luaotfload-database'] = { --doc]]-- local lpeg = require "lpeg" -local P, Cc, lpegmatch = lpeg.P, lpeg.Cc, lpeg.match +local P, lpegmatch = lpeg.P, lpeg.match local log = luaotfload.log local logreport = log and log.report or print -- overriden later on @@ -890,8 +890,9 @@ end --[[doc-- - choose_size -- Pick a font face of appropriate size from the list - of family members with matching style. There are three categories: + choose_size -- Pick a font face of appropriate size (in sp) from + the list of family members with matching style. There are three + categories: 1. exact matches: if there is a face whose design size equals the asked size, it is returned immediately and no further @@ -1041,6 +1042,35 @@ local lookup_fontname = function (specification, name, style) return nil, nil end +local design_size_dimension +local set_size_dimension +do + + --- cf. TeXbook p. 57 + local dimens = { + pt = function (v) return v end, + bp = function (v) return (v * 7200) / 7227 end, + dd = function (v) return (v * 1157) / 1238 end, + } + + design_size_dimension = dimens.bp + + set_size_dimension = function (dim) + local f = dimens [dim] + if f then + logreport ("both", 4, "db", + "Interpreting design sizes as %q, factor %.6f.", + dim, f (1.000000)) + design_size_dimension = f + return + end + logreport ("both", 0, "db", + "Invalid dimension %q requested for design sizes; \z + ignoring.") + end +end + + --[[doc-- lookup_font_name -- Perform a name: lookup. This first queries the @@ -1098,15 +1128,14 @@ lookup_font_name = function (specification) local askedsize = specification.optsize if askedsize then - askedsize = tonumber (askedsize) + askedsize = tonumber (askedsize) * 65536 else askedsize = specification.size - if askedsize and askedsize >= 0 then - askedsize = askedsize / 65536 - else + if not askedsize or askedsize < 0 then askedsize = 0 end end + askedsize = design_size_dimension (askedsize) resolved, subfont = lookup_familyname (specification, name, @@ -1321,35 +1350,7 @@ local load_font_file = function (filename, subfont) return ret end -local set_size_dimension -local get_size_info -do --- too many upvalues :/ - --- cf. TeXbook p. 57 - local dimens = { - pt = function (v) return v end, - bp = function (v) return (v * 7200.0) / 7227.0 end, - dd = function (v) return (v * 1157.0) / 1238.0 end, - } - - local dimen_pt = 1 - local dimen_bp = 2 - local dimen_dd = 3 - - local size_dimen = dimens.bp - set_size_dimension = function (dim) - local f = dimens [dim] - if f then - logreport ("both", 4, "db", - "Interpreting design sizes as %q, factor %.6f.", - dim, f (1.000000)) - size_dimen = f - return - end - logreport ("both", 0, "db", - "Invalid dimension %q requested for design sizes; \z - ignoring.") - end - +local get_size_info do --- too many upvalues :/ --- rawdata -> (int * int * int | bool) get_size_info = function (rawinfo) @@ -1362,13 +1363,13 @@ do --- too many upvalues :/ or design_range_top ~= 0 and design_range_top if fallback_size then - design_size = (design_size or fallback_size) / 10 - design_range_top = (design_range_top or fallback_size) / 10 - design_range_bottom = (design_range_bottom or fallback_size) / 10 + design_size = ((design_size or fallback_size) * 2^16) / 10 + design_range_top = ((design_range_top or fallback_size) * 2^16) / 10 + design_range_bottom = ((design_range_bottom or fallback_size) * 2^16) / 10 - design_size = size_dimen (design_size ) - design_range_top = size_dimen (design_range_top ) - design_range_bottom = size_dimen (design_range_bottom) + design_size = (design_size * 7200) / 7227 + design_range_top = (design_range_top * 7200) / 7227 + design_range_bottom = (design_range_bottom * 7200) / 7227 return { design_size, design_range_top, design_range_bottom, @@ -1947,7 +1948,7 @@ local create_blacklist = function (blacklist, whitelist) if p_blacklist == nil then --- always return false - p_blacklist = Cc(false) + p_blacklist = lpeg.Cc(false) end return result @@ -3634,7 +3635,7 @@ return { fonts.definers = fonts.definers or { resolvers = { } } names.blacklist = blacklist - names.version = 3 --- increase monotonically + names.version = 4 --- increase monotonically names.data = nil --- contains the loaded database names.lookups = nil --- contains the lookup cache -- cgit v1.2.3