# --- T2-COPYRIGHT-BEGIN --- # t2/package/*/inkscape/hotfix-poppler.patch # Copyright (C) 2025 The T2 SDE Project # SPDX-License-Identifier: GPL-2.0 or patched project license # --- T2-COPYRIGHT-END --- From 93ab3204674e548df3f7bac39a86420eab616ed3 Mon Sep 17 00:00:00 2001 From: Rafael Siejakowski Date: Sun, 8 Jun 2025 21:30:44 +0200 Subject: [PATCH 1/3] Fix build against Poppler 25.06 Accommodate for the private API change, whereby an array of pointers has been replaced with a vector of unique_ptr. From https://gitlab.com/inkscape/inkscape/-/merge_requests/7264 Backported from MR 7261 https://gitlab.com/inkscape/inkscape/-/merge_requests/7261 Fixes https://gitlab.com/inkscape/inkscape/-/issues/5836 --- .../internal/pdfinput/pdf-parser.cpp | 23 +++++++++++-------- .../pdfinput/poppler-transition-api.h | 12 ++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index 01d7bf6ef0..0d31eda16f 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include // std::call_once() #include #include @@ -686,7 +687,6 @@ void PdfParser::opSetLineWidth(Object args[], int /*numArgs*/) 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 args[], int /*numArgs*/) 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("Default")) || obj2.isName(const_cast("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 args[], int /*numArgs*/) } _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 args[], int /*numArgs*/) 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 args[], int /*numArgs*/) } } } - 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 --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h index a67132ba6b..d04412757b 100644 --- a/src/extension/internal/pdfinput/poppler-transition-api.h +++ b/src/extension/internal/pdfinput/poppler-transition-api.h @@ -15,6 +15,18 @@ #include #include +#if POPPLER_CHECK_VERSION(25, 6, 0) +#define _POPPLER_DECLARE_TRANSFER_FUNCTION_VECTOR(name) std::vector> 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() -- 2.49.1 From cf40b0201d18aeb8a0800524eccd93ececc79bda Mon Sep 17 00:00:00 2001 From: KrIr17 Date: Sun, 6 Jul 2025 15:42:13 +0200 Subject: [PATCH 2/3] 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 https://gitlab.com/inkscape/inkscape/-/merge_requests/7321 --- 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 0d31eda16f..829c3096f4 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -2315,11 +2315,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 5e1a642625..c2bf90732c 100644 --- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp +++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp @@ -318,7 +318,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 ff1c; +#else FoFiType1C *ff1c; +#endif std::optional font_face; std::vector codeToGID; bool substitute = false; @@ -429,7 +433,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); } @@ -459,7 +463,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); } @@ -493,7 +497,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()); } @@ -506,7 +510,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 } } @@ -542,13 +548,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 d04412757b..866b630bb6 100644 --- a/src/extension/internal/pdfinput/poppler-transition-api.h +++ b/src/extension/internal/pdfinput/poppler-transition-api.h @@ -15,6 +15,20 @@ #include #include +#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> name(4) #define _POPPLER_DELETE_TRANSFER_FUNCTION(name) name.reset() -- 2.49.1 From acaa8d8d8fca9d7b3ed7f581067dc863012c3522 Mon Sep 17 00:00:00 2001 From: mike kowalski Date: Tue, 2 Sep 2025 07:17:25 -0700 Subject: [PATCH 3/3] Fix build with poppler 25.09.0 API changes: double* -> std::array necessitates fixes in Inkscape. The goal is to make it build with older poppler versions too. --- src/extension/internal/pdfinput/pdf-parser.cpp | 3 +-- src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp | 2 +- src/extension/internal/pdfinput/poppler-utils.cpp | 4 ++++ src/extension/internal/pdfinput/poppler-utils.h | 4 ++++ src/extension/internal/pdfinput/svg-builder.cpp | 4 ++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index 829c3096f4..ed8e5c6ab5 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -1652,12 +1652,11 @@ void PdfParser::doFunctionShFill1(GfxFunctionShading *shading, GfxColor color0M, color1M, colorM0, colorM1, colorMM; GfxColor colors2[4]; double functionColorDelta = colorDeltas[pdfFunctionShading-1]; - const double *matrix; double xM, yM; int nComps, i, j; nComps = shading->getColorSpace()->getNComps(); - matrix = shading->getMatrix(); + const auto& matrix = shading->getMatrix(); // compare the four corner colors for (i = 0; i < 4; ++i) { diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp index c2bf90732c..b53c3cd886 100644 --- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp +++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp @@ -635,7 +635,7 @@ static cairo_status_t _init_type3_glyph(cairo_scaled_font_t *scaled_font, cairo_ info = (type3_font_info_t *)cairo_font_face_get_user_data(cairo_scaled_font_get_font_face(scaled_font), &type3_font_key); - const double *mat = info->font->getFontBBox(); + const auto& mat = info->font->getFontBBox(); extents->ascent = mat[3]; /* y2 */ extents->descent = -mat[3]; /* -y1 */ extents->height = extents->ascent + extents->descent; diff --git a/src/extension/internal/pdfinput/poppler-utils.cpp b/src/extension/internal/pdfinput/poppler-utils.cpp index ad0dd236a2..5067a6c245 100644 --- a/src/extension/internal/pdfinput/poppler-utils.cpp +++ b/src/extension/internal/pdfinput/poppler-utils.cpp @@ -38,6 +38,10 @@ Geom::Affine ctmToAffine(const double *ctm) return Geom::Affine(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]); } +Geom::Affine ctmToAffine(const std::array& ctm) { + return ctmToAffine(ctm.data()); +} + void ctmout(const char *label, const double *ctm) { std::cout << "C:" << label << ":" << ctm[0] << "," << ctm[1] << "," << ctm[2] << "," << ctm[3] << "," << ctm[4] diff --git a/src/extension/internal/pdfinput/poppler-utils.h b/src/extension/internal/pdfinput/poppler-utils.h index 2bcd307e17..e51d6a9da3 100644 --- a/src/extension/internal/pdfinput/poppler-utils.h +++ b/src/extension/internal/pdfinput/poppler-utils.h @@ -13,6 +13,7 @@ #ifndef POPPLER_UTILS_H #define POPPLER_UTILS_H +#include #include #include #include @@ -36,7 +37,10 @@ class Ref; class XRef; Geom::Affine stateToAffine(GfxState *state); +// this function is for Poppler older than v25.09.0 Geom::Affine ctmToAffine(const double *ctm); +// this flavor is for Poppler v25.09.0 and above +Geom::Affine ctmToAffine(const std::array& ctm); void ctmout(const char *label, const double *ctm); void affout(const char *label, Geom::Affine affine); diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp index a74147d074..167ad2d4de 100644 --- a/src/extension/internal/pdfinput/svg-builder.cpp +++ b/src/extension/internal/pdfinput/svg-builder.cpp @@ -1025,7 +1025,7 @@ gchar *SvgBuilder::_createTilingPattern(GfxTilingPattern *tiling_pattern, pattern_node->setAttribute("patternUnits", "userSpaceOnUse"); // Set pattern tiling // FIXME: don't ignore XStep and YStep - const double *bbox = tiling_pattern->getBBox(); + const auto& bbox = tiling_pattern->getBBox(); pattern_node->setAttributeSvgDouble("x", 0.0); pattern_node->setAttributeSvgDouble("y", 0.0); pattern_node->setAttributeSvgDouble("width", bbox[2] - bbox[0]); @@ -1255,7 +1255,7 @@ void SvgBuilder::updateFont(GfxState *state, std::shared_ptr cairo_fo auto new_font_size = state->getFontSize(); if (font->getType() == fontType3) { - const double *font_matrix = font->getFontMatrix(); + const auto& font_matrix = font->getFontMatrix(); if (font_matrix[0] != 0.0) { new_font_size *= font_matrix[3] / font_matrix[0]; } -- 2.49.1 From 4dba481fe898c6317696d50b109f5aed8f269c19 Mon Sep 17 00:00:00 2001 From: mike kowalski Date: Sun, 12 Oct 2025 10:04:22 -0700 Subject: [PATCH] Replace getLength() with size() on a GooString (Poppler) GooString in poppler no longer defines getLength() method. Call size() from base string directly. (cherry picked from commit ace884e13e413b0cc49ece80936584ef92c986f5) --- src/extension/internal/pdfinput/pdf-parser.cpp | 4 ++-- src/extension/internal/pdfinput/poppler-utils.cpp | 6 +++--- src/extension/internal/pdfinput/poppler-utils.h | 9 +++++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index 0d62c20875..ba6c448513 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -2256,7 +2256,7 @@ void PdfParser::doShowText(GooString *s) { auto font = state->getFont(); int wMode = font->getWMode(); // Vertical/Horizontal/Invalid - builder->beginString(state, s->getLength()); + builder->beginString(state, get_goostring_length(*s)); // handle a Type 3 char if (font->getType() == fontType3) { @@ -2267,7 +2267,7 @@ void PdfParser::doShowText(GooString *s) { state->textTransformDelta(0, state->getRise(), &riseX, &riseY); auto p = s->getCString(); // char* or const char* - int len = s->getLength(); + int len = get_goostring_length(*s); while (len > 0) { diff --git a/src/extension/internal/pdfinput/poppler-utils.cpp b/src/extension/internal/pdfinput/poppler-utils.cpp index 8110a3e085..cef753dab8 100644 --- a/src/extension/internal/pdfinput/poppler-utils.cpp +++ b/src/extension/internal/pdfinput/poppler-utils.cpp @@ -168,7 +168,7 @@ void InkFontDict::hashFontObject1(const Object *obj, FNVHash *h) case objString: h->hash('s'); s = obj->getString(); - h->hash(s->c_str(), s->getLength()); + h->hash(s->c_str(), get_goostring_length(*s)); break; case objName: h->hash('n'); @@ -586,10 +586,10 @@ std::string getDictString(Dict *dict, const char *key) std::string getString(const GooString *value) { if (_POPPLER_HAS_UNICODE_BOM(value)) { - return g_convert(value->getCString () + 2, value->getLength () - 2, + return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2, "UTF-8", "UTF-16BE", NULL, NULL, NULL); } else if (_POPPLER_HAS_UNICODE_BOMLE(value)) { - return g_convert(value->getCString () + 2, value->getLength () - 2, + return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2, "UTF-8", "UTF-16LE", NULL, NULL, NULL); } return value->toStr(); diff --git a/src/extension/internal/pdfinput/poppler-utils.h b/src/extension/internal/pdfinput/poppler-utils.h index e51d6a9da3..15b5ed81e7 100644 --- a/src/extension/internal/pdfinput/poppler-utils.h +++ b/src/extension/internal/pdfinput/poppler-utils.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "poppler-transition-api.h" @@ -104,4 +105,12 @@ private: void hashFontObject1(const Object *obj, FNVHash *h); }; +inline size_t get_goostring_length(const GooString& str) { +#if POPPLER_CHECK_VERSION(25, 10, 0) + return str.size(); +#else + return str.getLength(); +#endif +} + #endif /* POPPLER_UTILS_H */ -- GitLab