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.

Updated by:              Bruce Dubbs <bdubbs@linuxfromscratch.org>
Date:                    2025-07-10
Upstream Status:         Pending (but approved)
Origin:                  Upstream (https://gitlab.com/inkscape/inkscape/-/merge_requests/7321)
Description:             Fixes building Inkscape against poppler-25.07
                         Combines previous patch for poppler-25.06 with the new patch.


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()
 
From ce52c5f96106ae5747171663a46831f21aa52d95 Mon Sep 17 00:00:00 2001
From: KrIr17 <elendil.krir17@gmail.com>
Date: Sun, 6 Jul 2025 15:42:13 +0200
Subject: [PATCH] Fix building with Poppler 25.07.0

Fix building issues with

1. [`GfxState::shift()`](https://gitlab.freedesktop.org/poppler/poppler/-/commit/71bf5552d448a6fdb666f2b61764b61ca197617d)

2. [`FoFiTrueType::make` and `FoFiType1C::make`](FoFiTrueType::make)

3. Fix typo from 5c4c6d116dae5250d75d34a45f0d9220824d2e20
---
 src/extension/internal/pdfinput/pdf-parser.cpp   |  4 ++--
 .../pdfinput/poppler-cairo-font-engine.cpp       | 16 +++++++++++-----
 .../internal/pdfinput/poppler-transition-api.h   | 14 ++++++++++++++
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index f46d12f72e5..4071e464a44 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -2322,11 +2322,11 @@ void PdfParser::doShowText(GooString *s) {
         state->textTransformDelta(originX, originY, &tOriginX, &tOriginY);
 
         // In Gfx.cc this is drawChar(...)
-        builder->addChar(state, state->getCurX() + riseX, state->getCurY() + riseY,
+        builder->addChar(state, state->_POPPLER_GET_CUR_TEXT_X() + riseX, state->_POPPLER_GET_CUR_TEXT_Y() + riseY,
                          dx, dy, ax, ay, tOriginX, tOriginY, code, n, u, uLen);
 
         // Move onto next unicode character.
-        state->shift(tdx, tdy);
+        state->_POPPLER_TEXT_SHIFT_WITH_USER_COORDS(tdx, tdy);
         p += n;
         len -= n;
     }
diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
index bd1d4e49367..cfc6961f629 100644
--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
@@ -316,7 +316,11 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
 #endif
     char **enc;
     const char *name;
+#if POPPLER_CHECK_VERSION(25, 7, 0)
+    std::unique_ptr<FoFiType1C> ff1c;
+#else
     FoFiType1C *ff1c;
+#endif
     std::optional<FreeTypeFontFace> font_face;
     std::vector<int> codeToGID;
     bool substitute = false;
@@ -427,7 +431,7 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
                 FoFiTrueType *ff;
 #endif
                 if (!font_data.empty()) {
-                    ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), 0);
+                    ff = _POPPLER_FOFI_TRUETYPE_MAKE(font_data, 0);
                 } else {
                     ff = FoFiTrueType::load(fileName.c_str(), 0);
                 }
@@ -457,7 +461,7 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
             FoFiTrueType *ff;
 #endif
             if (!font_data.empty()) {
-                ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), 0);
+                ff = _POPPLER_FOFI_TRUETYPE_MAKE(font_data, 0);
             } else {
                 ff = FoFiTrueType::load(fileName.c_str(), 0);
             }
@@ -491,7 +495,7 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
         case fontCIDType0C:
             if (!useCIDs) {
                 if (!font_data.empty()) {
-                    ff1c = FoFiType1C::make((fontchar)font_data.data(), font_data.size());
+                    ff1c = _POPPLER_FOFI_TYPE1C_MAKE(font_data);
                 } else {
                     ff1c = FoFiType1C::load(fileName.c_str());
                 }
@@ -504,7 +508,9 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
                     codeToGID.insert(codeToGID.begin(), src, src + n);
                     gfree(src);
 #endif
+#if !(POPPLER_CHECK_VERSION(25, 7, 0))
                     delete ff1c;
+#endif
                 }
             }
 
@@ -540,13 +546,13 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
                     FoFiTrueType *ff;
 #endif
                     if (!font_data.empty()) {
-                        ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), 0);
+                        ff = _POPPLER_FOFI_TRUETYPE_MAKE(font_data, 0);
                     } else {
                         ff = FoFiTrueType::load(fileName.c_str(), 0);
                     }
                     if (ff) {
                         if (ff->isOpenTypeCFF()) {
-                            auto src = ff1c->_POPPLER_GET_CID_TO_GID_MAP(&n);
+                            auto src = ff->_POPPLER_GET_CID_TO_GID_MAP(&n);
 #if POPPLER_CHECK_VERSION(25,2,0)
                             codeToGID = std::move(src);
 #else
diff --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h
index d04412757bc..866b630bb67 100644
--- a/src/extension/internal/pdfinput/poppler-transition-api.h
+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
@@ -15,6 +15,20 @@
 #include <glib/poppler-features.h>
 #include <poppler/UTF.h>
 
+#if POPPLER_CHECK_VERSION(25, 7, 0)
+#define _POPPLER_TEXT_SHIFT_WITH_USER_COORDS(dx, dy) textShiftWithUserCoords(dx, dy)
+#define _POPPLER_FOFI_TRUETYPE_MAKE(font_data, faceIndex) FoFiTrueType::make(std::span(font_data), faceIndex)
+#define _POPPLER_FOFI_TYPE1C_MAKE(font_data) FoFiType1C::make(std::span(font_data))
+#define _POPPLER_GET_CUR_TEXT_X() getCurTextX()
+#define _POPPLER_GET_CUR_TEXT_Y() getCurTextY()
+#else
+#define _POPPLER_TEXT_SHIFT_WITH_USER_COORDS(dx, dy) shift(dx, dy)
+#define _POPPLER_FOFI_TRUETYPE_MAKE(font_data, faceIndex) FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), faceIndex)
+#define _POPPLER_FOFI_TYPE1C_MAKE(font_data) FoFiType1C::make((fontchar)font_data.data(), font_data.size())
+#define _POPPLER_GET_CUR_TEXT_X() getCurX()
+#define _POPPLER_GET_CUR_TEXT_Y() getCurY()
+#endif
+
 #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()
-- 
GitLab

