summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/back-pdp.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2018-11-18 16:12:36 +0100
committerContext Git Mirror Bot <phg@phi-gamma.net>2018-11-18 16:12:36 +0100
commit744095aa4676553437db0d71c281a74557a3222f (patch)
treebfdf5d203b5fbfa44ee7db705d3b3475361ad28f /tex/context/base/mkiv/back-pdp.lua
parente2ee706a3114129601a30908d6b8cbb57068d32c (diff)
downloadcontext-744095aa4676553437db0d71c281a74557a3222f.tar.gz
2018-11-18 14:16:00
Diffstat (limited to 'tex/context/base/mkiv/back-pdp.lua')
-rw-r--r--tex/context/base/mkiv/back-pdp.lua453
1 files changed, 453 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/back-pdp.lua b/tex/context/base/mkiv/back-pdp.lua
new file mode 100644
index 000000000..69f497b3f
--- /dev/null
+++ b/tex/context/base/mkiv/back-pdp.lua
@@ -0,0 +1,453 @@
+if not modules then modules = { } end modules ['back-pdp'] = {
+ 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"
+}
+
+-- This is temporary ... awaiting a better test .. basically we can
+-- always use this: pdf primitives.
+
+local context = context
+
+local lpdfreserveobject = lpdf.reserveobject
+local lpdfcompresslevel = lpdf.compresslevel
+local lpdfgethpos = lpdf.gethpos
+local lpdfgetvpos = lpdf.getvpos
+local lpdfobj = lpdf.obj
+local lpdfpagereference = lpdf.pagereference
+local lpdfxformname = lpdf.xformname
+
+local scanword = tokens.scanners.word
+local scankeyword = tokens.scanners.keyword
+local scanstring = tokens.scanners.string
+local scaninteger = tokens.scanners.integer
+local scandimension = tokens.scanners.dimension
+
+local trace = false trackers.register("commands", function(v) trace = v end)
+local report = logs.reporter("command")
+
+local nodepool = nodes.pool
+local newsavepos = nodepool.savepos
+local newliteral = nodepool.pdfliteral
+local newsave = nodepool.pdfsave
+local newrestore = nodepool.pdfrestore
+local newsetmatrix = nodepool.pdfsetmatrix
+
+local implement = interfaces.implement
+local constants = interfaces.constants
+local variables = interfaces.variables
+
+-- helper
+
+local function scanwhd()
+ local width, height, depth
+ while true do
+ if scankeyword("width") then
+ width = scandimension()
+ elseif scankeyword("height") then
+ height = scandimension()
+ elseif scankeyword("depth") then
+ depth = scandimension()
+ else
+ break
+ end
+ end
+ if width or height or depth then
+ return width or 0, height or 0, depth or 0
+ else
+ -- we inherit
+ end
+end
+
+-- positions
+
+local function savepos()
+ context(newsavepos())
+end
+
+local function lastxpos()
+ context(lpdfgethpos())
+end
+
+local function lastypos()
+ context(lpdfgetvpos())
+end
+
+implement { name = "savepos", actions = savepos }
+implement { name = "lastxpos", actions = lastxpos }
+implement { name = "lastypos", actions = lastypos }
+
+-- literals
+
+local function pdfliteral()
+ context(newliteral(scanword() or "origin",scanstring()))
+end
+
+implement { name = "pdfliteral", actions = pdfliteral }
+
+-- box resources
+
+local boxresources = tex.boxresources
+local savebox = boxresources.save
+local usebox = boxresources.use
+
+local lastindex = 0
+
+local function saveboxresource()
+ local immediate = true
+ local kind = scankeyword("type") and scaninteger() or 0
+ local attributes = scankeyword("attr") and scanstring() or nil
+ local resources = scankeyword("resources") and scanstring() or nil
+ local margin = scankeyword("margin") and scandimension() or 0 -- register
+ local boxnumber = scaninteger()
+ --
+ lastindex = savebox(boxnumber,attributes,resources,immediate,kind,margin)
+ if trace then
+ report("\\saveboxresource: index %i",lastindex)
+ end
+end
+
+local function lastsavedboxresourceindex()
+ if trace then
+ report("\\lastsaveboxresource: index %i",lastindex)
+ end
+ context("%i",lastindex)
+end
+
+local function useboxresource()
+ local width, height, depth = scanwhd()
+ local index = scaninteger()
+ local node = usebox(index,width,height,depth)
+ if trace then
+ report("\\useboxresource: index %i",index)
+ end
+ context(node)
+end
+
+implement { name = "saveboxresource", actions = saveboxresource }
+implement { name = "lastsavedboxresourceindex", actions = lastsavedboxresourceindex }
+implement { name = "useboxresource", actions = useboxresource }
+
+-- image resources (messy: will move)
+
+local newrule = nodes.pool.rule
+local image_rule_code = nodes.rulecodes.image
+
+local imageresources = { }
+local lastindex = 0
+local lastpages = 1
+
+local function saveimageresource()
+ local width, height, depth = scanwhd()
+ local page = 1
+ local immediate = true
+ local margin = 0 -- or dimension
+ local attributes = scankeyword("attr") and scanstring() or nil
+ if scankeyword("named") then
+ scanstring() -- ignored
+ elseif scankeyword("page") then
+ page = scaninteger()
+ end
+ local userpassword = scankeyword("userpassword") and scanstring() or nil
+ local ownerpassword = scankeyword("ownerpassword") and scanstring() or nil
+ local visiblefilename = scankeyword("visiblefilename") and scanstring() or nil
+ local colorspace = scankeyword("colorspace") and scaninteger() or nil
+ local pagebox = scanword() or nil
+ local filename = scanstring()
+-- pcall
+ context.getfiguredimensions( { filename }, {
+ [constants.userpassword] = userpassword,
+ [constants.ownerpassword] = ownerpassword,
+ [constants.page] = page or 1,
+ [constants.size] = pagebox,
+ })
+ context.relax()
+ lastindex = lastindex + 1
+ lastpages = 1
+ imageresources[lastindex] = {
+ filename = filename,
+ page = page or 1,
+ size = pagebox,
+ width = width,
+ height = height,
+ depth = depth,
+ attr = attributes,
+ -- margin = margin,
+ }
+end
+
+local function lastsavedimageresourceindex()
+ context("%i",lastindex or 0)
+end
+
+local function lastsavedimageresourcepages()
+ context("%i",lastpages or 0) -- todo
+end
+
+local function useimageresource()
+ local width, height, depth = scanwhd()
+ if scankeyword("keepopen") then
+ -- ignored
+ end
+ local index = scaninteger()
+ local l = imageresources[index]
+ if l then
+ if not (width or height or depth) then
+ width = l.width
+ height = l.height
+ depth = l.depth
+ end
+-- pcall
+ context.externalfigure( { l.filename }, {
+ [constants.userpassword] = l.userpassword,
+ [constants.ownerpassword] = l.ownerpassword,
+ [constants.width] = width and (width .. "sp") or nil,
+ [constants.height] = height and (height .. "sp") or nil,
+ [constants.page] = l.page or 1,
+ [constants.size] = pagebox,
+ })
+ context.relax()
+ else
+ print("no image resource",index)
+ end
+end
+
+implement { name = "saveimageresource", actions = saveimageresource }
+implement { name = "lastsavedimageresourceindex", actions = lastsavedimageresourceindex }
+implement { name = "lastsavedimageresourcepages", actions = lastsavedimageresourcepages }
+implement { name = "useimageresource", actions = useimageresource }
+
+-- objects
+
+local lastobjnum = 0
+
+local function pdfobj()
+ if scankeyword("reserveobjnum") then
+ lastobjnum = lpdfreserveobject()
+ if trace then
+ report("\\pdfobj reserveobjnum: object %i",lastobjnum)
+ end
+ else
+ local immediate = true
+ local objnum = scankeyword("useobjnum") and scaninteger() or lpdfreserveobject()
+ local uncompress = scankeyword("uncompressed") or lpdfcompresslevel() == 0
+ local streamobject = scankeyword("stream") and true or false
+ local attributes = scankeyword("attr") and scanstring()
+ local fileobject = scankeyword("file")
+ local content = scanstring()
+ local object = {
+ immediate = immediate,
+ attr = attributes,
+ objnum = objnum,
+ type = streamobject and "stream" or nil,
+ compresslevel = uncompress and 0 or nil,
+ }
+ if fileobject then
+ object.filename = content
+ else
+ object.string = content
+ end
+ lpdfobj(object)
+ lastobjnum = objnum
+ if trace then
+ report("\\pdfobj: object %i",lastobjnum)
+ end
+ end
+end
+
+local function pdflastobj()
+ context("%i",lastobjnum)
+ if trace then
+ report("\\lastobj: object %i",lastobjnum)
+ end
+end
+
+local function pdfrefobj()
+ local objnum = scaninteger()
+ if trace then
+ report("\\refobj: object %i (todo)",objnum)
+ end
+end
+
+implement { name = "pdfobj", actions = pdfobj }
+implement { name = "pdflastobj", actions = pdflastobj }
+implement { name = "pdfrefobj", actions = pdfrefobj }
+
+-- annotations
+
+local lastobjnum = 0
+
+local function pdfannot()
+ if scankeyword("reserveobjnum") then
+ lastobjnum = lpdfreserveobject()
+ if trace then
+ report("\\pdfannot reserveobjnum: object %i",lastobjnum)
+ end
+ else
+ local width = false
+ local height = false
+ local depth = false
+ local data = false
+ local object = false
+ local attr = false
+ --
+ if scankeyword("useobjnum") then
+ object = scancount()
+ report("\\pdfannot useobjectnum is not (yet) supported")
+ end
+ local width, height, depth = scanwhd()
+ if scankeyword("attr") then
+ attr = scanstring()
+ end
+ data = scanstring()
+ context(backends.nodeinjections.annotation(width or 0,height or 0,depth or 0,data or ""))
+ end
+end
+
+implement { name = "pdfannot", actions = pdfannot }
+
+local function pdfdest()
+ local name = false
+ local zoom = false
+ local view = false
+ local width = false
+ local height = false
+ local depth = false
+ if scankeyword("num") then
+ report("\\pdfdest num is not (yet) supported")
+ elseif scankeyword("name") then
+ name = scanstring()
+ end
+ if scankeyword("xyz") then
+ view = "xyz"
+ if scankeyword("zoom") then
+ report("\\pdfdest zoom is ignored")
+ zoom = scancount() -- will be divided by 1000 in the backend
+ end
+ elseif scankeyword("fitbh") then
+ view = "fitbh"
+ elseif scankeyword("fitbv") then
+ view = "fitbv"
+ elseif scankeyword("fitb") then
+ view = "fitb"
+ elseif scankeyword("fith") then
+ view = "fith"
+ elseif scankeyword("fitv") then
+ view = "fitv"
+ elseif scankeyword("fitr") then
+ view = "fitr"
+ width, height, depth = scanwhd()
+ elseif scankeyword("fit") then
+ view = "fit"
+ end
+ context(backends.nodeinjections.destination(width or 0,height or 0,depth or 0,{ name or "" },view or "fit"))
+end
+
+implement { name = "pdfdest", actions = pdfdest }
+
+-- management
+
+
+local function pdfsave()
+ context(newsave())
+end
+
+local function pdfrestore()
+ context(newrestore())
+end
+
+local function pdfsetmatrix()
+ context(newsetmatrix(scanstring()))
+end
+
+
+-- extras
+
+local function pdfpageref()
+ context(lpdfpagereference())
+end
+
+local function pdfxformname()
+ context(lpdfxformname())
+end
+
+-- extensions: literal dest annot save restore setmatrix obj refobj colorstack
+-- startlink endlink startthread endthread thread outline glyphtounicode fontattr
+-- mapfile mapline includechars catalog info names trailer
+
+local extensions = {
+ literal = pdfliteral,
+ obj = pdfobj,
+ refobj = pdfrefobj,
+ dest = pdfdest,
+ annot = pdfannot,
+ save = pdfsave,
+ restore = pdfrestore,
+ setmatrix = pdfsetmatrix,
+}
+
+local function pdfextension()
+ local w = scanword()
+ if w then
+ local e = extensions[w]
+ if e then
+ e()
+ else
+ report("\\pdfextension: unknown %a",w)
+ end
+ end
+end
+
+implement { name = "pdfextension", actions = pdfextension }
+
+-- feedbacks: colorstackinit creationdate fontname fontobjnum fontsize lastannot
+-- lastlink lastobj pageref retval revision version xformname
+
+local feedbacks = {
+ lastobj = pdflastobj,
+ pageref = pdfpageref,
+ xformname = pdfxformname,
+}
+
+local function pdffeedback()
+ local w = scanword()
+ if w then
+ local f = feedbacks[w]
+ if f then
+ f()
+ else
+ report("\\pdffeedback: unknown %a",w)
+ end
+ end
+end
+
+implement { name = "pdffeedback", actions = pdffeedback }
+
+-- variables: (integers:) compresslevel decimaldigits gamma gentounicode
+-- ignoreunknownimages imageaddfilename imageapplygamma imagegamma imagehicolor
+-- imageresolution inclusioncopyfonts inclusionerrorlevel majorversion minorversion
+-- objcompresslevel omitcharset omitcidset pagebox pkfixeddpi pkresolution
+-- recompress suppressoptionalinfo uniqueresname (dimensions:) destmargin horigin
+-- linkmargin threadmargin vorigin xformmargin (tokenlists:) pageattr pageresources
+-- pagesattr pkmode trailerid xformattr xformresources
+
+-- local variables = {
+-- }
+--
+-- local function pdfvariable()
+-- local w = scanword()
+-- if w then
+-- local f = variables[w]
+-- if f then
+-- f()
+-- else
+-- print("invalid variable",w)
+-- end
+-- else
+-- print("missing variable")
+-- end
+-- end
+
+--------- { name = "pdfvariable", actions = pdfvariable }