summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2014-11-03 13:35:39 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2014-11-03 13:35:39 +0000
commit069de63df0794b833f5953c262c1f813e7a1b920 (patch)
tree62e249099b9984f04e07c302598c3ea128b54995
parenteb8e65b9fe94f8a1f0bb616af32591eb9c79c30e (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
-rw-r--r--Build/source/texk/dvipdfm-x/ChangeLog9
-rw-r--r--Build/source/texk/dvipdfm-x/pdfdev.c41
-rw-r--r--Build/source/texk/dvipdfm-x/pdfparse.c44
-rw-r--r--Build/source/texk/dvipdfm-x/pkfont.c64
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 */