summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/mkxl/math-fnt.lmt
diff options
context:
space:
mode:
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.lmt151
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)