Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
Date:                    2024-12-03
Updated Date:            2025-02-09
Initial Package Version: 1.4
Upstream Status:         Applied + Pending
Origin:                  Upstream
Description:             This patch fixes building Inkscape 1.4 with several
                         different versions of poppler, adapting to API changes
                         in 24.10.0-24.12.0. The fixes for 24.10.0 and 24.11.0
                         were brought to the lists by Joe Locash and Uwe Duffert.
                         The fix for 24.12.0 (which was adjusting the call to
                         getImageParams) was made by myself and submitted to
                         upstream. Update on 2025-02-09: Integrates PR #6974
                         from upstream, with modifications to remove a hunk
                         that is not needed because the code does not exist in
                         this version (pdfDocEncodingToUTF16). This fixes
                         building Inkscape with Poppler 25.02.0.

diff -Naurp inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/pdf-parser.cpp inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/pdf-parser.cpp
--- inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/pdf-parser.cpp	2024-07-28 06:27:55.000000000 -0500
+++ inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/pdf-parser.cpp	2025-02-09 12:04:35.857380312 -0600
@@ -810,11 +810,11 @@ void PdfParser::opSetExtGState(Object ar
             _POPPLER_FREE(obj3);
             if (_POPPLER_CALL_ARGS_DEREF(obj3, obj2.dictLookup, "G").isStream()) {
                 if (_POPPLER_CALL_ARGS_DEREF(obj4, obj3.streamGetDict()->lookup, "Group").isDict()) {
-                    GfxColorSpace *blendingColorSpace = nullptr;
+                    std::unique_ptr<GfxColorSpace> blendingColorSpace;
                     GBool isolated = gFalse;
                     GBool knockout = gFalse;
                     if (!_POPPLER_CALL_ARGS_DEREF(obj5, obj4.dictLookup, "CS").isNull()) {
-                        blendingColorSpace = GfxColorSpace::parse(nullptr, &obj5, nullptr, state);
+                        blendingColorSpace = std::unique_ptr<GfxColorSpace>(GfxColorSpace::parse(nullptr, &obj5, nullptr, state));
                     }
                     _POPPLER_FREE(obj5);
                     if (_POPPLER_CALL_ARGS_DEREF(obj5, obj4.dictLookup, "I").isBool()) {
@@ -835,7 +835,7 @@ void PdfParser::opSetExtGState(Object ar
                             }
                         }
                     }
-                    doSoftMask(&obj3, alpha, blendingColorSpace, isolated, knockout, funcs[0], &backdropColor);
+                    doSoftMask(&obj3, alpha, blendingColorSpace.get(), isolated, knockout, funcs[0], &backdropColor);
                     if (funcs[0]) {
                         delete funcs[0];
                     }
@@ -920,9 +920,6 @@ void PdfParser::doSoftMask(Object *str,
 	  alpha, transferFunc, backdropColor);
   --formDepth;
 
-  if (blendingColorSpace) {
-    delete blendingColorSpace;
-  }
   _POPPLER_FREE(obj1);
 }
 
@@ -939,42 +936,43 @@ void PdfParser::opSetRenderingIntent(Obj
  *
  * Maintains a cache for named color spaces to avoid expensive re-parsing.
  */
-GfxColorSpace *PdfParser::lookupColorSpaceCopy(Object &arg)
+std::unique_ptr<GfxColorSpace> PdfParser::lookupColorSpaceCopy(Object &arg)
 {
     assert(!arg.isNull());
-    GfxColorSpace *colorSpace = nullptr;
 
     if (char const *name = arg.isName() ? arg.getName() : nullptr) {
         auto const cache_name = std::to_string(formDepth) + "-" + name;
-        if ((colorSpace = colorSpacesCache[cache_name].get())) {
-            return colorSpace->copy();
+        if (auto cached = colorSpacesCache[cache_name].get()) {
+            return std::unique_ptr<GfxColorSpace>(cached->copy());
         }
 
-        Object obj = res->lookupColorSpace(name);
-        if (obj.isNull()) {
-            colorSpace = GfxColorSpace::parse(res, &arg, nullptr, state);
+        std::unique_ptr<GfxColorSpace> colorSpace;
+        if (auto obj = res->lookupColorSpace(name); !obj.isNull()) {
+            colorSpace = std::unique_ptr<GfxColorSpace>(GfxColorSpace::parse(res, &obj, nullptr, state));
         } else {
-            colorSpace = GfxColorSpace::parse(res, &obj, nullptr, state);
+            colorSpace = std::unique_ptr<GfxColorSpace>(GfxColorSpace::parse(res, &arg, nullptr, state));
         }
 
         if (colorSpace && colorSpace->getMode() != csPattern) {
-            colorSpacesCache[cache_name].reset(colorSpace->copy());
+            colorSpacesCache[cache_name] = std::unique_ptr<GfxColorSpace>(colorSpace->copy());
         }
+
+        return colorSpace;
     } else {
         // We were passed in an object directly.
-        colorSpace = GfxColorSpace::parse(res, &arg, nullptr, state);
+        return std::unique_ptr<GfxColorSpace>(GfxColorSpace::parse(res, &arg, nullptr, state));
     }
-    return colorSpace;
 }
 
 /**
  * Look up pattern/gradients from the GfxResource dictionary
  */
-GfxPattern *PdfParser::lookupPattern(Object *obj, GfxState *state)
+std::unique_ptr<GfxPattern> PdfParser::lookupPattern(Object *obj, GfxState *state)
 {
-    if (!obj->isName())
-        return nullptr;
-    return res->lookupPattern(obj->getName(), nullptr, state);
+    if (!obj->isName()) {
+        return {};
+    }
+    return std::unique_ptr<GfxPattern>(res->lookupPattern(obj->getName(), nullptr, state));
 }
 
 // TODO not good that numArgs is ignored but args[] is used:
@@ -983,7 +981,7 @@ void PdfParser::opSetFillGray(Object arg
   GfxColor color;
   builder->beforeStateChange(state);
   state->setFillPattern(nullptr);
-  state->setFillColorSpace(new GfxDeviceGrayColorSpace());
+  state->setFillColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceGrayColorSpace>()));
   color.c[0] = dblToCol(args[0].getNum());
   state->setFillColor(&color);
   builder->updateStyle(state);
@@ -995,7 +993,7 @@ void PdfParser::opSetStrokeGray(Object a
   GfxColor color;
   builder->beforeStateChange(state);
   state->setStrokePattern(nullptr);
-  state->setStrokeColorSpace(new GfxDeviceGrayColorSpace());
+  state->setStrokeColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceGrayColorSpace>()));
   color.c[0] = dblToCol(args[0].getNum());
   state->setStrokeColor(&color);
   builder->updateStyle(state);
@@ -1008,7 +1006,7 @@ void PdfParser::opSetFillCMYKColor(Objec
   int i;
   builder->beforeStateChange(state);
   state->setFillPattern(nullptr);
-  state->setFillColorSpace(new GfxDeviceCMYKColorSpace());
+  state->setFillColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceCMYKColorSpace>()));
   for (i = 0; i < 4; ++i) {
     color.c[i] = dblToCol(args[i].getNum());
   }
@@ -1022,7 +1020,7 @@ void PdfParser::opSetStrokeCMYKColor(Obj
   GfxColor color;
   builder->beforeStateChange(state);
   state->setStrokePattern(nullptr);
-  state->setStrokeColorSpace(new GfxDeviceCMYKColorSpace());
+  state->setStrokeColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceCMYKColorSpace>()));
   for (int i = 0; i < 4; ++i) {
     color.c[i] = dblToCol(args[i].getNum());
   }
@@ -1036,7 +1034,7 @@ void PdfParser::opSetFillRGBColor(Object
   GfxColor color;
   builder->beforeStateChange(state);
   state->setFillPattern(nullptr);
-  state->setFillColorSpace(new GfxDeviceRGBColorSpace());
+  state->setFillColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceRGBColorSpace>()));
   for (int i = 0; i < 3; ++i) {
     color.c[i] = dblToCol(args[i].getNum());
   }
@@ -1049,7 +1047,7 @@ void PdfParser::opSetStrokeRGBColor(Obje
   GfxColor color;
   builder->beforeStateChange(state);
   state->setStrokePattern(nullptr);
-  state->setStrokeColorSpace(new GfxDeviceRGBColorSpace());
+  state->setStrokeColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceRGBColorSpace>()));
   for (int i = 0; i < 3; ++i) {
     color.c[i] = dblToCol(args[i].getNum());
   }
@@ -1061,14 +1059,14 @@ void PdfParser::opSetStrokeRGBColor(Obje
 void PdfParser::opSetFillColorSpace(Object args[], int numArgs)
 {
   assert(numArgs >= 1);
-  GfxColorSpace *colorSpace = lookupColorSpaceCopy(args[0]);
+  auto colorSpace = lookupColorSpaceCopy(args[0]);
   builder->beforeStateChange(state);
   state->setFillPattern(nullptr);
 
   if (colorSpace) {
     GfxColor color;
-    state->setFillColorSpace(colorSpace);
     colorSpace->getDefaultColor(&color);
+    state->setFillColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(colorSpace));
     state->setFillColor(&color);
     builder->updateStyle(state);
   } else {
@@ -1082,14 +1080,14 @@ void PdfParser::opSetStrokeColorSpace(Ob
   assert(numArgs >= 1);
   builder->beforeStateChange(state);
 
-  GfxColorSpace *colorSpace = lookupColorSpaceCopy(args[0]);
+  auto colorSpace = lookupColorSpaceCopy(args[0]);
 
   state->setStrokePattern(nullptr);
 
   if (colorSpace) {
     GfxColor color;
-    state->setStrokeColorSpace(colorSpace);
     colorSpace->getDefaultColor(&color);
+    state->setStrokeColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(colorSpace));
     state->setStrokeColor(&color);
     builder->updateStyle(state);
   } else {
@@ -1152,7 +1150,7 @@ void PdfParser::opSetFillColorN(Object a
       builder->updateStyle(state);
     }
     if (auto pattern = lookupPattern(&(args[numArgs - 1]), state)) {
-        state->setFillPattern(pattern);
+        state->setFillPattern(_POPPLER_CONSUME_UNIQPTR_ARG(pattern));
         builder->updateStyle(state);
     }
 
@@ -1195,7 +1193,7 @@ void PdfParser::opSetStrokeColorN(Object
       builder->updateStyle(state);
     }
     if (auto pattern = lookupPattern(&(args[numArgs - 1]), state)) {
-        state->setStrokePattern(pattern);
+        state->setStrokePattern(_POPPLER_CONSUME_UNIQPTR_ARG(pattern));
         builder->updateStyle(state);
     }
 
@@ -1572,11 +1570,11 @@ void PdfParser::doShadingPatternFillFall
 // TODO not good that numArgs is ignored but args[] is used:
 void PdfParser::opShFill(Object args[], int /*numArgs*/)
 {
-  GfxShading *shading = nullptr;
   GfxPath *savedPath = nullptr;
   bool savedState = false;
 
-  if (!(shading = res->lookupShading(args[0].getName(), nullptr, state))) {
+  auto shading = std::unique_ptr<GfxShading>(res->lookupShading(args[0].getName(), nullptr, state));
+  if (!shading) {
     return;
   }
 
@@ -1608,19 +1606,19 @@ void PdfParser::opShFill(Object args[],
   // do shading type-specific operations
   switch (shading->getType()) {
   case 1: // Function-based shading
-    doFunctionShFill(static_cast<GfxFunctionShading *>(shading));
+    doFunctionShFill(static_cast<GfxFunctionShading *>(shading.get()));
     break;
   case 2: // Axial shading
   case 3: // Radial shading
-      builder->addClippedFill(shading, stateToAffine(state));
+      builder->addClippedFill(shading.get(), stateToAffine(state));
       break;
   case 4: // Free-form Gouraud-shaded triangle mesh
   case 5: // Lattice-form Gouraud-shaded triangle mesh
-    doGouraudTriangleShFill(static_cast<GfxGouraudTriangleShading *>(shading));
+    doGouraudTriangleShFill(static_cast<GfxGouraudTriangleShading *>(shading.get()));
     break;
   case 6: // Coons patch mesh
   case 7: // Tensor-product patch mesh
-    doPatchMeshShFill(static_cast<GfxPatchMeshShading *>(shading));
+    doPatchMeshShFill(static_cast<GfxPatchMeshShading *>(shading.get()));
     break;
   }
 
@@ -1629,8 +1627,6 @@ void PdfParser::opShFill(Object args[],
     restoreState();
     state->setPath(savedPath);
   }
-
-  delete shading;
 }
 
 void PdfParser::doFunctionShFill(GfxFunctionShading *shading) {
@@ -2411,7 +2407,8 @@ void PdfParser::doImage(Object * /*ref*/
     // get info from the stream
     bits = 0;
     csMode = streamCSNone;
-    str->getImageParams(&bits, &csMode);
+    bool hasAlpha = false;
+    str->getImageParams(&bits, &csMode, &hasAlpha);
     
     // get stream dict
     dict = str->getDict();
@@ -2521,7 +2518,7 @@ void PdfParser::doImage(Object * /*ref*/
         
     } else {
         // get color space and color map
-        GfxColorSpace *colorSpace;
+        std::unique_ptr<GfxColorSpace> colorSpace;
         _POPPLER_CALL_ARGS(obj1, dict->lookup, "ColorSpace");
         if (obj1.isNull()) {
             _POPPLER_FREE(obj1);
@@ -2530,13 +2527,11 @@ void PdfParser::doImage(Object * /*ref*/
         if (!obj1.isNull()) {
             colorSpace = lookupColorSpaceCopy(obj1);
         } else if (csMode == streamCSDeviceGray) {
-            colorSpace = new GfxDeviceGrayColorSpace();
+            colorSpace = std::make_unique<GfxDeviceGrayColorSpace>();
         } else if (csMode == streamCSDeviceRGB) {
-            colorSpace = new GfxDeviceRGBColorSpace();
+            colorSpace = std::make_unique<GfxDeviceRGBColorSpace>();
         } else if (csMode == streamCSDeviceCMYK) {
-            colorSpace = new GfxDeviceCMYKColorSpace();
-        } else {
-            colorSpace = nullptr;
+            colorSpace = std::make_unique<GfxDeviceCMYKColorSpace>();
         }
         _POPPLER_FREE(obj1);
         if (!colorSpace) {
@@ -2547,10 +2542,9 @@ void PdfParser::doImage(Object * /*ref*/
             _POPPLER_FREE(obj1);
             _POPPLER_CALL_ARGS(obj1, dict->lookup, "D");
         }
-        GfxImageColorMap *colorMap = new GfxImageColorMap(bits, &obj1, colorSpace);
+        auto colorMap = std::make_unique<GfxImageColorMap>(bits, &obj1, _POPPLER_CONSUME_UNIQPTR_ARG(colorSpace));
         _POPPLER_FREE(obj1);
         if (!colorMap->isOk()) {
-            delete colorMap;
             goto err1;
         }
         
@@ -2561,7 +2555,7 @@ void PdfParser::doImage(Object * /*ref*/
         int maskWidth = 0;
         int maskHeight = 0;
         maskInvert = gFalse;
-        GfxImageColorMap *maskColorMap = nullptr;
+        std::unique_ptr<GfxImageColorMap> maskColorMap;
         _POPPLER_CALL_ARGS(maskObj, dict->lookup, "Mask");
         _POPPLER_CALL_ARGS(smaskObj, dict->lookup, "SMask");
         Dict* maskDict;
@@ -2617,7 +2611,7 @@ void PdfParser::doImage(Object * /*ref*/
 	            _POPPLER_FREE(obj1);
                     _POPPLER_CALL_ARGS(obj1, maskDict->lookup, "CS");
             }
-            GfxColorSpace *maskColorSpace = lookupColorSpaceCopy(obj1);
+            auto maskColorSpace = lookupColorSpaceCopy(obj1);
             _POPPLER_FREE(obj1);
             if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) {
                 goto err1;
@@ -2627,10 +2621,9 @@ void PdfParser::doImage(Object * /*ref*/
                 _POPPLER_FREE(obj1);
                 _POPPLER_CALL_ARGS(obj1, maskDict->lookup, "D");
             }
-            maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace);
+            maskColorMap = std::make_unique<GfxImageColorMap>(maskBits, &obj1, _POPPLER_CONSUME_UNIQPTR_ARG(maskColorSpace));
             _POPPLER_FREE(obj1);
             if (!maskColorMap->isOk()) {
-                delete maskColorMap;
                 goto err1;
             }
             //~ handle the Matte entry
@@ -2711,17 +2704,15 @@ void PdfParser::doImage(Object * /*ref*/
         
         // draw it
         if (haveSoftMask) {
-	    builder->addSoftMaskedImage(state, str, width, height, colorMap, interpolate,
-				maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate);
-            delete maskColorMap;
+	    builder->addSoftMaskedImage(state, str, width, height, colorMap.get(), interpolate,
+				maskStr, maskWidth, maskHeight, maskColorMap.get(), maskInterpolate);
         } else if (haveExplicitMask) {
- 	    builder->addMaskedImage(state, str, width, height, colorMap, interpolate,
+ 	    builder->addMaskedImage(state, str, width, height, colorMap.get(), interpolate,
 				maskStr, maskWidth, maskHeight, maskInvert, maskInterpolate);
         } else {
-	    builder->addImage(state, str, width, height, colorMap, interpolate,
-		        haveColorKeyMask ? maskColors : static_cast<int *>(nullptr));
+	    builder->addImage(state, str, width, height, colorMap.get(), interpolate,
+		        haveColorKeyMask ? maskColors : nullptr);
         }
-        delete colorMap;
         
         _POPPLER_FREE(maskObj);
         _POPPLER_FREE(smaskObj);
@@ -2739,7 +2730,6 @@ void PdfParser::doForm(Object *str, doub
 {
     Dict *dict;
     GBool transpGroup, isolated, knockout;
-    GfxColorSpace *blendingColorSpace;
     Object matrixObj, bboxObj;
     double m[6], bbox[4];
     Object resObj;
@@ -2805,12 +2795,12 @@ void PdfParser::doForm(Object *str, doub
 
     // check for a transparency group
     transpGroup = isolated = knockout = gFalse;
-    blendingColorSpace = nullptr;
+    std::unique_ptr<GfxColorSpace> blendingColorSpace;
     if (_POPPLER_CALL_ARGS_DEREF(obj1, dict->lookup, "Group").isDict()) {
         if (_POPPLER_CALL_ARGS_DEREF(obj2, obj1.dictLookup, "S").isName("Transparency")) {
         transpGroup = gTrue;
         if (!_POPPLER_CALL_ARGS_DEREF(obj3, obj1.dictLookup, "CS").isNull()) {
-                blendingColorSpace = GfxColorSpace::parse(nullptr, &obj3, nullptr, state);
+            blendingColorSpace = std::unique_ptr<GfxColorSpace>(GfxColorSpace::parse(nullptr, &obj3, nullptr, state));
         }
         _POPPLER_FREE(obj3);
         if (_POPPLER_CALL_ARGS_DEREF(obj3, obj1.dictLookup, "I").isBool()) {
@@ -2828,12 +2818,9 @@ void PdfParser::doForm(Object *str, doub
 
     // draw it
     ++formDepth;
-    doForm1(str, resDict, m, bbox, transpGroup, gFalse, blendingColorSpace, isolated, knockout);
+    doForm1(str, resDict, m, bbox, transpGroup, gFalse, blendingColorSpace.get(), isolated, knockout);
     --formDepth;
 
-    if (blendingColorSpace) {
-        delete blendingColorSpace;
-    }
     _POPPLER_FREE(resObj);
 }
 
diff -Naurp inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/pdf-parser.h inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/pdf-parser.h
--- inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/pdf-parser.h	2024-04-22 16:00:30.000000000 -0500
+++ inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/pdf-parser.h	2025-02-09 12:04:35.857380312 -0600
@@ -138,7 +138,7 @@ public:
     void loadPatternColorProfiles(Dict *resources);
     void loadColorProfile();
     void loadColorSpaceProfile(GfxColorSpace *space, Object *obj);
-    GfxPattern *lookupPattern(Object *obj, GfxState *state);
+    std::unique_ptr<GfxPattern> lookupPattern(Object *obj, GfxState *state);
 
     std::shared_ptr<CairoFontEngine> getFontEngine();
 
@@ -177,7 +177,7 @@ private:
     //! Caches color spaces by name
     std::map<std::string, std::unique_ptr<GfxColorSpace>> colorSpacesCache;
 
-    GfxColorSpace *lookupColorSpaceCopy(Object &);
+    std::unique_ptr<GfxColorSpace> lookupColorSpaceCopy(Object &);
 
     void setDefaultApproximationPrecision(); // init color deltas
     void pushOperator(const char *name);
diff -Naurp inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
--- inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp	2024-04-22 16:00:30.000000000 -0500
+++ inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp	2025-02-09 12:36:16.543638911 -0600
@@ -407,13 +407,21 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
             break;
         case fontCIDType2:
         case fontCIDType2OT:
+#if POPPLER_CHECK_VERSION(25,2,0)
+            if (!gfxcid->getCIDToGID().empty()) {
+#else
             if (gfxcid->getCIDToGID()) {
                 n = gfxcid->getCIDToGIDLen();
                 if (n) {
-                    const int *src = gfxcid->getCIDToGID();
+#endif
+                    const auto src = gfxcid->getCIDToGID();
+#if POPPLER_CHECK_VERSION(25,2,0)
+                    codeToGID = std::move(src);
+#else
                     codeToGID.reserve(n);
                     codeToGID.insert(codeToGID.begin(), src, src + n);
                 }
+#endif
             } else {
 #if POPPLER_CHECK_VERSION(22, 1, 0)
                 std::unique_ptr<FoFiTrueType> ff;
@@ -421,21 +429,25 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
                 FoFiTrueType *ff;
 #endif
                 if (!font_data.empty()) {
-                    ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size());
+                    ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), 0);
                 } else {
-                    ff = FoFiTrueType::load(fileName.c_str());
+                    ff = FoFiTrueType::load(fileName.c_str(), 0);
                 }
                 if (!ff) {
                     goto err2;
                 }
 #if POPPLER_CHECK_VERSION(22, 1, 0)
-                int *src = gfxcid->getCodeToGIDMap(ff.get(), &n);
+                auto src = gfxcid->_POPPLER_GET_CODE_TO_GID_MAP(ff.get(), &n);
 #else
-                int *src = gfxcid->getCodeToGIDMap(ff, &n);
+                auto src = gfxcid->_POPPLER_GET_CODE_TO_GID_MAP(ff, &n);
 #endif
+#if POPPLER_CHECK_VERSION(25, 2, 0)
+                codeToGID = std::move(src);
+#else
                 codeToGID.reserve(n);
                 codeToGID.insert(codeToGID.begin(), src, src + n);
                 gfree(src);
+#endif
             }
             /* Fall through */
         case fontTrueType:
@@ -446,9 +458,9 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
             FoFiTrueType *ff;
 #endif
             if (!font_data.empty()) {
-                ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size());
+                ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), 0);
             } else {
-                ff = FoFiTrueType::load(fileName.c_str());
+                ff = FoFiTrueType::load(fileName.c_str(), 0);
             }
             if (!ff) {
                 error(errSyntaxError, -1, "failed to load truetype font\n");
@@ -457,13 +469,17 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
             /* This might be set already for the CIDType2 case */
             if (fontType == fontTrueType || fontType == fontTrueTypeOT) {
 #if POPPLER_CHECK_VERSION(22, 1, 0)
-                int *src = gfx8bit->getCodeToGIDMap(ff.get());
+                auto src = gfx8bit->getCodeToGIDMap(ff.get());
 #else
-                int *src = gfx8bit->getCodeToGIDMap(ff);
+                auto src = gfx8bit->getCodeToGIDMap(ff);
 #endif
+#if POPPLER_CHECK_VERSION(25,2,0)
+                codeToGID = std::move(src);
+#else
                 codeToGID.reserve(256);
                 codeToGID.insert(codeToGID.begin(), src, src + 256);
                 gfree(src);
+#endif
             }
             font_face = getFreeTypeFontFace(fontEngine, lib, fileName, std::move(font_data));
             if (!font_face) {
@@ -481,10 +497,14 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
                     ff1c = FoFiType1C::load(fileName.c_str());
                 }
                 if (ff1c) {
-                    int *src = ff1c->getCIDToGIDMap(&n);
+                    auto src = ff1c->_POPPLER_GET_CID_TO_GID_MAP(&n);
+#if POPPLER_CHECK_VERSION(25,2,0)
+                    codeToGID = std::move(src);
+#else
                     codeToGID.reserve(n);
                     codeToGID.insert(codeToGID.begin(), src, src + n);
                     gfree(src);
+#endif
                     delete ff1c;
                 }
             }
@@ -497,13 +517,21 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
             break;
 
         case fontCIDType0COT:
+#if POPPLER_CHECK_VERSION(25,2,0)
+            if (!gfxcid->getCIDToGID().empty()) {
+#else
             if (gfxcid->getCIDToGID()) {
                 n = gfxcid->getCIDToGIDLen();
                 if (n) {
-                    const int *src = gfxcid->getCIDToGID();
+#endif
+                    const auto src = gfxcid->getCIDToGID();
+#if POPPLER_CHECK_VERSION(25,2,0)
+                    codeToGID = std::move(src);
+#else
                     codeToGID.reserve(n);
                     codeToGID.insert(codeToGID.begin(), src, src + n);
                 }
+#endif
             }
 
             if (codeToGID.empty()) {
@@ -514,16 +542,20 @@ CairoFreeTypeFont *CairoFreeTypeFont::cr
                     FoFiTrueType *ff;
 #endif
                     if (!font_data.empty()) {
-                        ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size());
+                        ff = FoFiTrueType::make((fontchar)font_data.data(), font_data.size(), 0);
                     } else {
-                        ff = FoFiTrueType::load(fileName.c_str());
+                        ff = FoFiTrueType::load(fileName.c_str(), 0);
                     }
                     if (ff) {
                         if (ff->isOpenTypeCFF()) {
-                            int *src = ff->getCIDToGIDMap(&n);
+                            auto src = ff1c->_POPPLER_GET_CID_TO_GID_MAP(&n);
+#if POPPLER_CHECK_VERSION(25,2,0)
+                            codeToGID = std::move(src);
+#else
                             codeToGID.reserve(n);
                             codeToGID.insert(codeToGID.begin(), src, src + n);
                             gfree(src);
+#endif
                         }
                     }
                 }
diff -Naurp inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/poppler-transition-api.h inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/poppler-transition-api.h
--- inkscape-1.4_2024-10-09_e7c3feb100.orig/src/extension/internal/pdfinput/poppler-transition-api.h	2024-05-22 13:57:29.000000000 -0500
+++ inkscape-1.4_2024-10-09_e7c3feb100/src/extension/internal/pdfinput/poppler-transition-api.h	2025-02-09 12:18:16.270016702 -0600
@@ -15,6 +15,28 @@
 #include <glib/poppler-features.h>
 #include <poppler/UTF.h>
 
+#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()
+#define _POPPLER_PDF_DOC_ENCODING_TO_UTF16(str, strlen) pdfDocEncodingToUTF16(src).c_str()
+#else
+#define _POPPLER_GET_CODE_TO_GID_MAP(ff, len) getCodeToGIDMap(ff, len)
+#define _POPPLER_GET_CID_TO_GID_MAP(len) getCIDToGIDMap(len)
+#define _POPPLER_PDF_DOC_ENCODING_TO_UTF16(str, strlen) pdfDocEncodinfToUTF16(str, strlen)
+#endif
+
+#if POPPLER_CHECK_VERSION(24, 12, 0)
+#define _POPPLER_GET_IMAGE_PARAMS(bits, csMode, hasAlpha) getImageParams(bits, csMode, hasAlpha)
+#else
+#define _POPPLER_GET_IMAGE_PARAMS(bits, csMode, hasAlpha) getImageParams(bits, csMode)
+#endif
+
+#if POPPLER_CHECK_VERSION(24, 10, 0)
+#define _POPPLER_CONSUME_UNIQPTR_ARG(value) std::move(value)
+#else
+#define _POPPLER_CONSUME_UNIQPTR_ARG(value) value.release()
+#endif
+
 #if POPPLER_CHECK_VERSION(24, 5, 0)
 #define _POPPLER_HAS_UNICODE_BOM(value) (hasUnicodeByteOrderMark(value->toStr()))
 #define _POPPLER_HAS_UNICODE_BOMLE(value) (hasUnicodeByteOrderMarkLE(value->toStr()))