325 lines
9.8 KiB
Diff
325 lines
9.8 KiB
Diff
From f116dfdff70c6a289a86e93f6b2fe64a54198534 Mon Sep 17 00:00:00 2001
|
||
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
|
||
Date: Sat, 14 Dec 2019 23:10:04 +0100
|
||
Subject: [PATCH 5/8] Correctly scan embedded pdfs for /MediaBox value
|
||
|
||
This applies two patches from the opensuse source rpm,
|
||
https://download.opensuse.org/repositories/openSUSE:/Factory/standard/src/xfig-3.2.7b-1.1.src.rpm
|
||
transfig.3.2.5-binderman.dif and transfig.3.2.5d-mediaboxrealnb.dif.
|
||
---
|
||
CHANGES | 1 +
|
||
fig2dev/dev/readeps.c | 31 ++++++++------
|
||
fig2dev/tests/Makefile.am | 15 ++++---
|
||
fig2dev/tests/bitmaps.at | 5 +++
|
||
fig2dev/tests/data/cross.pdf | 62 +++++++++++++++++++++++++++
|
||
fig2dev/tests/test2.c | 82 ++++++++++++++++++++++++++++++++++++
|
||
transfig/sys.c | 3 ++
|
||
7 files changed, 182 insertions(+), 17 deletions(-)
|
||
create mode 100644 fig2dev/tests/data/cross.pdf
|
||
create mode 100644 fig2dev/tests/test2.c
|
||
|
||
diff --git a/CHANGES b/CHANGES
|
||
index b2f7006..4a414fa 100644
|
||
--- a/CHANGES
|
||
+++ b/CHANGES
|
||
@@ -6,6 +6,7 @@ Patchlevel Xx (Xxx 20xx)
|
||
|
||
BUGS FIXED:
|
||
Ticket numbers refer to https://sourceforge.net/p/mcj/tickets/#.
|
||
+ o Correctly scan embedded pdfs for /MediaBox value.
|
||
o Convert polygons having too few points to polylines. Ticket #56.
|
||
o Reject huge arrow types causing integer overflow. Ticket #57.
|
||
o Allow Fig v2 text strings ending with multiple ^A. Ticket #55.
|
||
diff --git a/fig2dev/dev/readeps.c b/fig2dev/dev/readeps.c
|
||
index ec25504..502f4bb 100644
|
||
--- a/fig2dev/dev/readeps.c
|
||
+++ b/fig2dev/dev/readeps.c
|
||
@@ -1,7 +1,9 @@
|
||
/*
|
||
* Fig2dev: Translate Fig code to various Devices
|
||
- * Parts Copyright (c) 1989-2007 by Brian V. Smith
|
||
- * Parts Copyright (c) 2015-2017 by Thomas Loimer
|
||
+ * Copyright (c) 1991 by Micah Beck
|
||
+ * Parts Copyright (c) 1985-1988 by Supoj Sutanthavibul
|
||
+ * Parts Copyright (c) 1989-2015 by Brian V. Smith
|
||
+ * Parts Copyright (c) 2015-2019 by Thomas Loimer
|
||
*
|
||
* Any party obtaining a copy of these files is granted, free of charge, a
|
||
* full and unrestricted irrevocable, world-wide, paid up, royalty-free,
|
||
@@ -83,18 +85,23 @@ read_eps_pdf(FILE *file, int filetype, F_pic *pic, int *llx, int* lly,
|
||
while (fgets(buf, BUFSIZ, file) != NULL) {
|
||
/* look for /MediaBox for pdf file */
|
||
if (pdf_flag) {
|
||
- if (!strncmp(buf, "/MediaBox", 9)) { /* look for the MediaBox spec */
|
||
- c = strchr(buf, '[') + 1;
|
||
- if (c && sscanf(c, "%d %d %d %d", llx, lly, &urx, &ury) < 4)
|
||
- {
|
||
- *llx = *lly = 0;
|
||
- urx = paperdef[0].width*72;
|
||
- ury = paperdef[0].height*72;
|
||
- put_msg("Bad MediaBox in imported PDF file %s, assuming %s size",
|
||
- pic->file, metric? "A4" : "Letter" );
|
||
+ for (c = buf; (c = strchr(c,'/')); ++c) {
|
||
+ if (!strncmp(c, "/MediaBox", 9)) {
|
||
+ c = strchr(c, '[');
|
||
+ if (c && sscanf(c + 1, "%d %d %d %d",
|
||
+ llx, lly, &urx, &ury) < 4) {
|
||
+ *llx = *lly = 0;
|
||
+ urx = paperdef[0].width*72;
|
||
+ ury = paperdef[0].height*72;
|
||
+ put_msg("Bad MediaBox in imported PDF file %s, assuming %s size",
|
||
+ pic->file, metric? "A4" : "Letter" );
|
||
+ }
|
||
+ pic->bit_size.x = urx - (*llx);
|
||
+ pic->bit_size.y = ury - (*lly);
|
||
+ break;
|
||
}
|
||
}
|
||
- /* look for bounding box for EPS file */
|
||
+ /* look for bounding box for EPS file */
|
||
} else if (!nested && !strncmp(buf, "%%BoundingBox:", 14)) {
|
||
c = buf + 14;
|
||
/* skip past white space */
|
||
diff --git a/fig2dev/tests/Makefile.am b/fig2dev/tests/Makefile.am
|
||
index 4b83e0b..389f984 100644
|
||
--- a/fig2dev/tests/Makefile.am
|
||
+++ b/fig2dev/tests/Makefile.am
|
||
@@ -4,7 +4,7 @@
|
||
# Copyright (c) 1991 by Micah Beck
|
||
# Parts Copyright (c) 1985-1988 by Supoj Sutanthavibul
|
||
# Parts Copyright (c) 1989-2015 by Brian V. Smith
|
||
-# Parts Copyright (c) 2015-2018 by Thomas Loimer
|
||
+# Parts Copyright (c) 2015-2019 by Thomas Loimer
|
||
#
|
||
# Any party obtaining a copy of these files is granted, free of charge, a
|
||
# full and unrestricted irrevocable, world-wide, paid up, royalty-free,
|
||
@@ -16,7 +16,7 @@
|
||
# and this permission notice remain intact.
|
||
|
||
# fig2dev/tests/Makefile.am
|
||
-# Author: Thomas Loimer, 2016-2018.
|
||
+# Author: Thomas Loimer, 2016-2019.
|
||
|
||
|
||
# testsuite and package.m4 must be distributed, hence they are
|
||
@@ -39,8 +39,8 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac
|
||
echo 'm4_define([AT_PACKAGE_URL], [@PACKAGE_URL@])'; \
|
||
} >'$(srcdir)/package.m4'
|
||
|
||
-check_PROGRAMS = test1
|
||
-# test1 calls malloc(). AC_FUNC_MALLOC may replace malloc() by rpl_malloc()
|
||
+check_PROGRAMS = test1 test2
|
||
+# test1 called malloc(). AC_FUNC_MALLOC may replace malloc() by rpl_malloc()
|
||
# which is defined in malloc.o. The latter is contained in $(LIBOBJS) in
|
||
# ${LIBOBJDIR}. Specifically, ./configure CFLAGS="-fsanitize=address" causes
|
||
# this replacment. Unfortunately, using test1_LDADD, causes make distcheck to
|
||
@@ -54,9 +54,14 @@ check_PROGRAMS = test1
|
||
|
||
# keep the definitions below in sync with those in ../dev/Makefile.am
|
||
if ENABLE_I18N
|
||
-AM_CPPFLAGS = -DI18N_DATADIR="\"$(i18ndir)\""
|
||
+test1_CPPFLAGS = -DI18N_DATADIR="\"$(i18ndir)\""
|
||
endif
|
||
|
||
+test2_CPPFLAGS = -I$(top_srcdir)/fig2dev
|
||
+test2_LDADD = $(top_builddir)/fig2dev/dev/readeps.$(OBJEXT)
|
||
+test2_DEPENDENCIES = $(test2_LDADD)
|
||
+
|
||
+
|
||
check-local: atconfig $(TESTSUITE) atlocal
|
||
$(SHELL) '$(TESTSUITE)' INSTALLCHECK=no $(TESTSUITEFLAGS)
|
||
|
||
diff --git a/fig2dev/tests/bitmaps.at b/fig2dev/tests/bitmaps.at
|
||
index 91d5b54..1fea0f8 100644
|
||
--- a/fig2dev/tests/bitmaps.at
|
||
+++ b/fig2dev/tests/bitmaps.at
|
||
@@ -235,3 +235,8 @@ EOF`
|
||
# 1433 on ubuntu 16.04.2 with ghostscript 9.18
|
||
AT_CHECK([test $blackpixels -gt 1431 && test $blackpixels -lt 1494])
|
||
AT_CLEANUP
|
||
+
|
||
+AT_SETUP([find /MediaBox in pdf file])
|
||
+AT_KEYWORDS(pdf)
|
||
+AT_CHECK(["$abs_builddir"/test2 "$srcdir/data/cross.pdf"], 0, ignore)
|
||
+AT_CLEANUP
|
||
diff --git a/fig2dev/tests/data/cross.pdf b/fig2dev/tests/data/cross.pdf
|
||
new file mode 100644
|
||
index 0000000..e1e7e4d
|
||
--- /dev/null
|
||
+++ b/fig2dev/tests/data/cross.pdf
|
||
@@ -0,0 +1,62 @@
|
||
+%PDF-1.4
|
||
+5 0 obj
|
||
+<</Length 6 0 R/Filter /FlateDecode>>
|
||
+stream
|
||
+x<>M<EFBFBD><4D>
|
||
<EFBFBD>0{O<>'Q<>xj`
|
||
+R
|
||
+<2B>$<24><>'<27>n<EFBFBD>i<EFBFBD>=<3D>^<5E>t<13>B
|
||
Z<EFBFBD>)<29>A<EFBFBD><41><19><>В{4<>L<EFBFBD>DD<44><12>ؾ<EFBFBD>Wާ<57>j_<6A>.<2E><>rd<>?endstream
|
||
+endobj
|
||
+6 0 obj
|
||
+91
|
||
+endobj
|
||
+4 0 obj
|
||
+<</Type/Page/MediaBox [0 0 72 72]
|
||
+/Parent 3 0 R
|
||
+/Resources<</ProcSet[/PDF]
|
||
+/ExtGState 8 0 R
|
||
+>>
|
||
+/Contents 5 0 R
|
||
+>>
|
||
+endobj
|
||
+3 0 obj
|
||
+<< /Type /Pages /Kids [
|
||
+4 0 R
|
||
+] /Count 1
|
||
+>>
|
||
+endobj
|
||
+1 0 obj
|
||
+<</Type /Catalog /Pages 3 0 R
|
||
+>>
|
||
+endobj
|
||
+7 0 obj
|
||
+<</Type/ExtGState
|
||
+/BM/Normal
|
||
+/OPM 1
|
||
+/TK true>>endobj
|
||
+8 0 obj
|
||
+<</R7
|
||
+7 0 R>>
|
||
+endobj
|
||
+2 0 obj
|
||
+<</Producer(GPL Ghostscript 9.27)
|
||
+/CreationDate(D:20191110165654+01'00')
|
||
+/ModDate(D:20191110165654+01'00')
|
||
+/Creator( XeTeX 2019.11.10:1656)>>endobj
|
||
+xref
|
||
+0 9
|
||
+0000000000 65535 f
|
||
+0000000376 00000 n
|
||
+0000000514 00000 n
|
||
+0000000317 00000 n
|
||
+0000000188 00000 n
|
||
+0000000009 00000 n
|
||
+0000000170 00000 n
|
||
+0000000424 00000 n
|
||
+0000000485 00000 n
|
||
+trailer
|
||
+<< /Size 10 /Root 1 0 R /Info 2 0 R
|
||
+/ID [<EAB28CF54E276D36634D7BBB3C4603B7><EAB28CF54E276D36634D7BBB3C4603B7>]
|
||
+>>
|
||
+startxref
|
||
+670
|
||
+%%EOF
|
||
diff --git a/fig2dev/tests/test2.c b/fig2dev/tests/test2.c
|
||
new file mode 100644
|
||
index 0000000..04e92d7
|
||
--- /dev/null
|
||
+++ b/fig2dev/tests/test2.c
|
||
@@ -0,0 +1,82 @@
|
||
+/*
|
||
+ * Fig2dev: Translate Fig code to various Devices
|
||
+ * Copyright (c) 1991 by Micah Beck
|
||
+ * Parts Copyright (c) 1985-1988 by Supoj Sutanthavibul
|
||
+ * Parts Copyright (c) 1989-2015 by Brian V. Smith
|
||
+ * Parts Copyright (c) 2015-2019 by Thomas Loimer
|
||
+ *
|
||
+ * Any party obtaining a copy of these files is granted, free of charge, a
|
||
+ * full and unrestricted irrevocable, world-wide, paid up, royalty-free,
|
||
+ * nonexclusive right and license to deal in this software and documentation
|
||
+ * files (the "Software"), including without limitation the rights to use,
|
||
+ * copy, modify, merge, publish, distribute, sublicense and/or sell copies
|
||
+ * of the Software, and to permit persons who receive copies from any such
|
||
+ * party to do so, with the only requirement being that the above copyright
|
||
+ * and this permission notice remain intact.
|
||
+ *
|
||
+ */
|
||
+
|
||
+/*
|
||
+ * test2.c: Check, whether read_pdf() finds the bounding box of a pdf file.
|
||
+ * Author: Thomas Loimer, 2019-12-14
|
||
+ */
|
||
+
|
||
+#ifdef HAVE_CONFIG_H
|
||
+#include "config.h"
|
||
+#endif
|
||
+
|
||
+#include <stdio.h>
|
||
+#include <string.h>
|
||
+#include <stdlib.h>
|
||
+
|
||
+#include "bool.h"
|
||
+#include "object.h"
|
||
+
|
||
+/* the function to be tested, in $(top_srcdir)/fig2dev/dev/readeps.c */
|
||
+extern int read_pdf(FILE *file, int type, F_pic *pic, int *llx, int *lly);
|
||
+
|
||
+/* symbols that are needed when calling read_pdf() */
|
||
+int urx = 0;
|
||
+int ury = 0;
|
||
+int metric = 0;
|
||
+FILE *tfp;
|
||
+const struct _paperdef /* from fig2dev.h */
|
||
+{
|
||
+ char *name;
|
||
+ int width;
|
||
+ int height;
|
||
+} paperdef[1] = {{"letter", 8, 12}};
|
||
+
|
||
+
|
||
+void put_msg(const char *fmt, const char *file, const char *size)
|
||
+{
|
||
+ fprintf(stderr, fmt, file, size);
|
||
+}
|
||
+
|
||
+int
|
||
+main(int argc, char *argv[])
|
||
+{
|
||
+ (void) argc;
|
||
+ int llx = -1;
|
||
+ int lly = -1;
|
||
+ FILE *file;
|
||
+ F_pic pic;
|
||
+
|
||
+ tfp = stdout;
|
||
+ pic.file = argv[1];
|
||
+
|
||
+ file = fopen(argv[1], "rb");
|
||
+ if (file == NULL) {
|
||
+ fprintf(stderr, "Test file %s not found.\n", argv[1]);
|
||
+ exit(EXIT_FAILURE);
|
||
+ }
|
||
+
|
||
+ if (read_pdf(file, 0, &pic, &llx, &lly) == 1 &&
|
||
+ pic.bit_size.x != 10 && pic.bit_size.y != 10) {
|
||
+ fprintf(stdout, "read_pdf found: width = %d, height = %d\n",
|
||
+ pic.bit_size.x, pic.bit_size.y);
|
||
+ exit(EXIT_SUCCESS);
|
||
+ } else {
|
||
+ exit(EXIT_FAILURE);
|
||
+ }
|
||
+}
|
||
diff --git a/transfig/sys.c b/transfig/sys.c
|
||
index c070ee6..30e8d3d 100644
|
||
--- a/transfig/sys.c
|
||
+++ b/transfig/sys.c
|
||
@@ -2,6 +2,8 @@
|
||
* TransFig: Facility for Translating Fig code
|
||
* Copyright (c) 1991 by Micah Beck
|
||
* Parts Copyright (c) 1985-1988 by Supoj Sutanthavibul
|
||
+ * Parts Copyright (c) 1989-2015 by Brian V. Smith
|
||
+ * Parts Copyright (c) 2015-2019 by Thomas Loimer
|
||
*
|
||
* Any party obtaining a copy of these files is granted, free of charge, a
|
||
* full and unrestricted irrevocable, world-wide, paid up, royalty-free,
|
||
@@ -39,6 +41,7 @@ sysls(void)
|
||
i += 1;
|
||
c = fgetc(ls);
|
||
}
|
||
+ pclose(ls);
|
||
sysbuf[i] = '\0';
|
||
return sysbuf;
|
||
}
|
||
--
|
||
2.24.1
|
||
|