diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2014-11-03 13:35:39 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2014-11-03 13:35:39 +0000 |
commit | 069de63df0794b833f5953c262c1f813e7a1b920 (patch) | |
tree | 62e249099b9984f04e07c302598c3ea128b54995 /Build/source | |
parent | eb8e65b9fe94f8a1f0bb616af32591eb9c79c30e (diff) |
texk/dvipdfm-x: Further fixes for PK font support (from S. Hirata)
git-svn-id: svn://tug.org/texlive/trunk@35496 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
-rw-r--r-- | Build/source/texk/dvipdfm-x/ChangeLog | 9 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfdev.c | 41 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfparse.c | 44 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pkfont.c | 64 |
4 files changed, 52 insertions, 106 deletions
diff --git a/Build/source/texk/dvipdfm-x/ChangeLog b/Build/source/texk/dvipdfm-x/ChangeLog index b9ac1ec2e5e..4e096aaa6b6 100644 --- a/Build/source/texk/dvipdfm-x/ChangeLog +++ b/Build/source/texk/dvipdfm-x/ChangeLog @@ -1,3 +1,12 @@ +2014-11-03 Shunsaku Hirata <shunsaku.hirata74@gmail.com> + + * pdfdev.c: Do not convert integer part of real numbers to long int + when printing a real number. + * pdfparse.c: Do not use temporary integer values for storing + parsed numbers. + * pkfont.c: Remove debugging codes, additional fixes in formatting + integer values. + 2014-10-29 Shunsaku Hirata <shunsaku.hirata74@gmail.com> * pkfont.c: Cast unsigned integers when they appear in subtractions diff --git a/Build/source/texk/dvipdfm-x/pdfdev.c b/Build/source/texk/dvipdfm-x/pdfdev.c index ec7605a6ab4..86f0d6ebf84 100644 --- a/Build/source/texk/dvipdfm-x/pdfdev.c +++ b/Build/source/texk/dvipdfm-x/pdfdev.c @@ -140,51 +140,56 @@ p_itoa (long value, char *buf) return (sign ? ndigits + 1 : ndigits); } -/* ... */ +/* NOTE: Acrobat 5 and prior uses 16.16 fixed point representation for + * real numbers. + */ static int p_dtoa (double value, int prec, char *buf) { const long p[10] = { 1, 10, 100, 1000, 10000, - 100000, 1000000, 10000000, 100000000, 1000000000 }; - long i, f; - char *c = buf; - int n; + 100000, 1000000, 10000000, + 100000000, 1000000000 }; + double i, f; + long g; + char *c = buf; + int n; if (value < 0) { value = -value; *c++ = '-'; n = 1; - } else + } else { n = 0; + } - i = (long) value; - f = (long) ((value-i)*p[prec] + 0.5); + f = modf(value, &i); + g = (long) (f * p[prec] + 0.5); - if (f == p[prec]) { - f = 0; - i++; + if (g == p[prec]) { + g = 0; + i += 1; } if (i) { - int m = p_itoa(i, c); + int m = sprintf(c, "%.0f", i); c += m; n += m; - } else if (!f) { + } else if (g == 0) { *(c = buf) = '0'; n = 1; } - if (f) { + if (g) { int j = prec; *c++ = '.'; while (j--) { - c[j] = (f % 10) + '0'; - f /= 10; + c[j] = (g % 10) + '0'; + g /= 10; } - c += prec-1; - n += 1+prec; + c += prec - 1; + n += 1 + prec; while (*c == '0') { c--; diff --git a/Build/source/texk/dvipdfm-x/pdfparse.c b/Build/source/texk/dvipdfm-x/pdfparse.c index 860ea1c0abc..ab874ff11f0 100644 --- a/Build/source/texk/dvipdfm-x/pdfparse.c +++ b/Build/source/texk/dvipdfm-x/pdfparse.c @@ -26,6 +26,8 @@ #include <ctype.h> #include <string.h> +/* pow() */ +#include <math.h> #include "system.h" #include "mem.h" @@ -227,32 +229,18 @@ parse_opt_ident (const char **start, const char *end) return NULL; } -#define DDIGITS_MAX 10 pdf_obj * parse_pdf_number (const char **pp, const char *endptr) { const char *p; - unsigned long ipart = 0, dpart = 0; - int nddigits = 0, sign = 1; - int has_dot = 0; - static double ipot[DDIGITS_MAX+1] = { - 1.0, - 0.1, - 0.01, - 0.001, - 0.0001, - 0.00001, - 0.000001, - 0.0000001, - 0.00000001, - 0.000000001, - 0.0000000001 - }; + double v = 0.0; + int nddigits = 0, sign = 1; + int has_dot = 0; p = *pp; skip_white(&p, endptr); if (p >= endptr || - (!isdigit((unsigned char)p[0]) && p[0] != '.' && + (!isdigit(p[0]) && p[0] != '.' && p[0] != '+' && p[0] != '-')) { WARN("Could not find a numeric object."); return NULL; @@ -277,21 +265,17 @@ parse_pdf_number (const char **pp, const char *endptr) while (p < endptr && !istokensep(p[0])) { if (p[0] == '.') { if (has_dot) { /* Two dots */ - WARN("Could not find a numeric object."); - return NULL; + WARN("Could not find a numeric object."); + return NULL; } else { - has_dot = 1; + has_dot = 1; } - } else if (isdigit((unsigned char)p[0])) { + } else if (isdigit(p[0])) { if (has_dot) { - if (nddigits == DDIGITS_MAX && pdf_obj_get_verbose() > 1) { - WARN("Number with more than %d fractional digits.", DDIGITS_MAX); - } else if (nddigits < DDIGITS_MAX) { - dpart = dpart * 10 + p[0] - '0'; - nddigits++; - } /* Ignore decimal digits more than DDIGITS_MAX */ + v += (p[0] - '0') / pow(10, nddigits + 1); + nddigits++; } else { - ipart = ipart * 10 + p[0] - '0'; + v = v * 10.0 + p[0] - '0'; } } else { WARN("Could not find a numeric object."); @@ -301,7 +285,7 @@ parse_pdf_number (const char **pp, const char *endptr) } *pp = p; - return pdf_new_number((double) sign * (((double ) ipart) + dpart * ipot[nddigits])); + return pdf_new_number(sign * v); } /* diff --git a/Build/source/texk/dvipdfm-x/pkfont.c b/Build/source/texk/dvipdfm-x/pkfont.c index 2650ef438a0..571be6f22c0 100644 --- a/Build/source/texk/dvipdfm-x/pkfont.c +++ b/Build/source/texk/dvipdfm-x/pkfont.c @@ -211,35 +211,10 @@ pk_packed_num (uint32_t *np, int dyn_f, unsigned char *dp, uint32_t pl) } -#if DEBUG == 2 -static void -send_out (unsigned char *rowptr, uint32_t rowbytes, uint32_t wd, pdf_obj *stream) -#else static void send_out (unsigned char *rowptr, uint32_t rowbytes, pdf_obj *stream) -#endif { pdf_add_stream(stream, (void *)rowptr, rowbytes); -#if DEBUG == 2 - { - uint32_t i, n, len = (wd + 7) / 8; - int c; - fputc('|', stderr); - for (n = 0; n < len; n++) { - c = rowptr[n]; - for (i = 0; i < 8; i++) { - if (n * 8 + i == wd) - break; - if (c & 1 << (7 - i)) - fputc(' ', stderr); - else - fputc('*', stderr); - } - } - fputc('|', stderr); - fputc('\n', stderr); - } -#endif /* DEBUG2 */ } static int @@ -258,9 +233,6 @@ pk_decode_packed (pdf_obj *stream, uint32_t wd, uint32_t ht, * If there are non-zero repeat count and if run * spans across row, first repeat and then continue. */ -#ifdef DEBUG - MESG("\npkfont>> wd: %ld, ht: %ld, dyn_f: %d\n", wd, ht, dyn_f); -#endif for (np = 0, i = 0; i < ht; i++) { uint32_t rowbits_left, nbits; @@ -286,31 +258,19 @@ pk_decode_packed (pdf_obj *stream, uint32_t wd, uint32_t ht, int nyb; nyb = (np % 2) ? dp[np/2] & 0x0f : (dp[np/2] >> 4) & 0x0f; -#if DEBUG == 3 - MESG("\npk_nyb: %d", nyb); -#endif if (nyb == 14) { /* packed number "repeat_count" follows */ if (repeat_count != 0) WARN("Second repeat count for this row!"); np++; /* Consume this nybble */ repeat_count = pk_packed_num(&np, dyn_f, dp, pl); -#if DEBUG == 3 - MESG(" --> rep: %ld\n", repeat_count); -#endif } else if (nyb == 15) { if (repeat_count != 0) WARN("Second repeat count for this row!"); np++; /* Consume this nybble */ repeat_count = 1; -#if DEBUG == 3 - MESG(" --> rep: %ld\n", repeat_count); -#endif } else { /* run_count */ /* Interprete current nybble as packed number */ run_count = pk_packed_num(&np, dyn_f, dp, pl); -#if DEBUG == 3 - MESG(" --> run: %ld (%d)\n", run_count, run_color); -#endif nbits = MIN(rowbits_left, run_count); run_color = !run_color; run_count -= nbits; @@ -325,18 +285,10 @@ pk_decode_packed (pdf_obj *stream, uint32_t wd, uint32_t ht, } } /* We got bitmap row data. */ -#if DEBUG == 2 - send_out(rowptr, rowbytes, wd, stream); -#else send_out(rowptr, rowbytes, stream); -#endif for ( ; i < ht && repeat_count > 0; repeat_count--, i++) -#if DEBUG == 2 - send_out(rowptr, rowbytes, wd, stream); -#else - send_out(rowptr, rowbytes, stream); -#endif - } + send_out(rowptr, rowbytes, stream); + } RELEASE(rowptr); return 0; @@ -371,11 +323,7 @@ pk_decode_bitmap (pdf_obj *stream, uint32_t wd, uint32_t ht, rowptr[j / 8] |= mask[i % 8]; /* flip bit */ j++; if (j == wd) { -#if DEBUG == 2 - send_out(rowptr, rowbytes, wd, stream); -#else send_out(rowptr, rowbytes, stream); -#endif memset(rowptr, 0, rowbytes); j = 0; } @@ -470,7 +418,7 @@ create_pk_CharProc_stream (struct pk_header_ *pkh, unsigned char *pkt_ptr, uint32_t pkt_len) { pdf_obj *stream; /* charproc */ - int llx, lly, urx, ury; + int32_t llx, lly, urx, ury; int len; llx = -pkh->bm_hoff; @@ -489,7 +437,7 @@ create_pk_CharProc_stream (struct pk_header_ *pkh, * consistent with write_number() in pdfobj.c. */ len = pdf_sprint_number(work_buffer, chrwid); - len += sprintf (work_buffer + len, " 0 %d %d %d %d d1\n", llx, lly, urx, ury); + len += sprintf (work_buffer + len, " 0 %ld %ld %ld %ld d1\n", llx, lly, urx, ury); pdf_add_stream(stream, work_buffer, len); /* * Acrobat dislike transformation [0 0 0 0 dx dy]. @@ -502,9 +450,9 @@ create_pk_CharProc_stream (struct pk_header_ *pkh, */ if (pkh->bm_wd != 0 && pkh->bm_ht != 0 && pkt_len > 0) { /* Scale and translate origin to lower left corner for raster data */ - len = sprintf (work_buffer, "q\n%d 0 0 %d %d %d cm\n", pkh->bm_wd, pkh->bm_ht, llx, lly); + len = sprintf (work_buffer, "q\n%lu 0 0 %lu %ld %ld cm\n", pkh->bm_wd, pkh->bm_ht, llx, lly); pdf_add_stream(stream, work_buffer, len); - len = sprintf (work_buffer, "BI\n/W %d\n/H %d\n/IM true\n/BPC 1\nID ", pkh->bm_wd, pkh->bm_ht); + len = sprintf (work_buffer, "BI\n/W %lu\n/H %lu\n/IM true\n/BPC 1\nID ", pkh->bm_wd, pkh->bm_ht); pdf_add_stream(stream, work_buffer, len); /* Add bitmap data */ if (pkh->dyn_f == 14) /* bitmap */ |