diff options
18 files changed, 150 insertions, 66 deletions
diff --git a/Build/source/texk/web2c/luatexdir/NEWS b/Build/source/texk/web2c/luatexdir/NEWS index f27b9c4faa1..c41a2542f04 100644 --- a/Build/source/texk/web2c/luatexdir/NEWS +++ b/Build/source/texk/web2c/luatexdir/NEWS @@ -1,6 +1,23 @@ This file is in the public domain. +============================================================== +Luatex Release 0.89.0 was released 2016020500 +============================================================== + +No fundamental changes, just some fixes / improvements (and of course new bugglets). + +- New backend things: + \pdfvariable pkfixeddpi = integer % > 0 : use only default dpi (so one can do with one high res instance) + \pdfvariable ignoreunknownimages = integer % > 0 : ignore missing and inject something empty (to be used with care) + and one can do this: + \edef\foo{\pdfvariable foo} + \def \oof{foo} + \ifx\foo\oof don't fool me\fi + (side effect of no longer aborting on missing, so one implement a catch) + + + ============================================================== Luatex Release 0.88.0 was released 2016011500 @@ -2643,7 +2660,7 @@ Other news: we probably introduced new problems as well). * Most (all?) files now have a corrected Copyright header, - and link in $Id: NEWS 5726 2016-01-18 11:26:27Z luigi $ and $URL: https://foundry.supelec.fr/svn/luatex/trunk/source/texk/web2c/luatexdir/NEWS $ into the object file. + and link in $Id: NEWS 5776 2016-02-05 13:49:11Z luigi $ and $URL: https://foundry.supelec.fr/svn/luatex/trunk/source/texk/web2c/luatexdir/NEWS $ into the object file. * Some unnecessary files were removed from the distribution. diff --git a/Build/source/texk/web2c/luatexdir/lang/texlang.w b/Build/source/texk/web2c/luatexdir/lang/texlang.w index 65cc3c1636f..8e0deb3357d 100644 --- a/Build/source/texk/web2c/luatexdir/lang/texlang.w +++ b/Build/source/texk/web2c/luatexdir/lang/texlang.w @@ -26,7 +26,7 @@ @ Low-level helpers @ @c -#define noVERBOSE +#define unVERBOSE #define MAX_TEX_LANGUAGES 16384 @@ -795,7 +795,9 @@ static int valid_wordend(halfword s) || type(r) == ins_node || type(r) == adjust_node || type(r) == penalty_node - || (type(r) == kern_node && (subtype(r) == explicit || subtype(r) == acc_kern))) + || (type(r) == kern_node && (subtype(r) == explicit_kern || + subtype(r) == italic_kern || + subtype(r) == accent_kern ))) return 1; return 0; } diff --git a/Build/source/texk/web2c/luatexdir/lua/lpdflib.c b/Build/source/texk/web2c/luatexdir/lua/lpdflib.c index cb7aa5aba35..210bc41a7cc 100644 --- a/Build/source/texk/web2c/luatexdir/lua/lpdflib.c +++ b/Build/source/texk/web2c/luatexdir/lua/lpdflib.c @@ -730,12 +730,12 @@ static int l_getmatrix(lua_State * L) { if (matrix_stack_used > 0) { matrix_entry *m = &matrix_stack[matrix_stack_used - 1]; - lua_pushinteger(L, m->a); - lua_pushinteger(L, m->b); - lua_pushinteger(L, m->c); - lua_pushinteger(L, m->d); - lua_pushinteger(L, m->e); - lua_pushinteger(L, m->f); + lua_pushnumber(L, m->a); + lua_pushnumber(L, m->b); + lua_pushnumber(L, m->c); + lua_pushnumber(L, m->d); + lua_pushnumber(L, m->e); + lua_pushnumber(L, m->f); } else { lua_pushinteger(L, 1); lua_pushinteger(L, 0); diff --git a/Build/source/texk/web2c/luatexdir/luatex.c b/Build/source/texk/web2c/luatexdir/luatex.c index 23e5252dcf5..14d5fd2cd99 100644 --- a/Build/source/texk/web2c/luatexdir/luatex.c +++ b/Build/source/texk/web2c/luatexdir/luatex.c @@ -30,7 +30,7 @@ int luatex_version = 89; /* \.{\\luatexversion} */ int luatex_revision = '0'; /* \.{\\luatexrevision} */ -int luatex_date_info = 2016012800; /* the compile date is now hardwired */ +int luatex_date_info = 2016020500; /* the compile date is now hardwired */ const char *luatex_version_string = "beta-0.89.0"; const char *engine_name = my_name; /* the name of this engine */ diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w index f14254c1996..a6bf67f3ebb 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w @@ -538,6 +538,7 @@ void pdf_print_int(PDF pdf, longinteger n) } @ @c +/* void print_pdffloat(PDF pdf, pdffloat f) { char a[24]; @@ -561,6 +562,53 @@ void print_pdffloat(PDF pdf, pdffloat f) pdf_puts(pdf, (a + 1)); } } +*/ + +void print_pdffloat(PDF pdf, pdffloat f) +{ + int64_t m = f.m; + if (m == 0) { + pdf_out(pdf, '0'); + } else { + int e = f.e; + if (e == 0) { + /* division by ten_pow[0] == 1 */ + if (m == 1) { + pdf_out(pdf, '1'); + } else { + char a[24]; + snprintf(a, 23, "%ld", m); + pdf_puts(pdf, a); + } + } else { + int t = ten_pow[e] ; + if (t == m) { + pdf_out(pdf, '1'); + } else { + int i; + char a[24]; + int l = m / t; + int w = snprintf(a, 23, "%i", l); + pdf_out_block(pdf, (const char *) a, (size_t) w); + if (m < 0) { + l = - m % t; + } else { + l = m % t; + } + if (l != 0) { + pdf_out(pdf, '.'); + snprintf(a, 23, "%d", l + t); + for (i = e; i > 0; i--) { + if (a[i] != '0') + break; + a[i] = '\0'; + } + pdf_puts(pdf, (a + 1)); + } + } + } + } +} @ print out |s| as string in PDF output @@ -914,7 +962,8 @@ static void init_pdf_outputparameters(PDF pdf) int pk_mode; pdf->draftmode = fix_int(int_par(draft_mode_code), 0, 1); pdf->compress_level = fix_int(pdf_compress_level, 0, 9); - pdf->decimal_digits = fix_int(pdf_decimal_digits, 3, 6); + pdf->decimal_digits = fix_int(pdf_decimal_digits, 3, 5); +/* pdf->decimal_digits = fix_int(pdf_decimal_digits, 3, 6);*//* later, maybe (LS)*/ pdf->gamma = fix_int(pdf_gamma, 0, 1000000); pdf->image_gamma = fix_int(pdf_image_gamma, 0, 1000000); pdf->image_hicolor = fix_int(pdf_image_hicolor, 0, 1); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfpage.w b/Build/source/texk/web2c/luatexdir/pdf/pdfpage.w index 34bb5d1e933..90f63534d32 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfpage.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfpage.w @@ -105,16 +105,16 @@ boolean calc_pdfpos(pdfstructure * p, scaledpos pos) boolean move_pdfpos = false; switch (p->mode) { case PMODE_PAGE: - new.h = i32round(pos.h * p->k1); - new.v = i32round(pos.v * p->k1); + new.h = i64round(pos.h * p->k1); + new.v = i64round(pos.v * p->k1); p->cm[4].m = new.h - p->pdf.h.m; /* cm is concatenated */ p->cm[5].m = new.v - p->pdf.v.m; if (new.h != p->pdf.h.m || new.v != p->pdf.v.m) move_pdfpos = true; break; case PMODE_TEXT: - new.h = i32round(pos.h * p->k1); - new.v = i32round(pos.v * p->k1); + new.h = i64round(pos.h * p->k1); + new.v = i64round(pos.v * p->k1); p->tm[4].m = new.h - p->pdf_bt_pos.h.m; /* Tm replaces */ p->tm[5].m = new.v - p->pdf_bt_pos.v.m; if (new.h != p->pdf.h.m || new.v != p->pdf.v.m) @@ -124,16 +124,16 @@ boolean calc_pdfpos(pdfstructure * p, scaledpos pos) case PMODE_CHARARRAY: switch (p->wmode) { case WMODE_H: - new.h = i32round((pos.h * p->k1 - (double) p->pdf_tj_pos.h.m) * p->k2); - new.v = i32round(pos.v * p->k1); + new.h = i64round((pos.h * p->k1 - (double) p->pdf_tj_pos.h.m) * p->k2); + new.v = i64round(pos.v * p->k1); p->tj_delta.m = -i64round((double) ((new.h - p->cw.m) / ten_pow[p->cw.e - p->tj_delta.e])); p->tm[5].m = new.v - p->pdf_bt_pos.v.m; /* p->tm[4] is meaningless */ if (p->tj_delta.m != 0 || new.v != p->pdf.v.m) move_pdfpos = true; break; case WMODE_V: - new.h = i32round(pos.h * p->k1); - new.v = i32round(((double) p->pdf_tj_pos.v.m - pos.v * p->k1) * p->k2); + new.h = i64round(pos.h * p->k1); + new.v = i64round(((double) p->pdf_tj_pos.v.m - pos.v * p->k1) * p->k2); p->tm[4].m = new.h - p->pdf_bt_pos.h.m; /* p->tm[5] is meaningless */ p->tj_delta.m = -i64round((double) ((new.v - p->cw.m) / ten_pow[p->cw.e - p->tj_delta.e])); if (p->tj_delta.m != 0 || new.h != p->pdf.h.m) diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w b/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w index e4897dfb04b..2f75b4c761e 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w @@ -54,7 +54,7 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size, int callback_id) dim.v.e = p->pdf.v.e; pdf_puts(pdf, "q\n"); if (size.v <= one_bp) { - pos.v += i32round(0.5 * size.v); + pos.v += i64round(0.5 * size.v); pdf_set_pos_temp(pdf, pos); pdf_puts(pdf, "[]0 d 0 J "); print_pdffloat(pdf, dim.v); @@ -62,7 +62,7 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size, int callback_id) print_pdffloat(pdf, dim.h); pdf_puts(pdf, " 0 l S\n"); } else if (size.h <= one_bp) { - pos.h += i32round(0.5 * size.h); + pos.h += i64round(0.5 * size.h); pdf_set_pos_temp(pdf, pos); pdf_puts(pdf, "[]0 d 0 J "); print_pdffloat(pdf, dim.h); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h b/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h index 8a670a5274f..71f843e00f3 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h +++ b/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h @@ -36,7 +36,14 @@ # define pdfkeyprefix "PTEX" # define i32round(a) (int) floor((a) + 0.5) -# define i64round(a) (int64_t) floor((a) + 0.5) +/*# define i64round(a) (int64_t) floor((a) + 0.5)*/ +/*# define i64round(a) (int64_t) ( (double)(a+0.5) - ((int64_t)(a+0.5))%1 ) */ +#ifdef _WIN32 +# define i64round(a) (int64_t) win32_floor((a) + 0.5) +#else +# define i64round(a) (int64_t) lround((a)) +#endif + # define MAX_OBJ_COMPRESS_LEVEL 3 /* maximum/clipping value for \pdfobjcompresslevel */ # define OBJSTM_UNSET -1 /* initial value */ @@ -81,9 +88,12 @@ typedef struct { # define scaled int typedef struct scaledpos_ { - scaled h; - scaled v; -} scaledpos; + int64_t h; + int64_t v; + } scaledpos; + + + typedef struct scaled_whd_ { scaled wd; /* TeX width */ diff --git a/Build/source/texk/web2c/luatexdir/tex/commands.h b/Build/source/texk/web2c/luatexdir/tex/commands.h index d2a7779a0e1..60bfef895d2 100644 --- a/Build/source/texk/web2c/luatexdir/tex/commands.h +++ b/Build/source/texk/web2c/luatexdir/tex/commands.h @@ -327,13 +327,10 @@ typedef enum { expand_font_code, } normal_codes; -# define explicit 1 -# define acc_kern 2 # define lp_code_base 2 # define rp_code_base 3 # define ef_code_base 4 # define tag_code 5 -# define auto_kern explicit # define no_lig_code 6 # define immediate_code 4 /* command modifier for \.{\\immediate} */ diff --git a/Build/source/texk/web2c/luatexdir/tex/commands.w b/Build/source/texk/web2c/luatexdir/tex/commands.w index 125b203a341..53497af528c 100644 --- a/Build/source/texk/web2c/luatexdir/tex/commands.w +++ b/Build/source/texk/web2c/luatexdir/tex/commands.w @@ -405,7 +405,7 @@ void initialize_commands(void) primitive_tex("vss", vskip_cmd, ss_code, 0); primitive_tex("vfilneg", vskip_cmd, fil_neg_code, 0); primitive_tex("mskip", mskip_cmd, mskip_code, 0); - primitive_tex("kern", kern_cmd, explicit, 0); + primitive_tex("kern", kern_cmd, explicit_kern, 0); primitive_tex("mkern", mkern_cmd, mu_glue, 0); primitive_tex("moveleft", hmove_cmd, 1, 0); primitive_tex("moveright", hmove_cmd, 0, 0); diff --git a/Build/source/texk/web2c/luatexdir/tex/linebreak.w b/Build/source/texk/web2c/luatexdir/tex/linebreak.w index 28ab6fa5586..b2909606d48 100644 --- a/Build/source/texk/web2c/luatexdir/tex/linebreak.w +++ b/Build/source/texk/web2c/luatexdir/tex/linebreak.w @@ -913,7 +913,7 @@ static void compute_break_width(int break_type, int line_break_dir, int adjust_s case penalty_node: break; case kern_node: - if (subtype(s) != explicit) + if (subtype(s) != explicit_kern && subtype(s) != italic_kern) return; else break_width[1] -= width(s); @@ -1866,7 +1866,8 @@ void ext_do_line_break(int paragraph_dir, if (prev_p != temp_head && ( is_char_node(prev_p) || precedes_break(prev_p) - || ((type(prev_p) == kern_node) && (subtype(prev_p) != explicit)) + || ((type(prev_p) == kern_node) && (subtype(prev_p) != explicit_kern && + subtype(prev_p) != italic_kern )) )) { ext_try_break(0, unhyphenated_node, line_break_dir, adjust_spacing, par_shape_ptr, adj_demerits, @@ -1889,7 +1890,7 @@ void ext_do_line_break(int paragraph_dir, /* end mathskip code */ break; case kern_node: - if (subtype(cur_p) == explicit) { + if (subtype(cur_p) == explicit_kern || subtype(cur_p) == italic_kern) { kern_break(); } else { active_width[1] += width(cur_p); diff --git a/Build/source/texk/web2c/luatexdir/tex/maincontrol.w b/Build/source/texk/web2c/luatexdir/tex/maincontrol.w index c6b30b09921..ff7e7279a07 100644 --- a/Build/source/texk/web2c/luatexdir/tex/maincontrol.w +++ b/Build/source/texk/web2c/luatexdir/tex/maincontrol.w @@ -25,13 +25,10 @@ /* these will move to equivalents.h */ @ @c -#define explicit 1 -#define acc_kern 2 #define lp_code_base 2 #define rp_code_base 3 #define ef_code_base 4 #define tag_code 5 -#define auto_kern explicit #define no_lig_code 6 #define gp_code_base 7 @@ -505,7 +502,7 @@ static void run_par_end_hmode (void) { @ @c static void append_italic_correction_mmode (void) { - tail_append(new_kern(0)); + tail_append(new_kern(0)); /* what subtype to use */ } @ @c @@ -1810,7 +1807,7 @@ void append_italic_correction(void) return; f = font(p); tail_append(new_kern(char_italic(f, character(p)))); - subtype(tail) = explicit; + subtype(tail) = italic_kern; } } @@ -2035,11 +2032,11 @@ void make_accent(void) } delta = round(float_cast(w - a) / float_constant(2) + h * t - x * s); /* real multiplication */ r = new_kern(delta); - subtype(r) = acc_kern; + subtype(r) = accent_kern; couple_nodes(tail, r); couple_nodes(r, p); tail = new_kern(-a - delta); - subtype(tail) = acc_kern; + subtype(tail) = accent_kern; couple_nodes(p, tail); p = q; diff --git a/Build/source/texk/web2c/luatexdir/tex/mlist.w b/Build/source/texk/web2c/luatexdir/tex/mlist.w index 035ef6340dd..fbded284414 100644 --- a/Build/source/texk/web2c/luatexdir/tex/mlist.w +++ b/Build/source/texk/web2c/luatexdir/tex/mlist.w @@ -1567,7 +1567,7 @@ static void math_kern(pointer p, scaled m) f = f + unity; } width(p) = mu_mult(width(p)); - subtype(p) = explicit; + subtype(p) = italic_kern; } } diff --git a/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w b/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w index 873eaf96856..b78b599aac6 100644 --- a/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w +++ b/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w @@ -174,7 +174,7 @@ void ext_post_line_break(int paragraph_dir, break; } else if (non_discardable(q)) { break; - } else if (type(q) == kern_node && subtype(q) != explicit) { + } else if (type(q) == kern_node && subtype(q) != explicit_kern && subtype(q) != italic_kern) { break; } q = vlink(q); @@ -559,7 +559,7 @@ void ext_post_line_break(int paragraph_dir, if (q == cur_break(cur_p) || is_char_node(q)) break; if (!((type(q) == local_par_node))) { - if (non_discardable(q) || (type(q) == kern_node && subtype(q) != explicit)) + if (non_discardable(q) || (type(q) == kern_node && subtype(q) != explicit_kern && subtype(q) != italic_kern)) break; } */ @@ -581,7 +581,7 @@ void ext_post_line_break(int paragraph_dir, /* weird, in the middle somewhere */ } else if (non_discardable(q)) { break; - } else if (type(q) == kern_node && subtype(q) != explicit) { + } else if (type(q) == kern_node && subtype(q) != explicit_kern && subtype(q) != italic_kern) { break; } r = q; diff --git a/Build/source/texk/web2c/luatexdir/tex/printing.w b/Build/source/texk/web2c/luatexdir/tex/printing.w index baafa24a8af..478d55f88ba 100644 --- a/Build/source/texk/web2c/luatexdir/tex/printing.w +++ b/Build/source/texk/web2c/luatexdir/tex/printing.w @@ -987,11 +987,13 @@ void short_display_n(int p, int m) print(character(p)); } } else { - if ((type(p) == glue_node) || - (type(p) == disc_node) || - (type(p) == penalty_node) || - ((type(p) == kern_node) && (subtype(p) == explicit))) + if ( (type(p) == glue_node) || + (type(p) == disc_node) || + (type(p) == penalty_node) || + ((type(p) == kern_node) && (subtype(p) == explicit_kern || + subtype(p) == italic_kern ))) { incr(i); + } if (i >= m) return; if (type(p) == disc_node) { diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.h b/Build/source/texk/web2c/luatexdir/tex/texnodes.h index 618902b58fd..d5198b92f03 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texnodes.h +++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.h @@ -177,9 +177,14 @@ typedef enum { # define tlink_post_break(a) tlink(post_break_head(a)) # define tlink_no_break(a) tlink(no_break_head(a)) +typedef enum { + font_kern = 0, + explicit_kern, /* |subtype| of kern nodes from \.{\\kern} and \.{\\/} */ + accent_kern, /* |subtype| of kern nodes from accents */ + italic_kern, +} kern_subtypes; + # define kern_node_size 5 -# define explicit 1 /* |subtype| of kern nodes from \.{\\kern} and \.{\\/} */ -# define acc_kern 2 /* |subtype| of kern nodes from accents */ # define ex_kern(a) vinfo((a)+3) /* expansion factor (hz) */ # define synctex_tag_kern(a) vinfo((a)+4) # define synctex_line_kern(a) vlink((a)+4) diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.w b/Build/source/texk/web2c/luatexdir/tex/texnodes.w index 0e0c92676e9..de718139923 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texnodes.w +++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.w @@ -280,7 +280,7 @@ const char *node_subtypes_penalty[] = { "userpenalty", NULL }; const char *node_subtypes_kern[] = { - "fontkern", "userkern", "accentkern", NULL + "fontkern", "userkern", "accentkern", "italiccorrection", NULL }; const char *node_subtypes_rule[] = { "normal", "box", "image", "empty", "user", NULL @@ -3092,7 +3092,7 @@ void show_node_list(int p) if (subtype(p) != normal) print_char(' '); print_scaled(width(p)); - if (subtype(p) == acc_kern) + if (subtype(p) == accent_kern) tprint(" (for accent)"); } else { tprint_esc("mkern"); diff --git a/Build/source/texk/web2c/luatexdir/tex/textoken.w b/Build/source/texk/web2c/luatexdir/tex/textoken.w index 4b14b6ec9fe..5b10b1cdd2d 100644 --- a/Build/source/texk/web2c/luatexdir/tex/textoken.w +++ b/Build/source/texk/web2c/luatexdir/tex/textoken.w @@ -238,6 +238,10 @@ including the expansion of a macro or mark. @c void print_meaning(void) { + if (cur_cmd == math_char_num_cmd && cur_chr == 0) { + /* \mathchar -> \Umathchar */ + cur_chr = 1 ; + } print_cmd_chr((quarterword) cur_cmd, cur_chr); if (cur_cmd >= call_cmd) { print_char(':'); @@ -249,21 +253,21 @@ void print_meaning(void) print_char(':'); print_ln(); switch (cur_chr) { - case first_mark_code: - token_show(first_mark(0)); - break; - case bot_mark_code: - token_show(bot_mark(0)); - break; - case split_first_mark_code: - token_show(split_first_mark(0)); - break; - case split_bot_mark_code: - token_show(split_bot_mark(0)); - break; - default: - token_show(top_mark(0)); - break; + case first_mark_code: + token_show(first_mark(0)); + break; + case bot_mark_code: + token_show(bot_mark(0)); + break; + case split_first_mark_code: + token_show(split_first_mark(0)); + break; + case split_bot_mark_code: + token_show(split_bot_mark(0)); + break; + default: + token_show(top_mark(0)); + break; } } } |