diff --git a/0001-rhbz-1177022-vcl-fix-PDF-embedding-of-Type-1-fonts.patch b/0001-rhbz-1177022-vcl-fix-PDF-embedding-of-Type-1-fonts.patch new file mode 100644 index 0000000..18271ab --- /dev/null +++ b/0001-rhbz-1177022-vcl-fix-PDF-embedding-of-Type-1-fonts.patch @@ -0,0 +1,476 @@ +From 509c57e91c324decada94ac1f70a58fdf52a6372 Mon Sep 17 00:00:00 2001 +From: Michael Stahl +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 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 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 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 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 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 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 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 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 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 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 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 ++#include + + 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 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 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 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 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 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 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( nCode ); + nEncodedCodes[ nCode ] = it->first; + pEncToUnicodeIndex[ nCode ] = static_cast(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 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 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(const_cast(pData)); + } + +-const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) ++const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded, std::set const**) + { + // TODO: even for builtin fonts we get here... why? + if( !pFont->IsEmbeddable() ) +-- +1.9.3 + diff --git a/libreoffice.spec b/libreoffice.spec index f6512ba..50e56c0 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -330,6 +330,7 @@ Patch22: 0001-rhbz-1175027-sw-fix-life-cycle-of-SwConnectionDispos.patch Patch23: 0001-rhbz-1184582-At-least-catch-and-log-UNO-exceptions-i.patch Patch24: 0001-Related-rhbz-1185307-One-more-location-to-look-for-H.patch Patch25: 0001-Resolves-rhbz-1179642-crash-in-GetFocus-with-empty-m.patch +Patch26: 0001-rhbz-1177022-vcl-fix-PDF-embedding-of-Type-1-fonts.patch %define instdir %{_libdir} %define baseinstdir %{instdir}/libreoffice