Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
Date:                    2025-06-09
Initial Package Version: 1.4.2
Upstream Status:         Pending (but approved)
Origin:                  Upstream (https://gitlab.com/inkscape/inkscape/-/merge_requests/7264)
Description:             Fixes building Inkscape against poppler-25.06 by
                         adapting to a private API change where an array of
                         pointers was changed to a vector of unique_ptr. The MR
                         upstream also adapted the source to be able to build
                         with a copy of poppler built but not installed to the
                         system, but I didn't carry that part of the patch in
                         as it was both not needed and does not apply without
                         more backports to this version of Inkscape.
                         As such, the only commit we needed was:
                         97bd8f29a61e691ceea98ca2444b974cf4256ae0
                         Tested with importing clisp-link.pdf from the clisp
                         docs in /usr/share/doc/clisp-2.49.

diff -Naurp inkscape-1.4.2_2025-05-08_ebf0e940d0.orig/src/extension/internal/pdfinput/pdf-parser.cpp inkscape-1.4.2_2025-05-08_ebf0e940d0/src/extension/internal/pdfinput/pdf-parser.cpp
--- inkscape-1.4.2_2025-05-08_ebf0e940d0.orig/src/extension/internal/pdfinput/pdf-parser.cpp	2025-06-09 11:22:00.642525421 -0500
+++ inkscape-1.4.2_2025-05-08_ebf0e940d0/src/extension/internal/pdfinput/pdf-parser.cpp	2025-06-09 11:22:07.963786719 -0500
@@ -27,6 +27,7 @@
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
+#include <memory>
 #include <mutex> // std::call_once()
 #include <utility>
 #include <vector>
@@ -686,7 +687,6 @@ void PdfParser::opSetLineWidth(Object ar
 void PdfParser::opSetExtGState(Object args[], int /*numArgs*/)
 {
     Object obj1, obj2, obj3, obj4, obj5;
-    Function *funcs[4] = {nullptr, nullptr, nullptr, nullptr};
     GfxColor backdropColor;
     GBool haveBackdropColor = gFalse;
     GBool alpha = gFalse;
@@ -744,13 +744,14 @@ void PdfParser::opSetExtGState(Object ar
         state->setLineWidth(obj2.getNum());
     }
 
+    _POPPLER_DECLARE_TRANSFER_FUNCTION_VECTOR(funcs);
+
     // transfer function
     if (_POPPLER_CALL_ARGS_DEREF(obj2, obj1.dictLookup, "TR2").isNull()) {
         _POPPLER_CALL_ARGS(obj2, obj1.dictLookup, "TR");
     }
     if (obj2.isName(const_cast<char *>("Default")) || obj2.isName(const_cast<char *>("Identity"))) {
-        funcs[0] = funcs[1] = funcs[2] = funcs[3] = nullptr;
-        state->setTransfer(funcs);
+        state->setTransfer(std::move(funcs));
     } else if (obj2.isArray() && obj2.arrayGetLength() == 4) {
         int pos = 4;
         for (int i = 0; i < 4; ++i) {
@@ -763,12 +764,14 @@ void PdfParser::opSetExtGState(Object ar
         }
         _POPPLER_FREE(obj3);
         if (pos == 4) {
-            state->setTransfer(funcs);
+            state->setTransfer(std::move(funcs));
         }
     } else if (obj2.isName() || obj2.isDict() || obj2.isStream()) {
         if ((funcs[0] = Function::parse(&obj2))) {
-            funcs[1] = funcs[2] = funcs[3] = nullptr;
-            state->setTransfer(funcs);
+            funcs[1] = nullptr;
+            funcs[2] = nullptr;
+            funcs[3] = nullptr;
+            state->setTransfer(std::move(funcs));
         }
     } else if (!obj2.isNull()) {
         error(errSyntaxError, getPos(), "Invalid transfer function in ExtGState");
@@ -790,8 +793,7 @@ void PdfParser::opSetExtGState(Object ar
                 funcs[0] = Function::parse(&obj3);
                 if (funcs[0]->getInputSize() != 1 || funcs[0]->getOutputSize() != 1) {
                     error(errSyntaxError, getPos(), "Invalid transfer function in soft mask in ExtGState");
-                    delete funcs[0];
-                    funcs[0] = nullptr;
+                    _POPPLER_DELETE_TRANSFER_FUNCTION(funcs[0]);
                 }
             }
             _POPPLER_FREE(obj3);
@@ -835,9 +837,10 @@ void PdfParser::opSetExtGState(Object ar
                             }
                         }
                     }
-                    doSoftMask(&obj3, alpha, blendingColorSpace.get(), isolated, knockout, funcs[0], &backdropColor);
+                    doSoftMask(&obj3, alpha, blendingColorSpace.get(), isolated, knockout,
+                               _POPPLER_GET_TRANSFER_FUNCTION_POINTER(funcs[0]), &backdropColor);
                     if (funcs[0]) {
-                        delete funcs[0];
+                        _POPPLER_DELETE_TRANSFER_FUNCTION(funcs[0]);
                     }
                 } else {
                     error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group");
diff -Naurp inkscape-1.4.2_2025-05-08_ebf0e940d0.orig/src/extension/internal/pdfinput/poppler-transition-api.h inkscape-1.4.2_2025-05-08_ebf0e940d0/src/extension/internal/pdfinput/poppler-transition-api.h
--- inkscape-1.4.2_2025-05-08_ebf0e940d0.orig/src/extension/internal/pdfinput/poppler-transition-api.h	2025-06-09 11:22:00.642572932 -0500
+++ inkscape-1.4.2_2025-05-08_ebf0e940d0/src/extension/internal/pdfinput/poppler-transition-api.h	2025-06-09 11:22:07.963963819 -0500
@@ -15,6 +15,18 @@
 #include <glib/poppler-features.h>
 #include <poppler/UTF.h>
 
+#if POPPLER_CHECK_VERSION(25, 6, 0)
+#define _POPPLER_DECLARE_TRANSFER_FUNCTION_VECTOR(name) std::vector<std::unique_ptr<Function>> name(4)
+#define _POPPLER_DELETE_TRANSFER_FUNCTION(name) name.reset()
+#define _POPPLER_GET_TRANSFER_FUNCTION_POINTER(name) name.get()
+#else
+#define _POPPLER_DECLARE_TRANSFER_FUNCTION_VECTOR(name) Function *name[4] = {}
+#define _POPPLER_DELETE_TRANSFER_FUNCTION(name) \
+    delete name;                                \
+    name = nullptr
+#define _POPPLER_GET_TRANSFER_FUNCTION_POINTER(name) name
+#endif
+
 #if POPPLER_CHECK_VERSION(25,2,0)
 #define _POPPLER_GET_CODE_TO_GID_MAP(ff, len) getCodeToGIDMap(ff)
 #define _POPPLER_GET_CID_TO_GID_MAP(len) getCIDToGIDMap()
