diff options
Diffstat (limited to 'slideshow/source/engine/shapes/drawshapesubsetting.cxx')
-rw-r--r-- | slideshow/source/engine/shapes/drawshapesubsetting.cxx | 102 |
1 files changed, 50 insertions, 52 deletions
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; |