X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-direction.lua;h=c05d0ed6c35550f64022505ac5e97242fdc7c5a3;hb=b5ae2980b79b069dd439c80b784c10e1b4f86d2f;hp=a9bdfbd8ab9a3a28fabe8f3f197aef667b7aa91b;hpb=8bad6f3e68102b7e6020ec0c39a532b81ce6bae7;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-direction.lua b/src/ltj-direction.lua index a9bdfbd..c05d0ed 100644 --- a/src/ltj-direction.lua +++ b/src/ltj-direction.lua @@ -45,7 +45,7 @@ local sid_user = node.subtype('user_defined') local tex_nest = tex.nest local tex_getcount = tex.getcount -local tex_set_attr = tex.setattribute +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 @@ -63,6 +63,21 @@ end local page_direction -- +local dir_pool +do + 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 @@ -166,15 +181,11 @@ 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)) - tex_set_attr('global', attr_icflag, 0) - tex_set_attr('global', attr_dir, 0) + ensure_tex_attr(attr_icflag, 0) + ensure_tex_attr(attr_dir, 0) end local function set_list_direction(v, name) @@ -210,17 +221,11 @@ 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 - tex_set_attr('global', attr_icflag, 0) + ensure_tex_attr(attr_icflag, 0) end - tex_set_attr('global', attr_dir, 0) + ensure_tex_attr(attr_dir, 0) end luatexja.direction.set_list_direction = set_list_direction end @@ -231,20 +236,21 @@ local function create_dir_whatsit(hd, gc, new_dir) getsubtype(hd)==sid_user and getfield(hd, 'user_id')==DIR then set_attr(hd, attr_icflag, get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) - tex_set_attr('global', attr_icflag, 0) + local n = node_next(hd) + if n then + set_attr(n, attr_icflag, + get_attr_icflag(n) + PROCESSED_BEGIN_FLAG) + end + 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, - (has_attr(hd, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG - + PROCESSED_BEGIN_FLAG) - tex_set_attr('global', attr_dir, 0) - tex_set_attr('global', attr_icflag, 0) + get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) + ensure_tex_attr(attr_icflag, 0) + ensure_tex_attr(attr_dir, 0) return w end end @@ -257,7 +263,7 @@ do if gc=='fin_row' or gc == 'preamble' then if hd then set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) - tex_set_attr('global', attr_icflag, 0) + ensure_tex_attr(attr_icflag, 0) end return h else @@ -274,13 +280,11 @@ 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 - tex_set_attr('global', attr_dir, 0) + ensure_tex_attr(attr_dir, 0) return h end luatexbase.add_to_callback('post_linebreak_filter', @@ -312,7 +316,7 @@ do if gc=='fin_row' then -- gc == 'preamble' case is treated in dir_adjust_vpack if hd then set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) - tex_set_attr('global', attr_icflag, 0) + ensure_tex_attr(attr_icflag, 0) end return hd else @@ -483,14 +487,20 @@ local function get_box_dir(b, default) local bh = getfield(b,'head') -- b は insert node となりうるので getlist() は使えない local c - for i=1,2 do - if bh and getid(bh)==id_whatsit - and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then + for bh in traverse_id(id_whatsit, bh) do + if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then c = bh - dir = (dir==0) and has_attr(bh, attr_dir) or dir + dir = (dir==0) and has_attr(bh, attr_dir) or dir end - bh = node_next(bh) end + -- for i=1,2 do + -- if bh and getid(bh)==id_whatsit + -- and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then + -- c = bh + -- dir = (dir==0) and has_attr(bh, attr_dir) or dir + -- end + -- bh = node_next(bh) + -- end stop_time_measure('get_box_dir') return (dir==0 and default or dir), c end @@ -583,8 +593,8 @@ local function create_dir_node(b, b_dir, new_dir, is_manual) new_dir + (is_manual and dir_node_manual or dir_node_auto)) set_attr(db, attr_icflag, PROCESSED) set_attr(b, attr_icflag, PROCESSED) - tex_set_attr('global', attr_dir, 0) - tex_set_attr('global', attr_icflag, 0) + ensure_tex_attr(attr_dir, 0) + ensure_tex_attr(attr_icflag, 0) setfield(db, 'dir', getfield(b, 'dir')) setfield(db, 'shift', 0) setfield(db, 'width', info.width(w,h,d)) @@ -745,6 +755,7 @@ 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 @@ -876,29 +887,59 @@ do local function glyph_from_packed(h) local b = getlist(h) return (getid(b)==id_kern or (getid(b)==id_whatsit and getsubtype(b)==sid_save) ) - and node_next(node_next(node_next(node_next(b)))) or b + and node_next(node_next(node_next(b))) or b end luatexja.direction.glyph_from_packed = glyph_from_packed end --- adjust and insertion -local id_adjust = node.id('adjust') -function luatexja.direction.check_adjust_direction() - start_time_measure('box_primitive_hook') - local list_dir = get_adjust_dir_count() - local a = tex_nest[tex_nest.ptr].tail - local ad = to_direct(a) - if a and getid(ad)==id_adjust then - local adj_dir = get_box_dir(ad) - if list_dir~=adj_dir then - ltjb.package_error( - 'luatexja', - 'Direction Incompatible', - "\\vadjust's argument and outer vlist must have same direction.") - Dnode.last_node() +-- adjust +do + local id_adjust = node.id('adjust') + function luatexja.direction.check_adjust_direction() + start_time_measure('box_primitive_hook') + local list_dir = get_adjust_dir_count() + local a = tex_nest[tex_nest.ptr].tail + local ad = to_direct(a) + if a and getid(ad)==id_adjust then + local adj_dir = get_box_dir(ad) + if list_dir~=adj_dir then + ltjb.package_error( + 'luatexja', + 'Direction Incompatible', + "\\vadjust's argument and outer vlist must have same direction.") + Dnode.last_node() + end end + stop_time_measure('box_primitive_hook') + end +end + +-- insert +do + local id_ins = node.id('ins') + local id_rule = node.id('rule') + function luatexja.direction.populate_insertion_dir_whatsit() + start_time_measure('box_primitive_hook') + local list_dir = get_dir_count() + local a = tex_nest[tex_nest.ptr].tail + local ad = to_direct(a) + if a and getid(ad)==id_ins then + local h = getfield(ad, 'head') + if getid(h)==id_whatsit and + getsubtype(h)==sid_user and getfield(h, 'user_id')==DIR then + local n = h; h = node_remove(h,h) + node_free(n) + end + for box_rule in traverse(h) do + if getid(box_rule)lua_mem_kb+20480 then + -- collectgarbage(); lua_mem_kb = collectgarbage('count') + --end + --print('Lua Memory Usage', lua_mem_kb) end end