1 |
tv |
812843 |
From 509c57e91c324decada94ac1f70a58fdf52a6372 Mon Sep 17 00:00:00 2001 |
2 |
|
|
From: Michael Stahl <mstahl@redhat.com> |
3 |
|
|
Date: Tue, 27 Jan 2015 00:20:58 +0100 |
4 |
|
|
Subject: [PATCH] rhbz#1177022: vcl: fix PDF embedding of Type 1 fonts |
5 |
|
|
|
6 |
|
|
Problem is that for the "CM Typewriter" font the Width for "space" (32) |
7 |
|
|
is exported as 0 instead of 525, which is the correct value in the AFM. |
8 |
|
|
|
9 |
|
|
The reason is that PDFWriterImpl::emitEmbeddedFont() has various arrays |
10 |
|
|
to map from font code points to Unicode code points, and there are |
11 |
|
|
duplicate mappings, so the 160->32 mapping overrides 32->32. |
12 |
|
|
|
13 |
|
|
The PrintFontManager::PrintFont::readAfmMetrics() actually creates a |
14 |
|
|
Unicode to font code mapping (which may legitimately be n:1) that is |
15 |
|
|
then inverted; add an additional hack to store a set of "preferred" |
16 |
|
|
Unicodes so that PDFWriterImpl can pick the right Unicode. |
17 |
|
|
|
18 |
|
|
Presumably the code that is stored explicitly via "C" or "CH" in the |
19 |
|
|
AFM should take priority over more generic mappings. |
20 |
|
|
|
21 |
|
|
Conflicts: |
22 |
|
|
vcl/inc/cairotextrender.hxx |
23 |
|
|
vcl/inc/textrender.hxx |
24 |
|
|
vcl/inc/unx/salgdi.h |
25 |
|
|
vcl/source/gdi/pdfwriter_impl.cxx |
26 |
|
|
|
27 |
|
|
Change-Id: Id4205a1cd45ba6a0a5facee1e39f70c3535e7dd4 |
28 |
|
|
--- |
29 |
|
|
vcl/generic/fontmanager/fontmanager.cxx | 25 +++++++++++++++++++++- |
30 |
|
|
vcl/generic/print/genpspgraphics.cxx | 8 +++---- |
31 |
|
|
vcl/headless/svptext.cxx | 4 ++-- |
32 |
|
|
vcl/inc/cairotextrender.hxx | 2 +- |
33 |
|
|
vcl/inc/fontmanager.hxx | 7 ++++++- |
34 |
|
|
vcl/inc/generic/genpspgraphics.h | 6 ++++-- |
35 |
|
|
vcl/inc/headless/svpgdi.hxx | 2 +- |
36 |
|
|
vcl/inc/quartz/salgdi.h | 2 +- |
37 |
|
|
vcl/inc/salgdi.hxx | 4 +++- |
38 |
|
|
vcl/inc/textrender.hxx | 2 +- |
39 |
|
|
vcl/inc/unx/salgdi.h | 2 +- |
40 |
|
|
vcl/inc/win/salgdi.h | 2 +- |
41 |
|
|
vcl/quartz/salgdi.cxx | 2 +- |
42 |
|
|
vcl/source/gdi/pdfwriter_impl.cxx | 37 +++++++++++++++++++++++++++++++-- |
43 |
|
|
vcl/unx/generic/gdi/cairotextrender.cxx | 4 ++-- |
44 |
|
|
vcl/unx/generic/gdi/salgdi3.cxx | 4 ++-- |
45 |
|
|
vcl/win/source/gdi/salgdi3.cxx | 2 +- |
46 |
|
|
17 files changed, 90 insertions(+), 25 deletions(-) |
47 |
|
|
|
48 |
|
|
diff --git a/vcl/generic/fontmanager/fontmanager.cxx b/vcl/generic/fontmanager/fontmanager.cxx |
49 |
|
|
index 33fb4ed..d5b481f 100644 |
50 |
|
|
--- a/vcl/generic/fontmanager/fontmanager.cxx |
51 |
|
|
+++ b/vcl/generic/fontmanager/fontmanager.cxx |
52 |
|
|
@@ -291,6 +291,7 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider, |
53 |
|
|
} |
54 |
|
|
|
55 |
|
|
m_aEncodingVector.clear(); |
56 |
|
|
+ m_aEncodingVectorPriority.clear(); |
57 |
|
|
// fill in global info |
58 |
|
|
|
59 |
|
|
// PSName |
60 |
|
|
@@ -504,7 +505,10 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider, |
61 |
|
|
{ |
62 |
|
|
pUnicodes[i] = pChar->code + 0xf000; |
63 |
|
|
if( bFillEncodingvector ) |
64 |
|
|
+ { |
65 |
|
|
m_aEncodingVector[ pUnicodes[i] ] = pChar->code; |
66 |
|
|
+ m_aEncodingVectorPriority.insert(pUnicodes[i]); |
67 |
|
|
+ } |
68 |
|
|
continue; |
69 |
|
|
} |
70 |
|
|
|
71 |
|
|
@@ -565,7 +569,10 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider, |
72 |
|
|
{ |
73 |
|
|
m_pMetrics->m_aMetrics[ pUnicodes[i] ] = aMetric; |
74 |
|
|
if( bFillEncodingvector ) |
75 |
|
|
+ { |
76 |
|
|
m_aEncodingVector[ pUnicodes[i] ] = pChar->code; |
77 |
|
|
+ m_aEncodingVectorPriority.insert(pUnicodes[i]); |
78 |
|
|
+ } |
79 |
|
|
} |
80 |
|
|
else if( pChar->name ) |
81 |
|
|
{ |
82 |
|
|
@@ -593,13 +600,21 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider, |
83 |
|
|
::std::pair< ::boost::unordered_multimap< sal_uInt8, sal_Unicode >::const_iterator, |
84 |
|
|
::boost::unordered_multimap< sal_uInt8, sal_Unicode >::const_iterator > |
85 |
|
|
aCodes = rManager.getUnicodeFromAdobeCode( pChar->code ); |
86 |
|
|
+ bool bFirst = true; |
87 |
|
|
while( aCodes.first != aCodes.second ) |
88 |
|
|
{ |
89 |
|
|
if( (*aCodes.first).second != 0 ) |
90 |
|
|
{ |
91 |
|
|
m_pMetrics->m_aMetrics[ (*aCodes.first).second ] = aMetric; |
92 |
|
|
if( bFillEncodingvector ) |
93 |
|
|
+ { |
94 |
|
|
m_aEncodingVector[ (*aCodes.first).second ] = pChar->code; |
95 |
|
|
+ if (bFirst) // arbitrarily prefer the first one |
96 |
|
|
+ { |
97 |
|
|
+ m_aEncodingVectorPriority.insert((*aCodes.first).second); |
98 |
|
|
+ bFirst = false; |
99 |
|
|
+ } |
100 |
|
|
+ } |
101 |
|
|
} |
102 |
|
|
++aCodes.first; |
103 |
|
|
} |
104 |
|
|
@@ -613,7 +628,10 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider, |
105 |
|
|
m_pMetrics->m_aMetrics[ code ] = aMetric; |
106 |
|
|
// maybe should try to find the name in the convtabs ? |
107 |
|
|
if( bFillEncodingvector ) |
108 |
|
|
+ { |
109 |
|
|
m_aEncodingVector[ code ] = pChar->code; |
110 |
|
|
+ m_aEncodingVectorPriority.insert(code); |
111 |
|
|
+ } |
112 |
|
|
} |
113 |
|
|
} |
114 |
|
|
} |
115 |
|
|
@@ -2140,7 +2158,7 @@ void PrintFontManager::getGlyphWidths( fontID nFont, |
116 |
|
|
} |
117 |
|
|
} |
118 |
|
|
|
119 |
|
|
-const std::map< sal_Unicode, sal_Int32 >* PrintFontManager::getEncodingMap( fontID nFont, const std::map< sal_Unicode, OString >** pNonEncoded ) const |
120 |
|
|
+const std::map< sal_Unicode, sal_Int32 >* PrintFontManager::getEncodingMap( fontID nFont, const std::map< sal_Unicode, OString >** pNonEncoded, std::set<sal_Unicode> const** ppPriority ) const |
121 |
|
|
{ |
122 |
|
|
PrintFont* pFont = getFont( nFont ); |
123 |
|
|
if( !pFont || pFont->m_eType != fonttype::Type1 ) |
124 |
|
|
@@ -2152,6 +2170,11 @@ const std::map< sal_Unicode, sal_Int32 >* PrintFontManager::getEncodingMap( font |
125 |
|
|
if( pNonEncoded ) |
126 |
|
|
*pNonEncoded = pFont->m_aNonEncoded.size() ? &pFont->m_aNonEncoded : NULL; |
127 |
|
|
|
128 |
|
|
+ if (ppPriority) |
129 |
|
|
+ { |
130 |
|
|
+ *ppPriority = &pFont->m_aEncodingVectorPriority; |
131 |
|
|
+ } |
132 |
|
|
+ |
133 |
|
|
return pFont->m_aEncodingVector.size() ? &pFont->m_aEncodingVector : NULL; |
134 |
|
|
} |
135 |
|
|
|
136 |
|
|
diff --git a/vcl/generic/print/genpspgraphics.cxx b/vcl/generic/print/genpspgraphics.cxx |
137 |
|
|
index 1e63ab0..58991c3 100644 |
138 |
|
|
--- a/vcl/generic/print/genpspgraphics.cxx |
139 |
|
|
+++ b/vcl/generic/print/genpspgraphics.cxx |
140 |
|
|
@@ -1009,7 +1009,7 @@ bool GenPspGraphics::CreateFontSubset( |
141 |
|
|
return bSuccess; |
142 |
|
|
} |
143 |
|
|
|
144 |
|
|
-const Ucs2SIntMap* GenPspGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) |
145 |
|
|
+const Ucs2SIntMap* GenPspGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority) |
146 |
|
|
{ |
147 |
|
|
// in this context the pFont->GetFontId() is a valid PSP |
148 |
|
|
// font since they are the only ones left after the PDF |
149 |
|
|
@@ -1017,7 +1017,7 @@ const Ucs2SIntMap* GenPspGraphics::GetFontEncodingVector( const PhysicalFontFace |
150 |
|
|
// which this method was created). The correct way would |
151 |
|
|
// be to have the GlyphCache search for the PhysicalFontFace pFont |
152 |
|
|
psp::fontID aFont = pFont->GetFontId(); |
153 |
|
|
- return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded ); |
154 |
|
|
+ return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded, ppPriority ); |
155 |
|
|
} |
156 |
|
|
|
157 |
|
|
void GenPspGraphics::GetGlyphWidths( const PhysicalFontFace* pFont, |
158 |
|
|
@@ -1034,7 +1034,7 @@ void GenPspGraphics::GetGlyphWidths( const PhysicalFontFace* pFont, |
159 |
|
|
GenPspGraphics::DoGetGlyphWidths( aFont, bVertical, rWidths, rUnicodeEnc ); |
160 |
|
|
} |
161 |
|
|
|
162 |
|
|
-const Ucs2SIntMap* GenPspGraphics::DoGetFontEncodingVector( fontID aFont, const Ucs2OStrMap** pNonEncoded ) |
163 |
|
|
+const Ucs2SIntMap* GenPspGraphics::DoGetFontEncodingVector( fontID aFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority) |
164 |
|
|
{ |
165 |
|
|
psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); |
166 |
|
|
|
167 |
|
|
@@ -1046,7 +1046,7 @@ const Ucs2SIntMap* GenPspGraphics::DoGetFontEncodingVector( fontID aFont, const |
168 |
|
|
return NULL; |
169 |
|
|
} |
170 |
|
|
|
171 |
|
|
- return rMgr.getEncodingMap( aFont, pNonEncoded ); |
172 |
|
|
+ return rMgr.getEncodingMap( aFont, pNonEncoded, ppPriority ); |
173 |
|
|
} |
174 |
|
|
|
175 |
|
|
void GenPspGraphics::DoGetGlyphWidths( psp::fontID aFont, |
176 |
|
|
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx |
177 |
|
|
index 8fc51ce..5fb0af8 100644 |
178 |
|
|
--- a/vcl/headless/svptext.cxx |
179 |
|
|
+++ b/vcl/headless/svptext.cxx |
180 |
|
|
@@ -321,7 +321,7 @@ bool SvpSalGraphics::CreateFontSubset( |
181 |
|
|
return bSuccess; |
182 |
|
|
} |
183 |
|
|
|
184 |
|
|
-const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) |
185 |
|
|
+const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority) |
186 |
|
|
{ |
187 |
|
|
// in this context the pFont->GetFontId() is a valid PSP |
188 |
|
|
// font since they are the only ones left after the PDF |
189 |
|
|
@@ -329,7 +329,7 @@ const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const PhysicalFontFace |
190 |
|
|
// which this method was created). The correct way would |
191 |
|
|
// be to have the GlyphCache search for the PhysicalFontFace pFont |
192 |
|
|
psp::fontID aFont = pFont->GetFontId(); |
193 |
|
|
- return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded ); |
194 |
|
|
+ return GenPspGraphics::DoGetFontEncodingVector(aFont, pNonEncoded, ppPriority); |
195 |
|
|
} |
196 |
|
|
|
197 |
|
|
const void* SvpSalGraphics::GetEmbedFontData( |
198 |
|
|
diff --git a/vcl/inc/cairotextrender.hxx b/vcl/inc/cairotextrender.hxx |
199 |
|
|
index 2b8a21e..fdbc001 100644 |
200 |
|
|
--- a/vcl/inc/cairotextrender.hxx |
201 |
|
|
+++ b/vcl/inc/cairotextrender.hxx |
202 |
|
|
@@ -104,7 +104,7 @@ public: |
203 |
|
|
int nGlyphs, |
204 |
|
|
FontSubsetInfo& rInfo |
205 |
|
|
) SAL_OVERRIDE; |
206 |
|
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE; |
207 |
|
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ) SAL_OVERRIDE; |
208 |
|
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*, |
209 |
|
|
const sal_Ucs* pUnicodes, |
210 |
|
|
sal_Int32* pWidths, |
211 |
|
|
diff --git a/vcl/inc/fontmanager.hxx b/vcl/inc/fontmanager.hxx |
212 |
|
|
index e1203bd..0091849 100644 |
213 |
|
|
--- a/vcl/inc/fontmanager.hxx |
214 |
|
|
+++ b/vcl/inc/fontmanager.hxx |
215 |
|
|
@@ -202,7 +202,12 @@ class VCL_PLUGIN_PUBLIC PrintFontManager |
216 |
|
|
bool m_bHaveVerticalSubstitutedGlyphs; |
217 |
|
|
bool m_bUserOverride; |
218 |
|
|
|
219 |
|
|
+ /// mapping from unicode (well, UCS-2) to font code |
220 |
|
|
std::map< sal_Unicode, sal_Int32 > m_aEncodingVector; |
221 |
|
|
+ /// HACK for Type 1 fonts: if multiple UCS-2 codes map to the same |
222 |
|
|
+ /// font code, this set contains the preferred one, i.e., the one that |
223 |
|
|
+ /// is specified explicitly via "C" or "CH" in the AFM file |
224 |
|
|
+ std::set<sal_Unicode> m_aEncodingVectorPriority; |
225 |
|
|
std::map< sal_Unicode, OString > m_aNonEncoded; |
226 |
|
|
|
227 |
|
|
explicit PrintFont( fonttype::type eType ); |
228 |
|
|
@@ -438,7 +443,7 @@ public: |
229 |
|
|
// if ppNonEncoded is set and non encoded type1 glyphs exist |
230 |
|
|
// then *ppNonEncoded is set to the mapping for nonencoded glyphs. |
231 |
|
|
// the encoding vector contains -1 for non encoded glyphs |
232 |
|
|
- const std::map< sal_Unicode, sal_Int32 >* getEncodingMap( fontID nFontID, const std::map< sal_Unicode, OString >** ppNonEncoded ) const; |
233 |
|
|
+ const std::map< sal_Unicode, sal_Int32 >* getEncodingMap( fontID nFontID, const std::map< sal_Unicode, OString >** ppNonEncoded, std::set<sal_Unicode> const ** ppPriority ) const; |
234 |
|
|
|
235 |
|
|
// evaluates copyright flags for TrueType fonts for printing/viewing |
236 |
|
|
// type1 fonts do not have such a feature, so return for them is true |
237 |
|
|
diff --git a/vcl/inc/generic/genpspgraphics.h b/vcl/inc/generic/genpspgraphics.h |
238 |
|
|
index 18a434f..b2cf527 100644 |
239 |
|
|
--- a/vcl/inc/generic/genpspgraphics.h |
240 |
|
|
+++ b/vcl/inc/generic/genpspgraphics.h |
241 |
|
|
@@ -60,7 +60,8 @@ public: |
242 |
|
|
|
243 |
|
|
// helper methods for sharing with X11SalGraphics |
244 |
|
|
static const Ucs2SIntMap* DoGetFontEncodingVector( psp::fontID aFont, |
245 |
|
|
- const Ucs2OStrMap** pNonEncoded ); |
246 |
|
|
+ const Ucs2OStrMap** pNonEncoded, |
247 |
|
|
+ std::set<sal_Unicode> const** ppPriority); |
248 |
|
|
static void DoGetGlyphWidths( psp::fontID aFont, |
249 |
|
|
bool bVertical, |
250 |
|
|
Int32Vector& rWidths, |
251 |
|
|
@@ -107,7 +108,8 @@ public: |
252 |
|
|
int nGlyphs, |
253 |
|
|
FontSubsetInfo& rInfo ) SAL_OVERRIDE; |
254 |
|
|
virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, |
255 |
|
|
- const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE; |
256 |
|
|
+ const Ucs2OStrMap** ppNonEncoded, |
257 |
|
|
+ std::set<sal_Unicode> const** ppPriority) SAL_OVERRIDE; |
258 |
|
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*, |
259 |
|
|
const sal_Ucs* pUnicodes, |
260 |
|
|
sal_Int32* pWidths, |
261 |
|
|
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx |
262 |
|
|
index 9ae3d05..87bf5e0e 100644 |
263 |
|
|
--- a/vcl/inc/headless/svpgdi.hxx |
264 |
|
|
+++ b/vcl/inc/headless/svpgdi.hxx |
265 |
|
|
@@ -176,7 +176,7 @@ public: |
266 |
|
|
int nGlyphs, |
267 |
|
|
FontSubsetInfo& rInfo |
268 |
|
|
) SAL_OVERRIDE; |
269 |
|
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE; |
270 |
|
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ) SAL_OVERRIDE; |
271 |
|
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*, |
272 |
|
|
const sal_Ucs* pUnicodes, |
273 |
|
|
sal_Int32* pWidths, |
274 |
|
|
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h |
275 |
|
|
index 9a5d4da..e9c51cbd 100644 |
276 |
|
|
--- a/vcl/inc/quartz/salgdi.h |
277 |
|
|
+++ b/vcl/inc/quartz/salgdi.h |
278 |
|
|
@@ -368,7 +368,7 @@ public: |
279 |
|
|
// glyphs with only a name) exist it is set to the corresponding |
280 |
|
|
// map for non encoded glyphs; the encoding vector contains -1 |
281 |
|
|
// as encoding for these cases |
282 |
|
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE; |
283 |
|
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ) SAL_OVERRIDE; |
284 |
|
|
|
285 |
|
|
// GetEmbedFontData: gets the font data for a font marked |
286 |
|
|
// embeddable by GetDevFontList or NULL in case of error |
287 |
|
|
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx |
288 |
|
|
index ff6271c..2849cc1 100644 |
289 |
|
|
--- a/vcl/inc/salgdi.hxx |
290 |
|
|
+++ b/vcl/inc/salgdi.hxx |
291 |
|
|
@@ -34,6 +34,7 @@ |
292 |
|
|
#include "sallayout.hxx" |
293 |
|
|
|
294 |
|
|
#include <map> |
295 |
|
|
+#include <set> |
296 |
|
|
|
297 |
|
|
class PhysicalFontCollection; |
298 |
|
|
class SalBitmap; |
299 |
|
|
@@ -188,7 +189,8 @@ public: |
300 |
|
|
// as encoding for these cases |
301 |
|
|
virtual const Ucs2SIntMap* GetFontEncodingVector( |
302 |
|
|
const PhysicalFontFace*, |
303 |
|
|
- const Ucs2OStrMap** ppNonEncoded ) = 0; |
304 |
|
|
+ const Ucs2OStrMap** ppNonEncoded, |
305 |
|
|
+ std::set<sal_Unicode> const** ppPriority) = 0; |
306 |
|
|
|
307 |
|
|
// GetEmbedFontData: gets the font data for a font marked |
308 |
|
|
// embeddable by GetDevFontList or NULL in case of error |
309 |
|
|
diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx |
310 |
|
|
index f4dcc83..48f1a74 100644 |
311 |
|
|
--- a/vcl/inc/textrender.hxx |
312 |
|
|
+++ b/vcl/inc/textrender.hxx |
313 |
|
|
@@ -58,7 +58,7 @@ public: |
314 |
|
|
int nGlyphs, |
315 |
|
|
FontSubsetInfo& rInfo |
316 |
|
|
) = 0; |
317 |
|
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) = 0; |
318 |
|
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ppPriority ) = 0; |
319 |
|
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*, |
320 |
|
|
const sal_Ucs* pUnicodes, |
321 |
|
|
sal_Int32* pWidths, |
322 |
|
|
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h |
323 |
|
|
index 29697a9..a550c96 100644 |
324 |
|
|
--- a/vcl/inc/unx/salgdi.h |
325 |
|
|
+++ b/vcl/inc/unx/salgdi.h |
326 |
|
|
@@ -179,7 +179,7 @@ public: |
327 |
|
|
int nGlyphs, |
328 |
|
|
FontSubsetInfo& rInfo |
329 |
|
|
) SAL_OVERRIDE; |
330 |
|
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE; |
331 |
|
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ppPriority ) SAL_OVERRIDE; |
332 |
|
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*, |
333 |
|
|
const sal_Ucs* pUnicodes, |
334 |
|
|
sal_Int32* pWidths, |
335 |
|
|
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h |
336 |
|
|
index 5a46cb1f..358eae5 100644 |
337 |
|
|
--- a/vcl/inc/win/salgdi.h |
338 |
|
|
+++ b/vcl/inc/win/salgdi.h |
339 |
|
|
@@ -411,7 +411,7 @@ public: |
340 |
|
|
// glyphs with only a name) exist it is set to the corresponding |
341 |
|
|
// map for non encoded glyphs; the encoding vector contains -1 |
342 |
|
|
// as encoding for these cases |
343 |
|
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ); |
344 |
|
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ); |
345 |
|
|
|
346 |
|
|
// GetEmbedFontData: gets the font data for a font marked |
347 |
|
|
// embeddable by GetDevFontList or NULL in case of error |
348 |
|
|
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx |
349 |
|
|
index 0b1ffef..79d30bf 100644 |
350 |
|
|
--- a/vcl/quartz/salgdi.cxx |
351 |
|
|
+++ b/vcl/quartz/salgdi.cxx |
352 |
|
|
@@ -751,7 +751,7 @@ void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool bV |
353 |
|
|
} |
354 |
|
|
|
355 |
|
|
const Ucs2SIntMap* AquaSalGraphics::GetFontEncodingVector( |
356 |
|
|
- const PhysicalFontFace*, const Ucs2OStrMap** /*ppNonEncoded*/ ) |
357 |
|
|
+ const PhysicalFontFace*, const Ucs2OStrMap** /*ppNonEncoded*/, std::set<sal_Unicode> const** ) |
358 |
|
|
{ |
359 |
|
|
return NULL; |
360 |
|
|
} |
361 |
|
|
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx |
362 |
|
|
index 93efd94..2ad37ce 100644 |
363 |
|
|
--- a/vcl/source/gdi/pdfwriter_impl.cxx |
364 |
|
|
+++ b/vcl/source/gdi/pdfwriter_impl.cxx |
365 |
|
|
@@ -3087,7 +3087,9 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const Physical |
366 |
|
|
sal_Int32 nFontDescriptor = 0; |
367 |
|
|
|
368 |
|
|
// prepare font encoding |
369 |
|
|
- const Ucs2SIntMap* pEncoding = m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pFont, NULL ); |
370 |
|
|
+ std::set<sal_Unicode> const * pPriority(0); |
371 |
|
|
+ const Ucs2SIntMap *const pEncoding = |
372 |
|
|
+ m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pFont, NULL, &pPriority ); |
373 |
|
|
sal_Int32 nToUnicodeStream = 0; |
374 |
|
|
sal_uInt8 nEncoding[256]; |
375 |
|
|
sal_Ucs nEncodedCodes[256]; |
376 |
|
|
@@ -3106,6 +3108,37 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const Physical |
377 |
|
|
if( it->second != -1 ) |
378 |
|
|
{ |
379 |
|
|
sal_Int32 nCode = (sal_Int32)(it->second & 0x000000ff); |
380 |
|
|
+ SAL_WARN_IF(nCode != it->second, "vcl.gdi", "emitEmbeddedFont: FIXME: cannot handle Type 1 font with code points > 256"); |
381 |
|
|
+ if (nEncoding[nCode] != 0) |
382 |
|
|
+ { |
383 |
|
|
+ // should not have 2 identical mappings |
384 |
|
|
+ assert(nEncodedCodes[nCode] != it->first); |
385 |
|
|
+ if (pPriority) |
386 |
|
|
+ { |
387 |
|
|
+ bool bExist = pPriority->find(nEncodedCodes[nCode]) != pPriority->end(); |
388 |
|
|
+ bool bIter = pPriority->find(it->first) != pPriority->end(); |
389 |
|
|
+ SAL_WARN_IF(bExist && bIter, "vcl.gdi", "both are preferred? odd..."); |
390 |
|
|
+ if (bExist) |
391 |
|
|
+ { |
392 |
|
|
+ continue; |
393 |
|
|
+ } |
394 |
|
|
+ // note: aUnicodes will contain the old one but that |
395 |
|
|
+ // does not matter because there's nothing iterating it |
396 |
|
|
+ } |
397 |
|
|
+ else |
398 |
|
|
+ { |
399 |
|
|
+ // is this fallback important? let's prefer lower one |
400 |
|
|
+ if (nEncodedCodes[nCode] < it->first) |
401 |
|
|
+ { |
402 |
|
|
+ SAL_WARN("vcl.gdi", "emitEmbeddedFont: ignoring code " << nCode << " mapping to " << it->first << " in favor of " << nEncodedCodes[nCode]); |
403 |
|
|
+ continue; |
404 |
|
|
+ } |
405 |
|
|
+ else |
406 |
|
|
+ { |
407 |
|
|
+ SAL_WARN("vcl.gdi", "emitEmbeddedFont: ignoring code " << nCode << " mapping to " << nEncodedCodes[nCode] << " in favor of " << it->first); |
408 |
|
|
+ } |
409 |
|
|
+ } |
410 |
|
|
+ } |
411 |
|
|
nEncoding[ nCode ] = static_cast<sal_uInt8>( nCode ); |
412 |
|
|
nEncodedCodes[ nCode ] = it->first; |
413 |
|
|
pEncToUnicodeIndex[ nCode ] = static_cast<sal_Int32>(aUnicodes.size()); |
414 |
|
|
@@ -7230,7 +7263,7 @@ bool PDFWriterImpl::registerGlyphs( int nGlyphs, |
415 |
|
|
const Ucs2OStrMap* pNonEncoded = NULL; |
416 |
|
|
if (!getReferenceDevice()->AcquireGraphics()) |
417 |
|
|
return false; |
418 |
|
|
- pEncoding = m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pCurrentFont, &pNonEncoded ); |
419 |
|
|
+ pEncoding = m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pCurrentFont, &pNonEncoded, 0); |
420 |
|
|
|
421 |
|
|
Ucs2SIntMap::const_iterator enc_it; |
422 |
|
|
Ucs2OStrMap::const_iterator nonenc_it; |
423 |
|
|
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx |
424 |
|
|
index 589b53a..229e408 100644 |
425 |
|
|
--- a/vcl/unx/generic/gdi/cairotextrender.cxx |
426 |
|
|
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx |
427 |
|
|
@@ -637,7 +637,7 @@ void CairoTextRender::FreeEmbedFontData( const void* pData, long nLen ) |
428 |
|
|
GenPspGraphics::DoFreeEmbedFontData( pData, nLen ); |
429 |
|
|
} |
430 |
|
|
|
431 |
|
|
-const Ucs2SIntMap* CairoTextRender::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) |
432 |
|
|
+const Ucs2SIntMap* CairoTextRender::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority) |
433 |
|
|
{ |
434 |
|
|
// in this context the pFont->GetFontId() is a valid PSP |
435 |
|
|
// font since they are the only ones left after the PDF |
436 |
|
|
@@ -645,7 +645,7 @@ const Ucs2SIntMap* CairoTextRender::GetFontEncodingVector( const PhysicalFontFac |
437 |
|
|
// which this method was created). The correct way would |
438 |
|
|
// be to have the GlyphCache search for the PhysicalFontFace pFont |
439 |
|
|
psp::fontID aFont = pFont->GetFontId(); |
440 |
|
|
- return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded ); |
441 |
|
|
+ return GenPspGraphics::DoGetFontEncodingVector(aFont, pNonEncoded, ppPriority); |
442 |
|
|
} |
443 |
|
|
|
444 |
|
|
void CairoTextRender::GetGlyphWidths( const PhysicalFontFace* pFont, |
445 |
|
|
diff --git a/vcl/unx/generic/gdi/salgdi3.cxx b/vcl/unx/generic/gdi/salgdi3.cxx |
446 |
|
|
index 1809923..16918a4 100644 |
447 |
|
|
--- a/vcl/unx/generic/gdi/salgdi3.cxx |
448 |
|
|
+++ b/vcl/unx/generic/gdi/salgdi3.cxx |
449 |
|
|
@@ -188,9 +188,9 @@ void X11SalGraphics::FreeEmbedFontData( const void* pData, long nLen ) |
450 |
|
|
mpTextRenderImpl->FreeEmbedFontData(pData, nLen); |
451 |
|
|
} |
452 |
|
|
|
453 |
|
|
-const Ucs2SIntMap* X11SalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) |
454 |
|
|
+const Ucs2SIntMap* X11SalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority) |
455 |
|
|
{ |
456 |
|
|
- return mpTextRenderImpl->GetFontEncodingVector(pFont, pNonEncoded); |
457 |
|
|
+ return mpTextRenderImpl->GetFontEncodingVector(pFont, pNonEncoded, ppPriority); |
458 |
|
|
} |
459 |
|
|
|
460 |
|
|
void X11SalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont, |
461 |
|
|
diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx |
462 |
|
|
index ba3f5d7e..830538e 100644 |
463 |
|
|
--- a/vcl/win/source/gdi/salgdi3.cxx |
464 |
|
|
+++ b/vcl/win/source/gdi/salgdi3.cxx |
465 |
|
|
@@ -2655,7 +2655,7 @@ void WinSalGraphics::FreeEmbedFontData( const void* pData, long /*nLen*/ ) |
466 |
|
|
delete[] reinterpret_cast<char*>(const_cast<void*>(pData)); |
467 |
|
|
} |
468 |
|
|
|
469 |
|
|
-const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) |
470 |
|
|
+const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const**) |
471 |
|
|
{ |
472 |
|
|
// TODO: even for builtin fonts we get here... why? |
473 |
|
|
if( !pFont->IsEmbeddable() ) |
474 |
|
|
-- |
475 |
|
|
1.9.3 |
476 |
|
|
|