summaryrefslogtreecommitdiff
blob: 8e507d0ebcf489e611f7efc0b0c8357ece86b5b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
https://gitlab.com/inkscape/inkscape/-/commit/a18c57ffff313fd08bc8a44f6b6bf0b01d7e9b75.patch
https://bugs.gentoo.org/835661

From 08b2f3d93c08bcf1e363f4284112fd14a7cbd09c Mon Sep 17 00:00:00 2001
From: Rafael Siejakowski <rs@rs-math.net>
Date: Mon, 4 Apr 2022 22:09:39 -0300
Subject: [PATCH] Compatibility with Poppler 22.04

Replace vanilla pointers with std::shared_ptr for pointers to fonts;
eliminate manual ref-counting.
Cherry-picked from 6a7b9ec0af088baa08b92fd76b33eca26537fb35.

Fixes https://gitlab.com/inkscape/inkscape/-/issues/3387
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -30,6 +30,7 @@
 #include "Gfx.h"
 #include "pdf-parser.h"
 #include "util/units.h"
+#include "poppler-transition-api.h"
 
 #include "glib/poppler-features.h"
 #include "goo/gmem.h"
@@ -2158,7 +2159,7 @@ void PdfParser::opSetCharSpacing(Object args[], int /*numArgs*/)
 // TODO not good that numArgs is ignored but args[] is used:
 void PdfParser::opSetFont(Object args[], int /*numArgs*/)
 {
-  GfxFont *font = res->lookupFont(args[0].getName());
+  auto font = res->lookupFont(args[0].getName());
 
   if (!font) {
     // unsetting the font (drawing no text) is better than using the
@@ -2179,7 +2180,9 @@ void PdfParser::opSetFont(Object args[], int /*numArgs*/)
     fflush(stdout);
   }
 
+#if !POPPLER_CHECK_VERSION(22, 4, 0)
   font->incRefCnt();
+#endif
   state->setFont(font, args[1].getNum());
   fontChanged = gTrue;
 }
@@ -2373,7 +2376,6 @@ void PdfParser::doShowText(const GooString *s) {
 #else
 void PdfParser::doShowText(GooString *s) {
 #endif
-  GfxFont *font;
   int wMode;
   double riseX, riseY;
   CharCode code;
@@ -2392,7 +2394,7 @@ void PdfParser::doShowText(GooString *s) {
 #endif
   int len, n, uLen;
 
-  font = state->getFont();
+  auto font = state->getFont();
   wMode = font->getWMode();
 
   builder->beginString(state);
@@ -2445,10 +2447,10 @@ void PdfParser::doShowText(GooString *s) {
       //out->updateCTM(state, 1, 0, 0, 1, 0, 0);
       if (false){ /*!out->beginType3Char(state, curX + riseX, curY + riseY, tdx, tdy,
 			       code, u, uLen)) {*/
-        _POPPLER_CALL_ARGS(charProc, ((Gfx8BitFont *)font)->getCharProc, code);
-	if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
+        _POPPLER_CALL_ARGS(charProc, _POPPLER_FONTPTR_TO_GFX8(font)->getCharProc, code);
+    if (resDict = _POPPLER_FONTPTR_TO_GFX8(font)->getResources()) {
 	  pushResources(resDict);
-	}
+    }
 	if (charProc.isStream()) {
 	  //parse(&charProc, gFalse); // TODO: parse into SVG font
 	} else {
--- a/src/extension/internal/pdfinput/poppler-transition-api.h
+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
@@ -14,6 +14,12 @@
 
 #include <glib/poppler-features.h>
 
+#if POPPLER_CHECK_VERSION(22, 4, 0)
+#define _POPPLER_FONTPTR_TO_GFX8(font_ptr) ((Gfx8BitFont *)font_ptr.get())
+#else
+#define _POPPLER_FONTPTR_TO_GFX8(font_ptr) ((Gfx8BitFont *)font_ptr)
+#endif
+
 #if POPPLER_CHECK_VERSION(22, 3, 0)
 #define _POPPLER_MAKE_SHARED_PDFDOC(uri) std::make_shared<PDFDoc>(std::make_unique<GooString>(uri))
 #else
--- a/src/extension/internal/pdfinput/svg-builder.cpp
+++ b/src/extension/internal/pdfinput/svg-builder.cpp
@@ -108,7 +108,6 @@ SvgBuilder::~SvgBuilder() = default;
 
 void SvgBuilder::_init() {
     _font_style = nullptr;
-    _current_font = nullptr;
     _font_specification = nullptr;
     _font_scaling = 1;
     _need_font_update = true;
@@ -1021,11 +1020,8 @@ void SvgBuilder::updateFont(GfxState *state) {
     _need_font_update = false;
     updateTextMatrix(state);    // Ensure that we have a text matrix built
 
-    if (_font_style) {
-        //sp_repr_css_attr_unref(_font_style);
-    }
     _font_style = sp_repr_css_attr_new();
-    GfxFont *font = state->getFont();
+    auto font = state->getFont();
     // Store original name
     if (font->getName()) {
         _font_specification = font->getName()->getCString();
@@ -1171,7 +1167,6 @@ void SvgBuilder::updateFont(GfxState *state) {
         sp_repr_css_set_property(_font_style, "writing-mode", "tb");
     }
 
-    _current_font = font;
     _invalidated_style = true;
 }
 
--- a/src/extension/internal/pdfinput/svg-builder.h
+++ b/src/extension/internal/pdfinput/svg-builder.h
@@ -203,7 +203,6 @@ private:
     std::vector<SvgGraphicsState> _state_stack;
 
     SPCSSAttr *_font_style;          // Current font style
-    GfxFont *_current_font;
     const char *_font_specification;
     double _font_scaling;
     bool _need_font_update;
GitLab