diff options
author | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-01-12 17:15:07 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-01-12 17:15:07 +0100 |
commit | 8d8d528d2ad52599f11250cfc567fea4f37f2a8b (patch) | |
tree | 94286bc131ef7d994f9432febaf03fe23d10eef8 /tex/context/base/mkiv/lpdf-nod.lua | |
parent | f5aed2e51223c36c84c5f25a6cad238b2af59087 (diff) | |
download | context-8d8d528d2ad52599f11250cfc567fea4f37f2a8b.tar.gz |
2016-01-12 16:26:00
Diffstat (limited to 'tex/context/base/mkiv/lpdf-nod.lua')
-rw-r--r-- | tex/context/base/mkiv/lpdf-nod.lua | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/lpdf-nod.lua b/tex/context/base/mkiv/lpdf-nod.lua new file mode 100644 index 000000000..3dd5a6648 --- /dev/null +++ b/tex/context/base/mkiv/lpdf-nod.lua @@ -0,0 +1,183 @@ +if not modules then modules = { } end modules ['lpdf-nod'] = { + version = 1.001, + comment = "companion to lpdf-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local type = type + +local formatters = string.formatters + +local whatsitcodes = nodes.whatsitcodes +local nodeinjections = backends.nodeinjections + +local nuts = nodes.nuts +local tonut = nuts.tonut + +local setfield = nuts.setfield + +local copy_node = nuts.copy +local new_node = nuts.new + +local nodepool = nuts.pool +local register = nodepool.register + +local pdfliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfliteral,"mode",1) +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 variables = interfaces.variables + +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.pdfliteral(str) + local t = copy_node(pdfliteral) + setfield(t,"data",str) + return t +end + +function nodepool.pdfdirect(str) + local t = copy_node(pdfliteral) + setfield(t,"data",str) + setfield(t,"mode",1) + return t +end + +function nodepool.pdfsave() + return copy_node(pdfsave) +end + +function nodepool.pdfrestore() + return copy_node(pdfrestore) +end + +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) + 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 + 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 +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. + +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 +end |