diff options
Diffstat (limited to 'tex/context/base/mkiv/lpdf-nod.lua')
-rw-r--r-- | tex/context/base/mkiv/lpdf-nod.lua | 268 |
1 files changed, 37 insertions, 231 deletions
diff --git a/tex/context/base/mkiv/lpdf-nod.lua b/tex/context/base/mkiv/lpdf-nod.lua index 9d4bf9270..d5c1f6b46 100644 --- a/tex/context/base/mkiv/lpdf-nod.lua +++ b/tex/context/base/mkiv/lpdf-nod.lua @@ -6,9 +6,9 @@ if not modules then modules = { } end modules ['lpdf-nod'] = { license = "see context related readme files" } -local type = type - -local formatters = string.formatters +if CONTEXTLMTXMODE then + return +end local nodecodes = nodes.nodecodes local whatsitcodes = nodes.whatsitcodes @@ -16,7 +16,6 @@ local whatsitcodes = nodes.whatsitcodes local nodeinjections = backends.nodeinjections local nuts = nodes.nuts -local tonut = nuts.tonut local setfield = nuts.setfield local setdata = nuts.setdata @@ -40,244 +39,51 @@ local pageliteral_code = literalvalues.page local directliteral_code = literalvalues.direct local rawliteral_code = literalvalues.raw -local s_matrix_0 = "1 0 0 1" -local f_matrix_2 = formatters["%.6F 0 0 %.6F"] -local f_matrix_4 = formatters["%.6F %.6F %.6F %.6F"] - -directives.register("pdf.stripzeros",function() - f_matrix_2 = formatters["%.6N 0 0 %.6N"] - f_matrix_4 = formatters["%.6N %.6N %.6N %.6N"] -end) - -local function tomatrix(rx,sx,sy,ry,tx,ty) -- todo: tx ty - if type(rx) == "string" then - return rx - 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 - return s_matrix_0 - else - return f_matrix_2(rx,ry) - end - else - return f_matrix_4(rx,sx,sy,ry) - end - end -end - -if CONTEXTLMTXMODE then - - local nodeproperties = nodes.properties.data - - local pdfliteral = register(new_node(whatsit_code,literalwhatsit_code)) - - function nodepool.pdforiginliteral(str) local t = copy_node(pdfliteral) nodeproperties[t] = { data = str, mode = originliteral_code } return t end - function nodepool.pdfpageliteral (str) local t = copy_node(pdfliteral) nodeproperties[t] = { data = str, mode = pageliteral_code } return t end - function nodepool.pdfdirectliteral(str) local t = copy_node(pdfliteral) nodeproperties[t] = { data = str, mode = directliteral_code } return t end - function nodepool.pdfrawliteral (str) local t = copy_node(pdfliteral) nodeproperties[t] = { data = str, mode = rawliteral_code } return t end - - local pdfliterals = { - -- by number - [originliteral_code] = originliteral_code, - [pageliteral_code] = pageliteral_code, - [directliteral_code] = directliteral_code, - [rawliteral_code] = rawliteral_code, - -- by name - [literalvalues[originliteral_code]] = originliteral_code, - [literalvalues[pageliteral_code]] = pageliteral_code, - [literalvalues[directliteral_code]] = directliteral_code, - [literalvalues[rawliteral_code]] = rawliteral_code, - } - - function nodepool.pdfliteral(mode,str) - local t = copy_node(pdfliteral) - if str then - nodeproperties[t] = { data = str, mode = pdfliterals[mode] or pageliteral_code } - else - nodeproperties[t] = { data = mode, mode = pageliteral_code } - end - return t - end - -else - - local pdforiginliteral = register(new_node(whatsit_code, literalwhatsit_code)) setfield(pdforiginliteral,"mode",originliteral_code) - local pdfpageliteral = register(new_node(whatsit_code, literalwhatsit_code)) setfield(pdfpageliteral, "mode",pageliteral_code) - local pdfdirectliteral = register(new_node(whatsit_code, literalwhatsit_code)) setfield(pdfdirectliteral,"mode",directliteral_code) - local pdfrawliteral = register(new_node(whatsit_code, literalwhatsit_code)) setfield(pdfrawliteral, "mode",rawliteral_code) - - function nodepool.pdforiginliteral(str) local t = copy_node(pdforiginliteral) setdata(t,str) return t end - function nodepool.pdfpageliteral (str) local t = copy_node(pdfpageliteral ) setdata(t,str) return t end - function nodepool.pdfdirectliteral(str) local t = copy_node(pdfdirectliteral) setdata(t,str) return t end - function nodepool.pdfrawliteral (str) local t = copy_node(pdfrawliteral ) setdata(t,str) return t end +local tomatrix = drivers.helpers.tomatrix - local pdfliterals = { - -- by number - [originliteral_code] = pdforiginliteral, - [pageliteral_code] = pdfpageliteral, - [directliteral_code] = pdfdirectliteral, - [rawliteral_code] = pdfrawliteral, - -- by name - [literalvalues[originliteral_code]] = pdforiginliteral, - [literalvalues[pageliteral_code]] = pdfpageliteral, - [literalvalues[directliteral_code]] = pdfdirectliteral, - [literalvalues[rawliteral_code]] = pdfrawliteral, - } +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.pdfliteral(mode,str) - if str then - local t = copy_node(pdfliterals[mode] or pdfpageliteral) - setdata(t,str) - return t - else - local t = copy_node(pdfpageliteral) - setdata(t,mode) - return t - end - end - -end - -local pdfsave = register(new_node(whatsit_code, savewhatsit_code)) -local pdfrestore = register(new_node(whatsit_code, restorewhatsit_code)) -local pdfsetmatrix = register(new_node(whatsit_code, setmatrixwhatsit_code)) - -function nodepool.pdfsave() - return copy_node(pdfsave) -end - -function nodepool.pdfrestore() - return copy_node(pdfrestore) -end - -if CONTEXTLMTXMODE then +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 - local nodeproperties = nodes.properties.data +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) - local t = copy_node(pdfsetmatrix) - nodeproperties[t] = { matrix = tomatrix(rx,sx,sy,ry,tx,ty) } +function nodepool.literal(mode,str) + if str then + local t = copy_node(literals[mode] or pageliteralnode) + setdata(t,str) return t - end - -else - - function nodepool.pdfsetmatrix(rx,sx,sy,ry,tx,ty) - local t = copy_node(pdfsetmatrix) - setdata(t,tomatrix(rx,sx,sy,ry,tx,ty)) + else + local t = copy_node(pageliteralnode) + setdata(t,mode) return t end - end --- best is to use a specific one: origin | page | direct | raw - -nodeinjections.save = nodepool.pdfsave -nodeinjections.restore = nodepool.pdfrestore -nodeinjections.transform = nodepool.pdfsetmatrix - --- the next one is implemented differently, using latelua +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.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 +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.restore() + return copy_node(restorenode) +end -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.setmatrix(rx,sx,sy,ry,tx,ty) + local t = copy_node(setmatrixnode) + setdata(t,tomatrix(rx,sx,sy,ry,tx,ty)) + return t end |