+-------------------- IVS
+local enable_ivs, disable_ivs
+do
+ local is_ivs_enabled = false
+-- 組版時
+ local function ivs_jglyph(char, bp, pf, uid)
+ local p = node_new(id_whatsit,sid_user)
+ setfield(p, 'user_id', uid)
+ setfield(p, 'type', 100)
+ setfield(p, 'value', char)
+ return p
+ end
+
+ local function do_ivs_repr(h)
+ local head = to_direct(h)
+ local p, r = head
+ local is_dir_tate = (ltjs.list_dir == dir_tate)
+ local attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift
+ local attr_kblshift = is_dir_tate and attr_tkblshift or attr_ykblshift
+ local attr_curfnt = is_dir_tate and attr_curtfnt or attr_curjfnt
+ while p do
+ local pid = getid(p)
+ if pid==id_glyph then
+ local q = node_next(p) -- the next node of p
+ if q and getid(q)==id_glyph then
+ local qc = getchar(q)
+ if (qc>=0xFE00 and qc<=0xFE0F) or (qc>=0xE0100 and qc<0xE01F0) then
+ -- q is a variation selector
+ if qc>=0xE0100 then qc = qc - 0xE0100 end
+ local pf = getfont(p)
+ local pt = ltjf_font_extra_info[pf]
+ pt = pt and pt[getchar(p)]; pt = pt and pt[qc]
+ head, r = node_remove(head,q)
+ node_free(q)
+ if pt then
+ local is_jachar = (getfield(p, 'lang')==lang_ja)
+ local np = ivs_jglyph(pt, p, pf,
+ is_jachar and OTF or VSR)
+ if is_jachar then
+ set_attr(np, attr_curfnt, pf)
+ set_attr(np, attr_kblshift, has_attr(p, attr_kblshift))
+ end
+ head = node_insert_after(head, p, np)
+ head = node_remove(head,p)
+ node_free(p)
+ end
+ p = r
+ else
+ p = q
+ end
+ else
+ p = node_next(p)
+ end
+ else
+ p = node_next(p)
+ end
+ end
+ return to_node(head)
+ end
+
+ enable_ivs = function ()
+ if is_ivs_enabled then
+ ltjb.package_warning('luatexja-otf',
+ 'luatexja.otf.enable_ivs() was already called, so this call is ignored', '')
+ else
+ ltjb.add_to_callback('hpack_filter', do_ivs_repr, 'ltj.do_ivs',
+ luatexbase.priority_in_callback('hpack_filter', 'luaotfload.node_processor'))
+ ltjb.add_to_callback('pre_linebreak_filter', do_ivs_repr, 'ltj.do_ivs',
+ luatexbase.priority_in_callback('pre_linebreak_filter', 'luaotfload.node_processor'))
+ is_ivs_enabled = true
+ end
+ end
+ disable_ivs = function ()
+ if is_ivs_enabled then
+ luatexbase.remove_from_callback('hpack_filter', 'ltj.do_ivs')
+ luatexbase.remove_from_callback('pre_linebreak_filter', 'ltj.do_ivs')
+ is_ivs_enabled = false
+ end
+ end
+end
+
+luatexja.otf = {
+ append_jglyph = append_jglyph,
+ enable_ivs = enable_ivs, -- 隠し機能: IVS
+ disable_ivs = disable_ivs, -- 隠し機能: IVS
+ cid = cid,
+}
+