texlive[55138] Build/source: remove poppler support from TL

commits+karl at tug.org commits+karl at tug.org
Thu May 14 19:47:48 CEST 2020


Revision: 55138
          http://tug.org/svn/texlive?view=revision&revision=55138
Author:   karl
Date:     2020-05-14 19:47:47 +0200 (Thu, 14 May 2020)
Log Message:
-----------
remove poppler support from TL

Modified Paths:
--------------
    trunk/Build/source/ChangeLog
    trunk/Build/source/Makefile.in
    trunk/Build/source/aclocal.m4
    trunk/Build/source/configure
    trunk/Build/source/doc/ChangeLog
    trunk/Build/source/doc/Makefile.in
    trunk/Build/source/doc/build-tools.txt
    trunk/Build/source/doc/tlbuild.info
    trunk/Build/source/doc/tlbuild.texi
    trunk/Build/source/libs/ChangeLog
    trunk/Build/source/libs/Makefile.in
    trunk/Build/source/libs/README
    trunk/Build/source/libs/aclocal.m4
    trunk/Build/source/libs/configure
    trunk/Build/source/libs/xpdf/ChangeLog
    trunk/Build/source/libs/xpdf/ac/xpdf.ac
    trunk/Build/source/m4/ChangeLog
    trunk/Build/source/m4/kpse-pkgs.m4
    trunk/Build/source/m4/kpse-xpdf-flags.m4
    trunk/Build/source/texk/Makefile.in
    trunk/Build/source/texk/aclocal.m4
    trunk/Build/source/texk/configure
    trunk/Build/source/texk/dvidvi/Makefile.in
    trunk/Build/source/texk/dvidvi/configure
    trunk/Build/source/texk/dviout-util/Makefile.in
    trunk/Build/source/texk/dvipdfm-x/Makefile.in
    trunk/Build/source/texk/dvipsk/Makefile.in
    trunk/Build/source/texk/seetexk/Makefile.in
    trunk/Build/source/texk/seetexk/configure
    trunk/Build/source/texk/texlive/linked_scripts/Makefile.in
    trunk/Build/source/texk/web2c/ChangeLog
    trunk/Build/source/texk/web2c/Makefile.am
    trunk/Build/source/texk/web2c/Makefile.in
    trunk/Build/source/texk/web2c/ac/web2c.ac
    trunk/Build/source/texk/web2c/aclocal.m4
    trunk/Build/source/texk/web2c/configure
    trunk/Build/source/texk/web2c/configure.ac
    trunk/Build/source/texk/web2c/doc/Makefile.in
    trunk/Build/source/texk/web2c/lib/Makefile.in
    trunk/Build/source/texk/web2c/man/Makefile.in
    trunk/Build/source/texk/web2c/omegafonts/Makefile.in
    trunk/Build/source/texk/web2c/otps/Makefile.in
    trunk/Build/source/texk/web2c/otps/win32/Makefile.in
    trunk/Build/source/texk/web2c/pdftexdir/ChangeLog
    trunk/Build/source/texk/web2c/window/Makefile.in
    trunk/Build/source/utils/Makefile.in
    trunk/Build/source/utils/aclocal.m4
    trunk/Build/source/utils/configure

Removed Paths:
-------------
    trunk/Build/source/libs/poppler/
    trunk/Build/source/m4/kpse-poppler-flags.m4
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.68.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.69.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.70.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.71.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.72.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.75.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.76.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.83.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.86.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-newpoppler.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.71.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.72.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.76.0.cc
    trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.83.0.cc

Property Changed:
----------------
    trunk/Build/source/libs/pplib/
    trunk/Build/source/libs/xpdf/ac/xpdf.ac
    trunk/Build/source/m4/kpse-luajit-flags.m4
    trunk/Build/source/m4/kpse-win32.m4
    trunk/Build/source/m4/kpse-xpdf-flags.m4

Modified: trunk/Build/source/ChangeLog
===================================================================
--- trunk/Build/source/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,3 +1,7 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* reautoconf for removal of poppler support.
+
 2020-04-10  Karl Berry  <karl at tug.org>
 
 	* version.ac: 2020/dev.

Modified: trunk/Build/source/Makefile.in
===================================================================
--- trunk/Build/source/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -107,7 +107,6 @@
 	$(top_srcdir)/m4/kpse-options.m4 \
 	$(top_srcdir)/m4/kpse-pixman-flags.m4 \
 	$(top_srcdir)/m4/kpse-pkgs.m4 \
-	$(top_srcdir)/m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/m4/kpse-setup.m4 \
@@ -181,7 +180,6 @@
 	$(top_srcdir)/libs/graphite2/ac/withenable.ac \
 	$(top_srcdir)/libs/zziplib/ac/withenable.ac \
 	$(top_srcdir)/libs/xpdf/ac/withenable.ac \
-	$(top_srcdir)/libs/poppler/ac/withenable.ac \
 	$(top_srcdir)/libs/mpfr/ac/withenable.ac \
 	$(top_srcdir)/libs/gmp/ac/withenable.ac \
 	$(top_srcdir)/libs/cairo/ac/withenable.ac \
@@ -207,7 +205,6 @@
 	$(top_srcdir)/libs/cairo/ac/cairo.ac \
 	$(top_srcdir)/libs/gmp/ac/gmp.ac \
 	$(top_srcdir)/libs/mpfr/ac/mpfr.ac \
-	$(top_srcdir)/libs/poppler/ac/poppler.ac \
 	$(top_srcdir)/libs/xpdf/ac/xpdf.ac \
 	$(top_srcdir)/libs/zziplib/ac/zziplib.ac \
 	$(top_srcdir)/libs/graphite2/ac/graphite2.ac \

Modified: trunk/Build/source/aclocal.m4
===================================================================
--- trunk/Build/source/aclocal.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/aclocal.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1189,7 +1189,6 @@
 m4_include([m4/kpse-options.m4])
 m4_include([m4/kpse-pixman-flags.m4])
 m4_include([m4/kpse-pkgs.m4])
-m4_include([m4/kpse-poppler-flags.m4])
 m4_include([m4/kpse-pplib-flags.m4])
 m4_include([m4/kpse-ptexenc-flags.m4])
 m4_include([m4/kpse-setup.m4])

Modified: trunk/Build/source/configure
===================================================================
--- trunk/Build/source/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -903,8 +903,6 @@
 with_system_teckit
 with_system_graphite2
 with_system_zziplib
-with_system_xpdf
-with_system_poppler
 with_system_mpfr
 with_mpfr_includes
 with_mpfr_libdir
@@ -1761,10 +1759,6 @@
                           (requires pkg-config)
   --with-system-zziplib   use installed zziplib headers and library (requires
                           pkg-config)
-  --with-system-xpdf      use installed poppler headers and library instead of
-                          xpdf library from TL (requires pkg-config)
-  --with-system-poppler   use installed poppler headers and library (requires
-                          pkg-config)
   --with-system-mpfr      use installed mpfr headers and library
   --with-mpfr-includes=DIR
                           mpfr headers installed in DIR
@@ -4827,7 +4821,7 @@
 fi
 
 test "x$enable_web2c:$enable_xetex" = xyes:yes && {
-  need_poppler=yes
+  need_pplib=yes
   need_libpng=yes
   need_freetype2=yes
   need_teckit=yes
@@ -5989,11 +5983,7 @@
 
 ## libs/xpdf/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
 ## configure options and TL libraries required for xpdf
-
-# Check whether --with-system-xpdf was given.
-if test "${with_system_xpdf+set}" = set; then :
-  withval=$with_system_xpdf;
-fi
+: "kpse_xpdf_options - no-op"
 if test "x$with_system_xpdf" = x; then
   if test -f $srcdir/libs/xpdf/configure; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`xpdf' headers and library from TL tree" >&5
@@ -6017,50 +6007,6 @@
   fi
 fi
 
-## libs/poppler/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/poppler/
-## configure options and TL libraries required for poppler
-
-# Check whether --with-system-poppler was given.
-if test "${with_system_poppler+set}" = set; then :
-  withval=$with_system_poppler;
-fi
-if test "x$with_system_poppler" = x; then
-  if test -f $srcdir/libs/poppler/configure; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`poppler' headers and library from TL tree" >&5
-$as_echo "$as_me: Assuming \`poppler' headers and library from TL tree" >&6;}
-    with_system_poppler=no
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming installed \`poppler' headers and library" >&5
-$as_echo "$as_me: Assuming installed \`poppler' headers and library" >&6;}
-    with_system_poppler=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-poppler=$with_system_poppler'"
-elif test "x$with_system_poppler" = xyes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: Using installed \`poppler' headers and library" >&5
-$as_echo "$as_me: Using installed \`poppler' headers and library" >&6;}
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: Using \`poppler' headers and library from TL tree" >&5
-$as_echo "$as_me: Using \`poppler' headers and library from TL tree" >&6;}
-  if test "x$with_system_poppler" != xno; then
-    with_system_poppler=no
-    ac_configure_args="$ac_configure_args '--without-system-poppler'"
-  fi
-fi
-if test "x$with_system_poppler" = xyes; then
-  if test "x$with_system_zlib" = x; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}:   ->  installed \`zlib' headers and library" >&5
-$as_echo "$as_me:   ->  installed \`zlib' headers and library" >&6;}
-    with_system_zlib=yes
-    ac_configure_args="$ac_configure_args '--with-system-zlib'"
-  elif test "x$with_system_zlib" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-poppler' requires \`--with-system-zlib'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_poppler" = xyes && {
-  need_zlib=yes
-}
-
 ## libs/mpfr/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/mpfr/
 ## configure options and TL libraries required for mpfr
 
@@ -21536,26 +21482,8 @@
   MPFR_LIBS="-L$with_mpfr_libdir $MPFR_LIBS"
 fi
 
-if $PKG_CONFIG poppler --atleast-version=0.30; then
-  POPPLER_INCLUDES=`$PKG_CONFIG poppler --cflags`
-  POPPLER_LIBS=`$PKG_CONFIG poppler --libs`
-elif test "x$need_poppler:$with_system_poppler" = xyes:yes; then
-  as_fn_error $? "did not find poppler 0.30 or better" "$LINENO" 5
-fi
+: "kpse_xpdf_system_flags - no-op"
 
-POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
-POPPLER_INCLUDES="$POPPLER_VERSION $POPPLER_INCLUDES"
-
-if $PKG_CONFIG poppler --atleast-version=0.12; then
-  XPDF_INCLUDES=`$PKG_CONFIG poppler --cflags`
-  XPDF_LIBS=`$PKG_CONFIG poppler --libs`
-elif test "x$need_xpdf:$with_system_xpdf" = xyes:yes; then
-  as_fn_error $? "did not find poppler 0.12 or better" "$LINENO" 5
-fi
-
-POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
-XPDF_INCLUDES="$POPPLER_VERSION $XPDF_INCLUDES"
-
 if $PKG_CONFIG zziplib --atleast-version=0.12; then
   ZZIPLIB_INCLUDES=`$PKG_CONFIG zziplib --cflags`
   ZZIPLIB_LIBS=`$PKG_CONFIG zziplib --libs`
@@ -22108,47 +22036,9 @@
 $as_echo "$kpse_res" >&6; }
 fi
 
-## libs/poppler/ac/poppler.ac: configure.ac fragment for the TeX Live subdirectory libs/poppler/
-## basic check of system poppler
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test "x$need_poppler:$with_system_poppler" = xyes:yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking requested system \`poppler' library" >&5
-$as_echo_n "checking requested system \`poppler' library... " >&6; }
-  CPPFLAGS="$POPPLER_INCLUDES $CPPFLAGS"
-  LIBS="$POPPLER_LIBS $LIBS"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <GfxFont.h>
-int
-main ()
-{
-GfxFont *gfxFont; gfxFont->decRefCnt();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  syslib_used=yes kpse_res=ok
-else
-  syslib_status=no kpse_res=failed
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_res" >&5
-$as_echo "$kpse_res" >&6; }
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
 ## libs/xpdf/ac/xpdf.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
-## basic check of system xpdf (poppler)
+## basic check of system xpdf (a.k.a. poppler, no longer supported in
+## TL sources)
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'

Modified: trunk/Build/source/doc/ChangeLog
===================================================================
--- trunk/Build/source/doc/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/doc/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,3 +1,8 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* tlbuild.texi: remove poppler references.
+	* build-tools.txt: bison 3.6.1.
+
 2020-03-13  Karl Berry  <karl at tug.org>
 
 	* tlbuild.texi: update for 2020.

Modified: trunk/Build/source/doc/Makefile.in
===================================================================
--- trunk/Build/source/doc/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/doc/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -107,7 +107,6 @@
 	$(top_srcdir)/m4/kpse-options.m4 \
 	$(top_srcdir)/m4/kpse-pixman-flags.m4 \
 	$(top_srcdir)/m4/kpse-pkgs.m4 \
-	$(top_srcdir)/m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/m4/kpse-setup.m4 \
@@ -181,7 +180,6 @@
 	$(top_srcdir)/libs/graphite2/ac/withenable.ac \
 	$(top_srcdir)/libs/zziplib/ac/withenable.ac \
 	$(top_srcdir)/libs/xpdf/ac/withenable.ac \
-	$(top_srcdir)/libs/poppler/ac/withenable.ac \
 	$(top_srcdir)/libs/mpfr/ac/withenable.ac \
 	$(top_srcdir)/libs/gmp/ac/withenable.ac \
 	$(top_srcdir)/libs/cairo/ac/withenable.ac \
@@ -207,7 +205,6 @@
 	$(top_srcdir)/libs/cairo/ac/cairo.ac \
 	$(top_srcdir)/libs/gmp/ac/gmp.ac \
 	$(top_srcdir)/libs/mpfr/ac/mpfr.ac \
-	$(top_srcdir)/libs/poppler/ac/poppler.ac \
 	$(top_srcdir)/libs/xpdf/ac/xpdf.ac \
 	$(top_srcdir)/libs/zziplib/ac/zziplib.ac \
 	$(top_srcdir)/libs/graphite2/ac/graphite2.ac \

Modified: trunk/Build/source/doc/build-tools.txt
===================================================================
--- trunk/Build/source/doc/build-tools.txt	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/doc/build-tools.txt	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,6 +1,6 @@
 autoconf (GNU Autoconf) 2.69
 automake (GNU automake) 1.16.2
-bison (GNU Bison) 3.5.4
+bison (GNU Bison) 3.6.1
 flex 2.6.0
 ltmain.sh (GNU libtool) 2.4.6
 m4 (GNU M4) 1.4.18

Modified: trunk/Build/source/doc/tlbuild.info
===================================================================
(Binary files differ)

Modified: trunk/Build/source/doc/tlbuild.texi
===================================================================
--- trunk/Build/source/doc/tlbuild.texi	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/doc/tlbuild.texi	2020-05-14 17:47:47 UTC (rev 55138)
@@ -233,10 +233,9 @@
 
 @cindex C++11, required
 A C++11 compiler is similarly required because of the third-party
-libraries ICU and Poppler; the program @code{dvisvgm} also requires
-C++11.  It is possible to build everything else with older compilers,
-but you have to remove the C++11-dependent sources.  @xref{Build one
-package}.
+library ICU; the program @code{dvisvgm} also requires C++11.  It is
+possible to build everything else with older compilers, but you have
+to remove the C++11-dependent sources.  @xref{Build one package}.
 
 A few programs in the tree have additional requirements:
 
@@ -504,7 +503,7 @@
 suffice, unfortunately.  Specifically, before running @code{configure}:
 
 @example
-rm -rf libs/icu libs/poppler libs/graphite2 texk/dvisvgm
+rm -rf libs/icu libs/graphite2 texk/dvisvgm
 @end example
 
 @vindex --enable-missing @r{to ignore dependencies}
@@ -1895,10 +1894,7 @@
 @cindex PDF files, size of
 @cindex PostScript files, size of
 With LFS, there is no fixed limit on the size of PDF files created by
- at file{pdftex} or PostScript files created by @file{dvips}.  The size
-of PDF images included by @file{pdftex} or @file{luatex} must, however,
-be @math{<2}GB when using @file{poppler} version at tie{}0.22 or before
-(even on 64-bit systems with LFS).
+ at file{pdftex} or PostScript files created by @file{dvips}.
 
 
 @node @code{--disable-missing}
@@ -2292,10 +2288,8 @@
 
 @menu
 * Configure options for @code{kpathsea}::
-* Configure options for system @code{poppler}::
 @end menu
 
-
 @node Configure options for @code{kpathsea}
 @subsection Configure options for @code{kpathsea}
 
@@ -2325,28 +2319,6 @@
 The default can be overridden by the user in any case
 (@pxref{@code{kpathsea} library}).
 
- at node Configure options for system @code{poppler}
- at subsection Configure options for system @code{poppler}
-
- at cindex @code{configure} options, for system @code{poppler}
-
- at pindex poppler
- at pindex xpdf @r{as library}
-Building Xe at TeX{} requires @code{poppler}, either from the TL tree or
-system headers and library.  Building pdf at TeX{} requires either
- at code{xpdf} from the @TL{} tree or system @code{poppler} headers and
-library.
-
- at vindex --with-system-poppler
- at noindent @code{--with-system-poppler}@*Use a system version (0.18 or
-newer) of @code{poppler} for Lua at TeX{} (or LuaJIT at TeX{}) and Xe at TeX{},
-and use @file{pkg-config} to obtain the required flags.
-
- at vindex --with-system-xpdf
- at noindent @code{--with-system-xpdf}@*Use a system version (0.12 or newer)
-of @code{poppler} (and @file{pkg-config}) for pdf at TeX{} instead of
- at code{xpdf} from the TL tree.  @xref{@code{--disable-largefile}}.
-
 @node Variables for configure
 @section Variables for configure
 

Modified: trunk/Build/source/libs/ChangeLog
===================================================================
--- trunk/Build/source/libs/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,4 +1,10 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* poppler: remove.
+	See source/m4/kpse-xpdf-flags.m4 for some discussion.
+
 2020-04-21 Luigi Scarso <luigi.scarso at gmail.com>
+
 	* pplib: move from luatexdir, add test.
 
 2018-08-30  Karl Berry  <karl at freefriends.org>

Modified: trunk/Build/source/libs/Makefile.in
===================================================================
--- trunk/Build/source/libs/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -107,7 +107,6 @@
 	$(top_srcdir)/../m4/kpse-options.m4 \
 	$(top_srcdir)/../m4/kpse-pixman-flags.m4 \
 	$(top_srcdir)/../m4/kpse-pkgs.m4 \
-	$(top_srcdir)/../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../m4/kpse-setup.m4 \
 	$(top_srcdir)/../m4/kpse-teckit-flags.m4 \
@@ -178,7 +177,6 @@
 	$(top_srcdir)/../libs/graphite2/ac/withenable.ac \
 	$(top_srcdir)/../libs/zziplib/ac/withenable.ac \
 	$(top_srcdir)/../libs/xpdf/ac/withenable.ac \
-	$(top_srcdir)/../libs/poppler/ac/withenable.ac \
 	$(top_srcdir)/../libs/mpfr/ac/withenable.ac \
 	$(top_srcdir)/../libs/gmp/ac/withenable.ac \
 	$(top_srcdir)/../libs/cairo/ac/withenable.ac \

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/README	2020-05-14 17:47:47 UTC (rev 55138)
@@ -9,9 +9,6 @@
 
 See also comments in ../texk/README.
 
-pplib 2.05.0 - checked 21apr20
-  https://github.com/contextgarden/pplib
-
 cairo 1.16.0 - checked 20oct18
   http://cairographics.org/releases/
 
@@ -55,9 +52,8 @@
 pixman 0.40.0 - checked 21apr20
   http://cairographics.org/releases/
 
-poppler 0.68.0 - checked 20aug18
-  http://poppler.freedesktop.org/ - used by xetex
-  (requires C++11)
+pplib 2.05.0 - checked 21apr20
+  https://github.com/contextgarden/pplib
 
 teckit 2.5.10 - checked 06may20
   https://github.com/silnrsi/teckit/archive/2.5.10.tar.gz

Modified: trunk/Build/source/libs/aclocal.m4
===================================================================
--- trunk/Build/source/libs/aclocal.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/aclocal.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1189,7 +1189,6 @@
 m4_include([../m4/kpse-options.m4])
 m4_include([../m4/kpse-pixman-flags.m4])
 m4_include([../m4/kpse-pkgs.m4])
-m4_include([../m4/kpse-poppler-flags.m4])
 m4_include([../m4/kpse-ptexenc-flags.m4])
 m4_include([../m4/kpse-setup.m4])
 m4_include([../m4/kpse-teckit-flags.m4])

Modified: trunk/Build/source/libs/configure
===================================================================
--- trunk/Build/source/libs/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -812,8 +812,6 @@
 with_system_teckit
 with_system_graphite2
 with_system_zziplib
-with_system_xpdf
-with_system_poppler
 with_system_mpfr
 with_mpfr_includes
 with_mpfr_libdir
@@ -1642,10 +1640,6 @@
                           (requires pkg-config)
   --with-system-zziplib   use installed zziplib headers and library (requires
                           pkg-config)
-  --with-system-xpdf      use installed poppler headers and library instead of
-                          xpdf library from TL (requires pkg-config)
-  --with-system-poppler   use installed poppler headers and library (requires
-                          pkg-config)
   --with-system-mpfr      use installed mpfr headers and library
   --with-mpfr-includes=DIR
                           mpfr headers installed in DIR
@@ -4007,7 +4001,7 @@
 fi
 
 test "x$enable_web2c:$enable_xetex" = xyes:yes && {
-  need_poppler=yes
+  need_pplib=yes
   need_libpng=yes
   need_freetype2=yes
   need_teckit=yes
@@ -5119,11 +5113,7 @@
 
 ## libs/xpdf/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
 ## configure options and TL libraries required for xpdf
-
-# Check whether --with-system-xpdf was given.
-if test "${with_system_xpdf+set}" = set; then :
-  withval=$with_system_xpdf;
-fi
+: "kpse_xpdf_options - no-op"
 if test "x$with_system_xpdf" = x; then
   if test -f $srcdir/../libs/xpdf/configure; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`xpdf' headers and library from TL tree" >&5
@@ -5137,40 +5127,6 @@
   ac_configure_args="$ac_configure_args '--with-system-xpdf=$with_system_xpdf'"
 fi
 
-## libs/poppler/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/poppler/
-## configure options and TL libraries required for poppler
-
-# Check whether --with-system-poppler was given.
-if test "${with_system_poppler+set}" = set; then :
-  withval=$with_system_poppler;
-fi
-if test "x$with_system_poppler" = x; then
-  if test -f $srcdir/../libs/poppler/configure; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`poppler' headers and library from TL tree" >&5
-$as_echo "$as_me: Assuming \`poppler' headers and library from TL tree" >&6;}
-    with_system_poppler=no
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming installed \`poppler' headers and library" >&5
-$as_echo "$as_me: Assuming installed \`poppler' headers and library" >&6;}
-    with_system_poppler=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-poppler=$with_system_poppler'"
-fi
-if test "x$with_system_poppler" = xyes; then
-  if test "x$with_system_zlib" = x; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}:   ->  installed \`zlib' headers and library" >&5
-$as_echo "$as_me:   ->  installed \`zlib' headers and library" >&6;}
-    with_system_zlib=yes
-    ac_configure_args="$ac_configure_args '--with-system-zlib'"
-  elif test "x$with_system_zlib" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-poppler' requires \`--with-system-zlib'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_poppler" = xyes && {
-  need_zlib=yes
-}
-
 ## libs/mpfr/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/mpfr/
 ## configure options and TL libraries required for mpfr
 
@@ -6503,10 +6459,6 @@
   test "x$with_system_xpdf" != xyes && test "x$need_xpdf" = xyes && MAKE_SUBDIRS="xpdf $MAKE_SUBDIRS"
   CONF_SUBDIRS="xpdf $CONF_SUBDIRS"
 fi
-if test -x $srcdir/poppler/configure; then
-  test "x$with_system_poppler" != xyes && test "x$need_poppler" = xyes && MAKE_SUBDIRS="poppler $MAKE_SUBDIRS"
-  CONF_SUBDIRS="poppler $CONF_SUBDIRS"
-fi
 if test -x $srcdir/mpfr/configure; then
   test "x$with_system_mpfr" != xyes && test "x$need_mpfr" = xyes && MAKE_SUBDIRS="mpfr $MAKE_SUBDIRS"
   CONF_SUBDIRS="mpfr $CONF_SUBDIRS"

Index: trunk/Build/source/libs/pplib
===================================================================
--- trunk/Build/source/libs/pplib	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/pplib	2020-05-14 17:47:47 UTC (rev 55138)

Property changes on: trunk/Build/source/libs/pplib
___________________________________________________________________
Modified: svn:ignore
## -1 +1 ##
-autom4te.cache/
+autom4te.cache
Modified: trunk/Build/source/libs/xpdf/ChangeLog
===================================================================
--- trunk/Build/source/libs/xpdf/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/xpdf/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,3 +1,7 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* ac/xpdf.ac: doc change for poppler no longer supported in TL.
+
 2019-09-29  Akira Kakuto  <kakuto at w32tex.org>
 
 	* Import xpdf-4.02.

Modified: trunk/Build/source/libs/xpdf/ac/xpdf.ac
===================================================================
--- trunk/Build/source/libs/xpdf/ac/xpdf.ac	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/libs/xpdf/ac/xpdf.ac	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,9 +1,12 @@
+dnl $Id$
 ## libs/xpdf/ac/xpdf.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
 dnl
-dnl Copyright (C) 2009 Peter Breitenlohner <tex-live at tug.org>
+dnl Copyright 2015-2020 Karl Berry <tex-live at tug.org>
+dnl Copyright 2009-2015 Peter Breitenlohner <tex-live at tug.org>
 dnl You may freely use, modify and/or distribute this file.
 dnl
-## basic check of system xpdf (poppler)
+## basic check of system xpdf (a.k.a. poppler, no longer supported in
+## TL sources)
 KPSE_TRY_LIBXX([xpdf],
                [#include <GfxFont.h>],
                [GfxFont *gfxFont; gfxFont->decRefCnt();])


Property changes on: trunk/Build/source/libs/xpdf/ac/xpdf.ac
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property
Modified: trunk/Build/source/m4/ChangeLog
===================================================================
--- trunk/Build/source/m4/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/m4/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,3 +1,11 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* kpse-pkgs.m4 (KPSE_LIBS_PKGS),
+	(KPSE_POPPLER_SYSTEM_FLAGS): remove poppler.
+	* kpse-poppler-flags.m4: remove file.
+	* kpse-xpdf-flags.m4 (KPSE_XPDF_OPTIONS): no more system option.
+	(KPSE_XPDF_SYSTEM_FLAGS): no-op.
+
 2020-04-21 Luigi Scarso <luigi.scarso at gmail.com>
 
 	* kpse-pkgs.m4 (KPSE_LIBS_PKGS): add pplib.

Index: trunk/Build/source/m4/kpse-luajit-flags.m4
===================================================================
--- trunk/Build/source/m4/kpse-luajit-flags.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/m4/kpse-luajit-flags.m4	2020-05-14 17:47:47 UTC (rev 55138)

Property changes on: trunk/Build/source/m4/kpse-luajit-flags.m4
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property
Modified: trunk/Build/source/m4/kpse-pkgs.m4
===================================================================
--- trunk/Build/source/m4/kpse-pkgs.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/m4/kpse-pkgs.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,6 +1,6 @@
 # $Id$
 # Private Autoconf macros for the TeX Live (TL) tree.
-# Copyright 2016-2019 Karl Berry <tex-live at tug.org>
+# Copyright 2016-2020 Karl Berry <tex-live at tug.org>
 # Copyright 2009-2015 Peter Breitenlohner <tex-live at tug.org>
 #
 # This file is free software; the copyright holder
@@ -32,7 +32,6 @@
 graphite2
 zziplib
 xpdf
-poppler
 mpfr
 gmp
 cairo
@@ -68,7 +67,6 @@
 AC_REQUIRE([KPSE_CAIRO_SYSTEM_FLAGS])[]dnl
 AC_REQUIRE([KPSE_GMP_SYSTEM_FLAGS])[]dnl
 AC_REQUIRE([KPSE_MPFR_SYSTEM_FLAGS])[]dnl
-AC_REQUIRE([KPSE_POPPLER_SYSTEM_FLAGS])[]dnl
 AC_REQUIRE([KPSE_XPDF_SYSTEM_FLAGS])[]dnl
 AC_REQUIRE([KPSE_ZZIPLIB_SYSTEM_FLAGS])[]dnl
 AC_REQUIRE([KPSE_GRAPHITE2_SYSTEM_FLAGS])[]dnl

Deleted: trunk/Build/source/m4/kpse-poppler-flags.m4
===================================================================
--- trunk/Build/source/m4/kpse-poppler-flags.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/m4/kpse-poppler-flags.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,34 +0,0 @@
-# Public macros for the TeX Live (TL) tree.
-# Copyright (C) 2011-2015 Peter Breitenlohner <tex-live at tug.org>
-#
-# This file is free software; the copyright holder
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# KPSE_POPPLER_FLAGS
-# ------------------
-# Provide the configure option '--with-system-poppler' (if in the TL tree).
-#
-# Set the make variables POPPLER_INCLUDES and POPPLER_LIBS to the CPPFLAGS and
-# LIBS required for the `-lpoppler' library in libs/poppler/ of the TL tree.
-AC_DEFUN([KPSE_POPPLER_FLAGS], [dnl
-AC_REQUIRE([KPSE_CHECK_WIN32])[]dnl
-AC_REQUIRE([KPSE_ZLIB_FLAGS])[]dnl
-_KPSE_LIB_FLAGS([poppler], [poppler], [],
-                [-IBLD/libs/poppler/include],
-                [BLD/libs/poppler/libpoppler.a], [],
-                [], [${top_builddir}/../../libs/poppler/include/Stream.h])[]dnl
-test "x$kpse_cv_have_win32" = xno || POPPLER_LIBS="$POPPLER_LIBS -lgdi32"
-]) # KPSE_POPPLER_FLAGS
-
-# KPSE_POPPLER_OPTIONS([WITH-SYSTEM])
-# -----------------------------------
-AC_DEFUN([KPSE_POPPLER_OPTIONS], [_KPSE_LIB_OPTIONS([poppler], [$1], [pkg-config])])
-
-# KPSE_POPPLER_SYSTEM_FLAGS
-# -------------------------
-AC_DEFUN([KPSE_POPPLER_SYSTEM_FLAGS], [dnl
-_KPSE_PKG_CONFIG_FLAGS([poppler], [poppler], [0.30])
-POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
-POPPLER_INCLUDES="$POPPLER_VERSION $POPPLER_INCLUDES"
-]) # KPSE_POPPLER_SYSTEM_FLAGS

Index: trunk/Build/source/m4/kpse-win32.m4
===================================================================
--- trunk/Build/source/m4/kpse-win32.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/m4/kpse-win32.m4	2020-05-14 17:47:47 UTC (rev 55138)

Property changes on: trunk/Build/source/m4/kpse-win32.m4
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property
Modified: trunk/Build/source/m4/kpse-xpdf-flags.m4
===================================================================
--- trunk/Build/source/m4/kpse-xpdf-flags.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/m4/kpse-xpdf-flags.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,10 +1,30 @@
+# $Id$
 # Public macros for the TeX Live (TL) tree.
-# Copyright (C) 2009-2015 Peter Breitenlohner <tex-live at tug.org>
+# Copyright 2015-2020 Karl Berry <tex-live at tug.org>
+# Copyright 2009-2015 Peter Breitenlohner <tex-live at tug.org>
 #
 # This file is free software; the copyright holder
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
+# 
+# Support for our semi-homegrown libs/xpdf library. This is derived
+# from xpdf source code, but xpdf does not distribute it as a library.
+# It is used by pdftex (and nothing else) to read PDF images.
+# Other engines use the semi-homegrown pplib library (q.v.) for that.
 
+# The well-known poppler library is also originally derived from xpdf
+# source code, but has been greatly revised and extended. TL used to
+# (sort of) support poppler as the system xpdf, but after the TL 2020
+# release we dropped this, because we switched XeTeX to use pplib, and
+# nothing else used poppler. (No engines ever used poppler to generate
+# their PDF output).
+# 
+# poppler is aggressively developed, with requirements for new compilers
+# and language versions. That's fine for them, but since we don't need
+# anything new, it has become too time-consuming and problematic to
+# continue to support it in the TL sources, when we don't have any
+# requirement for it.
+
 # KPSE_XPDF_FLAGS
 # ---------------
 # Provide the configure option '--with-system-xpdf' (if in the TL tree).
@@ -20,19 +40,25 @@
 test "x$kpse_cv_have_win32" = xno || XPDF_LIBS="$XPDF_LIBS -lgdi32"
 ]) # KPSE_XPDF_FLAGS
 
-# KPSE_XPDF_OPTIONS([WITH-SYSTEM])
+# KPSE_XPDF_OPTIONS([WITH-SYSTEM]) -- as above, no more poppler.
+# Keep this macro's expansion as a valid shell command, though.
+# since it is used internally in the configure scripts.
 # --------------------------------
-AC_DEFUN([KPSE_XPDF_OPTIONS],
-[m4_ifval([$1],
-          [AC_ARG_WITH([system-xpdf],
-                       AS_HELP_STRING([--with-system-xpdf],
-                                      [use installed poppler headers and library instead of xpdf library from TL (requires pkg-config)]))])[]dnl
+AC_DEFUN([KPSE_XPDF_OPTIONS], [dnl
+: "kpse_xpdf_options - no-op"
 ]) # KPSE_XPDF_OPTIONS
+dnl [m4_ifval([$1],
+dnl           [AC_ARG_WITH([system-xpdf],
+dnl                        AS_HELP_STRING([--with-system-xpdf],
+dnl                                       [use installed poppler headers and library instead of xpdf library from TL (requires pkg-config)]))])[]dnl
+dnl ]) # KPSE_XPDF_OPTIONS
 
-# KPSE_XPDF_SYSTEM_FLAGS
+# KPSE_XPDF_SYSTEM_FLAGS -- as above, no more poppler.
 # ----------------------
 AC_DEFUN([KPSE_XPDF_SYSTEM_FLAGS], [dnl
-_KPSE_PKG_CONFIG_FLAGS([xpdf], [poppler], [0.12])
-POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
-XPDF_INCLUDES="$POPPLER_VERSION $XPDF_INCLUDES"
+: "kpse_xpdf_system_flags - no-op"
 ]) # KPSE_XPDF_SYSTEM_FLAGS
+dnl _KPSE_PKG_CONFIG_FLAGS([xpdf], [poppler], [0.12])
+dnl POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
+dnl XPDF_INCLUDES="$POPPLER_VERSION $XPDF_INCLUDES"
+dnl ]) # KPSE_XPDF_SYSTEM_FLAGS


Property changes on: trunk/Build/source/m4/kpse-xpdf-flags.m4
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property
Modified: trunk/Build/source/texk/Makefile.in
===================================================================
--- trunk/Build/source/texk/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -107,7 +107,6 @@
 	$(top_srcdir)/../m4/kpse-options.m4 \
 	$(top_srcdir)/../m4/kpse-pixman-flags.m4 \
 	$(top_srcdir)/../m4/kpse-pkgs.m4 \
-	$(top_srcdir)/../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../m4/kpse-setup.m4 \
 	$(top_srcdir)/../m4/kpse-teckit-flags.m4 \
@@ -178,7 +177,6 @@
 	$(top_srcdir)/../libs/graphite2/ac/withenable.ac \
 	$(top_srcdir)/../libs/zziplib/ac/withenable.ac \
 	$(top_srcdir)/../libs/xpdf/ac/withenable.ac \
-	$(top_srcdir)/../libs/poppler/ac/withenable.ac \
 	$(top_srcdir)/../libs/mpfr/ac/withenable.ac \
 	$(top_srcdir)/../libs/gmp/ac/withenable.ac \
 	$(top_srcdir)/../libs/cairo/ac/withenable.ac \

Modified: trunk/Build/source/texk/aclocal.m4
===================================================================
--- trunk/Build/source/texk/aclocal.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/aclocal.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1189,7 +1189,6 @@
 m4_include([../m4/kpse-options.m4])
 m4_include([../m4/kpse-pixman-flags.m4])
 m4_include([../m4/kpse-pkgs.m4])
-m4_include([../m4/kpse-poppler-flags.m4])
 m4_include([../m4/kpse-ptexenc-flags.m4])
 m4_include([../m4/kpse-setup.m4])
 m4_include([../m4/kpse-teckit-flags.m4])

Modified: trunk/Build/source/texk/configure
===================================================================
--- trunk/Build/source/texk/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -812,8 +812,6 @@
 with_system_teckit
 with_system_graphite2
 with_system_zziplib
-with_system_xpdf
-with_system_poppler
 with_system_mpfr
 with_mpfr_includes
 with_mpfr_libdir
@@ -1642,10 +1640,6 @@
                           (requires pkg-config)
   --with-system-zziplib   use installed zziplib headers and library (requires
                           pkg-config)
-  --with-system-xpdf      use installed poppler headers and library instead of
-                          xpdf library from TL (requires pkg-config)
-  --with-system-poppler   use installed poppler headers and library (requires
-                          pkg-config)
   --with-system-mpfr      use installed mpfr headers and library
   --with-mpfr-includes=DIR
                           mpfr headers installed in DIR
@@ -4007,7 +4001,7 @@
 fi
 
 test "x$enable_web2c:$enable_xetex" = xyes:yes && {
-  need_poppler=yes
+  need_pplib=yes
   need_libpng=yes
   need_freetype2=yes
   need_teckit=yes
@@ -5119,11 +5113,7 @@
 
 ## libs/xpdf/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
 ## configure options and TL libraries required for xpdf
-
-# Check whether --with-system-xpdf was given.
-if test "${with_system_xpdf+set}" = set; then :
-  withval=$with_system_xpdf;
-fi
+: "kpse_xpdf_options - no-op"
 if test "x$with_system_xpdf" = x; then
   if test -f $srcdir/../libs/xpdf/configure; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`xpdf' headers and library from TL tree" >&5
@@ -5137,40 +5127,6 @@
   ac_configure_args="$ac_configure_args '--with-system-xpdf=$with_system_xpdf'"
 fi
 
-## libs/poppler/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/poppler/
-## configure options and TL libraries required for poppler
-
-# Check whether --with-system-poppler was given.
-if test "${with_system_poppler+set}" = set; then :
-  withval=$with_system_poppler;
-fi
-if test "x$with_system_poppler" = x; then
-  if test -f $srcdir/../libs/poppler/configure; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`poppler' headers and library from TL tree" >&5
-$as_echo "$as_me: Assuming \`poppler' headers and library from TL tree" >&6;}
-    with_system_poppler=no
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming installed \`poppler' headers and library" >&5
-$as_echo "$as_me: Assuming installed \`poppler' headers and library" >&6;}
-    with_system_poppler=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-poppler=$with_system_poppler'"
-fi
-if test "x$with_system_poppler" = xyes; then
-  if test "x$with_system_zlib" = x; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}:   ->  installed \`zlib' headers and library" >&5
-$as_echo "$as_me:   ->  installed \`zlib' headers and library" >&6;}
-    with_system_zlib=yes
-    ac_configure_args="$ac_configure_args '--with-system-zlib'"
-  elif test "x$with_system_zlib" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-poppler' requires \`--with-system-zlib'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_poppler" = xyes && {
-  need_zlib=yes
-}
-
 ## libs/mpfr/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/mpfr/
 ## configure options and TL libraries required for mpfr
 

Modified: trunk/Build/source/texk/dvidvi/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvidvi/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/dvidvi/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -100,7 +100,7 @@
 	$(top_srcdir)/../../m4/ltsugar.m4 \
 	$(top_srcdir)/../../m4/ltversion.m4 \
 	$(top_srcdir)/../../m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
+	$(top_srcdir)/../../version.ac $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \

Modified: trunk/Build/source/texk/dvidvi/configure
===================================================================
--- trunk/Build/source/texk/dvidvi/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/dvidvi/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -741,7 +741,6 @@
 docdir
 oldincludedir
 includedir
-runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -828,7 +827,6 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1081,15 +1079,6 @@
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
-  -runstatedir | --runstatedir | --runstatedi | --runstated \
-  | --runstate | --runstat | --runsta | --runst | --runs \
-  | --run | --ru | --r)
-    ac_prev=runstatedir ;;
-  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
-  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
-  | --run=* | --ru=* | --r=*)
-    runstatedir=$ac_optarg ;;
-
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1227,7 +1216,7 @@
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir runstatedir
+		libdir localedir mandir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1380,7 +1369,6 @@
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -12698,7 +12686,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12744,7 +12732,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12768,7 +12756,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12813,7 +12801,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12837,7 +12825,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];

Modified: trunk/Build/source/texk/dviout-util/Makefile.in
===================================================================
--- trunk/Build/source/texk/dviout-util/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/dviout-util/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -543,7 +543,6 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
-runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@

Modified: trunk/Build/source/texk/dvipdfm-x/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/dvipdfm-x/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -628,7 +628,6 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
-runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@

Modified: trunk/Build/source/texk/dvipsk/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvipsk/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/dvipsk/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -657,7 +657,6 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
-runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@

Modified: trunk/Build/source/texk/seetexk/Makefile.in
===================================================================
--- trunk/Build/source/texk/seetexk/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/seetexk/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -102,7 +102,7 @@
 	$(top_srcdir)/../../m4/ltsugar.m4 \
 	$(top_srcdir)/../../m4/ltversion.m4 \
 	$(top_srcdir)/../../m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
+	$(top_srcdir)/../../version.ac $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \

Modified: trunk/Build/source/texk/seetexk/configure
===================================================================
--- trunk/Build/source/texk/seetexk/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/seetexk/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -739,7 +739,6 @@
 docdir
 oldincludedir
 includedir
-runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -826,7 +825,6 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1079,15 +1077,6 @@
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
-  -runstatedir | --runstatedir | --runstatedi | --runstated \
-  | --runstate | --runstat | --runsta | --runst | --runs \
-  | --run | --ru | --r)
-    ac_prev=runstatedir ;;
-  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
-  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
-  | --run=* | --ru=* | --r=*)
-    runstatedir=$ac_optarg ;;
-
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1225,7 +1214,7 @@
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir runstatedir
+		libdir localedir mandir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1378,7 +1367,6 @@
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -12696,7 +12684,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12742,7 +12730,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12766,7 +12754,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12811,7 +12799,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];
@@ -12835,7 +12823,7 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
 		       && LARGE_OFF_T % 2147483647 == 1)
 		      ? 1 : -1];

Modified: trunk/Build/source/texk/texlive/linked_scripts/Makefile.in
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/texlive/linked_scripts/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,

Modified: trunk/Build/source/texk/web2c/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,3 +1,10 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* Makefile.am (POPPLER_RULE): remove.
+	* ac/web2c.ac (kpse_tex_progs) <xetex>: now depends on pplib
+	instead of poppler.
+	* configure.ac (KPSE_POPPLER_FLAGS): remove.
+
 2020-05-05  Andreas Scherer  <https://ascherer.github.io>
 
 	* mft.ch: Restore section numbering from mft.web.

Modified: trunk/Build/source/texk/web2c/Makefile.am
===================================================================
--- trunk/Build/source/texk/web2c/Makefile.am	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/Makefile.am	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,7 +1,7 @@
 ## $Id$
 ## Makefile.am for the TeX Live subdirectory texk/web2c/.
 ##
-## Copyright 2017      Karl Berry <tex-live at tug.org>
+## Copyright 2017-2020 Karl Berry <tex-live at tug.org>
 ## Copyright 2009-2015 Peter Breitenlohner <tex-live at tug.org>
 ## You may freely use, modify and/or distribute this file.
 ##
@@ -109,8 +109,6 @@
 @XPDF_RULE@
 ## Rebuild pplib
 @PPLIB_RULE@
-## Rebuild poppler
- at POPPLER_RULE@
 ## Rebuild libzzip
 @ZZIPLIB_RULE@
 ## Rebuild libTEXkit

Modified: trunk/Build/source/texk/web2c/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -383,7 +383,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -2741,9 +2740,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@
@@ -17830,7 +17826,6 @@
 @MPFR_RULE@
 @XPDF_RULE@
 @PPLIB_RULE@
- at POPPLER_RULE@
 @ZZIPLIB_RULE@
 @TECKIT_RULE@
 @ICU_RULE@

Modified: trunk/Build/source/texk/web2c/ac/web2c.ac
===================================================================
--- trunk/Build/source/texk/web2c/ac/web2c.ac	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/ac/web2c.ac	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,7 +1,7 @@
 # $Id$
 # texk/web2c/ac/web2c.ac: configure.ac fragment for the TeX Live subdirectory texk/web2c/
 dnl
-dnl Copyright 2016-2019 Karl Berry <tex-live at tug.org>
+dnl Copyright 2015-2019 Karl Berry <tex-live at tug.org>
 dnl Copyright 2009-2015 Peter Breitenlohner <tex-live at tug.org>
 dnl You may freely use, modify and/or distribute this file.
 dnl
@@ -44,7 +44,7 @@
 [[mp],        [yes], [],    [MetaPost],   [mpfr cairo libpng]],
 [[pmp],       [yes], [],    [pMetaPost],  [mpfr cairo libpng ptexenc]],
 [[upmp],      [yes], [],    [upMetaPost], [mpfr cairo libpng ptexenc]],
-[[xetex],     [yes], [yes], [XeTeX],      [poppler libpng freetype2 teckit harfbuzz]],
+[[xetex],     [yes], [yes], [XeTeX],      [pplib libpng freetype2 teckit harfbuzz]],
 ])[]dnl
 m4_foreach([Kpse_Prog], [kpse_tex_progs],
            [m4_ifset([Kpse_Prog],

Modified: trunk/Build/source/texk/web2c/aclocal.m4
===================================================================
--- trunk/Build/source/texk/web2c/aclocal.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/aclocal.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1232,7 +1232,6 @@
 m4_include([../../m4/kpse-macos-framework.m4])
 m4_include([../../m4/kpse-mpfr-flags.m4])
 m4_include([../../m4/kpse-pixman-flags.m4])
-m4_include([../../m4/kpse-poppler-flags.m4])
 m4_include([../../m4/kpse-pplib-flags.m4])
 m4_include([../../m4/kpse-ptexenc-flags.m4])
 m4_include([../../m4/kpse-socket-libs.m4])

Modified: trunk/Build/source/texk/web2c/configure
===================================================================
--- trunk/Build/source/texk/web2c/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -676,10 +676,6 @@
 XPDF_DEPEND
 XPDF_LIBS
 XPDF_INCLUDES
-POPPLER_RULE
-POPPLER_DEPEND
-POPPLER_LIBS
-POPPLER_INCLUDES
 MPFR_RULE
 MPFR_DEPEND
 MPFR_LIBS
@@ -1057,8 +1053,6 @@
 with_system_mpfr
 with_mpfr_includes
 with_mpfr_libdir
-with_system_poppler
-with_system_xpdf
 with_system_zziplib
 with_system_teckit
 with_system_graphite2
@@ -1816,10 +1810,6 @@
   --with-mpfr-includes=DIR
                           mpfr headers installed in DIR
   --with-mpfr-libdir=DIR  mpfr library installed in DIR
-  --with-system-poppler   use installed poppler headers and library (requires
-                          pkg-config)
-  --with-system-xpdf      use installed poppler headers and library instead of
-                          xpdf library from TL (requires pkg-config)
   --with-system-zziplib   use installed zziplib headers and library (requires
                           pkg-config)
   --with-system-teckit    use installed teckit headers and library (requires
@@ -18912,7 +18902,7 @@
 fi
 
 test "x$enable_web2c:$enable_xetex" = xyes:yes && {
-  need_poppler=yes
+  need_pplib=yes
   need_libpng=yes
   need_freetype2=yes
   need_teckit=yes
@@ -19040,11 +19030,10 @@
 
 
 
-# XeTeX now requires C++11 because poppler does :(.
-# XeTeX also requires C+11 because of ICU.
+# XeTeX now requires C++11 because ICU does :(.
 if test "x$enable_xetex" = xyes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11, since XeTeX enabled" >&5
-$as_echo "$as_me: checking for C++11, since XeTeX enabled" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11, since XeTeX is enabled" >&5
+$as_echo "$as_me: checking for C++11, since XeTeX is enabled" >&6;}
     ax_cxx_compile_alternatives="11 0x"    ax_cxx_compile_cxx11_required=true
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
@@ -25514,54 +25503,12 @@
 	cd ${top_builddir}/../../libs/mpfr && $(MAKE) $(AM_MAKEFLAGS) rebuild'
 fi
 
-##tldbg _KPSE_LIB_FLAGS: Setup poppler (-lpoppler) flags.
-echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=poppler, libname=poppler, options=, tlincl=-IBLD/libs/poppler/include, tllib=BLD/libs/poppler/libpoppler.a, tlextra=, rebuildsrcdeps=, rebuildblddeps=${top_builddir}/../../libs/poppler/include/Stream.h.' >&5
-##tldbg _KPSE_LIB_FLAGS_TL: poppler (poppler) .
-
-# Check whether --with-system-poppler was given.
-if test "${with_system_poppler+set}" = set; then :
-  withval=$with_system_poppler;
-fi
-if test "x$with_system_poppler" = xyes; then
-  if $PKG_CONFIG poppler --atleast-version=0.30; then
-  POPPLER_INCLUDES=`$PKG_CONFIG poppler --cflags`
-  POPPLER_LIBS=`$PKG_CONFIG poppler --libs`
-elif test "x$need_poppler:$with_system_poppler" = xyes:yes; then
-  as_fn_error $? "did not find poppler 0.30 or better" "$LINENO" 5
-fi
-
-POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
-POPPLER_INCLUDES="$POPPLER_VERSION $POPPLER_INCLUDES"
-else
-  POPPLER_INCLUDES="-I$kpse_BLD/libs/poppler/include"
-  POPPLER_LIBS="$kpse_BLD/libs/poppler/libpoppler.a"
-  POPPLER_DEPEND='${top_builddir}/../../libs/poppler/libpoppler.a'
-  POPPLER_RULE='# Rebuild libpoppler
-$(POPPLER_DEPEND): ${top_builddir}/../../libs/poppler/include/Stream.h
-	cd ${top_builddir}/../../libs/poppler && $(MAKE) $(AM_MAKEFLAGS) rebuild
-${top_builddir}/../../libs/poppler/include/Stream.h:
-	cd ${top_builddir}/../../libs/poppler && $(MAKE) $(AM_MAKEFLAGS) rebuild'
-fi
-test "x$kpse_cv_have_win32" = xno || POPPLER_LIBS="$POPPLER_LIBS -lgdi32"
-
 ##tldbg _KPSE_LIB_FLAGS: Setup xpdf (-lxpdf) flags.
 echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=xpdf, libname=xpdf, options=, tlincl=-DPDF_PARSER_ONLY -IBLD/libs/xpdf -IBLD/libs/xpdf/goo -IBLD/libs/xpdf/xpdf, tllib=BLD/libs/xpdf/libxpdf.a, tlextra=, rebuildsrcdeps=, rebuildblddeps=${top_builddir}/../../libs/xpdf/xpdf/Stream.h.' >&5
 ##tldbg _KPSE_LIB_FLAGS_TL: xpdf (xpdf) .
-
-# Check whether --with-system-xpdf was given.
-if test "${with_system_xpdf+set}" = set; then :
-  withval=$with_system_xpdf;
-fi
+: "kpse_xpdf_options - no-op"
 if test "x$with_system_xpdf" = xyes; then
-  if $PKG_CONFIG poppler --atleast-version=0.12; then
-  XPDF_INCLUDES=`$PKG_CONFIG poppler --cflags`
-  XPDF_LIBS=`$PKG_CONFIG poppler --libs`
-elif test "x$need_xpdf:$with_system_xpdf" = xyes:yes; then
-  as_fn_error $? "did not find poppler 0.12 or better" "$LINENO" 5
-fi
-
-POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"'
-XPDF_INCLUDES="$POPPLER_VERSION $XPDF_INCLUDES"
+  : "kpse_xpdf_system_flags - no-op"
 else
   XPDF_INCLUDES="-DPDF_PARSER_ONLY -I$kpse_BLD/libs/xpdf -I$kpse_BLD/libs/xpdf/goo -I$kpse_BLD/libs/xpdf/xpdf"
   XPDF_LIBS="$kpse_BLD/libs/xpdf/libxpdf.a"
@@ -25994,9 +25941,6 @@
 fi
 
 
-eval CPPFLAGS=\"$POPPLER_INCLUDES \$CPPFLAGS\"
-eval LIBS=\"$POPPLER_LIBS \$LIBS\"
-
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'

Modified: trunk/Build/source/texk/web2c/configure.ac
===================================================================
--- trunk/Build/source/texk/web2c/configure.ac	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/configure.ac	2020-05-14 17:47:47 UTC (rev 55138)
@@ -46,10 +46,9 @@
 KPSE_WEB2C_PREPARE
 m4_include([ac/web2c.ac])
 
-# XeTeX now requires C++11 because poppler does :(.
-# XeTeX also requires C+11 because of ICU.
+# XeTeX now requires C++11 because ICU does :(.
 if test "x$enable_xetex" = xyes; then
-  AC_MSG_NOTICE([checking for C++11, since XeTeX enabled])
+  AC_MSG_NOTICE([checking for C++11, since XeTeX is enabled])
   AX_CXX_COMPILE_STDCXX([11])
 fi
 
@@ -260,7 +259,6 @@
 KPSE_CAIRO_FLAGS
 KPSE_GMP_FLAGS
 KPSE_MPFR_FLAGS
-KPSE_POPPLER_FLAGS
 KPSE_XPDF_FLAGS
 KPSE_ZZIPLIB_FLAGS
 KPSE_TECKIT_FLAGS
@@ -305,7 +303,6 @@
 AC_SUBST([KPATHSEA_PATHS_H])
 
 dnl Check for Object::initCmd(const char *) etc
-KPSE_ADD_FLAGS([poppler])
 AC_LANG_PUSH([C++])
 AC_MSG_CHECKING([for Object::[initCmd(const char*)] etc])
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <Object.h>]],

Modified: trunk/Build/source/texk/web2c/doc/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/doc/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/doc/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -113,7 +113,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -360,9 +359,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/texk/web2c/lib/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/lib/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/lib/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -115,7 +115,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -366,9 +365,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/texk/web2c/man/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/man/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/man/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -136,7 +136,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -344,9 +343,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/texk/web2c/omegafonts/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/omegafonts/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/omegafonts/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -118,7 +118,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -591,9 +590,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/texk/web2c/otps/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/otps/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/otps/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -118,7 +118,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -625,9 +624,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/texk/web2c/otps/win32/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/otps/win32/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/otps/win32/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -115,7 +115,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -345,9 +344,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/texk/web2c/pdftexdir/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/ChangeLog	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/ChangeLog	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,3 +1,22 @@
+2020-05-14  Karl Berry  <karl at freefriends.org>
+
+	* pdftoepdf-poppler0.68.0.cc,
+	* pdftoepdf-poppler0.69.0.cc,
+	* pdftoepdf-poppler0.70.0.cc,
+	* pdftoepdf-poppler0.71.0.cc,
+	* pdftoepdf-poppler0.72.0.cc,
+	* pdftoepdf-poppler0.75.0.cc,
+	* pdftoepdf-poppler0.76.0.cc,
+	* pdftoepdf-poppler0.83.0.cc,
+	* pdftoepdf-poppler0.86.0.cc,
+	* pdftosrc-newpoppler.cc,
+	* pdftosrc-poppler0.71.0.cc,
+	* pdftosrc-poppler0.72.0.cc,
+	* pdftosrc-poppler0.76.0.cc,
+	* pdftosrc-poppler0.83.0.cc: remove these interim stabs at poppler
+	support; now poppler is not supported in TL.
+	See source/m4/kpse-xpdf-flags.m4 for some discussion.
+
 2020-03-27  Karl Berry  <karl at tug.org>
 
 	* TeX Live 2020, pdftex 1.40.21.

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.68.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.68.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.68.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1113 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.59.0, ..., 0.68.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static GBool isInit = gFalse;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i);
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i);
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor");
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->getCString());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i);
-        if (fontRef.isRef())
-            copyFont(obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = s->getCString();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i);
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = ((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(gFalse);
-        isInit = gTrue;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata");
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]);
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group");
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd(copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i));
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.69.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.69.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.69.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1113 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.69.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static GBool isInit = gFalse;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i);
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i);
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor");
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->getCString());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i);
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = s->getCString();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i);
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = ((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(gFalse);
-        isInit = gTrue;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata");
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]);
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group");
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i));
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.70.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.70.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.70.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1113 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.70.0 or 0.70.1.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static GBool isInit = gFalse;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i);
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i);
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor");
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->getCString());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i);
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->getCString();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i);
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(gFalse);
-        isInit = gTrue;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata");
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]);
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group");
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i));
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.71.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.71.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.71.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1113 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.71.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static bool isInit = false;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i);
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i);
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor");
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->getCString());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i);
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->getCString();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i);
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(false);
-        isInit = true;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata");
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]);
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group");
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i));
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.72.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.72.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.72.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1114 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.72.0 or newer versions.
-It is tested upto the poppler 0.74.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static bool isInit = false;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i);
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i);
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor");
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->c_str());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i);
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->c_str();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i);
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(false);
-        isInit = true;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata");
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]);
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group");
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i));
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.75.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.75.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.75.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1113 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.75.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static bool isInit = false;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i).copy();
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i).copy();
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor").copy();
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->c_str());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i).copy();
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->c_str();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i).copy();
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(false);
-        isInit = true;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF().copy();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata").copy();
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]).copy();
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group").copy();
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i).copy());
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.76.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.76.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.76.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1113 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.76.0 upto 0.82.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static bool isInit = false;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i).copy();
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i).copy();
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor").copy();
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->c_str());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i).copy();
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->c_str();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i).copy();
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = new GlobalParams();
-        globalParams->setErrQuiet(false);
-        isInit = true;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF().copy();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata").copy();
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]).copy();
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group").copy();
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i).copy());
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-        // see above for globalParams
-        delete globalParams;
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.83.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.83.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.83.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1111 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.83.0 up to 0.85.0.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static bool isInit = false;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i).copy();
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i).copy();
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor").copy();
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->c_str());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i).copy();
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->c_str();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i).copy();
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = std::make_unique<GlobalParams>();
-        globalParams->setErrQuiet(false);
-        isInit = true;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        LinkDest *link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-        delete link;
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF().copy();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata").copy();
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]).copy();
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group").copy();
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i).copy());
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.86.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.86.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftoepdf-poppler0.86.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,1110 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. A little modifications are made to avoid a crash for
-some kind of pdf images, such as figure_missing.pdf in gnuplot.
-The poppler should be 0.86.0 or newer versions.
-POPPLER_VERSION should be defined.
-*/
-
-/* Do this early in order to avoid a conflict between
-   MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and
-   <kpathsea/types.h> defining Pascal's boolean as 'int'.
-*/
-#include <w2c/config.h>
-#include <kpathsea/lib.h>
-
-#include <stdlib.h>
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#include <dirent.h>
-#include <poppler-config.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#define GString GooString
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Link.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-// This file is mostly C and not very much C++; it's just used to interface
-// the functions of xpdf, which are written in C++.
-
-extern "C" {
-#include <pdftexdir/ptexmac.h>
-#include <pdftexdir/pdftex-common.h>
-
-// These functions from pdftex.web gets declared in pdftexcoerce.h in the
-// usual web2c way, but we cannot include that file here because C++
-// does not allow it.
-extern int getpdfsuppresswarningpagegroup(void);
-extern integer getpdfsuppressptexinfo(void);
-extern integer zround(double);
-}
-
-// The prefix "PTEX" for the PDF keys is special to pdfTeX;
-// this has been registered with Adobe by Hans Hagen.
-
-#define pdfkeyprefix "PTEX"
-
-#define MASK_SUPPRESS_PTEX_FULLBANNER 0x01
-#define MASK_SUPPRESS_PTEX_FILENAME   0x02
-#define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04
-#define MASK_SUPPRESS_PTEX_INFODICT   0x08
-
-// When copying the Resources of the selected page, all objects are copied
-// recusively top-down. Indirect objects however are not fetched during
-// copying, but get a new object number from pdfTeX and then will be
-// appended into a linked list. Duplicates are checked and removed from the
-// list of indirect objects during appending.
-
-enum InObjType {
-    objFont,
-    objFontDesc,
-    objOther
-};
-
-struct InObj {
-    Ref ref;                    // ref in original PDF
-    InObjType type;             // object type
-    InObj *next;                // next entry in list of indirect objects
-    int num;                    // new object number in output PDF
-    fd_entry *fd;               // pointer to /FontDescriptor object structure
-    int enc_objnum;             // Encoding for objFont
-    int written;                // has it been written to output PDF?
-};
-
-struct UsedEncoding {
-    int enc_objnum;
-    GfxFont *font;
-    UsedEncoding *next;
-};
-
-static InObj *inObjList;
-static UsedEncoding *encodingList;
-static bool isInit = false;
-
-// --------------------------------------------------------------------
-// Maintain list of open embedded PDF files
-// --------------------------------------------------------------------
-
-struct PdfDocument {
-    char *file_name;
-    PDFDoc *doc;
-    XRef *xref;
-    InObj *inObjList;
-    int occurences;             // number of references to the document; the doc can be
-    // deleted when this is negative
-    PdfDocument *next;
-};
-
-static PdfDocument *pdfDocuments = 0;
-
-static XRef *xref = 0;
-
-// Returns pointer to PdfDocument record for PDF file.
-// Creates a new record if it doesn't exist yet.
-// xref is made current for the document.
-
-static PdfDocument *find_add_document(char *file_name)
-{
-    PdfDocument *p = pdfDocuments;
-    while (p && strcmp(p->file_name, file_name) != 0)
-        p = p->next;
-    if (p) {
-        xref = p->xref;
-        (p->occurences)++;
-        return p;
-    }
-    p = new PdfDocument;
-    p->file_name = xstrdup(file_name);
-    p->xref = xref = 0;
-    p->occurences = 0;
-    GString *docName = new GString(p->file_name);
-    p->doc = new PDFDoc(docName);       // takes ownership of docName
-    if (!p->doc->isOk() || !p->doc->okToPrint()) {
-        pdftex_fail("xpdf: reading PDF image failed");
-    }
-    p->inObjList = 0;
-    p->next = pdfDocuments;
-    pdfDocuments = p;
-    return p;
-}
-
-// Deallocate a PdfDocument with all its resources
-
-static void delete_document(PdfDocument * pdf_doc)
-{
-    PdfDocument **p = &pdfDocuments;
-    while (*p && *p != pdf_doc)
-        p = &((*p)->next);
-    // should not happen:
-    if (!*p)
-        return;
-    // unlink from list
-    *p = pdf_doc->next;
-    // free pdf_doc's resources
-    InObj *r, *n;
-    for (r = pdf_doc->inObjList; r != 0; r = n) {
-        n = r->next;
-        delete r;
-    }
-    xref = pdf_doc->xref;
-    delete pdf_doc->doc;
-    xfree(pdf_doc->file_name);
-    delete pdf_doc;
-}
-
-// --------------------------------------------------------------------
-
-static int addEncoding(GfxFont * gfont)
-{
-    UsedEncoding *n;
-    n = new UsedEncoding;
-    n->next = encodingList;
-    encodingList = n;
-    n->font = gfont;
-    n->enc_objnum = pdfnewobjnum();
-    return n->enc_objnum;
-}
-
-#define addFont(ref, fd, enc_objnum) \
-        addInObj(objFont, ref, fd, enc_objnum)
-
-// addFontDesc is only used to avoid writing the original FontDescriptor
-// from the PDF file.
-
-#define addFontDesc(ref, fd) \
-        addInObj(objFontDesc, ref, fd, 0)
-
-#define addOther(ref) \
-        addInObj(objOther, ref, 0, 0)
-
-static int addInObj(InObjType type, Ref ref, fd_entry * fd, int e)
-{
-    InObj *p, *q, *n = new InObj;
-    if (ref.num == 0)
-        pdftex_fail("PDF inclusion: invalid reference");
-    n->ref = ref;
-    n->type = type;
-    n->next = 0;
-    n->fd = fd;
-    n->enc_objnum = e;
-    n->written = 0;
-    if (inObjList == 0)
-        inObjList = n;
-    else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                delete n;
-                return p->num;
-            }
-            q = p;
-        }
-        // it is important to add new objects at the end of the list,
-        // because new objects are being added while the list is being
-        // written out.
-        q->next = n;
-    }
-    if (type == objFontDesc)
-        n->num = get_fd_objnum(fd);
-    else
-        n->num = pdfnewobjnum();
-    return n->num;
-}
-
-#if 0 /* unusewd */
-static int getNewObjectNumber(Ref ref)
-{
-    InObj *p;
-    if (inObjList == 0) {
-        pdftex_fail("No objects copied yet");
-    } else {
-        for (p = inObjList; p != 0; p = p->next) {
-            if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-                return p->num;
-            }
-        }
-        pdftex_fail("Object not yet copied: %i %i", ref.num, ref.gen);
-    }
-#ifdef _MSC_VER
-    /* Never reached, but without __attribute__((noreturn)) for pdftex_fail()
-       MSVC 5.0 requires an int return value.  */
-    return -60000;
-#endif
-}
-#endif
-
-static void copyObject(Object *);
-
-static void copyName(char *s)
-{
-    pdf_puts("/");
-    for (; *s != 0; s++) {
-        if (isdigit(*s) || isupper(*s) || islower(*s) || *s == '_' ||
-            *s == '.' || *s == '-' || *s == '+')
-            pdfout(*s);
-        else
-            pdf_printf("#%.2X", *s & 0xFF);
-    }
-}
-
-static void copyDictEntry(Object * obj, int i)
-{
-    Object obj1;
-    copyName((char *)obj->dictGetKey(i));
-    pdf_puts(" ");
-    obj1 = obj->dictGetValNF(i).copy();
-    copyObject(&obj1);
-    pdf_puts("\n");
-}
-
-static void copyDict(Object * obj)
-{
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i)
-        copyDictEntry(obj, i);
-}
-
-static void copyFontDict(Object * obj, InObj * r)
-{
-    int i, l;
-    char *key;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("<<\n");
-    assert(r->type == objFont); // FontDescriptor is in fd_tree
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        key = (char *)obj->dictGetKey(i);
-        if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0
-            || strncmp("BaseFont", key, strlen("BaseFont")) == 0
-            || strncmp("Encoding", key, strlen("Encoding")) == 0)
-            continue;           // skip original values
-        copyDictEntry(obj, i);
-    }
-    // write new FontDescriptor, BaseFont, and Encoding
-    pdf_printf("/FontDescriptor %d 0 R\n", get_fd_objnum(r->fd));
-    pdf_printf("/BaseFont %d 0 R\n", get_fn_objnum(r->fd));
-    pdf_printf("/Encoding %d 0 R\n", r->enc_objnum);
-    pdf_puts(">>");
-}
-
-static void copyStream(Stream * str)
-{
-    int c, c2 = 0;
-    str->reset();
-    while ((c = str->getChar()) != EOF) {
-        pdfout(c);
-        c2 = c;
-    }
-    pdflastbyte = c2;
-}
-
-static void copyProcSet(Object * obj)
-{
-    int i, l;
-    Object procset;
-    if (!obj->isArray())
-        pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/ProcSet [ ");
-    for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-        procset = obj->arrayGetNF(i).copy();
-        if (!procset.isName())
-            pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>",
-                        procset.getTypeName());
-        copyName((char *)procset.getName());
-        pdf_puts(" ");
-    }
-    pdf_puts("]\n");
-}
-
-#define REPLACE_TYPE1C true
-
-static bool embeddableFont(Object * fontdesc)
-{
-    Object fontfile, ffsubtype;
-
-    if (!fontdesc->isDict())
-        return false;
-    fontfile = fontdesc->dictLookup("FontFile");
-    if (fontfile.isStream())
-        return true;
-    if (REPLACE_TYPE1C) {
-        fontfile = fontdesc->dictLookup("FontFile3");
-        if (!fontfile.isStream())
-            return false;
-        ffsubtype = fontfile.streamGetDict()->lookup("Subtype");
-        return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C");
-    }
-    return false;
-}
-
-static void copyFont(char *tag, Object * fontRef)
-{
-    Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset,
-        stemV;
-    GfxFont *gfont;
-    fd_entry *fd;
-    fm_entry *fontmap;
-    // Check whether the font has already been embedded before analysing it.
-    InObj *p;
-    Ref ref = fontRef->getRef();
-    for (p = inObjList; p; p = p->next) {
-        if (p->ref.num == ref.num && p->ref.gen == ref.gen) {
-            copyName(tag);
-            pdf_printf(" %d 0 R ", p->num);
-            return;
-        }
-    }
-    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
-    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
-    fontdict = fontRef->fetch(xref);
-    fontdesc = Object(objNull);
-    if (fontdict.isDict()) {
-        subtype = fontdict.dictLookup("Subtype");
-        basefont = fontdict.dictLookup("BaseFont");
-        fontdescRef = fontdict.dictLookupNF("FontDescriptor").copy();
-        if (fontdescRef.isRef()) {
-            fontdesc = fontdescRef.fetch(xref);
-        }
-    }
-    if (!fixedinclusioncopyfont && fontdict.isDict()
-        && subtype.isName()
-        && !strcmp(subtype.getName(), "Type1")
-        && basefont.isName()
-        && fontdescRef.isRef()
-        && fontdesc.isDict()
-        && embeddableFont(&fontdesc)
-        && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) {
-        // round /StemV value, since the PDF input is a float
-        // (see Font Descriptors in PDF reference), but we only store an
-        // integer, since we don't want to change the struct.
-        stemV = fontdesc.dictLookup("StemV");
-        fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum()));
-        charset = fontdesc.dictLookup("CharSet");
-        if (!charset.isNull() &&
-            charset.isString() && is_subsetable(fontmap))
-            epdf_mark_glyphs(fd, (char *)charset.getString()->c_str());
-        else
-            embed_whole_font(fd);
-        addFontDesc(fontdescRef.getRef(), fd);
-        copyName(tag);
-        gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(),
-                                  fontdict.getDict());
-        pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd,
-                                       addEncoding(gfont)));
-    } else {
-        copyName(tag);
-        pdf_puts(" ");
-        copyObject(fontRef);
-    }
-}
-
-static void copyFontResources(Object * obj)
-{
-    Object fontRef;
-    int i, l;
-    if (!obj->isDict())
-        pdftex_fail("PDF inclusion: invalid font resources dict type <%s>",
-                    obj->getTypeName());
-    pdf_puts("/Font << ");
-    for (i = 0, l = obj->dictGetLength(); i < l; ++i) {
-        fontRef = obj->dictGetValNF(i).copy();
-        if (fontRef.isRef())
-            copyFont((char *)obj->dictGetKey(i), &fontRef);
-        else if (fontRef.isDict()) {   // some programs generate pdf with embedded font object
-            copyName((char *)obj->dictGetKey(i));
-            pdf_puts(" ");
-            copyObject(&fontRef);
-        }
-        else
-            pdftex_fail("PDF inclusion: invalid font in reference type <%s>",
-                        fontRef.getTypeName());
-    }
-    pdf_puts(">>\n");
-}
-
-static void copyOtherResources(Object * obj, char *key)
-{
-    // copies all other resources (write_epdf handles Fonts and ProcSets),
-
-    // if Subtype is present, it must be a name
-    if (strcmp("Subtype", key) == 0) {
-        if (!obj->isName()) {
-            pdftex_warn("PDF inclusion: Subtype in Resources dict is not a name"
-                        " (key '%s', type <%s>); ignored.",
-                        key, obj->getTypeName());
-            return;
-        }
-    } else if (!obj->isDict()) {
-        //FIXME: Write the message only to the log file
-        pdftex_warn("PDF inclusion: invalid other resource which is no dict"
-                    " (key '%s', type <%s>); ignored.",
-                    key, obj->getTypeName());
-        return;
-    }
-    copyName(key);
-    pdf_puts(" ");
-    copyObject(obj);
-}
-
-// Function onverts double to string; very small and very large numbers
-// are NOT converted to scientific notation.
-// n must be a number or real conforming to the implementation limits
-// of PDF as specified in appendix C.1 of the PDF Ref.
-// These are:
-// maximum value of ints is +2^32
-// maximum value of reals is +2^15
-// smalles values of reals is 1/(2^16)
-
-static char *convertNumToPDF(double n)
-{
-    static const int precision = 6;
-    static const int fact = (int) 1E6;  // must be 10^precision
-    static const double epsilon = 0.5E-6;       // 2epsilon must be 10^-precision
-    static char buf[64];
-    // handle very small values: return 0
-    if (fabs(n) < epsilon) {
-        buf[0] = '0';
-        buf[1] = '\0';
-    } else {
-        char ints[64];
-        int bindex = 0, sindex = 0;
-        int ival, fval;
-        // handle the sign part if n is negative
-        if (n < 0) {
-            buf[bindex++] = '-';
-            n = -n;
-        }
-        n += epsilon;           // for rounding
-        // handle the integer part, simply with sprintf
-        ival = (int) floor(n);
-        n -= ival;
-        sprintf(ints, "%d", ival);
-        while (ints[sindex] != 0)
-            buf[bindex++] = ints[sindex++];
-        // handle the fractional part up to 'precision' digits
-        fval = (int) floor(n * fact);
-        if (fval) {
-            // set a dot
-            buf[bindex++] = '.';
-            sindex = bindex + precision;
-            buf[sindex--] = '\0';
-            // fill up trailing zeros with the string terminator NULL
-            while (((fval % 10) == 0) && (sindex >= bindex)) {
-                buf[sindex--] = '\0';
-                fval /= 10;
-            }
-            // fill up the fractional part back to front
-            while (sindex >= bindex) {
-                buf[sindex--] = (fval % 10) + '0';
-                fval /= 10;
-            }
-        } else
-            buf[bindex++] = 0;
-    }
-    return (char *) buf;
-}
-
-static void copyObject(Object * obj)
-{
-    Object obj1;
-    int i, l, c;
-    Ref ref;
-    char *p;
-    GString *s;
-    if (obj->isBool()) {
-        pdf_printf("%s", obj->getBool()? "true" : "false");
-    } else if (obj->isInt()) {
-        pdf_printf("%i", obj->getInt());
-    } else if (obj->isReal()) {
-        pdf_printf("%s", convertNumToPDF(obj->getReal()));
-    } else if (obj->isNum()) {
-        pdf_printf("%s", convertNumToPDF(obj->getNum()));
-    } else if (obj->isString()) {
-        s = (GooString *)obj->getString();
-        p = (char *)s->c_str();
-        l = s->getLength();
-        if (strlen(p) == (unsigned int) l) {
-            pdf_puts("(");
-            for (; *p != 0; p++) {
-                c = (unsigned char) *p;
-                if (c == '(' || c == ')' || c == '\\')
-                    pdf_printf("\\%c", c);
-                else if (c < 0x20 || c > 0x7F)
-                    pdf_printf("\\%03o", c);
-                else
-                    pdfout(c);
-            }
-            pdf_puts(")");
-        } else {
-            pdf_puts("<");
-            for (i = 0; i < l; i++) {
-                c = s->getChar(i) & 0xFF;
-                pdf_printf("%.2x", c);
-            }
-            pdf_puts(">");
-        }
-    } else if (obj->isName()) {
-        copyName((char *)obj->getName());
-    } else if (obj->isNull()) {
-        pdf_puts("null");
-    } else if (obj->isArray()) {
-        pdf_puts("[");
-        for (i = 0, l = obj->arrayGetLength(); i < l; ++i) {
-            obj1 = obj->arrayGetNF(i).copy();
-            if (!obj1.isName())
-                pdf_puts(" ");
-            copyObject(&obj1);
-        }
-        pdf_puts("]");
-    } else if (obj->isDict()) {
-        pdf_puts("<<\n");
-        copyDict(obj);
-        pdf_puts(">>");
-    } else if (obj->isStream()) {
-        pdf_puts("<<\n");
-        copyDict(obj->getStream()->getDictObject());
-        pdf_puts(">>\n");
-        pdf_puts("stream\n");
-        copyStream(obj->getStream()->getUndecodedStream());
-        pdf_puts("\nendstream");
-    } else if (obj->isRef()) {
-        ref = obj->getRef();
-        if (ref.num == 0) {
-            pdftex_fail
-                ("PDF inclusion: reference to invalid object"
-                 " (is the included pdf broken?)");
-        } else
-            pdf_printf("%d 0 R", addOther(ref));
-    } else {
-        pdftex_fail("PDF inclusion: type <%s> cannot be copied",
-                    obj->getTypeName());
-    }
-}
-
-static void writeRefs()
-{
-    InObj *r;
-    for (r = inObjList; r != 0; r = r->next) {
-        if (!r->written) {
-            r->written = 1;
-            Object obj1 = xref->fetch(r->ref.num, r->ref.gen);
-            if (r->type == objFont) {
-                assert(!obj1.isStream());
-                pdfbeginobj(r->num, 2);         // \pdfobjcompresslevel = 2 is for this
-                copyFontDict(&obj1, r);
-                pdf_puts("\n");
-                pdfendobj();
-            } else if (r->type != objFontDesc) {        // /FontDescriptor is written via write_fontdescriptor()
-                if (obj1.isStream())
-                    pdfbeginobj(r->num, 0);
-                else
-                    pdfbeginobj(r->num, 2);     // \pdfobjcompresslevel = 2 is for this
-                copyObject(&obj1);
-                pdf_puts("\n");
-                pdfendobj();
-            }
-        }
-    }
-}
-
-static void writeEncodings()
-{
-    UsedEncoding *r, *n;
-    char *glyphNames[256], *s;
-    int i;
-    for (r = encodingList; r != 0; r = r->next) {
-        for (i = 0; i < 256; i++) {
-            if (r->font->isCIDFont()) {
-                pdftex_fail
-                    ("PDF inclusion: CID fonts are not supported"
-                     " (try to disable font replacement to fix this)");
-            }
-            if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0)
-                glyphNames[i] = s;
-            else
-                glyphNames[i] = notdef;
-        }
-        epdf_write_enc(glyphNames, r->enc_objnum);
-    }
-    for (r = encodingList; r != 0; r = n) {
-        n = r->next;
-#ifdef POPPLER_VERSION
-        r->font->decRefCnt();
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-        delete r;
-    }
-}
-
-// get the pagebox according to the pagebox_spec
-static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
-{
-    if (pagebox_spec == pdfboxspecmedia)
-        return page->getMediaBox();
-    else if (pagebox_spec == pdfboxspeccrop)
-        return page->getCropBox();
-    else if (pagebox_spec == pdfboxspecbleed)
-        return page->getBleedBox();
-    else if (pagebox_spec == pdfboxspectrim)
-        return page->getTrimBox();
-    else if (pagebox_spec == pdfboxspecart)
-        return page->getArtBox();
-    else
-        pdftex_fail("PDF inclusion: unknown value of pagebox spec (%i)",
-                    (int) pagebox_spec);
-    return page->getMediaBox(); // to make the compiler happy
-}
-
-
-// Reads various information about the PDF and sets it up for later inclusion.
-// This will fail if the PDF version of the PDF is higher than
-// minor_pdf_version_wanted or page_name is given and can not be found.
-// It makes no sense to give page_name _and_ page_num.
-// Returns the page number.
-
-int
-read_pdf_info(char *image_name, char *page_name, int page_num,
-              int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted,
-              int pdf_inclusion_errorlevel)
-{
-    PdfDocument *pdf_doc;
-    Page *page;
-    const PDFRectangle *pagebox;
-#ifdef POPPLER_VERSION
-    int pdf_major_version_found, pdf_minor_version_found;
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    // initialize
-    if (!isInit) {
-        globalParams = std::make_unique<GlobalParams>();
-        globalParams->setErrQuiet(false);
-        isInit = true;
-    }
-    // open PDF file
-    pdf_doc = find_add_document(image_name);
-    epdf_doc = (void *) pdf_doc;
-
-    // check PDF version
-    // this works only for PDF 1.x -- but since any versions of PDF newer
-    // than 1.x will not be backwards compatible to PDF 1.x, pdfTeX will
-    // then have to changed drastically anyway.
-#ifdef POPPLER_VERSION
-    pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion();
-    pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion();
-    if ((pdf_major_version_found > major_pdf_version_wanted)
-     || (pdf_minor_version_found > minor_pdf_version_wanted)) {
-        const char *msg =
-            "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed";
-        if (pdf_inclusion_errorlevel > 0) {
-            pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        } else if (pdf_inclusion_errorlevel < 0) {
-            ; /* do nothing */
-        } else { /* = 0, give warning */
-            pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted);
-        }
-    }
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-    epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages();
-    if (page_name) {
-        // get page by name
-        GString name(page_name);
-        std::unique_ptr<LinkDest> link = pdf_doc->doc->findDest(&name);
-        if (link == 0 || !link->isOk())
-            pdftex_fail("PDF inclusion: invalid destination <%s>", page_name);
-        Ref ref = link->getPageRef();
-        page_num = pdf_doc->doc->getCatalog()->findPage(ref);
-        if (page_num == 0)
-            pdftex_fail("PDF inclusion: destination is not a page <%s>",
-                        page_name);
-    } else {
-        // get page by number
-        if (page_num <= 0 || page_num > epdf_num_pages)
-            pdftex_fail("PDF inclusion: required page does not exist <%i>",
-                        epdf_num_pages);
-    }
-    // get the required page
-    page = pdf_doc->doc->getCatalog()->getPage(page_num);
-
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, pagebox_spec);
-    if (pagebox->x2 > pagebox->x1) {
-        epdf_orig_x = pagebox->x1;
-        epdf_width = pagebox->x2 - pagebox->x1;
-    } else {
-        epdf_orig_x = pagebox->x2;
-        epdf_width = pagebox->x1 - pagebox->x2;
-    }
-    if (pagebox->y2 > pagebox->y1) {
-        epdf_orig_y = pagebox->y1;
-        epdf_height = pagebox->y2 - pagebox->y1;
-    } else {
-        epdf_orig_y = pagebox->y2;
-        epdf_height = pagebox->y1 - pagebox->y2;
-    }
-
-    // get page rotation
-    epdf_rotate = page->getRotate() % 360;
-    if (epdf_rotate < 0)
-        epdf_rotate += 360;
-
-    // page group
-    if (page->getGroup() != NULL)
-        epdf_has_page_group = 1;    // only flag that page group is present;
-                                    // the actual object number will be
-                                    // generated in pdftex.web
-    else
-        epdf_has_page_group = 0;    // no page group present
-
-    pdf_doc->xref = pdf_doc->doc->getXRef();
-    return page_num;
-}
-
-// writes the current epf_doc.
-// Here the included PDF is copied, so most errors that can happen during PDF
-// inclusion will arise here.
-
-void write_epdf(void)
-{
-    Page *page;
-    Ref *pageRef;
-    Dict *pageDict;
-    Object contents, obj1, obj2, pageObj, dictObj;
-    Object groupDict;
-    bool writeSepGroup = false;
-    Object info;
-    char *key;
-    char s[256];
-    int i, l;
-    int rotate;
-    double scale[6] = { 0, 0, 0, 0, 0, 0 };
-    bool writematrix = false;
-    int suppress_ptex_info = getpdfsuppressptexinfo();
-    static const char *pageDictKeys[] = {
-        "LastModified",
-        "Metadata",
-        "PieceInfo",
-        "SeparationInfo",
-//         "Group",
-//         "Resources",
-        NULL
-    };
-
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    (pdf_doc->occurences)--;
-    xref = pdf_doc->xref;
-    inObjList = pdf_doc->inObjList;
-    encodingList = 0;
-    page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page);
-    pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page);
-    pageObj = xref->fetch(pageRef->num, pageRef->gen);
-    pageDict = pageObj.getDict();
-    rotate = page->getRotate();
-    const PDFRectangle *pagebox;
-    // write the Page header
-    pdf_puts("/Type /XObject\n");
-    pdf_puts("/Subtype /Form\n");
-    pdf_puts("/FormType 1\n");
-
-    // write additional information
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_FILENAME) == 0) {
-        pdf_printf("/%s.FileName (%s)\n", pdfkeyprefix,
-                   convertStringToPDFString(pdf_doc->file_name,
-                                            strlen(pdf_doc->file_name)));
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_PAGENUMBER) == 0) {
-        pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page);
-    }
-    if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) {
-        info = pdf_doc->doc->getDocInfoNF().copy();
-        if (info.isRef()) {
-            // the info dict must be indirect (PDF Ref p. 61)
-            pdf_printf("/%s.InfoDict ", pdfkeyprefix);
-            pdf_printf("%d 0 R\n", addOther(info.getRef()));
-        }
-    }
-    // get the pagebox (media, crop...) to use.
-    pagebox = get_pagebox(page, epdf_page_box);
-
-    // handle page rotation
-    if (rotate != 0) {
-        if (rotate % 90 == 0) {
-            // this handles only the simple case: multiple of 90s but these
-            // are the only values allowed according to the reference
-            // (v1.3, p. 78).
-            // the image is rotated around its center.
-            // the /Rotate key is clockwise while the matrix is
-            // counterclockwise :-%
-            tex_printf(", page is rotated %d degrees", rotate);
-            switch (rotate) {
-            case 90:
-                scale[1] = -1;
-                scale[2] = 1;
-                scale[4] = pagebox->x1 - pagebox->y1;
-                scale[5] = pagebox->y1 + pagebox->x2;
-                writematrix = true;
-                break;
-            case 180:
-                scale[0] = scale[3] = -1;
-                scale[4] = pagebox->x1 + pagebox->x2;
-                scale[5] = pagebox->y1 + pagebox->y2;
-                writematrix = true;
-                break;          // width and height are exchanged
-            case 270:
-                scale[1] = 1;
-                scale[2] = -1;
-                scale[4] = pagebox->x1 + pagebox->y2;
-                scale[5] = pagebox->y1 - pagebox->x1;
-                writematrix = true;
-                break;
-            }
-            if (writematrix) {  // The matrix is only written if the image is rotated.
-                sprintf(s, "/Matrix [%.8f %.8f %.8f %.8f %.8f %.8f]\n",
-                        scale[0],
-                        scale[1], scale[2], scale[3], scale[4], scale[5]);
-                pdf_puts(stripzeros(s));
-            }
-        }
-    }
-
-    sprintf(s, "/BBox [%.8f %.8f %.8f %.8f]\n",
-            pagebox->x1, pagebox->y1, pagebox->x2, pagebox->y2);
-    pdf_puts(stripzeros(s));
-
-    // Metadata validity check (as a stream it must be indirect)
-    dictObj = pageDict->lookupNF("Metadata").copy();
-    if (!dictObj.isNull() && !dictObj.isRef())
-        pdftex_warn("PDF inclusion: /Metadata must be indirect object");
-
-    // copy selected items in Page dictionary except Resources & Group
-    for (i = 0; pageDictKeys[i] != NULL; i++) {
-        dictObj = pageDict->lookupNF(pageDictKeys[i]).copy();
-        if (!dictObj.isNull()) {
-            pdf_newline();
-            pdf_printf("/%s ", pageDictKeys[i]);
-            copyObject(&dictObj); // preserves indirection
-        }
-    } 
-
-    // handle page group
-    dictObj = pageDict->lookupNF("Group").copy();
-    if (!dictObj.isNull()) {
-        if (pdfpagegroupval == 0) { 
-            // another pdf with page group was included earlier on the
-            // same page; copy the Group entry as is.  See manual for
-            // info on why this is a warning.
-            if (getpdfsuppresswarningpagegroup() == 0) {
-                pdftex_warn
-    ("PDF inclusion: multiple pdfs with page group included in a single page");
-            }
-            pdf_newline();
-            pdf_puts("/Group ");
-            copyObject(&dictObj);
-        } else {
-            // write Group dict as a separate object, since the Page dict also refers to it
-            dictObj = pageDict->lookup("Group");
-            if (!dictObj.isDict())
-                pdftex_fail("PDF inclusion: /Group dict missing");
-            writeSepGroup = true;
-/*
-This part is only a single line
-            groupDict = Object(page->getGroup());
-in the original patch. In this case, however, pdftex crashes at
-"delete pdf_doc->doc" in "delete_document()" for inclusion of some
-kind of pdf images, for example, figure_missing.pdf in gnuplot.
-A change
-            groupDict = Object(page->getGroup()).copy();
-does not improve the situation.
-The changes below seem to work fine. 
-*/
-// begin modification
-            groupDict = pageDict->lookup("Group");
-            const Dict& dic1 = page->getGroup();
-            const Dict& dic2 = groupDict.getDict();
-            // replace dic2 in groupDict with dic1
-            l = dic2.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictRemove(dic2.getKey(i));
-            }
-            l = dic1.getLength();
-            for (i = 0; i < l; i++) {
-                groupDict.dictAdd((const char *)copyString(dic1.getKey(i)),
-                                  dic1.getValNF(i).copy());
-            }
-// end modification
-            pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval);
-        }
-    }
-
-    // write the Resources dictionary
-    if (page->getResourceDict() == NULL) {
-        // Resources can be missing (files without them have been spotted
-        // in the wild); in which case the /Resouces of the /Page will be used.
-        // "This practice is not recommended".
-        pdftex_warn
-            ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)");
-    } else {
-        Object *obj1 = page->getResourceDictObject();
-        if (!obj1->isDict())
-            pdftex_fail("PDF inclusion: invalid resources dict type <%s>",
-                        obj1->getTypeName());
-        pdf_newline();
-        pdf_puts("/Resources <<\n");
-        for (i = 0, l = obj1->dictGetLength(); i < l; ++i) {
-            obj2 = obj1->dictGetVal(i);
-            key = (char *)obj1->dictGetKey(i);
-            if (strcmp("Font", key) == 0)
-                copyFontResources(&obj2);
-            else if (strcmp("ProcSet", key) == 0)
-                copyProcSet(&obj2);
-            else
-                copyOtherResources(&obj2, (char *)key);
-        }
-        pdf_puts(">>\n");
-    }
-
-    // write the page contents
-    contents = page->getContents();
-    if (contents.isStream()) {
-
-        // Variant A: get stream and recompress under control
-        // of \pdfcompresslevel
-        //
-        // pdfbeginstream();
-        // copyStream(contents->getStream());
-        // pdfendstream();
-
-        // Variant B: copy stream without recompressing
-        //
-        obj1 = contents.streamGetDict()->lookup("F");
-        if (!obj1.isNull()) {
-            pdftex_fail("PDF inclusion: Unsupported external stream");
-        }
-        obj1 = contents.streamGetDict()->lookup("Length");
-        assert(!obj1.isNull());
-        pdf_puts("/Length ");
-        copyObject(&obj1);
-        pdf_puts("\n");
-        obj1 = contents.streamGetDict()->lookup("Filter");
-        if (!obj1.isNull()) {
-            pdf_puts("/Filter ");
-            copyObject(&obj1);
-            pdf_puts("\n");
-            obj1 = contents.streamGetDict()->lookup("DecodeParms");
-            if (!obj1.isNull()) {
-                pdf_puts("/DecodeParms ");
-                copyObject(&obj1);
-                pdf_puts("\n");
-            }
-        }
-        pdf_puts(">>\nstream\n");
-        copyStream(contents.getStream()->getUndecodedStream());
-        pdfendstream();
-    } else if (contents.isArray()) {
-        pdfbeginstream();
-        for (i = 0, l = contents.arrayGetLength(); i < l; ++i) {
-            Object contentsobj = contents.arrayGet(i);
-            copyStream(contentsobj.getStream());
-            if (i < l - 1)
-                pdf_newline();  // add a newline after each stream except the last
-        }
-        pdfendstream();
-    } else {                    // the contents are optional, but we need to include an empty stream
-        pdfbeginstream();
-        pdfendstream();
-    }
-
-    // write out all indirect objects
-    writeRefs();
-
-    // write out all used encodings (and delete list)
-    writeEncodings();
-
-    // write the Group dict if needed
-    if (writeSepGroup) {
-        pdfbeginobj(pdfpagegroupval, 2);
-        copyObject(&groupDict);
-        pdf_puts("\n");
-        pdfendobj();
-        pdfpagegroupval = 0;    // only the 1st included pdf on a page gets its
-                                // Group included in the Page dict
-    }
-
-    // save object list, xref
-    pdf_doc->inObjList = inObjList;
-    pdf_doc->xref = xref;
-}
-
-// Called when an image has been written and it's resources in image_tab are
-// freed and it's not referenced anymore.
-
-void epdf_delete()
-{
-    PdfDocument *pdf_doc = (PdfDocument *) epdf_doc;
-    xref = pdf_doc->xref;
-    if (pdf_doc->occurences < 0) {
-        delete_document(pdf_doc);
-    }
-}
-
-// Called when PDF embedding system is finalized.
-// Now deallocate all remaining PdfDocuments.
-
-void epdf_check_mem()
-{
-    if (isInit) {
-        PdfDocument *p, *n;
-        for (p = pdfDocuments; p; p = n) {
-            n = p->next;
-            delete_document(p);
-        }
-    }
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-newpoppler.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-newpoppler.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-newpoppler.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,208 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. The poppler should be 0.59.0 or newer versions.
-It is tested upto the poppler 0.70.1.
-POPPLER_VERSION should be defined.
-*/
-
-#include <w2c/config.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#define GString GooString
-#define xpdfVersion POPPLER_VERSION
-#include <dirent.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-static XRef *xref = 0;
-
-int main(int argc, char *argv[])
-{
-    char *p, buf[1024];
-    PDFDoc *doc;
-    GString *fileName;
-    Stream *s;
-    Object srcStream, srcName, catalogDict;
-    FILE *outfile;
-    char *outname;
-    int objnum = 0, objgen = 0;
-    bool extract_xref_table = false;
-    int c;
-    fprintf(stderr, "pdftosrc version %s\n", xpdfVersion);
-    if (argc < 2) {
-        fprintf(stderr,
-                "Usage: pdftosrc <PDF-file> [<stream-object-number>]\n");
-        exit(1);
-    }
-    fileName = new GString(argv[1]);
-    globalParams = new GlobalParams();
-    doc = new PDFDoc(fileName);
-    if (!doc->isOk()) {
-        fprintf(stderr, "Invalid PDF file\n");
-        exit(1);
-    }
-    if (argc >= 3) {
-        objnum = atoi(argv[2]);
-        if (argc >= 4)
-            objgen = atoi(argv[3]);
-    }
-    xref = doc->getXRef();
-    catalogDict = xref->getCatalog();
-    if (!catalogDict.isDict("Catalog")) {
-        fprintf(stderr, "No Catalog found\n");
-        exit(1);
-    }
-    srcStream = Object(objNull);
-    if (objnum == 0) {
-        srcStream = catalogDict.dictLookup("SourceObject");
-        static char const_SourceFile[] = "SourceFile";
-        if (!srcStream.isStream(const_SourceFile)) {
-            fprintf(stderr, "No SourceObject found\n");
-            exit(1);
-        }
-        srcName = srcStream.getStream()->getDict()->lookup("SourceName");
-        if (!srcName.isString()) {
-            fprintf(stderr, "No SourceName found\n");
-            exit(1);
-        }
-        outname = (char *)srcName.getString()->getCString();
-        // We cannot free srcName, as objname shares its string.
-        // srcName.free();
-    } else if (objnum > 0) {
-        srcStream = xref->fetch(objnum, objgen);
-        if (!srcStream.isStream()) {
-            fprintf(stderr, "Not a Stream object\n");
-            exit(1);
-        }
-        sprintf(buf, "%s", fileName->getCString());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        if (objgen == 0)
-            sprintf(p, ".%i", objnum);
-        else
-            sprintf(p, ".%i+%i", objnum, objgen);
-        outname = buf;
-    } else {                    // objnum < 0 means we are extracting the XRef table
-        extract_xref_table = true;
-        sprintf(buf, "%s", fileName->getCString());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        sprintf(p, ".xref");
-        outname = buf;
-    }
-    if (!(outfile = fopen(outname, "wb"))) {
-        fprintf(stderr, "Cannot open file \"%s\" for writing\n", outname);
-        exit(1);
-    }
-    if (extract_xref_table) {
-        int size = xref->getNumObjects();
-        int i;
-        for (i = 0; i < size; i++) {
-            if (xref->getEntry(i)->offset == 0xffffffff)
-                break;
-        }
-        size = i;
-        fprintf(outfile, "xref\n");
-        fprintf(outfile, "0 %i\n", size);
-        for (i = 0; i < size; i++) {
-            XRefEntry *e = xref->getEntry(i);
-            if (e->type != xrefEntryCompressed)
-                fprintf(outfile, "%.10lu %.5i %s\n",
-                        (long unsigned) e->offset, e->gen,
-                        (e->type == xrefEntryFree ? "f" : "n"));
-            else {              // e->offset is the object number of the object stream
-                Stream *str;
-                Lexer *lexer;
-                Parser *parser;
-                Object objStr, obj1, obj2;
-                int nObjects, first, n;
-                int localOffset = 0;
-                Guint firstOffset;
-
-                objStr = xref->fetch(e->offset, 0);
-                assert(objStr.isStream());
-                obj1 = objStr.streamGetDict()->lookup("N");
-                nObjects = obj1.getInt();
-                obj1 = objStr.streamGetDict()->lookup("First");
-                first = obj1.getInt();
-                firstOffset = objStr.getStream()->getBaseStream()->getStart() + first;
-
-                // parse the header: object numbers and offsets
-                objStr.streamReset();
-                str = new EmbedStream(objStr.getStream(), Object(objNull), gTrue, first);
-                lexer = new Lexer(xref, str);
-                parser = new Parser(xref, lexer, gFalse);
-                for (n = 0; n < nObjects; ++n) {
-                    obj1 = parser->getObj();
-                    obj2 = parser->getObj();
-                    if (n == e->gen)
-                        localOffset = obj2.getInt();
-                }
-                while (str->getChar() != EOF) ;
-                delete parser;
-
-                fprintf(outfile, "%.10lu 00000 n\n",
-                        (long unsigned)(firstOffset + localOffset));
-            }
-        }
-    } else {
-        s = srcStream.getStream();
-        s->reset();
-        while ((c = s->getChar()) != EOF)
-            fputc(c, outfile);
-    }
-    if (objnum == 0)
-        fprintf(stderr, "Source file extracted to %s\n", outname);
-    else if (objnum > 0)
-        fprintf(stderr, "Stream object extracted to %s\n", outname);
-    else
-        fprintf(stderr, "Cross-reference table extracted to %s\n", outname);
-    fclose(outfile);
-    delete doc;
-    delete globalParams;
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.71.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.71.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.71.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,207 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. The poppler should be 0.71.0.
-POPPLER_VERSION should be defined.
-*/
-
-#include <w2c/config.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#define GString GooString
-#define xpdfVersion POPPLER_VERSION
-#include <dirent.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-static XRef *xref = 0;
-
-int main(int argc, char *argv[])
-{
-    char *p, buf[1024];
-    PDFDoc *doc;
-    GString *fileName;
-    Stream *s;
-    Object srcStream, srcName, catalogDict;
-    FILE *outfile;
-    char *outname;
-    int objnum = 0, objgen = 0;
-    bool extract_xref_table = false;
-    int c;
-    fprintf(stderr, "pdftosrc version %s\n", xpdfVersion);
-    if (argc < 2) {
-        fprintf(stderr,
-                "Usage: pdftosrc <PDF-file> [<stream-object-number>]\n");
-        exit(1);
-    }
-    fileName = new GString(argv[1]);
-    globalParams = new GlobalParams();
-    doc = new PDFDoc(fileName);
-    if (!doc->isOk()) {
-        fprintf(stderr, "Invalid PDF file\n");
-        exit(1);
-    }
-    if (argc >= 3) {
-        objnum = atoi(argv[2]);
-        if (argc >= 4)
-            objgen = atoi(argv[3]);
-    }
-    xref = doc->getXRef();
-    catalogDict = xref->getCatalog();
-    if (!catalogDict.isDict("Catalog")) {
-        fprintf(stderr, "No Catalog found\n");
-        exit(1);
-    }
-    srcStream = Object(objNull);
-    if (objnum == 0) {
-        srcStream = catalogDict.dictLookup("SourceObject");
-        static char const_SourceFile[] = "SourceFile";
-        if (!srcStream.isStream(const_SourceFile)) {
-            fprintf(stderr, "No SourceObject found\n");
-            exit(1);
-        }
-        srcName = srcStream.getStream()->getDict()->lookup("SourceName");
-        if (!srcName.isString()) {
-            fprintf(stderr, "No SourceName found\n");
-            exit(1);
-        }
-        outname = (char *)srcName.getString()->getCString();
-        // We cannot free srcName, as objname shares its string.
-        // srcName.free();
-    } else if (objnum > 0) {
-        srcStream = xref->fetch(objnum, objgen);
-        if (!srcStream.isStream()) {
-            fprintf(stderr, "Not a Stream object\n");
-            exit(1);
-        }
-        sprintf(buf, "%s", fileName->getCString());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        if (objgen == 0)
-            sprintf(p, ".%i", objnum);
-        else
-            sprintf(p, ".%i+%i", objnum, objgen);
-        outname = buf;
-    } else {                    // objnum < 0 means we are extracting the XRef table
-        extract_xref_table = true;
-        sprintf(buf, "%s", fileName->getCString());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        sprintf(p, ".xref");
-        outname = buf;
-    }
-    if (!(outfile = fopen(outname, "wb"))) {
-        fprintf(stderr, "Cannot open file \"%s\" for writing\n", outname);
-        exit(1);
-    }
-    if (extract_xref_table) {
-        int size = xref->getNumObjects();
-        int i;
-        for (i = 0; i < size; i++) {
-            if (xref->getEntry(i)->offset == 0xffffffff)
-                break;
-        }
-        size = i;
-        fprintf(outfile, "xref\n");
-        fprintf(outfile, "0 %i\n", size);
-        for (i = 0; i < size; i++) {
-            XRefEntry *e = xref->getEntry(i);
-            if (e->type != xrefEntryCompressed)
-                fprintf(outfile, "%.10lu %.5i %s\n",
-                        (long unsigned) e->offset, e->gen,
-                        (e->type == xrefEntryFree ? "f" : "n"));
-            else {              // e->offset is the object number of the object stream
-                Stream *str;
-                Lexer *lexer;
-                Parser *parser;
-                Object objStr, obj1, obj2;
-                int nObjects, first, n;
-                int localOffset = 0;
-                Guint firstOffset;
-
-                objStr = xref->fetch(e->offset, 0);
-                assert(objStr.isStream());
-                obj1 = objStr.streamGetDict()->lookup("N");
-                nObjects = obj1.getInt();
-                obj1 = objStr.streamGetDict()->lookup("First");
-                first = obj1.getInt();
-                firstOffset = objStr.getStream()->getBaseStream()->getStart() + first;
-
-                // parse the header: object numbers and offsets
-                objStr.streamReset();
-                str = new EmbedStream(objStr.getStream(), Object(objNull), true, first);
-                lexer = new Lexer(xref, str);
-                parser = new Parser(xref, lexer, false);
-                for (n = 0; n < nObjects; ++n) {
-                    obj1 = parser->getObj();
-                    obj2 = parser->getObj();
-                    if (n == e->gen)
-                        localOffset = obj2.getInt();
-                }
-                while (str->getChar() != EOF) ;
-                delete parser;
-
-                fprintf(outfile, "%.10lu 00000 n\n",
-                        (long unsigned)(firstOffset + localOffset));
-            }
-        }
-    } else {
-        s = srcStream.getStream();
-        s->reset();
-        while ((c = s->getChar()) != EOF)
-            fputc(c, outfile);
-    }
-    if (objnum == 0)
-        fprintf(stderr, "Source file extracted to %s\n", outname);
-    else if (objnum > 0)
-        fprintf(stderr, "Stream object extracted to %s\n", outname);
-    else
-        fprintf(stderr, "Cross-reference table extracted to %s\n", outname);
-    fclose(outfile);
-    delete doc;
-    delete globalParams;
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.72.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.72.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.72.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,208 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. The poppler should be 0.72.0 or newer versions.
-It is tested upto the poppler 0.75.0.
-POPPLER_VERSION should be defined.
-*/
-
-#include <w2c/config.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#define GString GooString
-#define xpdfVersion POPPLER_VERSION
-#include <dirent.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-static XRef *xref = 0;
-
-int main(int argc, char *argv[])
-{
-    char *p, buf[1024];
-    PDFDoc *doc;
-    GString *fileName;
-    Stream *s;
-    Object srcStream, srcName, catalogDict;
-    FILE *outfile;
-    char *outname;
-    int objnum = 0, objgen = 0;
-    bool extract_xref_table = false;
-    int c;
-    fprintf(stderr, "pdftosrc version %s\n", xpdfVersion);
-    if (argc < 2) {
-        fprintf(stderr,
-                "Usage: pdftosrc <PDF-file> [<stream-object-number>]\n");
-        exit(1);
-    }
-    fileName = new GString(argv[1]);
-    globalParams = new GlobalParams();
-    doc = new PDFDoc(fileName);
-    if (!doc->isOk()) {
-        fprintf(stderr, "Invalid PDF file\n");
-        exit(1);
-    }
-    if (argc >= 3) {
-        objnum = atoi(argv[2]);
-        if (argc >= 4)
-            objgen = atoi(argv[3]);
-    }
-    xref = doc->getXRef();
-    catalogDict = xref->getCatalog();
-    if (!catalogDict.isDict("Catalog")) {
-        fprintf(stderr, "No Catalog found\n");
-        exit(1);
-    }
-    srcStream = Object(objNull);
-    if (objnum == 0) {
-        srcStream = catalogDict.dictLookup("SourceObject");
-        static char const_SourceFile[] = "SourceFile";
-        if (!srcStream.isStream(const_SourceFile)) {
-            fprintf(stderr, "No SourceObject found\n");
-            exit(1);
-        }
-        srcName = srcStream.getStream()->getDict()->lookup("SourceName");
-        if (!srcName.isString()) {
-            fprintf(stderr, "No SourceName found\n");
-            exit(1);
-        }
-        outname = (char *)srcName.getString()->c_str();
-        // We cannot free srcName, as objname shares its string.
-        // srcName.free();
-    } else if (objnum > 0) {
-        srcStream = xref->fetch(objnum, objgen);
-        if (!srcStream.isStream()) {
-            fprintf(stderr, "Not a Stream object\n");
-            exit(1);
-        }
-        sprintf(buf, "%s", fileName->c_str());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        if (objgen == 0)
-            sprintf(p, ".%i", objnum);
-        else
-            sprintf(p, ".%i+%i", objnum, objgen);
-        outname = buf;
-    } else {                    // objnum < 0 means we are extracting the XRef table
-        extract_xref_table = true;
-        sprintf(buf, "%s", fileName->c_str());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        sprintf(p, ".xref");
-        outname = buf;
-    }
-    if (!(outfile = fopen(outname, "wb"))) {
-        fprintf(stderr, "Cannot open file \"%s\" for writing\n", outname);
-        exit(1);
-    }
-    if (extract_xref_table) {
-        int size = xref->getNumObjects();
-        int i;
-        for (i = 0; i < size; i++) {
-            if (xref->getEntry(i)->offset == 0xffffffff)
-                break;
-        }
-        size = i;
-        fprintf(outfile, "xref\n");
-        fprintf(outfile, "0 %i\n", size);
-        for (i = 0; i < size; i++) {
-            XRefEntry *e = xref->getEntry(i);
-            if (e->type != xrefEntryCompressed)
-                fprintf(outfile, "%.10lu %.5i %s\n",
-                        (long unsigned) e->offset, e->gen,
-                        (e->type == xrefEntryFree ? "f" : "n"));
-            else {              // e->offset is the object number of the object stream
-                Stream *str;
-                Lexer *lexer;
-                Parser *parser;
-                Object objStr, obj1, obj2;
-                int nObjects, first, n;
-                int localOffset = 0;
-                unsigned int firstOffset;
-
-                objStr = xref->fetch(e->offset, 0);
-                assert(objStr.isStream());
-                obj1 = objStr.streamGetDict()->lookup("N");
-                nObjects = obj1.getInt();
-                obj1 = objStr.streamGetDict()->lookup("First");
-                first = obj1.getInt();
-                firstOffset = objStr.getStream()->getBaseStream()->getStart() + first;
-
-                // parse the header: object numbers and offsets
-                objStr.streamReset();
-                str = new EmbedStream(objStr.getStream(), Object(objNull), true, first);
-                lexer = new Lexer(xref, str);
-                parser = new Parser(xref, lexer, false);
-                for (n = 0; n < nObjects; ++n) {
-                    obj1 = parser->getObj();
-                    obj2 = parser->getObj();
-                    if (n == e->gen)
-                        localOffset = obj2.getInt();
-                }
-                while (str->getChar() != EOF) ;
-                delete parser;
-
-                fprintf(outfile, "%.10lu 00000 n\n",
-                        (long unsigned)(firstOffset + localOffset));
-            }
-        }
-    } else {
-        s = srcStream.getStream();
-        s->reset();
-        while ((c = s->getChar()) != EOF)
-            fputc(c, outfile);
-    }
-    if (objnum == 0)
-        fprintf(stderr, "Source file extracted to %s\n", outname);
-    else if (objnum > 0)
-        fprintf(stderr, "Stream object extracted to %s\n", outname);
-    else
-        fprintf(stderr, "Cross-reference table extracted to %s\n", outname);
-    fclose(outfile);
-    delete doc;
-    delete globalParams;
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.76.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.76.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.76.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,206 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. The poppler should be 0.76.0 upto 0.82.0.
-POPPLER_VERSION should be defined.
-*/
-
-#include <w2c/config.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#define GString GooString
-#define xpdfVersion POPPLER_VERSION
-#include <dirent.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-static XRef *xref = 0;
-
-int main(int argc, char *argv[])
-{
-    char *p, buf[1024];
-    PDFDoc *doc;
-    GString *fileName;
-    Stream *s;
-    Object srcStream, srcName, catalogDict;
-    FILE *outfile;
-    char *outname;
-    int objnum = 0, objgen = 0;
-    bool extract_xref_table = false;
-    int c;
-    fprintf(stderr, "pdftosrc version %s\n", xpdfVersion);
-    if (argc < 2) {
-        fprintf(stderr,
-                "Usage: pdftosrc <PDF-file> [<stream-object-number>]\n");
-        exit(1);
-    }
-    fileName = new GString(argv[1]);
-    globalParams = new GlobalParams();
-    doc = new PDFDoc(fileName);
-    if (!doc->isOk()) {
-        fprintf(stderr, "Invalid PDF file\n");
-        exit(1);
-    }
-    if (argc >= 3) {
-        objnum = atoi(argv[2]);
-        if (argc >= 4)
-            objgen = atoi(argv[3]);
-    }
-    xref = doc->getXRef();
-    catalogDict = xref->getCatalog();
-    if (!catalogDict.isDict("Catalog")) {
-        fprintf(stderr, "No Catalog found\n");
-        exit(1);
-    }
-    srcStream = Object(objNull);
-    if (objnum == 0) {
-        srcStream = catalogDict.dictLookup("SourceObject");
-        static char const_SourceFile[] = "SourceFile";
-        if (!srcStream.isStream(const_SourceFile)) {
-            fprintf(stderr, "No SourceObject found\n");
-            exit(1);
-        }
-        srcName = srcStream.getStream()->getDict()->lookup("SourceName");
-        if (!srcName.isString()) {
-            fprintf(stderr, "No SourceName found\n");
-            exit(1);
-        }
-        outname = (char *)srcName.getString()->c_str();
-        // We cannot free srcName, as objname shares its string.
-        // srcName.free();
-    } else if (objnum > 0) {
-        srcStream = xref->fetch(objnum, objgen);
-        if (!srcStream.isStream()) {
-            fprintf(stderr, "Not a Stream object\n");
-            exit(1);
-        }
-        sprintf(buf, "%s", fileName->c_str());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        if (objgen == 0)
-            sprintf(p, ".%i", objnum);
-        else
-            sprintf(p, ".%i+%i", objnum, objgen);
-        outname = buf;
-    } else {                    // objnum < 0 means we are extracting the XRef table
-        extract_xref_table = true;
-        sprintf(buf, "%s", fileName->c_str());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        sprintf(p, ".xref");
-        outname = buf;
-    }
-    if (!(outfile = fopen(outname, "wb"))) {
-        fprintf(stderr, "Cannot open file \"%s\" for writing\n", outname);
-        exit(1);
-    }
-    if (extract_xref_table) {
-        int size = xref->getNumObjects();
-        int i;
-        for (i = 0; i < size; i++) {
-            if (xref->getEntry(i)->offset == 0xffffffff)
-                break;
-        }
-        size = i;
-        fprintf(outfile, "xref\n");
-        fprintf(outfile, "0 %i\n", size);
-        for (i = 0; i < size; i++) {
-            XRefEntry *e = xref->getEntry(i);
-            if (e->type != xrefEntryCompressed)
-                fprintf(outfile, "%.10lu %.5i %s\n",
-                        (long unsigned) e->offset, e->gen,
-                        (e->type == xrefEntryFree ? "f" : "n"));
-            else {              // e->offset is the object number of the object stream
-                Stream *str;
-                Lexer *lexer;
-                Parser *parser;
-                Object objStr, obj1, obj2;
-                int nObjects, first, n;
-                int localOffset = 0;
-                unsigned int firstOffset;
-
-                objStr = xref->fetch(e->offset, 0);
-                assert(objStr.isStream());
-                obj1 = objStr.streamGetDict()->lookup("N");
-                nObjects = obj1.getInt();
-                obj1 = objStr.streamGetDict()->lookup("First");
-                first = obj1.getInt();
-                firstOffset = objStr.getStream()->getBaseStream()->getStart() + first;
-
-                // parse the header: object numbers and offsets
-                objStr.streamReset();
-                str = new EmbedStream(objStr.getStream(), Object(objNull), true, first);
-                parser = new Parser(xref, str, false);
-                for (n = 0; n < nObjects; ++n) {
-                    obj1 = parser->getObj();
-                    obj2 = parser->getObj();
-                    if (n == e->gen)
-                        localOffset = obj2.getInt();
-                }
-                while (str->getChar() != EOF) ;
-                delete parser;
-
-                fprintf(outfile, "%.10lu 00000 n\n",
-                        (long unsigned)(firstOffset + localOffset));
-            }
-        }
-    } else {
-        s = srcStream.getStream();
-        s->reset();
-        while ((c = s->getChar()) != EOF)
-            fputc(c, outfile);
-    }
-    if (objnum == 0)
-        fprintf(stderr, "Source file extracted to %s\n", outname);
-    else if (objnum > 0)
-        fprintf(stderr, "Stream object extracted to %s\n", outname);
-    else
-        fprintf(stderr, "Cross-reference table extracted to %s\n", outname);
-    fclose(outfile);
-    delete doc;
-    delete globalParams;
-}

Deleted: trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.83.0.cc
===================================================================
--- trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.83.0.cc	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/pdftexdir/pdftosrc-poppler0.83.0.cc	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1,205 +0,0 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh at pdftex.org>
-
-This file is part of pdfTeX.
-
-pdfTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-pdfTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
-This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at
-https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk
-by Arch Linux. The poppler should be 0.83.0 or newer versions.
-POPPLER_VERSION should be defined.
-*/
-
-#include <w2c/config.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef POPPLER_VERSION
-#define GString GooString
-#define xpdfVersion POPPLER_VERSION
-#include <dirent.h>
-#include <goo/GooString.h>
-#include <goo/gmem.h>
-#include <goo/gfile.h>
-#else
-#error POPPLER_VERSION should be defined.
-#endif
-#include <assert.h>
-
-#include "Object.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "GfxFont.h"
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "Error.h"
-
-static XRef *xref = 0;
-
-int main(int argc, char *argv[])
-{
-    char *p, buf[1024];
-    PDFDoc *doc;
-    GString *fileName;
-    Stream *s;
-    Object srcStream, srcName, catalogDict;
-    FILE *outfile;
-    char *outname;
-    int objnum = 0, objgen = 0;
-    bool extract_xref_table = false;
-    int c;
-    fprintf(stderr, "pdftosrc version %s\n", xpdfVersion);
-    if (argc < 2) {
-        fprintf(stderr,
-                "Usage: pdftosrc <PDF-file> [<stream-object-number>]\n");
-        exit(1);
-    }
-    fileName = new GString(argv[1]);
-    globalParams = std::make_unique<GlobalParams>();
-    doc = new PDFDoc(fileName);
-    if (!doc->isOk()) {
-        fprintf(stderr, "Invalid PDF file\n");
-        exit(1);
-    }
-    if (argc >= 3) {
-        objnum = atoi(argv[2]);
-        if (argc >= 4)
-            objgen = atoi(argv[3]);
-    }
-    xref = doc->getXRef();
-    catalogDict = xref->getCatalog();
-    if (!catalogDict.isDict("Catalog")) {
-        fprintf(stderr, "No Catalog found\n");
-        exit(1);
-    }
-    srcStream = Object(objNull);
-    if (objnum == 0) {
-        srcStream = catalogDict.dictLookup("SourceObject");
-        static const char *const_SourceFile = "SourceFile";
-        if (!srcStream.isDict(const_SourceFile)) {
-            fprintf(stderr, "No SourceObject found\n");
-            exit(1);
-        }
-        srcName = srcStream.getStream()->getDict()->lookup("SourceName");
-        if (!srcName.isString()) {
-            fprintf(stderr, "No SourceName found\n");
-            exit(1);
-        }
-        outname = (char *)srcName.getString()->c_str();
-        // We cannot free srcName, as objname shares its string.
-        // srcName.free();
-    } else if (objnum > 0) {
-        srcStream = xref->fetch(objnum, objgen);
-        if (!srcStream.isStream()) {
-            fprintf(stderr, "Not a Stream object\n");
-            exit(1);
-        }
-        sprintf(buf, "%s", fileName->c_str());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        if (objgen == 0)
-            sprintf(p, ".%i", objnum);
-        else
-            sprintf(p, ".%i+%i", objnum, objgen);
-        outname = buf;
-    } else {                    // objnum < 0 means we are extracting the XRef table
-        extract_xref_table = true;
-        sprintf(buf, "%s", fileName->c_str());
-        if ((p = strrchr(buf, '.')) == 0)
-            p = strchr(buf, 0);
-        sprintf(p, ".xref");
-        outname = buf;
-    }
-    if (!(outfile = fopen(outname, "wb"))) {
-        fprintf(stderr, "Cannot open file \"%s\" for writing\n", outname);
-        exit(1);
-    }
-    if (extract_xref_table) {
-        int size = xref->getNumObjects();
-        int i;
-        for (i = 0; i < size; i++) {
-            if (xref->getEntry(i)->offset == 0xffffffff)
-                break;
-        }
-        size = i;
-        fprintf(outfile, "xref\n");
-        fprintf(outfile, "0 %i\n", size);
-        for (i = 0; i < size; i++) {
-            XRefEntry *e = xref->getEntry(i);
-            if (e->type != xrefEntryCompressed)
-                fprintf(outfile, "%.10lu %.5i %s\n",
-                        (long unsigned) e->offset, e->gen,
-                        (e->type == xrefEntryFree ? "f" : "n"));
-            else {              // e->offset is the object number of the object stream
-                Stream *str;
-                Lexer *lexer;
-                Parser *parser;
-                Object objStr, obj1, obj2;
-                int nObjects, first, n;
-                int localOffset = 0;
-                unsigned int firstOffset;
-
-                objStr = xref->fetch(e->offset, 0);
-                assert(objStr.isStream());
-                obj1 = objStr.streamGetDict()->lookup("N");
-                nObjects = obj1.getInt();
-                obj1 = objStr.streamGetDict()->lookup("First");
-                first = obj1.getInt();
-                firstOffset = objStr.getStream()->getBaseStream()->getStart() + first;
-
-                // parse the header: object numbers and offsets
-                objStr.streamReset();
-                str = new EmbedStream(objStr.getStream(), Object(objNull), true, first);
-                parser = new Parser(xref, str, false);
-                for (n = 0; n < nObjects; ++n) {
-                    obj1 = parser->getObj();
-                    obj2 = parser->getObj();
-                    if (n == e->gen)
-                        localOffset = obj2.getInt();
-                }
-                while (str->getChar() != EOF) ;
-                delete parser;
-
-                fprintf(outfile, "%.10lu 00000 n\n",
-                        (long unsigned)(firstOffset + localOffset));
-            }
-        }
-    } else {
-        s = srcStream.getStream();
-        s->reset();
-        while ((c = s->getChar()) != EOF)
-            fputc(c, outfile);
-    }
-    if (objnum == 0)
-        fprintf(stderr, "Source file extracted to %s\n", outname);
-    else if (objnum > 0)
-        fprintf(stderr, "Stream object extracted to %s\n", outname);
-    else
-        fprintf(stderr, "Cross-reference table extracted to %s\n", outname);
-    fclose(outfile);
-    delete doc;
-}

Modified: trunk/Build/source/texk/web2c/window/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/window/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/texk/web2c/window/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -115,7 +115,6 @@
 	$(top_srcdir)/../../m4/kpse-macos-framework.m4 \
 	$(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pixman-flags.m4 \
-	$(top_srcdir)/../../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-pplib-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../../m4/kpse-socket-libs.m4 \
@@ -360,9 +359,6 @@
 PIXMAN_INCLUDES = @PIXMAN_INCLUDES@
 PIXMAN_LIBS = @PIXMAN_LIBS@
 PKG_CONFIG = @PKG_CONFIG@
-POPPLER_DEPEND = @POPPLER_DEPEND@
-POPPLER_INCLUDES = @POPPLER_INCLUDES@
-POPPLER_LIBS = @POPPLER_LIBS@
 PPLIB_DEPEND = @PPLIB_DEPEND@
 PPLIB_INCLUDES = @PPLIB_INCLUDES@
 PPLIB_LIBS = @PPLIB_LIBS@

Modified: trunk/Build/source/utils/Makefile.in
===================================================================
--- trunk/Build/source/utils/Makefile.in	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/utils/Makefile.in	2020-05-14 17:47:47 UTC (rev 55138)
@@ -107,7 +107,6 @@
 	$(top_srcdir)/../m4/kpse-options.m4 \
 	$(top_srcdir)/../m4/kpse-pixman-flags.m4 \
 	$(top_srcdir)/../m4/kpse-pkgs.m4 \
-	$(top_srcdir)/../m4/kpse-poppler-flags.m4 \
 	$(top_srcdir)/../m4/kpse-ptexenc-flags.m4 \
 	$(top_srcdir)/../m4/kpse-setup.m4 \
 	$(top_srcdir)/../m4/kpse-teckit-flags.m4 \
@@ -178,7 +177,6 @@
 	$(top_srcdir)/../libs/graphite2/ac/withenable.ac \
 	$(top_srcdir)/../libs/zziplib/ac/withenable.ac \
 	$(top_srcdir)/../libs/xpdf/ac/withenable.ac \
-	$(top_srcdir)/../libs/poppler/ac/withenable.ac \
 	$(top_srcdir)/../libs/mpfr/ac/withenable.ac \
 	$(top_srcdir)/../libs/gmp/ac/withenable.ac \
 	$(top_srcdir)/../libs/cairo/ac/withenable.ac \

Modified: trunk/Build/source/utils/aclocal.m4
===================================================================
--- trunk/Build/source/utils/aclocal.m4	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/utils/aclocal.m4	2020-05-14 17:47:47 UTC (rev 55138)
@@ -1189,7 +1189,6 @@
 m4_include([../m4/kpse-options.m4])
 m4_include([../m4/kpse-pixman-flags.m4])
 m4_include([../m4/kpse-pkgs.m4])
-m4_include([../m4/kpse-poppler-flags.m4])
 m4_include([../m4/kpse-ptexenc-flags.m4])
 m4_include([../m4/kpse-setup.m4])
 m4_include([../m4/kpse-teckit-flags.m4])

Modified: trunk/Build/source/utils/configure
===================================================================
--- trunk/Build/source/utils/configure	2020-05-14 17:35:54 UTC (rev 55137)
+++ trunk/Build/source/utils/configure	2020-05-14 17:47:47 UTC (rev 55138)
@@ -812,8 +812,6 @@
 with_system_teckit
 with_system_graphite2
 with_system_zziplib
-with_system_xpdf
-with_system_poppler
 with_system_mpfr
 with_mpfr_includes
 with_mpfr_libdir
@@ -1642,10 +1640,6 @@
                           (requires pkg-config)
   --with-system-zziplib   use installed zziplib headers and library (requires
                           pkg-config)
-  --with-system-xpdf      use installed poppler headers and library instead of
-                          xpdf library from TL (requires pkg-config)
-  --with-system-poppler   use installed poppler headers and library (requires
-                          pkg-config)
   --with-system-mpfr      use installed mpfr headers and library
   --with-mpfr-includes=DIR
                           mpfr headers installed in DIR
@@ -4007,7 +4001,7 @@
 fi
 
 test "x$enable_web2c:$enable_xetex" = xyes:yes && {
-  need_poppler=yes
+  need_pplib=yes
   need_libpng=yes
   need_freetype2=yes
   need_teckit=yes
@@ -5119,11 +5113,7 @@
 
 ## libs/xpdf/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
 ## configure options and TL libraries required for xpdf
-
-# Check whether --with-system-xpdf was given.
-if test "${with_system_xpdf+set}" = set; then :
-  withval=$with_system_xpdf;
-fi
+: "kpse_xpdf_options - no-op"
 if test "x$with_system_xpdf" = x; then
   if test -f $srcdir/../libs/xpdf/configure; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`xpdf' headers and library from TL tree" >&5
@@ -5137,40 +5127,6 @@
   ac_configure_args="$ac_configure_args '--with-system-xpdf=$with_system_xpdf'"
 fi
 
-## libs/poppler/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/poppler/
-## configure options and TL libraries required for poppler
-
-# Check whether --with-system-poppler was given.
-if test "${with_system_poppler+set}" = set; then :
-  withval=$with_system_poppler;
-fi
-if test "x$with_system_poppler" = x; then
-  if test -f $srcdir/../libs/poppler/configure; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming \`poppler' headers and library from TL tree" >&5
-$as_echo "$as_me: Assuming \`poppler' headers and library from TL tree" >&6;}
-    with_system_poppler=no
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: Assuming installed \`poppler' headers and library" >&5
-$as_echo "$as_me: Assuming installed \`poppler' headers and library" >&6;}
-    with_system_poppler=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-poppler=$with_system_poppler'"
-fi
-if test "x$with_system_poppler" = xyes; then
-  if test "x$with_system_zlib" = x; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}:   ->  installed \`zlib' headers and library" >&5
-$as_echo "$as_me:   ->  installed \`zlib' headers and library" >&6;}
-    with_system_zlib=yes
-    ac_configure_args="$ac_configure_args '--with-system-zlib'"
-  elif test "x$with_system_zlib" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-poppler' requires \`--with-system-zlib'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_poppler" = xyes && {
-  need_zlib=yes
-}
-
 ## libs/mpfr/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/mpfr/
 ## configure options and TL libraries required for mpfr
 



More information about the tex-live-commits mailing list.