svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx |   35 ++++++++------
 svx/source/svdraw/svditer.cxx                             |    8 +++
 2 files changed, 29 insertions(+), 14 deletions(-)

New commits:
commit 316281cf1d888a4bac9f1e40e92c66405480249c
Author:     Armin Le Grand <armin.le.gr...@cib.de>
AuthorDate: Tue Jul 17 10:20:04 2018 +0200
Commit:     Thorsten Behrens <thorsten.behr...@cib.de>
CommitDate: Wed Oct 3 10:28:53 2018 +0200

    tdf#118498 Correct CustomShape 3D Visualization
    
    Change-Id: Ic312190616044f37fd92464ad605c6e0cdd5cc4d
    Reviewed-on: https://gerrit.libreoffice.org/57547
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@cib.de>
    (cherry picked from commit ee71c3def71508d1fc3e110659c7ed7aa0ba2238)
    Reviewed-on: https://gerrit.libreoffice.org/61207
    Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de>

diff --git a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx 
b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
index 8cabe8d261bf..10089a8b0dd0 100644
--- a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
@@ -125,22 +125,29 @@ namespace sdr
                 // Hack for calc, transform position of object according
                 // to current zoom so as objects relative position to grid
                 // appears stable
+                // TTTT: Need to check what *exactly* this is doing - in it's 
current
+                // form it's indeed pretty much a 'hack' as mentioned above 
and massively
+                // in the way for future changes...
                 const_cast< SdrObject* >( pSdrObjRepresentation 
)->SetGridOffset( aGridOff );
-                SdrObjListIter aIterator(*pSdrObjRepresentation);
 
-                while(aIterator.IsMore())
-                {
-                    SdrObject& rCandidate = *aIterator.Next();
-                    // apply offset to each part
-                    rCandidate.SetGridOffset( aGridOff );
-                    if(!b3DShape && dynamic_cast< E3dObject* >(&rCandidate))
-                    {
-                        b3DShape = true;
-                    }
-
-                    const drawinglayer::primitive2d::Primitive2DContainer 
xNew(rCandidate.GetViewContact().getViewIndependentPrimitive2DContainer());
-                    xGroup.insert(xGroup.end(), xNew.begin(), xNew.end());
-                }
+                // tdf#118498 The processing of SdrObjListIter for 
SdrIterMode::DeepNoGroups
+                // did change for 3D-Objects, it now correctly enters and 
iterates the
+                // SdrObjects in the E3dScene (same as for SdrObjGroup). This 
is more correct
+                // as the old version which just checked for 
dynamic_cast<const SdrObjGroup*>
+                // and *only* entered these, ignoring E3dScene as 
grouping-object.
+                // But how to fix that? Taking back the SdrObjListIter change 
would be easy, but
+                // not correct. After checking ViewContactOfE3dScene and 
ViewContactOfGroup
+                // I see that both traverse their children by themselves (on 
VC-Level,
+                // see createViewIndependentPrimitive2DSequence 
implementations and usage of
+                // GetObjectCount()). Thus in principle iterating here (esp. 
'deep') seems to
+                // be wrong anyways, it might have even created wrong and 
double geometries
+                // (only with complex CustomShapes with multiple 
representation SdrObects and
+                // only visible when transparency involved, but 
runtime-expensive).
+                // Thus: Just do not iterate, will check behaviour deeply.
+                b3DShape = (nullptr != dynamic_cast< const E3dObject* 
>(pSdrObjRepresentation));
+                const drawinglayer::primitive2d::Primitive2DContainer xNew(
+                    
pSdrObjRepresentation->GetViewContact().getViewIndependentPrimitive2DContainer());
+                xGroup.insert(xGroup.end(), xNew.begin(), xNew.end());
             }
 
             if(bHasText || !xGroup.empty())
diff --git a/svx/source/svdraw/svditer.cxx b/svx/source/svdraw/svditer.cxx
index 2e8b8a8e1035..45134a7fb86e 100644
--- a/svx/source/svdraw/svditer.cxx
+++ b/svx/source/svdraw/svditer.cxx
@@ -123,6 +123,14 @@ void SdrObjListIter::ImpProcessMarkList(const SdrMarkList& 
rMarkList, SdrIterMod
 
 void SdrObjListIter::ImpProcessObj(const SdrObject& rSdrObject, SdrIterMode 
eMode)
 {
+    // TTTT: Note: The behaviour has changed here, it will now deep-iterate
+    // for SdrObjGroup and E3dScene. Old version only deep-dived for 
SdrObjGroup,
+    // E3dScene was just added flat. This is now more correct, but potentially
+    // there will exist code in the 3D area that *self-iterates* with local
+    // functions/methods due to this iterator was not doing the expected thing.
+    // These will be difficult to find, but in most cases should do no harm,
+    // but cost runtime. Will need to have an eye on this aspect on continued
+    // changes...
     const SdrObjList* pChildren(rSdrObject.getChildrenOfSdrObject());
     const bool bIsGroup(nullptr != pChildren);
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to