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
77 if features.slant then
78 fontdata.slant = features.slant*1000
79 cachedata.slant = fontdata.slant
80 var = var .. 's' .. tostring(features.slant)
82 if features.extend then
83 fontdata.extend = features.extend*1000
84 cachedata.extend = fontdata.extend
85 var = var .. 'x' .. tostring(features.extend)
87 fontdata.name = specification.name .. size .. var
88 cachedata.name = fontdata.name
89 fontdata.fullname = specification.name .. var
90 cachedata.fullname = fontdata.fullname
92 fontdata.psname = specification.name
93 cachedata.psname = fontdata.psname
95 fonts.ids[id] = cachedata
100 local dr_orig = fonts.define.read
101 function fonts.define.read(name, size, id)
102 local p = utf.find(name, ":") or utf.len(name)+1
103 if utf.sub(name, 1, p-1) == 'psft' then
104 return mk_rml(utf.sub(name,p+1), size, id)
106 return dr_orig(name, size, id)