version = '0.1',
description = 'The OTF Lua module for LuaTeX-ja',
})
-module('luatexja.otf', package.seeall)
luatexja.load_module('base'); local ltjb = luatexja.base
luatexja.load_module('jfont'); local ltjf = luatexja.jfont
+luatexja.load_module('rmlgbm'); local ltjr = luatexja.rmlgbm
local id_glyph = node.id('glyph')
local id_whatsit = node.id('whatsit')
local ltjf_font_metric_table = ltjf.font_metric_table
local ltjf_find_char_class = ltjf.find_char_class
+local ltjr_cidfont_data = ltjr.cidfont_data
local OTF = luatexja.userid_table.OTF
+local function get_ucs_from_rmlgbm(c)
+ local v = ltjr_cidfont_data["Adobe-Japan1"].resources.unicodes["Japan1." .. tostring(c)]
+ if not v then -- AJ1 範囲外
+ return 0
+ elseif v<0xF0000 then -- 素直に Unicode にマップ可能
+ return v
+ else
+ local w = ltjr_cidfont_data["Adobe-Japan1"].characters[v]. tounicode
+ -- must be non-nil!
+ local i = string.len(w)
+ if i==4 then -- UCS2
+ return tonumber(w,16)
+ elseif i==8 then
+ i,w = tonumber(string.sub(w,1,4),16), tonumber(string.sub(w,-4),16)
+ if (w>=0xD800) and (w<=0xDB7F) and (i>=0xDC00) and (i<=0xDFFF) then -- Surrogate pair
+ return (w-0xD800)*0x400 + (i-0xDC00)
+ else
+ return 0
+ end
+ end
+ end
+end
+
-- Append a whatsit node to the list.
-- This whatsit node will be extracted to a glyph_node
-function append_jglyph(char)
+local function append_jglyph(char)
local p = node_new(id_whatsit,sid_user)
local v = tex.attribute[attr_curjfnt]
p.user_id=OTF; p.type=100; p.value=char
node.write(p)
end
-function cid(key)
+local function cid(key)
+ if key==0 then return append_jglyph(char) end
local curjfnt = fonts.ids[tex.attribute[attr_curjfnt]]
- if curjfnt.cidinfo.ordering ~= "Japan1" and
- curjfnt.cidinfo.ordering ~= "GB1" and
- curjfnt.cidinfo.ordering ~= "CNS1" and
- curjfnt.cidinfo.ordering ~= "Korea1" then
- ltjb.package_error('luatexja-otf',
- 'Current Japanese font (or other CJK font) "'..curjfnt.psname..'" is not a CID-Keyed font (Adobe-Japan1 etc.)',
- 'Select a CID-Keyed font using \\jfont.')
- return
+ if not curjfnt.cidinfo or
+ curjfnt.cidinfo.ordering ~= "Japan1" and
+ curjfnt.cidinfo.ordering ~= "GB1" and
+ curjfnt.cidinfo.ordering ~= "CNS1" and
+ curjfnt.cidinfo.ordering ~= "Korea1" 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))
end
- local char = curjfnt.unicodes[curjfnt.cidinfo.ordering..'.'..tostring(key)]
+ local char = curjfnt.resources.unicodes[curjfnt.cidinfo.ordering..'.'..tostring(key)]
if not char then
ltjb.package_warning('luatexja-otf',
- 'Current Japanese font (or other CJK font) "'..curjfnt.psname..'" does not include the specified CID character ('..tostring(key)..')',
- 'Use a font including the specified CID character.')
- return
+ '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
- append_jglyph(char)
+ return append_jglyph(char)
end
-function extract(head)
+local function extract(head)
local p = head
local v
while p do
for i, v in pairs(fmtable.chars) do
local j = string.match(i, "^AJ1%-([0-9]*)")
if j then
- j = tonumber(fi.unicodes['Japan1.'..tostring(j)])
+ j = tonumber(fi.resources.unicodes['Japan1.'..tostring(j)])
if j then
fmtable.cid_char_type[j] = v
end
cid_set_char_class, "ltj.otf.find_char_class", 1)
-------------------- all done
+luatexja.otf = {
+ append_jglyph = append_jglyph,
+ cid = cid,
+}
+
-- EOF