[Libreoffice-commits] core.git: slideshow/source
Sarper Akdemir (via logerrit)
logerrit at kemper.freedesktop.org
Sat Aug 22 16:59:24 UTC 2020
slideshow/source/engine/box2dtools.cxx | 29 ++++++++++++++++++++++-
slideshow/source/engine/shapes/shapeimporter.cxx | 1
slideshow/source/inc/shape.hxx | 3 --
3 files changed, 29 insertions(+), 4 deletions(-)
New commits:
commit 5edbac1b8c8b7aad36a0f2b1c5cacc8d6fd5fb44
Author: Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Sun Aug 16 00:03:43 2020 +0300
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Sat Aug 22 18:58:47 2020 +0200
fix group shape crash for physics animations
Group shapes are now considered as foreground objects.
Physics animations now do not create individual bodies
for shapes that are part of a group but instead create
one body that represent all of them.
Change-Id: I27819c853af75aff93636c99f216a67ef18791d6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101174
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/slideshow/source/engine/box2dtools.cxx b/slideshow/source/engine/box2dtools.cxx
index 845363501ca4..402a71542dd3 100644
--- a/slideshow/source/engine/box2dtools.cxx
+++ b/slideshow/source/engine/box2dtools.cxx
@@ -18,6 +18,9 @@
#include <svx/svdobj.hxx>
#include <svx/svdoashp.hxx>
+#include <svx/svdogrp.hxx>
+
+#include <svx/unoapi.hxx>
#define BOX2D_SLIDE_SIZE_IN_METERS 100.00f
constexpr double fDefaultStaticBodyBounciness(0.1);
@@ -403,11 +406,35 @@ void box2DWorld::initateAllShapesAsStaticBodies(
mbShapesInitialized = true;
auto aXShapeToShapeMap = pShapeManager->getXShapeToShapeMap();
- // iterate over shapes in the current slide
+ std::unordered_map<css::uno::Reference<css::drawing::XShape>, bool> aXShapeBelongsToAGroup;
+
+ // iterate over the shapes in the current slide and flag them if they belong to a group
for (auto aIt = aXShapeToShapeMap.begin(); aIt != aXShapeToShapeMap.end(); aIt++)
{
slideshow::internal::ShapeSharedPtr pShape = aIt->second;
if (pShape->isForeground())
+ {
+ SdrObject* pTemp = SdrObject::getSdrObjectFromXShape(pShape->getXShape());
+ if (pTemp && pTemp->IsGroupObject())
+ {
+ SdrObjList* aObjList = pTemp->GetSubList();
+ const size_t nObjCount(aObjList->GetObjCount());
+
+ for (size_t nObjIndex = 0; nObjIndex < nObjCount; ++nObjIndex)
+ {
+ SdrObject* pGroupMember(aObjList->GetObj(nObjIndex));
+ aXShapeBelongsToAGroup.insert(
+ std::make_pair(GetXShapeForSdrObject(pGroupMember), true));
+ }
+ }
+ }
+ }
+
+ // iterate over shapes in the current slide
+ for (auto aIt = aXShapeToShapeMap.begin(); aIt != aXShapeToShapeMap.end(); aIt++)
+ {
+ slideshow::internal::ShapeSharedPtr pShape = aIt->second;
+ if (pShape->isForeground() && !aXShapeBelongsToAGroup[pShape->getXShape()])
{
Box2DBodySharedPtr pBox2DBody = createStaticBody(pShape);
diff --git a/slideshow/source/engine/shapes/shapeimporter.cxx b/slideshow/source/engine/shapes/shapeimporter.cxx
index 8f2abded678d..b1b1b3417269 100644
--- a/slideshow/source/engine/shapes/shapeimporter.cxx
+++ b/slideshow/source/engine/shapes/shapeimporter.cxx
@@ -495,7 +495,6 @@ ShapeSharedPtr ShapeImporter::importShape() // throw (ShapeLoadFailedException)
}
if( bIsGroupShape && pRet )
{
- pRet->setIsForeground(false);
// push new group on the stack: group traversal
maShapesStack.push( XShapesEntry( pRet ) );
}
diff --git a/slideshow/source/inc/shape.hxx b/slideshow/source/inc/shape.hxx
index 6f0ee040d965..bbd2988e0254 100644
--- a/slideshow/source/inc/shape.hxx
+++ b/slideshow/source/inc/shape.hxx
@@ -267,8 +267,7 @@ namespace slideshow::internal
private:
/** Flag to check whether the shape belongs to the foreground.
- For instance, it is false if the shape belongs to the master slide or
- a group shape.
+ For instance, it is false if the shape belongs to the master slide.
*/
bool mbIsForeground;
};
More information about the Libreoffice-commits
mailing list