diff options
author | Karl Berry <karl@freefriends.org> | 2017-04-19 23:04:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-04-19 23:04:15 +0000 |
commit | f74161ca4e7eb3c5af9afcbe92522ae3b58987c1 (patch) | |
tree | 3c30a13df5ac7968195c85070a2b074578e669d2 /Master/texmf-dist/tex/context/base/mkiv/node-res.lua | |
parent | 1d5a55ac8f5506a7ae9cfca52f4b588182e199d4 (diff) |
context beta/cont-tmf.zip (Apr 16 12:55)
git-svn-id: svn://tug.org/texlive/trunk@43931 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/node-res.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/node-res.lua | 355 |
1 files changed, 122 insertions, 233 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-res.lua b/Master/texmf-dist/tex/context/base/mkiv/node-res.lua index 4d25314ad85..8b7ec1a6220 100644 --- a/Master/texmf-dist/tex/context/base/mkiv/node-res.lua +++ b/Master/texmf-dist/tex/context/base/mkiv/node-res.lua @@ -27,6 +27,7 @@ local kerncodes = nodes.kerncodes local rulecodes = nodes.rulecodes local nodecodes = nodes.nodecodes local boundarycodes = nodes.boundarycodes +local usercodes = nodes.usercodes local glyph_code = nodecodes.glyph @@ -71,17 +72,24 @@ local getbox = nuts.getbox local getfield = nuts.getfield local getid = nuts.getid local getlist = nuts.getlist +local getglue = nuts.getglue local setfield = nuts.setfield local setchar = nuts.setchar local setlist = nuts.setlist +local setwhd = nuts.setwhd +local setglue = nuts.setglue +local setdisc = nuts.setdisc +local setfont = nuts.setfont +local setkern = nuts.setkern +local setpenalty = nuts.setpenalty +local setdir = nuts.setdir +local setshift = nuts.setshift +local setwidth = nuts.setwidth local copy_nut = nuts.copy local new_nut = nuts.new -local free_nut = nuts.free - -local copy_node = nodes.copy -local new_node = nodes.new +local flush_nut = nuts.flush -- at some point we could have a dual set (the overhead of tonut is not much larger than -- metatable associations at the lua/c end esp if we also take assignments into account @@ -150,11 +158,15 @@ local textdir = register_nut(new_nut("dir")) local latelua = register_nut(new_nut("whatsit",whatsitcodes.latelua)) local special = register_nut(new_nut("whatsit",whatsitcodes.special)) -local user_n = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_n,"type",100) -- 44 -local user_l = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_l,"type",110) -- 44 -local user_s = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_s,"type",115) -- 44 -local user_t = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_t,"type",116) -- 44 ------ user_c = register_nut(new_nut("whatsit",whatsitcodes.userdefined)) setfield(user_c,"type",108) -- 44 + +local user_node = new_nut("whatsit",whatsitcodes.userdefined) + +local user_number = register_nut(copy_nut(user_node)) setfield(user_number, "type",usercodes.number) +local user_nodes = register_nut(copy_nut(user_node)) setfield(user_nodes, "type",usercodes.nodes) +local user_string = register_nut(copy_nut(user_node)) setfield(user_string, "type",usercodes.string) +local user_tokens = register_nut(copy_nut(user_node)) setfield(user_tokens, "type",usercodes.tokens) +----- user_lua = register_nut(copy_nut(user_node)) setfield(user_lua, "type",usercodes.lua) -- in > 0.95 +local user_attributes = register_nut(copy_nut(user_node)) setfield(user_attributes,"type",usercodes.attributes) local left_margin_kern = register_nut(new_nut("margin_kern",0)) local right_margin_kern = register_nut(new_nut("margin_kern",1)) @@ -173,36 +185,26 @@ local wordboundary = register_nut(new_nut("boundary",boundarycodes.word)) -- the dir field needs to be set otherwise crash: -local rule = register_nut(new_nut("rule")) setfield(rule, "dir","TLT") -local emptyrule = register_nut(new_nut("rule",rulecodes.empty)) setfield(rule, "dir","TLT") -local userrule = register_nut(new_nut("rule",rulecodes.user)) setfield(rule, "dir","TLT") -local hlist = register_nut(new_nut("hlist")) setfield(hlist,"dir","TLT") -local vlist = register_nut(new_nut("vlist")) setfield(vlist,"dir","TLT") - -function nutpool.zeroglue(n) - if n then - return - getfield(n,"width") == 0 and - getfield(n,"stretch") == 0 and - getfield(n,"shrink") == 0 and - getfield(n,"stretch_order") == 0 and - getfield(n,"shrink_order") == 0 - else - return false - end -end +local rule = register_nut(new_nut("rule")) setdir(rule, "TLT") +local emptyrule = register_nut(new_nut("rule",rulecodes.empty)) setdir(rule, "TLT") +local userrule = register_nut(new_nut("rule",rulecodes.user)) setdir(rule, "TLT") +local hlist = register_nut(new_nut("hlist")) setdir(hlist,"TLT") +local vlist = register_nut(new_nut("vlist")) setdir(vlist,"TLT") function nutpool.glyph(fnt,chr) local n = copy_nut(glyph) - if fnt then setfield(n,"font",fnt) end - if chr then setchar(n,chr) end + if fnt then + setfont(n,fnt,chr) + elseif chr then + setchar(n,chr) + end return n end function nutpool.penalty(p) local n = copy_nut(penalty) if p and p ~= 0 then - setfield(n,"penalty",p) + setpenalty(n,p) end return n end @@ -210,7 +212,7 @@ end function nutpool.kern(k) local n = copy_nut(kern) if k and k ~= 0 then - setfield(n,"kern",k) + setkern(n,k) end return n end @@ -233,79 +235,54 @@ end function nutpool.fontkern(k) local n = copy_nut(fontkern) - setfield(n,"kern",k) + if k and k ~= 0 then + setkern(n,k) + end return n end function nutpool.italickern(k) local n = copy_nut(italickern) if k and k ~= 0 then - setfield(n,"kern",k) + setkern(n,k) end return n end function nutpool.gluespec(width,stretch,shrink,stretch_order,shrink_order) + -- maybe setglue local s = copy_nut(glue_spec) - if width and width ~= 0 then - setfield(s,"width",width) - end - if stretch and stretch ~= 0 then - setfield(s,"stretch",stretch) - end - if shrink and shrink ~= 0 then - setfield(s,"shrink",shrink) - end - if stretch_order and stretch_order ~= 0 then - setfield(s,"stretch_order",stretch_order) - end - if shrink_order and shrink_order ~= 0 then - setfield(s,"shrink_order",shrink_order) + if width or stretch or shrink or stretch_order or shrink_order then + setglue(s,width,stretch,shrink,stretch_order,shrink_order) end return s end local function someskip(skip,width,stretch,shrink,stretch_order,shrink_order) + -- maybe setglue local n = copy_nut(skip) - if width and width ~= 0 then - setfield(n,"width",width) - end - if stretch and stretch ~= 0 then - setfield(n,"stretch",stretch) - end - if shrink and shrink ~= 0 then - setfield(n,"shrink",shrink) - end - if stretch_order and stretch_order ~= 0 then - setfield(n,"stretch_order",stretch_order) - end - if shrink_order and shrink_order ~= 0 then - setfield(n,"shrink_order",shrink_order) + if width or stretch or shrink or stretch_order or shrink_order then + setglue(n,width,stretch,shrink,stretch_order,shrink_order) end return n end function nutpool.stretch(a,b) + -- width stretch shrink stretch_order shrink_order local n = copy_nut(glue) - if b then - setfield(n,"stretch",a) - setfield(n,"stretch_order",b) - else - setfield(n,"stretch",1) - setfield(n,"stretch_order",a or 1) + if not b then + a, b = 1, a or 1 end + setglue(n,0,a,0,b,0) return n end function nutpool.shrink(a,b) local n = copy_nut(glue) - if b then - setfield(n,"shrink",a) - setfield(n,"shrink_order",b) - else - setfield(n,"shrink",1) - setfield(n,"shrink_order",a or 1) + if not b then + a, b = 1, a or 1 end + setglue(n,0,0,a,0,0,b) return n end @@ -315,18 +292,8 @@ end function nutpool.negatedglue(glue) local n = copy_nut(glue) - local width = getfield(n,"width") - local stretch = getfield(n,"stretch") - local shrink = getfield(n,"shrink") - if width and width ~= 0 then - setfield(n,"width", -width) - end - if stretch and stretch ~= 0 then - setfield(n,"stretch",-stretch) - end - if shrink and shrink ~= 0 then - setfield(n,"shrink", -shrink) - end + local width, stretch, shrink = getglue(n) + setglue(n,-width,-stretch,-shrink) return n end @@ -346,63 +313,51 @@ function nutpool.baselineskip(width,stretch,shrink) return someskip(baselineskip,width,stretch,shrink) end -function nutpool.disc() - return copy_nut(disc) +function nutpool.disc(pre,post,replace) + local d = copy_nut(disc) + if pre or post or replace then + setdisc(d,pre,post,replace) + end + return d end function nutpool.textdir(dir) local t = copy_nut(textdir) - setfield(t,"dir",dir) + if dir then + setdir(t,dir) + end return t end function nutpool.rule(width,height,depth,dir) -- w/h/d == nil will let them adapt local n = copy_nut(rule) - if width then -- also 0 else adapt - setfield(n,"width",width) - end - if height then -- also 0 else adapt - setfield(n,"height",height) - end - if depth then -- also 0 else adapt - setfield(n,"depth",depth) + if width or height or depth then + setwhd(n,width,height,depth) end if dir then - setfield(n,"dir",dir) + setdir(n,dir) end return n end function nutpool.emptyrule(width,height,depth,dir) -- w/h/d == nil will let them adapt local n = copy_nut(emptyrule) - if width then -- also 0 else adapt - setfield(n,"width",width) - end - if height then -- also 0 else adapt - setfield(n,"height",height) - end - if depth then -- also 0 else adapt - setfield(n,"depth",depth) + if width or height or depth then + setwhd(n,width,height,depth) end if dir then - setfield(n,"dir",dir) + setdir(n,dir) end return n end function nutpool.userrule(width,height,depth,dir) -- w/h/d == nil will let them adapt local n = copy_nut(userrule) - if width then -- also 0 else adapt - setfield(n,"width",width) - end - if height then -- also 0 else adapt - setfield(n,"height",height) - end - if depth then -- also 0 else adapt - setfield(n,"depth",depth) + if width or height or depth then + setwhd(n,width,height,depth) end if dir then - setfield(n,"dir",dir) + setdir(n,dir) end return n end @@ -413,81 +368,7 @@ function nutpool.latelua(code) return n end -if context and _cldo_ then - - -- a typical case where we have more nodes than nuts - - local context = context - - local f_cldo = string.formatters["_cldo_(%i)"] - local register = context.registerfunction - - local latelua_node = register_node(new_node("whatsit",whatsitcodes.latelua)) - local latelua_nut = register_nut (new_nut ("whatsit",whatsitcodes.latelua)) - - local setfield_node = nodes.setfield - local setfield_nut = nuts .setfield - - -- function nodepool.lateluafunction(f) - -- local n = copy_node(latelua_node) - -- setfield_node(n,"string",f_cldo(register(f))) - -- return n - -- end - - -- function nutpool.lateluafunction(f) - -- local n = copy_nut(latelua_nut) - -- setfield_nut(n,"string",f_cldo(register(f))) - -- return n - -- end - - -- when function in latelua: - - function nodepool.lateluafunction(f) - local n = copy_node(latelua_node) - setfield_node(n,"string",f) - return n - end - - function nutpool.lateluafunction(f) - local n = copy_nut(latelua_nut) - setfield_nut(n,"string",f) - return n - end - - local latefunction = nodepool.lateluafunction - local flushnode = context.flushnode - - -- function context.lateluafunction(f) - -- flushnode(latefunction(f)) -- hm, quite some indirect calls - -- end - - -- when function in latelua: - - -- function context.lateluafunction(f) - -- local n = copy_node(latelua_node) - -- setfield_node(n,"string",f) - -- flushnode(n) - -- end - - -- local contextsprint = context.sprint - -- local ctxcatcodes = tex.ctxcatcodes - -- local storenode = context.storenode - - -- when 0.79 is out: - - -- function context.lateluafunction(f) - -- contextsprint(ctxcatcodes,"\\cldl",storenode(latefunction(f))," ") - -- end - - -- when function in latelua: - - function context.lateluafunction(f) - local n = copy_node(latelua_node) - setfield_node(n,"string",f) - contextsprint(ctxcatcodes,"\\cldl",storenode(n)," ") - end - -end +nutpool.lateluafunction = nutpool.latelua function nutpool.leftmarginkern(glyph,width) local n = copy_nut(left_margin_kern) @@ -499,7 +380,7 @@ function nutpool.leftmarginkern(glyph,width) setfield(n,"glyph",glyph) end if width and width ~= 0 then - setfield(n,"width",width) + setwidth(n,width) end return n end @@ -514,7 +395,7 @@ function nutpool.rightmarginkern(glyph,width) setfield(n,"glyph",glyph) end if width and width ~= 0 then - setfield(n,"width",width) + setwidth(n,width) end return n end @@ -527,51 +408,50 @@ function nutpool.noad() return copy_nut(noad) end -function nutpool.hlist(list,width,height,depth,shift) +local function new_hlist(list,width,height,depth,shift) local n = copy_nut(hlist) if list then setlist(n,list) end - if width and width ~= 0 then - setfield(n,"width",width) - end - if height and height ~= 0 then - setfield(n,"height",height) - end - if depth and depth ~= 0 then - setfield(n,"depth",depth) + if width or height or depth then + setwhd(n,width,height,depth) end if shift and shift ~= 0 then - setfield(n,"shift",shift) + setshift(n,shift) end return n end -function nutpool.vlist(list,width,height,depth,shift) +local function new_vlist(list,width,height,depth,shift) local n = copy_nut(vlist) if list then setlist(n,list) end - if width and width ~= 0 then - setfield(n,"width",width) - end - if height and height ~= 0 then - setfield(n,"height",height) - end - if depth and depth ~= 0 then - setfield(n,"depth",depth) + if width or height or depth then + setwhd(n,width,height,depth) end if shift and shift ~= 0 then - setfield(n,"shift",shift) + setshift(n,shift) end return n end +nutpool.hlist = new_hlist +nutpool.vlist = new_vlist + +function nodepool.hlist(list,width,height,depth,shift) + return tonode(new_hlist(list and tonut(list),width,height,depth,shift)) +end + +function nodepool.vlist(list,width,height,depth,shift) + return tonode(new_vlist(list and tonut(list),width,height,depth,shift)) +end + -- local num = userids["my id"] -- local str = userids[num] function nutpool.usernumber(id,num) - local n = copy_nut(user_n) + local n = copy_nut(user_number) if num then setfield(n,"user_id",id) setfield(n,"value",num) @@ -582,7 +462,7 @@ function nutpool.usernumber(id,num) end function nutpool.userlist(id,list) - local n = copy_nut(user_l) + local n = copy_nut(user_nodes) if list then setfield(n,"user_id",id) setfield(n,"value",list) @@ -593,7 +473,7 @@ function nutpool.userlist(id,list) end function nutpool.userstring(id,str) - local n = copy_nut(user_s) + local n = copy_nut(user_string) if str then setfield(n,"user_id",id) setfield(n,"value",str) @@ -604,7 +484,7 @@ function nutpool.userstring(id,str) end function nutpool.usertokens(id,tokens) - local n = copy_nut(user_t) + local n = copy_nut(user_tokens) if tokens then setfield(n,"user_id",id) setfield(n,"value",tokens) @@ -614,16 +494,27 @@ function nutpool.usertokens(id,tokens) return n end --- function nutpool.usercode(id,code) --- local n = copy_nut(user_c) --- if code then --- setfield(n,"user_id",id) --- setfield(n,"value",code) --- else --- setfield(n,"value",id) --- end --- return n --- end +function nutpool.userlua(id,code) + local n = copy_nut(user_lua) + if code then + setfield(n,"user_id",id) + setfield(n,"value",code) + else + setfield(n,"value",id) + end + return n +end + +function nutpool.userattributes(id,attr) + local n = copy_nut(user_attributes) + if attr then + setfield(n,"user_id",id) + setfield(n,"value",attr) + else + setfield(n,"value",id) + end + return n +end function nutpool.special(str) local n = copy_nut(special) @@ -637,24 +528,22 @@ local function cleanup(nofboxes) -- todo if nodes.tracers.steppers then -- to be resolved nodes.tracers.steppers.reset() -- todo: make a registration subsystem end - local nl, nr = 0, nofreserved + local nl = 0 + local nr = nofreserved for i=1,nofreserved do local ri = reserved[i] - -- if not (getid(ri) == glue_spec and not getfield(ri,"is_writable")) then - free_nut(reserved[i]) - -- end + flush_nut(reserved[i]) end if nofboxes then for i=0,nofboxes do local l = getbox(i) if l then --- print(nodes.listtoutf(getlist(l))) - free_nut(l) -- also list ? + flush_nut(l) -- also list ? nl = nl + 1 end end end - reserved = { } + reserved = { } nofreserved = 0 return nr, nl, nofboxes -- can be nil end |