summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/pack-obj.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/pack-obj.lua')
-rw-r--r--tex/context/base/mkiv/pack-obj.lua52
1 files changed, 34 insertions, 18 deletions
diff --git a/tex/context/base/mkiv/pack-obj.lua b/tex/context/base/mkiv/pack-obj.lua
index cba0dcf8f..f68c1ba0c 100644
--- a/tex/context/base/mkiv/pack-obj.lua
+++ b/tex/context/base/mkiv/pack-obj.lua
@@ -27,6 +27,7 @@ local new_latelua = nuts.pool.latelua
local settexdimen = tokens.setters.dimen
local gettexbox = tokens.getters.box
+local settexbox = tokens.setters.box
local gettexdimen = tokens.getters.dimen
local gettexcount = tokens.getters.count
@@ -124,22 +125,37 @@ objects = {
n = 0,
}
-function objects.register(ns,id,b,referenced)
+local objects = objects
+
+function objects.register(ns,id,b,referenced,offset,mode)
objects.n = objects.n + 1
- nodes.handlers.finalize(gettexbox(b))
- data[ns][id] = {
- codeinjections.registerboxresource(b), -- a box number
- gettexdimen("objectoff"),
- referenced
- }
+ nodes.handlers.finalize(gettexbox(b),"object")
+ if mode == 0 then
+ -- tex
+ data[ns][id] = {
+ codeinjections.registerboxresource(b), -- a box number
+ offset,
+ referenced or false,
+ mode,
+ }
+ else
+ -- box (backend)
+ data[ns][id] = {
+ codeinjections.registerboxresource(b,offset), -- a box number
+ false,
+ referenced,
+ mode,
+ }
+ end
end
-function objects.restore(ns,id)
+function objects.restore(ns,id) -- why not just pass a box number here too (ok, we also set offset)
local d = data[ns][id]
if d then
local index = d[1]
local offset = d[2]
local status = d[3]
+ local mode = d[4]
local hbox = codeinjections.restoreboxresource(index) -- a nut !
if status then
local list = getlist(hbox)
@@ -149,10 +165,10 @@ function objects.restore(ns,id)
setlink(list,page)
end
setbox("objectbox",hbox)
- settexdimen("objectoff",offset)
+ settexdimen("objectoff",offset or 0)
else
setbox("objectbox",nil)
- settexdimen("objectoff",0)
+ settexdimen("objectoff",0) -- for good old times
end
end
@@ -161,7 +177,7 @@ function objects.dimensions(index)
if d then
return codeinjections.boxresourcedimensions(d[1])
else
- return 0, 0, 0
+ return 0, 0, 0, 0
end
end
@@ -184,13 +200,13 @@ end
implement {
name = "registerreferencedobject",
- arguments = { "string", "string", "integer", true },
+ arguments = { "string", "string", "integer", true, "dimension", "integer" },
actions = objects.register,
}
implement {
name = "registerobject",
- arguments = { "string", "string", "integer" },
+ arguments = { "string", "string", "integer", false, "dimension", "integer" },
actions = objects.register,
}
@@ -238,15 +254,15 @@ implement {
name = "getobjectdimensions",
arguments = { "string", "string" },
actions = function(ns,id)
- local o = data[ns][id]
- local w, h, d = 0, 0, 0
- if d then
- w, h, d = codeinjections.boxresourcedimensions(o[1])
+ local object = data[ns][id]
+ local w, h, d, o = 0, 0, 0, 0
+ if object then
+ w, h, d, o = codeinjections.boxresourcedimensions(object[1])
end
settexdimen("objectwd",w or 0)
settexdimen("objectht",h or 0)
settexdimen("objectdp",d or 0)
- settexdimen("objectoff",o[2])
+ settexdimen("objectoff",o or #objects > 2 and object[2] or 0)
end
}