[Libreoffice-commits] core.git: writerfilter/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Tue Aug 20 10:03:46 UTC 2019


 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   35 ++++++++++-
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    5 +
 writerfilter/source/dmapper/PropertyMap.cxx       |   65 ++++++----------------
 writerfilter/source/dmapper/PropertyMap.hxx       |    7 --
 4 files changed, 55 insertions(+), 57 deletions(-)

New commits:
commit 6fea13e7a10272922ffdf74b65add10ecf8cec38
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Mon Aug 19 15:43:31 2019 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Tue Aug 20 12:02:55 2019 +0200

    tdf#76260 cache next page style number
    
    to speed up loading document with lots of footnotes.
    Takes the load time from 29s to 27.3s for me
    
    Change-Id: I911e4a7d7db8a2cdff1271d04e5535e76fd137a0
    Reviewed-on: https://gerrit.libreoffice.org/77778
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 7df87958becf..f69073781964 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -303,15 +303,41 @@ DomainMapper_Impl::~DomainMapper_Impl()
 
 uno::Reference< container::XNameContainer > const &  DomainMapper_Impl::GetPageStyles()
 {
-    if(!m_xPageStyles.is())
+    if(!m_xPageStyles1.is())
     {
         uno::Reference< style::XStyleFamiliesSupplier > xSupplier( m_xTextDocument, uno::UNO_QUERY );
         if (xSupplier.is())
-            xSupplier->getStyleFamilies()->getByName("PageStyles") >>= m_xPageStyles;
+            xSupplier->getStyleFamilies()->getByName("PageStyles") >>= m_xPageStyles1;
     }
-    return m_xPageStyles;
+    return m_xPageStyles1;
 }
 
+OUString DomainMapper_Impl::GetUnusedPageStyleName()
+{
+    static const char DEFAULT_STYLE[] = "Converted";
+    if (!m_xNextUnusedPageStyleNo)
+    {
+        const uno::Sequence< OUString > aPageStyleNames = GetPageStyles()->getElementNames();
+        sal_Int32         nMaxIndex       = 0;
+        // find the highest number x in each style with the name "DEFAULT_STYLE+x" and
+        // return an incremented name
+
+        for ( const auto& rStyleName : aPageStyleNames )
+        {
+            if ( rStyleName.startsWith( DEFAULT_STYLE ) )
+            {
+                sal_Int32 nIndex = rStyleName.copy( strlen( DEFAULT_STYLE ) ).toInt32();
+                if ( nIndex > nMaxIndex )
+                    nMaxIndex = nIndex;
+            }
+        }
+        m_xNextUnusedPageStyleNo = nMaxIndex + 1;
+    }
+
+    OUString sPageStyleName = DEFAULT_STYLE + OUString::number( *m_xNextUnusedPageStyleNo );
+    *m_xNextUnusedPageStyleNo = *m_xNextUnusedPageStyleNo + 1;
+    return sPageStyleName;
+}
 
 uno::Reference< text::XText > const & DomainMapper_Impl::GetBodyText()
 {
@@ -1942,8 +1968,7 @@ void DomainMapper_Impl::PushPageHeaderFooter(bool bHeader, SectionPropertyMap::P
 
         uno::Reference< beans::XPropertySet > xPageStyle =
             pSectionContext->GetPageStyle(
-                GetPageStyles(),
-                m_xTextFactory,
+                *this,
                 eType == SectionPropertyMap::PAGE_FIRST );
         if (!xPageStyle.is())
             return;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 0d2e5cd17f83..c027faea1d60 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -411,7 +411,9 @@ private:
     css::uno::Reference<css::beans::XPropertySet> m_xDocumentSettings;
     css::uno::Reference<css::lang::XMultiServiceFactory> m_xTextFactory;
     css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
-    css::uno::Reference<css::container::XNameContainer> m_xPageStyles;
+    css::uno::Reference<css::container::XNameContainer> m_xPageStyles1;
+    // cache next available number, expensive to repeatedly compute
+    boost::optional<int> m_xNextUnusedPageStyleNo;
     css::uno::Reference<css::text::XText> m_xBodyText;
     css::uno::Reference<css::text::XTextContent> m_xEmbedded;
 
@@ -564,6 +566,7 @@ public:
     }
 
     css::uno::Reference<css::container::XNameContainer> const & GetPageStyles();
+    OUString GetUnusedPageStyleName();
     css::uno::Reference<css::text::XText> const & GetBodyText();
     const css::uno::Reference<css::lang::XMultiServiceFactory>& GetTextFactory() const
     {
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 1cd31bb56954..395ab2e1be99 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -442,30 +442,11 @@ SectionPropertyMap::SectionPropertyMap( bool bIsFirstSection )
     }
 }
 
-static OUString lcl_FindUnusedPageStyleName( const uno::Sequence< OUString >& rPageStyleNames )
-{
-    static const char DEFAULT_STYLE[] = "Converted";
-    sal_Int32         nMaxIndex       = 0;
-    // find the highest number x in each style with the name "DEFAULT_STYLE+x" and
-    // return an incremented name
-
-    for ( const auto& rStyleName : rPageStyleNames )
-    {
-        if ( rStyleName.startsWith( DEFAULT_STYLE ) )
-        {
-            sal_Int32 nIndex = rStyleName.copy( strlen( DEFAULT_STYLE ) ).toInt32();
-            if ( nIndex > nMaxIndex )
-                nMaxIndex = nIndex;
-        }
-    }
-
-    return DEFAULT_STYLE + OUString::number( nMaxIndex + 1 );
-}
-
-uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const uno::Reference< container::XNameContainer >& xPageStyles,
-                                                                        const uno::Reference < lang::XMultiServiceFactory >& xTextFactory,
+uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( DomainMapper_Impl& rDM_Impl,
                                                                         bool bFirst )
 {
+    const uno::Reference< container::XNameContainer >& xPageStyles = rDM_Impl.GetPageStyles();
+    const uno::Reference < lang::XMultiServiceFactory >& xTextFactory = rDM_Impl.GetTextFactory();
     uno::Reference< beans::XPropertySet > xRet;
     try
     {
@@ -473,8 +454,7 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const un
         {
             if ( m_sFirstPageStyleName.isEmpty() && xPageStyles.is() )
             {
-                uno::Sequence< OUString > aPageStyleNames = xPageStyles->getElementNames();
-                m_sFirstPageStyleName = lcl_FindUnusedPageStyleName( aPageStyleNames );
+                m_sFirstPageStyleName = rDM_Impl.GetUnusedPageStyleName();
                 m_aFirstPageStyle.set( xTextFactory->createInstance( "com.sun.star.style.PageStyle" ),
                     uno::UNO_QUERY );
 
@@ -485,7 +465,7 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const un
                     xPageStyles->insertByName( m_sFirstPageStyleName, uno::makeAny( m_aFirstPageStyle ) );
 
                 // Ensure that m_aFollowPageStyle has been created
-                GetPageStyle( xPageStyles, xTextFactory, false );
+                GetPageStyle( rDM_Impl, false );
                 // Chain m_aFollowPageStyle to be after m_aFirstPageStyle
                 m_aFirstPageStyle->setPropertyValue( "FollowStyle",
                     uno::makeAny( m_sFollowPageStyleName ) );
@@ -500,8 +480,7 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const un
         {
             if ( m_sFollowPageStyleName.isEmpty() && xPageStyles.is() )
             {
-                uno::Sequence< OUString > aPageStyleNames = xPageStyles->getElementNames();
-                m_sFollowPageStyleName = lcl_FindUnusedPageStyleName( aPageStyleNames );
+                m_sFollowPageStyleName = rDM_Impl.GetUnusedPageStyleName();
                 m_aFollowPageStyle.set( xTextFactory->createInstance( "com.sun.star.style.PageStyle" ),
                     uno::UNO_QUERY );
                 xPageStyles->insertByName( m_sFollowPageStyleName, uno::makeAny( m_aFollowPageStyle ) );
@@ -529,8 +508,7 @@ void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance
     m_bBorderShadows[ePos]   = bShadow;
 }
 
-void SectionPropertyMap::ApplyBorderToPageStyles( const uno::Reference< container::XNameContainer >& xPageStyles,
-                                                  const uno::Reference < lang::XMultiServiceFactory >& xTextFactory,
+void SectionPropertyMap::ApplyBorderToPageStyles( DomainMapper_Impl& rDM_Impl,
                                                   BorderApply eBorderApply, BorderOffsetFrom eOffsetFrom )
 {
     /*
@@ -553,17 +531,17 @@ void SectionPropertyMap::ApplyBorderToPageStyles( const uno::Reference< containe
     {
         case BorderApply::ToAllInSection: // all styles
             if ( !m_sFollowPageStyleName.isEmpty() )
-                xFirst = GetPageStyle( xPageStyles, xTextFactory, false );
+                xFirst = GetPageStyle( rDM_Impl, false );
             if ( !m_sFirstPageStyleName.isEmpty() )
-                xSecond = GetPageStyle( xPageStyles, xTextFactory, true );
+                xSecond = GetPageStyle( rDM_Impl, true );
             break;
         case BorderApply::ToFirstPageInSection: // first page
             if ( !m_sFirstPageStyleName.isEmpty() )
-                xFirst = GetPageStyle( xPageStyles, xTextFactory, true );
+                xFirst = GetPageStyle( rDM_Impl, true );
             break;
         case BorderApply::ToAllButFirstInSection: // left and right
             if ( !m_sFollowPageStyleName.isEmpty() )
-                xFirst = GetPageStyle( xPageStyles, xTextFactory, false );
+                xFirst = GetPageStyle( rDM_Impl, false );
             break;
         default:
             return;
@@ -924,11 +902,9 @@ void SectionPropertyMap::CopyLastHeaderFooter( bool bFirstPage, DomainMapper_Imp
     SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext();
     if ( pLastContext )
     {
-        uno::Reference< beans::XPropertySet > xPrevStyle = pLastContext->GetPageStyle( rDM_Impl.GetPageStyles(),
-            rDM_Impl.GetTextFactory(),
+        uno::Reference< beans::XPropertySet > xPrevStyle = pLastContext->GetPageStyle( rDM_Impl,
             bFirstPage );
-        uno::Reference< beans::XPropertySet > xStyle = GetPageStyle( rDM_Impl.GetPageStyles(),
-            rDM_Impl.GetTextFactory(),
+        uno::Reference< beans::XPropertySet > xStyle = GetPageStyle( rDM_Impl,
             bFirstPage );
 
         if ( bFirstPage )
@@ -1210,9 +1186,6 @@ bool SectionPropertyMap::FloatingTableConversion( DomainMapper_Impl& rDM_Impl, F
 
 void SectionPropertyMap::InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Impl )
 {
-    const uno::Reference< container::XNameContainer >& xPageStyles = rDM_Impl.GetPageStyles();
-    const uno::Reference < lang::XMultiServiceFactory >& xTextFactory = rDM_Impl.GetTextFactory();
-
     // if no new styles have been created for this section, inherit from the previous section,
     // otherwise apply this section's settings to the new style.
     // Ensure that FollowPage is inherited first - otherwise GetPageStyle may auto-create a follow when checking FirstPage.
@@ -1223,7 +1196,7 @@ void SectionPropertyMap::InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Imp
     else
     {
         HandleMarginsHeaderFooter( /*bFirst=*/false, rDM_Impl );
-        GetPageStyle( xPageStyles, xTextFactory, /*bFirst=*/false );
+        GetPageStyle( rDM_Impl, /*bFirst=*/false );
         if ( rDM_Impl.IsNewDoc() && m_aFollowPageStyle.is() )
             ApplyProperties_( m_aFollowPageStyle );
     }
@@ -1234,7 +1207,7 @@ void SectionPropertyMap::InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Imp
     else
     {
         HandleMarginsHeaderFooter( /*bFirst=*/true, rDM_Impl );
-        GetPageStyle( xPageStyles, xTextFactory, /*bFirst=*/true );
+        GetPageStyle( rDM_Impl, /*bFirst=*/true );
         if ( rDM_Impl.IsNewDoc() && m_aFirstPageStyle.is() )
             ApplyProperties_( m_aFirstPageStyle );
 
@@ -1446,7 +1419,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
         ApplyProtectionProperties( xSection, rDM_Impl );
 
         //get the properties and create appropriate page styles
-        uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), false );
+        uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl, false );
 
         HandleMarginsHeaderFooter(/*bFirstPage=*/false, rDM_Impl );
 
@@ -1567,7 +1540,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
             CopyLastHeaderFooter( true, rDM_Impl );
             PrepareHeaderFooterProperties( true );
             uno::Reference< beans::XPropertySet > xFirstPageStyle = GetPageStyle(
-                rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), true );
+                rDM_Impl, true );
             if ( rDM_Impl.IsNewDoc() )
                 ApplyProperties_( xFirstPageStyle );
 
@@ -1576,7 +1549,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
                     getPropertyName( PROP_TEXT_COLUMNS ), uno::makeAny( xColumns ) );
         }
 
-        ApplyBorderToPageStyles( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), m_eBorderApply, m_eBorderOffsetFrom );
+        ApplyBorderToPageStyles( rDM_Impl, m_eBorderApply, m_eBorderOffsetFrom );
 
         try
         {
@@ -1589,7 +1562,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
             if ( m_nBreakType == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_evenPage) || m_nBreakType == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_oddPage) )
             {
                 OUString* pageStyle = m_bTitlePage ? &m_sFirstPageStyleName : &m_sFollowPageStyleName;
-                OUString evenOddStyleName = lcl_FindUnusedPageStyleName( rDM_Impl.GetPageStyles()->getElementNames() );
+                OUString evenOddStyleName = rDM_Impl.GetUnusedPageStyleName();
                 uno::Reference< beans::XPropertySet > evenOddStyle(
                     rDM_Impl.GetTextFactory()->createInstance( "com.sun.star.style.PageStyle" ),
                     uno::UNO_QUERY );
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index 7d994f024a83..af8bb6842e38 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -317,9 +317,7 @@ public:
 
     const css::uno::Reference< css::text::XTextRange >& GetStartingRange() const { return m_xStartingRange; }
 
-    css::uno::Reference< css::beans::XPropertySet > GetPageStyle( const css::uno::Reference< css::container::XNameContainer >& xStyles,
-                                                                  const css::uno::Reference< css::lang::XMultiServiceFactory >& xTextFactory,
-                                                                  bool bFirst );
+    css::uno::Reference< css::beans::XPropertySet > GetPageStyle( DomainMapper_Impl& rDM_Impl, bool bFirst );
 
     const OUString& GetPageStyleName( bool bFirstPage = false )
     {
@@ -376,8 +374,7 @@ public:
     void addRelativeWidthShape( css::uno::Reference<css::drawing::XShape> xShape ) { m_xRelativeWidthShapes.push_back( xShape ); }
 
     // determine which style gets the borders
-    void ApplyBorderToPageStyles( const css::uno::Reference< css::container::XNameContainer >& xStyles,
-                                  const css::uno::Reference< css::lang::XMultiServiceFactory >& xTextFactory,
+    void ApplyBorderToPageStyles( DomainMapper_Impl &rDM_Impl,
                                   BorderApply eBorderApply, BorderOffsetFrom eOffsetFrom );
 
     void CloseSectionGroup( DomainMapper_Impl& rDM_Impl );


More information about the Libreoffice-commits mailing list