1if not modules then modules = { } end modules ['font-cft'] = {
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
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23local type, tonumber = type, tonumber
24
25local fonts = fonts or { }
26local tables = fonts.tables or { }
27fonts.tables = tables
28
29local data = utilities.storage.allocate()
30tables.data = data
31
32do
33
34 local t_units = "<units>"
35 local t_unicode = "<unicode>"
36 local t_unispec = "<unispec>"
37 local t_index = "<index>"
38 local t_cardinal = "<cardinal>"
39 local t_integer = "<integer>"
40 local t_float = "<float>"
41 local t_boolean = "<boolean>"
42 local t_string = "<string>"
43 local t_array = "<array>"
44 local t_hash = "<hash>"
45 local t_scaled = "<scaled>"
46 local t_keyword = "<keyword>"
47 local t_scale = "<scale>"
48 local t_value = "<value>"
49 local t_function = "<function>"
50
51 data.types = {
52 ["units"] = "<units>",
53 ["unicode"] = "<unicode>",
54 ["unispec"] = "<unispec>" ,
55 ["index"] = "<index>",
56 ["cardinal"] = "<cardinal>",
57 ["integer"] = "<integer>",
58 ["float"] = "<float>",
59 ["boolean"] = "<boolean>",
60 ["string"] = "<string>",
61 ["array"] = "<array>",
62 ["hash"] = "<hash>",
63 ["scaled"] = "<scaled>",
64 ["keyword"] = "<keyword>",
65 ["scale"] = "<scale>",
66 ["value"] = "<value>",
67 ["function"] = "<function>",
68 }
69
70 local boundingbox = {
71 t_units,
72 t_units,
73 t_units,
74 t_units
75 }
76
77 local mathvariants = {
78 t_array
79 }
80
81 local mathparts = {
82 {
83 advance = t_units,
84 ["end"] = t_units,
85 extender = t_units,
86 glyph = t_unicode,
87 start = t_units,
88 }
89 }
90
91 local mathkerns = {
92 {
93 height = t_units,
94 kern = t_units,
95 },
96 }
97
98 local mathparts = {
99 {
100 advance = t_scaled,
101 ["end"] = t_scaled,
102 extender = t_scaled,
103 glyph = t_unicode,
104 start = t_scaled,
105 }
106 }
107
108 local mathkerns = {
109 {
110 height = t_scaled,
111 kern = t_scaled,
112 },
113 }
114
115 local vfcommands = {
116 { t_keyword, t_value },
117 }
118
119 local description = {
120 width = t_units,
121 height = t_units,
122 depth = t_units,
123 italic = t_units,
124 index = t_index,
125 boundingbox = boundingbox,
126 unicode = t_unispec,
127 math = {
128 accent = t_units,
129 hvariants = mathvariants,
130 vvariants = mathvariants,
131 hparts = mathparts,
132 vparts = mathparts,
133 kerns = {
134 bottomright = mathkerns,
135 bottomleft = mathkerns,
136 topright = mathkerns,
137 topleft = mathkerns,
138 }
139 },
140 }
141
142 local character = {
143 width = t_scaled,
144 height = t_scaled,
145 depth = t_scaled,
146 italic = t_scaled,
147 index = t_index,
148 expansion_factor = t_scaled,
149 left_protruding = t_scaled,
150 right_protruding = t_scaled,
151 tounicode = t_string,
152 unicode = t_unispec,
153 commands = vfcommands,
154 accent = t_scaled,
155 hvariants = mathvariants,
156 vvariants = mathvariants,
157 hparts = math_parts,
158 vparts = math_parts,
159 kerns = {
160 bottomright = math_kerns,
161 bottomleft = math_kerns,
162 topright = math_kerns,
163 topleft = math_kerns,
164 },
165 ligatures = t_hash,
166 kerns = t_hash,
167 next = t_array,
168 }
169
170 data.original = {
171 cache_uuid = t_string,
172 cache_version = t_float,
173 compacted = t_boolean,
174 creator = t_string,
175 descriptions = { description },
176 format = t_string,
177 goodies = t_hash,
178 metadata = {
179 ascender = t_units,
180 averagewidth = t_units,
181 capheight = t_units,
182 descender = t_units,
183 family = t_string,
184 familyname = t_string,
185 fontname = t_string,
186 fullname = t_string,
187 italicangle = t_float,
188 monospaced = t_boolean,
189 panoseweight = t_string,
190 panosewidth = t_string,
191 pfmweight = t_units,
192 pfmwidth = t_units,
193 subfamily = t_string,
194 subfamilyname = t_string,
195 subfontindex = t_index,
196 units = t_cardinal,
197 version = t_string,
198 weight = t_string,
199 width = t_string,
200 xheight = t_units,
201 },
202 private = t_unicode,
203 properties = {
204 hascolor = t_boolean,
205 hasitalics = t_boolean,
206 hasspacekerns = t_boolean,
207 },
208 resources = {
209 duplicates = t_hash,
210 features = {
211 gpos = t_hash,
212 gsub = t_hash,
213 },
214 filename = t_string,
215 markclasses = t_hash,
216 marks = t_hash,
217 marksets = t_hash,
218 mathconstants = t_hash,
219 private = t_cardinal,
220 sequences = t_array,
221
222 version = t_string,
223 },
224 size = t_cardinal,
225
226 tableversion = t_float,
227 time = t_cardinal,
228 }
229
230 data.scaled = {
231 properties = {
232 encodingbytes = t_cardinal,
233 embedding = t_cardinal,
234 cidinfo = t_hash,
235 format = t_string,
236 fontname = t_string,
237 fullname = t_string,
238 filename = t_string,
239 psname = t_string,
240 name = t_string,
241 virtualized = t_boolean,
242 hasitalics = t_boolean,
243 autoitalicamount = t_float,
244 nostackmath = t_boolean,
245 mode = t_string,
246 hasmath = t_boolean,
247 mathitalics = t_boolean,
248 textitalics = t_boolean,
249 finalized = t_boolean,
250 effect = {
251 effect = t_cardinal,
252 width = t_float,
253 factor = t_float,
254 hfactor = t_float,
255 vfactor = t_float,
256 wdelta = t_float,
257 hdelta = t_float,
258 ddelta = t_float,
259 }
260 },
261 parameters = {
262 mathsize = t_cardinal,
263 scriptpercentage = t_float,
264 scriptscriptpercentage = t_float,
265 units = t_cardinal,
266 designsize = t_scaled,
267 expansion = {
268 stretch = t_scale,
269 shrink = t_scale,
270 step = t_scale,
271 auto = t_boolean,
272 },
273 protrusion = {
274 auto = t_boolean,
275 },
276 slantfactor = t_float,
277 extendfactor = t_float,
278 mode = t_cardinal,
279 width = t_scale,
280 factor = t_float,
281 hfactor = t_float,
282 vfactor = t_float,
283 size = t_scaled,
284 units = t_scaled,
285 scaledpoints = t_scaled,
286 slantperpoint = t_scaled,
287 xheight = t_scaled,
288 quad = t_scaled,
289 ascender = t_scaled,
290 descender = t_scaled,
291 spacing = {
292 width = t_scaled,
293 stretch = t_scaled,
294 shrink = t_scaled,
295 extra = t_scaled,
296 },
297
298
299
300
301
302
303
304
305
306
307
308
309
310 },
311 descriptions = { description },
312 characters = { character },
313 }
314
315 data.goodies = {
316
317 name = t_string,
318 version = t_string,
319 comment = t_string,
320 author = t_string,
321 copyright = t_string,
322
323 remapping = {
324 tounicode = t_boolean,
325 unicodes = {
326 [t_string] = t_index,
327 },
328 },
329 mathematics = {
330 mapfiles = {
331 t_string,
332 },
333 virtuals = {
334 [t_string] = {
335 {
336 name = t_string,
337 features = t_hash,
338 main = t_boolean,
339 extension = t_boolean,
340 vector = t_string,
341 skewchar = t_unicode,
342 parameters = t_boolean,
343 },
344 },
345 },
346 italics = {
347 [t_string] = {
348 defaultfactor = t_float,
349 disableengine = t_boolean,
350 corrections = {
351 [t_unicode] = t_float,
352 }
353 },
354 },
355 kerns = {
356 [t_unicode] = {
357 bottomright = math_kerns,
358 topright = math_kerns,
359 bottomleft = math_kerns,
360 topleft = math_kerns,
361 },
362 },
363 alternates = {
364 [t_string] = {
365 feature = t_hash,
366 value = t_float,
367 comment = t_string,
368 },
369 },
370 variables = {
371 [t_string] = t_value,
372 },
373 parameters = {
374 [t_string] = t_value,
375 [t_string] = t_function,
376 },
377 dimensions = {
378 [t_string] = {
379 [t_unicode] = {
380 width = t_units,
381 height = t_units,
382 depth = t_units,
383 xoffset = t_units,
384 yoffset = t_units,
385 },
386 },
387 },
388 },
389 filenames = {
390 [t_string] = {
391 t_string,
392 },
393 },
394 compositions = {
395 [t_string] = {
396 dy = t_unit,
397 dx = t_unit,
398 [t_unicode] = {
399 dy = t_unit
400 },
401 [t_unicode] = {
402 anchors = {
403 top = {
404 x = t_unit,
405 y = t_unit,
406 },
407 bottom = {
408 x = t_unit,
409 y = t_unit,
410 },
411 },
412 },
413 },
414 },
415 postprocessors = {
416 [t_string] = t_function,
417 },
418 designsizes = {
419 [t_string] = {
420 [t_string] = t_string,
421 default = t_string
422 },
423 },
424 featuresets = {
425 [t_string] = {
426 t_string,
427 [t_keyword] = t_value
428 },
429 },
430 solutions = {
431 experimental = {
432 less = { t_string },
433 more = { t_string },
434 },
435 },
436 stylistics = {
437 [t_string] = t_string,
438 [t_string] = t_string,
439 },
440 colorschemes = {
441 default = {
442 { t_string },
443 }
444 },
445 files = {
446 name = t_string,
447 list = {
448 [t_string] = {
449 name = t_string,
450 weight = t_string,
451 style = t_string,
452 width = t_string,
453 },
454 },
455 },
456 typefaces = {
457 [t_string] = {
458 shortcut = t_string,
459 shape = t_string,
460 fontname = t_string,
461 normalweight = t_string,
462 boldweight = t_string,
463 width = t_string,
464 size = t_string,
465 features = t_string,
466 },
467 },
468 }
469
470end
471
472
473
474if fonts.constructors then
475 fonts.constructors.keys = data.scaled
476end
477
478
479
480local report = logs.reporter("fonts")
481
482function tables.savefont(specification)
483 local method = specification.method
484 local filename = specification.filename
485 local fontname = specification.fontname
486 if not method or method ~= "original" then
487 method = "scaled"
488 end
489 if not filename or filename == "" then
490 filename = "temp-font-" .. method .. ".lua"
491 else
492 filename = file.addsuffix(filename,"lua")
493 end
494 if not fontname or fontname == "" then
495 fontname = true
496 end
497 if fontname == true then
498 report("saving current font in %a",filename)
499 elseif tonumber(fontname) then
500 report("saving font id %a in %a",fontname,filename)
501 fontname = tonumber(fontname)
502 else
503 report("saving font %a in %a",fontname,filename)
504 tfmdata = fonts.definers.define {
505 name = fontname
506 }
507 end
508 if tfmdata then
509 tfmdata = fonts.hashes.identifiers[tfmdata]
510 end
511 if not tfmdata then
512
513 elseif method == "original" then
514 tfmdata = tfmdata.shared and tfmdata.shared.rawdata
515 else
516 tfmdata = {
517 characters = tfmdata.characters,
518 parameters = tfmdata.parameters,
519 properties = tfmdata.properties,
520 specification = tfmdata.specification,
521 }
522 end
523 if tfmdata then
524 table.save(filename,tfmdata)
525 else
526
527 report("saving font failed")
528 end
529end
530
531function tables.saveoriginal(filename,specification)
532 local tfmdata = get(specification)
533 if tfmdata then
534 local rawdata = tfmdata.shared and tfmdata.shared.rawdata
535 if rawdata then
536 table.save(filename,rawdata)
537 end
538 end
539end
540
541if context then
542
543 interfaces.implement {
544 name = "savefont",
545 actions = tables.savefont,
546 arguments = {
547 {
548 { "filename" },
549 { "fontname" },
550 { "method" },
551 }
552 },
553 }
554
555end
556
557 |