OSDN Git Service

'vkrn' should work now
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Thu, 30 Oct 2014 08:08:12 +0000 (17:08 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Thu, 30 Oct 2014 08:08:12 +0000 (17:08 +0900)
src/#ltj-pretreat.lua# [deleted file]
src/ltj-jfont.lua
src/ltj-rmlgbm.lua
src/ltj-setwidth.lua

diff --git a/src/#ltj-pretreat.lua# b/src/#ltj-pretreat.lua#
deleted file mode 100644 (file)
index 6d2cbf7..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
---
--- luatexja/ltj-pretreat.lua
---
-
-luatexja.load_module('base');      local ltjb = luatexja.base
-luatexja.load_module('charrange'); local ltjc = luatexja.charrange
-luatexja.load_module('stack');     local ltjs = luatexja.stack
-luatexja.load_module('jfont');     local ltjf = luatexja.jfont
-luatexja.load_module('direction'); local ltjd = luatexja.direction
-
-local Dnode = node.direct or node
-
-local nullfunc = function(n) return n end
-local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc
-local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc
-
-local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end
-local getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end
-local getfont = (Dnode ~= node) and Dnode.getfont or function(n) return n.font end
-local getchar = (Dnode ~= node) and Dnode.getchar or function(n) return n.char end
-local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end
-local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end
-
-local pairs = pairs
-local floor = math.floor
-local has_attr = Dnode.has_attribute
-local set_attr = Dnode.set_attribute
-local node_traverse = Dnode.traverse
-local node_remove = Dnode.remove
-local node_next = (Dnode ~= node) and Dnode.getnext or node.next
-local node_free = Dnode.free
-local node_end_of_math = Dnode.end_of_math
-local tex_getcount = tex.getcount
-
-local id_glyph = node.id('glyph')
-local id_math = node.id('math')
-local id_whatsit = node.id('whatsit')
-local sid_user = node.subtype('user_defined')
-
-local attr_dir = luatexbase.attributes['ltj@dir']
-local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
-local attr_curtfnt = luatexbase.attributes['ltj@curtfnt']
-local attr_icflag = luatexbase.attributes['ltj@icflag']
-
-local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct
-local ltjf_get_vert_glyph = ltjf.get_vert_glyph
-local ltjf_replace_altfont = ltjf.replace_altfont
-local attr_orig_char = luatexbase.attributes['ltj@origchar']
-local STCK  = luatexja.userid_table.STCK
-local DIR   = luatexja.userid_table.DIR
-local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
-
-local dir_tate = luatexja.dir_table.dir_tate
-local lang_ja = token.create('ltj@@japanese')[2]
-------------------------------------------------------------------------
--- MAIN PROCESS STEP 1: replace fonts
-------------------------------------------------------------------------
-local wt, wtd = {}, {}
-do
-   local ltjd_get_dir_count = ltjd.get_dir_count
-   local start_time_measure, stop_time_measure
-      = ltjb.start_time_measure, ltjb.stop_time_measure
-   local head
-   local is_dir_tate
-   local suppress_hyphenate_ja_aux = {}
-   suppress_hyphenate_ja_aux[id_glyph] = function(p)
-      if (has_attr(p, attr_icflag) or 0)<=0 and is_ucs_in_japanese_char(p) then
-         local pc = getchar(p)
-        local pf = ltjf_replace_altfont(has_attr(p, attr_curjfnt) or getfont(p), pc)
-        setfield(p, 'font', pf);  set_attr(p, attr_curjfnt, pf)
-        setfield(p, 'lang', lang_ja)
-         set_attr(p, attr_orig_char, pc)
-      end
-      return p
-   end
-   suppress_hyphenate_ja_aux[id_math] = function(p)
-      return node_end_of_math(node_next(p)) end
-   suppress_hyphenate_ja_aux[50] = function(p) return p end
-   suppress_hyphenate_ja_aux[id_whatsit] = function(p)
-      if getsubtype(p)==sid_user then
-         local uid = getfield(p, 'user_id')
-         if uid==STCK then
-            wt[#wt+1] = p; node_remove(head, p)
-         elseif uid==DIR then
-           if has_attr(p, attr_icflag)<PROCESSED_BEGIN_FLAG  then
-              ltjs.list_dir = has_attr(p, attr_dir)
-           else
-              wtd[#wtd+1] = p; node_remove(head, p)
-           end
-         end
-      end
-      return p
-   end
-
-   local function suppress_hyphenate_ja (h,t)
-      start_time_measure('ltj_hyphenate')
-      head = to_direct(h)
-      local p = head
-      for i = 1,#wt do wt[i]=nil end
-      for i = 1,#wtd do wtd[i]=nil end
-      ltjs.list_dir=ltjd_get_dir_count()
-      while p and p~=t do
-        local pfunc = suppress_hyphenate_ja_aux[getid(p)]
-        p = node_next(pfunc and pfunc(p) or p)
-      end
-      stop_time_measure('ltj_hyphenate'); start_time_measure('tex_hyphenate')
-      lang.hyphenate(h, t)
-      stop_time_measure('tex_hyphenate')
-      return h
-   end
-
-   luatexbase.add_to_callback('hyphenate',
-                             function (head,tail)
-                                return suppress_hyphenate_ja(head)
-                             end,'ltj.hyphenate')
-end
-
--- mode: true iff this function is called from hpack_filter
-local ltjs_report_stack_level = ltjs.report_stack_level
-local function set_box_stack_level(head, mode)
-   local box_set, cl = 0, tex.currentgrouplevel + 1
-   for _,p  in pairs(wt) do
-      if mode and getfield(p, 'value')==cl then box_set = 1 end; node_free(p)
-   end
-   ltjs_report_stack_level(tex_getcount('ltj@@stack') + box_set)
-   for _,p  in pairs(wtd) do
-      node_free(p)
-   end
-   is_dir_tate = ltjs.list_dir == dir_tate
-   if is_dir_tate then
-      for p in Dnode.traverse_id(id_glyph,to_direct(head)) do
-         if (has_attr(p, attr_icflag) or 0)<=0 and has_attr(p, attr_curjfnt)==getfont(p) then
-            local pfn = has_attr(p, attr_curtfnt) or getfont(p)
-            local pc = getchar(p)
-            local pf = ltjf_replace_altfont(pfn, pc)
-           set_attr(p, attr_dir, pc)
-           pc = ltjf_get_vert_glyph(pf, pc) or pc
-            setfield(p, 'char', pc); set_attr(p, attr_orig_char, pc)
-            setfield(p, 'font', pf); set_attr(p, attr_curjfnt, pf)
-         end
-      end
-   end
-   return head
-end
-
--- CALLBACKS
-luatexbase.add_to_callback('hpack_filter',
-   function (head)
-     return set_box_stack_level(head, true)
-   end,'ltj.hpack_filter_pre',1)
-luatexbase.add_to_callback('pre_linebreak_filter',
-  function (head)
-     return set_box_stack_level(head, false)
-  end,'ltj.pre_linebreak_filter_pre',1)
-
-luatexja.pretreat = {
-   set_box_stack_level = set_box_stack_level,
-}
index 9c8c987..0ebb5d8 100644 (file)
@@ -671,8 +671,8 @@ do
       end
       return dest
    end
-   prepare_fl_data = function (dest, id, fname)
-      local fl = fontloader.open(fname)
+   prepare_fl_data = function (dest, id)
+      local fl = fontloader.open(id.filename)
       local unicodes = id.resources.unicodes
       if fl.glyphs then
         dest = add_fl_table(dest, fl.glyphs, id.resources.unicodes, fl.glyphmax,
@@ -687,24 +687,20 @@ do
       fontloader.close(fl)
       return dest
    end
-   -- supply vkern table: TODO
-   supply_vkern_table = function(id)
-      -- if not id then return end
-      -- local fname = id.filename
-      -- if not fname then return end
-      -- local bx = font_extra_basename[file.basename(fname)].vkerns
-      -- local desc = id.shared.rawdata.descriptions
-      -- if bx then
-      --        for i,v in pairs(bx) do
-      --           print(i)
-      --           id.shared.rawdata.resources.lookuphash[i]
-      --              =id.shared.rawdata.resources.lookuphash[i] or v
-      --           for j,w in pairs(v) do
-      --              desc[j].kerns = desc[j].kerns or {}
-      --              desc[j].kerns[i] = w
-      --           end
-      --        end
-      -- end
+   -- supply vkern table
+   supply_vkern_table = function(id, bname)
+      local bx = font_extra_basename[bname].vkerns
+      local lookuphash =  id.resources.lookuphash
+      local desc = id.shared.rawdata.descriptions
+      if bx then
+        for i,v in pairs(bx) do
+           lookuphash[i] = lookuphash[i] or v
+           for j,w in pairs(v) do
+              desc[j].kerns = desc[j].kerns or {}
+              desc[j].kerns[i] = w
+           end
+        end
+      end
    end
 end
 
@@ -748,48 +744,56 @@ do
    local cache_ver = 3
    local checksum = file.checksum
 
-   local function prepare_extra_data(n, id)
-      -- test if already loaded
-      if (not id) or font_extra_info[n]  then return
-      end
-      local fname = id.filename
-      local bname = file.basename(fname)
-      if not fname then
-         font_extra_info[n] = {}; return
-      elseif font_extra_basename[bname] then
-         font_extra_info[n] = font_extra_basename[bname]; return
-      end
-      -- if the cache is present, read it
-      local newsum = checksum(fname) -- MD5 checksum of the fontfile
-      local v = "extra_" .. string.lower(file.nameonly(fname))
-      local dat = ltjb.load_cache(v,
-         function (t) return (t.version~=cache_ver) or (t.chksum~=newsum) end
-      )
-      -- if the cache is not found or outdated, save the cache
-      if dat then
-        font_extra_basename[bname] = dat[1] or {}
-      else
-        local dat = nil
-        dat = prepare_vert_data(dat, id)
-        dat = prepare_fl_data(dat, id, fname)
-        font_extra_basename[bname] = dat or {}
-        ltjb.save_cache( v,
-                         {
-                            chksum = checksum(fname),
-                            version = cache_ver,
-                            dat,
-                         })
-      end
-      font_extra_info[n] = font_extra_basename[bname]
-   end
-   luatexbase.add_to_callback('luatexja.define_font',
-                             function (res, name, size, id)
-                                if type(res)~='number' then
-                                   prepare_extra_data(id, res)
-                                   supply_vkern_table(res)
-                                end
-                             end,
-                             'ltj.prepare_extra_data', 1)
+   local function prepare_extra_data_base(id)
+      if not id or not id.resources then return end
+      local bname = file.nameonly(id.filename or '')
+           print(bname, font_extra_basename[bname])
+      if bname and not font_extra_basename[bname] then
+        -- if the cache is present, read it
+        local newsum = checksum(id.filename) -- MD5 checksum of the fontfile
+        local v = "extra_" .. string.lower(file.nameonly(id.filename))
+        print(v)
+        local dat = ltjb.load_cache(
+           v,
+           function (t) return (t.version~=cache_ver) or (t.chksum~=newsum) end
+        )
+        -- if the cache is not found or outdated, save the cache
+        if dat then
+           font_extra_basename[bname] = dat[1] or {}
+        else
+           local dat = nil
+           dat = prepare_vert_data(dat, id)
+           dat = prepare_fl_data(dat, id)
+           font_extra_basename[bname] = dat or {}
+           ltjb.save_cache( v,
+                            {
+                               chksum = checksum(fname),
+                               version = cache_ver,
+                               dat,
+                            })
+        end
+        return bname
+      end
+   end
+   local function prepare_extra_data_font(id, res)
+      if type(res)=='table' and res.filename then 
+        font_extra_info[id] = font_extra_basename[file.nameonly(res.filename)]
+      end
+   end
+    luatexbase.add_to_callback(
+       'luaotfload.patch_font',
+       function (tfmdata)
+         -- these function is executed one time per one fontfile
+         local bname = prepare_extra_data_base(tfmdata)
+         if bname then supply_vkern_table(tfmdata, bname) end
+       end,
+       'ltj.prepare_extra_data', 1)
+   luatexbase.add_to_callback(
+      'luatexja.define_font',
+      function (res, name, size, id)
+        prepare_extra_data_font(id, res)
+      end,
+      'ltj.prepare_extra_data', 1)
 
    local function a (n, dat) font_extra_info[n] = dat end
    ltjr.vert_addfunc = a
@@ -797,8 +801,8 @@ do
    local identifiers = fonts.hashes.identifiers
    for i=1,font.nextid()-1 do
       if identifiers[i] then 
-        prepare_extra_data(i, identifiers[i])
-        supply_vkern_table(identifiers[i])
+        prepare_extra_data_base(identifiers[i])
+        prepare_extra_data_font(i,identifiers[i])
       end
    end
 end
index c7f7bc7..2c981da 100644 (file)
@@ -335,7 +335,9 @@ local function font_callback(name, size, id, fallback)
       end
       return mk_rml(basename, size, id)
    else
-      return fallback(name, size, id)
+      local tfmdata=fallback(name, size, id)
+      luatexbase.call_callback ("luaotfload.patch_font", tfmdata, name)
+      return tfmdata
    end
 end
 
index ea609ed..d9b903c 100644 (file)
@@ -156,7 +156,6 @@ local function capsule_glyph_tate(p, met, class, head, dir)
         and ltjf_font_extra_info[pf][pc].vwidth 
         and ltjf_font_extra_info[pf][pc].vwidth * met.size or (ascent+descent)
       pwidth = pwidth + (met.v_advance and met.v_advance[pc] or 0)
-      print(pc, met.v_advance[pc], getfield(p, 'yoffset'))
    end
    fwidth = (fwidth ~= 'prop') and fwidth or pwidth
    fshift.down = char_data.down; fshift.left = char_data.left