[PATCH libreoffice-4-0] fdo#62617 display groups on multiple layers correctly

David Tardon (via Code Review) gerrit at gerrit.libreoffice.org
Sun Mar 24 06:43:50 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/2962

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/62/2962/1

fdo#62617 display groups on multiple layers correctly

It is possible to group objects from different layers, so it is an error
to rely on layer ID when checking visibility of a group. This problem
was partially obscured by the fact that SdrObjGroup::GetLayer() returns
0 if its subobjects are on different layers and 0 is a valid layer ID.

Change-Id: I0ef75544a26817154642185864cafd4e6734fa38
(cherry picked from commit 09d4525b11f396a68ca7c5cbb1ae3462db40c77c)
---
M svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
M svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
M svx/source/sdr/contact/viewobjectcontactofgroup.cxx
M svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
4 files changed, 27 insertions(+), 1 deletion(-)



diff --git a/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx b/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
index b925889..fda5610 100644
--- a/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
+++ b/svx/inc/svx/sdr/contact/viewobjectcontactofgroup.hxx
@@ -40,6 +40,9 @@
 
             // This method recursively paints the draw hierarchy.
             virtual drawinglayer::primitive2d::Primitive2DSequence getPrimitive2DSequenceHierarchy(DisplayInfo& rDisplayInfo) const;
+
+        private:
+            virtual bool isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const;
         };
     } // end of namespace contact
 } // end of namespace sdr
diff --git a/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx b/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
index d7609bd..e038442 100644
--- a/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
+++ b/svx/inc/svx/sdr/contact/viewobjectcontactofsdrobj.hxx
@@ -25,6 +25,7 @@
 //////////////////////////////////////////////////////////////////////////////
 // predeclarations
 class SdrObject;
+class SetOfByte;
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -34,6 +35,14 @@
     {
         class SVX_DLLPUBLIC ViewObjectContactOfSdrObj : public ViewObjectContact
         {
+            /** Test whether the primitive is visible on any layer from @c aLayers
+
+                This should be overriden by ViewObjectContacts of SDR classes
+                that have subparts which can be on different layers (that is,
+                SdrObjGroup .-)
+              */
+            virtual bool isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const;
+
         protected:
             const SdrObject& getSdrObject() const;
 
diff --git a/svx/source/sdr/contact/viewobjectcontactofgroup.cxx b/svx/source/sdr/contact/viewobjectcontactofgroup.cxx
index cdd21db..724b77e 100644
--- a/svx/source/sdr/contact/viewobjectcontactofgroup.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofgroup.cxx
@@ -25,6 +25,7 @@
 #include <drawinglayer/primitive2d/groupprimitive2d.hxx>
 #include <basegfx/tools/canvastools.hxx>
 #include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/svdobj.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -98,6 +99,14 @@
             }
             return xRetval;
         }
+
+        bool ViewObjectContactOfGroup::isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const
+        {
+            SetOfByte aObjectLayers;
+            getSdrObject().getMergedHierarchyLayerSet(aObjectLayers);
+            aObjectLayers &= aLayers;
+            return !aObjectLayers.IsEmpty();
+        }
     } // end of namespace contact
 } // end of namespace sdr
 
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx b/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
index e184bde..77c97cd 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
@@ -48,12 +48,17 @@
         {
         }
 
+        bool ViewObjectContactOfSdrObj::isPrimitiveVisibleOnAnyLayer(const SetOfByte& aLayers) const
+        {
+            return aLayers.IsSet(getSdrObject().GetLayer());
+        }
+
         bool ViewObjectContactOfSdrObj::isPrimitiveVisible(const DisplayInfo& rDisplayInfo) const
         {
             const SdrObject& rObject = getSdrObject();
 
             // Test layer visibility
-            if(!rDisplayInfo.GetProcessLayers().IsSet(rObject.GetLayer()))
+            if(!isPrimitiveVisibleOnAnyLayer(rDisplayInfo.GetProcessLayers()))
             {
                 return false;
             }

-- 
To view, visit https://gerrit.libreoffice.org/2962
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ef75544a26817154642185864cafd4e6734fa38
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: David Tardon <dtardon at redhat.com>



More information about the LibreOffice mailing list