parent
af3c31987b
commit
d4d2595ab4
@ -0,0 +1,476 @@
|
|||||||
|
From 509c57e91c324decada94ac1f70a58fdf52a6372 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Stahl <mstahl@redhat.com>
|
||||||
|
Date: Tue, 27 Jan 2015 00:20:58 +0100
|
||||||
|
Subject: [PATCH] rhbz#1177022: vcl: fix PDF embedding of Type 1 fonts
|
||||||
|
|
||||||
|
Problem is that for the "CM Typewriter" font the Width for "space" (32)
|
||||||
|
is exported as 0 instead of 525, which is the correct value in the AFM.
|
||||||
|
|
||||||
|
The reason is that PDFWriterImpl::emitEmbeddedFont() has various arrays
|
||||||
|
to map from font code points to Unicode code points, and there are
|
||||||
|
duplicate mappings, so the 160->32 mapping overrides 32->32.
|
||||||
|
|
||||||
|
The PrintFontManager::PrintFont::readAfmMetrics() actually creates a
|
||||||
|
Unicode to font code mapping (which may legitimately be n:1) that is
|
||||||
|
then inverted; add an additional hack to store a set of "preferred"
|
||||||
|
Unicodes so that PDFWriterImpl can pick the right Unicode.
|
||||||
|
|
||||||
|
Presumably the code that is stored explicitly via "C" or "CH" in the
|
||||||
|
AFM should take priority over more generic mappings.
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
vcl/inc/cairotextrender.hxx
|
||||||
|
vcl/inc/textrender.hxx
|
||||||
|
vcl/inc/unx/salgdi.h
|
||||||
|
vcl/source/gdi/pdfwriter_impl.cxx
|
||||||
|
|
||||||
|
Change-Id: Id4205a1cd45ba6a0a5facee1e39f70c3535e7dd4
|
||||||
|
---
|
||||||
|
vcl/generic/fontmanager/fontmanager.cxx | 25 +++++++++++++++++++++-
|
||||||
|
vcl/generic/print/genpspgraphics.cxx | 8 +++----
|
||||||
|
vcl/headless/svptext.cxx | 4 ++--
|
||||||
|
vcl/inc/cairotextrender.hxx | 2 +-
|
||||||
|
vcl/inc/fontmanager.hxx | 7 ++++++-
|
||||||
|
vcl/inc/generic/genpspgraphics.h | 6 ++++--
|
||||||
|
vcl/inc/headless/svpgdi.hxx | 2 +-
|
||||||
|
vcl/inc/quartz/salgdi.h | 2 +-
|
||||||
|
vcl/inc/salgdi.hxx | 4 +++-
|
||||||
|
vcl/inc/textrender.hxx | 2 +-
|
||||||
|
vcl/inc/unx/salgdi.h | 2 +-
|
||||||
|
vcl/inc/win/salgdi.h | 2 +-
|
||||||
|
vcl/quartz/salgdi.cxx | 2 +-
|
||||||
|
vcl/source/gdi/pdfwriter_impl.cxx | 37 +++++++++++++++++++++++++++++++--
|
||||||
|
vcl/unx/generic/gdi/cairotextrender.cxx | 4 ++--
|
||||||
|
vcl/unx/generic/gdi/salgdi3.cxx | 4 ++--
|
||||||
|
vcl/win/source/gdi/salgdi3.cxx | 2 +-
|
||||||
|
17 files changed, 90 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/vcl/generic/fontmanager/fontmanager.cxx b/vcl/generic/fontmanager/fontmanager.cxx
|
||||||
|
index 33fb4ed..d5b481f 100644
|
||||||
|
--- a/vcl/generic/fontmanager/fontmanager.cxx
|
||||||
|
+++ b/vcl/generic/fontmanager/fontmanager.cxx
|
||||||
|
@@ -291,6 +291,7 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider,
|
||||||
|
}
|
||||||
|
|
||||||
|
m_aEncodingVector.clear();
|
||||||
|
+ m_aEncodingVectorPriority.clear();
|
||||||
|
// fill in global info
|
||||||
|
|
||||||
|
// PSName
|
||||||
|
@@ -504,7 +505,10 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider,
|
||||||
|
{
|
||||||
|
pUnicodes[i] = pChar->code + 0xf000;
|
||||||
|
if( bFillEncodingvector )
|
||||||
|
+ {
|
||||||
|
m_aEncodingVector[ pUnicodes[i] ] = pChar->code;
|
||||||
|
+ m_aEncodingVectorPriority.insert(pUnicodes[i]);
|
||||||
|
+ }
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -565,7 +569,10 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider,
|
||||||
|
{
|
||||||
|
m_pMetrics->m_aMetrics[ pUnicodes[i] ] = aMetric;
|
||||||
|
if( bFillEncodingvector )
|
||||||
|
+ {
|
||||||
|
m_aEncodingVector[ pUnicodes[i] ] = pChar->code;
|
||||||
|
+ m_aEncodingVectorPriority.insert(pUnicodes[i]);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
else if( pChar->name )
|
||||||
|
{
|
||||||
|
@@ -593,13 +600,21 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider,
|
||||||
|
::std::pair< ::boost::unordered_multimap< sal_uInt8, sal_Unicode >::const_iterator,
|
||||||
|
::boost::unordered_multimap< sal_uInt8, sal_Unicode >::const_iterator >
|
||||||
|
aCodes = rManager.getUnicodeFromAdobeCode( pChar->code );
|
||||||
|
+ bool bFirst = true;
|
||||||
|
while( aCodes.first != aCodes.second )
|
||||||
|
{
|
||||||
|
if( (*aCodes.first).second != 0 )
|
||||||
|
{
|
||||||
|
m_pMetrics->m_aMetrics[ (*aCodes.first).second ] = aMetric;
|
||||||
|
if( bFillEncodingvector )
|
||||||
|
+ {
|
||||||
|
m_aEncodingVector[ (*aCodes.first).second ] = pChar->code;
|
||||||
|
+ if (bFirst) // arbitrarily prefer the first one
|
||||||
|
+ {
|
||||||
|
+ m_aEncodingVectorPriority.insert((*aCodes.first).second);
|
||||||
|
+ bFirst = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
++aCodes.first;
|
||||||
|
}
|
||||||
|
@@ -613,7 +628,10 @@ bool PrintFontManager::PrintFont::readAfmMetrics( MultiAtomProvider* pProvider,
|
||||||
|
m_pMetrics->m_aMetrics[ code ] = aMetric;
|
||||||
|
// maybe should try to find the name in the convtabs ?
|
||||||
|
if( bFillEncodingvector )
|
||||||
|
+ {
|
||||||
|
m_aEncodingVector[ code ] = pChar->code;
|
||||||
|
+ m_aEncodingVectorPriority.insert(code);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2140,7 +2158,7 @@ void PrintFontManager::getGlyphWidths( fontID nFont,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-const std::map< sal_Unicode, sal_Int32 >* PrintFontManager::getEncodingMap( fontID nFont, const std::map< sal_Unicode, OString >** pNonEncoded ) const
|
||||||
|
+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
|
||||||
|
{
|
||||||
|
PrintFont* pFont = getFont( nFont );
|
||||||
|
if( !pFont || pFont->m_eType != fonttype::Type1 )
|
||||||
|
@@ -2152,6 +2170,11 @@ const std::map< sal_Unicode, sal_Int32 >* PrintFontManager::getEncodingMap( font
|
||||||
|
if( pNonEncoded )
|
||||||
|
*pNonEncoded = pFont->m_aNonEncoded.size() ? &pFont->m_aNonEncoded : NULL;
|
||||||
|
|
||||||
|
+ if (ppPriority)
|
||||||
|
+ {
|
||||||
|
+ *ppPriority = &pFont->m_aEncodingVectorPriority;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return pFont->m_aEncodingVector.size() ? &pFont->m_aEncodingVector : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/vcl/generic/print/genpspgraphics.cxx b/vcl/generic/print/genpspgraphics.cxx
|
||||||
|
index 1e63ab0..58991c3 100644
|
||||||
|
--- a/vcl/generic/print/genpspgraphics.cxx
|
||||||
|
+++ b/vcl/generic/print/genpspgraphics.cxx
|
||||||
|
@@ -1009,7 +1009,7 @@ bool GenPspGraphics::CreateFontSubset(
|
||||||
|
return bSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
-const Ucs2SIntMap* GenPspGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded )
|
||||||
|
+const Ucs2SIntMap* GenPspGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority)
|
||||||
|
{
|
||||||
|
// in this context the pFont->GetFontId() is a valid PSP
|
||||||
|
// font since they are the only ones left after the PDF
|
||||||
|
@@ -1017,7 +1017,7 @@ const Ucs2SIntMap* GenPspGraphics::GetFontEncodingVector( const PhysicalFontFace
|
||||||
|
// which this method was created). The correct way would
|
||||||
|
// be to have the GlyphCache search for the PhysicalFontFace pFont
|
||||||
|
psp::fontID aFont = pFont->GetFontId();
|
||||||
|
- return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded );
|
||||||
|
+ return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded, ppPriority );
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenPspGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
|
||||||
|
@@ -1034,7 +1034,7 @@ void GenPspGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
|
||||||
|
GenPspGraphics::DoGetGlyphWidths( aFont, bVertical, rWidths, rUnicodeEnc );
|
||||||
|
}
|
||||||
|
|
||||||
|
-const Ucs2SIntMap* GenPspGraphics::DoGetFontEncodingVector( fontID aFont, const Ucs2OStrMap** pNonEncoded )
|
||||||
|
+const Ucs2SIntMap* GenPspGraphics::DoGetFontEncodingVector( fontID aFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority)
|
||||||
|
{
|
||||||
|
psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
|
||||||
|
|
||||||
|
@@ -1046,7 +1046,7 @@ const Ucs2SIntMap* GenPspGraphics::DoGetFontEncodingVector( fontID aFont, const
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return rMgr.getEncodingMap( aFont, pNonEncoded );
|
||||||
|
+ return rMgr.getEncodingMap( aFont, pNonEncoded, ppPriority );
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenPspGraphics::DoGetGlyphWidths( psp::fontID aFont,
|
||||||
|
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
|
||||||
|
index 8fc51ce..5fb0af8 100644
|
||||||
|
--- a/vcl/headless/svptext.cxx
|
||||||
|
+++ b/vcl/headless/svptext.cxx
|
||||||
|
@@ -321,7 +321,7 @@ bool SvpSalGraphics::CreateFontSubset(
|
||||||
|
return bSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
-const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded )
|
||||||
|
+const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority)
|
||||||
|
{
|
||||||
|
// in this context the pFont->GetFontId() is a valid PSP
|
||||||
|
// font since they are the only ones left after the PDF
|
||||||
|
@@ -329,7 +329,7 @@ const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const PhysicalFontFace
|
||||||
|
// which this method was created). The correct way would
|
||||||
|
// be to have the GlyphCache search for the PhysicalFontFace pFont
|
||||||
|
psp::fontID aFont = pFont->GetFontId();
|
||||||
|
- return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded );
|
||||||
|
+ return GenPspGraphics::DoGetFontEncodingVector(aFont, pNonEncoded, ppPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
const void* SvpSalGraphics::GetEmbedFontData(
|
||||||
|
diff --git a/vcl/inc/cairotextrender.hxx b/vcl/inc/cairotextrender.hxx
|
||||||
|
index 2b8a21e..fdbc001 100644
|
||||||
|
--- a/vcl/inc/cairotextrender.hxx
|
||||||
|
+++ b/vcl/inc/cairotextrender.hxx
|
||||||
|
@@ -104,7 +104,7 @@ public:
|
||||||
|
int nGlyphs,
|
||||||
|
FontSubsetInfo& rInfo
|
||||||
|
) SAL_OVERRIDE;
|
||||||
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE;
|
||||||
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ) SAL_OVERRIDE;
|
||||||
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*,
|
||||||
|
const sal_Ucs* pUnicodes,
|
||||||
|
sal_Int32* pWidths,
|
||||||
|
diff --git a/vcl/inc/fontmanager.hxx b/vcl/inc/fontmanager.hxx
|
||||||
|
index e1203bd..0091849 100644
|
||||||
|
--- a/vcl/inc/fontmanager.hxx
|
||||||
|
+++ b/vcl/inc/fontmanager.hxx
|
||||||
|
@@ -202,7 +202,12 @@ class VCL_PLUGIN_PUBLIC PrintFontManager
|
||||||
|
bool m_bHaveVerticalSubstitutedGlyphs;
|
||||||
|
bool m_bUserOverride;
|
||||||
|
|
||||||
|
+ /// mapping from unicode (well, UCS-2) to font code
|
||||||
|
std::map< sal_Unicode, sal_Int32 > m_aEncodingVector;
|
||||||
|
+ /// HACK for Type 1 fonts: if multiple UCS-2 codes map to the same
|
||||||
|
+ /// font code, this set contains the preferred one, i.e., the one that
|
||||||
|
+ /// is specified explicitly via "C" or "CH" in the AFM file
|
||||||
|
+ std::set<sal_Unicode> m_aEncodingVectorPriority;
|
||||||
|
std::map< sal_Unicode, OString > m_aNonEncoded;
|
||||||
|
|
||||||
|
explicit PrintFont( fonttype::type eType );
|
||||||
|
@@ -438,7 +443,7 @@ public:
|
||||||
|
// if ppNonEncoded is set and non encoded type1 glyphs exist
|
||||||
|
// then *ppNonEncoded is set to the mapping for nonencoded glyphs.
|
||||||
|
// the encoding vector contains -1 for non encoded glyphs
|
||||||
|
- const std::map< sal_Unicode, sal_Int32 >* getEncodingMap( fontID nFontID, const std::map< sal_Unicode, OString >** ppNonEncoded ) const;
|
||||||
|
+ const std::map< sal_Unicode, sal_Int32 >* getEncodingMap( fontID nFontID, const std::map< sal_Unicode, OString >** ppNonEncoded, std::set<sal_Unicode> const ** ppPriority ) const;
|
||||||
|
|
||||||
|
// evaluates copyright flags for TrueType fonts for printing/viewing
|
||||||
|
// type1 fonts do not have such a feature, so return for them is true
|
||||||
|
diff --git a/vcl/inc/generic/genpspgraphics.h b/vcl/inc/generic/genpspgraphics.h
|
||||||
|
index 18a434f..b2cf527 100644
|
||||||
|
--- a/vcl/inc/generic/genpspgraphics.h
|
||||||
|
+++ b/vcl/inc/generic/genpspgraphics.h
|
||||||
|
@@ -60,7 +60,8 @@ public:
|
||||||
|
|
||||||
|
// helper methods for sharing with X11SalGraphics
|
||||||
|
static const Ucs2SIntMap* DoGetFontEncodingVector( psp::fontID aFont,
|
||||||
|
- const Ucs2OStrMap** pNonEncoded );
|
||||||
|
+ const Ucs2OStrMap** pNonEncoded,
|
||||||
|
+ std::set<sal_Unicode> const** ppPriority);
|
||||||
|
static void DoGetGlyphWidths( psp::fontID aFont,
|
||||||
|
bool bVertical,
|
||||||
|
Int32Vector& rWidths,
|
||||||
|
@@ -107,7 +108,8 @@ public:
|
||||||
|
int nGlyphs,
|
||||||
|
FontSubsetInfo& rInfo ) SAL_OVERRIDE;
|
||||||
|
virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*,
|
||||||
|
- const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE;
|
||||||
|
+ const Ucs2OStrMap** ppNonEncoded,
|
||||||
|
+ std::set<sal_Unicode> const** ppPriority) SAL_OVERRIDE;
|
||||||
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*,
|
||||||
|
const sal_Ucs* pUnicodes,
|
||||||
|
sal_Int32* pWidths,
|
||||||
|
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
|
||||||
|
index 9ae3d05..87bf5e0e 100644
|
||||||
|
--- a/vcl/inc/headless/svpgdi.hxx
|
||||||
|
+++ b/vcl/inc/headless/svpgdi.hxx
|
||||||
|
@@ -176,7 +176,7 @@ public:
|
||||||
|
int nGlyphs,
|
||||||
|
FontSubsetInfo& rInfo
|
||||||
|
) SAL_OVERRIDE;
|
||||||
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE;
|
||||||
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ) SAL_OVERRIDE;
|
||||||
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*,
|
||||||
|
const sal_Ucs* pUnicodes,
|
||||||
|
sal_Int32* pWidths,
|
||||||
|
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
|
||||||
|
index 9a5d4da..e9c51cbd 100644
|
||||||
|
--- a/vcl/inc/quartz/salgdi.h
|
||||||
|
+++ b/vcl/inc/quartz/salgdi.h
|
||||||
|
@@ -368,7 +368,7 @@ public:
|
||||||
|
// glyphs with only a name) exist it is set to the corresponding
|
||||||
|
// map for non encoded glyphs; the encoding vector contains -1
|
||||||
|
// as encoding for these cases
|
||||||
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE;
|
||||||
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ) SAL_OVERRIDE;
|
||||||
|
|
||||||
|
// GetEmbedFontData: gets the font data for a font marked
|
||||||
|
// embeddable by GetDevFontList or NULL in case of error
|
||||||
|
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
|
||||||
|
index ff6271c..2849cc1 100644
|
||||||
|
--- a/vcl/inc/salgdi.hxx
|
||||||
|
+++ b/vcl/inc/salgdi.hxx
|
||||||
|
@@ -34,6 +34,7 @@
|
||||||
|
#include "sallayout.hxx"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
+#include <set>
|
||||||
|
|
||||||
|
class PhysicalFontCollection;
|
||||||
|
class SalBitmap;
|
||||||
|
@@ -188,7 +189,8 @@ public:
|
||||||
|
// as encoding for these cases
|
||||||
|
virtual const Ucs2SIntMap* GetFontEncodingVector(
|
||||||
|
const PhysicalFontFace*,
|
||||||
|
- const Ucs2OStrMap** ppNonEncoded ) = 0;
|
||||||
|
+ const Ucs2OStrMap** ppNonEncoded,
|
||||||
|
+ std::set<sal_Unicode> const** ppPriority) = 0;
|
||||||
|
|
||||||
|
// GetEmbedFontData: gets the font data for a font marked
|
||||||
|
// embeddable by GetDevFontList or NULL in case of error
|
||||||
|
diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx
|
||||||
|
index f4dcc83..48f1a74 100644
|
||||||
|
--- a/vcl/inc/textrender.hxx
|
||||||
|
+++ b/vcl/inc/textrender.hxx
|
||||||
|
@@ -58,7 +58,7 @@ public:
|
||||||
|
int nGlyphs,
|
||||||
|
FontSubsetInfo& rInfo
|
||||||
|
) = 0;
|
||||||
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) = 0;
|
||||||
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ppPriority ) = 0;
|
||||||
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*,
|
||||||
|
const sal_Ucs* pUnicodes,
|
||||||
|
sal_Int32* pWidths,
|
||||||
|
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
|
||||||
|
index 29697a9..a550c96 100644
|
||||||
|
--- a/vcl/inc/unx/salgdi.h
|
||||||
|
+++ b/vcl/inc/unx/salgdi.h
|
||||||
|
@@ -179,7 +179,7 @@ public:
|
||||||
|
int nGlyphs,
|
||||||
|
FontSubsetInfo& rInfo
|
||||||
|
) SAL_OVERRIDE;
|
||||||
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded ) SAL_OVERRIDE;
|
||||||
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** ppPriority ) SAL_OVERRIDE;
|
||||||
|
virtual const void* GetEmbedFontData( const PhysicalFontFace*,
|
||||||
|
const sal_Ucs* pUnicodes,
|
||||||
|
sal_Int32* pWidths,
|
||||||
|
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
|
||||||
|
index 5a46cb1f..358eae5 100644
|
||||||
|
--- a/vcl/inc/win/salgdi.h
|
||||||
|
+++ b/vcl/inc/win/salgdi.h
|
||||||
|
@@ -411,7 +411,7 @@ public:
|
||||||
|
// glyphs with only a name) exist it is set to the corresponding
|
||||||
|
// map for non encoded glyphs; the encoding vector contains -1
|
||||||
|
// as encoding for these cases
|
||||||
|
- virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded );
|
||||||
|
+ virtual const Ucs2SIntMap* GetFontEncodingVector( const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded, std::set<sal_Unicode> const** );
|
||||||
|
|
||||||
|
// GetEmbedFontData: gets the font data for a font marked
|
||||||
|
// embeddable by GetDevFontList or NULL in case of error
|
||||||
|
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
|
||||||
|
index 0b1ffef..79d30bf 100644
|
||||||
|
--- a/vcl/quartz/salgdi.cxx
|
||||||
|
+++ b/vcl/quartz/salgdi.cxx
|
||||||
|
@@ -751,7 +751,7 @@ void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool bV
|
||||||
|
}
|
||||||
|
|
||||||
|
const Ucs2SIntMap* AquaSalGraphics::GetFontEncodingVector(
|
||||||
|
- const PhysicalFontFace*, const Ucs2OStrMap** /*ppNonEncoded*/ )
|
||||||
|
+ const PhysicalFontFace*, const Ucs2OStrMap** /*ppNonEncoded*/, std::set<sal_Unicode> const** )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
|
||||||
|
index 93efd94..2ad37ce 100644
|
||||||
|
--- a/vcl/source/gdi/pdfwriter_impl.cxx
|
||||||
|
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
|
||||||
|
@@ -3087,7 +3087,9 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const Physical
|
||||||
|
sal_Int32 nFontDescriptor = 0;
|
||||||
|
|
||||||
|
// prepare font encoding
|
||||||
|
- const Ucs2SIntMap* pEncoding = m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pFont, NULL );
|
||||||
|
+ std::set<sal_Unicode> const * pPriority(0);
|
||||||
|
+ const Ucs2SIntMap *const pEncoding =
|
||||||
|
+ m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pFont, NULL, &pPriority );
|
||||||
|
sal_Int32 nToUnicodeStream = 0;
|
||||||
|
sal_uInt8 nEncoding[256];
|
||||||
|
sal_Ucs nEncodedCodes[256];
|
||||||
|
@@ -3106,6 +3108,37 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const Physical
|
||||||
|
if( it->second != -1 )
|
||||||
|
{
|
||||||
|
sal_Int32 nCode = (sal_Int32)(it->second & 0x000000ff);
|
||||||
|
+ SAL_WARN_IF(nCode != it->second, "vcl.gdi", "emitEmbeddedFont: FIXME: cannot handle Type 1 font with code points > 256");
|
||||||
|
+ if (nEncoding[nCode] != 0)
|
||||||
|
+ {
|
||||||
|
+ // should not have 2 identical mappings
|
||||||
|
+ assert(nEncodedCodes[nCode] != it->first);
|
||||||
|
+ if (pPriority)
|
||||||
|
+ {
|
||||||
|
+ bool bExist = pPriority->find(nEncodedCodes[nCode]) != pPriority->end();
|
||||||
|
+ bool bIter = pPriority->find(it->first) != pPriority->end();
|
||||||
|
+ SAL_WARN_IF(bExist && bIter, "vcl.gdi", "both are preferred? odd...");
|
||||||
|
+ if (bExist)
|
||||||
|
+ {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ // note: aUnicodes will contain the old one but that
|
||||||
|
+ // does not matter because there's nothing iterating it
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ // is this fallback important? let's prefer lower one
|
||||||
|
+ if (nEncodedCodes[nCode] < it->first)
|
||||||
|
+ {
|
||||||
|
+ SAL_WARN("vcl.gdi", "emitEmbeddedFont: ignoring code " << nCode << " mapping to " << it->first << " in favor of " << nEncodedCodes[nCode]);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ SAL_WARN("vcl.gdi", "emitEmbeddedFont: ignoring code " << nCode << " mapping to " << nEncodedCodes[nCode] << " in favor of " << it->first);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
nEncoding[ nCode ] = static_cast<sal_uInt8>( nCode );
|
||||||
|
nEncodedCodes[ nCode ] = it->first;
|
||||||
|
pEncToUnicodeIndex[ nCode ] = static_cast<sal_Int32>(aUnicodes.size());
|
||||||
|
@@ -7230,7 +7263,7 @@ bool PDFWriterImpl::registerGlyphs( int nGlyphs,
|
||||||
|
const Ucs2OStrMap* pNonEncoded = NULL;
|
||||||
|
if (!getReferenceDevice()->AcquireGraphics())
|
||||||
|
return false;
|
||||||
|
- pEncoding = m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pCurrentFont, &pNonEncoded );
|
||||||
|
+ pEncoding = m_pReferenceDevice->mpGraphics->GetFontEncodingVector( pCurrentFont, &pNonEncoded, 0);
|
||||||
|
|
||||||
|
Ucs2SIntMap::const_iterator enc_it;
|
||||||
|
Ucs2OStrMap::const_iterator nonenc_it;
|
||||||
|
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
|
||||||
|
index 589b53a..229e408 100644
|
||||||
|
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
|
||||||
|
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
|
||||||
|
@@ -637,7 +637,7 @@ void CairoTextRender::FreeEmbedFontData( const void* pData, long nLen )
|
||||||
|
GenPspGraphics::DoFreeEmbedFontData( pData, nLen );
|
||||||
|
}
|
||||||
|
|
||||||
|
-const Ucs2SIntMap* CairoTextRender::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded )
|
||||||
|
+const Ucs2SIntMap* CairoTextRender::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority)
|
||||||
|
{
|
||||||
|
// in this context the pFont->GetFontId() is a valid PSP
|
||||||
|
// font since they are the only ones left after the PDF
|
||||||
|
@@ -645,7 +645,7 @@ const Ucs2SIntMap* CairoTextRender::GetFontEncodingVector( const PhysicalFontFac
|
||||||
|
// which this method was created). The correct way would
|
||||||
|
// be to have the GlyphCache search for the PhysicalFontFace pFont
|
||||||
|
psp::fontID aFont = pFont->GetFontId();
|
||||||
|
- return GenPspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded );
|
||||||
|
+ return GenPspGraphics::DoGetFontEncodingVector(aFont, pNonEncoded, ppPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CairoTextRender::GetGlyphWidths( const PhysicalFontFace* pFont,
|
||||||
|
diff --git a/vcl/unx/generic/gdi/salgdi3.cxx b/vcl/unx/generic/gdi/salgdi3.cxx
|
||||||
|
index 1809923..16918a4 100644
|
||||||
|
--- a/vcl/unx/generic/gdi/salgdi3.cxx
|
||||||
|
+++ b/vcl/unx/generic/gdi/salgdi3.cxx
|
||||||
|
@@ -188,9 +188,9 @@ void X11SalGraphics::FreeEmbedFontData( const void* pData, long nLen )
|
||||||
|
mpTextRenderImpl->FreeEmbedFontData(pData, nLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
-const Ucs2SIntMap* X11SalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded )
|
||||||
|
+const Ucs2SIntMap* X11SalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const** ppPriority)
|
||||||
|
{
|
||||||
|
- return mpTextRenderImpl->GetFontEncodingVector(pFont, pNonEncoded);
|
||||||
|
+ return mpTextRenderImpl->GetFontEncodingVector(pFont, pNonEncoded, ppPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
void X11SalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
|
||||||
|
diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx
|
||||||
|
index ba3f5d7e..830538e 100644
|
||||||
|
--- a/vcl/win/source/gdi/salgdi3.cxx
|
||||||
|
+++ b/vcl/win/source/gdi/salgdi3.cxx
|
||||||
|
@@ -2655,7 +2655,7 @@ void WinSalGraphics::FreeEmbedFontData( const void* pData, long /*nLen*/ )
|
||||||
|
delete[] reinterpret_cast<char*>(const_cast<void*>(pData));
|
||||||
|
}
|
||||||
|
|
||||||
|
-const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded )
|
||||||
|
+const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set<sal_Unicode> const**)
|
||||||
|
{
|
||||||
|
// TODO: even for builtin fonts we get here... why?
|
||||||
|
if( !pFont->IsEmbeddable() )
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
Loading…
Reference in new issue