OSDN Git Service

Fixed ticket #25935
[luatex-ja/luatexja.git] / src / luatexja-rmlgbm.lua
1 local rmlgbm_data = require('luatexja-rmlgbm-data')
2 local cache_chars = { [655360] = rmlgbm_data.characters }
3
4 local function mk_rml(name, size, id)
5    local specification = fonts.define.analyze(name,size)
6    specification = fonts.define.specify[':'](specification)
7    local features = specification.features.normal
8
9    local fontdata = {}
10    local cachedata = {}
11    for k, v in pairs(rmlgbm_data) do
12       fontdata[k] = v
13       cachedata[k] = v
14    end
15    fontdata.characters = nil
16    cachedata.characters = nil
17    fontdata.unicodes = nil
18    fontdata.shared = nil
19    cachedata.shared = {}
20    local shared = cachedata.shared
21    for k, v in pairs(rmlgbm_data.shared) do
22       shared[k] = v
23    end
24
25    shared.set_dynamics = fonts.otf.set_dynamics 
26    shared.processes, shared.features = fonts.otf.set_features(cachedata,fonts.define.check(features,fonts.otf.features.default))
27    
28    -- characters & scaling
29    if size < 0 then size = -size * 655.36 end
30    local scale = size / 655360
31    if not cache_chars[size] then
32       cache_chars[size]  = {}
33       for k, v in pairs(cache_chars[655360]) do
34          cache_chars[size][k] = {}
35          cache_chars[size][k].index = v.index
36          cache_chars[size][k].width = v.width * scale
37          cache_chars[size][k].tounicode = v.tounicode
38       end
39    end
40    fontdata.characters = cache_chars[size]
41    cachedata.characters = cache_chars[size]
42
43    local parameters = {}
44    for k, v in pairs(rmlgbm_data.parameters) do
45       parameters[k] = v * scale
46    end
47    fontdata.parameters = parameters
48    cachedata.parameters = parameters
49
50    fontdata.ascender = fontdata.ascender * scale
51    cachedata.ascender = fontdata.ascender
52    fontdata.descender = fontdata.descender * scale
53    cachedata.descender = fontdata.descender
54    fontdata.factor = fontdata.factor * scale
55    cachedata.factor = fontdata.factor
56    fontdata.hfactor = fontdata.hfactor * scale
57    cachedata.hfactor = fontdata.hfactor
58    fontdata.vfactor = fontdata.vfactor * scale   
59    cachedata.vfactor = fontdata.vfactor
60    fontdata.size = size
61    cachedata.size = size
62
63    -- no embedding
64    fontdata.name = specification.name .. size
65    cachedata.name = fontdata.name
66    fontdata.fullname = specification.name
67    cachedata.fullname = fontdata.fullname
68    fontdata.psname = specification.name
69    cachedata.psname = fontdata.psname
70
71    fonts.ids[id] = cachedata
72
73    return fontdata
74 end
75
76 local dr_orig = fonts.define.read
77 function fonts.define.read(name, size, id)
78    local p = utf.find(name, ":") or utf.len(name)+1
79    if utf.sub(name, 1, p-1) == 'psft' then
80       return mk_rml(utf.sub(name,p+1), size, id)
81    else 
82       return dr_orig(name, size, id)
83    end
84 end