filter/source/msfilter/svdfppt.cxx | 79 +++++++++++++++--------------------- include/filter/msfilter/svdfppt.hxx | 3 - sd/qa/unit/data/ppt/tdf79082.ppt |binary sd/qa/unit/export-tests.cxx | 42 +++++++++++++++++++ 4 files changed, 75 insertions(+), 49 deletions(-)
New commits: commit e990859780840f431a99c7da70084c22e740ac08 Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> AuthorDate: Fri May 1 00:26:21 2020 +0200 Commit: Thorsten Behrens <thorsten.behr...@cib.de> CommitDate: Tue May 19 23:41:47 2020 +0200 tdf#79082 Add test for correctly importing tab stops from ppt Change-Id: Iafccbe50e6e00e3a4c5155dabf898c12e8b8176c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93397 Tested-by: Jenkins Tested-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94428 Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/sd/qa/unit/data/ppt/tdf79082.ppt b/sd/qa/unit/data/ppt/tdf79082.ppt new file mode 100644 index 000000000000..259b8808515d Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf79082.ppt differ diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx index 57fe771339f1..38578766934d 100644 --- a/sd/qa/unit/export-tests.cxx +++ b/sd/qa/unit/export-tests.cxx @@ -52,6 +52,7 @@ public: void testUnknownAttributes(); void testTdf80020(); void testLinkedGraphicRT(); + void testTdf79082(); void testImageWithSpecialID(); void testTdf62176(); void testTransparentBackground(); @@ -83,6 +84,7 @@ public: CPPUNIT_TEST(testUnknownAttributes); CPPUNIT_TEST(testTdf80020); CPPUNIT_TEST(testLinkedGraphicRT); + CPPUNIT_TEST(testTdf79082); CPPUNIT_TEST(testImageWithSpecialID); CPPUNIT_TEST(testTdf62176); CPPUNIT_TEST(testTransparentBackground); @@ -661,6 +663,46 @@ void SdExportTest::testLinkedGraphicRT() } } +void SdExportTest::testTdf79082() +{ + sd::DrawDocShellRef xDocShRef + = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/ppt/tdf79082.ppt"), PPT); + utl::TempFile tempFile; + tempFile.EnableKillingFile(); + xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile); + xmlDocPtr pXmlDoc = parseExport(tempFile, "content.xml"); + + // P1 should have 6 tab stops defined + assertXPathChildren( + pXmlDoc, "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops", 6); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[1]", + "position", "0cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[2]", + "position", "5.08cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[3]", + "position", "10.16cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[4]", + "position", "15.24cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[5]", + "position", "20.32cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[6]", + "position", "25.4cm"); + + xDocShRef->DoClose(); +} + void SdExportTest::testImageWithSpecialID() { // Check how LO handles when the imported graphic's ID is different from that one commit fe99cb040ef087618973332802877fff45e9b7fc Author: Piet van Oostrum <p...@vanoostrum.org> AuthorDate: Thu Nov 26 18:37:56 2015 +0400 Commit: Thorsten Behrens <thorsten.behr...@cib.de> CommitDate: Tue May 19 23:41:32 2020 +0200 tdf#79082 Correctly import PPT tabs Change-Id: I7ac5ccb356501983da645f0a6037b5292ce8b5b4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/20207 Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Tested-by: Jenkins (cherry picked from commit 070f44e3b2d7dcf26de68ee46c50dad5c0cf2170) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94427 Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index a122e6aac203..de39c837fe3a 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -5827,7 +5827,6 @@ PPTParagraphObj::PPTParagraphObj( const PPTStyleSheet& rStyleSheet, TSS_Type nIn PPTNumberFormatCreator ( nullptr ), mrStyleSheet ( rStyleSheet ), mnInstance ( nInstance ), - mbTab ( true ), // style sheets always have to get the right tabulator setting mnCurrentObject ( 0 ) { mxParaSet->mnDepth = sanitizeForMaxPPTLevels(nDepth); @@ -5842,7 +5841,6 @@ PPTParagraphObj::PPTParagraphObj( PPTStyleTextPropReader& rPropReader, PPTTextRulerInterpreter ( rRuler ), mrStyleSheet ( rStyleSheet ), mnInstance ( nInstance ), - mbTab ( false ), mnCurrentObject ( 0 ) { if (rnCurCharPos < rPropReader.aCharPropList.size()) @@ -5857,10 +5855,6 @@ PPTParagraphObj::PPTParagraphObj( PPTStyleTextPropReader& rPropReader, rPropReader.aCharPropList[rnCurCharPos].get(); std::unique_ptr<PPTPortionObj> pPPTPortion(new PPTPortionObj( *pCharPropSet, rStyleSheet, nInstance, mxParaSet->mnDepth)); - if (!mbTab) - { - mbTab = pPPTPortion->HasTabulator(); - } m_PortionList.push_back(std::move(pPPTPortion)); } } @@ -5874,10 +5868,6 @@ void PPTParagraphObj::AppendPortion( PPTPortionObj& rPPTPortion ) { m_PortionList.push_back( std::make_unique<PPTPortionObj>(rPPTPortion)); - if ( !mbTab ) - { - mbTab = m_PortionList.back()->HasTabulator(); - } } void PPTParagraphObj::UpdateBulletRelSize( sal_uInt32& nBulletRelSize ) const @@ -6322,50 +6312,47 @@ void PPTParagraphObj::ApplyTo( SfxItemSet& rSet, boost::optional< sal_Int16 >& rSet.Put( aULSpaceItem ); } - if ( mbTab ) // makes it sense to apply tabsettings + sal_uInt32 i, nDefaultTab, nTab, nTextOfs2 = 0; + sal_uInt32 nLatestManTab = 0; + GetAttrib( PPT_ParaAttr_TextOfs, nTextOfs2, nDestinationInstance ); + GetAttrib( PPT_ParaAttr_BulletOfs, nTab, nDestinationInstance ); + GetAttrib( PPT_ParaAttr_BulletOn, i, nDestinationInstance ); + GetAttrib( PPT_ParaAttr_DefaultTab, nDefaultTab, nDestinationInstance ); + SvxTabStopItem aTabItem( 0, 0, SvxTabAdjust::Default, EE_PARA_TABS ); + if ( GetTabCount() ) { - sal_uInt32 i, nDefaultTab, nTab, nTextOfs2 = 0; - sal_uInt32 nLatestManTab = 0; - GetAttrib( PPT_ParaAttr_TextOfs, nTextOfs2, nDestinationInstance ); - GetAttrib( PPT_ParaAttr_BulletOfs, nTab, nDestinationInstance ); - GetAttrib( PPT_ParaAttr_BulletOn, i, nDestinationInstance ); - GetAttrib( PPT_ParaAttr_DefaultTab, nDefaultTab, nDestinationInstance ); - SvxTabStopItem aTabItem( 0, 0, SvxTabAdjust::Default, EE_PARA_TABS ); - if ( GetTabCount() ) + //paragraph offset = MIN(first_line_offset, hanging_offset) + sal_uInt32 nParaOffset = std::min(nTextOfs2, nTab); + for ( i = 0; i < GetTabCount(); i++ ) { - //paragraph offset = MIN(first_line_offset, hanging_offset) - sal_uInt32 nParaOffset = std::min(nTextOfs2, nTab); - for ( i = 0; i < GetTabCount(); i++ ) + SvxTabAdjust eTabAdjust; + nTab = GetTabOffsetByIndex( static_cast<sal_uInt16>(i) ); + switch( GetTabStyleByIndex( static_cast<sal_uInt16>(i) ) ) { - SvxTabAdjust eTabAdjust; - nTab = GetTabOffsetByIndex( static_cast<sal_uInt16>(i) ); - switch( GetTabStyleByIndex( static_cast<sal_uInt16>(i) ) ) - { - case 1 : eTabAdjust = SvxTabAdjust::Center; break; - case 2 : eTabAdjust = SvxTabAdjust::Right; break; - case 3 : eTabAdjust = SvxTabAdjust::Decimal; break; - default : eTabAdjust = SvxTabAdjust::Left; - } - if ( nTab > nParaOffset )//If tab stop greater than paragraph offset - aTabItem.Insert( SvxTabStop( ( ( (long( nTab - nTextOfs2 )) * 2540 ) / 576 ), eTabAdjust ) ); + case 1 : eTabAdjust = SvxTabAdjust::Center; break; + case 2 : eTabAdjust = SvxTabAdjust::Right; break; + case 3 : eTabAdjust = SvxTabAdjust::Decimal; break; + default : eTabAdjust = SvxTabAdjust::Left; } - nLatestManTab = nTab; + if ( nTab > nParaOffset )//If tab stop greater than paragraph offset + aTabItem.Insert( SvxTabStop( ( ( (long( nTab - nTextOfs2 )) * 2540 ) / 576 ), eTabAdjust ) ); } - if ( nIsBullet2 == 0 ) - aTabItem.Insert( SvxTabStop( sal_uInt16(0) ) ); - if ( nDefaultTab ) + nLatestManTab = nTab; + } + if ( nIsBullet2 == 0 ) + aTabItem.Insert( SvxTabStop( sal_uInt16(0) ) ); + if ( nDefaultTab ) + { + nTab = std::max( nTextOfs2, nLatestManTab ); + nTab /= nDefaultTab; + nTab = nDefaultTab * ( 1 + nTab ); + for ( i = 0; ( i < 20 ) && ( nTab < 0x1b00 ); i++ ) { - nTab = std::max( nTextOfs2, nLatestManTab ); - nTab /= nDefaultTab; - nTab = nDefaultTab * ( 1 + nTab ); - for ( i = 0; ( i < 20 ) && ( nTab < 0x1b00 ); i++ ) - { - aTabItem.Insert( SvxTabStop( static_cast<sal_uInt16>( ( ( nTab - nTextOfs2 ) * 2540 ) / 576 ) ) ); - nTab += nDefaultTab; - } + aTabItem.Insert( SvxTabStop( static_cast<sal_uInt16>( ( ( nTab - nTextOfs2 ) * 2540 ) / 576 ) ) ); + nTab += nDefaultTab; } - rSet.Put( aTabItem ); } + rSet.Put( aTabItem ); } sal_uInt32 PPTParagraphObj::GetTextSize() diff --git a/include/filter/msfilter/svdfppt.hxx b/include/filter/msfilter/svdfppt.hxx index efe56823e1c9..e7ee75ec0bde 100644 --- a/include/filter/msfilter/svdfppt.hxx +++ b/include/filter/msfilter/svdfppt.hxx @@ -1148,9 +1148,6 @@ class MSFILTER_DLLPUBLIC PPTParagraphObj void operator=(PPTParagraphObj const&) = delete; public: - - bool mbTab; // if true, this paragraph has tabulators in text - sal_uInt32 mnCurrentObject; ::std::vector<std::unique_ptr<PPTPortionObj>> m_PortionList; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits