X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-direction.lua;h=a4f2ff2003a36558676f7830ea703b1e6c4c5bb0;hb=92890522808ce362e8fe4b3162ab97e86a8066de;hp=7e07285b73b222098c5cf6010e4545f63e6c5c33;hpb=6efa6ef451d0e6286aa7501a3c2a65ae74bb0ad2;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-direction.lua b/src/ltj-direction.lua index 7e07285..a4f2ff2 100644 --- a/src/ltj-direction.lua +++ b/src/ltj-direction.lua @@ -45,6 +45,7 @@ local sid_user = node.subtype('user_defined') local tex_nest = tex.nest local tex_getcount = tex.getcount +local ensure_tex_attr = ltjb.ensure_tex_attr local PROCESSED = luatexja.icflag_table.PROCESSED local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG local PACKED = luatexja.icflag_table.PACKED @@ -62,17 +63,21 @@ end local page_direction -- -local ensure_tex_attr +local dir_pool do - local tex_set_attr = tex.setattribute - local tex_get_attr = tex.getattribute - function ensure_tex_attr(a, v) - if tex_get_attr(a)~=v then - tex_set_attr('global', a, v) - end + local node_copy = Dnode.copy + dir_pool = {} + for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do + local w = node_new(id_whatsit, sid_user) + set_attr(w, attr_dir, i) + setfield(w, 'user_id', DIR) + setfield(w, 'type', 110) + setfield(w, 'next', nil) + dir_pool[i] = function () return node_copy(w) end end end +-- local function adjust_badness(hd) if not node_next(hd) and getid(hd)==id_whatsit and getsubtype(hd)==sid_user and getfield(hd, 'user_id')==DIR then @@ -135,6 +140,7 @@ do local node_traverse = node.traverse local STCK = luatexja.userid_table.STCK local IHB = luatexja.userid_table.IHB + local sid_local = node.subtype('local_par') local function test_list(h, lv) if not h then @@ -144,14 +150,15 @@ do local w for p in node_traverse(h) do if p.id==id_whatsit then - if p.subtype==sid_user then + local ps = p.subtype + if ps==sid_user then local uid= p.user_id if uid==DIR then flag = 1; w = w or p -- found elseif not(uid==IHB or uid==STCK) then flag = 0; break -- error end - else + elseif ps~=sid_local then flag = 0; break end else @@ -176,11 +183,7 @@ do v = get_adjust_dir_count() end local h = to_direct(tex_nest[lv].head) - local w = node_new(id_whatsit, sid_user) - setfield(w, 'next', nil) - setfield(w, 'user_id', DIR) - setfield(w, 'type', 110) - set_attr(w, attr_dir, v) + local w = dir_pool[v]() insert_after(h, h, w) tex_nest[lv].tail = to_node(node_tail(w)) ensure_tex_attr(attr_icflag, 0) @@ -220,12 +223,6 @@ do node_set_attr(w, attr_dir, v) if lv==0 then page_direction = v end else - local w = node_new(id_whatsit, sid_user) - setfield(w, 'next', nil) - setfield(w, 'user_id', DIR) - setfield(w, 'type', 110) - set_attr(w, attr_dir, v) - Dnode.write(w) if lv==0 then page_direction = v end end ensure_tex_attr(attr_icflag, 0) @@ -249,11 +246,8 @@ local function create_dir_whatsit(hd, gc, new_dir) ensure_tex_attr(attr_icflag, 0) return hd else - local w = node_new(id_whatsit, sid_user) + local w = dir_pool[new_dir]() setfield(w, 'next', hd) - setfield(w, 'user_id', DIR) - setfield(w, 'type', 110) - set_attr(w, attr_dir, new_dir) set_attr(w, attr_icflag, PROCESSED_BEGIN_FLAG) set_attr(hd, attr_icflag, get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) @@ -288,11 +282,9 @@ do local function create_dir_whatsit_parbox(h, gc) stop_time_measure('tex_linebreak') -- start 側は ltj-debug.lua に - local new_dir, hd = ltjs.list_dir, to_direct(h) - for line in traverse_id(id_hlist, hd) do - local nh = getlist(line) - setfield(line, 'head', create_dir_whatsit(nh, gc, new_dir) ) - --set_attr(line, attr_dir, new_dir) + local new_dir = ltjs.list_dir + for line in traverse_id(id_hlist, to_direct(h)) do + setfield(line, 'head', create_dir_whatsit(getlist(line), gc, new_dir) ) end ensure_tex_attr(attr_dir, 0) return h @@ -765,11 +757,14 @@ do else setdimen('ltj@tempdima', 0) end + tex.sprint(cat_lp, '\\ltj@tempdima') tex.globaldefs = gt end luatexja.direction.get_box_dim = get_box_dim -- return value: (changed dimen of box itself?) + local scan_dimen, scan_int = luatexja.token.scan_dimen, luatexja.token.scan_int + local scan_keyword = luatexja.token.scan_keyword local function set_box_dim_common(key, s, l_dir) local s_dir, wh = get_box_dir(s, dir_yoko) s_dir = s_dir%dir_math_mod @@ -790,10 +785,10 @@ do setfield(db, 'next', dnh) setfield(wh, 'value',to_node(db)) end - setfield(db, key, tex.getdimen('ltj@tempdima')) + setfield(db, key, scan_dimen()) return false else - setfield(s, key, tex.getdimen('ltj@tempdima')) + setfield(s, key, scan_dimen()) if wh then -- change dimension of dir_nodes which are created "automatically" local bw, bh, bd @@ -812,8 +807,7 @@ do end end local function set_box_dim(key) - local n = tex_getcount('ltj@tempcnta') - local s = getbox(n) + local s = getbox(scan_int()); scan_keyword('=') if s then local l_dir = (get_dir_count())%dir_math_mod s = to_direct(s) @@ -822,7 +816,7 @@ do set_box_dim_common(key, s, l_dir) elseif b_dir%dir_math_mod == l_dir then -- s is dir_node - setfield(s, key, tex.getdimen('ltj@tempdima')) + setfield(s, key, scan_dimen()) if b_dirlua_mem_kb+20480 then + -- collectgarbage(); lua_mem_kb = collectgarbage('count') + --end + --print('Lua Memory Usage', lua_mem_kb) end end