OSDN Git Service

42fe6e39f2123a21f40dad04ce545690c4ea3c93
[luatex-ja/luatexja.git] / src / luatexja / rmlgbm.lua
1 --
2 -- luatexja/rmlgbm.lua
3 --
4 luatexbase.provides_module({
5   name = 'luatexja.rmlgbm',
6   date = '2011/06/27',
7   version = '0.1',
8   description = 'Definitions of non-embedded Japanese fonts',
9 })
10 module('luatexja.rmlgbm', package.seeall)
11 local err, warn, info, log = luatexbase.errwarinf(_NAME)
12
13 local rmlgbm_data = require('luatexja-rmlgbm-data')
14 local cache_chars = { [655360] = rmlgbm_data.characters }
15
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
20
21    local fontdata = {}
22    local cachedata = {}
23    for k, v in pairs(rmlgbm_data) do
24       fontdata[k] = v
25       cachedata[k] = v
26    end
27    fontdata.characters = nil
28    cachedata.characters = nil
29    fontdata.unicodes = nil
30    fontdata.shared = nil
31    cachedata.shared = {}
32    local shared = cachedata.shared
33    for k, v in pairs(rmlgbm_data.shared) do
34       shared[k] = v
35    end
36
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))
39    
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
50       end
51    end
52    fontdata.characters = cache_chars[size]
53    cachedata.characters = cache_chars[size]
54
55    local parameters = {}
56    for k, v in pairs(rmlgbm_data.parameters) do
57       parameters[k] = v * scale
58    end
59    fontdata.parameters = parameters
60    cachedata.parameters = parameters
61
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
72    fontdata.size = size
73    cachedata.size = size
74
75    -- no embedding
76    local var = ''
77    if features.slant then 
78       fontdata.slant = features.slant*1000
79       cachedata.slant = fontdata.slant
80       var = var .. 's' .. tostring(features.slant)
81    end
82    if features.extend then 
83       fontdata.extend = features.extend*1000
84       cachedata.extend = fontdata.extend
85        var = var .. 'x' .. tostring(features.extend)
86   end
87    fontdata.name = specification.name .. size .. var
88    cachedata.name = fontdata.name
89    fontdata.fullname = specification.name .. var
90    cachedata.fullname = fontdata.fullname
91
92    fontdata.psname = specification.name
93    cachedata.psname = fontdata.psname
94
95    fonts.ids[id] = cachedata
96
97    return fontdata
98 end
99
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)
105    else 
106       return dr_orig(name, size, id)
107    end
108 end