1if not modules then modules = { } end modules ['back-res'] = {
2 version = 1.001,
3 comment = "companion to back-ini.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9local context = context
10
11local trace = false trackers.register("backend", function(v) trace = v end)
12local report = logs.reporter("backend")
13
14local scanners = tokens.scanners
15local scankeyword = scanners.keyword
16local scaninteger = scanners.integer
17local scanstring = scanners.string
18local scandimension = scanners.dimension
19local scanword = scanners.word
20local scanwhd = scanners.whd
21
22local implement = interfaces.implement
23local constants = interfaces.constants
24local variables = interfaces.variables
25
26
27
28
29
30local tex_saveboxresource = tex.saveboxresource
31local tex_useboxresource = tex.useboxresource
32local tex_getboxresourcebox = tex.getboxresourcebox
33local tex_getboxresourcedimensions = tex.getboxresourcedimensions
34
35updaters.register("backend.update",function()
36 tex_saveboxresource = tex.saveboxresource
37 tex_useboxresource = tex.useboxresource
38 tex_getboxresourcebox = tex.getboxresourcebox
39 tex_getboxresourcedimensions = tex.getboxresourcedimensions
40end)
41
42local savebox = function(...) return tex_saveboxresource(...) end
43local usebox = function(...) return tex_useboxresource(...) end
44local getbox = function(...) return tex_getboxresourcebox(...) end
45local getwhd = function(...) return tex_getboxresourcedimensions(...) end
46
47local boxresources = {
48 save = savebox,
49 use = usebox,
50 getbox = getbox,
51 getdimensions = getwhd,
52}
53
54tex.boxresources = boxresources
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69local lastindex = 0
70
71local function saveboxresource()
72 local immediate = true
73 local kind = scankeyword("type") and scaninteger() or 0
74 local attributes = scankeyword("attr") and scanstring() or nil
75 local resources = scankeyword("resources") and scanstring() or nil
76 local margin = scankeyword("margin") and scandimension() or 0
77 local boxnumber = scaninteger()
78
79 lastindex = savebox(boxnumber,attributes,resources,immediate,kind,margin)
80 if trace then
81 report("\\saveboxresource: index %i",lastindex)
82 end
83end
84
85local function lastsavedboxresourceindex()
86 if trace then
87 report("\\lastsaveboxresource: index %i",lastindex)
88 end
89 context("%i",lastindex)
90end
91
92local function useboxresource()
93 local width, height, depth = scanwhd()
94 local index = scaninteger()
95 local node = usebox(index,width,height,depth)
96 if trace then
97 report("\\useboxresource: index %i",index)
98 end
99 context(node)
100end
101
102implement { name = "saveboxresource", actions = saveboxresource }
103implement { name = "lastsavedboxresourceindex", actions = lastsavedboxresourceindex }
104implement { name = "useboxresource", actions = useboxresource }
105
106
107
108local imageresources = { }
109local lastindex = 0
110local lastpages = 1
111
112local function saveimageresource()
113 local width, height, depth = scanwhd()
114 local page = 1
115 local immediate = true
116 local margin = 0
117 local attributes = scankeyword("attr") and scanstring() or nil
118 if scankeyword("named") then
119 scanstring()
120 elseif scankeyword("page") then
121 page = scaninteger()
122 end
123 local userpassword = scankeyword("userpassword") and scanstring() or nil
124 local ownerpassword = scankeyword("ownerpassword") and scanstring() or nil
125 local visiblefilename = scankeyword("visiblefilename") and scanstring() or nil
126 local colorspace = scankeyword("colorspace") and scaninteger() or nil
127 local pagebox = scanword() or nil
128 local filename = scanstring()
129
130 context.getfiguredimensions( { filename }, {
131 [constants.userpassword] = userpassword,
132 [constants.ownerpassword] = ownerpassword,
133 [constants.page] = page or 1,
134 [constants.size] = pagebox,
135 })
136 context.relax()
137 lastindex = lastindex + 1
138 lastpages = 1
139 imageresources[lastindex] = {
140 filename = filename,
141 page = page or 1,
142 size = pagebox,
143 width = width,
144 height = height,
145 depth = depth,
146 attr = attributes,
147
148 }
149end
150
151local function lastsavedimageresourceindex()
152 context("%i",lastindex or 0)
153end
154
155local function lastsavedimageresourcepages()
156 context("%i",lastpages or 0)
157end
158
159local function useimageresource()
160 local width, height, depth = scanwhd()
161 if scankeyword("keepopen") then
162
163 end
164 local index = scaninteger()
165 local l = imageresources[index]
166 if l then
167 if not (width or height or depth) then
168 width = l.width
169 height = l.height
170 depth = l.depth
171 end
172
173 context.externalfigure( { l.filename }, {
174 [constants.userpassword] = l.userpassword,
175 [constants.ownerpassword] = l.ownerpassword,
176 [constants.width] = width and (width .. "sp") or nil,
177 [constants.height] = height and (height .. "sp") or nil,
178 [constants.page] = l.page or 1,
179 [constants.size] = pagebox,
180 })
181 context.relax()
182 else
183 report("no valid image resource %a",index)
184 end
185end
186
187implement { name = "saveimageresource", actions = saveimageresource }
188implement { name = "lastsavedimageresourceindex", actions = lastsavedimageresourceindex }
189implement { name = "lastsavedimageresourcepages", actions = lastsavedimageresourcepages }
190implement { name = "useimageresource", actions = useimageresource }
191 |