[Libreoffice-commits] core.git: Branch 'libreoffice-6-1' - slideshow/source

Mike Kaganski mike.kaganski at collabora.com
Tue Jul 3 16:57:43 UTC 2018


 slideshow/source/engine/shapes/drawshapesubsetting.cxx |  102 ++++++++---------
 slideshow/source/engine/shapes/drawshapesubsetting.hxx |    8 -
 slideshow/source/inc/doctreenode.hxx                   |    1 
 3 files changed, 52 insertions(+), 59 deletions(-)

New commits:
commit e41c9749310d06da1bf0387a5e11326bdd3bb988
Author: Mike Kaganski <mike.kaganski at collabora.com>
Date:   Thu Jun 28 14:51:31 2018 +1000

    tdf#102195: don't exclude everything between first and last subset
    
    When subsets are non-contiguous, we need to include the parts between
    subsets.
    
    Change-Id: I28214dccc75e6a6af5c65397b2126049a65bf79f
    Reviewed-on: https://gerrit.libreoffice.org/56571
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
    (cherry picked from commit 4600b07c1d787f959618d9ecf54161e4ea4ffa61)
    Reviewed-on: https://gerrit.libreoffice.org/56753

diff --git a/slideshow/source/engine/shapes/drawshapesubsetting.cxx b/slideshow/source/engine/shapes/drawshapesubsetting.cxx
index 1de7934719d9..849df8d9897c 100644
--- a/slideshow/source/engine/shapes/drawshapesubsetting.cxx
+++ b/slideshow/source/engine/shapes/drawshapesubsetting.cxx
@@ -164,50 +164,65 @@ namespace slideshow
             mbNodeTreeInitialized = true;
         }
 
-        void DrawShapeSubsetting::updateSubsetBounds( const SubsetEntry& rSubsetEntry )
+        void DrawShapeSubsetting::excludeSubset(sal_Int32 nExcludedStart, sal_Int32 nExcludedEnd)
         {
-            // TODO(F1): This removes too much from non-contiguous subsets
-            mnMinSubsetActionIndex = ::std::min(
-                mnMinSubsetActionIndex,
-                rSubsetEntry.mnStartActionIndex );
-            mnMaxSubsetActionIndex = ::std::max(
-                mnMaxSubsetActionIndex,
-                rSubsetEntry.mnEndActionIndex );
-        }
-
-        void DrawShapeSubsetting::updateSubsets()
-        {
-            maCurrentSubsets.clear();
+            // If current subsets are empty, fill it with initial range
+            initCurrentSubsets();
+            if (maCurrentSubsets.empty())
+            {
+                // Non-subsetting mode (not a subset of anything; child subsets subtract content)
+                maCurrentSubsets.emplace_back(0, maActionClassVector.size());
+            }
 
-            if( !maSubsetShapes.empty() )
+            slideshow::internal::VectorOfDocTreeNodes aNodesToAppend;
+            for (auto i = maCurrentSubsets.begin(); i != maCurrentSubsets.end();)
             {
-                if( maSubset.isEmpty() )
+                if (i->getStartIndex() < nExcludedStart)
                 {
-                    // non-subsetted node, with some child subsets
-                    // that subtract from it
-                    maCurrentSubsets.emplace_back( 0,
-                                                             mnMinSubsetActionIndex );
-                    maCurrentSubsets.emplace_back( mnMaxSubsetActionIndex,
-                                                             maActionClassVector.size() );
+                    if (i->getEndIndex() > nExcludedStart)
+                    {
+                        // Some overlap -> append new node (if required), and correct this node's end
+                        if (i->getEndIndex() > nExcludedEnd)
+                        {
+                            aNodesToAppend.emplace_back(nExcludedEnd, i->getEndIndex());
+                        }
+                        i->setEndIndex(nExcludedStart);
+                    }
+                    ++i;
+                }
+                else if (i->getStartIndex() < nExcludedEnd)
+                {
+                    if (i->getEndIndex() > nExcludedEnd)
+                    {
+                        // Partial overlap; change the node's start
+                        i->setStartIndex(nExcludedEnd);
+                        ++i;
+                    }
+                    else
+                    {
+                        // Node is fully inside the removed range: erase it
+                        i = maCurrentSubsets.erase(i);
+                    }
                 }
                 else
                 {
-                    // subsetted node, from which some further child
-                    // subsets subtract content
-                    maCurrentSubsets.emplace_back( maSubset.getStartIndex(),
-                                                             mnMinSubsetActionIndex );
-                    maCurrentSubsets.emplace_back( mnMaxSubsetActionIndex,
-                                                             maSubset.getEndIndex() );
+                    // Node is fully outside (after) excluded range
+                    ++i;
                 }
             }
-            else
+
+            maCurrentSubsets.insert(maCurrentSubsets.end(), aNodesToAppend.begin(),
+                                    aNodesToAppend.end());
+        }
+
+        void DrawShapeSubsetting::updateSubsets()
+        {
+            maCurrentSubsets.clear();
+            initCurrentSubsets();
+
+            for (const auto& rSubsetShape : maSubsetShapes)
             {
-                // no further child subsets, simply add our subset (if any)
-                if( !maSubset.isEmpty() )
-                {
-                    // subsetted node, without any subset children
-                    maCurrentSubsets.push_back( maSubset );
-                }
+                excludeSubset(rSubsetShape.mnStartActionIndex, rSubsetShape.mnEndActionIndex);
             }
         }
 
@@ -220,8 +235,6 @@ namespace slideshow
             mpMtf(),
             maSubset(),
             maSubsetShapes(),
-            mnMinSubsetActionIndex( SAL_MAX_INT32 ),
-            mnMaxSubsetActionIndex(0),
             maCurrentSubsets(),
             mbNodeTreeInitialized( false )
         {
@@ -233,8 +246,6 @@ namespace slideshow
             mpMtf( rMtf ),
             maSubset( rShapeSubset ),
             maSubsetShapes(),
-            mnMinSubsetActionIndex( SAL_MAX_INT32 ),
-            mnMaxSubsetActionIndex(0),
             maCurrentSubsets(),
             mbNodeTreeInitialized( false )
         {
@@ -250,8 +261,6 @@ namespace slideshow
             mpMtf.reset();
             maSubset.reset();
             maSubsetShapes.clear();
-            mnMinSubsetActionIndex = SAL_MAX_INT32;
-            mnMaxSubsetActionIndex = 0;
             maCurrentSubsets.clear();
             mbNodeTreeInitialized = false;
         }
@@ -326,9 +335,7 @@ namespace slideshow
 
                 maSubsetShapes.insert( aEntry );
 
-                // update cached subset borders
-                updateSubsetBounds( aEntry );
-                updateSubsets();
+                excludeSubset(aEntry.mnStartActionIndex, aEntry.mnEndActionIndex);
             }
         }
 
@@ -380,19 +387,10 @@ namespace slideshow
             // part of this shape that is visible, i.e. not displayed
             // in subset shapes)
 
-
-            // init bounds
-            mnMinSubsetActionIndex = SAL_MAX_INT32;
-            mnMaxSubsetActionIndex = 0;
-
             // TODO(P2): This is quite expensive, when
             // after every subset effect end, we have to scan
             // the whole shape set
 
-            // determine new subset range
-            for( const auto& rSubsetShape : maSubsetShapes )
-                updateSubsetBounds( rSubsetShape );
-
             updateSubsets();
 
             return true;
diff --git a/slideshow/source/engine/shapes/drawshapesubsetting.hxx b/slideshow/source/engine/shapes/drawshapesubsetting.hxx
index 06d399d4d88e..68e541bf7fb1 100644
--- a/slideshow/source/engine/shapes/drawshapesubsetting.hxx
+++ b/slideshow/source/engine/shapes/drawshapesubsetting.hxx
@@ -202,7 +202,7 @@ namespace slideshow
             typedef ::std::set< SubsetEntry >       ShapeSet;
 
             void ensureInitializedNodeTree() const;
-            void updateSubsetBounds( const SubsetEntry& rSubsetEntry );
+            void excludeSubset(sal_Int32 nExcludedStart, sal_Int32 nExcludedEnd);
             void updateSubsets();
             void initCurrentSubsets();
             void reset();
@@ -226,12 +226,6 @@ namespace slideshow
             /// the list of subset shapes spawned from this one.
             ShapeSet                            maSubsetShapes;
 
-            /// caches minimal subset index from maSubsetShapes
-            sal_Int32                           mnMinSubsetActionIndex;
-
-            /// caches maximal subset index from maSubsetShapes
-            sal_Int32                           mnMaxSubsetActionIndex;
-
             /** Current number of subsets to render (calculated from
                 maSubset and mnMin/MaxSubsetActionIndex).
 
diff --git a/slideshow/source/inc/doctreenode.hxx b/slideshow/source/inc/doctreenode.hxx
index 5cd3fe6fe07c..008979651b8a 100644
--- a/slideshow/source/inc/doctreenode.hxx
+++ b/slideshow/source/inc/doctreenode.hxx
@@ -90,6 +90,7 @@ namespace slideshow
             bool                isEmpty() const { return mnStartIndex == mnEndIndex; }
 
             sal_Int32           getStartIndex() const { return mnStartIndex; }
+            void                setStartIndex( sal_Int32 nIndex ) { mnStartIndex = nIndex; }
             sal_Int32           getEndIndex() const { return mnEndIndex; }
             void                setEndIndex( sal_Int32 nIndex ) { mnEndIndex = nIndex; }
 


More information about the Libreoffice-commits mailing list