OSDN Git Service

ltj-jfmglue.lua and ltj-jfont.lua: optimized find_char_class()
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Fri, 3 Oct 2014 10:36:36 +0000 (19:36 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Fri, 3 Oct 2014 10:36:36 +0000 (19:36 +0900)
src/ltj-jfmglue.lua
src/ltj-jfont.lua

index b9b3a2e..b73ec5e 100644 (file)
@@ -3,7 +3,7 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.jfmglue',
-  date = '2014/02/02',
+  date = '2014/10/03',
   description = 'Insertion process of JFM glues and kanjiskip',
 })
 module('luatexja.jfmglue', package.seeall)
@@ -114,13 +114,10 @@ do
    local start_time_measure = ltjb.start_time_measure
    local stop_time_measure = ltjb.stop_time_measure
    slow_find_char_class = function (c, m, oc)
-      start_time_measure('slow_find_chr')
       local cls = ltjf_find_char_class(oc, m)
-      if cls==0 then 
-        stop_time_measure('slow_find_chr')
+      if oc~=c and cls==0 then
         return ltjf_find_char_class(-c, m), oc
       else
-        stop_time_measure('slow_find_chr')
         return cls, oc
       end
    end
@@ -422,7 +419,7 @@ local calc_np_auxtable = {
         set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
         set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
         set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp)
-        set_attr(lp, attr_icflag, PROCESSED); 
+        set_attr(lp, attr_icflag, PROCESSED);
         return calc_np_aux_glyph_common(lp)
       else
         Np.id = id_kern; set_attr(lp, attr_icflag, PROCESSED)
@@ -461,7 +458,7 @@ function calc_np(lp, last)
          if lpa%PROCESSED_BEGIN_FLAG == BOXBDD then
            local lq = node_next(lp)
             head = node_remove(head, lp); node_free(lp); lp = lq
-         else 
+         else
            return calc_np_pbox(lp, last)
          end -- id_pbox
       else
@@ -997,7 +994,7 @@ do
       attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift
       set_np_xspc_jachar = is_dir_tate and set_np_xspc_jachar_tate or set_np_xspc_jachar_yoko
 
-      
+
       tex_dir = dir or 'TLT'
       kanji_skip = node_new(id_glue)
       setfield(kanji_skip, 'spec', skip_table_to_spec(KSK))
index ccff2ee..3094c93 100644 (file)
@@ -3,7 +3,7 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.jfont',
-  date = '2014/08/12',
+  date = '2014/10/03',
   description = 'Loader for Japanese fonts',
 })
 module('luatexja.jfont', package.seeall)
@@ -197,12 +197,25 @@ luatexbase.create_callback("luatexja.find_char_class", "data",
                           function (arg, fmtable, char)
                              return 0
                           end)
-
-function find_char_class(c,m)
--- c: character code, m:
-   if not m then return 0 end
-   return m.chars[c] or
-      luatexbase.call_callback("luatexja.find_char_class", 0, m, c)
+do
+   local start_time_measure = ltjb.start_time_measure
+   local stop_time_measure = ltjb.stop_time_measure
+   local fcc_temp = { chars_cbcache = {} }
+   setmetatable(
+      fcc_temp.chars_cbcache,
+      {
+         __index = function () return 0 end,
+      })
+   function find_char_class(c,m)
+      -- c: character code, m:
+      local r = (m or fcc_temp).chars_cbcache[c]
+      if not r then
+         r = m.chars[c] or
+            luatexbase.call_callback("luatexja.find_char_class", 0, m, c)
+         m.chars_cbcache[c] = r
+      end
+      return r
+   end
 end
 
 
@@ -269,6 +282,7 @@ do
                        descent = ad.descender,
                        chars = sz.chars, char_type = sz.char_type,
                        kanjiskip = sz.kanjiskip, xkanjiskip = sz.xkanjiskip,
+                        chars_cbcache = {},
       }
 
       fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
@@ -331,7 +345,7 @@ do
       end
       if jfm_file_name~='' then
         local l = name:sub(-1)
-        name = name 
+        name = name
            .. ((l==':' or l==';') and '' or ';')
            .. 'jfm=' .. jfm_file_name
         if jfm_var~='' then
@@ -533,7 +547,7 @@ do
         alt_font_base_num = tex.getattribute(attr_curtfnt)
       else
         alt_font_base_num = tex.getattribute(attr_curjfnt)
-      end          
+      end
       local t = alt_font_table[alt_font_base_num]
       if t then
          for i,_ in pairs(t) do t[i]=nil end