summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Build/source/libs/README4
-rw-r--r--Build/source/libs/poppler/ChangeLog5
-rw-r--r--Build/source/libs/poppler/Makefile.am2
-rw-r--r--Build/source/libs/poppler/Makefile.in17
-rw-r--r--Build/source/libs/poppler/TLpatches/ChangeLog4
-rw-r--r--Build/source/libs/poppler/TLpatches/TL-Changes5
-rw-r--r--Build/source/libs/poppler/TLpatches/patch-03-time12
-rwxr-xr-xBuild/source/libs/poppler/configure22
-rw-r--r--Build/source/libs/poppler/poppler-src/CMakeLists.txt10
-rw-r--r--Build/source/libs/poppler/poppler-src/ChangeLog1078
-rw-r--r--Build/source/libs/poppler/poppler-src/NEWS31
-rw-r--r--Build/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc10
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/GooCheckedOps.h49
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/JpegWriter.cc3
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/gdir.h91
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/gfile.cc1
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/gfile.h49
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/gmem.cc322
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/gmem.h184
-rw-r--r--Build/source/libs/poppler/poppler-src/goo/gmempp.cc32
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Annot.cc188
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Annot.h38
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Array.cc15
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/CairoRescaleBox.cc7
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Catalog.cc3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Catalog.h3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Dict.cc245
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Dict.h48
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Form.cc9
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Function.cc6
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Gfx.cc41
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/GfxFont.cc3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/GfxState.cc26
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/GlobalParams.cc1
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc38
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Link.cc3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Object.cc40
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Object.h77
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/OptionalContent.cc51
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/OptionalContent.h10
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/OutputDev.h12
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/PDFDoc.cc142
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/PDFDoc.h46
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc56
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.h4
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Parser.cc9
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.cc8
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.h4
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc105
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.h3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.cc3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.h3
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc5
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.h5
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/XRef.cc4
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/poppler-config.h.cmake4
-rw-r--r--Build/source/libs/poppler/version.ac2
57 files changed, 2168 insertions, 1030 deletions
diff --git a/Build/source/libs/README b/Build/source/libs/README
index 334a0df72b8..eec2731f8b4 100644
--- a/Build/source/libs/README
+++ b/Build/source/libs/README
@@ -49,8 +49,8 @@ mpfr 4.0.1 - checked 10feb18
pixman 0.34.0 - checked 04feb16
http://cairographics.org/releases/
-poppler 0.68.0 - checked 20aug18
- http://poppler.freedesktop.org/ - used by luatex and xetex
+poppler 0.69.0 - checked 22sep18
+ http://poppler.freedesktop.org/ - used by xetex
(requires C++11)
teckit 2.5.8 - checked 24jul18
diff --git a/Build/source/libs/poppler/ChangeLog b/Build/source/libs/poppler/ChangeLog
index e5cd68be0e2..db7d9b507dd 100644
--- a/Build/source/libs/poppler/ChangeLog
+++ b/Build/source/libs/poppler/ChangeLog
@@ -1,3 +1,8 @@
+2018-09-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import poppler-0.69.0.
+ * Makefile.am, version.ac: Adjust.
+
2018-08-20 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
Import poppler-0.68.0.
diff --git a/Build/source/libs/poppler/Makefile.am b/Build/source/libs/poppler/Makefile.am
index e20f407f543..949621cdfa6 100644
--- a/Build/source/libs/poppler/Makefile.am
+++ b/Build/source/libs/poppler/Makefile.am
@@ -43,8 +43,6 @@ nodist_libpoppler_a_SOURCES = \
goo_libGoo_a_sources = \
@POPPLER_TREE@/goo/gfile.cc \
@POPPLER_TREE@/goo/glibc.cc \
- @POPPLER_TREE@/goo/gmem.cc \
- @POPPLER_TREE@/goo/gmempp.cc \
@POPPLER_TREE@/goo/grandom.cc \
@POPPLER_TREE@/goo/gstrtod.cc \
@POPPLER_TREE@/goo/FixedPoint.cc \
diff --git a/Build/source/libs/poppler/Makefile.in b/Build/source/libs/poppler/Makefile.in
index fc8765c2bde..e3d3ee03046 100644
--- a/Build/source/libs/poppler/Makefile.in
+++ b/Build/source/libs/poppler/Makefile.in
@@ -117,8 +117,6 @@ libpoppler_a_LIBADD =
am__dirstamp = $(am__leading_dot)dirstamp
am__objects_1 = @POPPLER_TREE@/goo/gfile.$(OBJEXT) \
@POPPLER_TREE@/goo/glibc.$(OBJEXT) \
- @POPPLER_TREE@/goo/gmem.$(OBJEXT) \
- @POPPLER_TREE@/goo/gmempp.$(OBJEXT) \
@POPPLER_TREE@/goo/grandom.$(OBJEXT) \
@POPPLER_TREE@/goo/gstrtod.$(OBJEXT) \
@POPPLER_TREE@/goo/FixedPoint.$(OBJEXT) \
@@ -224,8 +222,6 @@ am__depfiles_remade = @POPPLER_TREE@/fofi/$(DEPDIR)/FoFiBase.Po \
@POPPLER_TREE@/goo/$(DEPDIR)/GooTimer.Po \
@POPPLER_TREE@/goo/$(DEPDIR)/gfile.Po \
@POPPLER_TREE@/goo/$(DEPDIR)/glibc.Po \
- @POPPLER_TREE@/goo/$(DEPDIR)/gmem.Po \
- @POPPLER_TREE@/goo/$(DEPDIR)/gmempp.Po \
@POPPLER_TREE@/goo/$(DEPDIR)/grandom.Po \
@POPPLER_TREE@/goo/$(DEPDIR)/gstrtod.Po \
@POPPLER_TREE@/poppler/$(DEPDIR)/Annot.Po \
@@ -533,8 +529,6 @@ nodist_libpoppler_a_SOURCES = \
goo_libGoo_a_sources = \
@POPPLER_TREE@/goo/gfile.cc \
@POPPLER_TREE@/goo/glibc.cc \
- @POPPLER_TREE@/goo/gmem.cc \
- @POPPLER_TREE@/goo/gmempp.cc \
@POPPLER_TREE@/goo/grandom.cc \
@POPPLER_TREE@/goo/gstrtod.cc \
@POPPLER_TREE@/goo/FixedPoint.cc \
@@ -701,11 +695,6 @@ clean-noinstLIBRARIES:
@POPPLER_TREE@/goo/glibc.$(OBJEXT): \
@POPPLER_TREE@/goo/$(am__dirstamp) \
@POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp)
-@POPPLER_TREE@/goo/gmem.$(OBJEXT): @POPPLER_TREE@/goo/$(am__dirstamp) \
- @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp)
-@POPPLER_TREE@/goo/gmempp.$(OBJEXT): \
- @POPPLER_TREE@/goo/$(am__dirstamp) \
- @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp)
@POPPLER_TREE@/goo/grandom.$(OBJEXT): \
@POPPLER_TREE@/goo/$(am__dirstamp) \
@POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp)
@@ -970,8 +959,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/GooTimer.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/gfile.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/glibc.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/gmem.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/gmempp.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/grandom.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/gstrtod.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Annot.Po@am__quote@ # am--include-marker
@@ -1421,8 +1408,6 @@ distclean: distclean-recursive
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/GooTimer.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gfile.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/glibc.Po
- -rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gmem.Po
- -rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gmempp.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/grandom.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gstrtod.Po
-rm -f @POPPLER_TREE@/poppler/$(DEPDIR)/Annot.Po
@@ -1547,8 +1532,6 @@ maintainer-clean: maintainer-clean-recursive
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/GooTimer.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gfile.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/glibc.Po
- -rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gmem.Po
- -rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gmempp.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/grandom.Po
-rm -f @POPPLER_TREE@/goo/$(DEPDIR)/gstrtod.Po
-rm -f @POPPLER_TREE@/poppler/$(DEPDIR)/Annot.Po
diff --git a/Build/source/libs/poppler/TLpatches/ChangeLog b/Build/source/libs/poppler/TLpatches/ChangeLog
index 418de163d1c..fb96bc15078 100644
--- a/Build/source/libs/poppler/TLpatches/ChangeLog
+++ b/Build/source/libs/poppler/TLpatches/ChangeLog
@@ -1,3 +1,7 @@
+2018-09-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * patch-03-time: Adapted.
+
2018-08-20 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
* patch-03-time: Adapted.
diff --git a/Build/source/libs/poppler/TLpatches/TL-Changes b/Build/source/libs/poppler/TLpatches/TL-Changes
index 3a36f6927f8..113c41807b5 100644
--- a/Build/source/libs/poppler/TLpatches/TL-Changes
+++ b/Build/source/libs/poppler/TLpatches/TL-Changes
@@ -1,9 +1,12 @@
-Changes applied to the poppler-0.68.0 tree as obtained from:
+Changes applied to the poppler-0.69.0 tree as obtained from:
http://poppler.freedesktop.org/
Removed unused dirs:
cmake cpp glib qt5 test utils
+Removed unused file:
+ .gitlab-ci.yml
+
Removed unused files in splash:
only SplashTypes.h is used
diff --git a/Build/source/libs/poppler/TLpatches/patch-03-time b/Build/source/libs/poppler/TLpatches/patch-03-time
index 6b9d3d12a56..ce313dcf175 100644
--- a/Build/source/libs/poppler/TLpatches/patch-03-time
+++ b/Build/source/libs/poppler/TLpatches/patch-03-time
@@ -1,6 +1,6 @@
-diff -ur poppler-0.68.0/goo/gfile.h poppler-src/goo/gfile.h
---- poppler-0.68.0/goo/gfile.h Mon Aug 20 06:37:51 2018
-+++ poppler-src/goo/gfile.h Mon Aug 20 11:17:15 2018
+diff -ur poppler-0.69.0/goo/gfile.h poppler-src/goo/gfile.h
+--- poppler-0.69.0/goo/gfile.h Sat Sep 22 06:41:09 2018
++++ poppler-src/goo/gfile.h Sat Sep 22 15:30:17 2018
@@ -51,8 +51,6 @@
# include <windows.h>
# endif
@@ -10,9 +10,9 @@ diff -ur poppler-0.68.0/goo/gfile.h poppler-src/goo/gfile.h
#else
# include <unistd.h>
# include <sys/types.h>
-diff -ur poppler-0.68.0/poppler/Form.h poppler-src/poppler/Form.h
---- poppler-0.68.0/poppler/Form.h Mon Aug 20 06:37:51 2018
-+++ poppler-src/poppler/Form.h Mon Aug 20 11:18:08 2018
+diff -ur poppler-0.69.0/poppler/Form.h poppler-src/poppler/Form.h
+--- poppler-0.69.0/poppler/Form.h Sat Sep 22 06:41:09 2018
++++ poppler-src/poppler/Form.h Sat Sep 22 15:30:57 2018
@@ -36,6 +36,7 @@
#include <set>
diff --git a/Build/source/libs/poppler/configure b/Build/source/libs/poppler/configure
index 906dee62485..d77ad4469b6 100755
--- a/Build/source/libs/poppler/configure
+++ b/Build/source/libs/poppler/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for poppler (TeX Live) 0.68.0.
+# Generated by GNU Autoconf 2.69 for poppler (TeX Live) 0.69.0.
#
# Report bugs to <tex-k@tug.org>.
#
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='poppler (TeX Live)'
PACKAGE_TARNAME='poppler--tex-live-'
-PACKAGE_VERSION='0.68.0'
-PACKAGE_STRING='poppler (TeX Live) 0.68.0'
+PACKAGE_VERSION='0.69.0'
+PACKAGE_STRING='poppler (TeX Live) 0.69.0'
PACKAGE_BUGREPORT='tex-k@tug.org'
PACKAGE_URL=''
@@ -1307,7 +1307,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures poppler (TeX Live) 0.68.0 to adapt to many kinds of systems.
+\`configure' configures poppler (TeX Live) 0.69.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1374,7 +1374,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of poppler (TeX Live) 0.68.0:";;
+ short | recursive ) echo "Configuration of poppler (TeX Live) 0.69.0:";;
esac
cat <<\_ACEOF
@@ -1487,7 +1487,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-poppler (TeX Live) configure 0.68.0
+poppler (TeX Live) configure 0.69.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2134,7 +2134,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by poppler (TeX Live) $as_me 0.68.0, which was
+It was created by poppler (TeX Live) $as_me 0.69.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -4057,7 +4057,7 @@ fi
# Define the identity of the package.
PACKAGE='poppler--tex-live-'
- VERSION='0.68.0'
+ VERSION='0.69.0'
# Some tools Automake needs.
@@ -7647,7 +7647,7 @@ ac_config_headers="$ac_config_headers poppler-config.h:poppler-src/poppler/poppl
cat >>confdefs.h <<_ACEOF
-#define POPPLER_VERSION "0.68.0"
+#define POPPLER_VERSION "0.69.0"
_ACEOF
@@ -8341,7 +8341,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by poppler (TeX Live) $as_me 0.68.0, which was
+This file was extended by poppler (TeX Live) $as_me 0.69.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8407,7 +8407,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-poppler (TeX Live) config.status 0.68.0
+poppler (TeX Live) config.status 0.69.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/Build/source/libs/poppler/poppler-src/CMakeLists.txt b/Build/source/libs/poppler/poppler-src/CMakeLists.txt
index cf3a542389e..b664e5f3d9a 100644
--- a/Build/source/libs/poppler/poppler-src/CMakeLists.txt
+++ b/Build/source/libs/poppler/poppler-src/CMakeLists.txt
@@ -30,11 +30,11 @@ if (ECM_FOUND)
endif()
set(POPPLER_MAJOR_VERSION "0")
-set(POPPLER_MINOR_VERSION "68")
+set(POPPLER_MINOR_VERSION "69")
set(POPPLER_MICRO_VERSION "0")
set(POPPLER_VERSION "${POPPLER_MAJOR_VERSION}.${POPPLER_MINOR_VERSION}.${POPPLER_MICRO_VERSION}")
-set (CMAKE_CXX_STANDARD 11)
+set (CMAKE_CXX_STANDARD 14)
set (CMAKE_CXX_EXTENSIONS OFF)
# command line switches
@@ -315,11 +315,9 @@ configure_file(poppler/poppler-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/popple
set(poppler_SRCS
goo/gfile.cc
- goo/gmempp.cc
goo/GooList.cc
goo/GooTimer.cc
goo/GooString.cc
- goo/gmem.cc
goo/FixedPoint.cc
goo/NetPBMWriter.cc
goo/PNGWriter.cc
@@ -489,7 +487,7 @@ add_library(poppler STATIC ${poppler_SRCS})
else()
add_library(poppler ${poppler_SRCS})
endif()
-set_target_properties(poppler PROPERTIES VERSION 79.0.0 SOVERSION 79)
+set_target_properties(poppler PROPERTIES VERSION 80.0.0 SOVERSION 80)
if(MINGW)
get_target_property(POPPLER_SOVERSION poppler SOVERSION)
set_target_properties(poppler PROPERTIES SUFFIX "-${POPPLER_SOVERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
@@ -584,9 +582,11 @@ if(ENABLE_XPDF_HEADERS)
goo/GooString.h
goo/gtypes.h
goo/gmem.h
+ goo/gdir.h
goo/gfile.h
goo/FixedPoint.h
goo/ImgWriter.h
+ goo/GooCheckedOps.h
goo/GooLikely.h
goo/gstrtod.h
goo/grandom.h
diff --git a/Build/source/libs/poppler/poppler-src/ChangeLog b/Build/source/libs/poppler/poppler-src/ChangeLog
index a5d852168ec..153cc6a0cb5 100644
--- a/Build/source/libs/poppler/poppler-src/ChangeLog
+++ b/Build/source/libs/poppler/poppler-src/ChangeLog
@@ -1,3 +1,1081 @@
+commit 2052dc60f5b7403418384237d4bad2c7faf0acee
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Fri Sep 21 23:41:09 2018 +0200
+
+ Poppler 0.69
+
+ CMakeLists.txt | 4 ++--
+ NEWS | 31 +++++++++++++++++++++++++++++++
+ cpp/Doxyfile | 2 +-
+ qt5/src/CMakeLists.txt | 2 +-
+ qt5/src/Doxyfile | 2 +-
+ 5 files changed, 36 insertions(+), 5 deletions(-)
+
+commit 554e87a1ea76ce73b4cfe6fca5b9c1bb47502dad
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Fri Sep 21 18:00:24 2018 +0200
+
+ offset from beginning of file can't be < 0
+
+ poppler/XRef.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 06c344ccb8ccfafa9c506f40226ea2cce0e5f75c
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Sep 21 09:43:40 2018 +0200
+
+ Use deferred sorting with Dict again to avoid performance regression
+
+ This tries to move sorting a Dict into the first find call again,
+ but tries
+ harder to make the double-checked locking work correctly so that
+ at least
+ concurrent calls to find are correct (but concurrent calls to find and
+ add, set or remove are still not allowed).
+
+ poppler/Dict.cc | 24 ++++++++++++++----------
+ poppler/Dict.h | 2 +-
+ 2 files changed, 15 insertions(+), 11 deletions(-)
+
+commit 22ea442de8776e7e6fa78062cb8bb224b98e736f
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Sep 20 23:23:56 2018 +0200
+
+ SplashOutputDev::drawImage: gmallocn -> checkoverflow
+
+ oss-fuzz/10194
+
+ And also add a likely for the previous change in the file
+
+ poppler/SplashOutputDev.cc | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+commit 8ff1bddc6a97a5f8b43ff95405f0642fb03f962b
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Sep 20 23:21:02 2018 +0200
+
+ Splash::scaleImageYdXd: gmallocn -> gmallocn_checkoverflow
+
+ oss-fuzz/10205
+
+ splash/Splash.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit cf25cd0c4893b62a9993034079a6c89c6ca370ee
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Sep 20 23:17:06 2018 +0200
+
+ SplashOutputDev::drawSoftMaskedImage: gmallocn ->
+ gmallocn_checkoverflow
+
+ oss-fuzz/10298
+
+ poppler/SplashOutputDev.cc | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit b5db021a71e38d56079cbcfcaf3345765e9ed782
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Sep 20 23:10:55 2018 +0200
+
+ GfxUnivariateShading::setupCache: gmallocn -> gmallocn_checkoverflow
+
+ oss-fuzz/10508
+
+ poppler/GfxState.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit ab1b051a9f65b7f8e4dc9f8f9c28a0aff0c86596
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Sep 20 23:05:55 2018 +0200
+
+ Remove unused variable
+
+ poppler/Gfx.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d1a4c5a9faf95618fc302c358021a745afc0527c
+Author: Denis Onishchenko <denis.onischenko@gmail.com>
+Date: Thu Sep 20 22:57:03 2018 +0200
+
+ Fix 2 errors in computation of type3 glyphs transformation matrix
+
+ poppler/Gfx.cc | 28 +++++++++++++---------------
+ 1 file changed, 13 insertions(+), 15 deletions(-)
+
+commit 5dadcc93c4d4d44d0ec3bdc6bb54851f6ffaee98
+Author: Tobias Deiminger <haxtibal@posteo.de>
+Date: Sun Sep 9 09:28:22 2018 +0200
+
+ Compile Qt5 frontend with -DQT_STRICT_ITERATORS
+
+ QT_STRICT_ITERATORS prevents conversion from non-const iterator to
+ const iterator.
+
+ It helps detecting situations where we waste resources due to
+ needless detach from implicitely shared container data (i.e. deep
+ copy).
+
+ If anyone should run into problems, they can disable strict iterators
+ using a global cache variable:
+
+ $ cmake DENABLE_QT_STRICT_ITERATORS=OFF [...]
+
+ qt5/CMakeLists.txt | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 3105b61e0912df397dd712632d8ea16269ff4d94
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Wed Sep 19 23:17:07 2018 +0200
+
+ Update (C)
+
+ poppler/OptionalContent.h | 1 +
+ poppler/StructTreeRoot.cc | 1 +
+ poppler/StructTreeRoot.h | 1 +
+ qt5/src/poppler-link.cc | 1 +
+ qt5/src/poppler-optcontent.cc | 1 +
+ 5 files changed, 5 insertions(+)
+
+commit 5bbb2fc4b159b003a22a9d3327ba290a7bba15f0
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue Sep 18 21:36:13 2018 +0200
+
+ Add a separate build job using Ubuntu 14.04 and GCC 4.9 to
+ compatibility with older systems.
+
+ .gitlab-ci.yml | 35 +++++++++++++++++++++++++++--------
+ 1 file changed, 27 insertions(+), 8 deletions(-)
+
+commit 560b34a6e2d3fd58edfb5f0af751f1aa7d3dc3d8
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue Sep 18 11:35:55 2018 +0200
+
+ Prevent leaking OptionalContentGroup by using unique_ptr as early
+ as possible. oss-fuzz/10418
+
+ poppler/OptionalContent.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 7ac84c1d633b49d69b1ec80606fdca8ee14d80e0
+Author: Oliver Sander <oliver.sander@tu-dresden.de>
+Date: Tue Sep 18 11:18:33 2018 +0200
+
+ Document the new 'ArthurFontID' type
+
+ qt5/src/ArthurOutputDev.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5048bec585be382f9d37110c6b2e16d26d29d5b2
+Author: Oliver Sander <oliver.sander@tu-dresden.de>
+Date: Tue Sep 18 11:02:58 2018 +0200
+
+ Bugfix: Do not disregard Ref::gen when using Ref as a cache key
+
+ According to Leonard Rosenthol's book, the 'gen' field of a
+ reference is almost always zero. However, this doesn't mean that
+ it can be ignored when comparing two Refs.
+
+ Incidentally, this patch also makes use of the recently introduced
+ Ref::operator<, which allows to replace the small custom class
+ ArthurFontID by a std::pair.
+
+ qt5/src/ArthurOutputDev.h | 14 +-------------
+ 1 file changed, 1 insertion(+), 13 deletions(-)
+
+commit 7e9b6f1dba716e7adba1ed2ecd765b207def9747
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Sat Sep 15 09:54:01 2018 +0200
+
+ Fix TODO in OCGs by creating a look-up table from Ref to
+ OptionalContentGroup (and make Ref a regular type to do so).
+
+ glib/poppler-document.cc | 12 ++++--------
+ poppler/Object.h | 31 +++++++++++++++++++++++++------
+ poppler/OptionalContent.cc | 42
+ ++++++++++--------------------------------
+ poppler/OptionalContent.h | 9 +++++----
+ poppler/StructTreeRoot.cc | 2 +-
+ poppler/StructTreeRoot.h | 2 +-
+ qt5/src/poppler-link.cc | 5 -----
+ qt5/src/poppler-optcontent.cc | 9 ++++-----
+ utils/pdfinfo.cc | 2 +-
+ 9 files changed, 51 insertions(+), 63 deletions(-)
+
+commit 94527d5a61eb3402b49436b978bad69f71884051
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Sat Sep 15 09:31:37 2018 +0200
+
+ Check for Ref type before unwrapping Object as such
+
+ oss-fuzz/10359
+
+ poppler/OptionalContent.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 3af4c151cf09e1e98d311e8308060eb832bdd7d2
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Sun Sep 2 13:48:17 2018 +0200
+
+ Make Object::takeString leave a dead object instead of a null string
+ and hence assert non-null strings during object creation.
+
+ poppler/Object.h | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit a238d170dd89e27efd44ea09126b84272c0ac47b
+Author: Tobias Deiminger <haxtibal@posteo.de>
+Date: Fri Sep 7 16:30:48 2018 +0200
+
+ Add missing newline after Tf in setTextFont
+
+ Until now AnnotAppearanceBuilder::setTextFont was only used to write
+ last operation in apperance string for /DA. There you don't notice
+ the missing delimiter. Delimiter will however be required in general,
+ e.g. when writing appearance string for /AP.
+
+ poppler/Annot.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1acbe6af40e598b3afae18709eb32ec44d7b1afc
+Author: Tobias Deiminger <haxtibal@posteo.de>
+Date: Sat Sep 8 12:39:25 2018 +0200
+
+ Fix compilation with QT_STRICT_ITERATORS
+
+ qt5/tests/check_annotations.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 574840c5a61a9a20c930dd6fec63e6cf11bacfa5
+Author: Christian Persch <chpe@src.gnome.org>
+Date: Wed Sep 5 21:19:04 2018 +0200
+
+ goo: Split GDir and GDirEntry out of gfile.h
+
+ This allows including gfile.h together with glib.h which has
+ a conflicting GDir type.
+
+ https://gitlab.freedesktop.org/poppler/poppler/issues/370
+
+ CMakeLists.txt | 1 +
+ goo/gdir.h | 91
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ goo/gfile.cc | 1 +
+ goo/gfile.h | 49 --------------------------
+ poppler/GlobalParams.cc | 1 +
+ 5 files changed, 94 insertions(+), 49 deletions(-)
+
+commit f2223e12e401648a24d559ba766759b8afac2d5e
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Sun Sep 2 10:43:18 2018 +0200
+
+ Assert validity of Object contents where at least constructor or
+ destructor seem to assume it to catch errors as early as possible
+ when using debug builds.
+
+ poppler/Object.cc | 8 ++------
+ poppler/Object.h | 9 +++++----
+ 2 files changed, 7 insertions(+), 10 deletions(-)
+
+commit 7c6c1fef6a7eab712ad335d63c5fe7ff05e6e59f
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Sun Sep 2 13:32:01 2018 +0200
+
+ pdftotext: Fix memory leak in printLine
+
+ utils/pdftotext.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e8e95d2ca4f1c108cc69cab72c7c5ab31f80a597
+Author: Sanchit Anand <sanxchit@gmail.com>
+Date: Tue Aug 28 02:58:39 2018 -0400
+
+ pdftotext: Fix only outputs first page content with -bbox-layout
+ option
+
+ Issue #88
+
+ poppler/TextOutputDev.cc | 5 +++++
+ poppler/TextOutputDev.h | 5 +++++
+ utils/pdftotext.cc | 6 ++----
+ 3 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 09cc5fd1b4ef758b1f496b33bc5c5cb9e63b08eb
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Sun Sep 2 13:10:45 2018 +0200
+
+ qt5: test: Compile with old qt
+
+ qt5/tests/check_annotations.cpp | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 042d2483c04652036ab921983b4967851f3bb8cf
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Sun Sep 2 12:39:09 2018 +0200
+
+ Add missing (C)
+
+ And minor style change by Albert
+
+ poppler/Annot.cc | 6 ++++--
+ poppler/Annot.h | 6 ++++--
+ qt5/src/poppler-annotation-helper.h | 1 +
+ qt5/src/poppler-annotation.cc | 2 ++
+ qt5/src/poppler-annotation.h | 1 +
+ 5 files changed, 12 insertions(+), 4 deletions(-)
+
+commit d4b4be23c8b55a118f7b9194a93a8e9da38793c1
+Author: Tobias Deiminger <haxtibal@posteo.de>
+Date: Sat Aug 25 23:08:39 2018 +0200
+
+ More review fixes
+
+ Text color is indicated by nonstroking color in graphics state
+ Assumption: Text rendering mode is 'fill'.
+
+ Increase color precision for lossless roundtrip of 16 bit integers
+ Our API takes QColor from user. We want to support a lossless
+ roundtrip
+ of QColor (16 bit per channel internally) through document
+ save and
+ load, and empirically found .5f is best match.
+
+ Check only .5f case of color channel roundtrip. Include 65535.
+ We check if precision == 5 is sufficient, and fail if not. We
+ know that
+ precision < 5 will never work, because target set contains
+ less numbers
+ than uint16 range.
+
+ Use smart pointer in textFont and textColor
+
+ Add test for CMYK QColor roundtrip
+
+ Support QColor::Cmyk to AnnotColor::colorCMYK conversion
+
+ Add simple test for font size. Fix actual/expected args.
+
+ Model font name as class Object, type objName
+ Take into account that ISO 32000 says Tf operand is always
+ an object of
+ PDF type "name". Further benefit: class Object introduces
+ ownership
+ semantcis.
+
+ Use more std::unique_ptr and fix some coding syle
+ Some places assumed ownership implicitely. Make it more
+ explicit.
+
+ Move parse/constructAppearanceString into DefaultAppearance
+ We gain cohesion and automatic memory management.
+
+ Fix minor styling issues
+
+ Use std::make_unique from C++14
+
+ poppler/Annot.cc | 163
+ ++++++++++++++++++++--------------------
+ poppler/Annot.h | 29 ++++---
+ qt5/src/poppler-annotation.cc | 85 +++++++++++++--------
+ qt5/tests/check_annotations.cpp | 66 +++++++++++-----
+ 4 files changed, 199 insertions(+), 144 deletions(-)
+
+commit b67e7ab708a0606298fd3707347bed935390d062
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 24 20:14:14 2018 +0200
+
+ Add a roundtrip consistency test for the text color properties
+ of annotations.
+
+ qt5/tests/CMakeLists.txt | 1 +
+ qt5/tests/check_annotations.cpp | 75
+ +++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 76 insertions(+)
+
+commit db0451ab16060509d13415162a95db269ca0d4f3
+Author: Tobias Deiminger <haxtibal@posteo.de>
+Date: Sat Aug 25 19:57:13 2018 +0200
+
+ Fix open review comments from #50
+
+ Make fontTag optional for AnnotFreeText::parseAppearanceString.
+ Handle fontColor == nullptr in
+ AnnotFreeText::constructAppearanceString.
+ Use AnnotAppearanceBuilder in
+ AnnotFreeText::constructAppearanceString.
+ Delete copy assignment operator for DefaultAppearance.
+ Rename setAppearanceString to setDefaultAppearance.
+
+ poppler/Annot.cc | 45
+ +++++++++++++++++--------------------------
+ poppler/Annot.h | 8 +++++---
+ qt5/src/poppler-annotation.cc | 2 +-
+ 3 files changed, 24 insertions(+), 31 deletions(-)
+
+commit 64531344de3dc663a4429e94381d68cc198d0425
+Author: Dileep Sankhla <sankhla.dileep96@gmail.com>
+Date: Thu Aug 23 17:48:39 2018 +0200
+
+ Add annotation font color
+
+ poppler/Annot.cc | 73 +++++++++++++++++++++-----
+ poppler/Annot.h | 29 +++++++++--
+ qt5/src/poppler-annotation-helper.h | 2 +-
+ qt5/src/poppler-annotation.cc | 101
+ ++++++++++++++++++++++--------------
+ qt5/src/poppler-annotation.h | 4 ++
+ 5 files changed, 152 insertions(+), 57 deletions(-)
+
+commit f506b8bc52efd0781a933a44bb58d02fb000c78d
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Sat Sep 1 23:54:26 2018 +0200
+
+ Fix handling of Signature Info Location and Reason
+
+ We can't call GooString->getCString and just store that char *
+ as it belonged to us since it may very well be the inner array
+ of the GooString and be invalid once the GooString goes away
+
+ poppler/Form.cc | 6 +++---
+ poppler/SignatureInfo.cc | 8 ++++----
+ poppler/SignatureInfo.h | 4 ++--
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 7418616dbfc9c4e5b05b7a57f4fabed3bf9fdcb0
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Sat Sep 1 23:51:48 2018 +0200
+
+ Link: Fix memory leak regarding next actions
+
+ poppler/Link.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 45f0f6d21d51c0408fe1d876f18ef05489e69bc0
+Author: Evangelos Rigas <erigas@rnd2.org>
+Date: Mon Aug 6 10:57:47 2018 +0100
+
+ [utils] Add PDF subtype to pdfinfo
+
+ If the document is compliant with PDF A, E, VT, UA or X standard
+ print PDF subtype version, title, subtitle and explain the part
+ and conformance levels.
+
+ utils/pdfinfo.cc | 238
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 238 insertions(+)
+
+commit 98d1b3dcc2c0530c12fb4422067c529ab375c680
+Author: Evangelos Rigas <erigas@rnd2.org>
+Date: Wed Aug 22 10:51:12 2018 +0300
+
+ [core] Add support for PDF subtype property
+
+ Parse /GTS_PDF(A,E,UA,VT,X)Version from the PDF Information
+ Dictionary into three enums: PDFSubtype, PDFSubtypePart, and
+ PDFSubtypeConformance.
+
+ poppler/PDFDoc.cc | 132
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PDFDoc.h | 46 +++++++++++++++++++
+ 2 files changed, 178 insertions(+)
+
+commit 4f039c57fee4413a500a9e36bf8350eae1130442
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Sat Sep 1 01:05:02 2018 +0200
+
+ Update (C) from last commits
+
+ cpp/poppler-image.cpp | 1 +
+ poppler/GfxState.cc | 1 +
+ poppler/JBIG2Stream.cc | 1 +
+ qt5/src/ArthurOutputDev.cc | 1 +
+ splash/SplashPath.cc | 1 +
+ 5 files changed, 5 insertions(+)
+
+commit 9df44cf1e0e300b751cd1c562f2b48335db72ac7
+Author: Jakub Wilk <jwilk@jwilk.net>
+Date: Fri Aug 31 12:05:56 2018 +0200
+
+ Install goo/GooCheckedOps.h
+
+ goo/gmem.h includes goo/GooCheckedOps.h, so they should be installed
+ together.
+
+ CMakeLists.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 55e2b746e6bd3e495c30fe7e5154ec2c956d3faa
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 31 19:17:59 2018 +0200
+
+ Check for allocation failure during processing of JBIG2
+ streams. oss-fuzz/10146
+
+ poppler/JBIG2Stream.cc | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit bb078cbd88252e421d14747b98c5c71062cf7571
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 31 20:18:23 2018 +0200
+
+ Always check for allocation failure after calling SplashPath::grow
+ and also set curSubpath to zero so that noCurrentPoint applies after
+ allocation failure. oss-fuzz/10148
+
+ splash/SplashPath.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit f200264ddb0a16f54ae2711f399867e659957b1d
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Fri Aug 31 20:03:36 2018 +0200
+
+ FoFiType1C::getDeltaIntArray: Fix undefined inf to int conversion
+
+ fofi/FoFiType1C.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9bfc10eecb57354270806aa1d9278eebb1db2287
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 31 18:47:52 2018 +0200
+
+ Bump required C++ standard version to C++14 and convert a few
+ hopefully obvious call sites where types are repeated to using
+ std::make_unique.
+
+ CMakeLists.txt | 2 +-
+ cpp/poppler-image.cpp | 2 +-
+ cpp/poppler-page.cpp | 14 +++++++-------
+ poppler/GfxState.cc | 2 +-
+ qt5/src/ArthurOutputDev.cc | 46
+ +++++++++++++++++++++++++++-------------------
+ 5 files changed, 37 insertions(+), 29 deletions(-)
+
+commit d2fa4a727fc994256219a4c4f777a1c38dcc26c5
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Fri Aug 31 19:53:05 2018 +0200
+
+ (C) of previous commits
+
+ fofi/FoFiType1C.cc | 1 +
+ poppler/SplashOutputDev.h | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit 51f1c813970627db0b8804f6a729eed79ac9dfb4
+Author: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Date: Fri Aug 31 00:27:13 2018 +0200
+
+ SplashPath: Allocate temporary pathes on the stack
+
+ The majority of SplashPath'es are created using
+ convertPath(GfxState *, GfxPath *), and are only temporary,
+ i.e. with function scope.
+
+ Returning a SplashPath instead of a pointer from convertPath()
+ - which is cheap due to the move constructor - saves recurrent
+ new/delete's for each stroke/fill/... operation.
+
+ poppler/SplashOutputDev.cc | 69
+ ++++++++++++++++------------------------------
+ poppler/SplashOutputDev.h | 2 +-
+ 2 files changed, 25 insertions(+), 46 deletions(-)
+
+commit a31a9e1b9a1eefcea4c8e08f2d84deb0ac6cc4ae
+Author: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Date: Fri Aug 31 00:23:32 2018 +0200
+
+ SplashPath: Add move constructor
+
+ After moving, the new SplashPath is in the same state as it
+ has been copy constructed, the moved from is in the same
+ state as default constructed, i.e. empty.
+
+ splash/SplashPath.cc | 17 +++++++++++++++++
+ splash/SplashPath.h | 1 +
+ 2 files changed, 18 insertions(+)
+
+commit 2190b9997ac786189368fc03e46e540c308f11b5
+Author: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Date: Wed Aug 29 00:21:57 2018 +0200
+
+ Allocate temporary SplashXPath on the stack
+
+ SplashXPath is only used inside the each fill function, but newer
+ passed to the outside. As it is small, there is no reason not to
+ allocate it on the stack.
+
+ splash/Splash.cc | 36 +++++++++++++-----------------------
+ 1 file changed, 13 insertions(+), 23 deletions(-)
+
+commit 38caf0adac8811e663b51656638177397f1400f6
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Fri Aug 31 10:00:15 2018 +0200
+
+ Add clang + libc++ testing pipeline
+
+ Would have catched the missing array include in PSOutputDev
+
+ .gitlab-ci.yml | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit 4244a048e55d7cce0caddc68b6bb21983e670bc4
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 31 07:33:31 2018 +0200
+
+ Replace #pragma once by standard-supported include guards and add
+ missing copyright preamble for new header.
+
+ goo/GooCheckedOps.h | 15 ++++++++++++++-
+ goo/gmem.h | 5 ++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 5671d3acc6a723ac3cb63866e2f429e0f0075c68
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Thu Aug 30 21:27:13 2018 +0200
+
+ Extend checked operations header with support for Clang in addition
+ to checking for GCC version 5 or later.
+
+ goo/GooCheckedOps.h | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit ed28a5612fc0bf8580ccd360ae086fc715d19b35
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Thu Aug 30 20:56:33 2018 +0200
+
+ Fix delta decoding for Type1C fonts to avoid signed integer
+ overflow. oss-fuzz/8424
+
+ fofi/FoFiType1C.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit de20e92a70e73d828984f41f52212051fba51700
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Thu Aug 30 20:54:17 2018 +0200
+
+ Factor out overflow-checked multiplication into a separate header
+ for extension and reuse.
+
+ goo/GooCheckedOps.h | 32 ++++++++++++++++++++++++++++++++
+ goo/gmem.h | 16 ++--------------
+ 2 files changed, 34 insertions(+), 14 deletions(-)
+
+commit 3407c5c8003e67deba2b477741ac471927d40f14
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 31 07:38:34 2018 +0200
+
+ Reintroduce the assertion in Array::remove since there it is not
+ possible to check any return value.
+
+ poppler/Array.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2c25d197c921e292f49aa2b25f4006acd57c1440
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Thu Aug 30 20:26:55 2018 +0200
+
+ Remove index out of range assertions from Array getters
+
+ A lot of code seems to have been incompatible with the recently
+ removed DEBUG_MEM
+ flag, i.e. it relied on the Array getters returning a null object
+ when the index
+ was out of range and rather checked the returned object type (since
+ they had to do
+ that in any case) than the index.
+
+ Due to this, debug builds became much harder to test, especially
+ using fuzzing. This
+ commit thereby removes the assertions to restore the situation when
+ DEBUG_MEM was
+ present but disabeld by default and should thereby fix oss-fuzz/10121.
+
+ poppler/Array.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 987bbb684e688651e3d06502e2ff9b6f08130538
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 30 22:49:19 2018 +0200
+
+ PSOutputDev: Hopefully fix compilation under MSVC
+
+ poppler/PSOutputDev.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit df818b383cf4fa402b89f7b2dd0f958a749a4790
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 30 20:46:20 2018 +0200
+
+ SplashPath: Fix overflow check
+
+ What signals overflow is size being 0 not length being 0
+
+ splash/SplashPath.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 23d570a6f47bc9bc7bf0bcb5dd561885c9a2c55a
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 30 18:54:55 2018 +0200
+
+ SplashPath: Check for overflow
+
+ fixes oss-fuzz/10120
+
+ splash/SplashPath.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit ad107bbb8e4d8eb1a23e530d040d5b11bb8ff859
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 30 18:28:50 2018 +0200
+
+ JBIG2Bitmap: Fix overflow check
+
+ Fixes oss-fuzz/10113
+
+ poppler/JBIG2Stream.cc | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit e3a3e3fa996f318c36f9926fa8cc5dfc9edfac20
+Author: Philipp Knechtges <philipp-dev@knechtges.com>
+Date: Sun Aug 26 19:37:29 2018 +0200
+
+ PSOutputDev: add native support for type 7 shadings when using level 3
+
+ Type 7 shadings are identical for PS and PDF, so we can just emit
+ the corresponding
+ information rather than tiling the whole domain.
+
+ poppler/PSOutputDev.cc | 55
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PSOutputDev.h | 4 +++-
+ 2 files changed, 58 insertions(+), 1 deletion(-)
+
+commit de34900993bff73c8da651319027b2fa8c490172
+Author: Ed Porras <ed@motologic.com>
+Date: Sun Aug 26 20:24:23 2018 +0200
+
+ fix macOS compilation due to boolean define in jpeglib
+
+ typedef enum { FALSE = 0, TRUE = 1 } boolean;
+
+ goo/JpegWriter.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit be05f7640ca13a6eb327dfac0073acc5dae1e3b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Wed Aug 29 19:02:34 2018 +0200
+
+ Add (c) of the last few commits
+
+ goo/gmem.h | 1 +
+ poppler/Array.cc | 1 +
+ poppler/CairoRescaleBox.cc | 1 +
+ poppler/GfxFont.cc | 1 +
+ poppler/Object.cc | 1 +
+ poppler/poppler-config.h.cmake | 1 +
+ utils/pdfdetach.cc | 1 +
+ utils/pdffonts.cc | 1 +
+ utils/pdfimages.cc | 1 +
+ utils/pdfinfo.cc | 1 +
+ utils/pdftocairo.cc | 1 +
+ utils/pdftohtml.cc | 1 +
+ utils/pdftoppm.cc | 2 +-
+ utils/pdftops.cc | 1 +
+ utils/pdftotext.cc | 1 +
+ 15 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 7d523aeae16daf2d504c058031fff90a1a17bf64
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon Aug 27 20:03:17 2018 +0200
+
+ Use GCC instrinsics to perform overflow checking in the gmem
+ allocation functions.
+
+ goo/gmem.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 2b4371b434b27874b64742dcd885e4f303082810
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon Aug 27 19:55:44 2018 +0200
+
+ Turn gmem into a header-only wrapper to allow unnecessary branches
+ to be optimized away and function call overhead to be aovided.
+
+ CMakeLists.txt | 1 -
+ goo/gmem.cc | 171
+ -----------------------------------------
+ goo/gmem.h | 185
+ +++++++++++++++++++++++++++++++++++----------
+ poppler/CairoRescaleBox.cc | 6 +-
+ poppler/GfxFont.cc | 2 +-
+ 5 files changed, 147 insertions(+), 218 deletions(-)
+
+commit c362ab1b97f20c5b73b3bad8d52015f679178748
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon Aug 27 19:42:29 2018 +0200
+
+ Remove DEBUG_MEM from Object since this uses RAII now and hence
+ cannot leak. (The existing tracking also is not thread-safe and
+ hence unreliable.)
+
+ poppler/Object.cc | 31 -------------------------------
+ poppler/Object.h | 17 -----------------
+ poppler/poppler-config.h.cmake | 3 +--
+ utils/pdfdetach.cc | 3 ---
+ utils/pdffonts.cc | 3 ---
+ utils/pdfimages.cc | 3 ---
+ utils/pdfinfo.cc | 3 ---
+ utils/pdftocairo.cc | 3 ---
+ utils/pdftohtml.cc | 3 ---
+ utils/pdftoppm.cc | 3 ---
+ utils/pdftops.cc | 3 ---
+ utils/pdftotext.cc | 3 ---
+ 12 files changed, 1 insertion(+), 77 deletions(-)
+
+commit 122b3ca5838f9648646d7a2940badaae86756f03
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon Aug 27 19:39:20 2018 +0200
+
+ Replace specific DEBUG_MEM in Array implementation by debug
+ assertions.
+
+ poppler/Array.cc | 16 ++++------------
+ 1 file changed, 4 insertions(+), 12 deletions(-)
+
+commit f89446f6917a869b0f1a80fcc8ce81a7213dade4
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon Aug 27 19:37:25 2018 +0200
+
+ Remove generic heap debugging from gmem since external tools and
+ compiler instrumentation achieve the same effect.
+
+ goo/gmem.cc | 151
+ ----------------------------------------------------
+ goo/gmem.h | 9 ----
+ utils/pdfdetach.cc | 1 -
+ utils/pdffonts.cc | 1 -
+ utils/pdfimages.cc | 1 -
+ utils/pdfinfo.cc | 1 -
+ utils/pdftocairo.cc | 1 -
+ utils/pdftohtml.cc | 1 -
+ utils/pdftoppm.cc | 1 -
+ utils/pdftops.cc | 1 -
+ utils/pdftotext.cc | 1 -
+ 11 files changed, 169 deletions(-)
+
+commit 38b67245941a8672372953142b06c80cd0a142c0
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon Aug 27 19:27:41 2018 +0200
+
+ Remove gmempp implementing C++ memory allocation operators using
+ gmalloc for heap debugging.
+
+ CMakeLists.txt | 1 -
+ goo/gmempp.cc | 32 --------------------------------
+ 2 files changed, 33 deletions(-)
+
+commit d62d65c21f01c7b0a7c28adebcab43d667bcaed9
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Sat Aug 25 20:06:13 2018 +0200
+
+ Use --output-on-failure ctest flag to make failed CI runs more
+ informative.
+
+ .gitlab-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 93b214986aa89bc085c7937f63e5eafe795d985c
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Fri Aug 24 07:42:52 2018 +0200
+
+ Reconstruct iterator via index arithmetic instead of relying on a
+ non-standard constructor to fix builds on MSVC.
+
+ poppler/Dict.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit dcd8ad25023db542ade5edc23fc5f943d8ee6376
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 23 23:07:41 2018 +0200
+
+ Also delete Object::dictAdd that takes a char *
+
+ Makes sure noone gets a char * -> const char * promotion via Object
+
+ poppler/Object.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit d63564b2bca955c7ef6ec694e3c64f9e4ee46d57
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 23 23:10:57 2018 +0200
+
+ Add Adam's copyright for the last patchset
+
+ poppler/Annot.cc | 1 +
+ poppler/Catalog.cc | 1 +
+ poppler/Catalog.h | 1 +
+ poppler/Dict.cc | 1 +
+ poppler/Dict.h | 1 +
+ poppler/Form.cc | 1 +
+ poppler/Object.h | 1 +
+ poppler/PDFDoc.cc | 2 +-
+ poppler/Parser.cc | 1 +
+ utils/pdfunite.cc | 1 +
+ 10 files changed, 10 insertions(+), 1 deletion(-)
+
+commit ff2b670062d1315435b418f7ce47b28adb4b789b
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Thu Aug 23 20:29:08 2018 +0200
+
+ Delete the previously ownership taking overload of Dict::add to
+ avoid unexpected memory leaks due to the initial API change.
+
+ poppler/Dict.h | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 8cb364059d3a8d502811565acd166116dbcd0785
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue May 8 18:54:32 2018 +0200
+
+ Adjust all users of Dict::add to avoid leaking memory due to by now
+ unnecessary calls to copyString.
+
+ poppler/Annot.cc | 28 ++++++++++++++--------------
+ poppler/Gfx.cc | 9 +++------
+ poppler/Object.h | 4 ++--
+ poppler/PDFDoc.cc | 8 ++++----
+ poppler/Parser.cc | 8 +++-----
+ utils/pdfunite.cc | 4 ++--
+ 6 files changed, 28 insertions(+), 33 deletions(-)
+
+commit d479e37d34435c6afedf1343a7f60334f351220c
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue May 8 18:19:03 2018 +0200
+
+ Fix linking errors in release builds due to non exported weak symbols.
+
+ poppler/Dict.cc | 4 ++++
+ poppler/Dict.h | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit d4230e3b72d22a24ffe747891a15635ebf0df628
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue May 8 08:32:03 2018 +0200
+
+ But do use swap-and-pop if the Dict is still small enough to be
+ unsorted.
+
+ poppler/Dict.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit ca202af16ac9bd177d7417f3e74b8987e9256bc6
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Mon May 7 22:58:43 2018 +0200
+
+ Try to simplify Dict by implementing it in terms of std::vector
+ and std::string.
+
+ poppler/Catalog.cc | 2 +-
+ poppler/Catalog.h | 2 +-
+ poppler/Dict.cc | 240
+ ++++++++++++++++-------------------------------------
+ poppler/Dict.h | 46 +++++-----
+ poppler/Form.cc | 2 +-
+ poppler/Object.h | 4 +-
+ 6 files changed, 99 insertions(+), 197 deletions(-)
+
+commit 670171ba7507bc8ea39c3a33316c86b68fed5e0d
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Thu Aug 23 18:11:45 2018 +0200
+
+ Don't abort if the SampleFunction has too many samples
+
+ Fixes issue #634
+
+ poppler/Function.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 5fbce88ec9f6d360c5b6436837dfa760c8fa8d95
+Author: Volker Krause <vkrause@kde.org>
+Date: Thu Aug 23 00:56:27 2018 +0200
+
+ Fix memory issues in GfxImageColorMap copy ctor
+
+ - byte_lookup and lookup2 could contain uninitialized memory
+ - lookup2 was not copied at all
+ - lookup could be copied with the wrong size
+
+ Issue #145
+
+ poppler/GfxState.cc | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit 2b5f35e59d234aed0805f0ea8ac5086e35837153
+Author: Oliver Sander <oliver.sander@tu-dresden.de>
+Date: Tue Nov 28 16:40:40 2017 +0100
+
+ Document the OutputDev::clip and OutputDev::oeClip methods
+
+ poppler/OutputDev.h | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 2a67883de1c896c5a8956226db7871e97724ed2b
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Wed Aug 22 06:10:29 2018 +0200
+
+ Also install Curl development files since it is a default enabled
+ dependency.
+
+ .gitlab-ci.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c220ef254f326866016930ac9c1c2b430fcb11ea
+Author: Albert Astals Cid <aacid@kde.org>
+Date: Wed Aug 22 00:57:33 2018 +0200
+
+ Fix uninitialized memory read
+
+ Fixes oss-fuzz/10009
+
+ poppler/Gfx.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b8082c67943ea7ef7c115b86cffb0785da32d227
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue Aug 21 20:21:36 2018 +0200
+
+ Since the CI directory is cached, we need to make sure we create it
+ if necessary instead of failing.
+
+ .gitlab-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f1b8626e021a11d2b649be69c563a2a9af210c84
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue Aug 21 08:35:31 2018 +0200
+
+ Use a proper UTF-8 locale for non-ASCII file names in the tests and
+ rebase onto Debian unstable
+
+ .gitlab-ci.yml | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit 534aca90732c199e96057111272afbc22796ea60
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue Aug 21 08:13:10 2018 +0200
+
+ Also download test-data to be able to run unit tests
+
+ .gitlab-ci.yml | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 78f8a6abed64a1b9ad320587b614ee87bc7791ab
+Author: Adam Reichold <adam.reichold@t-online.de>
+Date: Tue Aug 21 08:00:41 2018 +0200
+
+ Add initial GitLab CI manifest
+
+ .gitlab-ci.yml | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
commit c666833e4163a93451eab27c675af9ca82d11593
Author: Albert Astals Cid <aacid@kde.org>
Date: Sun Aug 19 23:37:51 2018 +0200
diff --git a/Build/source/libs/poppler/poppler-src/NEWS b/Build/source/libs/poppler/poppler-src/NEWS
index 485f89ea57a..e38866e2c8a 100644
--- a/Build/source/libs/poppler/poppler-src/NEWS
+++ b/Build/source/libs/poppler/poppler-src/NEWS
@@ -1,3 +1,34 @@
+Release 0.69.0
+ core:
+ * Add annotation font color
+ * Splash: Some speed improvements
+ * PSOutputDev: add native support for type 7 shadings when using level 3
+ * Add support for PDF subtype property
+ * Link: Fix memory leak regarding next actions
+ * Fix handling of Signature Info Location and Reason
+ * Fix errors in computation of type3 glyphs transformation matrix
+ * Reimplement Dict class in a more modern way
+ * Fix security issues found by oss-fuzz
+ * Fix memory issues in GfxImageColorMap copy ctor
+ * Don't abort if the SampleFunction has too many samples. Issue #634
+ * Document the OutputDev::clip and OutputDev::oeClip methods
+ * fix macOS compilation due to boolean define in jpeglib
+ * Split GDir and GDirEntry out of gfile.h. Issue #370
+
+ qt5:
+ * Add annotation font color
+
+ cpp:
+
+ utils:
+ * pdfinfo: Show PDF subtype
+ * pdftotext: Fix only outputs first page content with -bbox-layout option. Issue #88
+ * pdftotext: Fix memory leak in printLine
+
+
+ build system:
+ * Require C++14
+
Release 0.68.0
core:
* Add Reason and Location to SignatureInfo. Bug #107299
diff --git a/Build/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc b/Build/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc
index caa4b42b6cf..ebf68a44e94 100644
--- a/Build/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc
+++ b/Build/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc
@@ -15,6 +15,7 @@
//
// Copyright (C) 2009, 2010, 2017, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -2663,7 +2664,14 @@ int FoFiType1C::getDeltaIntArray(int *arr, int maxLen) {
}
x = 0;
for (i = 0; i < n; ++i) {
- x += (int)ops[i].num;
+ int y;
+ if (unlikely(isinf(ops[i].num))) {
+ return i;
+ }
+ if (checkedAdd(x, (int)ops[i].num, &y)) {
+ return i;
+ }
+ x = y;
arr[i] = x;
}
return n;
diff --git a/Build/source/libs/poppler/poppler-src/goo/GooCheckedOps.h b/Build/source/libs/poppler/poppler-src/goo/GooCheckedOps.h
new file mode 100644
index 00000000000..3da6b337f64
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-src/goo/GooCheckedOps.h
@@ -0,0 +1,49 @@
+//========================================================================
+//
+// GooCheckedOps.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
+//
+//========================================================================
+
+#ifndef GOO_CHECKED_OPS_H
+#define GOO_CHECKED_OPS_H
+
+#include <climits>
+
+inline bool checkedAssign(long long lz, int *z) {
+ static_assert(LLONG_MAX > INT_MAX, "Need type larger than int to perform overflow checks.");
+
+ if (lz > INT_MAX || lz < INT_MIN) {
+ return true;
+ }
+
+ *z = static_cast<int>(lz);
+ return false;
+}
+
+#ifndef __has_builtin
+ #define __has_builtin(x) 0
+#endif
+
+inline bool checkedAdd(int x, int y, int *z) {
+#if __GNUC__ >= 5 || __has_builtin(__builtin_sadd_overflow)
+ return __builtin_sadd_overflow(x, y, z);
+#else
+ const auto lz = static_cast<long long>(x) + static_cast<long long>(y);
+ return checkedAssign(lz, z);
+#endif
+}
+
+inline bool checkedMultiply(int x, int y, int *z) {
+#if __GNUC__ >= 5 || __has_builtin(__builtin_smul_overflow)
+ return __builtin_smul_overflow(x, y, z);
+#else
+ const auto lz = static_cast<long long>(x) * static_cast<long long>(y);
+ return checkedAssign(lz, z);
+#endif
+}
+
+#endif // GOO_CHECKED_OPS_H
diff --git a/Build/source/libs/poppler/poppler-src/goo/JpegWriter.cc b/Build/source/libs/poppler/poppler-src/goo/JpegWriter.cc
index 16c97afe768..26fa77a7ca6 100644
--- a/Build/source/libs/poppler/poppler-src/goo/JpegWriter.cc
+++ b/Build/source/libs/poppler/poppler-src/goo/JpegWriter.cc
@@ -11,6 +11,7 @@
// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de>
// Copyright (C) 2017, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2018 Martin Packman <gzlist@googlemail.com>
+// Copyright (C) 2018 Ed Porras <ed@motologic.com>
//
//========================================================================
@@ -143,7 +144,7 @@ bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
}
// Set whether to compute optimal Huffman coding tables
- priv->cinfo.optimize_coding = priv->optimize;
+ priv->cinfo.optimize_coding = static_cast<boolean>(priv->optimize);
// Get ready for data
jpeg_start_compress(&priv->cinfo, TRUE);
diff --git a/Build/source/libs/poppler/poppler-src/goo/gdir.h b/Build/source/libs/poppler/poppler-src/goo/gdir.h
new file mode 100644
index 00000000000..1eb1dae5856
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-src/goo/gdir.h
@@ -0,0 +1,91 @@
+//========================================================================
+//
+// gfile.h
+//
+// Miscellaneous file and directory name manipulation.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2009, 2011, 2012, 2017, 2018 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com>
+// Copyright (C) 2013, 2017 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com>
+// Copyright (C) 2014 Peter Breitenlohner <peb@mppmu.mpg.de>
+// Copyright (C) 2017 Christoph Cullmann <cullmann@kde.org>
+// Copyright (C) 2017 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2018 Mojca Miklavec <mojca@macports.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GDIR_H
+#define GDIR_H
+
+#include "poppler-config.h"
+#include "gtypes.h"
+
+class GooString;
+
+//------------------------------------------------------------------------
+// GDir and GDirEntry
+//------------------------------------------------------------------------
+
+class GDirEntry {
+public:
+
+ GDirEntry(char *dirPath, char *nameA, GBool doStat);
+ ~GDirEntry();
+ GooString *getName() { return name; }
+ GooString *getFullPath() { return fullPath; }
+ GBool isDir() { return dir; }
+
+private:
+ GDirEntry(const GDirEntry &other);
+ GDirEntry& operator=(const GDirEntry &other);
+
+ GooString *name; // dir/file name
+ GooString *fullPath;
+ GBool dir; // is it a directory?
+};
+
+class GDir {
+public:
+
+ GDir(char *name, GBool doStatA = gTrue);
+ ~GDir();
+ GDirEntry *getNextEntry();
+ void rewind();
+
+private:
+ GDir(const GDir &other);
+ GDir& operator=(const GDir &other);
+
+ GooString *path; // directory path
+ GBool doStat; // call stat() for each entry?
+#if defined(_WIN32)
+ WIN32_FIND_DATAA ffd;
+ HANDLE hnd;
+#elif defined(ACORN)
+#elif defined(MACOS)
+#else
+ DIR *dir; // the DIR structure from opendir()
+#ifdef VMS
+ GBool needParent; // need to return an entry for [-]
+#endif
+#endif
+};
+
+#endif
diff --git a/Build/source/libs/poppler/poppler-src/goo/gfile.cc b/Build/source/libs/poppler/poppler-src/goo/gfile.cc
index 381a0ce265d..720f75aa797 100644
--- a/Build/source/libs/poppler/poppler-src/goo/gfile.cc
+++ b/Build/source/libs/poppler/poppler-src/goo/gfile.cc
@@ -56,6 +56,7 @@
#include <limits>
#include "GooString.h"
#include "gfile.h"
+#include "gdir.h"
// Some systems don't define this, so just make it something reasonably
// large.
diff --git a/Build/source/libs/poppler/poppler-src/goo/gfile.h b/Build/source/libs/poppler/poppler-src/goo/gfile.h
index 25595aae6d4..e826caac37d 100644
--- a/Build/source/libs/poppler/poppler-src/goo/gfile.h
+++ b/Build/source/libs/poppler/poppler-src/goo/gfile.h
@@ -169,53 +169,4 @@ private:
#endif // _WIN32
};
-//------------------------------------------------------------------------
-// GDir and GDirEntry
-//------------------------------------------------------------------------
-
-class GDirEntry {
-public:
-
- GDirEntry(char *dirPath, char *nameA, GBool doStat);
- ~GDirEntry();
- GooString *getName() { return name; }
- GooString *getFullPath() { return fullPath; }
- GBool isDir() { return dir; }
-
-private:
- GDirEntry(const GDirEntry &other);
- GDirEntry& operator=(const GDirEntry &other);
-
- GooString *name; // dir/file name
- GooString *fullPath;
- GBool dir; // is it a directory?
-};
-
-class GDir {
-public:
-
- GDir(char *name, GBool doStatA = gTrue);
- ~GDir();
- GDirEntry *getNextEntry();
- void rewind();
-
-private:
- GDir(const GDir &other);
- GDir& operator=(const GDir &other);
-
- GooString *path; // directory path
- GBool doStat; // call stat() for each entry?
-#if defined(_WIN32)
- WIN32_FIND_DATAA ffd;
- HANDLE hnd;
-#elif defined(ACORN)
-#elif defined(MACOS)
-#else
- DIR *dir; // the DIR structure from opendir()
-#ifdef VMS
- GBool needParent; // need to return an entry for [-]
-#endif
-#endif
-};
-
#endif
diff --git a/Build/source/libs/poppler/poppler-src/goo/gmem.cc b/Build/source/libs/poppler/poppler-src/goo/gmem.cc
deleted file mode 100644
index f118fd715d4..00000000000
--- a/Build/source/libs/poppler/poppler-src/goo/gmem.cc
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * gmem.c
- *
- * Memory routines with out-of-memory checking.
- *
- * Copyright 1996-2003 Glyph & Cog, LLC
- */
-
-//========================================================================
-//
-// Modified under the Poppler project - http://poppler.freedesktop.org
-//
-// All changes made under the Poppler project to this file are licensed
-// under GPL version 2 or later
-//
-// Copyright (C) 2005 Takashi Iwai <tiwai@suse.de>
-// Copyright (C) 2007-2010, 2012 Albert Astals Cid <aacid@kde.org>
-// Copyright (C) 2008 Jonathan Kew <jonathan_kew@sil.org>
-//
-// To see a description of the changes please see the Changelog file that
-// came with your tarball or type make ChangeLog if you are building from git
-//
-//========================================================================
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <limits.h>
-#include "gmem.h"
-
-#ifdef DEBUG_MEM
-
-typedef struct _GMemHdr {
- unsigned int magic;
- int size;
- int index;
- struct _GMemHdr *next, *prev;
-} GMemHdr;
-
-#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7)
-#define gMemTrlSize (sizeof(long))
-
-#define gMemMagic 0xabcd9999
-
-#if gmemTrlSize==8
-#define gMemDeadVal 0xdeadbeefdeadbeefUL
-#else
-#define gMemDeadVal 0xdeadbeefUL
-#endif
-
-/* round data size so trailer will be aligned */
-#define gMemDataSize(size) \
- ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize)
-
-static GMemHdr *gMemHead = NULL;
-static GMemHdr *gMemTail = NULL;
-
-static int gMemIndex = 0;
-static int gMemAlloc = 0;
-static int gMemInUse = 0;
-
-#endif /* DEBUG_MEM */
-
-inline static void *gmalloc(size_t size, bool checkoverflow) {
-#ifdef DEBUG_MEM
- int size1;
- char *mem;
- GMemHdr *hdr;
- void *data;
- unsigned long *trl, *p;
-
- if (size == 0) {
- return NULL;
- }
- size1 = gMemDataSize(size);
- if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) {
- fprintf(stderr, "Out of memory\n");
- if (checkoverflow) return NULL;
- else exit(1);
- }
- hdr = (GMemHdr *)mem;
- data = (void *)(mem + gMemHdrSize);
- trl = (unsigned long *)(mem + gMemHdrSize + size1);
- hdr->magic = gMemMagic;
- hdr->size = size;
- hdr->index = gMemIndex++;
- if (gMemTail) {
- gMemTail->next = hdr;
- hdr->prev = gMemTail;
- gMemTail = hdr;
- } else {
- hdr->prev = NULL;
- gMemHead = gMemTail = hdr;
- }
- hdr->next = NULL;
- ++gMemAlloc;
- gMemInUse += size;
- for (p = (unsigned long *)data; p <= trl; ++p) {
- *p = gMemDeadVal;
- }
- return data;
-#else
- void *p;
-
- if (size == 0) {
- return nullptr;
- }
- if (!(p = malloc(size))) {
- fprintf(stderr, "Out of memory\n");
- if (checkoverflow) return nullptr;
- else exit(1);
- }
- return p;
-#endif
-}
-
-void *gmalloc(size_t size) {
- return gmalloc(size, false);
-}
-
-void *gmalloc_checkoverflow(size_t size) {
- return gmalloc(size, true);
-}
-
-inline static void *grealloc(void *p, size_t size, bool checkoverflow) {
-#ifdef DEBUG_MEM
- GMemHdr *hdr;
- void *q;
- int oldSize;
-
- if (size == 0) {
- if (p) {
- gfree(p);
- }
- return NULL;
- }
- if (p) {
- hdr = (GMemHdr *)((char *)p - gMemHdrSize);
- oldSize = hdr->size;
- q = gmalloc(size, checkoverflow);
- memcpy(q, p, size < oldSize ? size : oldSize);
- gfree(p);
- } else {
- q = gmalloc(size, checkoverflow);
- }
- return q;
-#else
- void *q;
-
- if (size == 0) {
- if (p) {
- free(p);
- }
- return nullptr;
- }
- if (p) {
- q = realloc(p, size);
- } else {
- q = malloc(size);
- }
- if (!q) {
- fprintf(stderr, "Out of memory\n");
- if (checkoverflow) return nullptr;
- else exit(1);
- }
- return q;
-#endif
-}
-
-void *grealloc(void *p, size_t size) {
- return grealloc(p, size, false);
-}
-
-void *grealloc_checkoverflow(void *p, size_t size) {
- return grealloc(p, size, true);
-}
-
-inline static void *gmallocn(int nObjs, int objSize, bool checkoverflow) {
- if (nObjs == 0) {
- return nullptr;
- }
- if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
- fprintf(stderr, "Bogus memory allocation size\n");
- if (checkoverflow) return nullptr;
- else exit(1);
- }
- const int n = nObjs * objSize;
- return gmalloc(n, checkoverflow);
-}
-
-void *gmallocn(int nObjs, int objSize) {
- return gmallocn(nObjs, objSize, false);
-}
-
-void *gmallocn_checkoverflow(int nObjs, int objSize) {
- return gmallocn(nObjs, objSize, true);
-}
-
-inline static void *gmallocn3(int a, int b, int c, bool checkoverflow) {
- int n = a * b;
- if (b <= 0 || a < 0 || a >= INT_MAX / b) {
- fprintf(stderr, "Bogus memory allocation size\n");
- if (checkoverflow) return nullptr;
- else exit(1);
- }
- return gmallocn(n, c, checkoverflow);
-}
-
-void *gmallocn3(int a, int b, int c) {
- return gmallocn3(a, b, c, false);
-}
-
-void *gmallocn3_checkoverflow(int a, int b, int c) {
- return gmallocn3(a, b, c, true);
-}
-
-inline static void *greallocn(void *p, int nObjs, int objSize, bool checkoverflow) {
- if (nObjs == 0) {
- if (p) {
- gfree(p);
- }
- return nullptr;
- }
- if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
- fprintf(stderr, "Bogus memory allocation size\n");
- if (checkoverflow) {
- gfree(p);
- return nullptr;
- } else {
- exit(1);
- }
- }
- const int n = nObjs * objSize;
- return grealloc(p, n, checkoverflow);
-}
-
-void *greallocn(void *p, int nObjs, int objSize) {
- return greallocn(p, nObjs, objSize, false);
-}
-
-void *greallocn_checkoverflow(void *p, int nObjs, int objSize) {
- return greallocn(p, nObjs, objSize, true);
-}
-
-void gfree(void *p) {
-#ifdef DEBUG_MEM
- int size;
- GMemHdr *hdr;
- unsigned long *trl, *clr;
-
- if (p) {
- hdr = (GMemHdr *)((char *)p - gMemHdrSize);
- if (hdr->magic == gMemMagic &&
- ((hdr->prev == NULL) == (hdr == gMemHead)) &&
- ((hdr->next == NULL) == (hdr == gMemTail))) {
- if (hdr->prev) {
- hdr->prev->next = hdr->next;
- } else {
- gMemHead = hdr->next;
- }
- if (hdr->next) {
- hdr->next->prev = hdr->prev;
- } else {
- gMemTail = hdr->prev;
- }
- --gMemAlloc;
- gMemInUse -= hdr->size;
- size = gMemDataSize(hdr->size);
- trl = (unsigned long *)((char *)hdr + gMemHdrSize + size);
- if (*trl != gMemDeadVal) {
- fprintf(stderr, "Overwrite past end of block %d at address %p\n",
- hdr->index, p);
- }
- for (clr = (unsigned long *)hdr; clr <= trl; ++clr) {
- *clr = gMemDeadVal;
- }
- free(hdr);
- } else {
- fprintf(stderr, "Attempted to free bad address %p\n", p);
- }
- }
-#else
- if (p) {
- free(p);
- }
-#endif
-}
-
-#ifdef DEBUG_MEM
-void gMemReport(FILE *f) {
- GMemHdr *p;
-
- fprintf(f, "%d memory allocations in all\n", gMemIndex);
- if (gMemAlloc > 0) {
- fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc);
- fprintf(f, " index size\n");
- fprintf(f, "-------- --------\n");
- for (p = gMemHead; p; p = p->next) {
- fprintf(f, "%8d %8d\n", p->index, p->size);
- }
- } else {
- fprintf(f, "No memory blocks left allocated\n");
- }
-}
-#endif
-
-char *copyString(const char *s) {
- char *s1;
-
- s1 = (char *)gmalloc(strlen(s) + 1);
- strcpy(s1, s);
- return s1;
-}
-
-char *gstrndup(const char *s, size_t n) {
- char *s1 = (char*)gmalloc(n + 1); /* cannot return NULL for size > 0 */
- s1[n] = '\0';
- memcpy(s1, s, n);
- return s1;
-}
diff --git a/Build/source/libs/poppler/poppler-src/goo/gmem.h b/Build/source/libs/poppler/poppler-src/goo/gmem.h
index 4c76f0fb65e..9b187c1dafc 100644
--- a/Build/source/libs/poppler/poppler-src/goo/gmem.h
+++ b/Build/source/libs/poppler/poppler-src/goo/gmem.h
@@ -16,6 +16,7 @@
// Copyright (C) 2005 Takashi Iwai <tiwai@suse.de>
// Copyright (C) 2007-2010, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2008 Jonathan Kew <jonathan_kew@sil.org>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -25,68 +26,155 @@
#ifndef GMEM_H
#define GMEM_H
-#include <stdio.h>
-#include "poppler-config.h"
+#include <cstring>
+#include <cstdlib>
+#include <cstdio>
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include "GooCheckedOps.h"
-/*
- * Same as malloc, but prints error message and exits if malloc()
- * returns NULL.
- */
-extern void *gmalloc(size_t size);
-extern void *gmalloc_checkoverflow(size_t size);
+/// Same as malloc, but prints error message and exits if malloc() returns NULL.
+inline void *gmalloc(size_t size, bool checkoverflow = false) {
+ if (size == 0) {
+ return nullptr;
+ }
-/*
- * Same as realloc, but prints error message and exits if realloc()
- * returns NULL. If <p> is NULL, calls malloc instead of realloc().
- */
-extern void *grealloc(void *p, size_t size);
-extern void *grealloc_checkoverflow(void *p, size_t size);
+ if (void *p = std::malloc(size)) {
+ return p;
+ }
+
+ std::fputs("Out of memory\n", stderr);
+
+ if (checkoverflow) {
+ return nullptr;
+ }
+
+ std::abort();
+}
+
+inline void *gmalloc_checkoverflow(size_t size) {
+ return gmalloc(size, true);
+}
+
+/// Same as free, but checks for and ignores NULL pointers.
+inline void gfree(void *p) {
+ if (p) {
+ std::free(p);
+ }
+}
+
+/// Same as realloc, but prints error message and exits if realloc() returns NULL.
+/// If <p> is NULL, calls malloc() instead of realloc().
+inline void *grealloc(void *p, size_t size, bool checkoverflow = false) {
+ if (size == 0) {
+ gfree(p);
+ return nullptr;
+ }
+
+ if (void *q = p ? std::realloc(p, size) : std::malloc(size)) {
+ return q;
+ }
+
+ std::fputs("Out of memory\n", stderr);
+
+ if (checkoverflow) {
+ return nullptr;
+ }
+
+ std::abort();
+}
+
+inline void *grealloc_checkoverflow(void *p, size_t size) {
+ return grealloc(p, size, true);
+}
/*
* These are similar to gmalloc and grealloc, but take an object count
- * and size. The result is similar to allocating nObjs * objSize
+ * and size. The result is similar to allocating <count> * <size>
* bytes, but there is an additional error check that the total size
* doesn't overflow an int.
* The gmallocn_checkoverflow variant returns NULL instead of exiting
- * the application if a overflow is detected
+ * the application if a overflow is detected.
*/
-extern void *gmallocn(int nObjs, int objSize);
-extern void *gmallocn_checkoverflow(int nObjs, int objSize);
-extern void *gmallocn3(int a, int b, int c);
-extern void *gmallocn3_checkoverflow(int a, int b, int c);
-extern void *greallocn(void *p, int nObjs, int objSize);
-extern void *greallocn_checkoverflow(void *p, int nObjs, int objSize);
-/*
- * Same as free, but checks for and ignores NULL pointers.
- */
-extern void gfree(void *p);
+inline void *gmallocn(int count, int size, bool checkoverflow = false) {
+ if (count == 0) {
+ return nullptr;
+ }
-#ifdef DEBUG_MEM
-/*
- * Report on unfreed memory.
- */
-extern void gMemReport(FILE *f);
-#else
-#define gMemReport(f)
-#endif
+ int bytes;
+ if (count < 0 || size <= 0 || checkedMultiply(count, size, &bytes)) {
+ std::fputs("Bogus memory allocation size\n", stderr);
-/*
- * Allocate memory and copy a string into it.
- */
-extern char *copyString(const char *s);
+ if (checkoverflow) {
+ return nullptr;
+ }
-/*
- * Allocate memory and copy a limited-length string to it.
- */
-extern char *gstrndup(const char *s, size_t n);
+ std::abort();
+ }
+
+ return gmalloc(bytes, checkoverflow);
+}
+
+inline void *gmallocn_checkoverflow(int count, int size) {
+ return gmallocn(count, size, true);
+}
+
+inline void *gmallocn3(int width, int height, int size, bool checkoverflow = false) {
+ if (width == 0 || height == 0) {
+ return nullptr;
+ }
+
+ int count;
+ int bytes;
+ if (width < 0 || height < 0 || size <= 0 || checkedMultiply(width, height, &count) || checkedMultiply(count, size, &bytes)) {
+ std::fputs("Bogus memory allocation size\n", stderr);
+
+ if (checkoverflow) {
+ return nullptr;
+ }
+
+ std::abort();
+ }
+
+ return gmalloc(bytes, checkoverflow);
+}
+
+inline void *greallocn(void *p, int count, int size, bool checkoverflow = false) {
+ if (count == 0) {
+ gfree(p);
+ return nullptr;
+ }
+
+ int bytes;
+ if (count < 0 || size <= 0 || checkedMultiply(count, size, &bytes)) {
+ std::fputs("Bogus memory allocation size\n", stderr);
+
+ if (checkoverflow) {
+ gfree(p);
+ return nullptr;
+ }
+
+ std::abort();
+ }
+
+ return grealloc(p, bytes, checkoverflow);
+}
+
+inline void *greallocn_checkoverflow(void *p, int count, int size) {
+ return greallocn(p, count, size, true);
+}
+
+/// Allocate memory and copy a string into it.
+inline char *copyString(const char *s) {
+ char *r = static_cast<char *>(gmalloc(std::strlen(s) + 1, false));
+ return std::strcpy(r, s);
+}
-#ifdef __cplusplus
+/// Allocate memory and copy a limited-length string to it.
+inline char *copyString(const char *s, size_t n) {
+ char *r = static_cast<char *>(gmalloc(n + 1, false));
+ r[n] = '\0';
+ return std::strncpy(r, s, n);
}
-#endif
-#endif
+#endif // GMEM_H
diff --git a/Build/source/libs/poppler/poppler-src/goo/gmempp.cc b/Build/source/libs/poppler/poppler-src/goo/gmempp.cc
deleted file mode 100644
index a70338ca3ce..00000000000
--- a/Build/source/libs/poppler/poppler-src/goo/gmempp.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-//========================================================================
-//
-// gmempp.cc
-//
-// Use gmalloc/gfree for C++ new/delete operators.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <config.h>
-#include "gmem.h"
-
-#ifdef DEBUG_MEM
-
-void *operator new(size_t size) {
- return gmalloc((int)size);
-}
-
-void *operator new[](size_t size) {
- return gmalloc((int)size);
-}
-
-void operator delete(void *p) {
- gfree(p);
-}
-
-void operator delete[](void *p) {
- gfree(p);
-}
-
-#endif
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Annot.cc b/Build/source/libs/poppler/poppler-src/poppler/Annot.cc
index d37824c1d38..61870bd5193 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Annot.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Annot.cc
@@ -38,6 +38,9 @@
// Copyright (C) 2017 Hans-Ulrich Jüttner <huj@froreich-bioscientia.de>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
// Copyright 2018 Andre Heinecke <aheinecke@intevation.de>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
+// Copyright (C) 2018 Dileep Sankhla <sankhla.dileep96@gmail.com>
+// Copyright (C) 2018 Tobias Deiminger <haxtibal@posteo.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -792,6 +795,73 @@ Object AnnotColor::writeToObject(XRef *xref) const {
}
//------------------------------------------------------------------------
+// DefaultAppearance
+//------------------------------------------------------------------------
+
+DefaultAppearance::DefaultAppearance(Object &&fontNameA, double fontPtSizeA, std::unique_ptr<AnnotColor> fontColorA) :
+ fontName(std::move(fontNameA)), fontPtSize(fontPtSizeA), fontColor(std::move(fontColorA)) {
+}
+
+DefaultAppearance::DefaultAppearance(GooString *da) {
+ fontPtSize = -1;
+
+ if (da) {
+ GooList * daToks = new GooList();
+ int i = FormFieldText::tokenizeDA(da, daToks, "Tf");
+
+ if (i >= 1) {
+ fontPtSize = gatof(( (GooString *)daToks->get(i-1) )->getCString());
+ }
+ if (i >= 2) {
+ // We are expecting a name, therefore the first letter should be '/'.
+ if (((const char*)daToks->get(i-2)) && ((const char*)daToks->get(i-2))[0] == '/') {
+ // The +1 is here to skip the leading '/'.
+ fontName = Object(objName, ((const char*)daToks->get(i-2))+1);
+ }
+ }
+ // Scan backwards: we are looking for the last set value
+ for (i = daToks->getLength()-1; i >= 0; --i) {
+ if (!fontColor) {
+ if (!((GooString *)daToks->get(i))->cmp("g") && i >= 1) {
+ fontColor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+ } else if (!((GooString *)daToks->get(i))->cmp("rg") && i >= 3) {
+ fontColor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-3) )->getCString()),
+ gatof(( (GooString *)daToks->get(i-2) )->getCString()),
+ gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+ } else if (!((GooString *)daToks->get(i))->cmp("k") && i >= 4) {
+ fontColor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-4) )->getCString()),
+ gatof(( (GooString *)daToks->get(i-3) )->getCString()),
+ gatof(( (GooString *)daToks->get(i-2) )->getCString()),
+ gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+ }
+ }
+ }
+ deleteGooList(daToks, GooString);
+ }
+}
+
+void DefaultAppearance::setFontName(Object &&fontNameA) {
+ fontName = std::move(fontNameA);
+}
+
+void DefaultAppearance::setFontPtSize(double fontPtSizeA) {
+ fontPtSize = fontPtSizeA;
+}
+
+void DefaultAppearance::setFontColor(std::unique_ptr<AnnotColor> fontColorA) {
+ fontColor = std::move(fontColorA);
+}
+
+GooString *DefaultAppearance::toAppearanceString() const {
+ AnnotAppearanceBuilder appearBuilder;
+ if (fontColor) {
+ appearBuilder.setDrawColor(fontColor.get(), gTrue);
+ }
+ appearBuilder.setTextFont(fontName, fontPtSize);
+ return appearBuilder.buffer()->copy();
+}
+
+//------------------------------------------------------------------------
// AnnotIconFit
//------------------------------------------------------------------------
@@ -1616,17 +1686,17 @@ void AnnotAppearanceBuilder::setDrawColor(const AnnotColor *drawColor, GBool fil
switch (drawColor->getSpace()) {
case AnnotColor::colorCMYK:
- appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n",
+ appearBuf->appendf("{0:.5f} {1:.5f} {2:.5f} {3:.5f} {4:c}\n",
values[0], values[1], values[2], values[3],
fill ? 'k' : 'K');
break;
case AnnotColor::colorRGB:
- appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:s}\n",
+ appearBuf->appendf("{0:.5f} {1:.5f} {2:.5f} {3:s}\n",
values[0], values[1], values[2],
fill ? "rg" : "RG");
break;
case AnnotColor::colorGray:
- appearBuf->appendf("{0:.2f} {1:c}\n",
+ appearBuf->appendf("{0:.5f} {1:c}\n",
values[0],
fill ? 'g' : 'G');
break;
@@ -1636,6 +1706,11 @@ void AnnotAppearanceBuilder::setDrawColor(const AnnotColor *drawColor, GBool fil
}
}
+void AnnotAppearanceBuilder::setTextFont(const Object &fontName, double fontSize) {
+ if (fontName.isName() && strlen(fontName.getName()) > 0)
+ appearBuf->appendf("/{0:s} {1:.2f} Tf\n", fontName.getName(), fontSize);
+}
+
void AnnotAppearanceBuilder::setLineStyleForBorder(const AnnotBorder *border) {
int i, dashLength;
double *dash;
@@ -2593,12 +2668,13 @@ void AnnotLink::draw(Gfx *gfx, GBool printing) {
//------------------------------------------------------------------------
// AnnotFreeText
//------------------------------------------------------------------------
-AnnotFreeText::AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da) :
+AnnotFreeText::AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, const DefaultAppearance &da) :
AnnotMarkup(docA, rect) {
type = typeFreeText;
+ GooString *daStr = da.toAppearanceString();
annotObj.dictSet ("Subtype", Object(objName, "FreeText"));
- annotObj.dictSet("DA", Object(da->copy()));
+ annotObj.dictSet("DA", Object(daStr));
initialize (docA, annotObj.getDict());
}
@@ -2726,14 +2802,10 @@ void AnnotFreeText::setContents(GooString *new_content) {
invalidateAppearance();
}
-void AnnotFreeText::setAppearanceString(GooString *new_string) {
+void AnnotFreeText::setDefaultAppearance(const DefaultAppearance &da) {
delete appearanceString;
- if (new_string) {
- appearanceString = new GooString(new_string);
- } else {
- appearanceString = new GooString();
- }
+ appearanceString = da.toAppearanceString();
update ("DA", Object(appearanceString->copy()));
invalidateAppearance();
@@ -2805,55 +2877,27 @@ void AnnotFreeText::setIntent(AnnotFreeTextIntent new_intent) {
update ("IT", Object(objName, intentName));
}
-static GfxFont * createAnnotDrawFont(XRef * xref, Dict *fontResDict)
+std::unique_ptr<DefaultAppearance> AnnotFreeText::getDefaultAppearance() const {
+ return std::make_unique<DefaultAppearance>(appearanceString);
+}
+
+static GfxFont *createAnnotDrawFont(XRef * xref, Dict *fontResDict)
{
const Ref dummyRef = { -1, -1 };
Dict *fontDict = new Dict(xref);
- fontDict->add(copyString("BaseFont"), Object(objName, "Helvetica"));
- fontDict->add(copyString("Subtype"), Object(objName, "Type0"));
- fontDict->add(copyString("Encoding"), Object(objName, "WinAnsiEncoding"));
+ fontDict->add("BaseFont", Object(objName, "Helvetica"));
+ fontDict->add("Subtype", Object(objName, "Type0"));
+ fontDict->add("Encoding", Object(objName, "WinAnsiEncoding"));
Dict *fontsDict = new Dict(xref);
- fontsDict->add(copyString("AnnotDrawFont"), Object(fontDict));
+ fontsDict->add("AnnotDrawFont", Object(fontDict));
- fontResDict->add(copyString("Font"), Object(fontsDict));
+ fontResDict->add("Font", Object(fontsDict));
return GfxFont::makeFont(xref, "AnnotDrawFont", dummyRef, fontDict);
}
-void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor) {
- fontsize = -1;
- fontcolor = nullptr;
- if (da) {
- GooList * daToks = new GooList();
- int i = FormFieldText::tokenizeDA(da, daToks, "Tf");
-
- if (i >= 1) {
- fontsize = gatof(( (GooString *)daToks->get(i-1) )->getCString());
- // TODO: Font name
- }
- // Scan backwards: we are looking for the last set value
- for (i = daToks->getLength()-1; i >= 0; --i) {
- if (fontcolor == nullptr) {
- if (!((GooString *)daToks->get(i))->cmp("g") && i >= 1) {
- fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-1) )->getCString()));
- } else if (!((GooString *)daToks->get(i))->cmp("rg") && i >= 3) {
- fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-3) )->getCString()),
- gatof(( (GooString *)daToks->get(i-2) )->getCString()),
- gatof(( (GooString *)daToks->get(i-1) )->getCString()));
- } else if (!((GooString *)daToks->get(i))->cmp("k") && i >= 4) {
- fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-4) )->getCString()),
- gatof(( (GooString *)daToks->get(i-3) )->getCString()),
- gatof(( (GooString *)daToks->get(i-2) )->getCString()),
- gatof(( (GooString *)daToks->get(i-1) )->getCString()));
- }
- }
- }
- deleteGooList(daToks, GooString);
- }
-}
-
void AnnotFreeText::generateFreeTextAppearance()
{
double borderWidth, ca = opacity;
@@ -2870,14 +2914,13 @@ void AnnotFreeText::generateFreeTextAppearance()
const double height = rect->y2 - rect->y1;
// Parse some properties from the appearance string
- double fontsize;
- AnnotColor *fontcolor;
- parseAppearanceString(appearanceString, fontsize, fontcolor);
+ DefaultAppearance da{appearanceString};
+
// Default values
- if (fontsize <= 0)
- fontsize = 10;
- if (fontcolor == nullptr)
- fontcolor = new AnnotColor(0, 0, 0); // Black
+ if (da.getFontPtSize() <= 0)
+ da.setFontPtSize(10);
+ if (!da.getFontColor())
+ da.setFontColor(std::make_unique<AnnotColor>(0, 0, 0));
if (!contents)
contents = new GooString ();
@@ -2886,7 +2929,7 @@ void AnnotFreeText::generateFreeTextAppearance()
GBool doStroke = (borderWidth != 0);
if (doFill || doStroke) {
if (doStroke) {
- appearBuilder.setDrawColor(fontcolor, gFalse); // Border color: same as font color
+ appearBuilder.setDrawColor(da.getFontColor(), gFalse); // Border color: same as font color
}
appearBuilder.appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re\n", borderWidth/2, width-borderWidth, height-borderWidth);
if (doFill) {
@@ -2906,17 +2949,17 @@ void AnnotFreeText::generateFreeTextAppearance()
GfxFont *font = createAnnotDrawFont(xref, fontResDict);
// Set font state
- appearBuilder.setDrawColor(fontcolor, gTrue);
- appearBuilder.appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - fontsize * font->getDescent());
- appearBuilder.appendf ("/AnnotDrawFont {0:.2f} Tf\n", fontsize);
+ appearBuilder.setDrawColor(da.getFontColor(), gTrue);
+ appearBuilder.appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - da.getFontPtSize() * font->getDescent());
+ appearBuilder.appendf ("/AnnotDrawFont {0:.2f} Tf\n", da.getFontPtSize());
int i = 0;
double xposPrev = 0;
while (i < contents->getLength()) {
GooString out;
double linewidth, xpos;
- layoutText(contents, &out, &i, font, &linewidth, textwidth/fontsize, nullptr, gFalse);
- linewidth *= fontsize;
+ layoutText(contents, &out, &i, font, &linewidth, textwidth/da.getFontPtSize(), nullptr, gFalse);
+ linewidth *= da.getFontPtSize();
switch (quadding) {
case quaddingCentered:
xpos = (textwidth - linewidth) / 2;
@@ -2928,14 +2971,13 @@ void AnnotFreeText::generateFreeTextAppearance()
xpos = 0;
break;
}
- appearBuilder.appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize);
+ appearBuilder.appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -da.getFontPtSize());
appearBuilder.writeString(out);
appearBuilder.append("Tj\n");
xposPrev = xpos;
}
font->decRefCnt();
- delete fontcolor;
appearBuilder.append ("ET Q\n");
double bbox[4];
@@ -4883,19 +4925,19 @@ void AnnotWidget::generateFieldAppearance(bool *addedDingbatsResource) {
const GooString *appearBuf = appearBuilder.buffer();
// build the appearance stream dictionary
Dict *appearDict = new Dict(xref);
- appearDict->add(copyString("Length"), Object(appearBuf->getLength()));
- appearDict->add(copyString("Subtype"), Object(objName, "Form"));
+ appearDict->add("Length", Object(appearBuf->getLength()));
+ appearDict->add("Subtype", Object(objName, "Form"));
Array *bbox = new Array(xref);
bbox->add(Object(0));
bbox->add(Object(0));
bbox->add(Object(rect->x2 - rect->x1));
bbox->add(Object(rect->y2 - rect->y1));
- appearDict->add(copyString("BBox"), Object(bbox));
+ appearDict->add("BBox", Object(bbox));
// set the resource dictionary
Object *resDict = form->getDefaultResourcesObj();
if (resDict->isDict()) {
- appearDict->add(copyString("Resources"), resDict->copy());
+ appearDict->add("Resources", resDict->copy());
}
// build the appearance stream
@@ -4934,7 +4976,7 @@ void AnnotWidget::updateAppearanceStream()
// Write the AP dictionary
obj1 = Object(new Dict(xref));
- obj1.dictAdd(copyString("N"), Object(updatedAppearanceStream.num, updatedAppearanceStream.gen));
+ obj1.dictAdd("N", Object(updatedAppearanceStream.num, updatedAppearanceStream.gen));
// Update our internal pointers to the appearance dictionary
appearStreams = new AnnotAppearance(doc, &obj1);
@@ -4967,14 +5009,14 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) {
// We are forcing ZaDb but the font does not exist
// so create a fake one
Dict *fontDict = new Dict(gfx->getXRef());
- fontDict->add(copyString("BaseFont"), Object(objName, "ZapfDingbats"));
- fontDict->add(copyString("Subtype"), Object(objName, "Type1"));
+ fontDict->add("BaseFont", Object(objName, "ZapfDingbats"));
+ fontDict->add("Subtype", Object(objName, "Type1"));
Dict *fontsDict = new Dict(gfx->getXRef());
- fontsDict->add(copyString("ZaDb"), Object(fontDict));
+ fontsDict->add("ZaDb", Object(fontDict));
Dict *dict = new Dict(gfx->getXRef());
- dict->add(copyString("Font"), Object(fontsDict));
+ dict->add("Font", Object(fontsDict));
gfx->pushResources(dict);
delete dict;
}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Annot.h b/Build/source/libs/poppler/poppler-src/poppler/Annot.h
index 83c10b397b1..d564c413be1 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Annot.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/Annot.h
@@ -27,6 +27,8 @@
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2013, 2017 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Dileep Sankhla <sankhla.dileep96@gmail.com>
+// Copyright (C) 2018 Tobias Deiminger <haxtibal@posteo.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -40,6 +42,7 @@
#pragma interface
#endif
+#include <memory>
#include "Object.h"
class XRef;
@@ -348,6 +351,33 @@ private:
};
//------------------------------------------------------------------------
+// DefaultAppearance
+//------------------------------------------------------------------------
+
+class DefaultAppearance {
+public:
+
+ DefaultAppearance(Object &&fontNameA, double fontPtSizeA, std::unique_ptr<AnnotColor> fontColorA);
+ DefaultAppearance(GooString *da);
+ void setFontName(Object &&fontNameA);
+ const Object &getFontName() const { return fontName; }
+ void setFontPtSize(double fontPtSizeA);
+ double getFontPtSize() const { return fontPtSize; }
+ void setFontColor(std::unique_ptr<AnnotColor> fontColorA);
+ const AnnotColor *getFontColor() const { return fontColor.get(); }
+ GooString *toAppearanceString() const;
+
+ DefaultAppearance(const DefaultAppearance &) = delete;
+ DefaultAppearance& operator=(const DefaultAppearance&) = delete;
+
+private:
+
+ Object fontName;
+ double fontPtSize;
+ std::unique_ptr<AnnotColor> fontColor;
+};
+
+//------------------------------------------------------------------------
// AnnotIconFit
//------------------------------------------------------------------------
@@ -511,6 +541,7 @@ public:
void setDrawColor(const AnnotColor *color, GBool fill);
void setLineStyleForBorder(const AnnotBorder *border);
+ void setTextFont(const Object &fontName, double fontSize);
void drawCircle(double cx, double cy, double r, GBool fill);
void drawCircleTopLeft(double cx, double cy, double r);
void drawCircleBottomRight(double cx, double cy, double r);
@@ -969,7 +1000,7 @@ public:
intentFreeTextTypeWriter // FreeTextTypeWriter
};
- AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da);
+ AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, const DefaultAppearance &da);
AnnotFreeText(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotFreeText();
@@ -977,14 +1008,14 @@ public:
Object getAppearanceResDict() override;
void setContents(GooString *new_content) override;
- void setAppearanceString(GooString *new_string);
+ void setDefaultAppearance(const DefaultAppearance &da);
void setQuadding(AnnotFreeTextQuadding new_quadding);
void setStyleString(GooString *new_string);
void setCalloutLine(AnnotCalloutLine *line);
void setIntent(AnnotFreeTextIntent new_intent);
// getters
- const GooString *getAppearanceString() const { return appearanceString; }
+ std::unique_ptr<DefaultAppearance> getDefaultAppearance() const;
AnnotFreeTextQuadding getQuadding() const { return quadding; }
// return rc
const GooString *getStyleString() const { return styleString; }
@@ -997,7 +1028,6 @@ public:
protected:
void initialize(PDFDoc *docA, Dict *dict);
- static void parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor);
void generateFreeTextAppearance();
// required
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Array.cc b/Build/source/libs/poppler/poppler-src/poppler/Array.cc
index e8aa34eafe6..f2dc23631f2 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Array.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Array.cc
@@ -18,6 +18,7 @@
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2017 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -32,6 +33,7 @@
#include <stdlib.h>
#include <stddef.h>
+#include <cassert>
#include "goo/gmem.h"
#include "Object.h"
#include "Array.h"
@@ -105,11 +107,8 @@ void Array::add(Object &&elem) {
void Array::remove(int i) {
arrayLocker();
if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
- abort();
-#else
+ assert(i >= 0 && i < length);
return;
-#endif
}
--length;
memmove( static_cast<void*>(elems + i), elems + i + 1, sizeof(elems[0]) * (length - i) );
@@ -117,22 +116,14 @@ void Array::remove(int i) {
Object Array::get(int i, int recursion) const {
if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
- abort();
-#else
return Object(objNull);
-#endif
}
return elems[i].fetch(xref, recursion);
}
Object Array::getNF(int i) const {
if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
- abort();
-#else
return Object(objNull);
-#endif
}
return elems[i].copy();
}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/CairoRescaleBox.cc b/Build/source/libs/poppler/poppler-src/poppler/CairoRescaleBox.cc
index f34b1e1c79c..59a5c190226 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/CairoRescaleBox.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/CairoRescaleBox.cc
@@ -32,6 +32,7 @@
//
// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2012, 2017 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -281,10 +282,10 @@ GBool CairoRescaleBox::downScaleImage(unsigned orig_width, unsigned orig_height,
dest = (unsigned int *)cairo_image_surface_get_data (dest_surface);
dst_stride = cairo_image_surface_get_stride (dest_surface);
- scanline = (uint32_t*)gmallocn3 (orig_width, 1, sizeof(int));
+ scanline = (uint32_t*)gmallocn (orig_width, sizeof(int));
- x_coverage = (int *)gmallocn3 (orig_width, 1, sizeof(int));
- y_coverage = (int *)gmallocn3 (orig_height, 1, sizeof(int));
+ x_coverage = (int *)gmallocn (orig_width, sizeof(int));
+ y_coverage = (int *)gmallocn (orig_height, sizeof(int));
/* we need to allocate enough room for ceil(src_height/dest_height)+1
Example:
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Catalog.cc b/Build/source/libs/poppler/poppler-src/poppler/Catalog.cc
index e6fde7ab34d..55b7528b450 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Catalog.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Catalog.cc
@@ -34,6 +34,7 @@
// Copyright (C) 2015 Even Rouault <even.rouault@spatialys.com>
// Copyright (C) 2016 Masamichi Hosoda <trueroad@trueroad.jp>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -428,7 +429,7 @@ int Catalog::numDests()
return obj->dictGetLength();
}
-char *Catalog::getDestsName(int i)
+const char *Catalog::getDestsName(int i)
{
Object *obj;
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Catalog.h b/Build/source/libs/poppler/poppler-src/poppler/Catalog.h
index 0467159a2d4..5c8c50704b7 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Catalog.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/Catalog.h
@@ -27,6 +27,7 @@
// Copyright (C) 2013 José Aliste <jaliste@src.gnome.org>
// Copyright (C) 2016 Masamichi Hosoda <trueroad@trueroad.jp>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -163,7 +164,7 @@ public:
int numDests();
// Get the i'th named destination name in name-dict
- char *getDestsName(int i);
+ const char *getDestsName(int i);
// Get the i'th named destination link destination in name-dict
LinkDest *getDestsDest(int i);
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Dict.cc b/Build/source/libs/poppler/poppler-src/poppler/Dict.cc
index bc86fd77ad9..0a0ceab3f01 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Dict.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Dict.cc
@@ -22,6 +22,7 @@
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2014 Scott West <scott.gregory.west@gmail.com>
// Copyright (C) 2017 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -35,10 +36,7 @@
#endif
#include <algorithm>
-#include <stddef.h>
-#include <string.h>
-#include "goo/gmem.h"
-#include "Object.h"
+
#include "XRef.h"
#include "Dict.h"
@@ -51,247 +49,164 @@
// Dict
//------------------------------------------------------------------------
-static const int SORT_LENGTH_LOWER_LIMIT = 32;
-
-static inline bool cmpDictEntries(const DictEntry &e1, const DictEntry &e2)
-{
- return strcmp(e1.key, e2.key) < 0;
-}
+constexpr int SORT_LENGTH_LOWER_LIMIT = 32;
-static int binarySearch(const char *key, DictEntry *entries, int length)
-{
- int first = 0;
- int end = length - 1;
- while (first <= end) {
- const int middle = (first + end) / 2;
- const int res = strcmp(key, entries[middle].key);
- if (res == 0) {
- return middle;
- } else if (res < 0) {
- end = middle - 1;
- } else {
- first = middle + 1;
- }
+struct Dict::CmpDictEntry {
+ bool operator()(const DictEntry &lhs, const DictEntry &rhs) const {
+ return lhs.first < rhs.first;
}
- return -1;
-}
+ bool operator()(const DictEntry &lhs, const char *rhs) const {
+ return lhs.first < rhs;
+ }
+ bool operator()(const char *lhs, const DictEntry &rhs) const {
+ return lhs < rhs.first;
+ }
+};
Dict::Dict(XRef *xrefA) {
xref = xrefA;
- entries = nullptr;
- size = length = 0;
ref = 1;
- sorted = gFalse;
#ifdef MULTITHREADED
gInitMutex(&mutex);
#endif
+
+ sorted = false;
}
-Dict::Dict(Dict* dictA) {
+Dict::Dict(const Dict* dictA) {
xref = dictA->xref;
- size = length = dictA->length;
ref = 1;
#ifdef MULTITHREADED
gInitMutex(&mutex);
#endif
- sorted = dictA->sorted;
- entries = (DictEntry *)gmallocn(size, sizeof(DictEntry));
- for (int i=0; i<length; i++) {
- entries[i].key = copyString(dictA->entries[i].key);
- entries[i].val.initNullAfterMalloc();
- entries[i].val = dictA->entries[i].val.copy();
+ entries.reserve(dictA->entries.size());
+ for (const auto& entry : dictA->entries) {
+ entries.emplace_back(entry.first, entry.second.copy());
}
+
+ sorted = dictA->sorted.load();
}
-Dict *Dict::copy(XRef *xrefA) {
+Dict *Dict::copy(XRef *xrefA) const {
dictLocker();
Dict *dictA = new Dict(this);
dictA->xref = xrefA;
- for (int i=0; i<length; i++) {
- if (dictA->entries[i].val.getType() == objDict) {
- Dict *copy = dictA->entries[i].val.getDict()->copy(xrefA);
- dictA->entries[i].val = Object(copy);
+ for (auto &entry : dictA->entries) {
+ if (entry.second.getType() == objDict) {
+ entry.second = Object(entry.second.getDict()->copy(xrefA));
}
}
return dictA;
}
Dict::~Dict() {
- int i;
-
- for (i = 0; i < length; ++i) {
- gfree(entries[i].key);
- entries[i].val.free();
- }
- gfree(entries);
#ifdef MULTITHREADED
gDestroyMutex(&mutex);
#endif
}
-int Dict::incRef() {
+void Dict::add(const char *key, Object &&val) {
dictLocker();
- ++ref;
- return ref;
+ entries.emplace_back(key, std::move(val));
+ sorted = false;
}
-int Dict::decRef() {
- dictLocker();
- --ref;
- return ref;
-}
-
-void Dict::add(char *key, Object &&val) {
- dictLocker();
- if (sorted) {
- // We use add on very few occasions so
- // virtually this will never be hit
- sorted = gFalse;
- }
+inline const Dict::DictEntry *Dict::find(const char *key) const {
+ if (entries.size() >= SORT_LENGTH_LOWER_LIMIT) {
+ if (!sorted) {
+ dictLocker();
+ if (!sorted) {
+ auto& entries = const_cast<std::vector<DictEntry>&>(this->entries);
+ auto& sorted = const_cast<std::atomic_bool&>(this->sorted);
- if (length == size) {
- if (length == 0) {
- size = 8;
- } else {
- size *= 2;
+ std::sort(entries.begin(), entries.end(), CmpDictEntry{});
+ sorted = true;
+ }
}
- entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry));
- }
- entries[length].key = key;
- entries[length].val.initNullAfterMalloc();
- entries[length].val = std::move(val);
- ++length;
-}
-
-inline DictEntry *Dict::find(const char *key) const {
- if (!sorted && length >= SORT_LENGTH_LOWER_LIMIT)
- {
- dictLocker();
- sorted = gTrue;
- std::sort(entries, entries+length, cmpDictEntries);
}
if (sorted) {
- const int pos = binarySearch(key, entries, length);
- if (pos != -1) {
- return &entries[pos];
+ const auto pos = std::lower_bound(entries.begin(), entries.end(), key, CmpDictEntry{});
+ if (pos != entries.end() && pos->first == key) {
+ return &*pos;
}
} else {
- int i;
-
- for (i = length - 1; i >=0; --i) {
- if (!strcmp(key, entries[i].key))
- return &entries[i];
+ const auto pos = std::find_if(entries.rbegin(), entries.rend(), [key](const DictEntry& entry) {
+ return entry.first == key;
+ });
+ if (pos != entries.rend()) {
+ return &*pos;
}
}
return nullptr;
}
-GBool Dict::hasKey(const char *key) const {
- return find(key) != nullptr;
+inline Dict::DictEntry *Dict::find(const char *key) {
+ return const_cast<DictEntry *>(const_cast<const Dict *>(this)->find(key));
}
void Dict::remove(const char *key) {
dictLocker();
- if (sorted) {
- const int pos = binarySearch(key, entries, length);
- if (pos != -1) {
- length -= 1;
- gfree(entries[pos].key);
- entries[pos].val.free();
- if (pos != length) {
- memmove(static_cast<void*>(&entries[pos]), &entries[pos + 1], (length - pos) * sizeof(DictEntry));
- }
- }
- } else {
- int i;
- bool found = false;
- if(length == 0) {
- return;
- }
-
- for(i=0; i<length; i++) {
- if (!strcmp(key, entries[i].key)) {
- found = true;
- break;
- }
- }
- if(!found) {
- return;
- }
- //replace the deleted entry with the last entry
- gfree(entries[i].key);
- entries[i].val.free();
- length -= 1;
- if (i!=length) {
- //don't copy the last entry if it is deleted
- entries[i].key = entries[length].key;
- entries[i].val = std::move(entries[length].val);
+ if (auto *entry = find(key)) {
+ if (sorted) {
+ const auto index = entry - &entries.front();
+ entries.erase(entries.begin() + index);
+ } else {
+ swap(*entry, entries.back());
+ entries.pop_back();
}
}
}
void Dict::set(const char *key, Object &&val) {
- DictEntry *e;
if (val.isNull()) {
remove(key);
return;
}
- e = find (key);
- if (e) {
- dictLocker();
- e->val = std::move(val);
+ dictLocker();
+ if (auto *entry = find(key)) {
+ entry->second = std::move(val);
} else {
- add (copyString(key), std::move(val));
+ add(key, std::move(val));
}
}
GBool Dict::is(const char *type) const {
- DictEntry *e;
-
- return (e = find("Type")) && e->val.isName(type);
+ if (const auto *entry = find("Type")) {
+ return entry->second.isName(type);
+ }
+ return gFalse;
}
Object Dict::lookup(const char *key, int recursion) const {
- DictEntry *e;
-
- return (e = find(key)) ? e->val.fetch(xref, recursion) : Object(objNull);
+ if (const auto *entry = find(key)) {
+ return entry->second.fetch(xref, recursion);
+ }
+ return Object(objNull);
}
Object Dict::lookupNF(const char *key) const {
- DictEntry *e;
-
- return (e = find(key)) ? e->val.copy() : Object(objNull);
+ if (const auto *entry = find(key)) {
+ return entry->second.copy();
+ }
+ return Object(objNull);
}
GBool Dict::lookupInt(const char *key, const char *alt_key, int *value) const
{
- GBool success = gFalse;
- Object obj1 = lookup ((char *) key);
- if (obj1.isNull () && alt_key != nullptr) {
- obj1.free ();
- obj1 = lookup ((char *) alt_key);
+ auto obj1 = lookup(key);
+ if (obj1.isNull() && alt_key != nullptr) {
+ obj1 = lookup(alt_key);
}
- if (obj1.isInt ()) {
- *value = obj1.getInt ();
- success = gTrue;
+ if (obj1.isInt()) {
+ *value = obj1.getInt();
+ return gTrue;
}
-
- obj1.free ();
-
- return success;
+ return gFalse;
}
-char *Dict::getKey(int i) const {
- return entries[i].key;
-}
-
-Object Dict::getVal(int i) const {
- return entries[i].val.fetch(xref);
-}
-
-Object Dict::getValNF(int i) const {
- return entries[i].val.copy();
+GBool Dict::hasKey(const char *key) const {
+ return find(key) != nullptr;
}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Dict.h b/Build/source/libs/poppler/poppler-src/poppler/Dict.h
index 9fd732a1561..a4fd1c56138 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Dict.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/Dict.h
@@ -20,6 +20,7 @@
// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2017 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -33,6 +34,11 @@
#pragma interface
#endif
+#include <atomic>
+#include <string>
+#include <vector>
+#include <utility>
+
#include "poppler-config.h"
#include "Object.h"
#include "goo/GooMutex.h"
@@ -41,18 +47,13 @@
// Dict
//------------------------------------------------------------------------
-struct DictEntry {
- char *key;
- Object val;
-};
-
class Dict {
public:
// Constructor.
Dict(XRef *xrefA);
- Dict(Dict* dictA);
- Dict *copy(XRef *xrefA);
+ Dict(const Dict *dictA);
+ Dict *copy(XRef *xrefA) const;
// Destructor.
~Dict();
@@ -61,11 +62,14 @@ public:
Dict& operator=(const Dict &) = delete;
// Get number of entries.
- int getLength() const { return length; }
+ int getLength() const { return static_cast<int>(entries.size()); }
- // Add an entry. NB: does not copy key.
+ // Add an entry. (Copies key into Dict.)
// val becomes a dead object after the call
- void add(char *key, Object &&val);
+ void add(const char *key, Object &&val);
+
+ // Add an entry. (Takes ownership of key.)
+ void add(char *key, Object &&val) = delete;
// Update the value of an existing entry, otherwise create it
// val becomes a dead object after the call
@@ -83,9 +87,9 @@ public:
GBool lookupInt(const char *key, const char *alt_key, int *value) const;
// Iterative accessors.
- char *getKey(int i) const;
- Object getVal(int i) const;
- Object getValNF(int i) const;
+ const char *getKey(int i) const { return entries[i].first.c_str(); }
+ Object getVal(int i) const { return entries[i].second.fetch(xref); }
+ Object getValNF(int i) const { return entries[i].second.copy(); }
// Set the xref pointer. This is only used in one special case: the
// trailer dictionary, which is read before the xref table is
@@ -100,20 +104,22 @@ private:
friend class Object; // for incRef/decRef
// Reference counting.
- int incRef();
- int decRef();
+ int incRef() { return ++ref; }
+ int decRef() { return --ref; }
+
+ using DictEntry = std::pair<std::string, Object>;
+ struct CmpDictEntry;
- mutable GBool sorted;
+ std::atomic_bool sorted;
XRef *xref; // the xref table for this PDF file
- DictEntry *entries; // array of entries
- int size; // size of <entries> array
- int length; // number of entries in dictionary
- int ref; // reference count
+ std::vector<DictEntry> entries;
+ std::atomic_int ref; // reference count
#ifdef MULTITHREADED
mutable GooMutex mutex;
#endif
- DictEntry *find(const char *key) const;
+ const DictEntry *find(const char *key) const;
+ DictEntry *find(const char *key);
};
#endif
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Form.cc b/Build/source/libs/poppler/poppler-src/poppler/Form.cc
index 3f2ab9a10bf..2ff4aafa844 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Form.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Form.cc
@@ -5,7 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright 2006-2008 Julien Rebetez <julienr@svn.gnome.org>
-// Copyright 2007-2012, 2015-2017 Albert Astals Cid <aacid@kde.org>
+// Copyright 2007-2012, 2015-2018 Albert Astals Cid <aacid@kde.org>
// Copyright 2007-2008, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright 2007, 2013, 2016 Adrian Johnson <ajohnson@redneon.com>
// Copyright 2007 Iñigo Martínez <inigomartinez@gmail.com>
@@ -22,6 +22,7 @@
// Copyright 2018 Andre Heinecke <aheinecke@intevation.de>
// Copyright 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
// Copyright 2018 Chinmoy Ranjan Pradhan <chinmoyrp65@protonmail.com>
+// Copyright 2018 Adam Reichold <adam.reichold@t-online.de>
//
//========================================================================
@@ -193,7 +194,7 @@ FormWidgetButton::FormWidgetButton (PDFDoc *docA, Object *aobj, unsigned num, Re
Object obj2 = obj1.dictLookup("N");
if (obj2.isDict()) {
for (int i = 0; i < obj2.dictGetLength(); i++) {
- char *key = obj2.dictGetKey(i);
+ const char *key = obj2.dictGetKey(i);
if (strcmp (key, "Off") != 0) {
onStr = new GooString (key);
break;
@@ -1637,12 +1638,12 @@ void FormFieldSignature::parseInfo()
const Object location_obj = sig_dict.dictLookup("Location");
if (location_obj.isString()) {
- signature_info->setLocation(location_obj.getString()->copy()->getCString());
+ signature_info->setLocation(location_obj.getString()->getCString());
}
const Object reason_obj = sig_dict.dictLookup("Reason");
if (reason_obj.isString()) {
- signature_info->setReason(reason_obj.getString()->copy()->getCString());
+ signature_info->setReason(reason_obj.getString()->getCString());
}
// retrieve SigningTime
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Function.cc b/Build/source/libs/poppler/poppler-src/poppler/Function.cc
index cc32414b87b..6918fbcda9e 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Function.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Function.cc
@@ -362,7 +362,11 @@ SampledFunction::SampledFunction(Object *funcObj, Dict *dict) {
nSamples = n;
for (i = 0; i < m; ++i)
nSamples *= sampleSize[i];
- samples = (double *)gmallocn(nSamples, sizeof(double));
+ samples = (double *)gmallocn_checkoverflow(nSamples, sizeof(double));
+ if (!samples) {
+ error(errSyntaxError, -1, "Function has invalid number of samples");
+ return;
+ }
buf = 0;
bits = 0;
bitMask = (1 << sampleBits) - 1;
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Gfx.cc b/Build/source/libs/poppler/poppler-src/poppler/Gfx.cc
index 8f2c62d24a7..5b3b8f122a2 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Gfx.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Gfx.cc
@@ -40,6 +40,7 @@
// Copyright (C) 2014 Jason Crain <jason@aquaticape.us>
// Copyright (C) 2017, 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
+// Copyright (C) 2018 Denis Onishchenko <denis.onischenko@gmail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -3884,15 +3885,15 @@ void Gfx::doShowText(const GooString *s) {
double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, ddx, ddy;
double originX, originY, tOriginX, tOriginY;
double x0, y0, x1, y1;
- double oldCTM[6], newCTM[6];
- double *mat;
+ double tmp[4], newCTM[6];
+ double *oldCTM, *mat;
Dict *resDict;
Parser *oldParser;
GfxState *savedState;
const char *p;
int render;
GBool patternFill;
- int len, n, uLen, nChars, nSpaces, i;
+ int len, n, uLen, nChars, nSpaces;
font = state->getFont();
wMode = font->getWMode();
@@ -3925,26 +3926,23 @@ void Gfx::doShowText(const GooString *s) {
// handle a Type 3 char
if (font->getType() == fontType3 && out->interpretType3Chars()) {
- mat = state->getCTM();
- for (i = 0; i < 6; ++i) {
- oldCTM[i] = mat[i];
- }
+ oldCTM = state->getCTM();
mat = state->getTextMat();
- newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2];
- newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3];
- newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2];
- newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3];
+ tmp[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2];
+ tmp[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3];
+ tmp[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2];
+ tmp[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3];
mat = font->getFontMatrix();
- newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2];
- newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3];
- newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2];
- newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3];
+ newCTM[0] = mat[0] * tmp[0] + mat[1] * tmp[2];
+ newCTM[1] = mat[0] * tmp[1] + mat[1] * tmp[3];
+ newCTM[2] = mat[2] * tmp[0] + mat[3] * tmp[2];
+ newCTM[3] = mat[2] * tmp[1] + mat[3] * tmp[3];
newCTM[0] *= state->getFontSize();
newCTM[1] *= state->getFontSize();
newCTM[2] *= state->getFontSize();
newCTM[3] *= state->getFontSize();
newCTM[0] *= state->getHorizScaling();
- newCTM[2] *= state->getHorizScaling();
+ newCTM[1] *= state->getHorizScaling();
curX = state->getCurX();
curY = state->getCurY();
oldParser = parser;
@@ -4214,7 +4212,7 @@ void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) {
GBool invert;
GfxColorSpace *colorSpace, *maskColorSpace;
GBool haveColorKeyMask, haveExplicitMask, haveSoftMask;
- int maskColors[2*gfxColorMaxComps];
+ int maskColors[2*gfxColorMaxComps] = {};
int maskWidth, maskHeight;
GBool maskInvert;
GBool maskInterpolate;
@@ -4912,7 +4910,6 @@ void Gfx::opBeginImage(Object args[], int numArgs) {
}
Stream *Gfx::buildImageStream() {
- char *key;
Stream *str;
// build dictionary
@@ -4922,13 +4919,11 @@ Stream *Gfx::buildImageStream() {
if (!obj.isName()) {
error(errSyntaxError, getPos(), "Inline image dictionary key must be a name object");
} else {
- key = copyString(obj.getName());
- obj = parser->getObj();
- if (obj.isEOF() || obj.isError()) {
- gfree(key);
+ auto val = parser->getObj();
+ if (val.isEOF() || val.isError()) {
break;
}
- dict.dictAdd(key, std::move(obj));
+ dict.dictAdd(obj.getName(), std::move(val));
}
obj = parser->getObj();
}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/GfxFont.cc b/Build/source/libs/poppler/poppler-src/poppler/GfxFont.cc
index 7b4d4b5487a..662c9a49412 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/GfxFont.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/GfxFont.cc
@@ -33,6 +33,7 @@
// Copyright (C) 2013-2016, 2018 Jason Crain <jason@aquaticape.us>
// Copyright (C) 2014 Olly Betts <olly@survex.com>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -1439,7 +1440,7 @@ static int parseCharName(char *charName, Unicode *uBuf, int uLen,
return 0; // .notdef or similar
} else if (var_part != nullptr) {
// parse names of the form 7.oldstyle, P.swash, s.sc, etc.
- char *main_part = gstrndup(charName, var_part - charName);
+ char *main_part = copyString(charName, var_part - charName);
GBool namesRecurse = gTrue, variantsRecurse = gFalse;
int n = parseCharName(main_part, uBuf, uLen, namesRecurse, ligatures,
numeric, hex, variantsRecurse);
diff --git a/Build/source/libs/poppler/poppler-src/poppler/GfxState.cc b/Build/source/libs/poppler/poppler-src/poppler/GfxState.cc
index 956a214bf84..b8423f23fc2 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/GfxState.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/GfxState.cc
@@ -31,6 +31,8 @@
// Copyright (C) 2016 Marek Kasik <mkasik@redhat.com>
// Copyright (C) 2017 Oliver Sander <oliver.sander@tu-dresden.de>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Volker Krause <vkrause@kde.org>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -4006,7 +4008,9 @@ void GfxUnivariateShading::setupCache(const Matrix *ctm,
tMax = t0 + sMin * (t1 - t0);
}
- cacheBounds = (double *)gmallocn(maxSize, sizeof(double) * (nComps + 2));
+ cacheBounds = (double *)gmallocn_checkoverflow(maxSize, sizeof(double) * (nComps + 2));
+ if (unlikely(!cacheBounds))
+ return;
cacheCoeff = cacheBounds + maxSize;
cacheValues = cacheCoeff + maxSize;
@@ -5224,7 +5228,7 @@ GfxPatchMeshShading *GfxPatchMeshShading::parse(GfxResources *res, int typeA, Di
nPatchesA = 0;
patchesA = nullptr;
patchesSize = 0;
- std::unique_ptr<GfxShadingBitBuf> bitBuf(new GfxShadingBitBuf(str));
+ auto bitBuf = std::make_unique<GfxShadingBitBuf>(str);
while (1) {
if (!bitBuf->getBits(flagBits, &flag)) {
break;
@@ -5868,24 +5872,30 @@ GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) {
colorSpace2 = nullptr;
for (k = 0; k < gfxColorMaxComps; ++k) {
lookup[k] = nullptr;
+ lookup2[k] = nullptr;
}
+ byte_lookup = nullptr;
n = 1 << bits;
+ for (k = 0; k < nComps; ++k) {
+ lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+ memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ }
if (colorSpace->getMode() == csIndexed) {
colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase();
for (k = 0; k < nComps2; ++k) {
- lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
- memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ lookup2[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+ memcpy(lookup2[k], colorMap->lookup2[k], n * sizeof(GfxColorComp));
}
} else if (colorSpace->getMode() == csSeparation) {
colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt();
for (k = 0; k < nComps2; ++k) {
- lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
- memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ lookup2[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+ memcpy(lookup2[k], colorMap->lookup2[k], n * sizeof(GfxColorComp));
}
} else {
for (k = 0; k < nComps; ++k) {
- lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
- memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ lookup2[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+ memcpy(lookup2[k], colorMap->lookup2[k], n * sizeof(GfxColorComp));
}
}
if (colorMap->byte_lookup) {
diff --git a/Build/source/libs/poppler/poppler-src/poppler/GlobalParams.cc b/Build/source/libs/poppler/poppler-src/poppler/GlobalParams.cc
index 6d8941ea3bc..c1131df34b7 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/GlobalParams.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/GlobalParams.cc
@@ -68,6 +68,7 @@
#include "goo/GooString.h"
#include "goo/GooList.h"
#include "goo/gfile.h"
+#include "goo/gdir.h"
#include "Error.h"
#include "NameToCharCode.h"
#include "CharCodeToUnicode.h"
diff --git a/Build/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc b/Build/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc
index 25df3db8ae0..2acbc915a15 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc
@@ -23,6 +23,7 @@
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2013, 2014 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2015 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -2966,17 +2967,19 @@ JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h,
if (mmr) {
mmrDecoder->reset();
- if (w > INT_MAX - 2) {
- error(errSyntaxError, curStr->getPos(), "Bad width in JBIG2 generic bitmap");
- delete bitmap;
- return nullptr;
- }
// 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w
// ---> max codingLine size = w + 1
// refLine has one extra guard entry at the end
// ---> max refLine size = w + 2
- codingLine = (int *)gmallocn(w + 1, sizeof(int));
- refLine = (int *)gmallocn(w + 2, sizeof(int));
+ codingLine = (int *)gmallocn_checkoverflow(w + 1, sizeof(int));
+ refLine = (int *)gmallocn_checkoverflow(w + 2, sizeof(int));
+
+ if (unlikely(!codingLine || !refLine)) {
+ error(errSyntaxError, curStr->getPos(), "Bad width in JBIG2 generic bitmap");
+ delete bitmap;
+ return nullptr;
+ }
+
memset(refLine, 0, (w + 2) * sizeof(int));
for (i = 0; i < w + 1; ++i) codingLine[i] = w;
@@ -4085,15 +4088,20 @@ void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) {
huffDecoder->reset();
huffTabSize = 8;
- huffTab = (JBIG2HuffmanTable *)
- gmallocn(huffTabSize, sizeof(JBIG2HuffmanTable));
+ huffTab = (JBIG2HuffmanTable *)gmallocn_checkoverflow(huffTabSize, sizeof(JBIG2HuffmanTable));
+ if (unlikely(!huffTab)) {
+ goto oomError;
+ }
+
i = 0;
val = lowVal;
while (val < highVal) {
if (i == huffTabSize) {
huffTabSize *= 2;
- huffTab = (JBIG2HuffmanTable *)
- greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
+ huffTab = (JBIG2HuffmanTable *)greallocn_checkoverflow(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
+ if (unlikely(!huffTab)) {
+ goto oomError;
+ }
}
huffTab[i].val = val;
huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
@@ -4103,8 +4111,10 @@ void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) {
}
if (i + oob + 3 > huffTabSize) {
huffTabSize = i + oob + 3;
- huffTab = (JBIG2HuffmanTable *)
- greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
+ huffTab = (JBIG2HuffmanTable *)greallocn_checkoverflow(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
+ if (unlikely(!huffTab)) {
+ goto oomError;
+ }
}
huffTab[i].val = lowVal - 1;
huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
@@ -4132,6 +4142,8 @@ void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) {
eofError:
error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+ oomError:
+ error(errInternal, curStr->getPos(), "Failed allocation when processing JBIG2 stream");
}
void JBIG2Stream::readExtensionSeg(Guint length) {
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Link.cc b/Build/source/libs/poppler/poppler-src/poppler/Link.cc
index 4a20752c1d4..f88183f9d9e 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Link.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Link.cc
@@ -56,7 +56,8 @@ LinkAction::LinkAction() : nextActionList(nullptr) {
}
LinkAction::~LinkAction() {
- delete nextActionList;
+ if (nextActionList)
+ deleteGooList(nextActionList, LinkAction);
}
LinkAction *LinkAction::parseDest(const Object *obj) {
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Object.cc b/Build/source/libs/poppler/poppler-src/poppler/Object.cc
index d3adc4473ab..9112d31681f 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Object.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Object.cc
@@ -15,6 +15,7 @@
//
// Copyright (C) 2008, 2010, 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -58,11 +59,6 @@ static const char *objTypeNames[numObjTypes] = {
"dead"
};
-#ifdef DEBUG_MEM
-int Object::numAlloc[numObjTypes] =
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-#endif
-
Object::Object(Object&& other)
{
type = other.type;
@@ -95,6 +91,7 @@ Object Object::copy() const {
obj.string = string->copy();
break;
case objName:
+ case objCmd:
obj.cString = copyString(cString);
break;
case objArray:
@@ -106,15 +103,9 @@ Object Object::copy() const {
case objStream:
stream->incRef();
break;
- case objCmd:
- obj.cString = copyString(cString);
- break;
default:
break;
}
-#ifdef DEBUG_MEM
- ++numAlloc[type];
-#endif
return obj;
}
@@ -131,6 +122,7 @@ void Object::free() {
delete string;
break;
case objName:
+ case objCmd:
gfree(cString);
break;
case objArray:
@@ -148,15 +140,9 @@ void Object::free() {
delete stream;
}
break;
- case objCmd:
- gfree(cString);
- break;
default:
break;
}
-#ifdef DEBUG_MEM
- --numAlloc[type];
-#endif
type = objNone;
}
@@ -234,23 +220,3 @@ void Object::print(FILE *f) const {
break;
}
}
-
-void Object::memCheck(FILE *f) {
-#ifdef DEBUG_MEM
- int i;
- int t;
-
- t = 0;
- for (i = 0; i < numObjTypes; ++i)
- t += numAlloc[i];
- if (t > 0) {
- fprintf(f, "Allocated objects:\n");
- for (i = 0; i < numObjTypes; ++i) {
- if (numAlloc[i] > 0)
- fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]);
- }
- }
-#else
- (void)f;
-#endif
-}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Object.h b/Build/source/libs/poppler/poppler-src/poppler/Object.h
index 97978f46528..3dcf9e6bbf7 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Object.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/Object.h
@@ -15,7 +15,7 @@
//
// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
// Copyright (C) 2008 Kees Cook <kees@outflux.net>
-// Copyright (C) 2008, 2010, 2017 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2010, 2017, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Jakub Wilk <jwilk@jwilk.net>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
@@ -23,6 +23,7 @@
// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.com>
// Copyright (C) 2016 Jakub Alba <jakubalba@gmail.com>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -36,6 +37,7 @@
#pragma interface
#endif
+#include <cassert>
#include <set>
#include <stdio.h>
#include <string.h>
@@ -87,14 +89,33 @@ struct Ref {
int gen; // generation number
};
-struct RefCompare {
- bool operator() (const Ref& lhs, const Ref& rhs) const {
- if (lhs.num != rhs.num)
- return lhs.num < rhs.num;
- return lhs.gen < rhs.gen;
- }
+inline bool operator== (const Ref& lhs, const Ref& rhs) noexcept {
+ return lhs.num == rhs.num && lhs.gen == rhs.gen;
+}
+
+inline bool operator< (const Ref& lhs, const Ref& rhs) noexcept {
+ if (lhs.num != rhs.num)
+ return lhs.num < rhs.num;
+ return lhs.gen < rhs.gen;
+}
+
+namespace std
+{
+
+template<>
+struct hash<Ref>
+{
+ using argument_type = Ref;
+ using result_type = size_t;
+
+ result_type operator() (const argument_type &ref) const noexcept
+ {
+ return std::hash<int>{}(ref.num) ^ (std::hash<int>{}(ref.gen) << 1);
+ }
};
+}
+
//------------------------------------------------------------------------
// object types
//------------------------------------------------------------------------
@@ -131,17 +152,8 @@ enum ObjType {
// Object
//------------------------------------------------------------------------
-#ifdef DEBUG_MEM
-#define initObj(t) free(); zeroUnion(); ++numAlloc[type = t]
-#else
#define initObj(t) free(); zeroUnion(); type = t
-#endif
-
-#ifdef DEBUG_MEM
-#define constructObj(t) ++numAlloc[type = t]
-#else
#define constructObj(t) type = t
-#endif
class Object {
public:
@@ -162,17 +174,17 @@ public:
explicit Object(double realA)
{ constructObj(objReal); real = realA; }
explicit Object(GooString *stringA)
- { constructObj(objString); string = stringA; }
+ { assert(stringA); constructObj(objString); string = stringA; }
Object(ObjType typeA, const char *stringA)
- { constructObj(typeA); cString = copyString(stringA); }
+ { assert(typeA == objName || typeA == objCmd); assert(stringA); constructObj(typeA); cString = copyString(stringA); }
explicit Object(long long int64gA)
{ constructObj(objInt64); int64g = int64gA; }
explicit Object(Array *arrayA)
- { constructObj(objArray); array = arrayA; }
+ { assert(arrayA); constructObj(objArray); array = arrayA; }
explicit Object(Dict *dictA)
- { constructObj(objDict); dict = dictA; }
+ { assert(dictA); constructObj(objDict); dict = dictA; }
explicit Object(Stream *streamA)
- { constructObj(objStream); stream = streamA; }
+ { assert(streamA); constructObj(objStream); stream = streamA; }
Object(int numA, int genA)
{ constructObj(objRef); ref.num = numA; ref.gen = genA; }
template<typename T> Object(T) = delete;
@@ -238,10 +250,8 @@ public:
return type == objInt ? (double)intg : type == objInt64 ? (double)int64g : real;
}
const GooString *getString() const { OBJECT_TYPE_CHECK(objString); return string; }
- // After takeString() the only method that should be called for the object is free()
- // because the object it's not expected to have a NULL string.
- GooString *takeString() {
- OBJECT_TYPE_CHECK(objString); GooString *s = string; string = nullptr; return s; }
+ // After takeString() the only method that should be called for the object is free().
+ GooString *takeString() { OBJECT_TYPE_CHECK(objString); type = objDead; return string; }
const char *getName() const { OBJECT_TYPE_CHECK(objName); return cString; }
Array *getArray() const { OBJECT_TYPE_CHECK(objArray); return array; }
Dict *getDict() const { OBJECT_TYPE_CHECK(objDict); return dict; }
@@ -263,13 +273,14 @@ public:
// Dict accessors.
int dictGetLength() const;
- void dictAdd(char *key, Object &&val);
+ void dictAdd(char *key, Object &&val) = delete;
+ void dictAdd(const char *key, Object &&val);
void dictSet(const char *key, Object &&val);
void dictRemove(const char *key);
GBool dictIs(const char *dictType) const;
Object dictLookup(const char *key, int recursion = 0) const;
Object dictLookupNF(const char *key) const;
- char *dictGetKey(int i) const;
+ const char *dictGetKey(int i) const;
Object dictGetVal(int i) const;
Object dictGetValNF(int i) const;
@@ -289,9 +300,6 @@ public:
const char *getTypeName() const;
void print(FILE *f = stdout) const;
- // Memory testing.
- static void memCheck(FILE *f);
-
private:
friend class Array; // Needs free and initNullAfterMalloc
friend class Dict; // Needs free and initNullAfterMalloc
@@ -316,11 +324,6 @@ private:
Stream *stream; // stream
Ref ref; // indirect reference
};
-
-#ifdef DEBUG_MEM
- static int // number of each type of object
- numAlloc[numObjTypes]; // currently allocated
-#endif
};
//------------------------------------------------------------------------
@@ -353,7 +356,7 @@ inline Object Object::arrayGetNF(int i) const
inline int Object::dictGetLength() const
{ OBJECT_TYPE_CHECK(objDict); return dict->getLength(); }
-inline void Object::dictAdd(char *key, Object &&val)
+inline void Object::dictAdd(const char *key, Object &&val)
{ OBJECT_TYPE_CHECK(objDict); dict->add(key, std::move(val)); }
inline void Object::dictSet(const char *key, Object &&val)
@@ -374,7 +377,7 @@ inline Object Object::dictLookup(const char *key, int recursion) const
inline Object Object::dictLookupNF(const char *key) const
{ OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key); }
-inline char *Object::dictGetKey(int i) const
+inline const char *Object::dictGetKey(int i) const
{ OBJECT_TYPE_CHECK(objDict); return dict->getKey(i); }
inline Object Object::dictGetVal(int i) const
diff --git a/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.cc b/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.cc
index 8376a0e4e4f..717dc33d198 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.cc
@@ -7,6 +7,7 @@
// Copyright 2008, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright 2008, 2010, 2011, 2017, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright 2008 Mark Kaplan <mkaplan@finjan.com>
+// Copyright 2018 Adam Reichold <adam.reichold@t-online.de>
//
// Released under the GPL (version 2, or later, at your option)
//
@@ -22,7 +23,6 @@
#include "goo/GooString.h"
#include "goo/GooList.h"
#include "Error.h"
-// #include "PDFDocEncoding.h"
#include "OptionalContent.h"
// Max depth of nested visibility expressions. This is used to catch
@@ -40,8 +40,6 @@ OCGs::OCGs(Object *ocgObject, XRef *xref) :
{
// we need to parse the dictionary here, and build optionalContentGroups
ok = gTrue;
- optionalContentGroups = new GooList();
- display = nullptr;
Object ocgList = ocgObject->dictLookup("OCGs");
if (!ocgList.isArray()) {
@@ -56,17 +54,15 @@ OCGs::OCGs(Object *ocgObject, XRef *xref) :
if (!ocg.isDict()) {
break;
}
- OptionalContentGroup *thisOptionalContentGroup = new OptionalContentGroup(ocg.getDict());
+ auto thisOptionalContentGroup = std::make_unique<OptionalContentGroup>(ocg.getDict());
ocg = ocgList.arrayGetNF(i);
if (!ocg.isRef()) {
- delete thisOptionalContentGroup;
break;
}
- // TODO: we should create a lookup map from Ref to the OptionalContentGroup
thisOptionalContentGroup->setRef( ocg.getRef() );
// the default is ON - we change state later, depending on BaseState, ON and OFF
thisOptionalContentGroup->setState(OptionalContentGroup::On);
- optionalContentGroups->append(thisOptionalContentGroup);
+ optionalContentGroups.emplace(ocg.getRef(), std::move(thisOptionalContentGroup));
}
Object defaultOcgConfig = ocgObject->dictLookup("D");
@@ -78,11 +74,8 @@ OCGs::OCGs(Object *ocgObject, XRef *xref) :
Object baseState = defaultOcgConfig.dictLookup("BaseState");
if (baseState.isName("OFF")) {
- for (int i = 0; i < optionalContentGroups->getLength(); ++i) {
- OptionalContentGroup *group;
-
- group = (OptionalContentGroup *)optionalContentGroups->get(i);
- group->setState(OptionalContentGroup::Off);
+ for (auto &group : optionalContentGroups) {
+ group.second->setState(OptionalContentGroup::Off);
}
}
@@ -126,42 +119,26 @@ OCGs::OCGs(Object *ocgObject, XRef *xref) :
rbgroups = defaultOcgConfig.dictLookup("RBGroups");
}
-OCGs::~OCGs()
-{
- deleteGooList(optionalContentGroups, OptionalContentGroup);
- delete display;
-}
-
-
bool OCGs::hasOCGs() const
{
- return ( optionalContentGroups->getLength() > 0 );
+ return !( optionalContentGroups.empty() );
}
-OptionalContentGroup* OCGs::findOcgByRef( const Ref &ref)
+OptionalContentGroup* OCGs::findOcgByRef( const Ref &ref )
{
- //TODO: make this more efficient
- OptionalContentGroup *ocg = nullptr;
- for (int i=0; i < optionalContentGroups->getLength(); ++i) {
- ocg = (OptionalContentGroup*)optionalContentGroups->get(i);
- if ( (ocg->getRef().num == ref.num) && (ocg->getRef().gen == ref.gen) ) {
- return ocg;
- }
- }
-
- // not found
- return nullptr;
+ const auto ocg = optionalContentGroups.find( ref );
+ return ocg != optionalContentGroups.end() ? ocg->second.get() : nullptr;
}
OCDisplayNode *OCGs::getDisplayRoot()
{
if (display)
- return display;
+ return display.get();
if (order.isArray())
- display = OCDisplayNode::parse(&order, this, m_xref);
+ display.reset(OCDisplayNode::parse(&order, this, m_xref));
- return display;
+ return display.get();
}
bool OCGs::optContentIsVisible( Object *dictRef )
@@ -184,7 +161,6 @@ bool OCGs::optContentIsVisible( Object *dictRef )
return result;
}
dict = dictObj.getDict();
- // printf("checking if optContent is visible\n");
Object dictType = dict->lookup("Type");
if (dictType.isName("OCMD")) {
Object ve = dict->lookup("VE");
@@ -213,13 +189,12 @@ bool OCGs::optContentIsVisible( Object *dictRef )
}
}
}
- } else if ( dictType.isName("OCG") ) {
+ } else if ( dictType.isName("OCG") && dictRef->isRef() ) {
OptionalContentGroup* oc = findOcgByRef( dictRef->getRef() );
if ( oc && oc->getState() == OptionalContentGroup::Off ) {
result=false;
}
}
- // printf("visibility: %s\n", result? "on" : "off");
return result;
}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.h b/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.h
index ea5618e4374..6e9c52a61fd 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/OptionalContent.h
@@ -5,6 +5,7 @@
// Copyright 2007 Brad Hards <bradh@kde.org>
// Copyright 2008 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright 2013, 2018 Albert Astals Cid <aacid@kde.org>
+// Copyright 2018 Adam Reichold <adam.reichold@t-online.de>
//
// Released under the GPL (version 2, or later, at your option)
//
@@ -19,6 +20,8 @@
#include "Object.h"
#include "CharTypes.h"
+#include <unordered_map>
+#include <memory>
class GooString;
class GooList;
@@ -33,7 +36,6 @@ class OCGs {
public:
OCGs(Object *ocgObject, XRef *xref);
- ~OCGs();
OCGs(const OCGs &) = delete;
OCGs& operator=(const OCGs &) = delete;
@@ -42,7 +44,7 @@ public:
GBool isOk() const { return ok; }
bool hasOCGs() const;
- GooList *getOCGs() const { return optionalContentGroups; }
+ const std::unordered_map< Ref, std::unique_ptr< OptionalContentGroup > > &getOCGs() const { return optionalContentGroups; }
OptionalContentGroup* findOcgByRef( const Ref &ref);
@@ -66,12 +68,12 @@ private:
bool anyOn( Array *ocgArray );
bool anyOff( Array *ocgArray );
- GooList *optionalContentGroups;
+ std::unordered_map< Ref, std::unique_ptr< OptionalContentGroup > > optionalContentGroups;
Object order;
Object rbgroups;
XRef *m_xref;
- OCDisplayNode *display; // root node of display tree
+ std::unique_ptr< OCDisplayNode > display; // root node of display tree
};
//------------------------------------------------------------------------
diff --git a/Build/source/libs/poppler/poppler-src/poppler/OutputDev.h b/Build/source/libs/poppler/poppler-src/poppler/OutputDev.h
index 52635743838..0a769307848 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/OutputDev.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/OutputDev.h
@@ -244,7 +244,19 @@ public:
{ return gFalse; }
//----- path clipping
+
+ // Update the clipping path. The new path is the intersection of the old path
+ // with the path given in 'state'.
+ // Additionally, set the clipping mode to the 'nonzero winding number rule'.
+ // That is, a point is inside the clipping region if its winding number
+ // with respect to the clipping path is nonzero.
virtual void clip(GfxState * /*state*/) {}
+
+ // Update the clipping path. The new path is the intersection of the old path
+ // with the path given in 'state'.
+ // Additionally, set the clipping mode to the 'even-odd rule'. That is, a point is
+ // inside the clipping region if a ray from it to infinity will cross the clipping
+ // path an odd number of times (disregarding the path orientation).
virtual void eoClip(GfxState * /*state*/) {}
virtual void clipToStrokePath(GfxState * /*state*/) {}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.cc b/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.cc
index 631f9a70782..cb8fd0d7ff4 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.cc
@@ -29,7 +29,7 @@
// Copyright (C) 2011-2016 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2013, 2014, 2017 Adrian Johnson <ajohnson@redneon.com>
-// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com>
+// Copyright (C) 2013, 2018 Adam Reichold <adamreichold@myopera.com>
// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com>
// Copyright (C) 2015 Li Junling <lijunling@sina.com>
// Copyright (C) 2015 André Guerreiro <aguerreiro1985@gmail.com>
@@ -40,6 +40,7 @@
// Copyright (C) 2018 Ben Timby <btimby@gmail.com>
// Copyright (C) 2018 Evangelos Foutras <evangelos@foutrelis.com>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Evangelos Rigas <erigas@rnd2.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -62,6 +63,7 @@
#include <stddef.h>
#include <string.h>
#include <time.h>
+#include <regex>
#include <sys/stat.h>
#include "goo/glibc.h"
#include "goo/gstrtod.h"
@@ -318,6 +320,9 @@ GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) {
}
}
+ // Extract PDF Subtype information
+ extractPDFSubtype();
+
// done
return gTrue;
}
@@ -482,6 +487,133 @@ GBool PDFDoc::checkEncryption(GooString *ownerPassword, GooString *userPassword)
return ret;
}
+static PDFSubtypePart pdfPartFromString(PDFSubtype subtype, GooString *pdfSubtypeVersion) {
+ const std::regex regex("PDF/(?:A|X|VT|E|UA)-([[:digit:]])(?:[[:alpha:]]{1,2})?:?([[:digit:]]{4})?");
+ std::smatch match;
+ std::string pdfsubver = pdfSubtypeVersion->toStr();
+ PDFSubtypePart subtypePart = subtypePartNone;
+
+ if (std::regex_search(pdfsubver, match, regex)) {
+ int date = 0;
+ const int part = std::stoi(match.str(1));
+
+ if (match[2].matched) {
+ date = std::stoi(match.str(2));
+ }
+
+ switch (subtype) {
+ case subtypePDFX:
+ switch (part) {
+ case 1:
+ switch (date) {
+ case 2001:
+ default:
+ subtypePart = subtypePart1;
+ break;
+ case 2003:
+ subtypePart = subtypePart4;
+ break;
+ }
+ break;
+ case 2:
+ subtypePart = subtypePart5;
+ break;
+ case 3:
+ switch (date) {
+ case 2002:
+ default:
+ subtypePart = subtypePart3;
+ break;
+ case 2003:
+ subtypePart = subtypePart6;
+ break;
+ }
+ break;
+ case 4:
+ subtypePart = subtypePart7;
+ break;
+ case 5:
+ subtypePart = subtypePart8;
+ break;
+ }
+ break;
+ default:
+ subtypePart = (PDFSubtypePart)part;
+ break;
+
+ }
+ }
+
+ return subtypePart;
+}
+
+static PDFSubtypeConformance pdfConformanceFromString(GooString *pdfSubtypeVersion) {
+ const std::regex regex("PDF/(?:A|X|VT|E|UA)-[[:digit:]]([[:alpha:]]+)");
+ std::smatch match;
+ const std::string pdfsubver = pdfSubtypeVersion->toStr();
+ PDFSubtypeConformance pdfConf = subtypeConfNone;
+
+ // match contains the PDF conformance (A, B, G, N, P, PG or U)
+ if (std::regex_search(pdfsubver, match, regex)) {
+ GooString *conf = new GooString(match.str(1));
+ // Convert to lowercase as the conformance may appear in both cases
+ conf->lowerCase();
+ if (conf->cmp("a")==0) {
+ pdfConf = subtypeConfA;
+ } else if (conf->cmp("b")==0) {
+ pdfConf = subtypeConfB;
+ } else if (conf->cmp("g")==0) {
+ pdfConf = subtypeConfG;
+ } else if (conf->cmp("n")==0) {
+ pdfConf = subtypeConfN;
+ } else if (conf->cmp("p")==0) {
+ pdfConf = subtypeConfP;
+ } else if (conf->cmp("pg")==0) {
+ pdfConf = subtypeConfPG;
+ } else if (conf->cmp("u")==0) {
+ pdfConf = subtypeConfU;
+ } else {
+ pdfConf = subtypeConfNone;
+ }
+ delete conf;
+ }
+
+ return pdfConf;
+}
+
+void PDFDoc::extractPDFSubtype() {
+ pdfSubtype = subtypeNull;
+ pdfPart = subtypePartNull;
+ pdfConformance = subtypeConfNull;
+
+ GooString *pdfSubtypeVersion = nullptr;
+ // Find PDF InfoDict subtype key if any
+ if ((pdfSubtypeVersion = getDocInfoStringEntry("GTS_PDFA1Version"))) {
+ pdfSubtype = subtypePDFA;
+ } else if ((pdfSubtypeVersion = getDocInfoStringEntry("GTS_PDFEVersion"))) {
+ pdfSubtype = subtypePDFE;
+ } else if ((pdfSubtypeVersion = getDocInfoStringEntry("GTS_PDFUAVersion"))) {
+ pdfSubtype = subtypePDFUA;
+ } else if ((pdfSubtypeVersion = getDocInfoStringEntry("GTS_PDFVTVersion"))) {
+ pdfSubtype = subtypePDFVT;
+ } else if ((pdfSubtypeVersion = getDocInfoStringEntry("GTS_PDFXVersion"))) {
+ pdfSubtype = subtypePDFX;
+ } else {
+ pdfSubtype = subtypeNone;
+ pdfPart = subtypePartNone;
+ pdfConformance = subtypeConfNone;
+ return;
+ }
+
+ // Extract part from version string
+ pdfPart = pdfPartFromString(pdfSubtype, pdfSubtypeVersion);
+
+ // Extract conformance from version string
+ pdfConformance = pdfConformanceFromString(pdfSubtypeVersion);
+
+ delete pdfSubtypeVersion;
+}
+
std::vector<FormWidgetSignature*> PDFDoc::getSignatureWidgets()
{
int num_pages = getNumPages();
@@ -1645,7 +1777,7 @@ void PDFDoc::replacePageDict(int pageNo, int rotate,
mediaBoxArray->add(Object(mediaBox->y2));
Object mediaBoxObject(mediaBoxArray);
Object trimBoxObject = mediaBoxObject.copy();
- pageDict->add(copyString("MediaBox"), std::move(mediaBoxObject));
+ pageDict->add("MediaBox", std::move(mediaBoxObject));
if (cropBox != nullptr) {
Array *cropBoxArray = new Array(getXRef());
cropBoxArray->add(Object(cropBox->x1));
@@ -1654,10 +1786,10 @@ void PDFDoc::replacePageDict(int pageNo, int rotate,
cropBoxArray->add(Object(cropBox->y2));
Object cropBoxObject(cropBoxArray);
trimBoxObject = cropBoxObject.copy();
- pageDict->add(copyString("CropBox"), std::move(cropBoxObject));
+ pageDict->add("CropBox", std::move(cropBoxObject));
}
- pageDict->add(copyString("TrimBox"), std::move(trimBoxObject));
- pageDict->add(copyString("Rotate"), Object(rotate));
+ pageDict->add("TrimBox", std::move(trimBoxObject));
+ pageDict->add("Rotate", Object(rotate));
getXRef()->setModifiedObject(&page, *refPage);
}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.h b/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.h
index 1678d1678e9..3353db7463c 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/PDFDoc.h
@@ -31,6 +31,7 @@
// Copyright (C) 2015 André Esser <bepandre@hotmail.com>
// Copyright (C) 2016 Jakub Alba <jakubalba@gmail.com>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Evangelos Rigas <erigas@rnd2.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -74,6 +75,41 @@ enum PDFWriteMode {
writeForceIncremental
};
+enum PDFSubtype {
+ subtypeNull,
+ subtypePDFA,
+ subtypePDFE,
+ subtypePDFUA,
+ subtypePDFVT,
+ subtypePDFX,
+ subtypeNone
+};
+
+enum PDFSubtypePart {
+ subtypePartNull,
+ subtypePart1,
+ subtypePart2,
+ subtypePart3,
+ subtypePart4,
+ subtypePart5,
+ subtypePart6,
+ subtypePart7,
+ subtypePart8,
+ subtypePartNone
+};
+
+enum PDFSubtypeConformance {
+ subtypeConfNull,
+ subtypeConfA,
+ subtypeConfB,
+ subtypeConfG,
+ subtypeConfN,
+ subtypeConfP,
+ subtypeConfPG,
+ subtypeConfU,
+ subtypeConfNone
+};
+
//------------------------------------------------------------------------
// PDFDoc
//------------------------------------------------------------------------
@@ -273,6 +309,11 @@ public:
GooString *getDocInfoCreatDate() { return getDocInfoStringEntry("CreationDate"); }
GooString *getDocInfoModDate() { return getDocInfoStringEntry("ModDate"); }
+ // Return the PDF subtype, part, and conformance
+ PDFSubtype getPDFSubtype() const { return pdfSubtype; }
+ PDFSubtypePart getPDFSubtypePart() const { return pdfPart; }
+ PDFSubtypeConformance getPDFSubtypeConformance() const { return pdfConformance; }
+
// Return the PDF version specified by the file.
int getPDFMajorVersion() { return pdfMajorVersion; }
int getPDFMinorVersion() { return pdfMinorVersion; }
@@ -346,6 +387,8 @@ private:
GBool checkFooter();
void checkHeader();
GBool checkEncryption(GooString *ownerPassword, GooString *userPassword);
+ void extractPDFSubtype();
+
// Get the offset of the start xref table.
Goffset getStartXRef(GBool tryingToReconstruct = gFalse);
// Get the offset of the entries in the main XRef table of a
@@ -365,6 +408,9 @@ private:
void *guiData;
int pdfMajorVersion;
int pdfMinorVersion;
+ PDFSubtype pdfSubtype;
+ PDFSubtypePart pdfPart;
+ PDFSubtypeConformance pdfConformance;
Linearization *linearization;
// linearizationState = 0: unchecked
// linearizationState = 1: checked and valid
diff --git a/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc b/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc
index d1ead5862a8..d6a3177313a 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc
@@ -33,6 +33,7 @@
// Copyright (C) 2016 Caolán McNamara <caolanm@redhat.com>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
+// Copyright (C) 2018 Philipp Knechtges <philipp-dev@knechtges.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -52,6 +53,7 @@
#include <math.h>
#include <limits.h>
#include <algorithm>
+#include <array>
#include "goo/GooString.h"
#include "goo/GooList.h"
#include "poppler-config.h"
@@ -4927,6 +4929,60 @@ GBool PSOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading,
return gTrue;
}
+GBool PSOutputDev::patchMeshShadedFill(GfxState *state,
+ GfxPatchMeshShading *shading) {
+ // TODO: support parametrized shading
+ if (level < psLevel3 || shading->isParameterized()) {
+ return gFalse;
+ }
+
+ writePS("%% Begin patchMeshShadedFill\n");
+
+ // ShadingType 7 shadings are pretty much the same for pdf and ps.
+ // As such, we basically just need to invert GfxPatchMeshShading::parse here.
+
+ writePS("<<\n");
+ writePS(" /ShadingType 7\n");
+ writePS(" /ColorSpace ");
+ dumpColorSpaceL2(shading->getColorSpace(), gFalse, gFalse, gFalse);
+ writePS("\n");
+ writePS(" /DataSource [\n");
+
+ const int ncomps = shading->getColorSpace()->getNComps();
+
+ for (int i = 0; i < shading->getNPatches(); ++i) {
+ const auto& patch = *shading->getPatch(i);
+ // Print Flag, for us always f = 0
+ writePS(" 0 \n");
+
+ // Print coordinates
+ const std::array<std::pair<int,int>, 16> coordindices = {{ {0,0}, {0,1}, {0,2}, {0,3},
+ {1,3}, {2,3}, {3,3}, {3,2},
+ {3,1}, {3,0}, {2,0}, {1,0},
+ {1,1}, {1,2}, {2,2}, {2,1} }};
+ for (const auto& index: coordindices) {
+ writePSFmt(" {0:.6g} {1:.6g}\n", patch.x[index.first][index.second],
+ patch.y[index.first][index.second]);
+ }
+
+ // Print colors
+ const std::array<std::pair<int, int>, 4> colindices = {{ {0,0}, {0,1}, {1,1}, {1,0} }};
+ for (const auto& index: colindices) {
+ writePS(" ");
+ for (int comp = 0; comp < ncomps; ++comp) {
+ writePSFmt(" {0:.6g}", colToDbl(patch.color[index.first][index.second].c[comp]));
+ }
+ writePS("\n");
+ }
+ }
+
+ writePS(" ]\n");
+
+ writePS(">> shfill\n");
+ writePS("%% End patchMeshShadedFill\n");
+ return gTrue;
+}
+
void PSOutputDev::clip(GfxState *state) {
doPath(state->getPath());
writePS("W\n");
diff --git a/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.h b/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.h
index b51cf472977..ef6106bbe34 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/PSOutputDev.h
@@ -26,6 +26,7 @@
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
+// Copyright (C) 2018 Philipp Knechtges <philipp-dev@knechtges.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -152,7 +153,7 @@ public:
// radialShadedFill()? If this returns false, these shaded fills
// will be reduced to a series of other drawing operations.
GBool useShadedFills(int type) override
- { return type < 4 && level >= psLevel2; }
+ { return (type < 4 && level >= psLevel2) || (type == 7 && level >= psLevel3); }
// Does this device use drawForm()? If this returns false,
// form-type XObjects will be interpreted (i.e., unrolled).
@@ -249,6 +250,7 @@ public:
GfxFunctionShading *shading) override;
GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/) override;
GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/) override;
+ GBool patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading) override;
//----- path clipping
void clip(GfxState *state) override;
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Parser.cc b/Build/source/libs/poppler/poppler-src/poppler/Parser.cc
index 8b0093e3fcf..1d5240c9d65 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Parser.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Parser.cc
@@ -20,6 +20,7 @@
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -112,20 +113,18 @@ Object Parser::getObj(GBool simpleOnly,
if (strict) goto err;
shift();
} else {
- // buf1 might go away in shift(), so construct the key
- char *key = copyString(buf1.getName());
+ // buf1 will go away in shift(), so keep the key
+ const auto key = std::move(buf1);
shift();
if (buf1.isEOF() || buf1.isError()) {
- gfree(key);
if (strict && buf1.isError()) goto err;
break;
}
Object obj2 = getObj(gFalse, fileKey, encAlgorithm, keyLength, objNum, objGen, recursion + 1);
if (unlikely(obj2.isError() && recursion + 1 >= recursionLimit)) {
- gfree(key);
break;
}
- obj.dictAdd(key, std::move(obj2));
+ obj.dictAdd(key.getName(), std::move(obj2));
}
}
if (buf1.isEOF()) {
diff --git a/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.cc b/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.cc
index 76a54c0c083..11e47e5bdb2 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.cc
@@ -127,16 +127,16 @@ void SignatureInfo::setSubjectDN(const char *subjectDN)
subject_dn = strdup(subjectDN);
}
-void SignatureInfo::setLocation(char *loc)
+void SignatureInfo::setLocation(const char *loc)
{
free(location);
- location = loc;
+ location = strdup(loc);
}
-void SignatureInfo::setReason(char *signingReason)
+void SignatureInfo::setReason(const char *signingReason)
{
free(reason);
- reason = signingReason;
+ reason = strdup(signingReason);
}
void SignatureInfo::setHashAlgorithm(int type)
diff --git a/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.h b/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.h
index 1e9f5f9d63e..f4554c60a6f 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/SignatureInfo.h
@@ -61,8 +61,8 @@ public:
void setCertificateValStatus(enum CertificateValidationStatus );
void setSignerName(char *);
void setSubjectDN(const char *);
- void setLocation(char *);
- void setReason(char *);
+ void setLocation(const char *);
+ void setReason(const char *);
void setHashAlgorithm(int);
void setSigningTime(time_t);
void setSubFilterSupport(bool isSupported) { sig_subfilter_supported = isSupported; }
diff --git a/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc b/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc
index 3e883970e3e..6faa7477866 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc
@@ -2294,88 +2294,71 @@ reload:
}
void SplashOutputDev::stroke(GfxState *state) {
- SplashPath *path;
-
if (state->getStrokeColorSpace()->isNonMarking()) {
return;
}
setOverprintMask(state->getStrokeColorSpace(), state->getStrokeOverprint(),
state->getOverprintMode(), state->getStrokeColor());
- path = convertPath(state, state->getPath(), gFalse);
- splash->stroke(path);
- delete path;
+ SplashPath path = convertPath(state, state->getPath(), gFalse);
+ splash->stroke(&path);
}
void SplashOutputDev::fill(GfxState *state) {
- SplashPath *path;
-
if (state->getFillColorSpace()->isNonMarking()) {
return;
}
setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
state->getOverprintMode(), state->getFillColor());
- path = convertPath(state, state->getPath(), gTrue);
- splash->fill(path, gFalse);
- delete path;
+ SplashPath path = convertPath(state, state->getPath(), gTrue);
+ splash->fill(&path, gFalse);
}
void SplashOutputDev::eoFill(GfxState *state) {
- SplashPath *path;
-
if (state->getFillColorSpace()->isNonMarking()) {
return;
}
setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
state->getOverprintMode(), state->getFillColor());
- path = convertPath(state, state->getPath(), gTrue);
- splash->fill(path, gTrue);
- delete path;
+ SplashPath path = convertPath(state, state->getPath(), gTrue);
+ splash->fill(&path, gTrue);
}
void SplashOutputDev::clip(GfxState *state) {
- SplashPath *path;
-
- path = convertPath(state, state->getPath(), gTrue);
- splash->clipToPath(path, gFalse);
- delete path;
+ SplashPath path = convertPath(state, state->getPath(), gTrue);
+ splash->clipToPath(&path, gFalse);
}
void SplashOutputDev::eoClip(GfxState *state) {
- SplashPath *path;
-
- path = convertPath(state, state->getPath(), gTrue);
- splash->clipToPath(path, gTrue);
- delete path;
+ SplashPath path = convertPath(state, state->getPath(), gTrue);
+ splash->clipToPath(&path, gTrue);
}
void SplashOutputDev::clipToStrokePath(GfxState *state) {
- SplashPath *path, *path2;
+ SplashPath *path2;
- path = convertPath(state, state->getPath(), gFalse);
- path2 = splash->makeStrokePath(path, state->getLineWidth());
- delete path;
+ SplashPath path = convertPath(state, state->getPath(), gFalse);
+ path2 = splash->makeStrokePath(&path, state->getLineWidth());
splash->clipToPath(path2, gFalse);
delete path2;
}
-SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path,
+SplashPath SplashOutputDev::convertPath(GfxState *state, GfxPath *path,
GBool dropEmptySubpaths) {
- SplashPath *sPath;
+ SplashPath sPath;
GfxSubpath *subpath;
int n, i, j;
n = dropEmptySubpaths ? 1 : 0;
- sPath = new SplashPath();
for (i = 0; i < path->getNumSubpaths(); ++i) {
subpath = path->getSubpath(i);
if (subpath->getNumPoints() > n) {
- sPath->reserve(subpath->getNumPoints() + 1);
- sPath->moveTo((SplashCoord)subpath->getX(0),
+ sPath.reserve(subpath->getNumPoints() + 1);
+ sPath.moveTo((SplashCoord)subpath->getX(0),
(SplashCoord)subpath->getY(0));
j = 1;
while (j < subpath->getNumPoints()) {
if (subpath->getCurve(j)) {
- sPath->curveTo((SplashCoord)subpath->getX(j),
+ sPath.curveTo((SplashCoord)subpath->getX(j),
(SplashCoord)subpath->getY(j),
(SplashCoord)subpath->getX(j+1),
(SplashCoord)subpath->getY(j+1),
@@ -2383,13 +2366,13 @@ SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path,
(SplashCoord)subpath->getY(j+2));
j += 3;
} else {
- sPath->lineTo((SplashCoord)subpath->getX(j),
+ sPath.lineTo((SplashCoord)subpath->getX(j),
(SplashCoord)subpath->getY(j));
++j;
}
}
if (subpath->isClosed()) {
- sPath->close();
+ sPath.close();
}
}
}
@@ -3570,14 +3553,16 @@ void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
}
break;
case splashModeXBGR8:
- imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
- for (i = 0; i < n; ++i) {
- pix = (Guchar)i;
- colorMap->getRGB(&pix, &rgb);
- imgData.lookup[4*i] = colToByte(rgb.r);
- imgData.lookup[4*i+1] = colToByte(rgb.g);
- imgData.lookup[4*i+2] = colToByte(rgb.b);
- imgData.lookup[4*i+3] = 255;
+ imgData.lookup = (SplashColorPtr)gmallocn_checkoverflow(n, 4);
+ if (likely(imgData.lookup != nullptr)) {
+ for (i = 0; i < n; ++i) {
+ pix = (Guchar)i;
+ colorMap->getRGB(&pix, &rgb);
+ imgData.lookup[4*i] = colToByte(rgb.r);
+ imgData.lookup[4*i+1] = colToByte(rgb.g);
+ imgData.lookup[4*i+2] = colToByte(rgb.b);
+ imgData.lookup[4*i+3] = 255;
+ }
}
break;
#ifdef SPLASH_CMYK
@@ -4086,14 +4071,16 @@ void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref,
}
break;
case splashModeXBGR8:
- imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
- for (i = 0; i < n; ++i) {
- pix = (Guchar)i;
- colorMap->getRGB(&pix, &rgb);
- imgData.lookup[4*i] = colToByte(rgb.r);
- imgData.lookup[4*i+1] = colToByte(rgb.g);
- imgData.lookup[4*i+2] = colToByte(rgb.b);
- imgData.lookup[4*i+3] = 255;
+ imgData.lookup = (SplashColorPtr)gmallocn_checkoverflow(n, 4);
+ if (likely(imgData.lookup != nullptr)) {
+ for (i = 0; i < n; ++i) {
+ pix = (Guchar)i;
+ colorMap->getRGB(&pix, &rgb);
+ imgData.lookup[4*i] = colToByte(rgb.r);
+ imgData.lookup[4*i+1] = colToByte(rgb.g);
+ imgData.lookup[4*i+2] = colToByte(rgb.b);
+ imgData.lookup[4*i+3] = 255;
+ }
}
break;
#ifdef SPLASH_CMYK
@@ -4784,7 +4771,6 @@ GBool SplashOutputDev::gouraudTriangleShadedFill(GfxState *state, GfxGouraudTria
GBool SplashOutputDev::univariateShadedFill(GfxState *state, SplashUnivariatePattern *pattern, double tMin, double tMax) {
double xMin, yMin, xMax, yMax;
- SplashPath *path;
GBool vaa = getVectorAntialias();
// restore vector antialias because we support it here
setVectorAntialias(gTrue);
@@ -4831,17 +4817,16 @@ GBool SplashOutputDev::univariateShadedFill(GfxState *state, SplashUnivariatePat
state->lineTo(xMax, yMax);
state->lineTo(xMin, yMax);
state->closePath();
- path = convertPath(state, state->getPath(), gTrue);
+ SplashPath path = convertPath(state, state->getPath(), gTrue);
#ifdef SPLASH_CMYK
pattern->getShading()->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS);
#endif
setOverprintMask(pattern->getShading()->getColorSpace(), state->getFillOverprint(),
state->getOverprintMode(), nullptr);
- retVal = (splash->shadedFill(path, pattern->getShading()->getHasBBox(), pattern) == splashOk);
+ retVal = (splash->shadedFill(&path, pattern->getShading()->getHasBBox(), pattern) == splashOk);
state->clearPath();
setVectorAntialias(vaa);
- delete path;
return retVal;
}
@@ -4849,7 +4834,6 @@ GBool SplashOutputDev::univariateShadedFill(GfxState *state, SplashUnivariatePat
GBool SplashOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) {
SplashFunctionPattern *pattern = new SplashFunctionPattern(colorMode, state, shading);
double xMin, yMin, xMax, yMax;
- SplashPath *path;
GBool vaa = getVectorAntialias();
// restore vector antialias because we support it here
setVectorAntialias(gTrue);
@@ -4896,17 +4880,16 @@ GBool SplashOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *s
state->lineTo(xMax, yMax);
state->lineTo(xMin, yMax);
state->closePath();
- path = convertPath(state, state->getPath(), gTrue);
+ SplashPath path = convertPath(state, state->getPath(), gTrue);
#ifdef SPLASH_CMYK
pattern->getShading()->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS);
#endif
setOverprintMask(pattern->getShading()->getColorSpace(), state->getFillOverprint(),
state->getOverprintMode(), nullptr);
- retVal = (splash->shadedFill(path, pattern->getShading()->getHasBBox(), pattern) == splashOk);
+ retVal = (splash->shadedFill(&path, pattern->getShading()->getHasBBox(), pattern) == splashOk);
state->clearPath();
setVectorAntialias(vaa);
- delete path;
delete pattern;
diff --git a/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.h b/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.h
index 3a1b594e409..4d72d9c7a8f 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/SplashOutputDev.h
@@ -22,6 +22,7 @@
// Copyright (C) 2011, 2017 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2012, 2015, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2015, 2016 William Bader <williambader@hotmail.com>
+// Copyright (C) 2018 Stefan Brüns <stefan.bruens@rwth-aachen.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -410,7 +411,7 @@ private:
static void getMatteColor( SplashColorMode colorMode, GfxImageColorMap *colorMap, GfxColor * matteColor, SplashColor splashMatteColor);
void setOverprintMask(GfxColorSpace *colorSpace, GBool overprintFlag,
int overprintMode, GfxColor *singleColor, GBool grayIndexed = gFalse);
- SplashPath *convertPath(GfxState *state, GfxPath *path,
+ SplashPath convertPath(GfxState *state, GfxPath *path,
GBool dropEmptySubpaths);
void drawType3Glyph(GfxState *state, T3FontCache *t3Font,
T3FontCacheTag *tag, Guchar *data);
diff --git a/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.cc b/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.cc
index 58a4b6a63c7..954b76a741c 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.cc
@@ -9,6 +9,7 @@
// Copyright 2017 Jan-Erik S <janerik234678@gmail.com>
// Copyright 2017, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright 2017, 2018 Adrian Johnson <ajohnson@redneon.com>
+// Copyright 2018, Adam Reichold <adam.reichold@t-online.de>
//
//========================================================================
@@ -110,7 +111,7 @@ void StructTreeRoot::parse(Dict *root)
}
// refToParentMap is only used during parsing. Ensure all memory used by it is freed.
- std::multimap<Ref, Parent*, RefCompare>().swap(refToParentMap);
+ std::multimap<Ref, Parent*>().swap(refToParentMap);
}
void StructTreeRoot::parseNumberTreeNode(Dict *node)
diff --git a/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.h b/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.h
index 89c7941cebf..90848649ae5 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/StructTreeRoot.h
@@ -7,6 +7,7 @@
// Copyright 2013, 2014 Igalia S.L.
// Copyright 2018 Albert Astals Cid <aacid@kde.org>
// Copyright 2018 Adrian Johnson <ajohnson@redneon.com>
+// Copyright 2018 Adam Reichold <adam.reichold@t-online.de>
//
//========================================================================
@@ -79,7 +80,7 @@ private:
Object classMap;
ElemPtrArray elements;
std::map<int, std::vector<Parent> > parentTree;
- std::multimap<Ref, Parent*, RefCompare> refToParentMap;
+ std::multimap<Ref, Parent*> refToParentMap;
void parse(Dict *rootDict);
void parseNumberTreeNode(Dict *node);
diff --git a/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc b/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc
index 4a3070af7c0..7a92ff3b613 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc
@@ -37,6 +37,7 @@
// Copyright (C) 2013 Ed Catmur <ed@catmur.co.uk>
// Copyright (C) 2016 Khaled Hosny <khaledhosny@eglug.org>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Sanchit Anand <sanxchit@gmail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -5878,3 +5879,7 @@ TextPage *TextOutputDev::takeText() {
text = new TextPage(rawOrder);
return ret;
}
+
+TextFlow *TextOutputDev::getFlows() {
+ return text->getFlows();
+}
diff --git a/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.h b/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.h
index 092acd6730f..f243554540b 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.h
+++ b/Build/source/libs/poppler/poppler-src/poppler/TextOutputDev.h
@@ -22,6 +22,7 @@
// Copyright (C) 2012, 2013, 2015, 2016 Jason Crain <jason@aquaticape.us>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by the LiMux project of the city of Munich
+// Copyright (C) 2018 Sanchit Anand <sanxchit@gmail.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -890,6 +891,10 @@ public:
// Turn extra processing for HTML conversion on or off.
void enableHTMLExtras(GBool doHTMLA) { doHTML = doHTMLA; }
+ // Get the head of the linked list of TextFlows for the
+ // last rasterized page.
+ TextFlow *getFlows();
+
private:
TextOutputFunc outputFunc; // output function
diff --git a/Build/source/libs/poppler/poppler-src/poppler/XRef.cc b/Build/source/libs/poppler/poppler-src/poppler/XRef.cc
index 4352146ec45..078274b4518 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/XRef.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/XRef.cc
@@ -773,10 +773,10 @@ GBool XRef::readXRefStream(Stream *xrefStr, Goffset *pos) {
}
obj = dict->lookupNF("Prev");
- if (obj.isInt()) {
+ if (obj.isInt() && obj.getInt() >= 0) {
*pos = obj.getInt();
more = gTrue;
- } else if (obj.isInt64()) {
+ } else if (obj.isInt64() && obj.getInt64() >= 0) {
*pos = obj.getInt64();
more = gTrue;
} else {
diff --git a/Build/source/libs/poppler/poppler-src/poppler/poppler-config.h.cmake b/Build/source/libs/poppler/poppler-src/poppler/poppler-config.h.cmake
index f6a6c27ff6b..20e3dd38393 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/poppler-config.h.cmake
+++ b/Build/source/libs/poppler/poppler-src/poppler/poppler-config.h.cmake
@@ -17,6 +17,7 @@
// Copyright (C) 2014 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2016 Tor Lillqvist <tml@collabora.com>
// Copyright (C) 2017 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -121,8 +122,7 @@
// Also, there are preprocessor symbols in the header files
// that are used but never defined when building poppler using configure
-// or cmake: DISABLE_OUTLINE, DEBUG_MEM,
-// ENABLE_PLUGINS, DEBUG_FORMS
+// or cmake: DISABLE_OUTLINE, ENABLE_PLUGINS, DEBUG_FORMS
//------------------------------------------------------------------------
// version
diff --git a/Build/source/libs/poppler/version.ac b/Build/source/libs/poppler/version.ac
index 7f633325435..c03436580de 100644
--- a/Build/source/libs/poppler/version.ac
+++ b/Build/source/libs/poppler/version.ac
@@ -9,4 +9,4 @@ dnl
dnl --------------------------------------------------------
dnl
dnl m4-include this file to define the current poppler version
-m4_define([poppler_version], [0.68.0])
+m4_define([poppler_version], [0.69.0])