From 0c0b9ea5a5d6bbef938de8a77c5b00cb228b902d Mon Sep 17 00:00:00 2001
From: Even Rouault <even.rouault@spatialys.com>
Date: Fri, 12 Oct 2018 19:02:40 +0200
Subject: [PATCH] Add support for Poppler 0.69 (fixes #1004)

---
 GDALmake.opt.in          |  1 +
 configure                | 61 ++++++++++++++++++++++++++---------
 configure.ac             | 56 +++++++++++++++++++++++---------
 frmts/pdf/GNUmakefile    |  4 +++
 frmts/pdf/makefile.vc    |  6 +++-
 frmts/pdf/pdfdataset.cpp | 12 +++++++
 nmake.opt                |  2 ++
 7 files changed, 111 insertions(+), 31 deletions(-)

diff --git a/GDALmake.opt.in b/GDALmake.opt.in
index 30749ae982a..f9ab41fd124 100644
--- a/GDALmake.opt.in
+++ b/GDALmake.opt.in
@@ -481,6 +481,7 @@ POPPLER_BASE_STREAM_HAS_TWO_ARGS = @POPPLER_BASE_STREAM_HAS_TWO_ARGS@
 POPPLER_0_20_OR_LATER = @POPPLER_0_20_OR_LATER@
 POPPLER_0_23_OR_LATER = @POPPLER_0_23_OR_LATER@
 POPPLER_0_58_OR_LATER = @POPPLER_0_58_OR_LATER@
+POPPLER_0_69_OR_LATER = @POPPLER_0_69_OR_LATER@
 POPPLER_INC = @POPPLER_INC@
 POPPLER_PLUGIN_LIB = @POPPLER_PLUGIN_LIB@
 
diff --git a/configure b/configure
index 050bc79ac97..a8472ba8c2d 100755
--- a/configure
+++ b/configure
@@ -669,6 +669,7 @@ PODOFO_INC
 HAVE_PODOFO
 POPPLER_PLUGIN_LIB
 POPPLER_INC
+POPPLER_0_69_OR_LATER
 POPPLER_0_58_OR_LATER
 POPPLER_0_23_OR_LATER
 POPPLER_0_20_OR_LATER
@@ -34798,6 +34799,7 @@ POPPLER_BASE_STREAM_HAS_TWO_ARGS=no
 POPPLER_0_20_OR_LATER=no
 POPPLER_0_23_OR_LATER=no
 POPPLER_0_58_OR_LATER=no
+POPPLER_0_69_OR_LATER=no
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for poppler" >&5
 $as_echo_n "checking for poppler... " >&6; }
@@ -34840,24 +34842,51 @@ $as_echo "yes" >&6; }
 
         CHECK_OTHER_POPPLER_VERSION=yes
 
-        # And now we check if we have Poppler >= 0.58.0
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Object does have new API (>= 0.58.0)" >&5
+        if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking if OptionalContent has API >= 0.69.0" >&5
+$as_echo_n "checking if OptionalContent has API >= 0.69.0... " >&6; }
+            rm -f testpoppler.*
+            echo '#include <poppler/OptionalContent.h>' > testpoppler.cpp
+            echo 'int main(int argc, char** argv) {' >> testpoppler.cpp
+            echo 'OCGs ocg(nullptr, nullptr);' >> testpoppler.cpp
+            echo 'ocg.getOCGs().size();' >> testpoppler.cpp
+            echo 'return 0; }' >> testpoppler.cpp
+            if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
+                POPPLER_0_69_OR_LATER=yes
+                POPPLER_0_58_OR_LATER=yes
+                POPPLER_0_23_OR_LATER=yes
+                POPPLER_0_20_OR_LATER=yes
+                POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
+                POPPLER_HAS_OPTCONTENT=yes
+                CHECK_OTHER_POPPLER_VERSION=no
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+            else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+            fi
+        fi
+
+        if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
+            # And now we check if we have Poppler >= 0.58.0
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Object does have new API (>= 0.58.0)" >&5
 $as_echo_n "checking if Object does have new API (>= 0.58.0)... " >&6; }
-        rm -f testpoppler.*
-        echo '#include <poppler/Object.h>' > testpoppler.cpp
-        echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
-        if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
-            POPPLER_0_58_OR_LATER=yes
-            POPPLER_0_23_OR_LATER=yes
-            POPPLER_0_20_OR_LATER=yes
-            POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
-            POPPLER_HAS_OPTCONTENT=yes
-            CHECK_OTHER_POPPLER_VERSION=no
-            { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+            rm -f testpoppler.*
+            echo '#include <poppler/Object.h>' > testpoppler.cpp
+            echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
+            if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
+                POPPLER_0_58_OR_LATER=yes
+                POPPLER_0_23_OR_LATER=yes
+                POPPLER_0_20_OR_LATER=yes
+                POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
+                POPPLER_HAS_OPTCONTENT=yes
+                CHECK_OTHER_POPPLER_VERSION=no
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-        else
-            { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+            else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
+            fi
         fi
 
         if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
@@ -34962,6 +34991,8 @@ POPPLER_0_23_OR_LATER=$POPPLER_0_23_OR_LATER
 
 POPPLER_0_58_OR_LATER=$POPPLER_0_58_OR_LATER
 
+POPPLER_0_69_OR_LATER=$POPPLER_0_69_OR_LATER
+
 POPPLER_INC=$POPPLER_INC
 
 POPPLER_PLUGIN_LIB=$POPPLER_PLUGIN_LIB
diff --git a/configure.ac b/configure.ac
index 4b8ab911cec..0c588e04f03 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4496,6 +4496,7 @@ POPPLER_BASE_STREAM_HAS_TWO_ARGS=no
 POPPLER_0_20_OR_LATER=no
 POPPLER_0_23_OR_LATER=no
 POPPLER_0_58_OR_LATER=no
+POPPLER_0_69_OR_LATER=no
 
 AC_MSG_CHECKING([for poppler])
 
@@ -4536,21 +4537,45 @@ if test "$with_poppler" != "no" -a "$with_poppler" != ""; then
 
         CHECK_OTHER_POPPLER_VERSION=yes
 
-        # And now we check if we have Poppler >= 0.58.0
-        AC_MSG_CHECKING([if Object does have new API (>= 0.58.0)])
-        rm -f testpoppler.*
-        echo '#include <poppler/Object.h>' > testpoppler.cpp
-        echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
-        if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
-            POPPLER_0_58_OR_LATER=yes
-            POPPLER_0_23_OR_LATER=yes
-            POPPLER_0_20_OR_LATER=yes
-            POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
-            POPPLER_HAS_OPTCONTENT=yes
-            CHECK_OTHER_POPPLER_VERSION=no
-            AC_MSG_RESULT([yes])
-        else
-            AC_MSG_RESULT([no])
+        if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
+            AC_MSG_CHECKING([if OptionalContent has API >= 0.69.0])
+            rm -f testpoppler.*
+            echo '#include <poppler/OptionalContent.h>' > testpoppler.cpp
+            echo 'int main(int argc, char** argv) {' >> testpoppler.cpp
+            echo 'OCGs ocg(nullptr, nullptr);' >> testpoppler.cpp
+            echo 'ocg.getOCGs().size();' >> testpoppler.cpp
+            echo 'return 0; }' >> testpoppler.cpp
+            if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
+                POPPLER_0_69_OR_LATER=yes
+                POPPLER_0_58_OR_LATER=yes
+                POPPLER_0_23_OR_LATER=yes
+                POPPLER_0_20_OR_LATER=yes
+                POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
+                POPPLER_HAS_OPTCONTENT=yes
+                CHECK_OTHER_POPPLER_VERSION=no
+                AC_MSG_RESULT([yes])
+            else
+                AC_MSG_RESULT([no])
+            fi
+        fi
+
+        if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
+            # And now we check if we have Poppler >= 0.58.0
+            AC_MSG_CHECKING([if Object does have new API (>= 0.58.0)])
+            rm -f testpoppler.*
+            echo '#include <poppler/Object.h>' > testpoppler.cpp
+            echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
+            if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
+                POPPLER_0_58_OR_LATER=yes
+                POPPLER_0_23_OR_LATER=yes
+                POPPLER_0_20_OR_LATER=yes
+                POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
+                POPPLER_HAS_OPTCONTENT=yes
+                CHECK_OTHER_POPPLER_VERSION=no
+                AC_MSG_RESULT([yes])
+            else
+                AC_MSG_RESULT([no])
+            fi
         fi
 
         if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
@@ -4635,6 +4660,7 @@ AC_SUBST(POPPLER_BASE_STREAM_HAS_TWO_ARGS, $POPPLER_BASE_STREAM_HAS_TWO_ARGS)
 AC_SUBST(POPPLER_0_20_OR_LATER, $POPPLER_0_20_OR_LATER)
 AC_SUBST(POPPLER_0_23_OR_LATER, $POPPLER_0_23_OR_LATER)
 AC_SUBST(POPPLER_0_58_OR_LATER, $POPPLER_0_58_OR_LATER)
+AC_SUBST(POPPLER_0_69_OR_LATER, $POPPLER_0_69_OR_LATER)
 AC_SUBST(POPPLER_INC, $POPPLER_INC)
 AC_SUBST(POPPLER_PLUGIN_LIB, $POPPLER_PLUGIN_LIB)
 
diff --git a/frmts/pdf/GNUmakefile b/frmts/pdf/GNUmakefile
index 2c332d2798f..6a267f529b2 100644
--- a/frmts/pdf/GNUmakefile
+++ b/frmts/pdf/GNUmakefile
@@ -34,6 +34,10 @@ ifeq ($(POPPLER_0_58_OR_LATER),yes)
 CPPFLAGS +=  -DPOPPLER_0_58_OR_LATER
 endif
 
+ifeq ($(POPPLER_0_69_OR_LATER),yes)
+CPPFLAGS +=  -DPOPPLER_0_69_OR_LATER
+endif
+
 ifeq ($(HAVE_PODOFO),yes)
 CPPFLAGS +=  -DHAVE_PODOFO
 endif
diff --git a/frmts/pdf/makefile.vc b/frmts/pdf/makefile.vc
index b4fa14d0a18..ad76d3de70c 100644
--- a/frmts/pdf/makefile.vc
+++ b/frmts/pdf/makefile.vc
@@ -14,7 +14,7 @@ OBJ = $(OBJ) ..\..\ogr\ogrsf_frmts\mem\ogrmemdatasource.obj ..\..\ogr\ogrsf_frmt
 EXTRAFLAGS =  -I..\vrt -I..\mem -I..\..\ogr\ogrsf_frmts\mem $(POPPLER_EXTRAFLAGS) $(PODOFO_EXTRAFLAGS) $(PDFIUM_EXTRAFLAGS)
 
 !IFDEF POPPLER_ENABLED
-POPPLER_EXTRAFLAGS = $(POPPLER_CFLAGS) $(POPPLER_HAS_OPTCONTENT_FLAGS) $(POPPLER_BASE_STREAM_HAS_TWO_ARGS_FLAGS) $(POPPLER_0_20_OR_LATER_FLAGS) $(POPPLER_0_23_OR_LATER_FLAGS) $(POPPLER_0_58_OR_LATER_FLAGS) -DHAVE_POPPLER
+POPPLER_EXTRAFLAGS = $(POPPLER_CFLAGS) $(POPPLER_HAS_OPTCONTENT_FLAGS) $(POPPLER_BASE_STREAM_HAS_TWO_ARGS_FLAGS) $(POPPLER_0_20_OR_LATER_FLAGS) $(POPPLER_0_23_OR_LATER_FLAGS) $(POPPLER_0_58_OR_LATER_FLAGS) $(POPPLER_0_69_OR_LATER_FLAGS) -DHAVE_POPPLER
 
 !IFDEF POPPLER_HAS_OPTCONTENT
 POPPLER_HAS_OPTCONTENT_FLAGS = -DPOPPLER_HAS_OPTCONTENT
@@ -36,6 +36,10 @@ POPPLER_0_23_OR_LATER_FLAGS = -DPOPPLER_0_23_OR_LATER
 POPPLER_0_58_OR_LATER_FLAGS = -DPOPPLER_0_58_OR_LATER
 !ENDIF
 
+!IFDEF POPPLER_0_69_OR_LATER
+POPPLER_0_69_OR_LATER_FLAGS = -DPOPPLER_0_69_OR_LATER
+!ENDIF
+
 !ENDIF
 
 !IFDEF PODOFO_ENABLED
diff --git a/frmts/pdf/pdfdataset.cpp b/frmts/pdf/pdfdataset.cpp
index ee89fd07564..1a56f57ee06 100644
--- a/frmts/pdf/pdfdataset.cpp
+++ b/frmts/pdf/pdfdataset.cpp
@@ -3440,10 +3440,16 @@ void PDFDataset::FindLayersPoppler()
     }
     else
     {
+#ifdef POPPLER_0_69_OR_LATER
+        for( const auto& refOCGPair: optContentConfig->getOCGs() )
+        {
+            auto ocg = refOCGPair.second.get();
+#else
         GooList* ocgList = optContentConfig->getOCGs();
         for(int i=0;i<ocgList->getLength();i++)
         {
             OptionalContentGroup* ocg = (OptionalContentGroup*) ocgList->get(i);
+#endif
             if( ocg != nullptr && ocg->getName() != nullptr )
             {
                 const char* pszLayerName = (const char*)ocg->getName()->getCString();
@@ -3472,10 +3478,16 @@ void PDFDataset::TurnLayersOnOffPoppler()
     {
         int i;
         int bAll = EQUAL(pszLayers, "ALL");
+#ifdef POPPLER_0_69_OR_LATER
+        for( const auto& refOCGPair: optContentConfig->getOCGs() )
+        {
+            auto ocg = refOCGPair.second.get();
+#else
         GooList* ocgList = optContentConfig->getOCGs();
         for(i=0;i<ocgList->getLength();i++)
         {
             OptionalContentGroup* ocg = (OptionalContentGroup*) ocgList->get(i);
+#endif
             ocg->setState( (bAll) ? OptionalContentGroup::On : OptionalContentGroup::Off );
         }
 
diff --git a/nmake.opt b/nmake.opt
index 682d766d93e..1eb049038c8 100644
--- a/nmake.opt
+++ b/nmake.opt
@@ -639,6 +639,7 @@ OCI_INCLUDE =	-I$(ORACLE_HOME)\oci\include
 # Uncomment POPPLER_0_20_OR_LATER = YES for Poppler >= 0.20.0
 # Uncomment POPPLER_0_23_OR_LATER = YES for Poppler >= 0.23.0
 # Uncomment POPPLER_0_58_OR_LATER = YES for Poppler >= 0.58.0
+# Uncomment POPPLER_0_69_OR_LATER = YES for Poppler >= 0.69.0
 #POPPLER_ENABLED = YES
 #POPPLER_CFLAGS = -Ie:/kde/include -Ie:/kde/include/poppler
 #POPPLER_HAS_OPTCONTENT = YES
@@ -646,6 +647,7 @@ OCI_INCLUDE =	-I$(ORACLE_HOME)\oci\include
 #POPPLER_0_20_OR_LATER = YES
 #POPPLER_0_23_OR_LATER = YES
 #POPPLER_0_58_OR_LATER = YES
+#POPPLER_0_69_OR_LATER = YES
 #POPPLER_LIBS = e:/kde/lib/poppler.lib e:/kde/lib/freetype.lib e:/kde/lib/liblcms-1.lib advapi32.lib gdi32.lib
 
 # Uncomment for PDF support
