diff options
| -rw-r--r-- | luaotfload-deferred.lua | 172 | ||||
| -rw-r--r-- | luaotfload.lua | 228 | ||||
| -rw-r--r-- | luaotfload.sty | 3 | 
3 files changed, 217 insertions, 186 deletions
diff --git a/luaotfload-deferred.lua b/luaotfload-deferred.lua deleted file mode 100644 index efa0298..0000000 --- a/luaotfload-deferred.lua +++ /dev/null @@ -1,172 +0,0 @@ ---- TODO integrate into luaotfload.dtx - -local type, next = type, next - -local stringfind = string.find ---- this part is loaded after luatexbase -local loadmodule      = luaotfload.loadmodule -local luatexbase      = luatexbase -local generic_context = generic_context --- from fontloader - -local add_to_callback, create_callback = -      luatexbase.add_to_callback, luatexbase.create_callback -local reset_callback, call_callback = -      luatexbase.reset_callback, luatexbase.call_callback - ---[[doc-- -We do our own callback handling with the means provided by luatexbase. - -Note: \verb|pre_linebreak_filter| and \verb|hpack_filter| are coupled -in \CONTEXT\ in the concept of \emph{node processor}. ---doc]]-- - -add_to_callback("pre_linebreak_filter", -                generic_context.callback_pre_linebreak_filter, -                "luaotfload.node_processor", -                1) -add_to_callback("hpack_filter", -                generic_context.callback_hpack_filter, -                "luaotfload.node_processor", -                1) - -luaotfload.loadmodule("font-otc.lua") - -loadmodule("lib-dir.lua")    -- required by font-nms; will change with lualibs update -loadmodule("font-nms.lua") -loadmodule("font-clr.lua") ---loadmodule("font-ovr.lua") -loadmodule("font-ltx.lua") - -local dummy_function = function ( ) end --- upvalue more efficient than lambda -create_callback("luaotfload.patch_font", "simple", dummy_function) - ---[[doc-- -This is a wrapper for the imported font loader. -As of 2013, everything it does appears to be redundand, so we won’t use -it. -Nevertheless, it has been adapted to work with the current structure of -font data objects and will stay here for reference / until somebody -reports breakage. - -TODO -This one also enables patching fonts. -The current fontloader apparently comes with a dedicated mechanism for -that already: enhancers. -How those work remains to be figured out. ---doc]]-- -local define_font_wrapper = function (...) -    --- we use “tfmdata” (not “fontdata”) for consistency with the -    --- font loader -    local tfmdata = fonts.definers.read(...) -    if type(tfmdata) == "table" and tfmdata.shared then -        local metadata = tfmdata.shared.rawdata.metadata -        local mathdata = metadata.math --- do all fonts have this field? -        if mathdata then -            local mathconstants = { } --- why new hash, not modify in place? -            local units_per_em  = metadata.units_per_em -            local size          = tfmdata.size -            for k,v in next, mathdata do -                --- afaics this is alread taken care of by -                --- definers.read -                if stringfind(k, "Percent") then -                    -- keep percent values as is -                    print(k,v) -                    mathconstants[k] = v -                else -                    mathconstants[k] = v / units_per_em * size -                end -            end -            --- for \overwithdelims -            --- done by definers.read as well -            mathconstants.FractionDelimiterSize             = 1.01 * size -            --- fontloader has 2.4 × size -            mathconstants.FractionDelimiterDisplayStyleSize = 2.39 * size -            tfmdata.MathConstants = mathconstants -        end -        call_callback("luaotfload.patch_font", tfmdata) -    end -    return tfmdata -end - ---[[doc-- -We provide a simplified version of the original font definition -callback. ---doc]]-- -local patch_defined_font = function (...) -    local tfmdata = fonts.definers.read(...) -    if type(tfmdata) == "table" and tfmdata.shared then -        call_callback("luaotfload.patch_font", tfmdata) -    end -    --inspect(tfmdata.shared.features) -    return tfmdata -end - -fonts.mode = "node" - -function attributes.private(name) -    local attr   = "otfl@" .. name -    local number = luatexbase.attributes[attr] -    if not number then -        number = luatexbase.new_attribute(attr) -    end -    return number -end - -reset_callback("define_font") - -if luaotfload.font_definer == "old"  then -  add_to_callback("define_font", -                  old_define_font_wrapper, -                  "luaotfload.define_font", -                  1) -elseif luaotfload.font_definer == "generic"  then -  add_to_callback("define_font", -                  generic_context.callback_define_font, -                  "luaotfload.define_font", -                  1) -elseif luaotfload.font_definer == "patch"  then -  add_to_callback("define_font", -                  patch_defined_font, -                  "luaotfload.define_font", -                  1) -end - ---local register_base_sub = fonts.otf.features.register_base_substitution ---local gsubs = { -    --"ss01", "ss02", "ss03", "ss04", "ss05", -    --"ss06", "ss07", "ss08", "ss09", "ss10", -    --"ss11", "ss12", "ss13", "ss14", "ss15", -    --"ss16", "ss17", "ss18", "ss19", "ss20", ---} - ---for _,v in next, gsubs do -    --register_base_sub(v) ---end ---add_to_callback("find_vf_file", -                 --fonts.vf.find, -                --"luaotfload.find_vf_file") - -local set_sscale_diments = function (tfmdata) -    local mathconstants = tfmdata.MathConstants -    if mathconstants then -        local tfmparameters = tfmdata.parameters -        if mathconstants.ScriptPercentScaleDown then -            tfmparameters[10] = mathconstants.ScriptPercentScaleDown -        else -- resort to plain TeX default -            tfmparameters[10] = 70 -        end -        if mathconstants.ScriptScriptPercentScaleDown then -            tfmparameters[11] = mathconstants.ScriptScriptPercentScaleDown -        else -- resort to plain TeX default -            tfmparameters[11] = 50 -        end -    end -end - -add_to_callback("luaotfload.patch_font", -                set_sscale_diments, -                "unicodemath.set_sscale_diments") - --- vim:tw=71:sw=2:ts=2:expandtab - ---  End of File `luaotfload.lua'. diff --git a/luaotfload.lua b/luaotfload.lua index dd650fd..7266e47 100644 --- a/luaotfload.lua +++ b/luaotfload.lua @@ -29,6 +29,11 @@ luaotfload.module = {      license       = "CC0"  } +local luatexbase = luatexbase + +local type, next = type, next +local stringfind = string.find +  --[[doc--  No final decision has been made on how to handle font definition.  At the moment, there are three candidates: The \textsf{generic} @@ -63,16 +68,6 @@ local loadmodule = function (name)          error("file %s not found.", tofind)      end  end -luaotfload.loadmodule = loadmodule --- required in deferred code - ---[[doc-- -The imported font loader will call \verb|callback.register| once -(during \verb|font-def.lua|). -This is unavoidable but harmless, so we make it call a dummy instead. ---doc]]-- -local trapped_register = callback.register -local dummy_function   = function () end -callback.register      = dummy_function  --[[-- keep --]]  --- from Hans (all merged): @@ -155,6 +150,9 @@ In combination with the option \verb|no_callbacks_yet| in  if not _G.    generic_context then _G.    generic_context = { } end  if not _G.non_generic_context then _G.non_generic_context = { } end +local     generic_context =    generic_context +local non_generic_context =non_generic_context +  generic_context.no_callbacks_yet = true  _G.non_generic_context = { luatex_fonts = { @@ -163,7 +161,19 @@ _G.non_generic_context = { luatex_fonts = {      skip_loading    = true,  }} -loadmodule("fonts.lua") +--[[doc-- +The imported font loader will call \verb|callback.register| once +(during \verb|font-def.lua|). +This is unavoidable but harmless, so we make it call a dummy instead. +--doc]]-- +local trapped_register = callback.register +local dummy_function   = function () end +callback.register      = dummy_function + +--[[doc-- +Now that things are sorted out we can load the fontloader. +--doc]]-- +loadmodule"fonts.lua"  --[[doc--  After the fontloader is ready we can restore the callback trap from @@ -172,7 +182,201 @@ After the fontloader is ready we can restore the callback trap from  callback.register = trapped_register ---- then continue in luaotfload-deferred.lua +local add_to_callback, create_callback = +      luatexbase.add_to_callback, luatexbase.create_callback +local reset_callback, call_callback = +      luatexbase.reset_callback, luatexbase.call_callback + +--[[doc-- +We do our own callback handling with the means provided by luatexbase. + +Note: \verb|pre_linebreak_filter| and \verb|hpack_filter| are coupled +in \CONTEXT\ in the concept of \emph{node processor}. +--doc]]-- + +add_to_callback("pre_linebreak_filter", +                generic_context.callback_pre_linebreak_filter, +                "luaotfload.node_processor", +                1) +add_to_callback("hpack_filter", +                generic_context.callback_hpack_filter, +                "luaotfload.node_processor", +                1) + +loadmodule"font-otc.lua" + +loadmodule"lib-dir.lua"    -- required by font-nms; will change with lualibs update +loadmodule"font-nms.lua" +loadmodule"font-clr.lua" +--loadmodule"font-ovr.lua" +loadmodule"font-ltx.lua" + +local dummy_function = function ( ) end --- upvalue more efficient than lambda +create_callback("luaotfload.patch_font", "simple", dummy_function) + +--[[doc-- +This is a wrapper for the imported font loader. +As of 2013, everything it does appears to be redundand, so we won’t use +it. +Nevertheless, it has been adapted to work with the current structure of +font data objects and will stay here for reference / until somebody +reports breakage. + +TODO +This one also enables patching fonts. +The current fontloader apparently comes with a dedicated mechanism for +that already: enhancers. +How those work remains to be figured out. +--doc]]-- +local define_font_wrapper = function (...) +    --- we use “tfmdata” (not “fontdata”) for consistency with the +    --- font loader +    local tfmdata = fonts.definers.read(...) +    if type(tfmdata) == "table" and tfmdata.shared then +        local metadata = tfmdata.shared.rawdata.metadata +        local mathdata = metadata.math --- do all fonts have this field? +        if mathdata then +            local mathconstants = { } --- why new hash, not modify in place? +            local units_per_em  = metadata.units_per_em +            local size          = tfmdata.size +            for k,v in next, mathdata do +                --- afaics this is alread taken care of by +                --- definers.read +                if stringfind(k, "Percent") then +                    -- keep percent values as is +                    print(k,v) +                    mathconstants[k] = v +                else +                    mathconstants[k] = v / units_per_em * size +                end +            end +            --- for \overwithdelims +            --- done by definers.read as well +            mathconstants.FractionDelimiterSize             = 1.01 * size +            --- fontloader has 2.4 × size +            mathconstants.FractionDelimiterDisplayStyleSize = 2.39 * size +            tfmdata.MathConstants = mathconstants +        end +        call_callback("luaotfload.patch_font", tfmdata) +    end +    return tfmdata +end + +--[[doc-- +We provide a simplified version of the original font definition +callback. +--doc]]-- +local patch_defined_font = function (...) +    local tfmdata = fonts.definers.read(...) +    if type(tfmdata) == "table" and tfmdata.shared then +        call_callback("luaotfload.patch_font", tfmdata) +    end +    --inspect(tfmdata.shared.features) +    return tfmdata +end + +fonts.mode = "node" + +function attributes.private(name) +    local attr   = "otfl@" .. name +    local number = luatexbase.attributes[attr] +    if not number then +        number = luatexbase.new_attribute(attr) +    end +    return number +end + +reset_callback("define_font") + +if luaotfload.font_definer == "old"  then +  add_to_callback("define_font", +                  old_define_font_wrapper, +                  "luaotfload.define_font", +                  1) +elseif luaotfload.font_definer == "generic"  then +  add_to_callback("define_font", +                  generic_context.callback_define_font, +                  "luaotfload.define_font", +                  1) +elseif luaotfload.font_definer == "patch"  then +  add_to_callback("define_font", +                  patch_defined_font, +                  "luaotfload.define_font", +                  1) +end + +--[[doc-- +These vanished in 2011. +\url{http://repo.or.cz/w/context.git/commitdiff/1455dd60b68c9140db1b9977c9e5ce372b772ec8} + +The “ss” stuff is in tables.features in context (see font-ott.lua), but +commented. +I’ll get back at restoring it as soon as someone can tell me what those do. +/phg + +local register_base_sub = fonts.otf.features.register_base_substitution +local gsubs = { +    "ss01", "ss02", "ss03", "ss04", "ss05", +    "ss06", "ss07", "ss08", "ss09", "ss10", +    "ss11", "ss12", "ss13", "ss14", "ss15", +    "ss16", "ss17", "ss18", "ss19", "ss20", +} + +for _,v in next, gsubs do +    register_base_sub(v) +end +--doc]]-- + +---TODO check for conflicts with lualibs +-- imported from "util-sto.lua" +--table.setmetatablenewindex = function (t,f) +--    if type(t) ~= "table" then +--        f, t = t, { } +--    end +--    local m = getmetatable(t) +--    if m then +--        if f == "ignore" then +--            m.__newindex = f_ignore +--        else +--            m.__newindex = f +--        end +--    else +--        if f == "ignore" then +--            setmetatable(t, t_ignore) +--        else +--            setmetatable(t,{ __newindex = f }) +--        end +--    end +--    return t +--end +---- this overloads fonts.handlers.features.normalize() +---- breakage ahead. +--loadmodule"font-ott.lua" + +--add_to_callback("find_vf_file", +--                 fonts.vf.find, +--                "luaotfload.find_vf_file") + +local set_sscale_diments = function (tfmdata) +    local mathconstants = tfmdata.MathConstants +    if mathconstants then +        local tfmparameters = tfmdata.parameters +        if mathconstants.ScriptPercentScaleDown then +            tfmparameters[10] = mathconstants.ScriptPercentScaleDown +        else -- resort to plain TeX default +            tfmparameters[10] = 70 +        end +        if mathconstants.ScriptScriptPercentScaleDown then +            tfmparameters[11] = mathconstants.ScriptScriptPercentScaleDown +        else -- resort to plain TeX default +            tfmparameters[11] = 50 +        end +    end +end + +add_to_callback("luaotfload.patch_font", +                set_sscale_diments, +                "unicodemath.set_sscale_diments")  -- vim:tw=71:sw=2:ts=2:expandtab diff --git a/luaotfload.sty b/luaotfload.sty index a7b3b52..b2b574b 100644 --- a/luaotfload.sty +++ b/luaotfload.sty @@ -22,7 +22,6 @@  \bgroup\expandafter\expandafter\expandafter\egroup  %\RequireLuaModule{lualibs}  %\RequireLuaModule{luaotfload} -\directlua{require"luaotfload"}  \expandafter\ifx\csname ProvidesPackage\endcsname\relax    \input luatexbase.sty  \else @@ -31,7 +30,7 @@      [2011/10/06 v2.0 OpenType layout system]    \RequirePackage{luatexbase}  \fi -\directlua{require"luaotfload-deferred"} +\directlua{require"luaotfload"}  \endinput  %%  %% End of file `luaotfload.sty'.  | 
