inkscape: update to 1.4.2

This commit is contained in:
Mateusz Sylwestrzak 2025-06-21 19:40:39 +02:00 committed by Duncan Overbruck
parent d7975b7d49
commit 7e868cdc1f
8 changed files with 398 additions and 958 deletions

View file

@ -1,59 +0,0 @@
From 0399372ec240d23e0e70548237a541f2b5bf0f34 Mon Sep 17 00:00:00 2001
From: KrIr17 <elendil.krir17@gmail.com>
Date: Tue, 5 Nov 2024 00:40:15 +0100
Subject: [PATCH] Fix building with Poppler 24.11
Poppler 24.11 no longer sets the default value for faceIndex to 0 in
`FoFiTrueType::make()` and `FoFiTrueType::load()` [1], so we do it
on our end instead.
Fixes https://gitlab.com/inkscape/inkscape/-/issues/5370
[1] https://gitlab.freedesktop.org/poppler/poppler/-/commit/94467509a013dd5cf46c942baa598f2b296571f4
---
.../internal/pdfinput/poppler-cairo-font-engine.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
index 34a8eed682d..728b1d1aac4 100644
--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
@@ -419,9 +419,9 @@ 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());
+ 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;
@@ -444,9 +444,9 @@ 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());
+ 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");
@@ -512,9 +512,9 @@ 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());
+ 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()) {
--
GitLab

View file

@ -1,430 +0,0 @@
From 22304ae8034d067670a9f95022083a75fac92b4c Mon Sep 17 00:00:00 2001
From: PBS <pbs3141@gmail.com>
Date: Tue, 22 Oct 2024 14:48:31 +0100
Subject: [PATCH] Future-proof against poppler 24.10 changes
---
.../internal/pdfinput/pdf-parser.cpp | 120 ++++++++----------
src/extension/internal/pdfinput/pdf-parser.h | 4 +-
.../pdfinput/poppler-transition-api.h | 6 +
3 files changed, 61 insertions(+), 69 deletions(-)
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 97b2909218a..28000a87b0c 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -817,11 +817,11 @@ 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()) {
- 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()) {
@@ -842,7 +842,7 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/)
}
}
}
- 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];
}
@@ -927,9 +927,6 @@ void PdfParser::doSoftMask(Object *str, GBool alpha,
alpha, transferFunc, backdropColor);
--formDepth;
- if (blendingColorSpace) {
- delete blendingColorSpace;
- }
_POPPLER_FREE(obj1);
}
@@ -946,42 +943,43 @@ void PdfParser::opSetRenderingIntent(Object /*args*/[], int /*numArgs*/)
*
* 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:
@@ -990,7 +988,7 @@ void PdfParser::opSetFillGray(Object args[], int /*numArgs*/)
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);
@@ -1002,7 +1000,7 @@ void PdfParser::opSetStrokeGray(Object args[], int /*numArgs*/)
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);
@@ -1015,7 +1013,7 @@ void PdfParser::opSetFillCMYKColor(Object args[], int /*numArgs*/)
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());
}
@@ -1029,7 +1027,7 @@ void PdfParser::opSetStrokeCMYKColor(Object args[], int /*numArgs*/)
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());
}
@@ -1043,7 +1041,7 @@ void PdfParser::opSetFillRGBColor(Object args[], int /*numArgs*/)
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());
}
@@ -1056,7 +1054,7 @@ void PdfParser::opSetStrokeRGBColor(Object args[], int /*numArgs*/) {
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());
}
@@ -1068,14 +1066,14 @@ void PdfParser::opSetStrokeRGBColor(Object args[], int /*numArgs*/) {
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 {
@@ -1089,14 +1087,14 @@ void PdfParser::opSetStrokeColorSpace(Object args[], int numArgs)
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 {
@@ -1159,7 +1157,7 @@ void PdfParser::opSetFillColorN(Object args[], int numArgs) {
builder->updateStyle(state);
}
if (auto pattern = lookupPattern(&(args[numArgs - 1]), state)) {
- state->setFillPattern(pattern);
+ state->setFillPattern(_POPPLER_CONSUME_UNIQPTR_ARG(pattern));
builder->updateStyle(state);
}
@@ -1202,7 +1200,7 @@ void PdfParser::opSetStrokeColorN(Object args[], int numArgs) {
builder->updateStyle(state);
}
if (auto pattern = lookupPattern(&(args[numArgs - 1]), state)) {
- state->setStrokePattern(pattern);
+ state->setStrokePattern(_POPPLER_CONSUME_UNIQPTR_ARG(pattern));
builder->updateStyle(state);
}
@@ -1579,11 +1577,11 @@ void PdfParser::doShadingPatternFillFallback(GfxShadingPattern *sPat,
// 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;
}
@@ -1615,19 +1613,19 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/)
// 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;
}
@@ -1636,8 +1634,6 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/)
restoreState();
state->setPath(savedPath);
}
-
- delete shading;
}
void PdfParser::doFunctionShFill(GfxFunctionShading *shading) {
@@ -2528,7 +2524,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
} 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);
@@ -2537,13 +2533,11 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
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) {
@@ -2554,10 +2548,9 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
_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;
}
@@ -2568,7 +2561,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
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;
@@ -2624,7 +2617,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
_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;
@@ -2634,10 +2627,9 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
_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
@@ -2718,17 +2710,15 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
// 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);
@@ -2746,7 +2736,6 @@ void PdfParser::doForm(Object *str, double *offset)
{
Dict *dict;
GBool transpGroup, isolated, knockout;
- GfxColorSpace *blendingColorSpace;
Object matrixObj, bboxObj;
double m[6], bbox[4];
Object resObj;
@@ -2812,12 +2801,12 @@ void PdfParser::doForm(Object *str, double *offset)
// 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()) {
@@ -2835,12 +2824,9 @@ void PdfParser::doForm(Object *str, double *offset)
// 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 --git a/src/extension/internal/pdfinput/pdf-parser.h b/src/extension/internal/pdfinput/pdf-parser.h
index c7c10caefed..8325ea24364 100644
--- a/src/extension/internal/pdfinput/pdf-parser.h
+++ b/src/extension/internal/pdfinput/pdf-parser.h
@@ -137,7 +137,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();
@@ -176,7 +176,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 --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h
index 481aefadf46..8f03aa17779 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(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()))
--
GitLab

View file

@ -1,39 +0,0 @@
From 874dcfbd303bc7a1bddb6f34aebbb4dba8eda771 Mon Sep 17 00:00:00 2001
From: Rafael Siejakowski <rs@rs-math.net>
Date: Sun, 10 Nov 2024 13:20:48 +0100
Subject: [PATCH] Fix Poppler private includes
In the PDF parser, include the Poppler private headers using
the angular brackets and the poppler/ directory prefix, as is
done in other places in the code which need Poppler's private
headers.
This fixes build against Poppler installed at a custom path.
---
src/extension/internal/pdfinput/pdf-parser.h | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/extension/internal/pdfinput/pdf-parser.h b/src/extension/internal/pdfinput/pdf-parser.h
index 8325ea24364..7d9189dfc0a 100644
--- a/src/extension/internal/pdfinput/pdf-parser.h
+++ b/src/extension/internal/pdfinput/pdf-parser.h
@@ -24,13 +24,12 @@
#pragma interface
#endif
-#include "glib/poppler-features.h"
-#include "Object.h"
-
+#include <2geom/affine.h>
+#include <glib/poppler-features.h>
#include <map>
#include <memory>
+#include <poppler/Object.h>
#include <string>
-#include <2geom/affine.h>
#define Operator Operator_Gfx
#include <poppler/Gfx.h>
--
GitLab

View file

@ -1,53 +0,0 @@
From c9046810d899a408bfbd489aad91872b1203ee6d Mon Sep 17 00:00:00 2001
From: KrIr17 <elendil.krir17@gmail.com>
Date: Thu, 5 Dec 2024 15:03:47 +0100
Subject: [PATCH] Fix building with poppler 24.12.0
Fixes https://gitlab.com/inkscape/inkscape/-/issues/5415
---
src/extension/internal/pdfinput/pdf-parser.cpp | 4 +++-
src/extension/internal/pdfinput/poppler-transition-api.h | 6 ++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 28000a87b0c..9ea30b90a48 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -2403,6 +2403,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
int bits;
GBool interpolate;
StreamColorSpaceMode csMode;
+ GBool hasAlpha;
GBool mask;
GBool invert;
Object maskObj, smaskObj;
@@ -2414,7 +2415,8 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg)
// get info from the stream
bits = 0;
csMode = streamCSNone;
- str->getImageParams(&bits, &csMode);
+ hasAlpha = false;
+ str->_POPPLER_GET_IMAGE_PARAMS(&bits, &csMode, &hasAlpha);
// get stream dict
dict = str->getDict();
diff --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h
index 8f03aa17779..b7a54828e74 100644
--- a/src/extension/internal/pdfinput/poppler-transition-api.h
+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
@@ -39,6 +39,12 @@
#define _POPPLER_FUNCTION_TYPE_STITCHING 3
#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(22, 4, 0)
#define _POPPLER_FONTPTR_TO_GFX8(font_ptr) ((Gfx8BitFont *)font_ptr.get())
#else
--
GitLab

View file

@ -1,195 +0,0 @@
From 6c330d56fdf54cb002b8a84b33f73d2a8dd40879 Mon Sep 17 00:00:00 2001
From: Tavmjong Bah <tavmjong@free.fr>
Date: Fri, 8 Nov 2024 15:03:12 +0100
Subject: [PATCH] Fixes two problems related to emojis in PDF import.
1. UTF-8 conversion.
If a "ToUnicode" table is included in an OpenType font in a PDF
file, one can find the Unicode code point that corresponds to a
given glyph (or group of glyphs). This is often the only way one
can reconstruct text from a PDF (which might contain only glyphs
and glyph positions). For Emoji, the code points are outside the
"Basic Plane" (code points that can be encode by four or fewer
hexadecimal digits) and in are located the "Supplementary
Multilingual Plane", a.k.a. "Plane 1". Code points in "Plane 1" are
represented by a hexadecimal number of the form "1xxxx", where 'x'
is any hex digit.
Inkscape's PDF import code takes a Unicode code point and converts
it to its UTF-8 representation. This code assumes that the code
point can be represented by a gunichar2 which is typedef'ed from a
guint16. The glib function g_utf16_to_utf8 is then used for the
conversion. This in incorrect: a single guint16 can only represent
a 4 hex-digit code point and then not all possible values (some
values are used to indicate that a second 16-bit value is being used
to to enable encoding a code point outside the basic plane).
We already use std::wstring_convert<> and std::codecvt<> earlier in
the same function to build up a string to store the original text
in the 'aria-label' attribute. I changed the code to reuse that
result. Note that these are deprecated and will be removed in C++26
so we'll eventually need to find a different solution.
2. Empty paths.
Emoji fonts usually have color. There are four competing methods of
embedding color font data in an OpenType font. Two of these use
bitmaps. If a font has only bitmap glyph data then there is no
vector data to build a path. If there is no path, Inkscape's
current code returns 'nullptr' instead of a pointer to a Path
node. This triggers an assert. Simply removing the assert leads to
other problems down the line. The simplest solution is to return a
Path node with an empty "d" attribute. This also allows one to
store the original text in the "aria-label" attribute of the Path
node.
In the future, we should be able to render bitmaps from fonts in
the same way the same way that we render SVG OpenType fonts (which
caches the glyphs as bitmaps).
Unfixed problems:
If the "Noto-Color-Emoji" font is present, it will be used for
rendering emoji even if "Noto-Emoji" or "Symbola" is specified. It
will also be used as a fallback font for rendering emoji.
"Noto-Color-Emoji" has to "glyf" table and thus lacks vectorized
paths. This leads to empty paths. It would be good to block the use
of "Noto-Color-Emoji" in this case. It's not clear how easy it
would be to do this.
What is even stranger is that the terminal will not show an Emoji
if "Noto-Color-Emoji" is not installed even though the glyph that
is shown is not from "Noto-Color-Emoji"! (It's from "Symbola".)
There appears to be incorrect logic in SvgBuider::_flushTextPath().
If the style changes inside the function, the node existing node is
replaced, effectively orphaning the previous node. Whether this
actually happens in PDF input is unknown.
---
.../internal/pdfinput/svg-builder.cpp | 54 +++++++++----------
1 file changed, 26 insertions(+), 28 deletions(-)
diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp
index 73f57f04952..bb2ce5145e8 100644
--- a/src/extension/internal/pdfinput/svg-builder.cpp
+++ b/src/extension/internal/pdfinput/svg-builder.cpp
@@ -1250,7 +1250,7 @@ void SvgBuilder::updateFont(GfxState *state, std::shared_ptr<CairoFont> cairo_fo
TRACE(("updateFont()\n"));
updateTextMatrix(state, flip); // Ensure that we have a text matrix built
- auto font = state->getFont();
+ auto font = state->getFont(); // GfxFont
auto font_id = font->getID()->num;
auto new_font_size = state->getFontSize();
@@ -1711,6 +1711,10 @@ void SvgBuilder::_setTextStyle(Inkscape::XML::Node *node, GfxState *state, SPCSS
/**
* Renders the text as a path object using cairo and returns the node object.
*
+ * If the path is empty (e.g. due to trying to render a color bitmap font),
+ * return path node with empty "d" attribute. The aria attribute will still
+ * contain the original text.
+ *
* cairo_font - The font that cairo can use to convert text to path.
* font_size - The size of the text when drawing the path.
* transform - The matrix which will place the text on the page, this is critical
@@ -1722,8 +1726,13 @@ Inkscape::XML::Node *SvgBuilder::_renderText(std::shared_ptr<CairoFont> cairo_fo
const Geom::Affine &transform,
cairo_glyph_t *cairo_glyphs, unsigned int count)
{
- if (!cairo_glyphs || !cairo_font || _aria_label.empty())
- return nullptr;
+ Inkscape::XML::Node *path = _addToContainer("svg:path");
+ path->setAttribute("d", "");
+
+ if (!cairo_glyphs || !cairo_font || _aria_label.empty()) {
+ std::cerr << "SvgBuilder::_renderText: Invalid argument!" << std::endl;
+ return path;
+ }
// The surface isn't actually used, no rendering in cairo takes place.
cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, _width, _height);
@@ -1738,16 +1747,17 @@ Inkscape::XML::Node *SvgBuilder::_renderText(std::shared_ptr<CairoFont> cairo_fo
// Failing to render text.
if (!pathv) {
- g_warning("Failed to render PDF text!");
- return nullptr;
+ std::cerr << "SvgBuilder::_renderText: Failed to render PDF text! " << _aria_label << std::endl;
+ return path;
}
auto textpath = sp_svg_write_path(*pathv);
- if (textpath.empty())
- return nullptr;
-
- Inkscape::XML::Node *path = _addToContainer("svg:path");
path->setAttribute("d", textpath);
+
+ if (textpath.empty()) {
+ std::cerr << "SvgBuilder::_renderText: Empty path! " << _aria_label << std::endl;
+ }
+
return path;
}
@@ -1785,7 +1795,7 @@ void SvgBuilder::endString(GfxState *state)
* dx, dy: Advance of glyph.
* originX, originY
* code: 8-bit char code, 16 bit CID, or Unicode of glyph.
- * u: Unicode mapping of character.
+ * u: Unicode mapping of character. "Unicode" is an unsigned int.
*/
void SvgBuilder::addChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY,
CharCode code, int /*nBytes*/, Unicode const *u, int uLen)
@@ -1801,9 +1811,13 @@ void SvgBuilder::addChar(GfxState *state, double x, double y, double dx, double
}
_aria_space = false;
+ std::string utf8_code;
static std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv1;
+ // Note std::wstring_convert and std::codecvt_utf are deprecated and will be removed in C++26.
if (u) {
- _aria_label += conv1.to_bytes(*u);
+ // 'u' maybe null if there is not a "ToUnicode" table in the PDF!
+ utf8_code = conv1.to_bytes(*u);
+ _aria_label += utf8_code;
}
// Skip control characters, found in LaTeX generated PDFs
@@ -1835,6 +1849,7 @@ void SvgBuilder::addChar(GfxState *state, double x, double y, double dx, double
}
SvgGlyph new_glyph;
+ new_glyph.code = utf8_code;
new_glyph.is_space = is_space;
new_glyph.delta = delta;
new_glyph.position = Geom::Point( x - originX, y - originY );
@@ -1849,23 +1864,6 @@ void SvgBuilder::addChar(GfxState *state, double x, double y, double dx, double
}
_text_position += delta;
- // Convert the character to UTF-8 since that's our SVG document's encoding
- {
- gunichar2 uu[8] = {0};
-
- for (int i = 0; i < uLen; i++) {
- uu[i] = u[i];
- }
-
- gchar *tmp = g_utf16_to_utf8(uu, uLen, nullptr, nullptr, nullptr);
- if ( tmp && *tmp ) {
- new_glyph.code = tmp;
- } else {
- new_glyph.code.clear();
- }
- g_free(tmp);
- }
-
// Copy current style if it has changed since the previous glyph
if (_invalidated_style || _glyphs.empty()) {
_invalidated_style = false;
--
GitLab

View file

@ -0,0 +1,395 @@
From 97bd8f29a61e691ceea98ca2444b974cf4256ae0 Mon Sep 17 00:00:00 2001
From: Rafael Siejakowski <rs@rs-math.net>
Date: Sun, 8 Jun 2025 21:30:44 +0200
Subject: [PATCH 1/2] 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.
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 01d7bf6ef0e..0d31eda16f4 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -27,6 +27,7 @@
#include <cstdio>
#include <cstdlib>
#include <cstring>
+#include <memory>
#include <mutex> // std::call_once()
#include <utility>
#include <vector>
@@ -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<char *>("Default")) || obj2.isName(const_cast<char *>("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 a67132ba6bd..d04412757bc 100644
--- a/src/extension/internal/pdfinput/poppler-transition-api.h
+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
@@ -15,6 +15,18 @@
#include <glib/poppler-features.h>
#include <poppler/UTF.h>
+#if POPPLER_CHECK_VERSION(25, 6, 0)
+#define _POPPLER_DECLARE_TRANSFER_FUNCTION_VECTOR(name) std::vector<std::unique_ptr<Function>> 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()
--
GitLab
From b4fcfc7969329513afa83e8c0cf52e3e36eae041 Mon Sep 17 00:00:00 2001
From: Rafael Siejakowski <rs@rs-math.net>
Date: Mon, 9 Jun 2025 13:51:59 +0200
Subject: [PATCH 2/2] Fix includes in PDF input extensions
This commit fixes a build error against a non-system libpoppler.
The include directives referencing Poppler's private headers are "system"
includes, so they should use angular brackets. The path prefix "poppler/"
is necessary to ensure they work correctly against a custom Poppler
installation.
In addition, several includes of lib2geom are also converted to angular
brackets. A handful of unused includes are removed.
---
.../internal/pdfinput/pdf-parser.cpp | 42 +++++++++----------
src/extension/internal/pdfinput/pdf-parser.h | 9 ++--
src/extension/internal/pdfinput/pdf-utils.h | 9 ++--
.../pdfinput/poppler-cairo-font-engine.cpp | 13 +++---
.../pdfinput/poppler-cairo-font-engine.h | 4 +-
.../internal/pdfinput/poppler-utils.cpp | 8 ++--
.../internal/pdfinput/svg-builder.cpp | 28 ++++++-------
src/extension/internal/pdfinput/svg-builder.h | 4 +-
8 files changed, 56 insertions(+), 61 deletions(-)
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 0d31eda16f4..0773e389085 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -22,42 +22,40 @@
#pragma implementation
#endif
+#include <2geom/transforms.h>
#include <cmath>
-#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
+#include <glib/poppler-features.h>
+#include <goo/GooString.h>
+#include <goo/gmem.h>
#include <memory>
#include <mutex> // std::call_once()
+#include <poppler/Annot.h>
+#include <poppler/Array.h>
+#include <poppler/CharTypes.h>
+#include <poppler/Dict.h>
+#include <poppler/Error.h>
+#include <poppler/Gfx.h>
+#include <poppler/GfxFont.h>
+#include <poppler/GfxState.h>
+#include <poppler/GlobalParams.h>
+#include <poppler/Lexer.h>
+#include <poppler/Object.h>
+#include <poppler/OutputDev.h>
+#include <poppler/PDFDoc.h>
+#include <poppler/Page.h>
+#include <poppler/Parser.h>
+#include <poppler/Stream.h>
#include <utility>
#include <vector>
-#include <2geom/transforms.h>
-#include "Annot.h"
-#include "Array.h"
-#include "CharTypes.h"
-#include "Dict.h"
-#include "Error.h"
-#include "Gfx.h"
-#include "GfxFont.h"
-#include "GfxState.h"
-#include "GlobalParams.h"
-#include "Lexer.h"
-#include "Object.h"
-#include "OutputDev.h"
-#include "PDFDoc.h"
-#include "Page.h"
-#include "Parser.h"
-#include "Stream.h"
-#include "glib/poppler-features.h"
-#include "goo/GooString.h"
-#include "goo/gmem.h"
#include "pdf-utils.h"
#include "poppler-cairo-font-engine.h"
#include "poppler-transition-api.h"
#include "poppler-utils.h"
#include "svg-builder.h"
-#include "util/units.h"
// the MSVC math.h doesn't define this
#ifndef M_PI
diff --git a/src/extension/internal/pdfinput/pdf-parser.h b/src/extension/internal/pdfinput/pdf-parser.h
index 99a205d186d..2c3a57bf50c 100644
--- a/src/extension/internal/pdfinput/pdf-parser.h
+++ b/src/extension/internal/pdfinput/pdf-parser.h
@@ -25,16 +25,15 @@
#pragma interface
#endif
-#include "glib/poppler-features.h"
-#include "Object.h"
-
+#include <2geom/affine.h>
+#include <glib/poppler-features.h>
#include <map>
#include <memory>
+#include <poppler/Object.h>
#include <string>
-#include <2geom/affine.h>
#define Operator Operator_Gfx
-#include <Gfx.h>
+#include <poppler/Gfx.h>
#undef Operator
namespace Inkscape::Extension::Internal {
diff --git a/src/extension/internal/pdfinput/pdf-utils.h b/src/extension/internal/pdfinput/pdf-utils.h
index e1a449a4e38..c1d602bec00 100644
--- a/src/extension/internal/pdfinput/pdf-utils.h
+++ b/src/extension/internal/pdfinput/pdf-utils.h
@@ -11,12 +11,13 @@
#ifndef PDF_UTILS_H
#define PDF_UTILS_H
+#include <2geom/affine.h>
#include <2geom/rect.h>
+#include <poppler/Gfx.h>
+#include <poppler/GfxState.h>
+#include <poppler/Page.h>
+
#include "poppler-transition-api.h"
-#include "2geom/affine.h"
-#include "Gfx.h"
-#include "GfxState.h"
-#include "Page.h"
class ClipHistoryEntry
{
diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
index 5e1a6426250..dff615cb616 100644
--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
@@ -47,14 +47,11 @@
#include <cstring>
#include <fofi/FoFiTrueType.h>
#include <fofi/FoFiType1C.h>
-#include <fstream>
-
-#include "Error.h"
-#include "Gfx.h"
-#include "GlobalParams.h"
-#include "Page.h"
-#include "XRef.h"
-#include "goo/gfile.h"
+#include <poppler/Error.h>
+#include <poppler/Gfx.h>
+#include <poppler/GlobalParams.h>
+#include <poppler/Page.h>
+#include <poppler/XRef.h>
//========================================================================
//
diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.h b/src/extension/internal/pdfinput/poppler-cairo-font-engine.h
index d3e1a94e845..114a23181a7 100644
--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.h
+++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.h
@@ -36,11 +36,11 @@
#include <memory>
#include <mutex>
#include <optional>
+#include <poppler/GfxFont.h>
+#include <poppler/PDFDoc.h>
#include <unordered_map>
#include <vector>
-#include "GfxFont.h"
-#include "PDFDoc.h"
#include "poppler-config.h"
#include "poppler-transition-api.h"
diff --git a/src/extension/internal/pdfinput/poppler-utils.cpp b/src/extension/internal/pdfinput/poppler-utils.cpp
index ad0dd236a2a..a579ffcacf3 100644
--- a/src/extension/internal/pdfinput/poppler-utils.cpp
+++ b/src/extension/internal/pdfinput/poppler-utils.cpp
@@ -12,12 +12,12 @@
#include "poppler-utils.h"
+#include <2geom/affine.h>
+#include <poppler/GfxFont.h>
+#include <poppler/GfxState.h>
+#include <poppler/PDFDoc.h>
#include <poppler/UTF.h>
-#include "2geom/affine.h"
-#include "GfxFont.h"
-#include "GfxState.h"
-#include "PDFDoc.h"
#include "libnrtype/font-factory.h"
/**
diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp
index cdd8d755e82..f14be1ec62e 100644
--- a/src/extension/internal/pdfinput/svg-builder.cpp
+++ b/src/extension/internal/pdfinput/svg-builder.cpp
@@ -27,26 +27,28 @@
#ifdef HAVE_POPPLER
-#include "Function.h"
-#include "GfxFont.h"
-#include "GfxState.h"
-#include "Page.h"
-#include "Stream.h"
+#include <poppler/Function.h>
+#include <poppler/GfxFont.h>
+#include <poppler/GfxState.h>
+#include <poppler/Page.h>
+#include <poppler/Stream.h>
+
#include "color.h"
+#include "color/cms-util.h"
+#include "display/cairo-utils.h"
+#include "display/nr-filter-utils.h"
#include "document.h"
#include "extract-uri.h"
+#include "helper/geom.h"
+#include "object/sp-defs.h"
+#include "object/sp-item-group.h"
+#include "object/sp-namedview.h"
+#include "object/sp-text.h"
#include "pdf-parser.h"
#include "pdf-utils.h"
#include "png.h"
#include "poppler-cairo-font-engine.h"
#include "profile-manager.h"
-
-#include "color/cms-util.h"
-#include "display/cairo-utils.h"
-#include "display/nr-filter-utils.h"
-#include "object/sp-defs.h"
-#include "object/sp-item-group.h"
-#include "object/sp-namedview.h"
#include "svg/css-ostringstream.h"
#include "svg/path-string.h"
#include "svg/svg.h"
diff --git a/src/extension/internal/pdfinput/svg-builder.h b/src/extension/internal/pdfinput/svg-builder.h
index ae6b916bcb0..db42f81b87d 100644
--- a/src/extension/internal/pdfinput/svg-builder.h
+++ b/src/extension/internal/pdfinput/svg-builder.h
@@ -27,7 +27,7 @@ namespace Inkscape {
}
#define Operator Operator_Gfx
-#include <Gfx.h>
+#include <poppler/Gfx.h>
#undef Operator
#include <2geom/affine.h>
@@ -35,8 +35,8 @@ namespace Inkscape {
#include <cairo-ft.h>
#include <glibmm/ustring.h>
#include <lcms2.h>
+#include <poppler/CharTypes.h>
-#include "CharTypes.h"
#include "enums.h"
#include "poppler-utils.h"
class Function;
--
GitLab

View file

@ -1,179 +0,0 @@
From 5c4c6d116dae5250d75d34a45f0d9220824d2e20 Mon Sep 17 00:00:00 2001
From: KrIr17 <elendil.krir17@gmail.com>
Date: Sun, 9 Feb 2025 22:52:53 +0530
Subject: [PATCH] Fix building with poppler 25.02.0
1. `getCodeToGIDMap`, `getCIDToGID`, `getCIDToGIDMap` are now `std::vector`
2. `pdfDocEncodingToUTF16` returns an `std::string`
---
.../pdfinput/poppler-cairo-font-engine.cpp | 50 +++++++++++++++----
.../pdfinput/poppler-transition-api.h | 20 +++++---
3 files changed, 63 insertions(+), 16 deletions(-)
diff --git a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
index 728b1d1aac4..bd1d4e49367 100644
--- a/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
+++ b/src/extension/internal/pdfinput/poppler-cairo-font-engine.cpp
@@ -405,14 +405,22 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
break;
case fontCIDType2:
case fontCIDType2OT:
+#if POPPLER_CHECK_VERSION(25,2,0)
+ if (!gfxcid->getCIDToGID().empty()) {
+ const auto src = gfxcid->getCIDToGID();
+ codeToGID = std::move(src);
+ }
+#else
if (gfxcid->getCIDToGID()) {
n = gfxcid->getCIDToGIDLen();
if (n) {
- const int *src = gfxcid->getCIDToGID();
+ const auto src = gfxcid->getCIDToGID();
codeToGID.reserve(n);
codeToGID.insert(codeToGID.begin(), src, src + n);
}
- } else {
+ }
+#endif
+ else {
#if POPPLER_CHECK_VERSION(22, 1, 0)
std::unique_ptr<FoFiTrueType> ff;
#else
@@ -427,13 +435,18 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
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:
@@ -455,13 +468,17 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
/* 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) {
@@ -479,10 +496,14 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
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;
}
}
@@ -495,14 +516,21 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
break;
case fontCIDType0COT:
+#if POPPLER_CHECK_VERSION(25,2,0)
+ if (!gfxcid->getCIDToGID().empty()) {
+ const auto src = gfxcid->getCIDToGID();
+ codeToGID = std::move(src);
+ }
+#else
if (gfxcid->getCIDToGID()) {
n = gfxcid->getCIDToGIDLen();
if (n) {
- const int *src = gfxcid->getCIDToGID();
+ const auto src = gfxcid->getCIDToGID();
codeToGID.reserve(n);
codeToGID.insert(codeToGID.begin(), src, src + n);
}
}
+#endif
if (codeToGID.empty()) {
if (!useCIDs) {
@@ -518,10 +546,14 @@ CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, FT_Li
}
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 --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h
index b7a54828e74..a67132ba6bd 100644
--- a/src/extension/internal/pdfinput/poppler-transition-api.h
+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
@@ -15,6 +15,20 @@
#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()
+#else
+#define _POPPLER_GET_CODE_TO_GID_MAP(ff, len) getCodeToGIDMap(ff, len)
+#define _POPPLER_GET_CID_TO_GID_MAP(len) getCIDToGIDMap(len)
+#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
@@ -39,12 +53,6 @@
#define _POPPLER_FUNCTION_TYPE_STITCHING 3
#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(22, 4, 0)
#define _POPPLER_FONTPTR_TO_GFX8(font_ptr) ((Gfx8BitFont *)font_ptr.get())
#else
--
GitLab

View file

@ -1,7 +1,7 @@
# Template file for 'inkscape' # Template file for 'inkscape'
pkgname=inkscape pkgname=inkscape
version=1.4 version=1.4.2
revision=3 revision=1
build_style=cmake build_style=cmake
make_check_target="check" make_check_target="check"
hostmakedepends="automake gettext glib-devel intltool libgraphicsmagick-devel hostmakedepends="automake gettext glib-devel intltool libgraphicsmagick-devel
@ -21,7 +21,7 @@ maintainer="Alex Lohr <alexthkloss@web.de>"
license="GPL-2.0-only, LGPL-2.1-or-later" license="GPL-2.0-only, LGPL-2.1-or-later"
homepage="https://inkscape.org/" homepage="https://inkscape.org/"
distfiles="https://media.inkscape.org/dl/resources/file/inkscape-${version}.tar.xz" distfiles="https://media.inkscape.org/dl/resources/file/inkscape-${version}.tar.xz"
checksum=c59a85453b699addebcd51c1dc07684dd96a10c8aec716b19551db50562e13f5 checksum=2000530c7917e5260c9e8575a7154ff6926643d2006487d714e304a963f0c782
python_version=3 python_version=3
# some tests still fail on musl: https://gitlab.com/inkscape/inkscape/-/issues/2241 # some tests still fail on musl: https://gitlab.com/inkscape/inkscape/-/issues/2241
make_check=no make_check=no