diff options
Diffstat (limited to 'Build')
17 files changed, 116 insertions, 36 deletions
diff --git a/Build/source/texk/web2c/luatexdir/ChangeLog b/Build/source/texk/web2c/luatexdir/ChangeLog index b18c96f90f3..93bdcaf7da0 100644 --- a/Build/source/texk/web2c/luatexdir/ChangeLog +++ b/Build/source/texk/web2c/luatexdir/ChangeLog @@ -1,3 +1,6 @@ +2021-01-13 Luigi Scarso <luigi.scarso@gmail.com> + * pdftex compatibility hack (H. Hagen) + 2020-12-13 Luigi Scarso <luigi.scarso@gmail.com> * fixed Hyphenation issue regarding frozen glyph nodes (M.F. Krüger) diff --git a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c index 7e76746037b..0cd68038415 100644 --- a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c +++ b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c @@ -6772,6 +6772,12 @@ static int lua_nodelib_setfield_whatsit(lua_State * L, int n, const char *s) } else { return nodelib_cantset(L, n, s); } + } else if (t == pdf_link_state_node) { + if (lua_key_eq(s, value)) { + pdf_link_state(n) = (halfword) lua_tointeger(L, 3); + } else { + return nodelib_cantset(L, n, s); + } } else if ((t == pdf_end_link_node) || (t == pdf_end_thread_node) || (t == save_pos_node) || (t == pdf_save_node) || (t == pdf_restore_node)) { return nodelib_cantset(L, n, s); diff --git a/Build/source/texk/web2c/luatexdir/lua/ltexlib.c b/Build/source/texk/web2c/luatexdir/lua/ltexlib.c index deb77555178..6e19e0727bc 100644 --- a/Build/source/texk/web2c/luatexdir/lua/ltexlib.c +++ b/Build/source/texk/web2c/luatexdir/lua/ltexlib.c @@ -2668,10 +2668,21 @@ static int tex_hashpairs(lua_State * L) while (cs < hash_size) { s = hash_text(cs); if (s > 0) { + halfword n = cs_next(cs); char *ss = makecstring(s); lua_pushstring(L, ss); free(ss); lua_rawseti(L, -2, ++nt); + while (n) { + s = cs_text(n); + if (s) { + ss = makecstring(s); + lua_pushstring(L, ss); + free(ss); + lua_rawseti(L, -2, ++nt); + } + n = cs_next(n); + } } cs++; } diff --git a/Build/source/texk/web2c/luatexdir/lua/luatex-api.h b/Build/source/texk/web2c/luatexdir/lua/luatex-api.h index 06692cb0202..5f42bd5895c 100644 --- a/Build/source/texk/web2c/luatexdir/lua/luatex-api.h +++ b/Build/source/texk/web2c/luatexdir/lua/luatex-api.h @@ -1014,6 +1014,7 @@ make_lua_key(pdf_destination);\ make_lua_key(pdf_end_link);\ make_lua_key(pdf_end_thread);\ make_lua_key(pdf_link_data);\ +make_lua_key(pdf_link_state);\ make_lua_key(pdf_literal);\ make_lua_key(pdf_refobj);\ make_lua_key(pdf_restore);\ @@ -1715,6 +1716,7 @@ init_lua_key(pdf_destination);\ init_lua_key(pdf_end_link);\ init_lua_key(pdf_end_thread);\ init_lua_key(pdf_link_data);\ +init_lua_key(pdf_link_state);\ init_lua_key(pdf_literal);\ init_lua_key(pdf_refobj);\ init_lua_key(pdf_restore);\ @@ -2483,6 +2485,7 @@ use_lua_key(pdf_destination); use_lua_key(pdf_end_link); use_lua_key(pdf_end_thread); use_lua_key(pdf_link_data); +use_lua_key(pdf_link_state); use_lua_key(pdf_literal); use_lua_key(pdf_refobj); use_lua_key(pdf_restore); diff --git a/Build/source/texk/web2c/luatexdir/luatex_svnversion.h b/Build/source/texk/web2c/luatexdir/luatex_svnversion.h index 1802d3b2cf2..0eb59f10988 100644 --- a/Build/source/texk/web2c/luatexdir/luatex_svnversion.h +++ b/Build/source/texk/web2c/luatexdir/luatex_svnversion.h @@ -1 +1 @@ -#define luatex_svn_revision 7395 +#define luatex_svn_revision 7397 diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.c b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.c index 63736787ec5..ce610cb4925 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.c +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.c @@ -916,6 +916,7 @@ void pdf_print_toks(PDF pdf, halfword p) xfree(s); } +/* void pdf_add_rect_spec(PDF pdf, halfword r) { pdf_add_bp(pdf, pdf_ann_left(r)); @@ -923,6 +924,16 @@ void pdf_add_rect_spec(PDF pdf, halfword r) pdf_add_bp(pdf, pdf_ann_right(r)); pdf_add_bp(pdf, pdf_ann_top(r)); } +*/ + +void pdf_add_rect_spec(PDF pdf, halfword r) +{ + /* the check is now here */ + pdf_add_bp(pdf, pdf_ann_left(r) < pdf_ann_right(r) ? pdf_ann_left(r) : pdf_ann_right(r)); + pdf_add_bp(pdf, pdf_ann_bottom(r) < pdf_ann_top(r) ? pdf_ann_bottom(r) : pdf_ann_top(r)); + pdf_add_bp(pdf, pdf_ann_left(r) < pdf_ann_right(r) ? pdf_ann_right(r) : pdf_ann_left(r)); + pdf_add_bp(pdf, pdf_ann_bottom(r) < pdf_ann_top(r) ? pdf_ann_top(r) : pdf_ann_bottom(r)); +} void pdf_rectangle(PDF pdf, halfword r) { diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdflink.c b/Build/source/texk/web2c/luatexdir/pdf/pdflink.c index 55521b17692..77b950adf25 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdflink.c +++ b/Build/source/texk/web2c/luatexdir/pdf/pdflink.c @@ -29,6 +29,16 @@ with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */ +void pdf_out_link_state(PDF pdf, halfword p) +{ + if (pdf_link_state(p) >= 0 && pdf_link_state(p) <= 1) { + pdf->link_state = pdf_link_state(p); + } else { + /* ignores so one can use them for whatever purpose */ + } +} + + void push_link_level(PDF pdf, halfword p) { if (pdf->link_stack_ptr >= pdf_max_link_level) diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdflink.h b/Build/source/texk/web2c/luatexdir/pdf/pdflink.h index 5b3d2042a80..ed96beab3dc 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdflink.h +++ b/Build/source/texk/web2c/luatexdir/pdf/pdflink.h @@ -28,6 +28,7 @@ extern void push_link_level(PDF pdf, halfword p); extern void pop_link_level(PDF pdf); extern void do_link(PDF pdf, halfword p, halfword parent_box, scaledpos cur); +extern void pdf_out_link_state(PDF pdf, halfword p); extern void end_link(PDF pdf, halfword p); extern void append_link(PDF pdf, halfword parent_box, scaledpos cur, small_number i); extern void scan_startlink(PDF pdf); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdflistout.c b/Build/source/texk/web2c/luatexdir/pdf/pdflistout.c index 86567c1dc4e..02c7025c330 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdflistout.c +++ b/Build/source/texk/web2c/luatexdir/pdf/pdflistout.c @@ -177,6 +177,7 @@ static void handle_backend_whatsit(PDF pdf, halfword p, halfword parent_box, sca case pdf_refobj_node: case pdf_end_link_node: case pdf_end_thread_node: + case pdf_link_state_node: backend_out_whatsit[subtype(p)](pdf, p); break; case pdf_annot_node: @@ -254,8 +255,20 @@ void hlist_out(PDF pdf, halfword this_box, int rule_callback_id) cur_s++; backend_out_control[backend_control_push_list](pdf,&saved_pos,&saved_loc); for (i = 1; i <= pdf->link_stack_ptr; i++) { - if (pdf->link_stack[i].nesting_level == cur_s) + if (pdf->link_state == 1) { + /* + We ignore this link. This is a compatibility-with-pdftex feature needed for latex. It + is suboptimal in the sense that when the whatsit is set, the next box is influenced, + so there there can be side effects when used in the middle of a line, when using + vadjust, etc. But we can assume that tha macro package knows when and where this + mechanism is triggered, so a more sophisticated solution is not needed (and would be + confusing in its own anyway.) + + I would not be surprised of we have some leak here but it's harmless. + */ + } else if (pdf->link_stack[i].nesting_level == cur_s) { append_link(pdf, this_box, cur, (small_number) i); + } } if (synctex) { synctexhlist(this_box); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdftables.c b/Build/source/texk/web2c/luatexdir/pdf/pdftables.c index a97d0e39e85..2a02dcd98ec 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdftables.c +++ b/Build/source/texk/web2c/luatexdir/pdf/pdftables.c @@ -224,8 +224,7 @@ void check_obj_type(PDF pdf, int t, int objnum) void set_rect_dimens(PDF pdf, halfword p, halfword parent_box, scaledpos cur, scaled_whd alt_rule, scaled margin) { /*tex The positions relative to cur: */ - scaledpos ll, ur; - scaledpos pos_ll, pos_ur, tmp; + scaledpos ll, ur, pos_ll, pos_ur; posstructure localpos; localpos.dir = pdf->posstruct->dir; /*tex |pdf| contains current point on page: */ @@ -246,16 +245,11 @@ void set_rect_dimens(PDF pdf, halfword p, halfword parent_box, scaledpos cur, sc pos_ll = localpos.pos; synch_pos_with_cur(&localpos, pdf->posstruct, ur); pos_ur = localpos.pos; - if (pos_ll.h > pos_ur.h) { - tmp.h = pos_ll.h; - pos_ll.h = pos_ur.h; - pos_ur.h = tmp.h; - } - if (pos_ll.v > pos_ur.v) { - tmp.v = pos_ll.v; - pos_ll.v = pos_ur.v; - pos_ur.v = tmp.v; - } + /* + The test for swapping has been moved to the moment we write the rectangle. This has to + do with the fact that we have code dealing with directions and that the |pdf_ann_*| + horizontal edges get recalculated in some places. + */ if (global_shipping_mode == SHIPPING_PAGE && matrixused()) { matrixtransformrect(pos_ll.h, pos_ll.v, pos_ur.h, pos_ur.v); pos_ll.h = getllx(); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h b/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h index 67ffcbecb22..ad2465f5283 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h +++ b/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h @@ -371,6 +371,7 @@ typedef struct pdf_output_file_ { /* the pdf link stack */ pdf_link_stack_record link_stack[(pdf_max_link_level + 1)]; int link_stack_ptr; + int link_state; /* the thread data */ int last_thread; /* pointer to the last thread */ scaled_whd thread; diff --git a/Build/source/texk/web2c/luatexdir/tex/backend.c b/Build/source/texk/web2c/luatexdir/tex/backend.c index d8c7daed251..3115a88a7e3 100644 --- a/Build/source/texk/web2c/luatexdir/tex/backend.c +++ b/Build/source/texk/web2c/luatexdir/tex/backend.c @@ -45,6 +45,7 @@ static void init_pdf_backend_functions(void) p->whatsit_fu[pdf_setmatrix_node] = &pdf_out_setmatrix; p->whatsit_fu[pdf_save_node] = &pdf_out_save; p->whatsit_fu[pdf_restore_node] = &pdf_out_restore; + p->whatsit_fu[pdf_link_state_node] = &pdf_out_link_state; p->control_fu[backend_control_push_list] = &pdf_push_list; p->control_fu[backend_control_pop_list] = &pdf_pop_list; p->control_fu[backend_control_begin_page] = &pdf_begin_page; diff --git a/Build/source/texk/web2c/luatexdir/tex/dumpdata.c b/Build/source/texk/web2c/luatexdir/tex/dumpdata.c index 215cd686fd2..e7d53050b29 100644 --- a/Build/source/texk/web2c/luatexdir/tex/dumpdata.c +++ b/Build/source/texk/web2c/luatexdir/tex/dumpdata.c @@ -32,7 +32,7 @@ with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */ -#define FORMAT_ID (907+53) +#define FORMAT_ID (907+54) #if ((FORMAT_ID>=0) && (FORMAT_ID<=256)) #error Wrong value for FORMAT_ID. #endif diff --git a/Build/source/texk/web2c/luatexdir/tex/errors.c b/Build/source/texk/web2c/luatexdir/tex/errors.c index 19be6570379..ce80df99e7e 100644 --- a/Build/source/texk/web2c/luatexdir/tex/errors.c +++ b/Build/source/texk/web2c/luatexdir/tex/errors.c @@ -290,7 +290,8 @@ static int Isspace (char c) __attribute__ ((noreturn)) static void luatex_calledit (int baseptr, int linenumber) { - char *temp, *command, *fullcmd; + char *temp, *command; + char *fullcmd = NULL; /* avoid compiler warning */ char c; int sdone, ddone, i; char *filename = makecstring(input_stack[base_ptr].name_field); @@ -442,7 +443,7 @@ void error(void) /*tex Get user's advice and |return|. */ while (1) { CONTINUE: - /*tex + /*tex Original reports: https://tex.stackexchange.com/questions/551313/ @@ -455,7 +456,7 @@ void error(void) selector from 16 to 15 in term_input, due to the lack of this check in recursive error() call. */ - if (interaction !=error_stop_mode) + if (interaction !=error_stop_mode) return; clear_for_error_prompt(); prompt_input("? "); @@ -986,7 +987,7 @@ void normal_warning(const char *t, const char *p) new_line_char_par = 10; report_id = callback_defined(show_lua_error_hook_callback); if (report_id == 0) { - if (p != NULL) + if (p != NULL) tprint(p); help2( "The lua interpreter ran into a problem, so the", diff --git a/Build/source/texk/web2c/luatexdir/tex/extensions.c b/Build/source/texk/web2c/luatexdir/tex/extensions.c index 60deb747a85..19d4e444173 100644 --- a/Build/source/texk/web2c/luatexdir/tex/extensions.c +++ b/Build/source/texk/web2c/luatexdir/tex/extensions.c @@ -156,6 +156,10 @@ static void do_extension_pdf(int immediate) new_whatsit(pdf_save_node); } else if (scan_keyword("restore")) { new_whatsit(pdf_restore_node); + } else if (scan_keyword("linkstate")) { + new_whatsit(pdf_link_state_node); + scan_int(); + pdf_link_state(tail) = cur_val; } else if (scan_keyword("setmatrix")) { new_whatsit(pdf_setmatrix_node); scan_toks(false, true); diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.c b/Build/source/texk/web2c/luatexdir/tex/texnodes.c index 0d7bcd5dec2..02e117a876b 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texnodes.c +++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.c @@ -136,12 +136,14 @@ field_info node_fields_whatsit_pdf_end_thread[2]; field_info node_fields_whatsit_pdf_literal[4]; field_info node_fields_whatsit_pdf_refobj[3]; field_info node_fields_whatsit_pdf_restore[2]; +field_info node_fields_whatsit_pdf_link_state[3]; field_info node_fields_whatsit_pdf_save[2]; field_info node_fields_whatsit_pdf_setmatrix[3]; field_info node_fields_whatsit_pdf_start_link[8]; field_info node_fields_whatsit_pdf_start_thread[8]; field_info node_fields_whatsit_pdf_thread[8]; + /*tex The values of fields. */ subtype_info node_values_dir[] = { @@ -997,6 +999,7 @@ node_info whatsit_node_data[] = { { pdf_setmatrix_node, pdf_setmatrix_node_size, NULL, node_fields_whatsit_pdf_setmatrix, NULL, -1, 0 }, { pdf_save_node, pdf_save_node_size, NULL, node_fields_whatsit_pdf_save, NULL, -1, 0 }, { pdf_restore_node, pdf_restore_node_size, NULL, node_fields_whatsit_pdf_restore, NULL, -1, 0 }, + { pdf_link_state_node, pdf_link_state_node_size, NULL, node_fields_whatsit_pdf_link_state, NULL, -1, 0 }, /*tex That's it. */ @@ -1065,6 +1068,7 @@ void l_set_whatsit_data(void) { init_node_key(whatsit_node_data, pdf_setmatrix_node, pdf_setmatrix) init_node_key(whatsit_node_data, pdf_save_node, pdf_save) init_node_key(whatsit_node_data, pdf_restore_node, pdf_restore) + init_node_key(whatsit_node_data, pdf_link_state_node, pdf_link_state) init_node_key(node_values_pdf_destination, 0, xyz) init_node_key(node_values_pdf_destination, 1, fit) @@ -1133,6 +1137,10 @@ void l_set_whatsit_data(void) { init_field_key(node_fields_whatsit_pdf_end_link, 0, attr); init_field_nop(node_fields_whatsit_pdf_end_link, 1); + init_field_key(node_fields_whatsit_pdf_link_state, 0, attr); + init_field_key(node_fields_whatsit_pdf_link_state, 1, value); + init_field_nop(node_fields_whatsit_pdf_link_state, 2); + init_field_key(node_fields_whatsit_pdf_end_thread, 0, attr); init_field_nop(node_fields_whatsit_pdf_end_thread, 1); @@ -2257,6 +2265,7 @@ void flush_node_wrapup_pdf(halfword p) switch(subtype(p)) { case pdf_save_node: case pdf_restore_node: + case pdf_link_state_node: case pdf_refobj_node: case pdf_end_link_node: case pdf_end_thread_node: @@ -2559,6 +2568,7 @@ void check_node_wrapup_pdf(halfword p) break; case pdf_save_node: case pdf_restore_node: + case pdf_link_state_node: case pdf_refobj_node: case pdf_end_link_node: case pdf_end_thread_node: @@ -3550,21 +3560,21 @@ void show_node_wrapup_pdf(int p) tprint_esc("pdfcolorstack "); print_int(pdf_colorstack_stack(p)); switch (pdf_colorstack_cmd(p)) { - case colorstack_set: - tprint(" set "); - break; - case colorstack_push: - tprint(" push "); - break; - case colorstack_pop: - tprint(" pop"); - break; - case colorstack_current: - tprint(" current"); - break; - default: - confusion("colorstack"); - break; + case colorstack_set: + tprint(" set "); + break; + case colorstack_push: + tprint(" push "); + break; + case colorstack_pop: + tprint(" pop"); + break; + case colorstack_current: + tprint(" current"); + break; + default: + confusion("colorstack"); + break; } if (pdf_colorstack_cmd(p) <= colorstack_data) print_mark(pdf_colorstack_data(p)); @@ -3579,6 +3589,10 @@ void show_node_wrapup_pdf(int p) case pdf_restore_node: tprint_esc("pdfrestore"); break; + case pdf_link_state_node: + tprint_esc("pdflinkstate "); + print_int(pdf_link_state(p)); + break; case pdf_refobj_node: tprint_esc("pdfrefobj"); if (obj_obj_is_stream(static_pdf, pdf_obj_objnum(p))) { diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.h b/Build/source/texk/web2c/luatexdir/tex/texnodes.h index 121511bc098..9742ca4966c 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texnodes.h +++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.h @@ -734,6 +734,7 @@ typedef enum { pdf_setmatrix_node, pdf_save_node, pdf_restore_node, + pdf_link_state_node, } whatsit_types; # define first_common_whatsit 0 @@ -741,9 +742,11 @@ typedef enum { # define backend_first_dvi_whatsit 15 # define backend_last_dvi_whatsit 15 # define backend_first_pdf_whatsit 16 -# define backend_last_pdf_whatsit 31 +# define backend_last_pdf_whatsit 32 -# define MAX_WHATSIT_TYPE 32 +/* add some slack for the future */ + +# define MAX_WHATSIT_TYPE 34 # define known_whatsit_type(i) ( \ (i >= first_common_whatsit && i <= last_common_whatsit) || \ @@ -920,6 +923,10 @@ typedef enum { # define pdf_save_node_size 3 # define pdf_restore_node_size 3 +# define pdf_link_state_node_size 3 + +# define pdf_link_state(a) vinfo((a) + 2) + # define pdf_colorstack_node_size 4 # define pdf_colorstack_stack(a) vlink((a)+2) # define pdf_colorstack_cmd(a) vinfo((a)+2) |