-local function mult_table(old,scale) -- modified from table.fastcopy
- if old then
- local new = { }
- for k,v in next, old do
- if type(v) == "table" then
- new[k] = mult_table(v,scale)
- elseif type(v) == "number" then
- new[k] = round(v*scale)
- else
- new[k] = v
- end
- end
- return new
- else return nil end
-end
-
-local function update_jfm_cache(j,sz)
- if metrics[j].size_cache[sz] then return end
- metrics[j].size_cache[sz] = {}
- metrics[j].size_cache[sz].char_type = mult_table(metrics[j].char_type, sz)
- metrics[j].size_cache[sz].kanjiskip = mult_table(metrics[j].kanjiskip, sz)
- metrics[j].size_cache[sz].xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
- metrics[j].size_cache[sz].zw = round(metrics[j].zw*sz)
- metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
+local update_jfm_cache
+do
+ local function mult_table(old,scale) -- modified from table.fastcopy
+ if old then
+ local new = { }
+ for k,v in next, old do
+ if type(v) == "table" then
+ new[k] = mult_table(v,scale)
+ elseif type(v) == "number" then
+ new[k] = round(v*scale)
+ else
+ new[k] = v
+ end
+ end
+ return new
+ else return nil end
+ end
+
+ update_jfm_cache = function (j,sz)
+ if metrics[j].size_cache[sz] then return end
+ local t = {}
+ metrics[j].size_cache[sz] = t
+ t.chars = metrics[j].chars
+ t.char_type = mult_table(metrics[j].char_type, sz)
+ for i,v in pairs(t.char_type) do
+ v.align = (v.align=='left') and 0 or
+ ((v.align=='right') and 1 or 0.5)
+ if type(i) == 'number' then -- char_type
+ for k,w in pairs(v.glue) do
+ local h = node_new(id_glue_spec)
+mem_leak_gs = mem_leak_gs+1
+ v[k] = {true, h, (w[5] and w[5]/sz or 0), FROM_JFM + (w[4] and w[4]/sz or 0)}
+ setfield(h, 'width', w[1])
+ setfield(h, 'stretch', w[2])
+ setfield(h, 'shrink', w[3])
+ setfield(h, 'stretch_order', 0)
+ setfield(h, 'shrink_order', 0)
+ end
+ for k,w in pairs(v.kern) do
+ local g = node_new(id_kern)
+mem_leak_kern = mem_leak_kern +1
+ setfield(g, 'kern', w[1])
+ setfield(g, 'subtype', 1)
+ set_attr(g, attr_icflag, FROM_JFM)
+ v[k] = {false, g, w[2]/sz}
+ end
+ end
+ end
+ t.kanjiskip = mult_table(metrics[j].kanjiskip, sz)
+ t.xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
+ t.zw = round(metrics[j].zw*sz)
+ t.zh = round(metrics[j].zh*sz)
+ end