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
|
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)
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
dsla = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
if trace_dynamics then
logs.report("otf define","setting dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
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
|