[Libreoffice-commits] core.git: svx/source
LuboÅ¡ LuÅák (via logerrit)
logerrit at kemper.freedesktop.org
Wed Apr 7 15:00:11 UTC 2021
svx/source/sdr/primitive2d/sdrframeborderprimitive2d.cxx | 80 +++++++--------
1 file changed, 38 insertions(+), 42 deletions(-)
New commits:
commit f73d57b260aa8722df42225c279f24cba0699213
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Wed Apr 7 15:29:39 2021 +0200
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Wed Apr 7 16:59:19 2021 +0200
avoid pointless O(N^2) dynamic_cast
I already tried to reduce the cost of this in ef4964a4e598c3c97,
but back then I missed the fact that in fact all the casts guaranteed.
So partially revert the first commit and simply use static_cast.
Change-Id: I4231f698119d56e9f2536f2f0c9d824442d76b09
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113736
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/svx/source/sdr/primitive2d/sdrframeborderprimitive2d.cxx b/svx/source/sdr/primitive2d/sdrframeborderprimitive2d.cxx
index 6e289d4be3f1..b87cfcd9342c 100644
--- a/svx/source/sdr/primitive2d/sdrframeborderprimitive2d.cxx
+++ b/svx/source/sdr/primitive2d/sdrframeborderprimitive2d.cxx
@@ -797,55 +797,51 @@ namespace drawinglayer::primitive2d
for(const auto& aCandidatePartial : aPartial)
{
- bool bDidMerge(false);
-
- // This algorithm is O(N^2) and repeated dynamic_cast inside would be quite costly.
- // So check first and skip if the primitives aren't BorderLinePrimitive2D.
- const drawinglayer::primitive2d::BorderLinePrimitive2D* candidatePartialAsBorder
- = dynamic_cast<const drawinglayer::primitive2d::BorderLinePrimitive2D*>(aCandidatePartial.get());
- if(candidatePartialAsBorder)
+ if(aRetval.empty())
+ {
+ // no local data yet, just add as 1st entry, done
+ aRetval.append(aCandidatePartial);
+ }
+ else
{
+ bool bDidMerge(false);
+
for(auto& aCandidateRetval : aRetval)
{
- const drawinglayer::primitive2d::BorderLinePrimitive2D* candidateRetvalAsBorder
- = dynamic_cast<const drawinglayer::primitive2d::BorderLinePrimitive2D*>(aCandidateRetval.get());
- if(candidateRetvalAsBorder)
+ // try to merge by appending new data to existing data
+ const drawinglayer::primitive2d::Primitive2DReference aMergeRetvalPartial(
+ drawinglayer::primitive2d::tryMergeBorderLinePrimitive2D(
+ static_cast<BorderLinePrimitive2D*>(aCandidateRetval.get()),
+ static_cast<BorderLinePrimitive2D*>(aCandidatePartial.get())));
+
+ if(aMergeRetvalPartial.is())
+ {
+ // could append, replace existing data with merged data, done
+ aCandidateRetval = aMergeRetvalPartial;
+ bDidMerge = true;
+ break;
+ }
+
+ // try to merge by appending existing data to new data
+ const drawinglayer::primitive2d::Primitive2DReference aMergePartialRetval(
+ drawinglayer::primitive2d::tryMergeBorderLinePrimitive2D(
+ static_cast<BorderLinePrimitive2D*>(aCandidatePartial.get()),
+ static_cast<BorderLinePrimitive2D*>(aCandidateRetval.get())));
+
+ if(aMergePartialRetval.is())
{
- // try to merge by appending new data to existing data
- const drawinglayer::primitive2d::Primitive2DReference aMergeRetvalPartial(
- drawinglayer::primitive2d::tryMergeBorderLinePrimitive2D(
- candidateRetvalAsBorder,
- candidatePartialAsBorder));
-
- if(aMergeRetvalPartial.is())
- {
- // could append, replace existing data with merged data, done
- aCandidateRetval = aMergeRetvalPartial;
- bDidMerge = true;
- break;
- }
-
- // try to merge by appending existing data to new data
- const drawinglayer::primitive2d::Primitive2DReference aMergePartialRetval(
- drawinglayer::primitive2d::tryMergeBorderLinePrimitive2D(
- candidatePartialAsBorder,
- candidateRetvalAsBorder));
-
- if(aMergePartialRetval.is())
- {
- // could append, replace existing data with merged data, done
- aCandidateRetval = aMergePartialRetval;
- bDidMerge = true;
- break;
- }
+ // could append, replace existing data with merged data, done
+ aCandidateRetval = aMergePartialRetval;
+ bDidMerge = true;
+ break;
}
}
- }
- if(!bDidMerge)
- {
- // no merge after checking all existing data, append as new segment
- aRetval.append(aCandidatePartial);
+ if(!bDidMerge)
+ {
+ // no merge after checking all existing data, append as new segment
+ aRetval.append(aCandidatePartial);
+ }
}
}
}
More information about the Libreoffice-commits
mailing list