diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkxl/math-fnt.lmt')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkxl/math-fnt.lmt | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkxl/math-fnt.lmt b/Master/texmf-dist/tex/context/base/mkxl/math-fnt.lmt new file mode 100644 index 00000000000..911e0adb520 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mkxl/math-fnt.lmt @@ -0,0 +1,151 @@ +if not modules then modules = { } end modules ['math-fnt'] = { + version = 1.001, + comment = "companion to math-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local round = math.round +local setmetatableindex = table.setmetatableindex + +local nuts = nodes.nuts +local tonut = nodes.tonut +local tonode = nodes.tonode +local nodepool = nuts.pool + +local vlist_code = nodes.nodecodes.vlist + +local new_hlist = nodepool.hlist +local new_vlist = nodepool.vlist +----- new_glyph = nodepool.glyph +local new_glyph = nuts.newmathglyph + +local getattrlst = nuts.getattributelist +local setattrlst = nuts.setattributelist +local setwhd = nuts.setwhd +local getwhd = nuts.getwhd +local getid = nuts.getid + +local chardata = fonts.hashes.characters +local addcharacters = font.addcharacters + +-- not yet ok for compact fonts .. needs checking .. or just make this non-compact only +-- there's also an inaccuracy creeping in: \sqrt{\quad\blackrule[height=25pt,depth=25pt]} + +local cache = setmetatableindex(function(t,width) + local v = setmetatableindex(function(t,height) + local v = setmetatableindex(function(t,depth) + local v = setmetatableindex(function(t,font) + local v = setmetatableindex(function(t,char) + t[char] = v + return v + end) + t[font] = v + return v + end) + t[depth] = v + return v + end) + t[height] = v + return v + end) + t[width] = v + return v +end) + +local function register_extensible(font,char,style,box) + -- We don't share (yet)! + local fontdata = chardata[font] + local oldchar = fontdata[char] + if oldchar and oldchar.keepvirtual then + -- for now, needed for iwona etc + return nil + else + local bx = tonut(box) + updaters.apply("tagging.state.disable") -- fast enough + nodes.handlers.finalizelist(bx) + updaters.apply("tagging.state.enable") + local id = getid(bx) + local al = getattrlst(bx) + local wd, ht, dp = getwhd(bx) + local unicode = oldchar.unicode or char + -- we cannot have self referencing t3 fonts + local oldcommands = oldchar.oldcommands + local newcommands = oldchar.commands + if oldcommands then + oldchar.commands = oldcommands + end + -- + local p = fonts.hashes.parameters[font] + local sx = round(1000/p.extendfactor) + local sy = round(1000/p.squeezefactor) + -- we saved a scaled glyph stream so we now use an unscaled one ... horrible hack: + if sx ~= 1000 then + wd = wd * 7200/7227 + end + if sy ~= 1000 then + ht = ht * 7200/7227 + dp = dp * 7200/7227 + end + -- + -- local private = fonts.helpers.setboxdirectly(font,unicode,box) + local private = cache[wd][ht][dp][font][unicode] + if not private then + private = fonts.helpers.setboxdirectly(font,unicode,box) + cache[wd][ht][dp][font][unicode] = private + end + local glyph = new_glyph(font,private,al) + nuts.setscales(glyph,1000,sx,sy) + -- + -- if fonts.hashes.properties[font].compactmath then + -- nuts.setscales(g,1000,1000,1000) + -- end + -- + -- nasty, testcase: bold math sqrt extensible + -- + local n = new_hlist(glyph) + -- + if newcommands then + oldchar.commands = newcommands + end + -- + -- local newchar = { + -- unicode = unicode, + -- width = wd, + -- height = ht, + -- depth = dp, + -- } + -- local p = oldchar.vparts + -- if p then + -- local first = fontdata[p[#p].glyph] + -- local last = fontdata[p[ 1].glyph] + -- if first then + -- newchar.topleft = first.topleft + -- newchar.topright = first.topright + -- end + -- if last then + -- newchar.bottomleft = last.bottomleft + -- newchar.bottomright = last.bottomright + -- end + -- end + -- addcharacters(font, { [private] = newchar }) + -- so the dimensions of the box don't match the glyph scale! + setwhd(n,wd,ht,dp) + setattrlst(n,al) + if id == vlist_code then + n = new_vlist(n) + setwhd(n,wd,ht,dp) + setattrlst(n,al) + end + return tonode(n) + end +end + +directives.register("math.extensibles", function(v) + callback.register("register_extensible", v and register_extensible or nil) +end) + +-- Default per 2022-08-25 + +callback.register("register_extensible", register_extensible) |