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
80
81
82
83
84
85
86
87
88
89
90
91
|
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)
local report_otf = logs.new("load otf")
local fonts = fonts
local otf = fonts.otf
local fontdata = fonts.ids
otf.features = otf.features or { }
otf.features.default = otf.features.default or { }
local definers = fonts.definers
local contextsetups = definers.specifiers.contextsetups
local contextnumbers = definers.specifiers.contextnumbers
-- todo: dynamics namespace
local a_to_script = { }
local a_to_language = { }
function otf.setdynamics(font,dynamics,attribute)
local features = contextsetups[contextnumbers[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
-- report_otf("using dynamics %s: attribute %s, script %s, language %s",contextnumbers[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.dynamics = true -- handy for tracing
tfmdata.language = language
tfmdata.script = script
tfmdata.shared.features = { }
-- end of save
local set = definers.check(features,otf.features.default)
dsla = otf.setfeatures(tfmdata,set)
if trace_dynamics then
report_otf("setting dynamics %s: attribute %s, script %s, language %s, set: %s",contextnumbers[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
function otf.scriptandlanguage(tfmdata,attr)
if attr and attr > 0 then
return a_to_script[attr] or tfmdata.script, a_to_language[attr] or tfmdata.language
else
return tfmdata.script, tfmdata.language
end
end
|