From 4ef16976a192abb9bfe2bdc5144a994bc0d61e7b Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 19 Apr 2016 20:02:33 +0200 Subject: [features] do not attempt to add features on incomplete fonts --- src/luaotfload-features.lua | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/luaotfload-features.lua b/src/luaotfload-features.lua index 79f1416..9c28fa1 100644 --- a/src/luaotfload-features.lua +++ b/src/luaotfload-features.lua @@ -1856,19 +1856,29 @@ end otf.addfeature = add_otf_feature local install_extra_features = function (data, filename, raw) + local metadata = data and data.metadata + if not metadata then + logreport ("both", 4, "features", + "no metadata received from font “%s”; not \z + installing extra features.", filename) + return + end + local format = data.format + if not format then + logreport ("both", 4, "features", + "no format info for font “%s”/“%s”; not \z + installing extra features.", + fontname, filename) + return + end for feature, specification in next, extrafeatures do - local fontname - local subfont - local metadata = data.metadata - if metadata then - fontname = tostring (data.metadata.fontname) - subfont = tonumber (metadata.subfontindex) - end if not fontname then fontname = "" end if not subfont then subfont = -1 end + local fontname = tostring (data.metadata.fontname) or "" + local subfont = tonumber (metadata.subfontindex) or -1 logreport ("both", 3, "features", "register synthetic feature “%s” for %s font “%s”(%d)", - feature, data.format, fontname, subfont) + feature, format, fontname, subfont) otf.features.register { name = feature, description = specification[2] } otf.enhancers.addfeature (data, feature, specification[1]) end -- cgit v1.2.3 From 8c1f7905e092398b7ff88a4fd6aa5157a6f47c74 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 19 Apr 2016 20:12:13 +0200 Subject: [features] cull legacy feature handler --- src/luaotfload-features.lua | 146 +------------------------------------------- 1 file changed, 1 insertion(+), 145 deletions(-) (limited to 'src') diff --git a/src/luaotfload-features.lua b/src/luaotfload-features.lua index 9c28fa1..5e9bf7b 100644 --- a/src/luaotfload-features.lua +++ b/src/luaotfload-features.lua @@ -1322,146 +1322,6 @@ local noflags = { false, false, false, false } local tohash = table.tohash -local function ancient_addfeature (data, feature, specifications) - local descriptions = data.descriptions - local resources = data.resources - local lookups = resources.lookups - local gsubfeatures = resources.features.gsub - if gsubfeatures and gsubfeatures[feature] then - -- already present - else - local sequences = resources.sequences - local fontfeatures = resources.features - local unicodes = resources.unicodes - local lookuptypes = resources.lookuptypes - local splitter = lpeg.splitter(" ",unicodes) - local done = 0 - local skip = 0 - if not specifications[1] then - -- so we accept a one entry specification - specifications = { specifications } - end - -- subtables are tables themselves but we also accept flattened singular subtables - for s=1,#specifications do - local specification = specifications[s] - local valid = specification.valid - if not valid or valid(data,specification,feature) then - local initialize = specification.initialize - if initialize then - -- when false is returned we initialize only once - specification.initialize = initialize(specification) and initialize or nil - end - local askedfeatures = specification.features or everywhere - local subtables = specification.subtables or { specification.data } or { } - local featuretype = types[specification.type or "substitution"] - local featureflags = specification.flags or noflags - local featureorder = specification.order or { feature } - local added = false - local featurename = stringformat("ctx_%s_%s",feature,s) - local st = { } - for t=1,#subtables do - local list = subtables[t] - local full = stringformat("%s_%s",featurename,t) - st[t] = full - if featuretype == "gsub_ligature" then - lookuptypes[full] = "ligature" - for code, ligature in next, list do - local unicode = tonumber(code) or unicodes[code] - local description = descriptions[unicode] - if description then - local slookups = description.slookups - if type(ligature) == "string" then - ligature = { lpegmatch(splitter,ligature) } - end - local present = true - for i=1,#ligature do - if not descriptions[ligature[i]] then - present = false - break - end - end - if present then - if slookups then - slookups[full] = ligature - else - description.slookups = { [full] = ligature } - end - done, added = done + 1, true - else - skip = skip + 1 - end - end - end - elseif featuretype == "gsub_single" then - lookuptypes[full] = "substitution" - for code, replacement in next, list do - local unicode = tonumber(code) or unicodes[code] - local description = descriptions[unicode] - if description then - local slookups = description.slookups - replacement = tonumber(replacement) or unicodes[replacement] - if descriptions[replacement] then - if slookups then - slookups[full] = replacement - else - description.slookups = { [full] = replacement } - end - done, added = done + 1, true - end - end - end - end - end - if added then - -- script = { lang1, lang2, lang3 } or script = { lang1 = true, ... } - for k, v in next, askedfeatures do - if v[1] then - askedfeatures[k] = tabletohash(v) - end - end - local sequence = { - chain = 0, - features = { [feature] = askedfeatures }, - flags = featureflags, - name = featurename, - order = featureorder, - subtables = st, - type = featuretype, - } - if specification.prepend then - insert(sequences,1,sequence) - else - insert(sequences,sequence) - end - -- register in metadata (merge as there can be a few) - if not gsubfeatures then - gsubfeatures = { } - fontfeatures.gsub = gsubfeatures - end - local k = gsubfeatures[feature] - if not k then - k = { } - gsubfeatures[feature] = k - end - for script, languages in next, askedfeatures do - local kk = k[script] - if not kk then - kk = { } - k[script] = kk - end - for language, value in next, languages do - kk[language] = value - end - end - end - end - end - if trace_loading then - report_otf("registering feature %a, affected glyphs %a, skipped glyphs %a",feature,done,skip) - end - end -end - local function current_addfeature(data,feature,specifications) local descriptions = data.descriptions local resources = data.resources @@ -1897,11 +1757,7 @@ return { end otf = fonts.handlers.otf - - --- hack for backwards compat with TL2014 loader - otf.enhancers.addfeature = otf.version < 2.8 and ancient_addfeature - or current_addfeature - + otf.enhancers.addfeature = current_addfeature otf.enhancers.register ("check extra features", install_extra_features) -- cgit v1.2.3 From ee746416e295bcaee2bf5472220501f121228997 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 19 Apr 2016 20:25:50 +0200 Subject: [aux] fix crash with tfm fonts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/lualatex/luaotfload/issues/334 Old-style font definitions only need a font name, so the extra quotes aren’t necessary to feed the \fontname string back into \font. --- src/luaotfload-auxiliary.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/luaotfload-auxiliary.lua b/src/luaotfload-auxiliary.lua index 35f8f2b..58e4c59 100644 --- a/src/luaotfload-auxiliary.lua +++ b/src/luaotfload-auxiliary.lua @@ -42,7 +42,10 @@ local luaotfload_callbacks = { } --- https://github.com/khaledhosny/luaotfload/issues/54 local rewrite_fontname = function (tfmdata, specification) - tfmdata.name = [["]] .. specification .. [["]] + local format = tfmdata.properties.format + if format ~= "type1" then + tfmdata.name = [["]] .. specification .. [["]] + end end local rewriting = false -- cgit v1.2.3 From dcda3d094e3052786527350add241c6084d7d68b Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 19 Apr 2016 20:37:21 +0200 Subject: =?UTF-8?q?[main]=20fix=20oversight=20in=20comment=20(thanks,=20?= =?UTF-8?q?=C3=88lie)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaotfload-main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/luaotfload-main.lua b/src/luaotfload-main.lua index 3f1f602..92c1ff1 100644 --- a/src/luaotfload-main.lua +++ b/src/luaotfload-main.lua @@ -13,7 +13,7 @@ local luaotfload = luaotfload luaotfload.log = luaotfload.log or { } luaotfload.version = "2.7" luaotfload.loaders = { } -luaotfload.min_luatex_version = 95 --- i. e. 0.80 +luaotfload.min_luatex_version = 95 --- i. e. 0.95 luaotfload.fontloader_package = "reference" --- default: from current Context local authors = "\z -- cgit v1.2.3 From 2771c83b3ea53bef90e56f3befc16cc866799b31 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 19 Apr 2016 22:28:25 +0200 Subject: [aux] make fontname substitution more robust Another take on https://github.com/lualatex/luaotfload/issues/334 The parsing issues we aim to prevent occur with spaces because Luatex treats them as argument separators. Hence apply quoting only if necessary. Also use the appropriate format string as a defense against garbage inputs. --- src/luaotfload-auxiliary.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/luaotfload-auxiliary.lua b/src/luaotfload-auxiliary.lua index 58e4c59..3d300e7 100644 --- a/src/luaotfload-auxiliary.lua +++ b/src/luaotfload-auxiliary.lua @@ -42,9 +42,14 @@ local luaotfload_callbacks = { } --- https://github.com/khaledhosny/luaotfload/issues/54 local rewrite_fontname = function (tfmdata, specification) - local format = tfmdata.properties.format + local format = tfmdata.format or tfmdata.properties.format if format ~= "type1" then - tfmdata.name = [["]] .. specification .. [["]] + if stringfind (specification, " ") then + tfmdata.name = stringformat ("%q", specification) + else + --- other specs should parse just fine + tfmdata.name = specification + end end end -- cgit v1.2.3 From 345da7fddda9f8a62070e3430458192b064838cb Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Wed, 20 Apr 2016 07:25:25 +0200 Subject: [loaders] remove support for PF{A,B} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Lua fontloader doesn’t support these formats and they’re very low priority. There is no “shortcut” like with the FF loader anymore which would parse such files into the same data structures as {O,T}TF. Support for postscript formats may come back at some point in the future if there is demand. --- src/luaotfload-loaders.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/luaotfload-loaders.lua b/src/luaotfload-loaders.lua index fb01821..d3828aa 100644 --- a/src/luaotfload-loaders.lua +++ b/src/luaotfload-loaders.lua @@ -41,6 +41,14 @@ local eval_reader = function (specification) return eval () end +local unsupported_reader = function (format) + return function (specification) + logreport ("both", 0, "loaders", + "font format “%s” unsupported; cannot load %s.", + format, tostring (specification.name)) + end +end + local install_formats = function () local fonts = fonts if not fonts then return false end @@ -72,8 +80,8 @@ local install_formats = function () return aux ("evl", eval_reader) and aux ("lua", lua_reader) - and aux ("pfa", function (spec) return readers.opentype (spec, "pfa", "type1") end) - and aux ("pfb", function (spec) return readers.opentype (spec, "pfb", "type1") end) + and aux ("pfa", unsupported_reader "pfa") + and aux ("pfb", unsupported_reader "pfb") and aux ("ofm", readers.tfm) end -- cgit v1.2.3