From d85a200b2ae326d547e192c61d1647bf9b5ebffb Mon Sep 17 00:00:00 2001 From: Peter Breitenlohner Date: Sat, 7 Dec 2013 14:22:56 +0000 Subject: luatex: Fix a serious bug related to large numbers in pdfimages (from Akira) git-svn-id: svn://tug.org/texlive/trunk@32353 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/web2c/luatexdir/ChangeLog | 12 ++++++++++++ Build/source/texk/web2c/luatexdir/font/writet3.w | 4 ++-- Build/source/texk/web2c/luatexdir/image/pdftoepdf.w | 2 +- Build/source/texk/web2c/luatexdir/image/writejp2.w | 2 +- Build/source/texk/web2c/luatexdir/pdf/pdfgen.w | 12 ++++++------ Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w | 14 +++++++------- Build/source/texk/web2c/luatexdir/pdf/pdfimage.w | 8 ++++---- Build/source/texk/web2c/luatexdir/pdf/pdfpage.w | 20 ++++++++++---------- Build/source/texk/web2c/luatexdir/pdf/pdfrule.w | 8 ++++---- Build/source/texk/web2c/luatexdir/pdf/pdftypes.h | 5 +++-- 10 files changed, 50 insertions(+), 37 deletions(-) (limited to 'Build') diff --git a/Build/source/texk/web2c/luatexdir/ChangeLog b/Build/source/texk/web2c/luatexdir/ChangeLog index 9c8650272dd..f133fd52e00 100644 --- a/Build/source/texk/web2c/luatexdir/ChangeLog +++ b/Build/source/texk/web2c/luatexdir/ChangeLog @@ -1,3 +1,15 @@ +2013-12-07 Peter Breitenlohner + + Fix a serious bug related to large numbers in pdfimages. + Mail from Akira Kakuto , 6 Dec 2013. + * pdf/pdftypes.h: Change pdffloat.m from long to int64_t. + Define i32round(a) and i64round(a) instead of lround(a). + * font/writet3.w: Cast arg2 of setpdffloat to int64_t. + * image/writejp2.w: Use uint64_t instead of unsigned long long. + * image/pdftoepdf.w, pdf/pdfgen.w, pdf/pdfglyph.w, + pdf/pdfimage.w, pdf/pdfpage.w, pdf/pdfrule.w: Replace lround(a) + by i32round(a) or i64round(a). + 2013-09-20 Karl Berry * lua/luainit.w (lua_initialize) [NATIVE_TEXLIVE_BUILD]: omit date. diff --git a/Build/source/texk/web2c/luatexdir/font/writet3.w b/Build/source/texk/web2c/luatexdir/font/writet3.w index 990fcf4b2b1..4067205b28f 100644 --- a/Build/source/texk/web2c/luatexdir/font/writet3.w +++ b/Build/source/texk/web2c/luatexdir/font/writet3.w @@ -194,7 +194,7 @@ static boolean writepk(PDF pdf, internal_font_number f) pdf_dict_add_streaminfo(pdf); pdf_end_dict(pdf); pdf_begin_stream(pdf); - setpdffloat(pf, (int) t3_char_widths[cd.charcode], 2); + setpdffloat(pf, (int64_t) t3_char_widths[cd.charcode], 2); print_pdffloat(pdf, pf); pdf_printf(pdf, " 0 %i %i %i %i d1\n", (int) llx, (int) lly, (int) urx, (int) ury); @@ -324,7 +324,7 @@ void writet3(PDF pdf, internal_font_number f) pdf_begin_array(pdf); if (is_pk_font) for (i = first_char; i <= last_char; i++) { - setpdffloat(pf, (int) t3_char_widths[i], 2); + setpdffloat(pf, (int64_t) t3_char_widths[i], 2); print_pdffloat(pdf, pf); pdf_out(pdf, ' '); } else diff --git a/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w b/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w index 9c2e4b9f868..4b4b73073e2 100644 --- a/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w +++ b/Build/source/texk/web2c/luatexdir/image/pdftoepdf.w @@ -279,7 +279,7 @@ static pdffloat conv_double_to_pdffloat(double n) { pdffloat a; a.e = 6; - a.m = lround(n * ten_pow[a.e]); + a.m = i64round(n * ten_pow[a.e]); return a; } diff --git a/Build/source/texk/web2c/luatexdir/image/writejp2.w b/Build/source/texk/web2c/luatexdir/image/writejp2.w index 47424d1c416..6228c1c52d4 100644 --- a/Build/source/texk/web2c/luatexdir/image/writejp2.w +++ b/Build/source/texk/web2c/luatexdir/image/writejp2.w @@ -54,7 +54,7 @@ typedef struct { unsigned int tbox; } hdr_struct; -static unsigned long long read8bytes(FILE * f) +static uint64_t read8bytes(FILE * f) { uint64_t l = read4bytes(f); l = (l << 32) + read4bytes(f); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w index 490d2f96d12..21864e158b0 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w @@ -581,8 +581,8 @@ void pdf_print_int(PDF pdf, longinteger n) void print_pdffloat(PDF pdf, pdffloat f) { char a[24]; - int e = f.e, i, j; - long l, m = f.m; + int e = f.e, i, j, l; + int64_t m = f.m; if (m < 0) { pdf_out(pdf, '-'); m *= -1; @@ -592,7 +592,7 @@ void print_pdffloat(PDF pdf, pdffloat f) l = m % ten_pow[e]; if (l != 0) { pdf_out(pdf, '.'); - j = snprintf(a, 23, "%ld", l + ten_pow[e]); + j = snprintf(a, 23, "%d", l + ten_pow[e]); assert(j < 23); for (i = e; i > 0; i--) { if (a[i] != '0') @@ -791,7 +791,7 @@ void pdf_add_bp(PDF pdf, scaled s) pdffloat a; pdfstructure *p = pdf->pstruct; assert(p != NULL); - a.m = lround(s * p->k1); + a.m = i64round(s * p->k1); a.e = pdf->decimal_digits; if (pdf->cave > 0) pdf_out(pdf, ' '); @@ -805,9 +805,9 @@ void pdf_add_mag_bp(PDF pdf, scaled s) pdfstructure *p = pdf->pstruct; prepare_mag(); if (int_par(mag_code) != 1000) - a.m = lround(s * (double) int_par(mag_code) / 1000.0 * p->k1); + a.m = i64round(s * (double) int_par(mag_code) / 1000.0 * p->k1); else - a.m = lround(s * p->k1); + a.m = i64round(s * p->k1); a.e = pdf->decimal_digits; if (pdf->cave > 0) pdf_out(pdf, ' '); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w b/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w index 28544b35e76..f1b92379154 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w @@ -33,11 +33,11 @@ static const char _svn_version[] = #define e_tj 3 /* must be 3; movements in []TJ are in fontsize/$10^3$ units */ @ @c -static long pdf_char_width(pdfstructure * p, internal_font_number f, int i) +static int64_t pdf_char_width(pdfstructure * p, internal_font_number f, int i) { /* use exactly this formula also for calculating the /Width array values */ return - lround((double) char_width(f, i) / font_size(f) * + i64round((double) char_width(f, i) / font_size(f) * ten_pow[e_tj + p->cw.e]); } @@ -65,7 +65,7 @@ static void setup_fontparameters(PDF pdf, internal_font_number f) u = font_units_per_em(f) / 1000.0; pdf->f_cur = f; p->f_pdf = pdf_set_font(pdf, f); - p->fs.m = lround(font_size(f) / u / one_bp * ten_pow[p->fs.e]); + p->fs.m = i64round(font_size(f) / u / one_bp * ten_pow[p->fs.e]); slant = font_slant(f) / 1000.0; extend = font_extend(f) / 1000.0; expand = 1.0 + font_expand_ratio(f) / 1000.0; @@ -75,9 +75,9 @@ static void setup_fontparameters(PDF pdf, internal_font_number f) && (double) font_size(f) / ten_pow[p->tj_delta.e + e_tj] < 0.5) p->tj_delta.e--; /* happens for very tiny fonts */ assert(p->cw.e >= p->tj_delta.e); /* else we would need, e. g., |ten_pow[-1]| */ - p->tm[0].m = lround(scale * expand * extend * ten_pow[p->tm[0].e]); - p->tm[2].m = lround(slant * ten_pow[p->tm[2].e]); - p->tm[3].m = lround(scale * ten_pow[p->tm[3].e]); + p->tm[0].m = i64round(scale * expand * extend * ten_pow[p->tm[0].e]); + p->tm[2].m = i64round(slant * ten_pow[p->tm[2].e]); + p->tm[3].m = i64round(scale * ten_pow[p->tm[3].e]); p->k2 = ten_pow[e_tj + p->cw.e] * scale / (ten_pow[p->pdf.h.e] * pdf2double(p->fs) * @@ -222,7 +222,7 @@ void pdf_place_glyph(PDF pdf, internal_font_number f, int c) && (p->pdf_bt_pos.v.m + p->tm[5].m) != p->pdf.v.m) || (p->wmode == WMODE_V && (p->pdf_bt_pos.h.m + p->tm[4].m) != p->pdf.h.m) - || abs(p->tj_delta.m) >= 1000000) { + || p->tj_delta.m >= 1000000 || p->tj_delta.m <= -1000000) { pdf_goto_textmode(pdf); set_textmatrix(pdf, pos); begin_chararray(pdf); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfimage.w b/Build/source/texk/web2c/luatexdir/pdf/pdfimage.w index e787d9674b4..9103cdd1126 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfimage.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfimage.w @@ -118,10 +118,10 @@ void place_img(PDF pdf, image_dict * idict, scaled_whd dim, int transform) default:; } /* the following is a kludge, TODO: use pdfpage.c functions */ - setpdffloat(cm[0], round(a[0]), r); - setpdffloat(cm[1], round(a[1]), r); - setpdffloat(cm[2], round(a[2]), r); - setpdffloat(cm[3], round(a[3]), r); + setpdffloat(cm[0], i64round(a[0]), r); + setpdffloat(cm[1], i64round(a[1]), r); + setpdffloat(cm[2], i64round(a[2]), r); + setpdffloat(cm[3], i64round(a[3]), r); tmppos.h = round(a[4]); tmppos.v = round(a[5]); pdf_goto_pagemode(pdf); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfpage.w b/Build/source/texk/web2c/luatexdir/pdf/pdfpage.w index dbbf8ec667c..1eab44418fe 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 = lround(pos.h * p->k1); - new.v = lround(pos.v * p->k1); + new.h = i32round(pos.h * p->k1); + new.v = i32round(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 = lround(pos.h * p->k1); - new.v = lround(pos.v * p->k1); + new.h = i32round(pos.h * p->k1); + new.v = i32round(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) @@ -125,9 +125,9 @@ boolean calc_pdfpos(pdfstructure * p, scaledpos pos) switch (p->wmode) { case WMODE_H: new.h = - lround((pos.h * p->k1 - (double) p->pdf_tj_pos.h.m) * p->k2); - new.v = lround(pos.v * p->k1); - p->tj_delta.m = -lround((double) + i32round((pos.h * p->k1 - (double) p->pdf_tj_pos.h.m) * p->k2); + new.v = i32round(pos.v * p->k1); + p->tj_delta.m = -i32round((double) ((new.h - p->cw.m) / ten_pow[p->cw.e - p->tj_delta. e])); @@ -136,11 +136,11 @@ boolean calc_pdfpos(pdfstructure * p, scaledpos pos) move_pdfpos = true; break; case WMODE_V: - new.h = lround(pos.h * p->k1); + new.h = i32round(pos.h * p->k1); new.v = - lround(((double) p->pdf_tj_pos.v.m - pos.v * p->k1) * p->k2); + i32round(((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 = -lround((double) + p->tj_delta.m = -i32round((double) ((new.v - p->cw.m) / ten_pow[p->cw.e - p->tj_delta. e])); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w b/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w index c720ab2e59d..a73aa57484f 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfrule.w @@ -33,13 +33,13 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size) scaledpos pos = pdf->posstruct->pos; (void) q; pdf_goto_pagemode(pdf); - dim.h.m = lround(size.h * p->k1); + dim.h.m = i64round(size.h * p->k1); dim.h.e = p->pdf.h.e; - dim.v.m = lround(size.v * p->k1); + dim.v.m = i64round(size.v * p->k1); dim.v.e = p->pdf.v.e; pdf_puts(pdf, "q\n"); if (size.v <= one_bp) { - pos.v += (int) lround(0.5 * size.v); + pos.v += i32round(0.5 * size.v); pdf_set_pos_temp(pdf, pos); pdf_puts(pdf, "[]0 d 0 J "); print_pdffloat(pdf, dim.v); @@ -47,7 +47,7 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size) print_pdffloat(pdf, dim.h); pdf_puts(pdf, " 0 l S\n"); } else if (size.h <= one_bp) { - pos.h += (int) lround(0.5 * size.h); + pos.h += i32round(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 981764010fd..d1ae3ee532c 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h +++ b/Build/source/texk/web2c/luatexdir/pdf/pdftypes.h @@ -33,7 +33,8 @@ # define pdfkeyprefix "PTEX" -# define lround(a) (long) floor((a) + 0.5) +# define i32round(a) (int) floor((a) + 0.5) +# define i64round(a) (int64_t) floor((a) + 0.5) # define MAX_OBJ_COMPRESS_LEVEL 3 /* maximum/clipping value for \pdfobjcompresslevel */ # define OBJSTM_UNSET -1 /* initial value */ @@ -66,7 +67,7 @@ the types explicitly defined in this header, and stay away from types like */ typedef struct { - long m; /* mantissa (significand) */ + int64_t m; /* mantissa (significand) */ int e; /* exponent * -1 */ } pdffloat; -- cgit v1.2.3