1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
if not modules then modules = { } end modules ['font-otd'] = {
version = 1.001,
comment = "companion to font-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
fonts = fonts or { }
fonts.otf = fonts.otf or { }
local otf = fonts.otf
local fontdata = fonts.ids
otf.features = otf.features or { }
otf.features.default = otf.features.default or { }
local context_setups = fonts.define.specify.context_setups
local context_numbers = fonts.define.specify.context_numbers
local a_to_script = { } otf.a_to_script = a_to_script
local a_to_language = { } otf.a_to_language = a_to_language
function otf.set_dynamics(font,dynamics,attribute)
local features = context_setups[context_numbers[attribute]] -- can be moved to caller
if features then
local script = features.script or 'dflt'
local language = features.language or 'dflt'
local ds = dynamics[script]
if not ds then
ds = { }
dynamics[script] = ds
end
local dsl = ds[language]
if not dsl then
dsl = { }
ds[language] = dsl
end
local dsla = dsl[attribute]
if dsla then
-- if trace_dynamics then
-- logs.report("otf define","using dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
-- end
return dsla
else
local tfmdata = fontdata[font]
a_to_script [attribute] = script
a_to_language[attribute] = language
-- we need to save some values
local saved = {
script = tfmdata.script,
language = tfmdata.language,
mode = tfmdata.mode,
features = tfmdata.shared.features
}
tfmdata.mode = "node"
tfmdata.language = language
tfmdata.script = script
tfmdata.shared.features = { }
-- end of save
local set = fonts.define.check(features,otf.features.default)
dsla = otf.set_features(tfmdata,set)
if trace_dynamics then
logs.report("otf define","setting dynamics %s: attribute %s, script %s, language %s, set: %s",context_numbers[attribute],attribute,script,language,table.sequenced(set))
end
-- we need to restore some values
tfmdata.script = saved.script
tfmdata.language = saved.language
tfmdata.mode = saved.mode
tfmdata.shared.features = saved.features
-- end of restore
dynamics[script][language][attribute] = dsla -- cache
return dsla
end
end
return nil -- { }
end
|