diff options
Diffstat (limited to 'tex/context/base/mkiv/grph-mem.lua')
-rw-r--r-- | tex/context/base/mkiv/grph-mem.lua | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/grph-mem.lua b/tex/context/base/mkiv/grph-mem.lua new file mode 100644 index 000000000..bb48ae8d5 --- /dev/null +++ b/tex/context/base/mkiv/grph-mem.lua @@ -0,0 +1,106 @@ +if not modules then modules = { } end modules ['grph-mem'] = { + version = 1.001, + comment = "companion to grph-inc.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- very experimental and likely to change +-- +-- \startluacode +-- figures.setmemstream("whatever",io.loaddata("t:/sources/cow.pdf")) +-- \stopluacode +-- +-- \externalfigure[memstream:///t:/sources/cow.pdf] +-- \externalfigure[memstream:///whatever] + +local gsub = string.gsub + +local report = logs.reporter("memstream") +local trace = false trackers.register ("graphics.memstreams", function(v) trace = v end) +local data = { } +local opened = { } + +local function setmemstream(name,stream,once) + if once and data[name] then + if trace then + report("not overloading %a",name) -- + end + return data[name] + end + local memstream, identifier = epdf.openMemStream(stream,#stream,name) + if not identifier then + report("no valid stream %a",name) + identifier = "invalid-memstream" + elseif trace then + report("setting %a with identifier %a",name,identifier) + end + data [name] = identifier + opened[name] = memstream + return identifier +end + +resolvers.setmemstream = setmemstream + +function resolvers.finders.memstream(specification) + local name = specification.path + local identifier = data[name] + if identifier then + if trace then + report("reusing %a with identifier %a",name,identifier) + end + return identifier + end + local stream = io.loaddata(name) + if not stream or stream == "" then + if trace then + report("no valid file %a",name) + end + return resolvers.finders.notfound() + else + return setmemstream(name,stream) + end +end + +local flush = { } + +function resolvers.resetmemstream(name,afterpage) + if afterpage then + flush[#flush+1] = name + else + opened[name] = nil + end +end + +luatex.registerpageactions(function() + if #flush > 0 then + for i=1,#flush do + opened[flush[i]] = nil -- we keep of course data[name] because of reuse + end + flush = { } + end +end) + +figures.identifiers.list[#figures.identifiers.list+1] = function(specification) + local name = specification.request.name + if name then + local base = gsub(name,"^memstream:///","") + if base ~= name then + local identifier = data[base] + if identifier then + if trace then + report("requested %a has identifier %s",name,identifier) + end + specification.status.status = 1 + specification.used.fullname = name + else + if trace then + report("requested %a is not found",name) + end + end + end + end +end + +figures.setmemstream = resolvers.setmemstream |