Submitted By:            Joe Locash <jlocash at gmail dot com>
Date:                    2026-03-13
Initial Package Version: 1.4.3
Upstream Status:         Applied
Origin:                  Upstream commits:
                           Fix for poppler-26.01.0: 3a528728ebe33e10bb44d152f47cfedfddbfe18a
                           Fix for poppler-26.02.0: 47e20c0503ab1464d528f2cc7dd5e6a6a85b70dc
                           Fix for poppler-26.03.0: 754a866b878623554ade26d53496eeb8687c4685
Description:             Fixes building Inkscape-1.4.3 against poppler-26.01.0
                         through poppler-26.03.0. Only 1 hunk in 47e20c05 needed
                         to be back ported for 1.4.3.

diff -Nuar inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-input.cpp inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-input.cpp
--- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-input.cpp	2025-12-25 19:35:50.000000000 -0500
+++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-input.cpp	2026-03-12 15:45:06.562437984 -0400
@@ -33,6 +33,7 @@
 #include <poppler/glib/poppler.h>
 #include <poppler/glib/poppler-document.h>
 #include <poppler/glib/poppler-page.h>
+#include <poppler/goo/gmem.h>
 #endif
 
 #include <gdkmm/general.h>
diff -Nuar inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-parser.cpp inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-parser.cpp
--- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-parser.cpp	2025-12-25 19:35:50.000000000 -0500
+++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-parser.cpp	2026-03-12 15:51:09.119585193 -0400
@@ -653,7 +653,11 @@
 void PdfParser::opSetLineJoin(Object args[], int /*numArgs*/)
 {
   builder->beforeStateChange(state);
+#if POPPLER_CHECK_VERSION(26,2,0)
+  state->setLineJoin((GfxState::LineJoinStyle) args[0].getInt());
+#else
   state->setLineJoin(args[0].getInt());
+#endif
   builder->updateStyle(state);
 }
 
@@ -661,7 +665,11 @@
 void PdfParser::opSetLineCap(Object args[], int /*numArgs*/)
 {
   builder->beforeStateChange(state);
+#if POPPLER_CHECK_VERSION(26,2,0)
+  state->setLineCap((GfxState::LineCapStyle) args[0].getInt());
+#else
   state->setLineCap(args[0].getInt());
+#endif
   builder->updateStyle(state);
 }
 
@@ -1565,7 +1573,13 @@
 
   // restore graphics state
   restoreState();
+#if POPPLER_CHECK_VERSION(26, 2, 0)
+  state->clearPath();
+  GfxPath *currPath = const_cast<GfxPath*>(state->getPath());
+  currPath->append(savedPath);
+#else
   state->setPath(savedPath);
+#endif
 }
 
 // TODO not good that numArgs is ignored but args[] is used:
@@ -1626,7 +1640,13 @@
   // restore graphics state
   if (savedState) {
     restoreState();
+#if POPPLER_CHECK_VERSION(26, 2, 0)
+    state->clearPath();
+    GfxPath *currPath = const_cast<GfxPath*>(state->getPath());
+    currPath->append(savedPath);
+#else
     state->setPath(savedPath);
+#endif
   }
 }
 
@@ -2213,7 +2233,7 @@
 {
   Array *a = nullptr;
   Object obj;
-  int wMode = 0; // Writing mode (horizontal/vertical).
+  _POPPLER_WMODE wMode = _POPPLER_WMODE_HORIZONTAL; // Writing mode (horizontal/vertical).
 
   if (!state->getFont()) {
     error(errSyntaxError, getPos(), "No font in show/space");
@@ -2227,7 +2247,7 @@
     if (obj.isNum()) {
       // this uses the absolute value of the font size to match
       // Acrobat's behavior
-      if (wMode) {
+      if (wMode != _POPPLER_WMODE_HORIZONTAL) {
 	state->textShift(0, -obj.getNum() * 0.001 *
 			    fabs(state->getFontSize()));
       } else {
@@ -2254,7 +2274,7 @@
 void PdfParser::doShowText(GooString *s) {
 #endif
     auto font = state->getFont();
-    int wMode = font->getWMode(); // Vertical/Horizontal/Invalid
+    _POPPLER_WMODE wMode = font->getWMode(); // Vertical/Horizontal/Invalid
 
     builder->beginString(state, get_goostring_length(*s));
 
@@ -2289,7 +2309,7 @@
         auto ax = dx;
         auto ay = dy;
 
-        if (wMode != 0) {
+        if (wMode != _POPPLER_WMODE_HORIZONTAL) {
             // Vertical text (or invalid value).
             dy += state->getCharSpace();
             if (n == 1 && *p == ' ') {
@@ -2931,7 +2951,11 @@
 
   // build dictionary
 #if defined(POPPLER_NEW_OBJECT_API)
+#if POPPLER_CHECK_VERSION(26, 3, 0)
+  dict = Object(std::make_unique<Dict>(xref));
+#else
   dict = Object(new Dict(xref));
+#endif
 #else
   dict.initDict(xref);
 #endif
@@ -2964,7 +2988,11 @@
   // make stream
 #if defined(POPPLER_NEW_OBJECT_API)
   str = new EmbedStream(parser->getStream(), dict.copy(), gFalse, 0);
+#if POPPLER_CHECK_VERSION(26, 2, 0)
+  str = str->addFilters(std::unique_ptr<Stream>(str), dict.getDict()).release();
+#else
   str = str->addFilters(dict.getDict());
+#endif
 #else
   str = new EmbedStream(parser->getStream(), &dict, gFalse, 0);
   str = str->addFilters(&dict);
@@ -3137,10 +3165,17 @@
             auto visible = true;
             // Normally we'd use poppler optContentIsVisible, but these dict
             // objects don't retain their references so can't be used directly.
+#if POPPLER_CHECK_VERSION(26, 2, 0)
+                for (auto &[ref, ocg] : ocgs->getOCGs()) {
+                    if (ocg->getName()->toStr() == label)
+                        visible = ocg->getState() == OptionalContentGroup::On;
+                }
+#else
             for (auto &[ref, ocg] : ocgs->getOCGs()) {
                 if (ocg->getName()->cmp(label) == 0)
                     visible = ocg->getState() == OptionalContentGroup::On;
             }
+#endif
             builder->addOptionalGroup(dict->getKey(j), label, visible);
         }
     }
diff -Nuar inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-transition-api.h inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-transition-api.h
--- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-transition-api.h	2025-07-25 06:14:52.000000000 -0400
+++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-transition-api.h	2026-03-12 15:45:15.073947963 -0400
@@ -15,6 +15,16 @@
 #include <glib/poppler-features.h>
 #include <poppler/UTF.h>
 
+#if POPPLER_CHECK_VERSION(26, 2, 0)
+#define _POPPLER_WMODE GfxFont::WritingMode
+#define _POPPLER_WMODE_HORIZONTAL GfxFont::WritingMode::Horizontal
+#define _POPPLER_WMODE_VERTICAL GfxFont::WritingMode::Vertical
+#else
+#define _POPPLER_WMODE int
+#define _POPPLER_WMODE_HORIZONTAL 0
+#define _POPPLER_WMODE_VERTICAL 1
+#endif
+
 #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)
diff -Nuar inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-utils.cpp inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-utils.cpp
--- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-utils.cpp	2025-12-25 19:35:50.000000000 -0500
+++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-utils.cpp	2026-03-12 15:45:30.102421500 -0400
@@ -88,7 +88,11 @@
                 r.num = hashFontObject(&obj2);
             }
             // Newer poppler will require some reworking as it gives a shared ptr.
+#if POPPLER_CHECK_VERSION(26,3,0)
+            fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), r, *obj2.getDict());
+#else
             fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), r, obj2.getDict());
+#endif
             if (fonts[i] && !fonts[i]->isOk()) {
                 fonts[i] = nullptr;
             }
diff -Nuar inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/svg-builder.cpp inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/svg-builder.cpp
--- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/svg-builder.cpp	2025-12-25 19:35:50.000000000 -0500
+++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/svg-builder.cpp	2026-03-12 15:45:15.074072829 -0400
@@ -32,6 +32,7 @@
 #include <poppler/GfxState.h>
 #include <poppler/Page.h>
 #include <poppler/Stream.h>
+#include <poppler/goo/gmem.h>
 
 #include "color.h"
 #include "color/cms-util.h"
@@ -1385,7 +1386,7 @@
     sp_repr_css_set_property(_css_font, "font-variant", "normal");
 
     // Writing mode
-    if ( font->getWMode() == 0 ) {
+    if ( font->getWMode() == _POPPLER_WMODE_HORIZONTAL ) {
         sp_repr_css_set_property(_css_font, "writing-mode", "lr");
     } else {
         sp_repr_css_set_property(_css_font, "writing-mode", "tb");
@@ -1397,7 +1398,7 @@
  */
 void SvgBuilder::updateTextShift(GfxState *state, double shift) {
     double shift_value = -shift * 0.001 * fabs(state->getFontSize());
-    if (state->getFont()->getWMode()) {
+    if (state->getFont()->getWMode() != _POPPLER_WMODE_HORIZONTAL) {
         _text_position[1] += shift_value;
     } else {
         _text_position[0] += shift_value;
@@ -1451,7 +1452,7 @@
 
     // Text direction is a property of the <text> element.
     auto font = state->getFont();
-    if (font->getWMode() == 1) {
+    if (font->getWMode() == _POPPLER_WMODE_VERTICAL) {
         // Only set if vertical.
         auto css_text = sp_repr_css_attr_new();
         sp_repr_css_set_property(css_text, "writing-mode", "tb");
@@ -1545,8 +1546,8 @@
         bool output_tspan =
             next_it == _glyphs.end() ||
             next_it->style_changed   ||
-            (writing_mode == 0 && std::abs(glyph.text_position[1] - next_it->text_position[1]) > 0.1) ||
-            (writing_mode == 1 && std::abs(glyph.text_position[0] - next_it->text_position[0]) > 0.1);
+            (writing_mode == _POPPLER_WMODE_HORIZONTAL && std::abs(glyph.text_position[1] - next_it->text_position[1]) > 0.1) ||
+            (writing_mode == _POPPLER_WMODE_VERTICAL   && std::abs(glyph.text_position[0] - next_it->text_position[0]) > 0.1);
 
         if (output_tspan) {
 
@@ -2093,7 +2094,11 @@
         } else {
             image_stream = new ImageStream(str, width, 1, 1);
         }
+#if POPPLER_CHECK_VERSION(26, 0, 0)
+        image_stream->rewind();
+#else
         image_stream->reset();
+#endif
 
         // Convert grayscale values
         unsigned char *buffer = new unsigned char[width];
@@ -2119,7 +2124,11 @@
         image_stream = new ImageStream(str, width,
                                        color_map->getNumPixelComps(),
                                        color_map->getBits());
+#if POPPLER_CHECK_VERSION(26, 0, 0)
+        image_stream->rewind();
+#else
         image_stream->reset();
+#endif
 
         // Convert RGB values
         unsigned int *buffer = new unsigned int[width];
