[Libreoffice-commits] core.git: sw/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Wed Dec 18 09:29:36 UTC 2019
sw/source/core/txtnode/thints.cxx | 65 +++++++++++++++++++-------------------
1 file changed, 34 insertions(+), 31 deletions(-)
New commits:
commit 568b820bc2d52c007ee08ad7a3849c94a458115d
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Tue Dec 17 15:11:34 2019 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Wed Dec 18 10:28:17 2019 +0100
tdf#119227 fix freeze when copying a large bulleted list
freeze goes from 5 seconds to about 1 second for me
(1) used unordered_map instead of map
(2) don't create temporary SfxItemSet's just to check equality
Change-Id: I17939adb9ffd53bc56339d7a62ef217ade26de36
Reviewed-on: https://gerrit.libreoffice.org/85298
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 70ee13a679a9..0bc8cd921fb6 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -72,6 +72,7 @@
#include <algorithm>
#include <map>
#include <memory>
+#include <unordered_map>
#include <rdfhelper.hxx>
#include <hints.hxx>
@@ -2662,7 +2663,7 @@ bool SwpHints::MergePortions( SwTextNode& rNode )
bool bRet = false;
typedef std::multimap< int, std::pair<SwTextAttr*, bool> > PortionMap;
PortionMap aPortionMap;
- std::map<int, bool> RsidOnlyAutoFormatFlagMap;
+ std::unordered_map<int, bool> RsidOnlyAutoFormatFlagMap;
sal_Int32 nLastPorStart = COMPLETE_STRING;
int nKey = 0;
@@ -2792,43 +2793,45 @@ bool SwpHints::MergePortions( SwTextNode& rNode )
// in the RSID, which should have no effect on text layout
if (RES_TXTATR_AUTOFMT == p1->Which())
{
- SfxItemSet set1(*p1->GetAutoFormat().GetStyleHandle());
- SfxItemSet set2(*p2->GetAutoFormat().GetStyleHandle());
-
- set1.ClearItem(RES_CHRATR_RSID);
- set2.ClearItem(RES_CHRATR_RSID);
+ const SfxItemSet& rSet1 = *p1->GetAutoFormat().GetStyleHandle();
+ const SfxItemSet& rSet2 = *p2->GetAutoFormat().GetStyleHandle();
// sadly SfxItemSet::operator== does not seem to work?
- SfxItemIter iter1(set1);
- SfxItemIter iter2(set2);
- if (set1.Count() == set2.Count())
+ SfxItemIter iter1(rSet1);
+ SfxItemIter iter2(rSet2);
+ for (SfxPoolItem const* pItem1 = iter1.GetCurItem(),
+ * pItem2 = iter2.GetCurItem();
+ pItem1 && pItem2;
+ pItem1 = iter1.NextItem(),
+ pItem2 = iter2.NextItem())
{
- for (SfxPoolItem const* pItem1 = iter1.GetCurItem(),
- * pItem2 = iter2.GetCurItem();
- pItem1 && pItem2;
- pItem1 = iter1.NextItem(),
- pItem2 = iter2.NextItem())
+ if (pItem1->Which() == RES_CHRATR_RSID)
+ pItem1 = iter1.NextItem();
+ if (pItem2->Which() == RES_CHRATR_RSID)
+ pItem2 = iter2.NextItem();
+ if (!pItem1 && !pItem2)
+ break;
+ if (!pItem1 || !pItem2)
{
- if (pItem1 != pItem2) // all are poolable
- {
- assert(IsInvalidItem(pItem1) || IsInvalidItem(pItem2) || pItem1->Which() != pItem2->Which() || *pItem1 != *pItem2);
- eMerge = DIFFER;
- break;
- }
- if (iter1.IsAtEnd())
- {
- assert(iter2.IsAtEnd());
- eMerge = DIFFER_ONLY_RSID;
- }
+ eMerge = DIFFER;
+ break;
+ }
+ if (pItem1 != pItem2) // all are poolable
+ {
+ assert(IsInvalidItem(pItem1) || IsInvalidItem(pItem2) || pItem1->Which() != pItem2->Which() || *pItem1 != *pItem2);
+ eMerge = DIFFER;
+ break;
+ }
+ if (iter1.IsAtEnd() || iter2.IsAtEnd())
+ {
+ eMerge = DIFFER;
+ break;
}
- if (DIFFER == eMerge)
- break; // outer loop too
}
+ if (DIFFER == eMerge)
+ break; // outer loop too
else
- {
- eMerge = DIFFER;
- break;
- }
+ eMerge = DIFFER_ONLY_RSID;
}
else
{
More information about the Libreoffice-commits
mailing list