OSDN Git Service

Target release date: 2019-11-17
[luatex-ja/luatexja.git] / src / ltj-otf.lua
index 3cbf29d..48fe4bd 100644 (file)
@@ -1,5 +1,5 @@
 --
--- luatexja/ltj-otf.lua
+-- ltj-otf.lua
 --
 require('unicode')
 require('lualibs')
@@ -10,6 +10,7 @@ luatexja.load_module('rmlgbm');    local ltjr = luatexja.rmlgbm
 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')
@@ -44,7 +45,7 @@ local attr_ykblshift = luatexbase.attributes['ltj@ykblshift']
 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
@@ -69,22 +70,25 @@ end
 
 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
@@ -102,27 +106,11 @@ local function get_ucs_from_rmlgbm(c)
             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
@@ -138,38 +126,36 @@ local function append_jglyph(char)
    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
 
@@ -214,19 +200,17 @@ ltjb.add_to_callback('pre_linebreak_filter', extract,'ltj.otf',
 -- 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
@@ -237,10 +221,10 @@ local function cid_to_char(fmtable, fn)
    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
 
 
@@ -265,7 +249,7 @@ luatexja.otf = {
   append_jglyph = append_jglyph,
   enable_ivs = enable_ivs,  -- 隠し機能: IVS
   disable_ivs = disable_ivs,  -- 隠し機能: IVS
-  cid = cid,
+  cid = cid, utf = utf,
 }