oox/inc/drawingml/textfont.hxx                   |    4 +++-
 oox/source/drawingml/shape.cxx                   |   18 +++++++++---------
 oox/source/drawingml/textcharacterproperties.cxx |   12 ++++++------
 oox/source/drawingml/textfont.cxx                |   10 ++++++----
 oox/source/drawingml/textparagraphproperties.cxx |    6 +++---
 oox/source/drawingml/textrun.cxx                 |    7 ++++++-
 6 files changed, 33 insertions(+), 24 deletions(-)

New commits:
commit 7f1c2b6ccf318d3b6bbf46f6559b2a3017a72821
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Mon Aug 28 20:54:50 2023 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Aug 29 09:26:34 2023 +0200

    pptx using Wingdings didn't fallback to OpenSymbol
    
    <a:sym typeface="Wingdings" pitchFamily="2" charset="2"/>
                                                         ^
    
    The charset indicating that it was symbol encoded wasn't
    applied.
    
    There are quite a few uses of GetFontData so make this
    an optional request and only apply it right now to the
    problematic case.
    
    Change-Id: Ie1c4b9ac38c2bf5f0867d64eddea853a6dd05aad
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156230
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/oox/inc/drawingml/textfont.hxx b/oox/inc/drawingml/textfont.hxx
index 1c6da232d443..e5f245a43380 100644
--- a/oox/inc/drawingml/textfont.hxx
+++ b/oox/inc/drawingml/textfont.hxx
@@ -50,6 +50,7 @@ public:
                             OUString& rFontName,
                             sal_Int16& rnFontPitch,
                             sal_Int16& rnFontFamily,
+                            bool* pbSymbol,
                             const ::oox::core::XmlFilterBase& rFilter ) const;
 
     void fillThemeFont(model::ThemeFont& rThemeFont) const;
@@ -60,7 +61,8 @@ private:
     bool                implGetFontData(
                             OUString& rFontName,
                             sal_Int16& rnFontPitch,
-                            sal_Int16& rnFontFamily ) const;
+                            sal_Int16& rnFontFamily,
+                            bool* pbSymbol ) const;
 
 private:
     OUString maTypeface;
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 4f600528b56a..b4e0a05ba7a6 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -639,7 +639,7 @@ static void lcl_copyCharPropsToShape(const 
uno::Reference<drawing::XShape>& xSha
                 // minor Latin
                 if (const TextFont* pFont = pTheme->resolveFont(u"+mn-lt"))
                 {
-                    bRet = pFont->getFontData(sFontName, nFontPitch, 
nFontFamily, rFilter);
+                    bRet = pFont->getFontData(sFontName, nFontPitch, 
nFontFamily, nullptr, rFilter);
                     if (bRet)
                     {
                         xSet->setPropertyValue(u"CharFontName", 
uno::Any(sFontName));
@@ -650,7 +650,7 @@ static void lcl_copyCharPropsToShape(const 
uno::Reference<drawing::XShape>& xSha
                 // minor Asian
                 if (const TextFont* pFont = pTheme->resolveFont(u"+mn-ea"))
                 {
-                    bRet = pFont->getFontData(sFontName, nFontPitch, 
nFontFamily, rFilter);
+                    bRet = pFont->getFontData(sFontName, nFontPitch, 
nFontFamily, nullptr, rFilter);
                     if (bRet)
                     {
                         xSet->setPropertyValue(u"CharFontNameAsian", 
uno::Any(sFontName));
@@ -661,7 +661,7 @@ static void lcl_copyCharPropsToShape(const 
uno::Reference<drawing::XShape>& xSha
                 // minor Complex
                 if (const TextFont* pFont = pTheme->resolveFont(u"+mn-cs"))
                 {
-                    bRet = pFont->getFontData(sFontName, nFontPitch, 
nFontFamily, rFilter);
+                    bRet = pFont->getFontData(sFontName, nFontPitch, 
nFontFamily, nullptr, rFilter);
                     if (bRet)
                     {
                         xSet->setPropertyValue(u"CharFontNameComplex", 
uno::Any(sFontName));
@@ -673,10 +673,10 @@ static void lcl_copyCharPropsToShape(const 
uno::Reference<drawing::XShape>& xSha
 
             // Replace theme fonts with formatting at run if any. ToDo: 
Inspect paragraph too?
             // Latin
-            bRet = rCharProps.maLatinFont.getFontData(sFontName, nFontPitch, 
nFontFamily, rFilter);
+            bRet = rCharProps.maLatinFont.getFontData(sFontName, nFontPitch, 
nFontFamily, nullptr, rFilter);
             if (!bRet)
                 // In case there is no direct font, try to look it up as a 
theme reference.
-                bRet = rCharProps.maLatinThemeFont.getFontData(sFontName, 
nFontPitch, nFontFamily,
+                bRet = rCharProps.maLatinThemeFont.getFontData(sFontName, 
nFontPitch, nFontFamily, nullptr,
                                                                rFilter);
 
             if (bRet)
@@ -686,10 +686,10 @@ static void lcl_copyCharPropsToShape(const 
uno::Reference<drawing::XShape>& xSha
                 xSet->setPropertyValue(u"CharFontFamily", 
uno::Any(nFontFamily));
             }
             // Asian
-            bRet = rCharProps.maAsianFont.getFontData(sFontName, nFontPitch, 
nFontFamily, rFilter);
+            bRet = rCharProps.maAsianFont.getFontData(sFontName, nFontPitch, 
nFontFamily, nullptr, rFilter);
             if (!bRet)
                 // In case there is no direct font, try to look it up as a 
theme reference.
-                bRet = rCharProps.maAsianThemeFont.getFontData(sFontName, 
nFontPitch, nFontFamily,
+                bRet = rCharProps.maAsianThemeFont.getFontData(sFontName, 
nFontPitch, nFontFamily, nullptr,
                                                                rFilter);
             if (bRet)
             {
@@ -699,10 +699,10 @@ static void lcl_copyCharPropsToShape(const 
uno::Reference<drawing::XShape>& xSha
             }
             // Complex
             bRet
-                = rCharProps.maComplexFont.getFontData(sFontName, nFontPitch, 
nFontFamily, rFilter);
+                = rCharProps.maComplexFont.getFontData(sFontName, nFontPitch, 
nFontFamily, nullptr, rFilter);
             if (!bRet)
                 // In case there is no direct font, try to look it up as a 
theme reference.
-                bRet = rCharProps.maComplexThemeFont.getFontData(sFontName, 
nFontPitch, nFontFamily,
+                bRet = rCharProps.maComplexThemeFont.getFontData(sFontName, 
nFontPitch, nFontFamily, nullptr,
                                                                  rFilter);
             if (bRet)
             {
diff --git a/oox/source/drawingml/textcharacterproperties.cxx 
b/oox/source/drawingml/textcharacterproperties.cxx
index c3dde4889a64..d123f3607208 100644
--- a/oox/source/drawingml/textcharacterproperties.cxx
+++ b/oox/source/drawingml/textcharacterproperties.cxx
@@ -78,10 +78,10 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& 
rPropMap, const XmlFil
     sal_Int16 nFontPitch = 0;
     sal_Int16 nFontFamily = 0;
 
-    bool bRet = maLatinFont.getFontData( aFontName, nFontPitch, nFontFamily, 
rFilter );
+    bool bRet = maLatinFont.getFontData( aFontName, nFontPitch, nFontFamily, 
nullptr, rFilter );
     if (!bRet)
         // In case there is no direct font, try to look it up as a theme 
reference.
-        bRet = maLatinThemeFont.getFontData( aFontName, nFontPitch, 
nFontFamily, rFilter );
+        bRet = maLatinThemeFont.getFontData( aFontName, nFontPitch, 
nFontFamily, nullptr, rFilter );
     if (bRet)
     {
         rPropMap.setProperty( PROP_CharFontName, aFontName);
@@ -89,9 +89,9 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& 
rPropMap, const XmlFil
         rPropMap.setProperty( PROP_CharFontFamily, nFontFamily);
     }
 
-    bRet = maAsianFont.getFontData( aFontName, nFontPitch, nFontFamily, 
rFilter );
+    bRet = maAsianFont.getFontData( aFontName, nFontPitch, nFontFamily, 
nullptr, rFilter );
     if (!bRet)
-        bRet = maAsianThemeFont.getFontData( aFontName, nFontPitch, 
nFontFamily, rFilter );
+        bRet = maAsianThemeFont.getFontData( aFontName, nFontPitch, 
nFontFamily, nullptr, rFilter );
     if (bRet)
     {
         rPropMap.setProperty( PROP_CharFontNameAsian, aFontName);
@@ -99,9 +99,9 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& 
rPropMap, const XmlFil
         rPropMap.setProperty( PROP_CharFontFamilyAsian, nFontPitch);
     }
 
-    bRet = maComplexFont.getFontData( aFontName, nFontPitch, nFontFamily, 
rFilter );
+    bRet = maComplexFont.getFontData( aFontName, nFontPitch, nFontFamily, 
nullptr, rFilter );
     if (!bRet)
-        bRet = maComplexThemeFont.getFontData( aFontName, nFontPitch, 
nFontFamily, rFilter );
+        bRet = maComplexThemeFont.getFontData( aFontName, nFontPitch, 
nFontFamily, nullptr, rFilter );
     if (bRet)
     {
         rPropMap.setProperty( PROP_CharFontNameComplex, aFontName);
diff --git a/oox/source/drawingml/textfont.cxx 
b/oox/source/drawingml/textfont.cxx
index 1ac57258a7da..40cd842f945a 100644
--- a/oox/source/drawingml/textfont.cxx
+++ b/oox/source/drawingml/textfont.cxx
@@ -76,18 +76,20 @@ void TextFont::assignIfUsed( const TextFont& rTextFont )
         *this = rTextFont;
 }
 
-bool TextFont::getFontData( OUString& rFontName, sal_Int16& rnFontPitch, 
sal_Int16& rnFontFamily, const XmlFilterBase& rFilter ) const
+bool TextFont::getFontData( OUString& rFontName, sal_Int16& rnFontPitch, 
sal_Int16& rnFontFamily, bool* pbSymbol, const XmlFilterBase& rFilter ) const
 {
     if( const Theme* pTheme = rFilter.getCurrentTheme() )
         if( const TextFont* pFont = pTheme->resolveFont( maTypeface ) )
-            return pFont->implGetFontData( rFontName, rnFontPitch, 
rnFontFamily );
-    return implGetFontData( rFontName, rnFontPitch, rnFontFamily );
+            return pFont->implGetFontData( rFontName, rnFontPitch, 
rnFontFamily, pbSymbol );
+    return implGetFontData( rFontName, rnFontPitch, rnFontFamily, pbSymbol );
 }
 
-bool TextFont::implGetFontData( OUString& rFontName, sal_Int16& rnFontPitch, 
sal_Int16& rnFontFamily ) const
+bool TextFont::implGetFontData( OUString& rFontName, sal_Int16& rnFontPitch, 
sal_Int16& rnFontFamily, bool* pbSymbol ) const
 {
     rFontName = maTypeface;
     resolvePitch(mnPitchFamily, rnFontPitch, rnFontFamily);
+    if (pbSymbol)
+        *pbSymbol = mnCharset == WINDOWS_CHARSET_SYMBOL;
     return !rFontName.isEmpty();
 }
 
diff --git a/oox/source/drawingml/textparagraphproperties.cxx 
b/oox/source/drawingml/textparagraphproperties.cxx
index 949ee3f22d6b..9dd3a6c3c181 100644
--- a/oox/source/drawingml/textparagraphproperties.cxx
+++ b/oox/source/drawingml/textparagraphproperties.cxx
@@ -314,14 +314,14 @@ void BulletList::pushToPropMap( const 
::oox::core::XmlFilterBase* pFilterBase, P
     if( pFilterBase) {
         bool bFollowTextFont = false;
         mbBulletFontFollowText >>= bFollowTextFont;
-        if (!bFollowTextFont && maBulletFont.getFontData( aBulletFontName, 
nBulletFontPitch, nBulletFontFamily, *pFilterBase ) )
+        if (!bFollowTextFont && maBulletFont.getFontData( aBulletFontName, 
nBulletFontPitch, nBulletFontFamily, nullptr, *pFilterBase ) )
         {
             FontDescriptor aFontDesc;
             sal_Int16 nFontSize = 0;
             if( mnFontSize >>= nFontSize )
                 aFontDesc.Height = nFontSize;
 
-            // TODO move the to the TextFont struct.
+            // TODO either use getFontData encoding hint, or move this to the 
TextFont struct.
             aFontDesc.Name = aBulletFontName;
             aFontDesc.Pitch = nBulletFontPitch;
             aFontDesc.Family = nBulletFontFamily;
@@ -347,7 +347,7 @@ void BulletList::pushToPropMap( const 
::oox::core::XmlFilterBase* pFilterBase, P
 
         msBulletChar >>= sBuChar;
 
-        if( pFilterBase && sBuChar.getLength() == 1 && 
maBulletFont.getFontData( aBulletFontName, nBulletFontPitch, nBulletFontFamily, 
*pFilterBase ) && bSymbolFont )
+        if( pFilterBase && sBuChar.getLength() == 1 && 
maBulletFont.getFontData( aBulletFontName, nBulletFontPitch, nBulletFontFamily, 
nullptr, *pFilterBase ) && bSymbolFont )
         {
             sal_Unicode nBuChar = sBuChar.toChar();
             nBuChar &= 0x00ff;
diff --git a/oox/source/drawingml/textrun.cxx b/oox/source/drawingml/textrun.cxx
index 6bfc3701fedb..3eca13d4ad8f 100644
--- a/oox/source/drawingml/textrun.cxx
+++ b/oox/source/drawingml/textrun.cxx
@@ -19,6 +19,7 @@
 
 #include <drawingml/textrun.hxx>
 
+#include <com/sun/star/awt/CharSet.hpp>
 #include <com/sun/star/frame/XModel.hpp>
 #include <com/sun/star/text/ControlCharacter.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
@@ -67,6 +68,7 @@ sal_Int32 TextRun::insertAt(
         Any aOldFontName = xState->getPropertyDefault("CharFontName");
         Any aOldFontPitch = xState->getPropertyDefault("CharFontPitch");
         Any aOldFontFamily = xState->getPropertyDefault("CharFontFamily");
+        Any aOldFontCharSet = xState->getPropertyDefault("CharFontCharSet");
 
         TextCharacterProperties aTextCharacterProps( rTextCharacterStyle );
 
@@ -104,15 +106,17 @@ sal_Int32 TextRun::insertAt(
 
                     OUString aFontName;
                     sal_Int16 nFontFamily = 0, nFontPitch = 0;
+                    bool bSymbolEnc(false);
                     bool bReset = false;
 
                     // Direct formatting for symbols.
-                    if (bSymbol && 
aTextCharacterProps.maSymbolFont.getFontData(aFontName, nFontPitch, 
nFontFamily, rFilterBase))
+                    if (bSymbol && 
aTextCharacterProps.maSymbolFont.getFontData(aFontName, nFontPitch, 
nFontFamily, &bSymbolEnc, rFilterBase))
 
                     {
                         aPropSet.setAnyProperty(PROP_CharFontName, 
Any(aFontName));
                         aPropSet.setAnyProperty(PROP_CharFontPitch, 
Any(nFontPitch));
                         aPropSet.setAnyProperty(PROP_CharFontFamily, 
Any(nFontFamily));
+                        aPropSet.setAnyProperty(PROP_CharFontCharSet, 
Any(bSymbolEnc ? css::awt::CharSet::SYMBOL : css::awt::CharSet::DONTKNOW));
                         bReset = true;
                     }
 
@@ -126,6 +130,7 @@ sal_Int32 TextRun::insertAt(
                         aPropSet.setAnyProperty(PROP_CharFontName, 
aOldFontName);
                         aPropSet.setAnyProperty(PROP_CharFontPitch, 
aOldFontPitch);
                         aPropSet.setAnyProperty(PROP_CharFontFamily, 
aOldFontFamily);
+                        aPropSet.setAnyProperty(PROP_CharFontCharSet, 
aOldFontCharSet);
                     }
 
                     nIndex += nCount;

Reply via email to