OSDN Git Service

test-zh-maqiyuan.tex: CRLF -> LF.
[luatex-ja/luatexja.git] / src / luatexja / jfont.lua
index 0db5f42..aff5b96 100644 (file)
@@ -29,6 +29,8 @@ local ITALIC = 1
 metrics={} -- this table stores all metric informations
 font_metric_table={} -- [font number] -> jfm_name, jfm_var, size
 
+luatexbase.create_callback("luatexja.load_jfm", "data", function (ft, jn) return ft end)
+
 local jfm_file_name, jfm_var
 local defjfm_res
 
@@ -64,8 +66,25 @@ function define_jfm(t)
            if real_char then
               if not (type(v.width)=='number' or v.width~='prop') then
                  defjfm_res= nil; return
-              elseif type(v.height)~='number' or type(v.depth)~='number' then
-                 defjfm_res= nil; return
+              else
+                 if type(v.height)~='number' then
+                    v.height = 0.0
+                 end
+                 if type(v.depth)~='number' then
+                    v.depth = 0.0
+                 end
+                 if type(v.italic)~='number' then 
+                    v.italic = 0.0
+                 end
+                 if type(v.left)~='number' then 
+                    v.left = 0.0
+                 end
+                 if type(v.down)~='number' then 
+                    v.down = 0.0
+                 end
+                 if type(v.align)=='nil' then
+                    v.align = 'left'
+                 end
               end
            end
            v.chars = nil
@@ -79,21 +98,55 @@ function define_jfm(t)
         t[i] = nil
       end
    end
-   defjfm_res= t
+   t = luatexbase.call_callback("luatexja.load_jfm", t, jfm_file_name)
+   t.size_cache = {}
+   defjfm_res = t
+end
+
+local function mult_table(old,scale) -- modified from table.fastcopy
+    if old then
+       local new = { }
+       for k,v in next, old do
+         if type(v) == "table" then
+            new[k] = mult_table(v,scale)
+         elseif type(v) == "number" then
+            new[k] = round(v*scale)
+         else
+            new[k] = v
+         end
+       end
+       return new
+    else return nil end
 end
 
+local function update_jfm_cache(j,sz)
+   if metrics[j].size_cache[sz] then return end
+   metrics[j].size_cache[sz] = {}
+   metrics[j].size_cache[sz].char_type = mult_table(metrics[j].char_type, sz)
+   metrics[j].size_cache[sz].kanjijskip = mult_table(metrics[j].kanjiskip, sz)
+   metrics[j].size_cache[sz].xkanjiskip = mult_table(metrics[j].xkanjiskip,sz)
+   metrics[j].size_cache[sz].zw = round(metrics[j].zw*sz)
+   metrics[j].size_cache[sz].zh = round(metrics[j].zh*sz)
+end
+
+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 metrics[m] then return 0 end
-   return metrics[m].chars[c] or 0
+-- c: character code, m: index in font_metric table
+   if not metrics[m.jfm] then return 0 end
+   return metrics[m.jfm].chars[c] or 
+      luatexbase.call_callback("luatexja.find_char_class", 0, m, c)
 end
 
 local function load_jfont_metric()
    if jfm_file_name=='' then 
       ltjb.package_error('luatexja',
                         'no JFM specified',
-                        {'To load and define a Japanese font, a JFM must be specified.',
-                         "The JFM 'ujis' will be  used for now."})
+                        'To load and define a Japanese font, a JFM must be specified.'..
+                         "The JFM 'ujis' will be  used for now.")
       jfm_file_name='ujis'
    end
    for j,v in ipairs(metrics) do 
@@ -123,6 +176,8 @@ function jfontdefX(g)
   tex.sprint(cat_lp, '\\expandafter\\font\\csname ' .. cstemp .. '\\endcsname')
 end
 
+luatexbase.create_callback("luatexja.define_jfont", "data", function (ft, fn) return ft end)
+
 -- EXT
 function jfontdefY() -- for horizontal font
    local j = load_jfont_metric()
@@ -137,10 +192,10 @@ function jfontdefY() -- for horizontal font
              .. '\\endcsname=\\relax')
      return 
    end
-   font_metric_table[fn]={}
-   font_metric_table[fn].jfm=j
-   font_metric_table[fn].size=f.size
-   font_metric_table[fn].var=jfm_var
+   update_jfm_cache(j, f.size)
+   local fmtable = { jfm = j, size = f.size, var = jfm_var }
+   fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn)
+   font_metric_table[fn]=fmtable
    tex.sprint(cat_lp, ltj.is_global .. '\\protected\\expandafter\\def\\csname ' 
           .. cstemp  .. '\\endcsname{\\ltj@curjfnt=' .. fn .. '\\relax}')
 end
@@ -149,7 +204,7 @@ end
 function load_zw()
    local a = font_metric_table[tex.attribute[attr_curjfnt]]
    if a then
-      tex.setdimen('ltj@zw', round(a.size*metrics[a.jfm].zw))
+      tex.setdimen('ltj@zw', metrics[a.jfm].size_cache[a.size].zw)
    else 
       tex.setdimen('ltj@zw',0)
    end
@@ -158,9 +213,9 @@ end
 function load_zh()
    local a = font_metric_table[tex.attribute[attr_curjfnt]]
    if a then
-      tex.setdimen('ltj@zh', round(a.size*metrics[a.jfm].zh))
+      tex.setdimen('ltj@zh', metrics[a.jfm].size_cache[a.size].zh)
    else 
-      tex.setdimen('ltj@zh', round(a.size*metrics[a.jfm].zh))
+      tex.setdimen('ltj@zh',0)
    end
 end
 
@@ -213,11 +268,12 @@ function append_italic()
       if ltjc.is_ucs_in_japanese_char(p) then
         f = has_attr(p, attr_curjfnt)
         local j = font_metric_table[f]
-        local c = find_char_class(p.char, j.jfm)
-        g.kern = round(j.size * metrics[j.jfm].char_type[c].italic)
+        local c = find_char_class(p.char, j)
+        g.kern = metrics[j.jfm].size_cache[j.size].char_type[c].italic
       else
         g.kern = font.fonts[f].characters[p.char].italic
       end
       node.write(g)
+      tex.attribute[attr_icflag] = -(0x7FFFFFFF)
    end
 end