diff options
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexja/ltj-lotf_aux.lua')
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexja/ltj-lotf_aux.lua | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-lotf_aux.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-lotf_aux.lua new file mode 100644 index 00000000000..613291f7a94 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-lotf_aux.lua @@ -0,0 +1,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 |