From 942f76c831da1ba5a85ce5b77374f2315caa768b Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 19 May 2013 20:09:13 +0200 Subject: adapt extralib --- luaotfload-extralibs.lua | 52 +++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 20 deletions(-) (limited to 'luaotfload-extralibs.lua') diff --git a/luaotfload-extralibs.lua b/luaotfload-extralibs.lua index 618808f..f6ba607 100644 --- a/luaotfload-extralibs.lua +++ b/luaotfload-extralibs.lua @@ -207,6 +207,7 @@ if not markdata then fonthashes.marks = markdata end +--- next stems from the multilingual interface interfaces = interfaces or { } interfaces.variables = interfaces.variables or { } interfaces.variables.max = "max" @@ -283,7 +284,8 @@ commands = commands or { } --- we should be ready at this moment to insert the library -require "luaotfload-typo-krn" +--require "luaotfload-typo-krn" +require "luaotfload-letterspace" --- simplified --===================================================================-- --- CLEAN @@ -296,6 +298,8 @@ local mapping = kerns.mapping local unsetvalue = attributes.unset_value local process_kerns = plugin_store.kern +local kernfont = typesetters.kernfont + local kerncharacters = function (head) return process_kerns("kerns", hidden.a_kerns, head) end @@ -304,52 +308,60 @@ end local add_kern_processor = function (...) for i=1, select("#", ...) do luatexbase.add_to_callback( - select(i, ...), kerncharacters, callback_name + select(i, ...), kernfont.handler, callback_name ) end end local remove_kern_processor = function (...) for i=1, select("#", ...) do luatexbase.remove_from_callback( - select(i, ...), kerncharacters, callback_name + select(i, ...), callback_name ) end end --- we use the same callbacks as a node processor in Context -kerns.enablecharacterkerning = function ( ) +local enablecharacterkerning = function ( ) add_kern_processor("pre_linebreak_filter", "hpack_filter") end -kerns.disablecharacterkerning = function ( ) +local disablecharacterkerning = function ( ) remove_kern_processor("pre_linebreak_filter", "hpack_filter") end +--kerns.enablecharacterkerning = enablecharacterkerning +--kerns.disablecharacterkerning = disablecharacterkerning +kernfont.enablecharacterkerning = enablecharacterkerning +kernfont.disablecharacterkerning = disablecharacterkerning + local enabled = false --- callback state ---- we just replace the kern enabler with our modified version -kerns.set = function (factor) - if factor ~= v_max then +local initializekerning = function (tfmdata, factor) + if factor ~= "max" then factor = tonumber(factor) or 0 end - if factor == v_max or factor ~= 0 then + if factor == "max" or factor ~= 0 then + local fontproperties = tfmdata.properties + if fontproperties then + --- hopefully this field stays unused otherwise + fontproperties.kerncharacters = factor + end if not enabled then - kerns.enablecharacterkerning() + enablecharacterkerning() enabled = true end - local a = factors[factor] - if not a then - a = #mapping + 1 - factors[factors], mapping[a] = a, factor - end - factor = a - else - factor = unsetvalue end - texattribute[hidden.a_kerns] = factor - return factor end +local otffeatures = fonts.constructors.newfeatures "otf" +otffeatures.register { + name = "kerncharacters", + description = "kerncharacters", + initializers = { + base = initializekerning, + node = initializekerning, + } +} ----------------------------------------------------------------------- --- options -- cgit v1.2.3 From ddf5bd917a05f5826e47f87d128d1948d0c4e49c Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 19 May 2013 21:07:46 +0200 Subject: reinstate characterkerning --- luaotfload-extralibs.lua | 150 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 111 insertions(+), 39 deletions(-) (limited to 'luaotfload-extralibs.lua') diff --git a/luaotfload-extralibs.lua b/luaotfload-extralibs.lua index f6ba607..1e0d85a 100644 --- a/luaotfload-extralibs.lua +++ b/luaotfload-extralibs.lua @@ -23,6 +23,7 @@ local texattribute = tex.attribute local new_node = node.new local copy_node = node.copy +local otffeatures = fonts.constructors.newfeatures "otf" ----------------------------------------------------------------------- --- namespace @@ -38,8 +39,10 @@ local kerns = typesetters.kerns kerns.mapping = kerns.mapping or { } kerns.factors = kerns.factors or { } -local namespace = "kern" --- <= attribute <= plugin.name -local callback_name = "typesetters.kerncharacters" +local kern_callback = "typesetters.kerncharacters" + +typesetters.kernfont = typesetters.kernfont or { } +local kernfont = typesetters.kernfont ----------------------------------------------------------------------- --- node-ini @@ -282,10 +285,10 @@ commands = commands or { } --- LOAD --===================================================================-- ---- we should be ready at this moment to insert the library +--- we should be ready at this moment to insert the libraries ---require "luaotfload-typo-krn" -require "luaotfload-letterspace" --- simplified +require "luaotfload-typo-krn" --- typesetters.kerns +require "luaotfload-letterspace" --- typesetters.kernfont --===================================================================-- --- CLEAN @@ -298,45 +301,83 @@ local mapping = kerns.mapping local unsetvalue = attributes.unset_value local process_kerns = plugin_store.kern -local kernfont = typesetters.kernfont +--- kern_callback : normal +--- · callback: process_kerns +--- · enabler: enablecharacterkerning +--- · disabler: disablecharacterkerning +--- · interface: kerns.set -local kerncharacters = function (head) - return process_kerns("kerns", hidden.a_kerns, head) -end +--- kernfont_callback : fontwise +--- · callback: kernfont.handler +--- · enabler: enablefontkerning +--- · disabler: disablefontkerning --- callback wrappers -local add_kern_processor = function (...) - for i=1, select("#", ...) do - luatexbase.add_to_callback( - select(i, ...), kernfont.handler, callback_name - ) + +--- (node_t -> node_t) -> string -> string list -> bool +local registered_as = { } --- procname -> callbacks +local add_processor = function (processor, name, ...) + local callbacks = { ... } + for i=1, #callbacks do + luatexbase.add_to_callback(callbacks[i], processor, name) end + registered_as[name] = callbacks --- for removal + return true end -local remove_kern_processor = function (...) - for i=1, select("#", ...) do - luatexbase.remove_from_callback( - select(i, ...), callback_name - ) + +--- string -> bool +local remove_processor = function (name) + local callbacks = registered_as[name] + if callbacks then + for i=1, #callbacks do + luatexbase.remove_from_callback(callbacks[i], name) + end + return true end + return false --> unregistered end --- we use the same callbacks as a node processor in Context +--- unit -> bool local enablecharacterkerning = function ( ) - add_kern_processor("pre_linebreak_filter", "hpack_filter") + return add_processor(function (head) + return process_kerns("kerns", hidden.a_kerns, head) + end, + "typesetters.kerncharacters", + "pre_linebreak_filter", "hpack_filter" + ) end +--- unit -> bool local disablecharacterkerning = function ( ) - remove_kern_processor("pre_linebreak_filter", "hpack_filter") + return remove_processor "typesetters.kerncharacters" end ---kerns.enablecharacterkerning = enablecharacterkerning ---kerns.disablecharacterkerning = disablecharacterkerning -kernfont.enablecharacterkerning = enablecharacterkerning -kernfont.disablecharacterkerning = disablecharacterkerning +kerns.enablecharacterkerning = enablecharacterkerning +kerns.disablecharacterkerning = disablecharacterkerning + +--- now for the simplistic variant +--- unit -> bool +local enablefontkerning = function ( ) + return add_processor( + kernfont.handler, + "typesetters.kernfont", + "pre_linebreak_filter", "hpack_filter" + ) +end + +--- unit -> bool +local disablefontkerning = function ( ) + return remove_processor "typesetters.kernfont" +end -local enabled = false --- callback state +--- fontwise kerning uses a font property for passing along the +--- letterspacing factor -local initializekerning = function (tfmdata, factor) +local fontkerning_enabled = false --- callback state + +--- fontobj -> float -> unit +local initializefontkerning = function (tfmdata, factor) if factor ~= "max" then factor = tonumber(factor) or 0 end @@ -346,29 +387,60 @@ local initializekerning = function (tfmdata, factor) --- hopefully this field stays unused otherwise fontproperties.kerncharacters = factor end - if not enabled then - enablecharacterkerning() - enabled = true + if not fontkerning_enabled then + fontkerning_enabled = enablefontkerning() end end end -local otffeatures = fonts.constructors.newfeatures "otf" +--- like the font colorization, fontwise kerning is hooked into the +--- feature mechanism + otffeatures.register { - name = "kerncharacters", - description = "kerncharacters", - initializers = { - base = initializekerning, - node = initializekerning, - } + name = "letterspace", --"kerncharacters", + description = "letterspace", --"kerncharacters", + initializers = { + base = initializefontkerning, + node = initializefontkerning, + } } +kerns.set = nil + +local characterkerning_enabled = false + +kerns.set = function (factor) + if factor ~= "max" then + factor = tonumber(factor) or 0 + end + if factor == "max" or factor ~= 0 then + if not characterkerning_enabled then + enablecharacterkerning() + characterkerning_enabled = true + end + local a = factors[factor] + if not a then + a = #mapping + 1 + factors[factors], mapping[a] = a, factor + end + factor = a + else + factor = unsetvalue + end + texattribute[hidden.a_kerns] = factor + return factor +end + + + ----------------------------------------------------------------------- --- options ----------------------------------------------------------------------- -kerns.keepligature = false --- supposed to be of type function -kerns.keeptogether = false --- supposed to be of type function +kerns .keepligature = false --- supposed to be of type function +kerns .keeptogether = false --- supposed to be of type function +kernfont.keepligature = false --- supposed to be of type function +kernfont.keeptogether = false --- supposed to be of type function ----------------------------------------------------------------------- --- erase fake Context layer -- cgit v1.2.3