Date: Sat, 02 May 2026 12:33:11 +0000 From: Gleb Popov <arrowd@FreeBSD.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org Subject: git: 157bebc46a38 - main - graphics/inkscape: Fix build against newest Poppler Message-ID: <69f5ef07.39f8d.603b302c@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by arrowd: URL: https://cgit.FreeBSD.org/ports/commit/?id=157bebc46a3861cf60d6b9949857e9bf3e85d327 commit 157bebc46a3861cf60d6b9949857e9bf3e85d327 Author: Gleb Popov <arrowd@FreeBSD.org> AuthorDate: 2026-04-17 13:27:51 +0000 Commit: Gleb Popov <arrowd@FreeBSD.org> CommitDate: 2026-05-02 12:32:43 +0000 graphics/inkscape: Fix build against newest Poppler Differential Revision: https://reviews.freebsd.org/D56472 --- ...h-src_extension_internal_pdfinput_pdf-input.cpp | 10 ++ ...-src_extension_internal_pdfinput_pdf-parser.cpp | 170 +++++++++++++++++++++ ...ch-src_extension_internal_pdfinput_pdf-parser.h | 16 ++ ...sion_internal_pdfinput_poppler-transition-api.h | 35 +++++ ...c_extension_internal_pdfinput_poppler-utils.cpp | 121 +++++++++++++++ ...src_extension_internal_pdfinput_poppler-utils.h | 10 ++ ...src_extension_internal_pdfinput_svg-builder.cpp | 72 +++++++++ 7 files changed, 434 insertions(+) diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-input.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-input.cpp new file mode 100644 index 000000000000..abd25bfe474c --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-input.cpp @@ -0,0 +1,10 @@ +--- src/extension/internal/pdfinput/pdf-input.cpp.orig 2025-12-26 00:35:50 UTC ++++ src/extension/internal/pdfinput/pdf-input.cpp +@@ -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 --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.cpp new file mode 100644 index 000000000000..9ca254e2e456 --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.cpp @@ -0,0 +1,170 @@ +--- src/extension/internal/pdfinput/pdf-parser.cpp.orig 2025-12-26 00:35:50 UTC ++++ src/extension/internal/pdfinput/pdf-parser.cpp +@@ -653,7 +653,11 @@ void PdfParser::opSetLineJoin(Object args[], int /*num + 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 /*numA + 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 @@ void PdfParser::doShadingPatternFillFallback(GfxShadin + + // 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 @@ void PdfParser::opShFill(Object args[], int /*numArgs* + // 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 @@ void PdfParser::opShowSpaceText(Object args[], int /*n + { + 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 @@ void PdfParser::opShowSpaceText(Object args[], int /*n + 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 { +@@ -2248,15 +2268,11 @@ void PdfParser::opShowSpaceText(Object args[], int /*n + * This adds a string from a PDF file that is contained in one command ('Tj', ''', '"') + * or is one string in ShowSpacetext ('TJ'). + */ +-#if POPPLER_CHECK_VERSION(0,64,0) +-void PdfParser::doShowText(const GooString *s) { +-#else +-void PdfParser::doShowText(GooString *s) { +-#endif ++void PdfParser::doShowText(const std::string &s) { + 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)); ++ builder->beginString(state, s.size()); + + // handle a Type 3 char + if (font->getType() == fontType3) { +@@ -2266,8 +2282,8 @@ void PdfParser::doShowText(GooString *s) { + double riseX, riseY; + state->textTransformDelta(0, state->getRise(), &riseX, &riseY); + +- auto p = s->getCString(); // char* or const char* +- int len = get_goostring_length(*s); ++ auto p = s.c_str(); // char* or const char* ++ int len = s.size(); + + while (len > 0) { + +@@ -2289,7 +2305,7 @@ void PdfParser::doShowText(GooString *s) { + 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 == ' ') { +@@ -2324,7 +2340,16 @@ void PdfParser::doShowText(GooString *s) { + builder->endString(state); + } + ++#if POPPLER_CHECK_VERSION(0,64,0) ++void PdfParser::doShowText(const GooString *s) { ++#else ++void PdfParser::doShowText(GooString *s) { ++#endif ++ const std::string str = s->toStr(); ++ doShowText(str); ++} + ++ + //------------------------------------------------------------------------ + // XObject operators + //------------------------------------------------------------------------ +@@ -2931,7 +2956,11 @@ Stream *PdfParser::buildImageStream() { + + // 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 +2993,11 @@ Stream *PdfParser::buildImageStream() { + // 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 +3170,17 @@ void PdfParser::loadOptionalContentLayers(Dict *resour + 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 --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.h b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.h new file mode 100644 index 000000000000..ac804328a447 --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.h @@ -0,0 +1,16 @@ +--- src/extension/internal/pdfinput/pdf-parser.h.orig 2025-12-26 00:35:50 UTC ++++ src/extension/internal/pdfinput/pdf-parser.h +@@ -283,10 +283,11 @@ class PdfParser { (private) + void opMoveShowText(Object args[], int numArgs); + void opMoveSetShowText(Object args[], int numArgs); + void opShowSpaceText(Object args[], int numArgs); ++ void doShowText(const std::string &s); + #if POPPLER_CHECK_VERSION(0,64,0) +- void doShowText(const GooString *s); ++ void doShowText(const GooString *s); + #else +- void doShowText(GooString *s); ++ void doShowText(GooString *s); + #endif + + diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-transition-api.h b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-transition-api.h new file mode 100644 index 000000000000..3fa68e14a4de --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-transition-api.h @@ -0,0 +1,35 @@ +--- src/extension/internal/pdfinput/poppler-transition-api.h.orig 2025-07-25 10:14:52 UTC ++++ src/extension/internal/pdfinput/poppler-transition-api.h +@@ -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) +@@ -62,11 +72,11 @@ + #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())) ++#define _POPPLER_HAS_UNICODE_BOM(value) (hasUnicodeByteOrderMark(value)) ++#define _POPPLER_HAS_UNICODE_BOMLE(value) (hasUnicodeByteOrderMarkLE(value)) + #else +-#define _POPPLER_HAS_UNICODE_BOM(value) (value->hasUnicodeMarker()) +-#define _POPPLER_HAS_UNICODE_BOMLE(value) (value->hasUnicodeMarkerLE()) ++#define _POPPLER_HAS_UNICODE_BOM(value) (GooString(value).hasUnicodeMarker()) ++#define _POPPLER_HAS_UNICODE_BOMLE(value) (GooString(value).hasUnicodeMarkerLE()) + #endif + + #if POPPLER_CHECK_VERSION(24, 3, 0) diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.cpp new file mode 100644 index 000000000000..c977dd750b4b --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.cpp @@ -0,0 +1,121 @@ +--- src/extension/internal/pdfinput/poppler-utils.cpp.orig 2025-12-26 00:35:50 UTC ++++ src/extension/internal/pdfinput/poppler-utils.cpp +@@ -16,6 +16,7 @@ + #include <poppler/GfxFont.h> + #include <poppler/GfxState.h> + #include <poppler/PDFDoc.h> ++#include <poppler/PDFDocEncoding.h> + #include <poppler/UTF.h> + + #include "libnrtype/font-factory.h" +@@ -88,7 +89,11 @@ InkFontDict::InkFontDict(XRef *xref, Ref *fontDictRef, + 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; + } +@@ -145,7 +150,6 @@ void InkFontDict::hashFontObject1(const Object *obj, F + + void InkFontDict::hashFontObject1(const Object *obj, FNVHash *h) + { +- const GooString *s; + const char *p; + double r; + int n, i; +@@ -165,11 +169,16 @@ void InkFontDict::hashFontObject1(const Object *obj, F + r = obj->getReal(); + h->hash((char *)&r, sizeof(double)); + break; +- case objString: ++ case objString: { + h->hash('s'); +- s = obj->getString(); ++#if POPPLER_CHECK_VERSION(26, 4, 0) ++ const auto &s = obj->getString(); ++ h->hash(s.c_str(), s.size()); ++#else ++ const GooString* s = obj->getString(); + h->hash(s->c_str(), get_goostring_length(*s)); +- break; ++#endif ++ } break; + case objName: + h->hash('n'); + p = obj->getName(); +@@ -586,20 +595,52 @@ std::string getDictString(Dict *dict, const char *key) + return getString(obj.getString()); + } + ++std::string getString(const std::unique_ptr<GooString> &value) ++{ ++ return getString(value.get()); ++} ++ ++std::string getString(const GooString *value) ++{ ++ if (value) { ++ return getString(value->toStr()); ++ } ++ return ""; ++} ++ + /** + * Convert PDF strings, which can be formatted as UTF8, UTF16BE or UTF16LE into + * a predictable UTF8 string consistant with svg requirements. + */ +-std::string getString(const GooString *value) ++std::string getString(const std::string &value) + { ++ char *str = nullptr; ++ int stringLength; ++ + if (_POPPLER_HAS_UNICODE_BOM(value)) { +- return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2, +- "UTF-8", "UTF-16BE", NULL, NULL, NULL); ++ str = g_convert(value.c_str() + 2, value.size() - 2, ++ "UTF-8", "UTF-16BE", NULL, NULL, NULL); + } else if (_POPPLER_HAS_UNICODE_BOMLE(value)) { +- return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2, +- "UTF-8", "UTF-16LE", NULL, NULL, NULL); ++ str = g_convert(value.c_str() + 2, value.size() - 2, ++ "UTF-8", "UTF-16LE", NULL, NULL, NULL); + } +- return value->toStr(); ++#if POPPLER_CHECK_VERSION(25,02,0) ++ else if (auto utf16 = pdfDocEncodingToUTF16(value); !utf16.empty()) { ++ str = g_convert(utf16.c_str(), utf16.length(), "UTF-8", "UTF-16", NULL, NULL, NULL); ++ } ++#else ++ else if (auto utf16 = pdfDocEncodingToUTF16(value, &stringLength)) { ++ str = g_convert(utf16, stringLength, "UTF-8", "UTF-16", NULL, NULL, NULL); ++ delete[] utf16; ++ } ++#endif ++ if (str) { ++ std::string copy = str; ++ g_free(str); ++ return copy; ++ } ++ g_warning("Couldn't parse text in PDF from UTF16."); ++ return ""; + } + + void pdf_debug_array(const Array *array, int depth, XRef *xref) +@@ -656,7 +697,11 @@ void pdf_debug_object(const Object *obj, int depth, XR + } else if (obj->isArray()) { + pdf_debug_array(obj->getArray(), depth, xref); + } else if (obj->isString()) { ++#if POPPLER_CHECK_VERSION(26, 4, 0) ++ std::cout << " STR '" << obj->getString().c_str() << "'"; ++#else + std::cout << " STR '" << obj->getString()->getCString() << "'"; ++#endif + } else if (obj->isName()) { + std::cout << " NAME '" << obj->getName() << "'"; + } else if (obj->isBool()) { diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.h b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.h new file mode 100644 index 000000000000..4891598339b7 --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.h @@ -0,0 +1,10 @@ +--- src/extension/internal/pdfinput/poppler-utils.h.orig 2025-12-26 00:35:50 UTC ++++ src/extension/internal/pdfinput/poppler-utils.h +@@ -83,6 +83,7 @@ std::string getDictString(Dict *dict, const char *key) + FontList getPdfFonts(std::shared_ptr<PDFDoc> pdf_doc); + std::string getNameWithoutSubsetTag(std::string name); + std::string getDictString(Dict *dict, const char *key); ++std::string getString(const std::string &value); + std::string getString(const GooString *value); + std::string validateString(std::string const &in); + diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_svg-builder.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_svg-builder.cpp new file mode 100644 index 000000000000..424efbc134d9 --- /dev/null +++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_svg-builder.cpp @@ -0,0 +1,72 @@ +--- src/extension/internal/pdfinput/svg-builder.cpp.orig 2025-12-26 00:35:50 UTC ++++ src/extension/internal/pdfinput/svg-builder.cpp +@@ -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 @@ void SvgBuilder::updateFont(GfxState *state, std::shar + 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, doub + */ + 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 @@ Inkscape::XML::Node* SvgBuilder::_flushTextText(GfxSta + + // 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 @@ Inkscape::XML::Node* SvgBuilder::_flushTextText(GfxSta + 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 @@ Inkscape::XML::Node *SvgBuilder::_createImage(Stream * + } 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 @@ Inkscape::XML::Node *SvgBuilder::_createImage(Stream * + 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];home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69f5ef07.39f8d.603b302c>
