[Libreoffice-commits] core.git: oox/source sd/qa
Mark Hung (via logerrit)
logerrit at kemper.freedesktop.org
Sun Nov 10 11:33:16 UTC 2019
oox/source/drawingml/textrun.cxx | 95 +++++++++++++++++-------------------
sd/qa/unit/data/pptx/tdf106638.pptx |binary
sd/qa/unit/import-tests.cxx | 24 +++++++++
3 files changed, 69 insertions(+), 50 deletions(-)
New commits:
commit 2971f6bbabe5871e9ef462e94239c652db3aede0
Author: Mark Hung <marklh9 at gmail.com>
AuthorDate: Sat Nov 2 14:28:57 2019 +0800
Commit: Mark Hung <marklh9 at gmail.com>
CommitDate: Sun Nov 10 12:32:24 2019 +0100
tdf#106638 oox: reset font settings if necessary.
Direct formatting was used when symbols were inserted.
However when there wasn't any direct formatting of Latin
fonts in the following runs, it didn't know how to reset
the font. Get the default font with XPropertyState and
try to reset to the default value if symbol fonts are set.
Change-Id: I83c9317ba61a96375128f1cc3ed478d958ddaa5c
Reviewed-on: https://gerrit.libreoffice.org/81956
Tested-by: Jenkins
Reviewed-by: Mark Hung <marklh9 at gmail.com>
diff --git a/oox/source/drawingml/textrun.cxx b/oox/source/drawingml/textrun.cxx
index 45290aab3386..3f66c7a852e4 100644
--- a/oox/source/drawingml/textrun.cxx
+++ b/oox/source/drawingml/textrun.cxx
@@ -22,6 +22,7 @@
#include <com/sun/star/text/ControlCharacter.hpp>
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/text/XTextField.hpp>
@@ -62,6 +63,11 @@ sal_Int32 TextRun::insertAt(
Reference< XTextRange > xStart = xAt;
PropertySet aPropSet( xStart );
+ Reference<XPropertyState> xState(xStart, UNO_QUERY);
+ Any aOldFontName = xState->getPropertyDefault("CharFontName");
+ Any aOldFontPitch = xState->getPropertyDefault("CharFontPitch");
+ Any aOldFontFamily = xState->getPropertyDefault("CharFontFamily");
+
TextCharacterProperties aTextCharacterProps( rTextCharacterStyle );
aTextCharacterProps.assignUsed( maTextCharacterProperties );
if ( aTextCharacterProps.moHeight.has() )
@@ -78,61 +84,50 @@ sal_Int32 TextRun::insertAt(
SAL_WARN("oox", "OOX: TextRun::insertAt() insert line break" );
xText->insertControlCharacter( xStart, ControlCharacter::LINE_BREAK, false );
}
- else
+ else if (!getText().isEmpty())
{
- OUString aSymbolFontName;
- sal_Int16 nSymbolFontFamily = 0, nSymbolFontPitch = 0;
-
- if ( !aTextCharacterProps.maSymbolFont.getFontData( aSymbolFontName, nSymbolFontPitch, nSymbolFontFamily, rFilterBase ) )
- xText->insertString( xStart, getText(), false );
- else if ( !getText().isEmpty() )
+ sal_Int32 nIndex = 0;
+ sal_Int32 nMax = getText().getLength();
+ while(true)
{
- // #i113673
- OUString aLatinFontName;
- sal_Int16 nLatinFontPitch = 0, nLatinFontFamily = 0;
- bool bLatinOk = aTextCharacterProps.maLatinFont.getFontData( aLatinFontName, nLatinFontPitch, nLatinFontFamily, rFilterBase );
+ bool bSymbol = (getText()[nIndex] & 0xff00) == 0xf000;
+ sal_Int32 nCount = 1;
+ while(nIndex + nCount < nMax
+ && ((getText()[nIndex + nCount] & 0xff00) == 0xf000) == bSymbol)
+ ++nCount;
+
+ OUString aFontName;
+ sal_Int16 nFontFamily = 0, nFontPitch = 0;
+ bool bReset = false;
+
+ // Direct formatting for symbols.
+ if (bSymbol && aTextCharacterProps.maSymbolFont.getFontData(aFontName, nFontPitch, nFontFamily, rFilterBase))
+
+ {
+ aPropSet.setAnyProperty(PROP_CharFontName, Any(aFontName));
+ aPropSet.setAnyProperty(PROP_CharFontPitch, Any(nFontPitch));
+ aPropSet.setAnyProperty(PROP_CharFontFamily, Any(nFontFamily));
+ bReset = true;
+ }
+
+ OUString aSubString(getText().copy(nIndex, nCount));
+ xText->insertString(xStart, aSubString, false);
- sal_Int32 nIndex = 0;
- while ( true )
+ aPropSet = PropertySet(xStart);
+ // Reset to whatever it was.
+ if (bReset)
{
- sal_Int32 nCount = 0;
- bool bSymbol = ( getText()[ nIndex ] & 0xff00 ) == 0xf000;
- if ( bSymbol )
- {
- do
- {
- nCount++;
- }
- while( ( ( nCount + nIndex ) < getText().getLength() ) && ( ( getText()[ nCount + nIndex ] & 0xff00 ) == 0xf000 ) );
- aPropSet.setAnyProperty( PROP_CharFontName, Any( aSymbolFontName ) );
- aPropSet.setAnyProperty( PROP_CharFontPitch, Any( nSymbolFontPitch ) );
- aPropSet.setAnyProperty( PROP_CharFontFamily, Any( nSymbolFontFamily ) );
- }
- else
- {
- do
- {
- nCount++;
- }
- while( ( ( nCount + nIndex ) < getText().getLength() ) && ( ( getText()[ nCount + nIndex ] & 0xff00 ) != 0xf000 ) );
- if (bLatinOk)
- {
- aPropSet.setAnyProperty( PROP_CharFontName, Any( aLatinFontName ) );
- aPropSet.setAnyProperty( PROP_CharFontPitch, Any( nLatinFontPitch ) );
- aPropSet.setAnyProperty( PROP_CharFontFamily, Any( nLatinFontFamily ) );
- }
- }
- OUString aSubString( getText().copy( nIndex, nCount ) );
- xText->insertString( xStart, aSubString, false );
- nIndex += nCount;
-
- if ( nIndex >= getText().getLength() )
- break;
-
- xStart = xAt;
- aPropSet = PropertySet( xStart );
- aTextCharacterProps.pushToPropSet( aPropSet, rFilterBase );
+ aPropSet.setAnyProperty(PROP_CharFontName, aOldFontName);
+ aPropSet.setAnyProperty(PROP_CharFontPitch, aOldFontPitch);
+ aPropSet.setAnyProperty(PROP_CharFontFamily, aOldFontFamily);
}
+
+ nIndex += nCount;
+
+ if (nIndex >= nMax)
+ break;
+
+ aTextCharacterProps.pushToPropSet(aPropSet, rFilterBase);
}
}
}
diff --git a/sd/qa/unit/data/pptx/tdf106638.pptx b/sd/qa/unit/data/pptx/tdf106638.pptx
new file mode 100644
index 000000000000..6a4d7819eee0
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf106638.pptx differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index a7f1a9a344e5..90c261c753e2 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -81,6 +81,7 @@
#include <com/sun/star/style/NumberingType.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/text/GraphicCrop.hpp>
+#include <com/sun/star/text/XTextCursor.hpp>
#include <com/sun/star/xml/dom/XDocument.hpp>
#include <stlpool.hxx>
@@ -210,6 +211,7 @@ public:
void testOOXTheme();
void testCropToShape();
void testTdf127964();
+ void testTdf106638();
CPPUNIT_TEST_SUITE(SdImportTest);
@@ -308,6 +310,7 @@ public:
CPPUNIT_TEST(testOOXTheme);
CPPUNIT_TEST(testCropToShape);
CPPUNIT_TEST(testTdf127964);
+ CPPUNIT_TEST(testTdf106638);
CPPUNIT_TEST_SUITE_END();
};
@@ -2982,6 +2985,27 @@ void SdImportTest::testTdf127964()
xDocShRef->DoClose();
}
+void SdImportTest::testTdf106638()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf106638.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xPara(getParagraphFromShape(1, xShape));
+ uno::Reference<text::XText> xText= xPara->getText();
+ uno::Reference<text::XTextCursor> xTextCursor = xText->createTextCursorByRange(xPara->getStart());
+ uno::Reference<beans::XPropertySet> xPropSet(xTextCursor, uno::UNO_QUERY_THROW );
+ OUString aCharFontName;
+ CPPUNIT_ASSERT(xTextCursor->goRight(1, true));
+ // First charcter U+f0fe that use Wingding
+ xPropSet->getPropertyValue("CharFontName") >>= aCharFontName;
+ CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), aCharFontName);
+
+ // The rest characters that do not use Wingding.
+ CPPUNIT_ASSERT(xTextCursor->goRight(45, true));
+ xPropSet->getPropertyValue("CharFontName") >>= aCharFontName;
+ CPPUNIT_ASSERT(aCharFontName != "Wingdings");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest);
CPPUNIT_PLUGIN_IMPLEMENT();
More information about the Libreoffice-commits
mailing list