1if not modules then modules = { } end modules ['font-hsh'] = {
2 version = 1.001,
3 comment = "companion to font-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 rawget = rawget
10
11local setmetatableindex = table.setmetatableindex
12local currentfont = font and font.current
13local allocate = utilities.storage.allocate
14
15local fonts = fonts
16local hashes = fonts.hashes or allocate()
17fonts.hashes = hashes
18
19
20
21local identifiers = hashes.identifiers or allocate()
22local characters = hashes.characters or allocate()
23local descriptions = hashes.descriptions or allocate()
24local parameters = hashes.parameters or allocate()
25local mathparameters = hashes.mathparameters or allocate()
26local properties = hashes.properties or allocate()
27local resources = hashes.resources or allocate()
28local spacings = hashes.spacings or allocate()
29local spaces = hashes.spaces or allocate()
30local quads = hashes.quads or allocate()
31local xheights = hashes.xheights or allocate()
32local csnames = hashes.csnames or allocate()
33local features = hashes.features or allocate()
34local marks = hashes.marks or allocate()
35local classes = hashes.classes or allocate()
36local italics = hashes.italics or allocate()
37local lastmathids = hashes.lastmathids or allocate()
38local dynamics = hashes.dynamics or allocate()
39local unicodes = hashes.unicodes or allocate()
40local unislots = hashes.unislots or allocate()
41local originals = hashes.originals or allocate()
42local modes = hashes.modes or allocate()
43local variants = hashes.variants or allocate()
44
45hashes.characters = characters
46hashes.descriptions = descriptions
47hashes.parameters = parameters
48hashes.mathparameters = mathparameters
49hashes.properties = properties
50hashes.resources = resources
51hashes.spacings = spacings
52hashes.spaces = spaces
53hashes.quads = quads hashes.emwidths = quads
54hashes.xheights = xheights hashes.exheights = xheights
55hashes.csnames = csnames
56hashes.features = features
57hashes.marks = marks
58hashes.classes = classes
59hashes.italics = italics
60hashes.lastmathids = lastmathids
61hashes.dynamics = dynamics
62hashes.unicodes = unicodes
63hashes.unislots = unislots
64hashes.originals = originals
65hashes.modes = modes
66hashes.variants = variants
67
68local nodepool = nodes and nodes.pool
69local dummyglyph = nodepool and nodepool.register(nodepool.glyph())
70
71local nulldata = allocate {
72 name = "nullfont",
73 characters = { },
74 descriptions = { },
75 properties = {
76 designsize = 786432,
77 },
78 parameters = {
79 slantperpoint = 0,
80 spacing = {
81 width = 256377,
82 stretch = 128188,
83 shrink = 85459,
84 extra = 85459,
85 },
86 quad = 786432,
87 xheight = 338952,
88
89 slant = 0,
90 space = 256377,
91 space_stretch = 128188,
92 space_shrink = 85459,
93 x_height = 338952,
94 quad = 786432,
95 extra_space = 85459,
96 size = 786432,
97 },
98}
99
100fonts.nulldata = nulldata
101
102fonts.constructors.enhanceparameters(nulldata.parameters)
103
104setmetatableindex(identifiers, function(t,k)
105 return k == true and identifiers[currentfont()] or nulldata
106end)
107
108if font then
109
110
111
112 local define = font.define
113 local setfont = font.setfont
114 local frozen = font.frozen
115
116 function fonts.reserveid(fontdata)
117 return define(fontdata or nulldata)
118 end
119
120 function fonts.enhanceid(id,fontdata)
121 if not frozen(id) then
122 setfont(id,fontdata)
123 end
124 end
125
126end
127
128setmetatableindex(characters, function(t,k)
129 if k == true then
130 return characters[currentfont()]
131 else
132 local characters = identifiers[k].characters
133 t[k] = characters
134 return characters
135 end
136end)
137
138setmetatableindex(descriptions, function(t,k)
139 if k == true then
140 return descriptions[currentfont()]
141 else
142 local descriptions = identifiers[k].descriptions
143 t[k] = descriptions
144 return descriptions
145 end
146end)
147
148setmetatableindex(parameters, function(t,k)
149 if k == true then
150 return parameters[currentfont()]
151 else
152 local parameters = identifiers[k].parameters
153 t[k] = parameters
154 return parameters
155 end
156end)
157
158setmetatableindex(mathparameters, function(t,k)
159 if k == true then
160 return mathparameters[currentfont()]
161 else
162 local mathparameters = identifiers[k].mathparameters
163 t[k] = mathparameters
164 return mathparameters
165 end
166end)
167
168setmetatableindex(properties, function(t,k)
169 if k == true then
170 return properties[currentfont()]
171 else
172 local properties = identifiers[k].properties
173 t[k] = properties
174 return properties
175 end
176end)
177
178setmetatableindex(resources, function(t,k)
179 if k == true then
180 return resources[currentfont()]
181 else
182 local shared = identifiers[k].shared
183 local rawdata = shared and shared.rawdata
184 local resources = rawdata and rawdata.resources
185 t[k] = resources or false
186 return resources
187 end
188end)
189
190setmetatableindex(features, function(t,k)
191 if k == true then
192 return features[currentfont()]
193 else
194 local shared = identifiers[k].shared
195 local features = shared and shared.features or { }
196 t[k] = features
197 return features
198 end
199end)
200
201local nospacing = {
202 width = 0,
203 stretch = 0,
204 shrink = 0,
205 extra = 0,
206}
207
208setmetatableindex(spacings, function(t,k)
209 if k == true then
210 return spacings[currentfont()]
211 else
212 local parameters = parameters[k]
213 local spacing = parameters and parameters.spacing or nospacing
214 t[k] = spacing
215 return spacing
216 end
217end)
218
219setmetatableindex(spaces, function(t,k)
220 if k == true then
221 return spaces[currentfont()]
222 else
223 local space = spacings[k].width
224 t[k] = space
225 return space
226 end
227end)
228
229setmetatableindex(marks, function(t,k)
230 if k == true then
231 return marks[currentfont()]
232 else
233 local resources = identifiers[k].resources or { }
234 local marks = resources.marks or { }
235 t[k] = marks
236 return marks
237 end
238end)
239
240setmetatableindex(classes, function(t,k)
241 if k == true then
242 return classes[currentfont()]
243 else
244 local resources = identifiers[k].resources or { }
245 local classes = resources.classes or { }
246 t[k] = classes
247 return classes
248 end
249end)
250
251setmetatableindex(quads, function(t,k)
252 if k == true then
253 return quads[currentfont()]
254 else
255 local parameters = rawget(parameters,k)
256 local quad
257 if parameters then
258 quad = parameters.quad
259 elseif dummyglyph then
260 dummyglyph.font = k
261 dummyglyph.char = 0x2014
262 quad = dummyglyph.width
263 end
264 if not quad or quad == 0 then
265 quad = 655360
266 end
267 t[k] = quad
268 return quad
269 end
270end)
271
272setmetatableindex(xheights, function(t,k)
273 if k == true then
274 return xheights[currentfont()]
275 else
276 local parameters = rawget(parameters,k)
277 local xheight
278 if parameters then
279 xheight = parameters.xheight
280 elseif dummyglyph then
281 dummyglyph.font = k
282 dummyglyph.char = 0x78
283 xheight = dummyglyph.height
284 end
285 if not xheight or xheight == 0 then
286 xheight = 282460
287 end
288 t[k] = xheight
289 return xheight
290 end
291end)
292
293setmetatableindex(italics, function(t,k)
294 if k == true then
295 return italics[currentfont()]
296 else
297 local properties = identifiers[k].properties
298 local hasitalics = properties and properties.hasitalics
299 if hasitalics then
300 hasitalics = characters[k]
301 else
302 hasitalics = false
303 end
304 t[k] = hasitalics
305 return hasitalics
306 end
307end)
308
309setmetatableindex(dynamics, function(t,k)
310 if k == true then
311 return dynamics[currentfont()]
312 else
313 local shared = identifiers[k].shared
314 local dynamics = shared and shared.dynamics or false
315 t[k] = dynamics
316 return dynamics
317 end
318end)
319
320setmetatableindex(unicodes, function(t,k)
321 if k == true then
322 return unicodes[currentfont()]
323 else
324 local resources = resources[k]
325 local unicodes = resources and resources.unicodes or { }
326 t[k] = unicodes
327 return unicodes
328 end
329end)
330
331setmetatableindex(originals, function(t,k)
332 if k == true then
333 return originals[currentfont()]
334 else
335 local resolved = { }
336 setmetatableindex(resolved,function(t,name)
337 local u = unicodes[k][name]
338 local d = u and descriptions[k][u]
339 local v = d and d.unicode or u or 0
340 t[name] = u
341 return v
342 end)
343 t[k] = resolved
344 return resolved
345 end
346end)
347
348setmetatableindex(unislots, function(t,k)
349 if k == true then
350 return unislots[currentfont()]
351 else
352 local characters = identifiers[k].characters
353 local resolved = setmetatableindex(function(t,k)
354 local c = characters[k]
355 local v = c and c.unicode or 0xFFFD
356 t[k] = v
357 return v
358 end)
359 t[k] = resolved
360 return resolved
361 end
362end)
363
364setmetatableindex(modes, function(t,k)
365 if k == true then
366 return modes[currentfont()]
367 else
368 local mode = properties[k].mode or "base"
369 t[k] = mode
370 return mode
371 end
372end)
373
374setmetatableindex(variants, function(t,k)
375 if k == true then
376 return variants[currentfont()]
377 else
378 local resources = resources[k]
379 if resources then
380 local variants = resources.variants
381 if variants and next(variants) then
382 t[k] = variants
383 return variants
384 end
385 end
386 t[k] = false
387 return false
388 end
389end)
390
391if font then
392
393 function font.getfont(id)
394 return identifiers[id]
395 end
396
397end
398
399
400 |