OSDN Git Service

ticket #36312
[luatex-ja/luatexja.git] / src / ltj-jfont.lua
index 6695eb9..207d0e0 100644 (file)
@@ -269,6 +269,7 @@ do
                       '\\endcsname=\\relax')
         return
       end
+      if not f then return end
       update_jfm_cache(j, f.size)
       local ad = identifiers[fn].parameters
       local sz = metrics[j].size_cache[f.size]
@@ -659,6 +660,18 @@ do
 end
 
 ------------------------------------------------------------------------
+-- VERT VARIANT TABLE
+------------------------------------------------------------------------
+local vert_form_table = {
+   [0x2013]=0xFE32, [0x2014]=0xFE31, [0x2025]=0xFE30,
+   [0xFF08]=0xFE35, [0xFF09]=0xFE36, [0xFF5B]=0xFE37, [0xFF5D]=0xFE38,
+   [0x3014]=0xFE39, [0x3015]=0xFE3A, [0x3010]=0xFE3B, [0x3011]=0xFE3C,
+   [0x300A]=0xFE3D, [0x300B]=0xFE3E, [0x3008]=0xFE3F, [0x3009]=0xFE40,
+   [0x300C]=0xFE41, [0x300D]=0xFE42, [0x300E]=0xFE43, [0x300F]=0xFE44,
+   [0xFF3B]=0xFE47, [0xFF3D]=0xFE48, [0xFF3F]=0xFE33,
+}
+
+------------------------------------------------------------------------
 -- 追加のフォント情報
 ------------------------------------------------------------------------
 font_extra_info = {}
@@ -682,8 +695,10 @@ do
    end
 
    local sort = table.sort
-   local function add_fl_table(dest, glyphs, unitable, asc_des, units)
-      local tg, glyphmin, glyphmax = glyphs.glyphs, glyphs.glyphmin, glyphs.glyphmax
+   local function add_fl_table(dest, glyphs, unitable, asc_des, units, id)
+      local glyphmin, glyphmax = glyphs.glyphmin, glyphs.glyphmax
+      if glyphmax < 0 then return dest end
+      local tg = glyphs.glyphs
       for i = glyphmin, glyphmax do
         local gv = tg[i]
         if gv then
@@ -700,14 +715,25 @@ do
                      end
                     if uniq_flag then
                        dest = dest or {}; dest[bu] = dest[bu] or {}
-                       dest[bu][vsel] = unitable[i]
+                       dest[bu][vsel] = unitable[gv.name]
                     end
                  end
               end
            end
+           -- vertical form
+           local gi = unitable[gv.name]
+           if gi then
+              if unitable[gv.name .. '.vert'] then
+                 dest = dest or {}; dest[gi] = dest[gi] or {};
+                 dest[gi].vform = unitable[gv.name .. '.vert']
+              elseif id.characters[gi] and vert_form_table[gi] then
+                 dest = dest or {}; dest[gi] = dest[gi] or {};
+                 dest[gi].vform = vert_form_table[gi]
+              end
+           end
            -- vertical metric
            local vw, tsb, vk = glyph_vmetric(gv)
-           local gi = unitable[i]
+           local gi = unitable[gv.name]
            if gi and vw and vw~=asc_des then
               -- We do not use tsidebearing, since (1) fontloader does not read VORG table
               -- and (2) 'tsidebearing' doea not appear in the returned table by fontloader.fields.
@@ -743,33 +769,37 @@ do
    end
    prepare_fl_data = function (dest, id)
       local fl = fontloader.open(id.filename)
-      local unicodes = {}
+      local ind_to_uni, unicodes = {}, {}
       for i,v in pairs(id.characters) do
-         unicodes[v.index] = i
+         ind_to_uni[v.index] = i
       end
-      
       if fl.glyphs then
         local tg, glyphmin, glyphmax = fl.glyphs, fl.glyphmin, fl.glyphmax
-         for i = glyphmin, glyphmax do
-            if tg[i] and tg[i].name then unicodes[tg[i].name] = unicodes[i] end
-         end
+         if 0 <= glyphmax then
+            for i = glyphmin, glyphmax do
+               if tg[i] and tg[i].name then unicodes[tg[i].name] = ind_to_uni[i] end
+           end
+        end
         dest = add_fl_table(dest, fl, unicodes,
-                            fl.ascent + fl.descent, fl.units_per_em)
+                            fl.ascent + fl.descent, fl.units_per_em, id)
       end
       if fl.subfonts then
          for _,v in pairs(fl.subfonts) do
            local tg, glyphmin, glyphmax = v.glyphs, v.glyphmin, v.glyphmax
-            for i = glyphmin, glyphmax do
-               if tg[i] and tg[i].name then unicodes[tg[i].name] = unicodes[i] end
-            end
-         end
+            if 0 <= glyphmax then
+               for i = glyphmin, glyphmax do
+                  if tg[i] and tg[i].name then unicodes[tg[i].name] = ind_to_uni[i] end
+              end
+          end
+       end
          for _,v in pairs(fl.subfonts) do
             dest = add_fl_table(dest, v, unicodes,
-                               fl.ascent + fl.descent, fl.units_per_em)
+                               fl.ascent + fl.descent, fl.units_per_em, id)
          end
-      end
-      fontloader.close(fl); collectgarbage("collect")
-      return dest
+     end
+     if dest then dest.unicodes = unicodes end
+     fontloader.close(fl); collectgarbage("collect")
+     return dest
    end
    -- supply vkern table
    supply_vkern_table = function(id, bname)
@@ -790,7 +820,7 @@ end
 
 --
 do
-   local cache_ver = 7
+   local cache_ver = 11
    local checksum = file.checksum
 
    local function prepare_extra_data_base(id)
@@ -988,15 +1018,3 @@ do
    end
 end
 
-------------------------------------------------------------------------
--- VERT VARIANT TABLE
-------------------------------------------------------------------------
-vert_form_table = {
-   [0x2013]=0xFE32, [0x2014]=0xFE31, [0x2025]=0xFE30,
-   [0xFF08]=0xFE35, [0xFF09]=0xFE36, [0xFF5B]=0xFE37, [0xFF5D]=0xFE38,
-   [0x3014]=0xFE39, [0x3015]=0xFE3A, [0x3010]=0xFE3B, [0x3011]=0xFE3C,
-   [0x300A]=0xFE3D, [0x300B]=0xFE3E, [0x3008]=0xFE3F, [0x3009]=0xFE40,
-   [0x300C]=0xFE41, [0x300D]=0xFE42, [0x300E]=0xFE43, [0x300F]=0xFE44,
-   [0xFF3B]=0xFE47, [0xFF3D]=0xFE48, [0xFF3F]=0xFE33,
-}
-setmetatable(vert_form_table, {__index=function(t,k) return k end});