summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/lpdf-nod.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/lpdf-nod.lua')
-rw-r--r--tex/context/base/mkiv/lpdf-nod.lua214
1 files changed, 60 insertions, 154 deletions
diff --git a/tex/context/base/mkiv/lpdf-nod.lua b/tex/context/base/mkiv/lpdf-nod.lua
index e3c1778f2..8bcf18c62 100644
--- a/tex/context/base/mkiv/lpdf-nod.lua
+++ b/tex/context/base/mkiv/lpdf-nod.lua
@@ -6,178 +6,84 @@ if not modules then modules = { } end modules ['lpdf-nod'] = {
license = "see context related readme files"
}
-local type = type
-
-local formatters = string.formatters
+if CONTEXTLMTXMODE > 1 then
+ return
+end
-local whatsitcodes = nodes.whatsitcodes
-local nodeinjections = backends.nodeinjections
+local nodecodes = nodes.nodecodes
+local whatsitcodes = nodes.whatsitcodes
-local nuts = nodes.nuts
-local tonut = nuts.tonut
+local nodeinjections = backends.nodeinjections
-local setfield = nuts.setfield
+local nuts = nodes.nuts
-local copy_node = nuts.copy
-local new_node = nuts.new
+local setfield = nuts.setfield
+local setdata = nuts.setdata
-local nodepool = nuts.pool
-local register = nodepool.register
+local copy_node = nuts.copy
+local new_node = nuts.new
-local literalvalues = nodes.literalvalues
+local nodepool = nuts.pool
+local register = nodepool.register
-local pdforiginliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdforiginliteral,"mode",literalvalues.origin)
-local pdfpageliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfpageliteral, "mode",literalvalues.page)
-local pdfdirectliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfdirectliteral,"mode",literalvalues.direct)
-local pdfrawliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfrawliteral, "mode",literalvalues.raw)
+local whatsit_code = nodecodes.whatsit
-local pdfsave = register(new_node("whatsit", whatsitcodes.pdfsave))
-local pdfrestore = register(new_node("whatsit", whatsitcodes.pdfrestore))
-local pdfsetmatrix = register(new_node("whatsit", whatsitcodes.pdfsetmatrix))
------ pdfdest = register(new_node("whatsit", whatsitcodes.pdfdest)) setfield(pdfdest,"named_id",1) -- xyz_zoom untouched
------ pdfannot = register(new_node("whatsit", whatsitcodes.pdfannot))
+local savewhatsit_code = whatsitcodes.save
+local restorewhatsit_code = whatsitcodes.restore
+local setmatrixwhatsit_code = whatsitcodes.setmatrix
+local literalwhatsit_code = whatsitcodes.literal
-local variables = interfaces.variables
+local literalvalues = nodes.literalvalues
+local originliteral_code = literalvalues.origin
+local pageliteral_code = literalvalues.page
+local directliteral_code = literalvalues.direct
+local rawliteral_code = literalvalues.raw
-function nodepool.pdforiginliteral(str) local t = copy_node(pdforiginliteral) setfield(t,"data",str) return t end
-function nodepool.pdfpageliteral (str) local t = copy_node(pdfpageliteral ) setfield(t,"data",str) return t end
-function nodepool.pdfdirectliteral(str) local t = copy_node(pdfdirectliteral) setfield(t,"data",str) return t end
-function nodepool.pdfrawliteral (str) local t = copy_node(pdfrawliteral ) setfield(t,"data",str) return t end
+local tomatrix = drivers.helpers.tomatrix
-nodepool.pdfliteral = nodepool.pdfpageliteral -- best is to use a specific one: origin | page | direct | raw
+local originliteralnode = register(new_node(whatsit_code, literalwhatsit_code)) setfield(originliteralnode,"mode",originliteral_code)
+local pageliteralnode = register(new_node(whatsit_code, literalwhatsit_code)) setfield(pageliteralnode, "mode",pageliteral_code)
+local directliteralnode = register(new_node(whatsit_code, literalwhatsit_code)) setfield(directliteralnode,"mode",directliteral_code)
+local rawliteralnode = register(new_node(whatsit_code, literalwhatsit_code)) setfield(rawliteralnode, "mode",rawliteral_code)
-function nodepool.pdfsave()
- return copy_node(pdfsave)
-end
+function nodepool.originliteral(str) local t = copy_node(originliteralnode) setdata(t,str) return t end
+function nodepool.pageliteral (str) local t = copy_node(pageliteralnode ) setdata(t,str) return t end
+function nodepool.directliteral(str) local t = copy_node(directliteralnode) setdata(t,str) return t end
+function nodepool.rawliteral (str) local t = copy_node(rawliteralnode ) setdata(t,str) return t end
-function nodepool.pdfrestore()
- return copy_node(pdfrestore)
-end
+local literals = {
+ [originliteral_code] = originliteralnode, [literalvalues[originliteral_code]] = originliteralnode,
+ [pageliteral_code] = pageliteralnode, [literalvalues[pageliteral_code]] = pageliteralnode,
+ [directliteral_code] = directliteralnode, [literalvalues[directliteral_code]] = directliteralnode,
+ [rawliteral_code] = rawliteralnode, [literalvalues[rawliteral_code]] = rawliteralnode,
+}
-function nodepool.pdfsetmatrix(rx,sx,sy,ry,tx,ty) -- todo: tx ty
- local t = copy_node(pdfsetmatrix)
- if type(rx) == "string" then
- setfield(t,"data",rx)
+function nodepool.literal(mode,str)
+ if str then
+ local t = copy_node(literals[mode] or pageliteralnode)
+ setdata(t,str)
+ return t
else
- if not rx then
- rx = 1
- elseif rx == 0 then
- rx = 0.0001
- end
- if not ry then
- ry = 1
- elseif ry == 0 then
- ry = 0.0001
- end
- if not sx then
- sx = 0
- end
- if not sy then
- sy = 0
- end
- if sx == 0 and sy == 0 then
- if rx == 1 and ry == 1 then
- setfield(t,"data","1 0 0 1")
- else
- setfield(t,"data",formatters["%0.6F 0 0 %0.6F"](rx,ry))
- end
- else
- setfield(t,"data",formatters["%0.6F %0.6F %0.6F %0.6F"](rx,sx,sy,ry))
- end
+ local t = copy_node(pageliteralnode)
+ setdata(t,mode)
+ return t
end
- return t
end
-nodeinjections.save = nodepool.pdfsave
-nodeinjections.restore = nodepool.pdfrestore
-nodeinjections.transform = nodepool.pdfsetmatrix
-
--- the next one is implemented differently, using latelua
-
-function nodepool.pdfannotation(w,h,d,data,n)
- report("don't use node based annotations!")
- os.exit()
- -- local t = copy_node(pdfannot)
- -- if w and w ~= 0 then
- -- setfield(t,"width",w)
- -- end
- -- if h and h ~= 0 then
- -- setfield(t,"height",h)
- -- end
- -- if d and d ~= 0 then
- -- setfield(t,"depth",d)
- -- end
- -- if n then
- -- setfield(t,"objnum",n)
- -- end
- -- if data and data ~= "" then
- -- setfield(t,"data",data)
- -- end
- -- return t
+local savenode = register(new_node(whatsit_code, savewhatsit_code))
+local restorenode = register(new_node(whatsit_code, restorewhatsit_code))
+local setmatrixnode = register(new_node(whatsit_code, setmatrixwhatsit_code))
+
+function nodepool.save()
+ return copy_node(savenode)
end
--- (!) The next code in pdfdest.w is wrong:
---
--- case pdf_dest_xyz:
--- if (matrixused()) {
--- set_rect_dimens(pdf, p, parent_box, cur, alt_rule, pdf_dest_margin) ;
--- } else {
--- pdf_ann_left(p) = pos.h ;
--- pdf_ann_top (p) = pos.v ;
--- }
--- break ;
---
--- so we need to force a matrix.
-
--- local views = { -- beware, we do support the pdf keys but this is *not* official
--- xyz = 0, [variables.standard] = 0,
--- fit = 1, [variables.fit] = 1,
--- fith = 2, [variables.width] = 2,
--- fitv = 3, [variables.height] = 3,
--- fitb = 4,
--- fitbh = 5, [variables.minwidth] = 5,
--- fitbv = 6, [variables.minheight] = 6,
--- fitr = 7,
--- }
-
-function nodepool.pdfdestination(w,h,d,name,view,n)
- report("don't use node based destinations!")
- os.exit()
- -- local t = copy_node(pdfdest)
- -- local hasdimensions = false
- -- if w and w ~= 0 then
- -- setfield(t,"width",w)
- -- hasdimensions = true
- -- end
- -- if h and h ~= 0 then
- -- setfield(t,"height",h)
- -- hasdimensions = true
- -- end
- -- if d and d ~= 0 then
- -- setfield(t,"depth",d)
- -- hasdimensions = true
- -- end
- -- if n then
- -- setfield(t,"objnum",n)
- -- end
- -- view = views[view] or view or 1 -- fit is default
- -- setfield(t,"dest_id",name)
- -- setfield(t,"dest_type",view)
- -- if hasdimensions and view == 0 then -- xyz
- -- -- see (!) s -> m -> t -> r
- -- -- linked
- -- local s = copy_node(pdfsave)
- -- local m = copy_node(pdfsetmatrix)
- -- local r = copy_node(pdfrestore)
- -- setfield(m,"data","1 0 0 1")
- -- setfield(s,"next",m)
- -- setfield(m,"next",t)
- -- setfield(t,"next",r)
- -- setfield(m,"prev",s)
- -- setfield(t,"prev",m)
- -- setfield(r,"prev",t)
- -- return s -- a list
- -- else
- -- return t
- -- end
+function nodepool.restore()
+ return copy_node(restorenode)
+end
+
+function nodepool.setmatrix(rx,sx,sy,ry,tx,ty)
+ local t = copy_node(setmatrixnode)
+ setdata(t,tomatrix(rx,sx,sy,ry,tx,ty))
+ return t
end