guix_mirror_bot pushed a commit to branch kde-team
in repository guix.
commit 53eaac11ec6035be5e652c3ccd58da7d8856c404
Author: Konstantin Suntsov <[email protected]>
AuthorDate: Wed Aug 12 01:43:12 2026 +0500
gnu: inkscape/pinned, inkscape: Update to 1.4.4.
* gnu/packages/inkscape.scm (inkscape/pinned):
[version]: Update to 1.4.4.
[source]: Add patches for poppler compatibility.
[arguments]<#:phases>{disable-svg-parser-test}: New phase to disable test
that is failing without gtksourceview.
(%inkscape-release-year): Update to 2026.
(inkscape)[name, version, source]: Remove inherited fiels.
[arguments]<#:phases>: Remove disable-svg-parser-test phase to re-enable
test.
[inputs]: Add gtksourceview-4.
* gnu/packages/patches/inkscape-libxml2.patch: Remove file.
* gnu/packages/patches/inkscape-poppler-26-1.patch: New file.
* gnu/packages/patches/inkscape-poppler-26-2.patch: New file.
* gnu/packages/patches/inkscape-poppler-26-3.patch: New file.
* gnu/local.mk (dist_patch_DATA): Remove inkscape-libxml2.patch;
add reference to inkscape-poppler-26-1.patch, inkscape-poppler-26-2.patch,
inkscape-poppler-26-3.patch.
Co-authored-by: Rodion Goritskov <[email protected]>
Signed-off-by: Andreas Enge <[email protected]>
---
gnu/local.mk | 4 +-
gnu/packages/inkscape.scm | 36 +-
gnu/packages/patches/inkscape-libxml2.patch | 33 --
gnu/packages/patches/inkscape-poppler-26-1.patch | 479 +++++++++++++++++++++++
gnu/packages/patches/inkscape-poppler-26-2.patch | 318 +++++++++++++++
gnu/packages/patches/inkscape-poppler-26-3.patch | 67 ++++
6 files changed, 886 insertions(+), 51 deletions(-)
diff --git a/gnu/local.mk b/gnu/local.mk
index b7f1f580ea..3138bce412 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1673,7 +1673,9 @@ dist_patch_DATA =
\
%D%/packages/patches/inetutils-drop-test.patch \
%D%/packages/patches/inferno-fix-crash.patch \
%D%/packages/patches/iniparser-remove-fetchcontent-usage.patch
\
- %D%/packages/patches/inkscape-libxml2.patch \
+ %D%/packages/patches/inkscape-poppler-26-1.patch \
+ %D%/packages/patches/inkscape-poppler-26-2.patch \
+ %D%/packages/patches/inkscape-poppler-26-3.patch \
%D%/packages/patches/instead-use-games-path.patch \
%D%/packages/patches/intltool-perl-compatibility.patch \
%D%/packages/patches/insight-toolkit-fix-build.patch \
diff --git a/gnu/packages/inkscape.scm b/gnu/packages/inkscape.scm
index 02b34f44e2..5790ddf5f0 100644
--- a/gnu/packages/inkscape.scm
+++ b/gnu/packages/inkscape.scm
@@ -9,6 +9,8 @@
;;; Copyright © 2020 Ekaitz Zarraga <[email protected]>
;;; Copyright © 2023, 2024 Efraim Flashner <[email protected]>
;;; Copyright © 2025 John Kehayias <[email protected]>
+;;; Copyright © 2026 Konstantin Suntsov <[email protected]>
+;;; Copyright © 2026 Rodion Goritskov <[email protected]>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -68,7 +70,7 @@
(hidden-package
(package
(name "inkscape")
- (version "1.3.2")
+ (version "1.4.4")
(source
(origin
(method url-fetch)
@@ -76,10 +78,12 @@
"resources/file/"
"inkscape-" version ".tar.xz"))
(sha256
- (base32 "0sq81smxwypgnp7r3wgza8w25dsz9qa8ga79sc85xzj3qi6q9lfv"))
+ (base32 "0vl5p2rxki7lcgf7k8x6p6m0lw30n1g6cv7ibhd8g2z0l59mgkmv"))
(modules '((guix build utils)
(ice-9 format)))
- (patches (search-patches "inkscape-libxml2.patch"))
+ (patches (search-patches "inkscape-poppler-26-1.patch"
+ "inkscape-poppler-26-2.patch"
+ "inkscape-poppler-26-3.patch"))
(snippet
'(begin
(let-syntax
@@ -215,6 +219,14 @@ endif()~%~%"
(substitute* "testfiles/src/visual-bounds-test.cpp"
(("%lu") "%u")))))
'())
+ (add-after 'unpack 'disable-svg-parser-test
+ (lambda _
+ ;; Fail because without gtksourceview in deps
+ ;; SvgPathParser::prettify_svgd is not available
+ ;; for tests
+ (substitute* "testfiles/CMakeLists.txt"
+ ((" svg-path-parser-test")
+ " #svg-path-parser-test"))))
(add-after 'unpack 'set-home
;; Mute Inkscape warnings during tests.
(lambda _
@@ -342,23 +354,10 @@ as the native format.")
;;; The Inkscape release year used in the about dialog. Please keep it sync
;;; when updating the package!
-(define %inkscape-release-year 2025)
+(define %inkscape-release-year 2026)
(define-public inkscape
(package
(inherit inkscape/pinned)
- (name "inkscape")
- (version "1.4.3")
- (source
- (origin
- (inherit (package-source inkscape/pinned))
- (method url-fetch)
- (uri (string-append "https://media.inkscape.org/dl/"
- "resources/file/"
- "inkscape-" version ".tar.xz"))
- (patches '())
- (sha256
- (base32 "1lfi1rqr32kwjdkka4sbsxmkyyw3k1qgxk0gzyhwbdkhnlyjqfp8"))))
- (build-system cmake-build-system)
(arguments
(substitute-keyword-arguments (package-arguments inkscape/pinned)
((#:modules modules)
@@ -388,6 +387,8 @@ as the native format.")
(substitute* "testfiles/CMakeLists.txt"
((" geom-pathstroke-test") "")))))
'())
+ ;; We now have gtksourceview in deps, so test should pass
+ (delete 'disable-svg-parser-test)
(replace 'wrap-program
;; Ensure Python is available at runtime.
(lambda _
@@ -401,6 +402,7 @@ as the native format.")
(inputs (modify-inputs (package-inputs inkscape/pinned)
(replace "lib2geom" lib2geom)
(append imagemagick ;for libMagickCore and libMagickWand
+ gtksourceview-4
python-tinycss2)))
(native-inputs
(modify-inputs (package-native-inputs inkscape/pinned)
diff --git a/gnu/packages/patches/inkscape-libxml2.patch
b/gnu/packages/patches/inkscape-libxml2.patch
deleted file mode 100644
index dc5b0f5346..0000000000
--- a/gnu/packages/patches/inkscape-libxml2.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 694d8ae43d06efff21adebf377ce614d660b24cd Mon Sep 17 00:00:00 2001
-From: Christian Hesse <[email protected]>
-Date: Fri, 17 Nov 2023 22:30:42 +0100
-Subject: [PATCH] include missing header file
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This fixes build error:
-```
-/build/inkscape/src/inkscape/src/object/uri.cpp: In constructor
‘Inkscape::URI::URI(const gchar*, const char*)’:
-/build/inkscape/src/inkscape/src/object/uri.cpp:86:9: error: ‘xmlFree’ was not
declared in this scope; did you mean ‘xmlFreeURI’?
- 86 | xmlFree(full);
-```
----
- src/object/uri.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/object/uri.h b/src/object/uri.h
-index 381adec58cf..d5b211fe2b2 100644
---- a/src/object/uri.h
-+++ b/src/object/uri.h
-@@ -13,6 +13,7 @@
- #define INKSCAPE_URI_H
-
- #include <libxml/uri.h>
-+#include <libxml/xmlmemory.h>
- #include <memory>
- #include <string>
-
---
-GitLab
-
diff --git a/gnu/packages/patches/inkscape-poppler-26-1.patch
b/gnu/packages/patches/inkscape-poppler-26-1.patch
new file mode 100644
index 0000000000..8d917b7345
--- /dev/null
+++ b/gnu/packages/patches/inkscape-poppler-26-1.patch
@@ -0,0 +1,479 @@
+Backport:
+https://gitlab.com/inkscape/inkscape/-/commit/1ad89c941bad5e42a3378cd8644a4c4cd3b6ea71.patch
+https://gitlab.com/inkscape/inkscape/-/commit/09cbe3cf8fdf6a9dc6d9789f4d2416c619e8bc89.patch
+
+Subject: [PATCH 1/2] poppler 26.6.0
+
+---
+ src/extension/internal/pdfinput/pdf-input.cpp | 14 +++++-
+ .../internal/pdfinput/pdf-parser.cpp | 43 ++++++++++---------
+ src/extension/internal/pdfinput/pdf-parser.h | 4 +-
+ src/extension/internal/pdfinput/pdf-utils.cpp | 5 +++
+ src/extension/internal/pdfinput/pdf-utils.h | 1 +
+ .../pdfinput/poppler-cairo-font-engine.cpp | 2 +-
+ .../pdfinput/poppler-transition-api.h | 16 +++++++
+ .../internal/pdfinput/poppler-utils.cpp | 20 +++++----
+ .../internal/pdfinput/svg-builder.cpp | 30 ++++++++-----
+ src/extension/internal/pdfinput/svg-builder.h | 3 +-
+ 10 files changed, 92 insertions(+), 46 deletions(-)
+
+diff --git a/src/extension/internal/pdfinput/pdf-input.cpp
b/src/extension/internal/pdfinput/pdf-input.cpp
+index 45df931..441871b 100644
+--- a/src/extension/internal/pdfinput/pdf-input.cpp
++++ b/src/extension/internal/pdfinput/pdf-input.cpp
+@@ -808,7 +808,11 @@
PdfInput::add_builder_page(std::shared_ptr<PDFDoc>pdf_doc, SvgBuilder *builder,
+ }
+
+ // Apply crop settings
++#if POPPLER_CHECK_VERSION(26, 6, 0)
++ std::optional<PDFRectangle> clipToBox;
++#else
+ _POPPLER_CONST PDFRectangle *clipToBox = nullptr;
++#endif
+
+ if (crop_to == "media-box") {
+ clipToBox = page->getMediaBox();
+@@ -822,8 +826,16 @@
PdfInput::add_builder_page(std::shared_ptr<PDFDoc>pdf_doc, SvgBuilder *builder,
+ clipToBox = page->getArtBox();
+ }
+
++ std::optional<PDFRectangle> cropBox;
++#if POPPLER_CHECK_VERSION(26, 6, 0)
++ cropBox = clipToBox;
++#else
++ if (clipToBox) {
++ cropBox = *clipToBox;
++ }
++#endif
+ // Create parser (extension/internal/pdfinput/pdf-parser.h)
+- auto pdf_parser = PdfParser(pdf_doc, builder, page, clipToBox);
++ auto pdf_parser = PdfParser(pdf_doc, builder, page, cropBox);
+
+ // Set up approximation precision for parser. Used for converting Mesh
Gradients into tiles.
+ if ( color_delta <= 0.0 ) {
+diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp
b/src/extension/internal/pdfinput/pdf-parser.cpp
+index d24dc05..e32fa24 100644
+--- a/src/extension/internal/pdfinput/pdf-parser.cpp
++++ b/src/extension/internal/pdfinput/pdf-parser.cpp
+@@ -43,6 +43,7 @@
+ #include <poppler/GlobalParams.h>
+ #include <poppler/Lexer.h>
+ #include <poppler/Object.h>
++#include <poppler/OptionalContent.h>
+ #include <poppler/OutputDev.h>
+ #include <poppler/PDFDoc.h>
+ #include <poppler/Page.h>
+@@ -266,7 +267,7 @@ GfxPatch blankPatch()
+ //------------------------------------------------------------------------
+
+ PdfParser::PdfParser(std::shared_ptr<PDFDoc> pdf_doc,
Inkscape::Extension::Internal::SvgBuilder *builderA, Page *page,
+- _POPPLER_CONST PDFRectangle *cropBox)
++ const std::optional<PDFRectangle> &cropBox)
+ : _pdf_doc(pdf_doc)
+ , xref(pdf_doc->getXRef())
+ , builder(builderA)
+@@ -307,8 +308,8 @@ PdfParser::PdfParser(std::shared_ptr<PDFDoc> pdf_doc,
Inkscape::Extension::Inter
+ builder->setMargins(getRect(page->getTrimBox()) * scale,
+ getRect(page->getArtBox()) * scale,
+ getRect(page->getBleedBox()) * scale);
+- if (cropBox && getRect(cropBox) != page_box) {
+- builder->cropPage(getRect(cropBox) * scale);
++ if (cropBox && getRect(*cropBox) != page_box) {
++ builder->cropPage(getRect(*cropBox) * scale);
+ }
+
+ saveState();
+@@ -325,7 +326,7 @@ PdfParser::PdfParser(XRef *xrefA,
Inkscape::Extension::Internal::SvgBuilder *bui
+ , printCommands(false)
+ , res(new GfxResources(xref, resDict, nullptr))
+ , // start the resource stack
+- state(new GfxState(72, 72, box, 0, false))
++ state(new _POPPLER_GFX_STATE(72, 72, *box, 0, false))
+ , fontChanged(gFalse)
+ , clip(clipNone)
+ , ignoreUndef(0)
+@@ -992,7 +993,7 @@ void PdfParser::opSetFillGray(Object args[], int
/*numArgs*/)
+ state->setFillPattern(nullptr);
+
state->setFillColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceGrayColorSpace>()));
+ color.c[0] = dblToCol(args[0].getNum());
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1004,7 +1005,7 @@ void PdfParser::opSetStrokeGray(Object args[], int
/*numArgs*/)
+ state->setStrokePattern(nullptr);
+
state->setStrokeColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(std::make_unique<GfxDeviceGrayColorSpace>()));
+ color.c[0] = dblToCol(args[0].getNum());
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1019,7 +1020,7 @@ void PdfParser::opSetFillCMYKColor(Object args[], int
/*numArgs*/)
+ for (i = 0; i < 4; ++i) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1033,7 +1034,7 @@ void PdfParser::opSetStrokeCMYKColor(Object args[], int
/*numArgs*/)
+ for (int i = 0; i < 4; ++i) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1047,7 +1048,7 @@ void PdfParser::opSetFillRGBColor(Object args[], int
/*numArgs*/)
+ for (int i = 0; i < 3; ++i) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1060,7 +1061,7 @@ void PdfParser::opSetStrokeRGBColor(Object args[], int
/*numArgs*/) {
+ for (int i = 0; i < 3; ++i) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1076,7 +1077,7 @@ void PdfParser::opSetFillColorSpace(Object args[], int
numArgs)
+ GfxColor color;
+ colorSpace->getDefaultColor(&color);
+ state->setFillColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(colorSpace));
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ } else {
+ error(errSyntaxError, getPos(), "Bad color space (fill)");
+@@ -1097,7 +1098,7 @@ void PdfParser::opSetStrokeColorSpace(Object args[], int
numArgs)
+ GfxColor color;
+ colorSpace->getDefaultColor(&color);
+ state->setStrokeColorSpace(_POPPLER_CONSUME_UNIQPTR_ARG(colorSpace));
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ } else {
+ error(errSyntaxError, getPos(), "Bad color space (stroke)");
+@@ -1117,7 +1118,7 @@ void PdfParser::opSetFillColor(Object args[], int
numArgs) {
+ for (i = 0; i < numArgs; ++i) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1134,7 +1135,7 @@ void PdfParser::opSetStrokeColor(Object args[], int
numArgs) {
+ for (i = 0; i < numArgs; ++i) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ }
+
+@@ -1155,7 +1156,7 @@ void PdfParser::opSetFillColorN(Object args[], int
numArgs) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+ }
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ }
+ if (auto pattern = lookupPattern(&(args[numArgs - 1]), state)) {
+@@ -1174,7 +1175,7 @@ void PdfParser::opSetFillColorN(Object args[], int
numArgs) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+ }
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ builder->updateStyle(state);
+ }
+ }
+@@ -1198,7 +1199,7 @@ void PdfParser::opSetStrokeColorN(Object args[], int
numArgs) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+ }
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ }
+ if (auto pattern = lookupPattern(&(args[numArgs - 1]), state)) {
+@@ -1217,7 +1218,7 @@ void PdfParser::opSetStrokeColorN(Object args[], int
numArgs) {
+ color.c[i] = dblToCol(args[i].getNum());
+ }
+ }
+- state->setStrokeColor(&color);
++ state->_POPPLER_SET_STROKE_COLOR(color);
+ builder->updateStyle(state);
+ }
+ }
+@@ -1700,7 +1701,7 @@ void PdfParser::doFunctionShFill1(GfxFunctionShading
*shading,
+
+ // use the center color
+ shading->getColor(xM, yM, &fillColor);
+- state->setFillColor(&fillColor);
++ state->_POPPLER_SET_FILL_COLOR(fillColor);
+
+ // fill the rectangle
+ state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4],
+@@ -1799,7 +1800,7 @@ void PdfParser::gouraudFillTriangle(double x0, double
y0, GfxColor *color0,
+ }
+ }
+ if (i == nComps || depth == maxDepths[pdfGouraudTriangleShading-1]) {
+- state->setFillColor(color0);
++ state->_POPPLER_SET_FILL_COLOR(*color0);
+ state->moveTo(x0, y0);
+ state->lineTo(x1, y1);
+ state->lineTo(x2, y2);
+@@ -1877,7 +1878,7 @@ void PdfParser::fillPatch(_POPPLER_CONST GfxPatch
*patch, int nComps, int depth)
+ color.c[i] = GfxColorComp(patch->color[0][0].c[i]);
+ }
+ if (i == nComps || depth == maxDepths[pdfPatchMeshShading-1]) {
+- state->setFillColor(&color);
++ state->_POPPLER_SET_FILL_COLOR(color);
+ state->moveTo(patch->x[0][0], patch->y[0][0]);
+ state->curveTo(patch->x[0][1], patch->y[0][1],
+ patch->x[0][2], patch->y[0][2],
+diff --git a/src/extension/internal/pdfinput/pdf-parser.h
b/src/extension/internal/pdfinput/pdf-parser.h
+index c136ebf..58044fb 100644
+--- a/src/extension/internal/pdfinput/pdf-parser.h
++++ b/src/extension/internal/pdfinput/pdf-parser.h
+@@ -112,8 +112,8 @@ struct OpHistoryEntry {
+ class PdfParser {
+ public:
+
+- // Constructor for regular output.
+- PdfParser(std::shared_ptr<PDFDoc> pdf_doc, SvgBuilder *builderA, Page
*page, _POPPLER_CONST PDFRectangle *cropBox);
++ // Constructor for regular output.
++ PdfParser(std::shared_ptr<PDFDoc> pdf_doc, SvgBuilder *builderA, Page
*page, const std::optional<PDFRectangle> &cropBox);
+ // Constructor for a sub-page object.
+ PdfParser(XRef *xrefA, SvgBuilder *builderA, Dict *resDict,
_POPPLER_CONST PDFRectangle *box);
+
+diff --git a/src/extension/internal/pdfinput/pdf-utils.cpp
b/src/extension/internal/pdfinput/pdf-utils.cpp
+index d126426..ceb05cf 100644
+--- a/src/extension/internal/pdfinput/pdf-utils.cpp
++++ b/src/extension/internal/pdfinput/pdf-utils.cpp
+@@ -133,6 +133,11 @@ Geom::Rect getRect(_POPPLER_CONST PDFRectangle *box)
+ return Geom::Rect(box->x1, box->y1, box->x2, box->y2);
+ }
+
++Geom::Rect getRect(_POPPLER_CONST PDFRectangle &box)
++{
++ return Geom::Rect(box.x1, box.y1, box.x2, box.y2);
++}
++
+ Geom::PathVector getPathV(GfxPath *path)
+ {
+ if (!path) {
+diff --git a/src/extension/internal/pdfinput/pdf-utils.h
b/src/extension/internal/pdfinput/pdf-utils.h
+index 59efdea..d37edd7 100644
+--- a/src/extension/internal/pdfinput/pdf-utils.h
++++ b/src/extension/internal/pdfinput/pdf-utils.h
+@@ -59,6 +59,7 @@ private:
+ };
+
+ Geom::Rect getRect(_POPPLER_CONST PDFRectangle *box);
++Geom::Rect getRect(_POPPLER_CONST PDFRectangle &box);
+ Geom::PathVector getPathV(GfxPath *gPath);
+
+ #endif /* PDF_UTILS_H */
+diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+index b6ed11c..122804f 100644
+--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
++++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+@@ -700,7 +700,7 @@ CairoType3Font *CairoType3Font::create(GfxFont *gfxFont,
PDFDoc *doc, CairoFontE
+ codeToGID[i] = 0;
+ if (charProcs && (name = enc[i])) {
+ for (int j = 0; j < charProcs->getLength(); j++) {
+- if (strcmp(name, charProcs->getKey(j)) == 0) {
++ if (std::string(charProcs->getKey(j)).compare(name) == 0) {
+ codeToGID[i] = j;
+ }
+ }
+diff --git a/src/extension/internal/pdfinput/poppler-transition-api.h
b/src/extension/internal/pdfinput/poppler-transition-api.h
+index 7f299bd..bf42f54 100644
+--- a/src/extension/internal/pdfinput/poppler-transition-api.h
++++ b/src/extension/internal/pdfinput/poppler-transition-api.h
+@@ -15,6 +15,22 @@
+ #include <glib/poppler-features.h>
+ #include <poppler/UTF.h>
+
++#if POPPLER_CHECK_VERSION(26, 6, 0)
++#define _POPPLER_GET_GRAY(color, gray) getGray(color, gray)
++#define _POPPLER_GET_RGB(color, rgb) getRGB(color, rgb)
++#define _POPPLER_GET_CMYK(color, cmyk) getCMYK(color, cmyk)
++#define _POPPLER_SET_FILL_COLOR(color) setFillColor(color)
++#define _POPPLER_SET_STROKE_COLOR(color) setStrokeColor(color)
++#define _POPPLER_GFX_STATE(h, v, Rect, rotateA, upsideDown) GfxState(h, v,
Rect, rotateA, upsideDown)
++#else
++#define _POPPLER_GET_GRAY(color, gray) getGray(&color, gray)
++#define _POPPLER_GET_RGB(color, rgb) getRGB(&color, rgb)
++#define _POPPLER_GET_CMYK(color, cmyk) getCMYK(&color, cmyk)
++#define _POPPLER_SET_FILL_COLOR(color) setFillColor(&color)
++#define _POPPLER_SET_STROKE_COLOR(color) setStrokeColor(&color)
++#define _POPPLER_GFX_STATE(h, v, Rect, rotateA, upsideDown) GfxState(h, v,
&Rect, rotateA, upsideDown)
++#endif
++
+ #if POPPLER_CHECK_VERSION(26, 2, 0)
+ #define _POPPLER_WMODE GfxFont::WritingMode
+ #define _POPPLER_WMODE_HORIZONTAL GfxFont::WritingMode::Horizontal
+diff --git a/src/extension/internal/pdfinput/poppler-utils.cpp
b/src/extension/internal/pdfinput/poppler-utils.cpp
+index a65a578..9027362 100644
+--- a/src/extension/internal/pdfinput/poppler-utils.cpp
++++ b/src/extension/internal/pdfinput/poppler-utils.cpp
+@@ -195,15 +195,17 @@ void InkFontDict::hashFontObject1(const Object *obj,
FNVHash *h)
+ hashFontObject1(&obj2, h);
+ }
+ break;
+- case objDict:
+- h->hash('d');
+- n = obj->dictGetLength();
+- h->hash((char *)&n, sizeof(int));
+- for (i = 0; i < n; ++i) {
+- p = obj->dictGetKey(i);
+- h->hash(p, (int)strlen(p));
+- const Object &obj2 = obj->dictGetValNF(i);
+- hashFontObject1(&obj2, h);
++ case objDict: {
++ h->hash('d');
++ auto objdict = obj->getDict();
++ n = objdict->getLength();
++ h->hash((char *)&n, sizeof(int));
++ for (i = 0; i < n; ++i) {
++ auto p = std::string(objdict->getKey(i));
++ h->hash(p.c_str(), p.length());
++ const Object &obj2 = objdict->getValNF(i);
++ hashFontObject1(&obj2, h);
++ }
+ }
+ break;
+ case objStream:
+diff --git a/src/extension/internal/pdfinput/svg-builder.cpp
b/src/extension/internal/pdfinput/svg-builder.cpp
+index d854ed8..feba794 100644
+--- a/src/extension/internal/pdfinput/svg-builder.cpp
++++ b/src/extension/internal/pdfinput/svg-builder.cpp
+@@ -392,7 +392,15 @@ static std::string svgConvertGfxRGB(GfxRGB *color)
+ return svgConvertRGBToText(r, g, b);
+ }
+
+-std::string SvgBuilder::convertGfxColor(const GfxColor *color, GfxColorSpace
*space)
++// for poppler < 26.06.0
++std::string SvgBuilder::convertGfxColor(const GfxColor *color, GfxColorSpace
*space) {
++ if (!color) {
++ return "";
++ }
++ return convertGfxColor(*color, space);
++}
++
++std::string SvgBuilder::convertGfxColor(const GfxColor &color, GfxColorSpace
*space)
+ {
+ std::string icc = "";
+ switch (space->getMode()) {
+@@ -412,14 +420,14 @@ std::string SvgBuilder::convertGfxColor(const GfxColor
*color, GfxColorSpace *sp
+ }
+
+ GfxRGB rgb;
+- space->getRGB(color, &rgb);
++ space->_POPPLER_GET_RGB(color, &rgb);
+ auto rgb_color = svgConvertGfxRGB(&rgb);
+
+ if (!icc.empty()) {
+ Inkscape::CSSOStringStream icc_color;
+ icc_color << rgb_color << " icc-color(" << icc;
+ for (int i = 0; i < space->getNComps(); ++i) {
+- icc_color << ", " << colToDbl((*color).c[i]);
++ icc_color << ", " << colToDbl((color).c[i]);
+ }
+ icc_color << ");";
+ return icc_color.str();
+@@ -1204,7 +1212,7 @@ gchar *SvgBuilder::_createGradient(GfxShading *shading,
const Geom::Affine pat_m
+ /**
+ * \brief Adds a stop with the given properties to the gradient's
representation
+ */
+-void SvgBuilder::_addStopToGradient(Inkscape::XML::Node *gradient, double
offset, GfxColor *color, GfxColorSpace *space,
++void SvgBuilder::_addStopToGradient(Inkscape::XML::Node *gradient, double
offset, GfxColor &color, GfxColorSpace *space,
+ double opacity)
+ {
+ Inkscape::XML::Node *stop = _xml_doc->createElement("svg:stop");
+@@ -1214,7 +1222,7 @@ void SvgBuilder::_addStopToGradient(Inkscape::XML::Node
*gradient, double offset
+ if (space->getMode() == csDeviceGray) {
+ // This is a transparency mask.
+ GfxRGB rgb;
+- space->getRGB(color, &rgb);
++ space->_POPPLER_GET_RGB(color, &rgb);
+ double gray = (double)rgb.r / 65535.0;
+ gray = CLAMP(gray, 0.0, 1.0);
+ os_opacity << gray;
+@@ -1255,8 +1263,8 @@ bool SvgBuilder::_addGradientStops(Inkscape::XML::Node
*gradient, GfxShading *sh
+ if (!svgGetShadingColor(shading, 0.0, &stop1) ||
!svgGetShadingColor(shading, 1.0, &stop2)) {
+ return false;
+ } else {
+- _addStopToGradient(gradient, 0.0, &stop1, space, 1.0);
+- _addStopToGradient(gradient, 1.0, &stop2, space, 1.0);
++ _addStopToGradient(gradient, 0.0, stop1, space, 1.0);
++ _addStopToGradient(gradient, 1.0, stop2, space, 1.0);
+ }
+ } else if (type == _POPPLER_FUNCTION_TYPE_STITCHING) {
+ auto stitchingFunc = static_cast<_POPPLER_CONST
StitchingFunction*>(func);
+@@ -1269,7 +1277,7 @@ bool SvgBuilder::_addGradientStops(Inkscape::XML::Node
*gradient, GfxShading *sh
+ // Add stops from all the stitched functions
+ GfxColor prev_color, color;
+ svgGetShadingColor(shading, bounds[0], &prev_color);
+- _addStopToGradient(gradient, bounds[0], &prev_color, space, 1.0);
++ _addStopToGradient(gradient, bounds[0], prev_color, space, 1.0);
+ for ( int i = 0 ; i < num_funcs ; i++ ) {
+ svgGetShadingColor(shading, bounds[i + 1], &color);
+ // Add stops
+@@ -1279,14 +1287,14 @@ bool SvgBuilder::_addGradientStops(Inkscape::XML::Node
*gradient, GfxShading *sh
+ expE = (bounds[i + 1] - bounds[i])/expE; //
approximate exponential as a single straight line at x=1
+ if (encode[2*i] == 0) { // normal sequence
+ auto offset = (bounds[i + 1] - expE) / max_bound;
+- _addStopToGradient(gradient, offset, &prev_color,
space, 1.0);
++ _addStopToGradient(gradient, offset, prev_color,
space, 1.0);
+ } else { // reflected sequence
+ auto offset = (bounds[i] + expE) / max_bound;
+- _addStopToGradient(gradient, offset, &color, space,
1.0);
++ _addStopToGradient(gradient, offset, color, space,
1.0);
+ }
+ }
+ }
+- _addStopToGradient(gradient, bounds[i + 1] / max_bound, &color,
space, 1.0);
++ _addStopToGradient(gradient, bounds[i + 1] / max_bound, color,
space, 1.0);
+ prev_color = color;
+ }
+ } else { // Unsupported function type
+diff --git a/src/extension/internal/pdfinput/svg-builder.h
b/src/extension/internal/pdfinput/svg-builder.h
+index b814a67..4041c95 100644
+--- a/src/extension/internal/pdfinput/svg-builder.h
++++ b/src/extension/internal/pdfinput/svg-builder.h
+@@ -186,7 +186,7 @@ private:
+ // Pattern creation
+ gchar *_createPattern(GfxPattern *pattern, GfxState *state, bool
is_stroke=false);
+ gchar *_createGradient(GfxShading *shading, const Geom::Affine
pat_matrix, bool for_shading = false);
+- void _addStopToGradient(Inkscape::XML::Node *gradient, double offset,
GfxColor *color, GfxColorSpace *space,
++ void _addStopToGradient(Inkscape::XML::Node *gradient, double offset,
GfxColor &color, GfxColorSpace *space,
+ double opacity);
+ bool _addGradientStops(Inkscape::XML::Node *gradient, GfxShading *shading,
+ _POPPLER_CONST Function *func);
+@@ -239,6 +239,7 @@ private:
+ static bool _attrEqual(Inkscape::XML::Node *a, Inkscape::XML::Node *b,
char const *attr);
+
+ // Colors
++ std::string convertGfxColor(const GfxColor &color, GfxColorSpace *space);
+ std::string convertGfxColor(const GfxColor *color, GfxColorSpace *space);
+ std::string _getColorProfile(cmsHPROFILE hp);
+
+--
+2.54.0
+
diff --git a/gnu/packages/patches/inkscape-poppler-26-2.patch
b/gnu/packages/patches/inkscape-poppler-26-2.patch
new file mode 100644
index 0000000000..47833c9304
--- /dev/null
+++ b/gnu/packages/patches/inkscape-poppler-26-2.patch
@@ -0,0 +1,318 @@
+Backport:
https://gitlab.com/inkscape/inkscape/-/commit/ce52c5f96106ae5747171663a46831f21aa52d95.patch
+
+Subject: [PATCH 2/2] Backport 26.7.0
+
+---
+ src/extension/internal/pdfinput/pdf-input.cpp | 5 +-
+ .../internal/pdfinput/pdf-parser.cpp | 50 +++++++++----------
+ .../pdfinput/poppler-transition-api.h | 6 +++
+ .../internal/pdfinput/poppler-utils.cpp | 29 ++++++-----
+ .../internal/pdfinput/poppler-utils.h | 1 +
+ 5 files changed, 52 insertions(+), 39 deletions(-)
+
+diff --git a/src/extension/internal/pdfinput/pdf-input.cpp
b/src/extension/internal/pdfinput/pdf-input.cpp
+index 441871b..3507ce4 100644
+--- a/src/extension/internal/pdfinput/pdf-input.cpp
++++ b/src/extension/internal/pdfinput/pdf-input.cpp
+@@ -855,9 +855,10 @@
PdfInput::add_builder_page(std::shared_ptr<PDFDoc>pdf_doc, SvgBuilder *builder,
+
+ // Parse the annotations
+ if (auto annots = page->getAnnotsObject(); annots.isArray()) {
+- auto const size = annots.arrayGetLength();
++ auto* annotsArray = annots.getArray();
++ auto const size = annotsArray->getLength();
+ for (int i = 0; i < size; i++) {
+- pdf_parser.build_annots(annots.arrayGet(i), page_num);
++ pdf_parser.build_annots(annotsArray->get(i), page_num);
+ }
+ }
+ }
+diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp
b/src/extension/internal/pdfinput/pdf-parser.cpp
+index e32fa24..bf8daaa 100644
+--- a/src/extension/internal/pdfinput/pdf-parser.cpp
++++ b/src/extension/internal/pdfinput/pdf-parser.cpp
+@@ -293,8 +293,8 @@ PdfParser::PdfParser(std::shared_ptr<PDFDoc> pdf_doc,
Inkscape::Extension::Inter
+ if (page) {
+ // Increment the page building here and set page label
+ Catalog *catalog = pdf_doc->getCatalog();
+- GooString *label = new GooString("");
+- catalog->indexToLabel(page->getNum() - 1, label);
++ _POPPLER_STRING_26_7 label;
++ catalog->indexToLabel(page->getNum() - 1, &label);
+ builder->pushPage(getString(label), state);
+ }
+
+@@ -370,8 +370,8 @@ void PdfParser::parse(Object *obj, GBool topLevel) {
+ Object obj2;
+
+ if (obj->isArray()) {
+- for (int i = 0; i < obj->arrayGetLength(); ++i) {
+- _POPPLER_CALL_ARGS(obj2, obj->arrayGet, i);
++ for (int i = 0; i < obj->getArray()->getLength(); ++i) {
++ _POPPLER_CALL_ARGS(obj2, obj->getArray()->get, i);
+ if (!obj2.isStream()) {
+ error(errInternal, -1, "Weird page contents");
+ _POPPLER_FREE(obj2);
+@@ -808,8 +808,8 @@ void PdfParser::opSetExtGState(Object args[], int
/*numArgs*/)
+ for (int &i : backdropColor.c) {
+ i = 0;
+ }
+- for (int i = 0; i < obj3.arrayGetLength() && i <
gfxColorMaxComps; ++i) {
+- _POPPLER_CALL_ARGS(obj4, obj3.arrayGet, i);
++ for (int i = 0; i < obj3.getArray()->getLength() && i <
gfxColorMaxComps; ++i) {
++ _POPPLER_CALL_ARGS(obj4, obj3.getArray()->get, i);
+ if (obj4.isNum()) {
+ backdropColor.c[i] = dblToCol(obj4.getNum());
+ }
+@@ -818,7 +818,7 @@ void PdfParser::opSetExtGState(Object args[], int
/*numArgs*/)
+ }
+ _POPPLER_FREE(obj3);
+ if (_POPPLER_CALL_ARGS_DEREF(obj3, obj2.dictLookup,
"G").isStream()) {
+- if (_POPPLER_CALL_ARGS_DEREF(obj4,
obj3.streamGetDict()->lookup, "Group").isDict()) {
++ if (_POPPLER_CALL_ARGS_DEREF(obj4,
obj3.getStream()->getDict()->lookup, "Group").isDict()) {
+ std::unique_ptr<GfxColorSpace> blendingColorSpace;
+ GBool isolated = gFalse;
+ GBool knockout = gFalse;
+@@ -881,7 +881,7 @@ void PdfParser::doSoftMask(Object *str, GBool alpha,
+ }
+
+ // get stream dict
+- dict = str->streamGetDict();
++ dict = str->getStream()->getDict();
+
+ // check form type
+ _POPPLER_CALL_ARGS(obj1, dict->lookup, "FormType");
+@@ -898,7 +898,7 @@ void PdfParser::doSoftMask(Object *str, GBool alpha,
+ return;
+ }
+ for (i = 0; i < 4; ++i) {
+- _POPPLER_CALL_ARGS(obj2, obj1.arrayGet, i);
++ _POPPLER_CALL_ARGS(obj2, obj1.getArray()->get, i);
+ bbox[i] = obj2.getNum();
+ _POPPLER_FREE(obj2);
+ }
+@@ -908,7 +908,7 @@ void PdfParser::doSoftMask(Object *str, GBool alpha,
+ _POPPLER_CALL_ARGS(obj1, dict->lookup, "Matrix");
+ if (obj1.isArray()) {
+ for (i = 0; i < 6; ++i) {
+- _POPPLER_CALL_ARGS(obj2, obj1.arrayGet, i);
++ _POPPLER_CALL_ARGS(obj2, obj1.getArray()->get, i);
+ m[i] = obj2.getNum();
+ _POPPLER_FREE(obj2);
+ }
+@@ -2378,7 +2378,7 @@ void PdfParser::opXObject(Object args[], int /*numArgs*/)
+ }
+
+ //add layer at root if xObject has type OCG
+- _POPPLER_CALL_ARGS(obj2, obj1.streamGetDict()->lookup, "OC");
++ _POPPLER_CALL_ARGS(obj2, obj1.getStream()->getDict()->lookup, "OC");
+ if(obj2.isDict()){
+ auto type_dict = obj2.getDict();
+ if (type_dict->lookup("Type").isName("OCG")) {
+@@ -2396,7 +2396,7 @@ void PdfParser::opXObject(Object args[], int /*numArgs*/)
+ }
+ }
+
+- _POPPLER_CALL_ARGS(obj2, obj1.streamGetDict()->lookup, "Subtype");
++ _POPPLER_CALL_ARGS(obj2, obj1.getStream()->getDict()->lookup, "Subtype");
+ if (obj2.isName(const_cast<char*>("Image"))) {
+ _POPPLER_CALL_ARGS(refObj, res->lookupXObjectNF, name);
+ doImage(&refObj, obj1.getStream(), gFalse);
+@@ -2404,7 +2404,7 @@ void PdfParser::opXObject(Object args[], int /*numArgs*/)
+ } else if (obj2.isName(const_cast<char*>("Form"))) {
+ doForm(&obj1);
+ } else if (obj2.isName(const_cast<char*>("PS"))) {
+- _POPPLER_CALL_ARGS(obj3, obj1.streamGetDict()->lookup, "Level1");
++ _POPPLER_CALL_ARGS(obj3, obj1.getStream()->getDict()->lookup,
"Level1");
+ } else if (obj2.isName()) {
+ error(errSyntaxError, getPos(), "Unknown XObject subtype '{0:s}'",
obj2.getName());
+ } else {
+@@ -2535,7 +2535,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str,
GBool inlineImg)
+ _POPPLER_CALL_ARGS(obj1, dict->lookup, "D");
+ }
+ if (obj1.isArray()) {
+- _POPPLER_CALL_ARGS(obj2, obj1.arrayGet, 0);
++ _POPPLER_CALL_ARGS(obj2, obj1.getArray()->get, 0);
+ if (obj2.isInt() && obj2.getInt() == 1) {
+ invert = gTrue;
+ }
+@@ -2597,7 +2597,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str,
GBool inlineImg)
+ goto err1;
+ }
+ maskStr = smaskObj.getStream();
+- maskDict = smaskObj.streamGetDict();
++ maskDict = smaskObj.getStream()->getDict();
+ _POPPLER_CALL_ARGS(obj1, maskDict->lookup, "Width");
+ if (obj1.isNull()) {
+ _POPPLER_FREE(obj1);
+@@ -2663,8 +2663,8 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str,
GBool inlineImg)
+ } else if (maskObj.isArray()) {
+ // color key mask
+ int i;
+- for (i = 0; i < maskObj.arrayGetLength() && i <
2*gfxColorMaxComps; ++i) {
+- _POPPLER_CALL_ARGS(obj1, maskObj.arrayGet, i);
++ for (i = 0; i < maskObj.getArray()->getLength() && i <
2*gfxColorMaxComps; ++i) {
++ _POPPLER_CALL_ARGS(obj1, maskObj.getArray()->get, i);
+ maskColors[i] = obj1.getInt();
+ _POPPLER_FREE(obj1);
+ }
+@@ -2675,7 +2675,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str,
GBool inlineImg)
+ goto err1;
+ }
+ maskStr = maskObj.getStream();
+- maskDict = maskObj.streamGetDict();
++ maskDict = maskObj.getStream()->getDict();
+ _POPPLER_CALL_ARGS(obj1, maskDict->lookup, "Width");
+ if (obj1.isNull()) {
+ _POPPLER_FREE(obj1);
+@@ -2722,7 +2722,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str,
GBool inlineImg)
+ _POPPLER_CALL_ARGS(obj1, maskDict->lookup, "D");
+ }
+ if (obj1.isArray()) {
+- _POPPLER_CALL_ARGS(obj2, obj1.arrayGet, 0);
++ _POPPLER_CALL_ARGS(obj2, obj1.getArray()->get, 0);
+ if (obj2.isInt() && obj2.getInt() == 1) {
+ maskInvert = gTrue;
+ }
+@@ -2775,7 +2775,7 @@ void PdfParser::doForm(Object *str, double *offset)
+ }
+
+ // get stream dict
+- dict = str->streamGetDict();
++ dict = str->getStream()->getDict();
+
+ // check form type
+ _POPPLER_CALL_ARGS(obj1, dict->lookup, "FormType");
+@@ -2792,7 +2792,7 @@ void PdfParser::doForm(Object *str, double *offset)
+ return;
+ }
+ for (i = 0; i < 4; ++i) {
+- _POPPLER_CALL_ARGS(obj1, bboxObj.arrayGet, i);
++ _POPPLER_CALL_ARGS(obj1, bboxObj.getArray()->get, i);
+ bbox[i] = obj1.getNum();
+ _POPPLER_FREE(obj1);
+ }
+@@ -2802,7 +2802,7 @@ void PdfParser::doForm(Object *str, double *offset)
+ _POPPLER_CALL_ARGS(matrixObj, dict->lookup, "Matrix");
+ if (matrixObj.isArray()) {
+ for (i = 0; i < 6; ++i) {
+- _POPPLER_CALL_ARGS(obj1, matrixObj.arrayGet, i);
++ _POPPLER_CALL_ARGS(obj1, matrixObj.getArray()->get, i);
+ m[i] = obj1.getNum();
+ _POPPLER_FREE(obj1);
+ }
+@@ -3194,10 +3194,10 @@ void PdfParser::loadColorProfile()
+ return;
+
+ Object outputIntents = catDict.dictLookup("OutputIntents");
+- if (!outputIntents.isArray() || outputIntents.arrayGetLength() != 1)
++ if (!outputIntents.isArray() || outputIntents.getArray()->getLength() !=
1)
+ return;
+
+- Object firstElement = outputIntents.arrayGet(0);
++ Object firstElement = outputIntents.getArray()->get(0);
+ if (!firstElement.isDict())
+ return;
+
+@@ -3245,7 +3245,7 @@ void PdfParser::build_annots(const Object &annot, int
page_num)
+ _POPPLER_CALL_ARGS(Rect_obj, annot_dict->lookup, "Rect");
+ if (Rect_obj.isArray()) {
+ for (int i = 0; i < 2; i++) {
+- _POPPLER_CALL_ARGS(xy_obj, Rect_obj.arrayGet, i);
++ _POPPLER_CALL_ARGS(xy_obj, Rect_obj.getArray()->get, i);
+ offset[i] = xy_obj.getNum();
+ }
+ doForm(&first_state_obj, offset);
+diff --git a/src/extension/internal/pdfinput/poppler-transition-api.h
b/src/extension/internal/pdfinput/poppler-transition-api.h
+index bf42f54..058c91f 100644
+--- a/src/extension/internal/pdfinput/poppler-transition-api.h
++++ b/src/extension/internal/pdfinput/poppler-transition-api.h
+@@ -15,6 +15,12 @@
+ #include <glib/poppler-features.h>
+ #include <poppler/UTF.h>
+
++#if POPPLER_CHECK_VERSION(26, 7, 0)
++#define _POPPLER_STRING_26_7 std::string
++#else
++#define _POPPLER_STRING_26_7 GooString
++#endif
++
+ #if POPPLER_CHECK_VERSION(26, 6, 0)
+ #define _POPPLER_GET_GRAY(color, gray) getGray(color, gray)
+ #define _POPPLER_GET_RGB(color, rgb) getRGB(color, rgb)
+diff --git a/src/extension/internal/pdfinput/poppler-utils.cpp
b/src/extension/internal/pdfinput/poppler-utils.cpp
+index 9027362..d084d92 100644
+--- a/src/extension/internal/pdfinput/poppler-utils.cpp
++++ b/src/extension/internal/pdfinput/poppler-utils.cpp
+@@ -186,15 +186,16 @@ void InkFontDict::hashFontObject1(const Object *obj,
FNVHash *h)
+ case objNull:
+ h->hash('z');
+ break;
+- case objArray:
+- h->hash('a');
+- n = obj->arrayGetLength();
+- h->hash((char *)&n, sizeof(int));
+- for (i = 0; i < n; ++i) {
+- const Object &obj2 = obj->arrayGetNF(i);
+- hashFontObject1(&obj2, h);
+- }
+- break;
++ case objArray: {
++ h->hash('a');
++ Array * objArray = obj->getArray();
++ n = objArray->getLength();
++ h->hash((char *)&n, sizeof(int));
++ for (i = 0; i < n; ++i) {
++ const Object &obj2 = objArray->getNF(i);
++ hashFontObject1(&obj2, h);
++ }
++ } break;
+ case objDict: {
+ h->hash('d');
+ auto objdict = obj->getDict();
+@@ -206,8 +207,7 @@ void InkFontDict::hashFontObject1(const Object *obj,
FNVHash *h)
+ const Object &obj2 = objdict->getValNF(i);
+ hashFontObject1(&obj2, h);
+ }
+- }
+- break;
++ } break;
+ case objStream:
+ // this should never happen - streams must be indirect refs
+ break;
+@@ -545,7 +545,7 @@ void _getFontsRecursive(std::shared_ptr<PDFDoc> pdf_doc,
Dict *resources, const
+ continue;
+
+ Ref resourcesRef;
+- const Object resObj = obj2.streamGetDict()->lookup("Resources",
&resourcesRef);
++ const Object resObj =
obj2.getStream()->getDict()->lookup("Resources", &resourcesRef);
+ if (resourcesRef != Ref::INVALID() &&
!visitedObjects.insert(resourcesRef.num).second)
+ continue;
+
+@@ -610,6 +610,11 @@ std::string getString(const GooString *value)
+ return "";
+ }
+
++std::string getString(const GooString &value)
++{
++ return getString(value.toStr());
++}
++
+ /**
+ * Convert PDF strings, which can be formatted as UTF8, UTF16BE or UTF16LE
into
+ * a predictable UTF8 string consistant with svg requirements.
+diff --git a/src/extension/internal/pdfinput/poppler-utils.h
b/src/extension/internal/pdfinput/poppler-utils.h
+index 13123d7..2b1978b 100644
+--- a/src/extension/internal/pdfinput/poppler-utils.h
++++ b/src/extension/internal/pdfinput/poppler-utils.h
+@@ -86,6 +86,7 @@ std::string getDictString(Dict *dict, const char *key);
+ std::string getString(const std::string &value);
+ std::string getString(const std::unique_ptr<GooString> &value);
+ std::string getString(const GooString *value);
++std::string getString(const GooString &value);
+ std::string validateString(std::string const &in);
+
+ // Replacate poppler FontDict
+--
+2.54.0
+
diff --git a/gnu/packages/patches/inkscape-poppler-26-3.patch
b/gnu/packages/patches/inkscape-poppler-26-3.patch
new file mode 100644
index 0000000000..0d2db8e8c9
--- /dev/null
+++ b/gnu/packages/patches/inkscape-poppler-26-3.patch
@@ -0,0 +1,67 @@
+https://gitlab.com/inkscape/inkscape/-/commit/98828255aa0c1212329236b3ff4ac7f41efb4a67.patch
+
+From: Varasina Farmadani <[email protected]>
+Date: Mon, 11 May 2026 02:29:05 +0700
+Subject: [PATCH] fix: support for popler >= 26.05 font encoding change
+
+Poppler version 26.05.0 changed the return type of
+gfx8bit->getEncoding() from char** to const std::array<const char*,256>&.
+this caused a compilation error due to type incompatibility:
+ error: assigning to 'char **' from incompatible type 'const
std::array<const char *, 256>
+ error: no viable conversion from 'const std::array<const char *, 256>' to
'char **'
+---
+ .../pdfinput/poppler-cairo-font-engine.cpp | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+index a022ce63c8..19ebd26693 100644
+--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
++++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+@@ -314,7 +314,11 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont
*gfxFont, XRef *xref, FT_Li
+ #else
+ GfxFontLoc *fontLoc;
+ #endif
++#if POPPLER_CHECK_VERSION(26, 5, 0)
++ const char * const *enc;
++#else
+ char **enc;
++#endif
+ const char *name;
+ #if POPPLER_CHECK_VERSION(25, 7, 0)
+ std::unique_ptr<FoFiType1C> ff1c;
+@@ -386,7 +390,11 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont
*gfxFont, XRef *xref, FT_Li
+ goto err2;
+ }
+
++#if POPPLER_CHECK_VERSION(26, 5, 0)
++ enc = gfx8bit->getEncoding().data();
++#else
+ enc = gfx8bit->getEncoding();
++#endif
+
+ codeToGID.resize(256);
+ for (i = 0; i < 256; ++i) {
+@@ -678,7 +686,7 @@ CairoType3Font *CairoType3Font::create(GfxFont *gfxFont,
PDFDoc *doc, CairoFontE
+ #endif
+
+ std::vector<int> codeToGID;
+- char *name;
++ const char *name;
+
+ Dict *charProcs = gfx8bit->getCharProcs();
+ Ref ref = *gfxFont->getID();
+@@ -695,7 +703,11 @@ CairoType3Font *CairoType3Font::create(GfxFont *gfxFont,
PDFDoc *doc, CairoFontE
+
+ cairo_font_face_set_user_data(font_face, &type3_font_key, (void *)info,
_free_type3_font_info);
+
++#if POPPLER_CHECK_VERSION(26, 5, 0)
++ const char * const *enc = gfx8bit->getEncoding().data();
++#else
+ char **enc = gfx8bit->getEncoding();
++#endif
+ codeToGID.resize(256);
+ for (int i = 0; i < 256; ++i) {
+ codeToGID[i] = 0;
+--
+GitLab
+