4 luatexbase.provides_module({
5 name = 'luatexja.rmlgbm',
8 description = 'Definitions of non-embedded Japanese fonts',
10 module('luatexja.rmlgbm', package.seeall)
11 local err, warn, info, log = luatexbase.errwarinf(_NAME)
13 local rmlgbm_data = require('luatexja-rmlgbm-data')
14 local cache_chars = { [655360] = rmlgbm_data.characters }
16 local function mk_rml(name, size, id)
17 local specification = fonts.define.analyze(name,size)
18 specification = fonts.define.specify[':'](specification)
19 local features = specification.features.normal
23 for k, v in pairs(rmlgbm_data) do
27 fontdata.characters = nil
28 cachedata.characters = nil
29 fontdata.unicodes = nil
32 local shared = cachedata.shared
33 for k, v in pairs(rmlgbm_data.shared) do
37 shared.set_dynamics = fonts.otf.set_dynamics
38 shared.processes, shared.features = fonts.otf.set_features(cachedata,fonts.define.check(features,fonts.otf.features.default))
40 -- characters & scaling
41 if size < 0 then size = -size * 655.36 end
42 local scale = size / 655360
43 if not cache_chars[size] then
44 cache_chars[size] = {}
45 for k, v in pairs(cache_chars[655360]) do
46 cache_chars[size][k] = {}
47 cache_chars[size][k].index = v.index
48 cache_chars[size][k].width = v.width * scale
49 cache_chars[size][k].tounicode = v.tounicode
52 fontdata.characters = cache_chars[size]
53 cachedata.characters = cache_chars[size]
56 for k, v in pairs(rmlgbm_data.parameters) do
57 parameters[k] = v * scale
59 fontdata.parameters = parameters
60 cachedata.parameters = parameters
62 fontdata.ascender = fontdata.ascender * scale
63 cachedata.ascender = fontdata.ascender
64 fontdata.descender = fontdata.descender * scale
65 cachedata.descender = fontdata.descender
66 fontdata.factor = fontdata.factor * scale
67 cachedata.factor = fontdata.factor
68 fontdata.hfactor = fontdata.hfactor * scale
69 cachedata.hfactor = fontdata.hfactor
70 fontdata.vfactor = fontdata.vfactor * scale
71 cachedata.vfactor = fontdata.vfactor
76 fontdata.name = specification.name .. size
77 cachedata.name = fontdata.name
78 fontdata.fullname = specification.name
79 cachedata.fullname = fontdata.fullname
80 fontdata.psname = specification.name
81 cachedata.psname = fontdata.psname
83 fonts.ids[id] = cachedata
88 local dr_orig = fonts.define.read
89 function fonts.define.read(name, size, id)
90 local p = utf.find(name, ":") or utf.len(name)+1
91 if utf.sub(name, 1, p-1) == 'psft' then
92 return mk_rml(utf.sub(name,p+1), size, id)
94 return dr_orig(name, size, id)