diff options
Diffstat (limited to 'tex/context/base/node-bck.lua')
-rw-r--r-- | tex/context/base/node-bck.lua | 322 |
1 files changed, 161 insertions, 161 deletions
diff --git a/tex/context/base/node-bck.lua b/tex/context/base/node-bck.lua index 44fed5e17..feaa2c684 100644 --- a/tex/context/base/node-bck.lua +++ b/tex/context/base/node-bck.lua @@ -1,161 +1,161 @@ -if not modules then modules = { } end modules ['node-bck'] = {
- version = 1.001,
- comment = "companion to node-bck.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- beware, this one takes quite some runtime, so we need a status flag
--- maybe some page related state
-
-local attributes, nodes, node = attributes, nodes, node
-
-local nodecodes = nodes.nodecodes
-local listcodes = nodes.listcodes
-
-local hlist_code = nodecodes.hlist
-local vlist_code = nodecodes.vlist
-local glyph_code = nodecodes.glyph
-local cell_code = listcodes.cell
-
-local traverse = node.traverse
-local traverse_id = node.traverse_id
-
-local nodepool = nodes.pool
-local tasks = nodes.tasks
-
-local new_rule = nodepool.rule
-local new_glue = nodepool.glue
-
-local a_color = attributes.private('color')
-local a_transparency = attributes.private('transparency')
-local a_colorspace = attributes.private('colormodel')
-local a_background = attributes.private('background')
-local a_alignbackground = attributes.private('alignbackground')
-
-local function add_backgrounds(head) -- rather old code .. to be redone
- local current = head
- while current do
- local id = current.id
- if id == hlist_code or id == vlist_code then
- local list = current.list
- if list then
- local head = add_backgrounds(list)
- if head then
- current.list = head
- list = head
- end
- end
- local width = current.width
- if width > 0 then
- local background = current[a_background]
- if background then
- -- direct to hbox
- -- colorspace is already set so we can omit that and stick to color
- local mode = current[a_colorspace]
- if mode then
- local height = current.height
- local depth = current.depth
- local skip = id == hlist_code and width or (height + depth)
- local glue = new_glue(-skip)
- local rule = new_rule(width,height,depth)
- local color = current[a_color]
- local transparency = current[a_transparency]
- rule[a_colorspace] = mode
- if color then
- rule[a_color] = color
- end
- if transparency then
- rule[a_transparency] = transparency
- end
- rule.next = glue
- glue.prev = rule
- if list then
- glue.next = list
- list.prev = glue
- end
- current.list = rule
- end
- end
- end
- end
- current = current.next
- end
- return head, true
-end
-
-local function add_alignbackgrounds(head)
- local current = head
- while current do
- local id = current.id
- if id == hlist_code then
- local list = current.list
- if not list then
- -- no need to look
- elseif current.subtype == cell_code then
- local background = nil
- local found = nil
- -- for l in traverse(list) do
- -- background = l[a_alignbackground]
- -- if background then
- -- found = l
- -- break
- -- end
- -- end
- -- we know that it's a fake hlist (could be user node)
- -- but we cannot store tables in user nodes yet
- for l in traverse_id(hpack_code,list) do
- background = l[a_alignbackground]
- if background then
- found = l
- end
- break
- end
- --
- if background then
- -- current has subtype 5 (cell)
- local width = current.width
- if width > 0 then
- local mode = found[a_colorspace]
- if mode then
- local glue = new_glue(-width)
- local rule = new_rule(width,current.height,current.depth)
- local color = found[a_color]
- local transparency = found[a_transparency]
- rule[a_colorspace] = mode
- if color then
- rule[a_color] = color
- end
- if transparency then
- rule[a_transparency] = transparency
- end
- rule.next = glue
- glue.prev = rule
- if list then
- glue.next = list
- list.prev = glue
- end
- current.list = rule
- end
- end
- end
- else
- add_alignbackgrounds(list)
- end
- elseif id == vlist_code then
- local list = current.list
- if list then
- add_alignbackgrounds(list)
- end
- end
- current = current.next
- end
- return head, true
-end
-
-nodes.handlers.backgrounds = add_backgrounds
-nodes.handlers.alignbackgrounds = add_alignbackgrounds
-
-tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds")
-tasks.appendaction("shipouts","normalizers","nodes.handlers.alignbackgrounds")
+if not modules then modules = { } end modules ['node-bck'] = { + version = 1.001, + comment = "companion to node-bck.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- beware, this one takes quite some runtime, so we need a status flag +-- maybe some page related state + +local attributes, nodes, node = attributes, nodes, node + +local nodecodes = nodes.nodecodes +local listcodes = nodes.listcodes + +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist +local glyph_code = nodecodes.glyph +local cell_code = listcodes.cell + +local traverse = node.traverse +local traverse_id = node.traverse_id + +local nodepool = nodes.pool +local tasks = nodes.tasks + +local new_rule = nodepool.rule +local new_glue = nodepool.glue + +local a_color = attributes.private('color') +local a_transparency = attributes.private('transparency') +local a_colorspace = attributes.private('colormodel') +local a_background = attributes.private('background') +local a_alignbackground = attributes.private('alignbackground') + +local function add_backgrounds(head) -- rather old code .. to be redone + local current = head + while current do + local id = current.id + if id == hlist_code or id == vlist_code then + local list = current.list + if list then + local head = add_backgrounds(list) + if head then + current.list = head + list = head + end + end + local width = current.width + if width > 0 then + local background = current[a_background] + if background then + -- direct to hbox + -- colorspace is already set so we can omit that and stick to color + local mode = current[a_colorspace] + if mode then + local height = current.height + local depth = current.depth + local skip = id == hlist_code and width or (height + depth) + local glue = new_glue(-skip) + local rule = new_rule(width,height,depth) + local color = current[a_color] + local transparency = current[a_transparency] + rule[a_colorspace] = mode + if color then + rule[a_color] = color + end + if transparency then + rule[a_transparency] = transparency + end + rule.next = glue + glue.prev = rule + if list then + glue.next = list + list.prev = glue + end + current.list = rule + end + end + end + end + current = current.next + end + return head, true +end + +local function add_alignbackgrounds(head) + local current = head + while current do + local id = current.id + if id == hlist_code then + local list = current.list + if not list then + -- no need to look + elseif current.subtype == cell_code then + local background = nil + local found = nil + -- for l in traverse(list) do + -- background = l[a_alignbackground] + -- if background then + -- found = l + -- break + -- end + -- end + -- we know that it's a fake hlist (could be user node) + -- but we cannot store tables in user nodes yet + for l in traverse_id(hpack_code,list) do + background = l[a_alignbackground] + if background then + found = l + end + break + end + -- + if background then + -- current has subtype 5 (cell) + local width = current.width + if width > 0 then + local mode = found[a_colorspace] + if mode then + local glue = new_glue(-width) + local rule = new_rule(width,current.height,current.depth) + local color = found[a_color] + local transparency = found[a_transparency] + rule[a_colorspace] = mode + if color then + rule[a_color] = color + end + if transparency then + rule[a_transparency] = transparency + end + rule.next = glue + glue.prev = rule + if list then + glue.next = list + list.prev = glue + end + current.list = rule + end + end + end + else + add_alignbackgrounds(list) + end + elseif id == vlist_code then + local list = current.list + if list then + add_alignbackgrounds(list) + end + end + current = current.next + end + return head, true +end + +nodes.handlers.backgrounds = add_backgrounds +nodes.handlers.alignbackgrounds = add_alignbackgrounds + +tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds") +tasks.appendaction("shipouts","normalizers","nodes.handlers.alignbackgrounds") |