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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
--
-- ltj-lotf_aux.lua
--
-- functions which access to caches by luaotfload gathered in this file.
-- lines with marked by "-- HARFLOAD" are codes for harfload
local aux = {}
luatexja.lotf_aux = aux
local font_metric_table = {}
aux.font_metric_table = font_metric_table
local function is_harf(t)
return luaharfbuzz and package.loaded['harf'] and require("harf-base")
end
local getfont = font.getfont
local provides_feature = luaotfload.aux.provides_feature
function aux.exist_feature(id, name)
local t = getfont(id)
if t and t.properties then
return provides_feature(id, t.properties.script, t.properties.language, name)
else return false
end
end
function aux.enable_feature(id, name)
local t = getfont(id)
if t and t.shared and t.shared.features then
t.shared.features[name] = true
elseif t and is_harf(t) then -- HARFLOAD
local hb, tf = require("harf-base"), t.hb.spec.features
tf[#tf+1] = hb.Feature.new(name)
end
end
function aux.specified_feature(id, name)
local t = getfont(id)
return t and (t.shared and t.shared.features and t.shared.features[name])
or (t.hb and t.hb.spec and t.hb.spec.options and t.hb.spec.options[name]) -- HARFLOAD
end
do
local nulltable = {}
local function get_cidinfo(id) -- table
local t = getfont(id)
local a = t and (t.cidinfo or (t.resources and t.resources and t.resources.cidinfo)) or nulltable
return a
end
aux.get_cidinfo = get_cidinfo
end
local function get_asc_des(id)
local t, v = getfont(id), font_metric_table[id]
local a, d
if t and t.shared then
local u = t.units
local t2 = t.shared.rawdata.metadata
if t2 then
a, d = t2.ascender and t2.ascender/u, t2.descender and -t2.descender/u
end
-- HARFLOAD h_extents() returns "too large" value...?
-- rawdata.metadata.horizontalmetrics is same
end
v.ascender, v.descender = (a or 0.88)*t.size, (d or 0.12)*t.size
end
local function get_ascender(id) -- scaled points
if not font_metric_table[id].ascender then get_asc_des(id) end
return font_metric_table[id].ascender
end
local function get_descender(id) -- scaled points
if not font_metric_table[id].descender then get_asc_des(id) end
return font_metric_table[id].descender
end
aux.get_ascender, aux.get_descender = get_ascender, get_descender
do
local dummy_vht, dummy_vorg = {}, {}
setmetatable(dummy_vht, {__index = function () return 1 end } )
setmetatable(dummy_vorg, {__index = function () return 0.88 end } )
local function get_vmet_table(tfmdata, dest)
if (not tfmdata) or (not tfmdata.shared) then
dest = dest or {}
dest.vorigin, dest.vheight = dummy_vorg, dummy_vht
return dest
end
local rawdata = tfmdata.shared.rawdata
local ascender = rawdata.metadata.ascender or 0
local default_vheight
= rawdata.metadata.defaultvheight
or (rawdata.metadata.descender and (ascender+rawdata.metadata.descender) or units)
local units = tfmdata.units
local t_vorigin, t_vheight, t_ind_to_uni = {}, {}, {}
for i,v in pairs(rawdata.descriptions) do
t_ind_to_uni[v.index] = i
if v.tsb then
local j = v.boundingbox[4] + v.tsb
if j~=ascender then t_vorigin[i]= j / units end
end
if v.vheight then
if v.vheight~=default_vheight then t_vheight[i] = v.vheight / units end
end
end
setmetatable(t_vheight, {__index = function () return default_vheight / units end } )
setmetatable(t_vorigin, {__index = function () return ascender / units end } )
dest = dest or {}
dest.ind_to_uni = t_ind_to_uni
dest.vorigin = t_vorigin -- designed size = 1.0
dest.vheight = t_vheight -- designed size = 1.0
return dest
end
aux.get_vmet_table = get_vmet_table
end
local function loop_over_duplicates(id, func)
-- func: return non-nil iff abort this fn
local t = (type(id)=="table") and id or getfont(id)
if t and t.resources and t.resources.duplicates then
for i,v in pairs(t.resources.duplicates) do
func(i,v)
end
end
end
aux.loop_over_duplicates = loop_over_duplicates
local function loop_over_feat(id, feature_name, func, universal)
-- feature_name: like { vert=true, vrt2 = true, ...}
-- func: return non-nil iff abort this fn
-- universal: true iff look up all (script, lang) pair
local t = (type(id)=="table") and id or getfont(id)
if t and t.resources and t.resources.sequences then
for _,i in pairs(t.resources.sequences) do
if i.order[1] and feature_name[i.order[1]] then
local f = i.features and i.features[i.order[1]]
if i.type == 'gsub_single' and i.steps
and f and (universal or (f[t.properties.script] and f[t.properties.script][t.properties.language])) then
for _,j in pairs(i.steps) do
if type(j)=='table' then
if type(j.coverage)=='table' then
for i,k in pairs(j.coverage) do
local s = func(i,k); if s then return s end
end
end
end
end
end
end
end
end
end
aux.loop_over_feat = loop_over_feat
local vert_vrt2 = { vert=true, vrt2=true }
function aux.replace_vert_variant(id, c)
return loop_over_feat(id, vert_vrt2,
function (i,k) if i==c then return k end end)
or c
end
--for name, func in pairs(aux) do
-- if type(func)=="function" then
-- aux[name] = function(...)
-- print('LOTF_AUX', name, ...);
-- local a = func(...); print('RESULT', a); return a
-- end
-- end
--end
local search
search = function (t, key, prefix)
if type(t)=="table" then
prefix = prefix or ''
for i,v in pairs(t) do
if i==key then print(prefix..'.'..i, v)
else search(v,key,prefix..'.'..tostring(i)) end
end
end
end
aux.t_search = search
-- EOF
|