[libreoffice/f18] Resolves: rhbz#876742 manipulation with larger tables in impress is very slow

David Tardon dtardon at fedoraproject.org
Thu Mar 28 15:32:28 UTC 2013


commit 38b8821d1eede317e7295d97217d888ddda6d52f
Author: David Tardon <dtardon at redhat.com>
Date:   Thu Mar 28 16:31:08 2013 +0100

    Resolves: rhbz#876742 manipulation with larger tables in impress is very slow

 ...42-speed-up-table-manipulation-in-Impress.patch |  365 ++++++++++++++++++++
 libreoffice.spec                                   |    8 +-
 2 files changed, 372 insertions(+), 1 deletions(-)
---
diff --git a/0001-rhbz-876742-speed-up-table-manipulation-in-Impress.patch b/0001-rhbz-876742-speed-up-table-manipulation-in-Impress.patch
new file mode 100644
index 0000000..ed584a5
--- /dev/null
+++ b/0001-rhbz-876742-speed-up-table-manipulation-in-Impress.patch
@@ -0,0 +1,365 @@
+From ea34a742dd51dfcd83b5e821208f565715d0f3fd Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Fri, 22 Mar 2013 16:49:41 +0100
+Subject: [PATCH] rhbz#876742 speed up table manipulation in Impress
+
+It turns out this is not actually a performance problem but an oversight
+in implementation (or a bug, if you want .-)
+
+Every manipulation with a table (e.g., move, resize; actually even a
+selection of the table) leads to creation of a full copy of the table
+(SdrObject::getFullDragClone()). One of the actions the table copy impl.
+does is to call sdr::CellProperties::SetStyleSheet() on every cell of
+the new table. CellProperties is derived from
+sdr::properties::TextProperties and CellProperties::SetStyleSheet() just
+passes the call to TextProperties::SetStyleSheet(). This is where the
+trouble begins :-)
+
+The SDR representation of a table, SdrTableObj, is derived from
+SdrTextObj. Because of that, SdrTextObj needs to be able to contain more
+than one SdrText (because a table needs one for every cell). This is
+handled correctly by TextProperties. But, because there is no SDR
+representation of a single cell, CellProperties uses the SdrTableObj as
+the SDR object it works on. Therefore TextProperties::SetStyleSheet()
+processes all SdrText objects of the _whole table_, not just a single
+cell. And this is repeated for every other cell...
+
+Change-Id: Iab2e2d0e1e8038710645c0bd24666e6032b0a003
+(cherry picked from commit 91864e19c84ae9834d6e97ee5ddc4db5bf957681)
+Reviewed-on: https://gerrit.libreoffice.org/2925
+Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
+Tested-by: Fridrich Strba <fridrich at documentfoundation.org>
+---
+ svx/Package_inc.mk                            |  1 +
+ svx/inc/svx/itextprovider.hxx                 | 42 ++++++++++++++++++++++
+ svx/inc/svx/sdr/properties/textproperties.hxx |  4 +++
+ svx/inc/svx/svdotext.hxx                      |  3 +-
+ svx/source/sdr/properties/textproperties.cxx  | 38 ++++++++++++--------
+ svx/source/table/cell.cxx                     | 52 +++++++++++++++++++++++++++
+ 6 files changed, 125 insertions(+), 15 deletions(-)
+ create mode 100644 svx/inc/svx/itextprovider.hxx
+
+diff --git a/svx/Package_inc.mk b/svx/Package_inc.mk
+index 3eac094..fa3313d 100644
+--- a/svx/Package_inc.mk
++++ b/svx/Package_inc.mk
+@@ -31,6 +31,7 @@ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/xftdiit.hxx,svx/xftdiit.hxx))
+ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/fntctl.hxx,svx/fntctl.hxx))
+ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/svdattr.hxx,svx/svdattr.hxx))
+ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/imapdlg.hxx,svx/imapdlg.hxx))
++$(eval $(call gb_Package_add_file,svx_inc,inc/svx/itextprovider.hxx,svx/itextprovider.hxx))
+ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/linkwarn.hxx,svx/linkwarn.hxx))
+ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/formatpaintbrushctrl.hxx,svx/formatpaintbrushctrl.hxx))
+ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/xcolit.hxx,svx/xcolit.hxx))
+diff --git a/svx/inc/svx/itextprovider.hxx b/svx/inc/svx/itextprovider.hxx
+new file mode 100644
+index 0000000..3202e4d
+--- /dev/null
++++ b/svx/inc/svx/itextprovider.hxx
+@@ -0,0 +1,42 @@
++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++/*
++ * This file is part of the LibreOffice project.
++ *
++ * This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
++ */
++
++#if !defined SVX_ITEXTPROVIDER_HXX_INCLUDED
++#define SVX_ITEXTPROVIDER_HXX_INCLUDED
++
++#include <sal/types.h>
++
++#include <svx/svxdllapi.h>
++
++class SdrText;
++
++namespace svx
++{
++
++    /** This interface provides access to text object(s) in an SdrObject.
++
++     */
++    class SVX_DLLPUBLIC ITextProvider
++    {
++    public:
++        /** Return the number of texts available for this object. */
++        virtual sal_Int32 getTextCount() const = 0;
++
++        /** Return the nth available text. */
++        virtual SdrText* getText(sal_Int32 nIndex) const = 0;
++
++    protected:
++        ~ITextProvider() {}
++    };
++
++}
++
++#endif
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/svx/inc/svx/sdr/properties/textproperties.hxx b/svx/inc/svx/sdr/properties/textproperties.hxx
+index ac6a613..456b104 100644
+--- a/svx/inc/svx/sdr/properties/textproperties.hxx
++++ b/svx/inc/svx/sdr/properties/textproperties.hxx
+@@ -20,6 +20,7 @@
+ #ifndef _SDR_PROPERTIES_TEXTPROPERTIES_HXX
+ #define _SDR_PROPERTIES_TEXTPROPERTIES_HXX
+ 
++#include <svx/itextprovider.hxx>
+ #include <svx/sdr/properties/attributeproperties.hxx>
+ #include "svx/svxdllapi.h"
+ 
+@@ -45,6 +46,9 @@ namespace sdr
+             // react on ItemSet changes
+             virtual void ItemSetChanged(const SfxItemSet& rSet);
+ 
++            /// Get the TextProvider related to our SdrObject
++            virtual const svx::ITextProvider& getTextProvider() const;
++
+         public:
+             // basic constructor
+             TextProperties(SdrObject& rObj);
+diff --git a/svx/inc/svx/svdotext.hxx b/svx/inc/svx/svdotext.hxx
+index 5f1eeac..551cf58 100644
+--- a/svx/inc/svx/svdotext.hxx
++++ b/svx/inc/svx/svdotext.hxx
+@@ -21,6 +21,7 @@
+ #define _SVDOTEXT_HXX
+ 
+ #include <vcl/field.hxx>
++#include <svx/itextprovider.hxx>
+ #include <svx/svdoattr.hxx>
+ #include <svx/svdtrans.hxx> // GeoStat
+ #include <tools/datetime.hxx>
+@@ -123,7 +124,7 @@ namespace sdr
+ //   SdrTextObj
+ //************************************************************
+ 
+-class SVX_DLLPUBLIC SdrTextObj : public SdrAttrObj
++class SVX_DLLPUBLIC SdrTextObj : public SdrAttrObj, public svx::ITextProvider
+ {
+ private:
+     // Cell needs access to ImpGetDrawOutliner();
+diff --git a/svx/source/sdr/properties/textproperties.cxx b/svx/source/sdr/properties/textproperties.cxx
+index e4eb5cd..db1a34a 100644
+--- a/svx/source/sdr/properties/textproperties.cxx
++++ b/svx/source/sdr/properties/textproperties.cxx
+@@ -82,14 +82,15 @@ namespace sdr
+         void TextProperties::ItemSetChanged(const SfxItemSet& rSet)
+         {
+             SdrTextObj& rObj = (SdrTextObj&)GetSdrObject();
+-            sal_Int32 nText = rObj.getTextCount();
++            const svx::ITextProvider& rTextProvider(getTextProvider());
++            sal_Int32 nText = rTextProvider.getTextCount();
+ 
+             // #i101556# ItemSet has changed -> new version
+             maVersion++;
+ 
+             while( --nText >= 0 )
+             {
+-                SdrText* pText = rObj.getText( nText );
++                SdrText* pText = rTextProvider.getText( nText );
+ 
+                 OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0;
+ 
+@@ -170,10 +171,11 @@ namespace sdr
+             {
+                 SdrOutliner& rOutliner = rObj.ImpGetDrawOutliner();
+ 
+-                sal_Int32 nCount = rObj.getTextCount();
++                const svx::ITextProvider& rTextProvider(getTextProvider());
++                sal_Int32 nCount = rTextProvider.getTextCount();
+                 while( nCount-- )
+                 {
+-                    SdrText* pText = rObj.getText( nCount );
++                    SdrText* pText = rTextProvider.getText( nCount );
+                     OutlinerParaObject* pParaObj = pText->GetOutlinerParaObject();
+                     if( pParaObj )
+                     {
+@@ -223,6 +225,11 @@ namespace sdr
+             }
+         }
+ 
++        const svx::ITextProvider& TextProperties::getTextProvider() const
++        {
++            return static_cast<const SdrTextObj&>(GetSdrObject());
++        }
++
+         void TextProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr)
+         {
+             SdrTextObj& rObj = (SdrTextObj&)GetSdrObject();
+@@ -237,11 +244,12 @@ namespace sdr
+             {
+                 SdrOutliner& rOutliner = rObj.ImpGetDrawOutliner();
+ 
+-                sal_Int32 nText = rObj.getTextCount();
++                const svx::ITextProvider& rTextProvider(getTextProvider());
++                sal_Int32 nText = rTextProvider.getTextCount();
+ 
+                 while( --nText >= 0 )
+                 {
+-                    SdrText* pText = rObj.getText( nText );
++                    SdrText* pText = rTextProvider.getText( nText );
+ 
+                     OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0;
+                     if( !pParaObj )
+@@ -396,11 +404,12 @@ namespace sdr
+                 && !rObj.IsLinkedText())
+             {
+                 Outliner* pOutliner = SdrMakeOutliner(OUTLINERMODE_OUTLINEOBJECT, rObj.GetModel());
+-                sal_Int32 nText = rObj.getTextCount();
++                const svx::ITextProvider& rTextProvider(getTextProvider());
++                sal_Int32 nText = rTextProvider.getTextCount();
+ 
+                 while( --nText >= 0 )
+                 {
+-                    SdrText* pText = rObj.getText( nText );
++                    SdrText* pText = rTextProvider.getText( nText );
+ 
+                     OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0;
+                     if( !pParaObj )
+@@ -542,6 +551,7 @@ namespace sdr
+             SdrTextObj& rObj = (SdrTextObj&)GetSdrObject();
+             if(rObj.HasText())
+             {
++                const svx::ITextProvider& rTextProvider(getTextProvider());
+                 if(HAS_BASE(SfxStyleSheet, &rBC))
+                 {
+                     SfxSimpleHint* pSimple = PTR_CAST(SfxSimpleHint, &rHint);
+@@ -551,10 +561,10 @@ namespace sdr
+                     {
+                         rObj.SetPortionInfoChecked(sal_False);
+ 
+-                        sal_Int32 nText = rObj.getTextCount();
++                        sal_Int32 nText = rTextProvider.getTextCount();
+                         while( --nText > 0 )
+                         {
+-                            OutlinerParaObject* pParaObj = rObj.getText(nText )->GetOutlinerParaObject();
++                            OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject();
+                             if( pParaObj )
+                                 pParaObj->ClearPortionInfo();
+                         }
+@@ -574,10 +584,10 @@ namespace sdr
+                     if(SFX_HINT_DYING == nId)
+                     {
+                         rObj.SetPortionInfoChecked(sal_False);
+-                        sal_Int32 nText = rObj.getTextCount();
++                        sal_Int32 nText = rTextProvider.getTextCount();
+                         while( --nText > 0 )
+                         {
+-                            OutlinerParaObject* pParaObj = rObj.getText(nText )->GetOutlinerParaObject();
++                            OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject();
+                             if( pParaObj )
+                                 pParaObj->ClearPortionInfo();
+                         }
+@@ -596,10 +606,10 @@ namespace sdr
+ 
+                         if(!aOldName.Equals(aNewName))
+                         {
+-                            sal_Int32 nText = rObj.getTextCount();
++                            sal_Int32 nText = rTextProvider.getTextCount();
+                             while( --nText > 0 )
+                             {
+-                                OutlinerParaObject* pParaObj = rObj.getText(nText )->GetOutlinerParaObject();
++                                OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject();
+                                 if( pParaObj )
+                                     pParaObj->ChangeStyleSheetName(eFamily, aOldName, aNewName);
+                             }
+diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
+index e931007..9a52903 100644
+--- a/svx/source/table/cell.cxx
++++ b/svx/source/table/cell.cxx
+@@ -99,6 +99,46 @@ static const SvxItemPropertySet* ImplGetSvxCellPropertySet()
+     return &aSvxCellPropertySet;
+ }
+ 
++namespace
++{
++
++class CellTextProvider : public svx::ITextProvider
++{
++public:
++    explicit CellTextProvider(const sdr::table::CellRef xCell);
++    virtual ~CellTextProvider();
++
++private:
++    virtual sal_Int32 getTextCount() const;
++    virtual SdrText* getText(sal_Int32 nIndex) const;
++
++private:
++    const sdr::table::CellRef m_xCell;
++};
++
++CellTextProvider::CellTextProvider(const sdr::table::CellRef xCell)
++    : m_xCell(xCell)
++{
++}
++
++CellTextProvider::~CellTextProvider()
++{
++}
++
++sal_Int32 CellTextProvider::getTextCount() const
++{
++    return 1;
++}
++
++SdrText* CellTextProvider::getText(sal_Int32 nIndex) const
++{
++    (void) nIndex;
++    assert(nIndex == 0);
++    return m_xCell.get();
++}
++
++}
++
+ namespace sdr
+ {
+     namespace properties
+@@ -109,6 +149,8 @@ namespace sdr
+             // create a new itemset
+             SfxItemSet& CreateObjectSpecificItemSet(SfxItemPool& rPool);
+ 
++            const svx::ITextProvider& getTextProvider() const;
++
+         public:
+             // basic constructor
+             CellProperties(SdrObject& rObj, sdr::table::Cell* pCell );
+@@ -131,6 +173,9 @@ namespace sdr
+             void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
+ 
+             sdr::table::CellRef mxCell;
++
++        private:
++            const CellTextProvider maTextProvider;
+         };
+ 
+         // create a new itemset
+@@ -153,15 +198,22 @@ namespace sdr
+                 0, 0));
+         }
+ 
++        const svx::ITextProvider& CellProperties::getTextProvider() const
++        {
++            return maTextProvider;
++        }
++
+         CellProperties::CellProperties(SdrObject& rObj, sdr::table::Cell* pCell)
+         :   TextProperties(rObj)
+         ,   mxCell(pCell)
++        ,   maTextProvider(mxCell)
+         {
+         }
+ 
+         CellProperties::CellProperties(const CellProperties& rProps, SdrObject& rObj, sdr::table::Cell* pCell)
+         :   TextProperties(rProps, rObj)
+         ,   mxCell( pCell )
++        ,   maTextProvider(mxCell)
+         {
+         }
+ 
+-- 
+1.8.1.4
+
diff --git a/libreoffice.spec b/libreoffice.spec
index b1a9f14..a2bd91a 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -44,7 +44,7 @@ Summary:        Free Software Productivity Suite
 Name:           libreoffice
 Epoch:          1
 Version:        %{libo_version}.2
-Release:        8%{?libo_prerelease}%{?dist}
+Release:        9%{?libo_prerelease}%{?dist}
 License:        (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0
 Group:          Applications/Productivity
 URL:            http://www.documentfoundation.org/develop
@@ -267,6 +267,7 @@ Patch45: 0001-Resolves-fdo-56031-RSID-attr-changes-drop-content-ch.patch
 Patch46: 0001-Resolves-rhbz-920697-i110881-rhbz-623191-presentatio.patch
 Patch47: 0001-rhbz-895690-Make-GIO-UCP-less-brittle-so-saving-docs.patch
 Patch48: 0001-Resolves-rhbz-906137-slide-show-inverts-outputs.patch
+Patch49: 0001-rhbz-876742-speed-up-table-manipulation-in-Impress.patch
 
 %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
 %define instdir %{_libdir}
@@ -1027,6 +1028,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc
 %patch46 -p1 -b .rhbz-920697-i110881-rhbz-623191-presentatio.patch
 %patch47 -p1 -b .rhbz-895690-Make-GIO-UCP-less-brittle-so-saving-docs.patch
 %patch48 -p1 -b .rhbz-906137-slide-show-inverts-outputs.patch
+%patch49 -p1 -b .rhbz-876742-speed-up-table-manipulation-in-Impress.patch
 
 # TODO: check this
 # these are horribly incomplete--empty translations and copied english
@@ -2296,6 +2298,10 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
 %endif
 
 %changelog
+* Thu Mar 28 2013 David Tardon <dtardon at redhat.com> - 1:3.6.5.2-9
+- Resolves: rhbz#876742 manipulation with larger tables in impress is
+  very slow
+
 * Fri Mar 15 2013 Caolán McNamara <caolanm at redhat.com> - 1:3.6.5.2-8
 - Resolves: rhbz#906137 slide show inverts outputs
 


More information about the scm-commits mailing list