--
--- luatexja/ltj-otf.lua
+-- ltj-otf.lua
--
require('unicode')
require('lualibs')
luatexja.load_module('charrange'); local ltjc = luatexja.charrange
luatexja.load_module('direction'); local ltjd = luatexja.direction
luatexja.load_module('stack'); local ltjs = luatexja.stack
+luatexja.load_module('lotf_aux'); local ltju = luatexja.lotf_aux
local id_glyph = node.id('glyph')
local id_whatsit = node.id('whatsit')
local attr_tablshift = luatexbase.attributes['ltj@tablshift']
local attr_tkblshift = luatexbase.attributes['ltj@tkblshift']
local lang_ja = luatexja.lang_ja
-local identifiers = fonts.hashes.identifiers
+local font_getfont = font.getfont
local ltjf_font_metric_table = ltjf.font_metric_table
local ltjf_font_extra_info = ltjf.font_extra_info
local function get_ucs_from_rmlgbm(c)
local v = (ivd_aj1 and ivd_aj1.table_ivd_aj1[c]
- or ltjr_cidfont_data["Adobe-Japan1"].resources.unicodes["Japan1." .. tostring(c)])
- or 0
+ or ltjr_cidfont_data["Adobe-Japan1"].resources.unicodes["Japan1." .. tostring(c)])
+ or 0
if v>=0x200000 then -- table
- local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate)
+ local curjfnt = tex_get_attr((ltjd_get_dir_count()==dir_tate)
and attr_curtfnt or attr_curjfnt)
- local curjfnt = identifiers[curjfnt_num].resources
- local base, ivs = v % 0x200000, 0xE00FF + math.floor(v/0x200000)
- curjfnt = curjfnt and curjfnt.variants
- curjfnt = curjfnt and curjfnt[ivs]
- return curjfnt and curjfnt[base] or base
+ local tfmdata = font_getfont(curjfnt)
+ if tfmdata and tfmdata.resources then
+ local base, ivs = v % 0x200000, 0xE00FF + math.floor(v/0x200000)
+ curjfnt = tfmdata and tfmdata.variants
+ curjfnt = curjfnt and curjfnt[ivs]
+ return curjfnt and curjfnt[base] or base
+ else return base
+ end
elseif v<0xF0000 then -- 素直に Unicode にマップ可能
return v
else -- privete use area
local r, aj = nil, ltjr_cidfont_data["Adobe-Japan1"]
-- 先に ltj_vert_table を見る
- for i,w in pairs(aj.shared.ltj_vert_table) do
+ for i,w in pairs(aj.ltj_vert_table) do
if w==v then r=i; break end
end
if not r then
end
end
end
- if aj.shared.ltj_vert_table[r] then
+ if aj.ltj_vert_table[r] then
-- CID が縦組用字形だった場合
- local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate)
- and attr_curtfnt or attr_curjfnt)
- local t = identifiers[curjfnt_num]
- if t.resources.sequences then
- for _,i in pairs(t.resources.sequences) do
- if (i.order[1]=='vert' or i.order[1]=='vrt2')
- and i.type == 'gsub_single' and i.steps then
- for _,j in pairs(i.steps) do
- if type(j)=='table' then
- if type(j.coverage)=='table' then
- for i,k in pairs(j.coverage) do
- if i==r then return k end
- end
- end
- end
- end
- end
- end
- end
+ return ltju.replace_vert_variant(
+ tex_get_attr((ltjd_get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt),
+ r)
end
return r
end
node_write(p)
end
+local utf
+do
+ utf = function (ucs)
+ if ltjd_get_dir_count()==dir_tate then
+ ucs = ltju.replace_vert_variant(
+ tex_get_attr((ltjd_get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt),
+ ucs)
+ end
+ return append_jglyph(ucs)
+ end
+end
+
local cid
do
cid = function (key)
- if key==0 then return append_jglyph(char) end
- local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate)
+ if key==0 then return append_jglyph(0) end
+ local curjfnt = tex_get_attr((ltjd_get_dir_count()==dir_tate)
and attr_curtfnt or attr_curjfnt)
- local curjfnt = identifiers[curjfnt_num]
- local cidinfo = curjfnt.resources.cidinfo
- if not cidinfo or
+ local cidinfo = ltju.get_cidinfo(cudjfnt)
+ if type(cidinfo)~="table" or
cidinfo.ordering ~= "Japan1" and
cidinfo.ordering ~= "GB1" and
cidinfo.ordering ~= "CNS1" and
cidinfo.ordering ~= "Korea1" and
cidinfo.ordering ~= "KR" then
- -- ltjb.package_warning('luatexja-otf',
- -- 'Current Japanese font (or other CJK font) "'
- -- ..curjfnt.psname..'" is not a CID-Keyed font (Adobe-Japan1 etc.)')
return append_jglyph(get_ucs_from_rmlgbm(key))
+ else
+ local char = ltjf_font_extra_info[curjfnt].ind_to_uni[key] or 0
+ return append_jglyph(char)
end
- local fe, char = ltjf_font_extra_info[curjfnt_num], nil
- if fe and fe.unicodes then
- char = fe.unicodes[cidinfo.ordering..'.'..tostring(key)]
- end
- if not char then
- ltjb.package_warning('luatexja-otf',
- 'Current Japanese font (or other CJK font) "'
- ..curjfnt.psname..'" does not have the specified CID character ('
- ..tostring(key)..')',
- 'Use a font including the specified CID character.')
- char = 0
- end
- return append_jglyph(char)
end
end
-- additional callbacks
-- 以下は,LuaTeX-ja に用意された callback のサンプルになっている.
-- JFM の文字クラスの指定の所で,"AJ1-xxx" 形式での指定を可能とした.
--- これらの文字指定は,和文フォント定義ごとに,それぞれのフォントの
--- CID <-> グリフ 対応状況による変換テーブルが用意される.
--- 和文フォント読み込み時に,CID -> unicode 対応をとっておく.
-local function cid_to_char(fmtable, fn)
- local fi = identifiers[fn]
- local fe = ltjf_font_extra_info[fn]
- if (fi.resources and fi.resources.cidinfo and fi.resources.cidinfo.ordering == "Japan1" )
- and (fe and fe.unicodes) then
+-- 和文フォント読み込み時に,ind -> unicode 対応をとっておく.
+local function ind_to_uni(fmtable, fn)
+ if fn<0 then return end
+ local cid = ltju.get_cidinfo(fn);
+ local t = ltjf_font_extra_info[fn].ind_to_uni
+ if t and cid.ordering == "Japan1" then
for i, v in pairs(fmtable.chars) do
local j = string.match(i, "^AJ1%-([0-9]*)")
if j then
- j = tonumber(fe.unicodes['Japan1.'..tostring(j)])
+ j = t[i]
if j then
fmtable.cid_char_type = fmtable.cid_char_type or {}
fmtable.cid_char_type[j] = v
return fmtable
end
luatexbase.add_to_callback("luatexja.define_jfont",
- cid_to_char, "ltj.otf.define_jfont", 1)
+ ind_to_uni, "ltj.otf.define_jfont", 1)
-- 既に読み込まれているフォントに対しても,同じことをやらないといけない
for fn, v in pairs(ltjf_font_metric_table) do
- ltjf_font_metric_table[fn] = cid_to_char(v, fn)
+ ltjf_font_metric_table[fn] = ind_to_uni(v, fn)
end
append_jglyph = append_jglyph,
enable_ivs = enable_ivs, -- 隠し機能: IVS
disable_ivs = disable_ivs, -- 隠し機能: IVS
- cid = cid,
+ cid = cid, utf = utf,
}