summaryrefslogtreecommitdiff
path: root/tex/context/base/node-tra.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/node-tra.lua')
-rw-r--r--tex/context/base/node-tra.lua81
1 files changed, 70 insertions, 11 deletions
diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua
index 916b2143d..9fe979e93 100644
--- a/tex/context/base/node-tra.lua
+++ b/tex/context/base/node-tra.lua
@@ -18,10 +18,10 @@ local clock = os.gettimeofday or os.clock -- should go in environment
local report_nodes = logs.reporter("nodes","tracing")
-nodes = nodes or { }
-
local nodes, node, context = nodes, node, context
+local texgetattribute = tex.getattribute
+
local tracers = nodes.tracers or { }
nodes.tracers = tracers
@@ -51,12 +51,13 @@ local glue_code = nodecodes.glue
local kern_code = nodecodes.kern
local rule_code = nodecodes.rule
local whatsit_code = nodecodes.whatsit
-local spec_code = nodecodes.glue_spec
+local gluespec_code = nodecodes.gluespec
local localpar_code = whatcodes.localpar
local dir_code = whatcodes.dir
local nodepool = nodes.pool
+local new_rule = nodepool.rule
local dimenfactors = number.dimenfactors
local formatters = string.formatters
@@ -257,16 +258,19 @@ local function listtoutf(h,joiner,textonly,last)
while h do
local id = h.id
if id == glyph_code then -- always true
- w[#w+1] = utfchar(h.char)
+ local c = h.char
+ w[#w+1] = c >= 0 and utfchar(c) or formatters["<%i>"](c)
if joiner then
w[#w+1] = joiner
end
elseif id == disc_code then
- local pre, rep, pos = h.pre, h.replace, h.post
+ local pre = h.pre
+ local pos = h.post
+ local rep = h.replace
w[#w+1] = formatters["[%s|%s|%s]"] (
pre and listtoutf(pre,joiner,textonly) or "",
- rep and listtoutf(rep,joiner,textonly) or "",
- mid and listtoutf(mid,joiner,textonly) or ""
+ pos and listtoutf(pos,joiner,textonly) or "",
+ rep and listtoutf(rep,joiner,textonly) or ""
)
elseif textonly then
if id == glue_code and h.spec and h.spec.width > 0 then
@@ -342,7 +346,7 @@ local function numbertodimen(d,unit,fmt,strip)
local str = formatters[fmt](d*dimenfactors[unit],unit)
return strip and lpegmatch(stripper,str) or str
end
- local id = node.id
+ local id = d.id
if id == kern_code then
local str = formatters[fmt](d.width*dimenfactors[unit],unit)
return strip and lpegmatch(stripper,str) or str
@@ -350,7 +354,7 @@ local function numbertodimen(d,unit,fmt,strip)
if id == glue_code then
d = d.spec
end
- if not d or not d.id == spec_code then
+ if not d or not d.id == gluespec_code then
local str = formatters[fmt](0,unit)
return strip and lpegmatch(stripper,str) or str
end
@@ -522,8 +526,63 @@ end
-- for the moment here
-nodes.visualizers = { }
+local visualizers = nodes.visualizers or { }
+nodes.visualizers = visualizers
-function nodes.visualizers.handler(head)
+function visualizers.handler(head)
return head, false
end
+
+-- we could cache attribute lists and set attr (copy will increment count) .. todo ..
+-- although tracers are used seldom
+
+local function setproperties(n,c,s)
+ local mm = texgetattribute(a_colormodel)
+ n[a_colormodel] = mm > 0 and mm or 1
+ n[a_color] = m_color[c]
+ n[a_transparency] = m_transparency[c]
+ return n
+end
+
+tracers.setproperties = setproperties
+
+function tracers.setlistv(n,c,s)
+ local f = n
+ local mc = m_color[c]
+ local mt = m_transparency[c]
+ local mm = texgetattribute(a_colormodel)
+ if mm <= 0 then
+ mm = 1
+ end
+ while n do
+ n[a_colormodel] = mm
+ n[a_color] = mc
+ n[a_transparency] = mt
+ n = n.next
+ end
+ return f
+end
+
+function tracers.resetproperties(n)
+ n[a_color] = unsetvalue
+ n[a_transparency] = unsetvalue
+ return n
+end
+
+function tracers.rule(w,h,d,c,s) -- so some day we can consider using literals (speedup)
+ return setproperties(new_rule(w,h,d),c,s)
+end
+
+-- only nodes
+
+local nodestracerpool = { }
+
+tracers.pool = {
+ nodes = nodestracerpool,
+}
+
+function nodestracerpool.rule(w,h,d,c,s) -- so some day we can consider using literals (speedup)
+ return setproperties(new_rule(w,h,d),c,s)
+end
+
+tracers.rule = nodestracerpool.rule -- for a while