+ fh:close();
+ end
+
+ local function increment(a) return a+1 end
+ local function entry(a)
+ return {index = a}
+ end
+ make_cid_font = function ()
+ local kx = cid_replace[cid_name]
+ if not kx then return end
+ local k = {
+ cidinfo = { ordering=cid_order, registry=cid_reg, supplement=kx[3] },
+ encodingbytes = 2, extend=1000, format = 'opentype',
+ direction = 0, characters = {}, parameters = {}, embedding = "no", cache = "yes",
+ ascender = 0, descender = 0, factor = 0, hfactor = 0, vfactor = 0,
+ tounicode = 1,
+ }
+ cidfont_data[cid_name] = k
+
+ -- CID => Unicode 符号空間
+ -- TODO: vertical fonts?
+ tt, cidm = {}, {}
+ for i = 0,kx[2] do cidm[i] = -1 end
+ open_cmap_file(kx[1] .. "-H", increment, tonumber, entry)
+ k.characters = tt
+
+ -- Unicode にマップされなかった文字の処理
+ -- これらは TrueType フォントを使って表示するときはおかしくなる
+ local ttu, pricode = {}, 0xF0000
+ for i,v in ipairs(cidm) do
+ if v==-1 then
+ tt[pricode], cidm[i], pricode
+ = { index = i }, pricode, pricode+1;
+ end
+ ttu[cid_order .. '.' .. i] = cidm[i]
+ end
+ -- shared
+ k.shared = {
+ otfdata = {
+ cidinfo= k.cidinfo, verbose = false,
+ shared = { featuredata = {}, },
+ luatex = { features = {},
+ defaultwidth=1000,
+ sequences = { }, },
+ },
+ dynamics = {}, features = {}, processes = {},
+ }
+ k.resources = { unicodes = ttu, }
+ k.descriptions = {}
+ cache_chars[cid_name] = { [655360] = k.characters }
+
+ -- tounicode エントリ
+ local cidp = {nil, nil}; local cidmo = cidm
+ tt, ttu, cidm = {}, {}, {}
+ open_cmap_file(cid_name .. "-UCS2",
+ function(a)
+ a[2] = a[2] +1 ; return a
+ end,
+ function(a)
+ cidp[1] = string.upper(string.sub(a,1,string.len(a)-4))
+ cidp[2] = tonumber(string.sub(a,-4),16)
+ return cidp
+ end,
+ function(a) return a[1] ..string.format('%04X',a[2]) end)
+ -- tt は cid -> tounicode になっているので cidm -> tounicode に変換
+ local kxf = kx[4]
+ for i,v in ipairs(cidmo) do
+ k.characters[v].width = kxf(i)
+ if v>=0xF0000 then
+ k.characters[v].tounicode = tt[i]
+ end
+ end
+
+ -- Save
+ k.characters[46].width = math.floor(655360/14);
+ ltjb.save_cache( "ltj-cid-auto-" .. string.lower(cid_name),
+ {
+ version = cache_ver,
+ k,
+ })
+ end
+end
+
+--
+local function cid_cache_outdated(t) return t.version~=cache_ver end
+local function read_cid_font()
+ local dat = ltjb.load_cache("ltj-cid-auto-" .. string.lower(cid_name),
+ cid_cache_outdated )
+ if dat then
+ cidfont_data[cid_name] = dat[1]