local page_direction
--
-local ensure_tex_attr
+local ensure_tex_attr, copy_dir_pool
do
local tex_set_attr = tex.setattribute
- local tex_get_attr = tex.getattribute
+ local tex_get_attr, node_copy = tex.getattribute, Dnode.copy
function ensure_tex_attr(a, v)
if tex_get_attr(a)~=v then
tex_set_attr('global', a, v)
end
end
+ local 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] = w
+ end
+ function copy_dir_pool(d)
+ return node_copy(dir_pool[d])
+ 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
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 = copy_dir_pool(v)
insert_after(h, h, w)
tex_nest[lv].tail = to_node(node_tail(w))
ensure_tex_attr(attr_icflag, 0)
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)
+ local w = copy_dir_pool(v)
Dnode.write(w)
if lv==0 then page_direction = v end
end
ensure_tex_attr(attr_icflag, 0)
return hd
else
- local w = node_new(id_whatsit, sid_user)
+ local w = copy_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)
end
for box_rule in traverse(h) do
if getid(box_rule)<id_rule then
- 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, list_dir)
+ local w = copy_dir_pool(list_dir)
h = insert_before(h, box_rule, w)
end
end