sw/source/core/inc/viewimp.hxx  |   13 +++++++------
 sw/source/core/view/viewimp.cxx |   18 +++++++++---------
 sw/source/core/view/viewsh.cxx  |   38 +++++++++++++++++++-------------------
 3 files changed, 35 insertions(+), 34 deletions(-)

New commits:
commit bf09ac2981ea1e6ee9aa1c6c3c94299a8b9ec2de
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Thu Aug 18 21:00:25 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Fri Aug 19 10:06:32 2022 +0200

    unique_ptr->optional in SwViewShellImp
    
    Change-Id: I1f1862c846c2dac0a845b1e8035f447b33e487d7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138503
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/core/inc/viewimp.hxx b/sw/source/core/inc/viewimp.hxx
index 1c0732917245..f68c9c7f1f90 100644
--- a/sw/source/core/inc/viewimp.hxx
+++ b/sw/source/core/inc/viewimp.hxx
@@ -23,8 +23,9 @@
 #include <svx/svdtypes.hxx>
 #include <swrect.hxx>
 #include <swregion.hxx>
-#include <vector>
 #include <memory>
+#include <optional>
+#include <vector>
 
 class OutputDevice;
 class SwViewShell;
@@ -64,7 +65,7 @@ class SwViewShellImp
     SdrPageView *m_pSdrPageView;  // Exactly one Page for our DrawView
 
     SwPageFrame     *m_pFirstVisiblePage; // Always points to the first 
visible Page
-    std::unique_ptr<SwRegionRects> m_pPaintRegion; // Collector of Paintrects 
from the LayAction
+    std::optional<SwRegionRects> m_oPaintRegion; // Collector of Paintrects 
from the LayAction
 
     std::vector<SwRect> m_pendingLOKInvalidations;
 
@@ -150,10 +151,10 @@ public:
     const SwPageFrame* GetLastVisPage(const OutputDevice* pRenderContext) 
const;
 
     bool AddPaintRect( const SwRect &rRect );
-    bool HasPaintRegion()      { return static_cast<bool>(m_pPaintRegion); }
-    std::unique_ptr<SwRegionRects> TakePaintRegion() { return 
std::move(m_pPaintRegion); }
-    const SwRegionRects* GetPaintRegion() { return m_pPaintRegion.get(); }
-    void DeletePaintRegion() { m_pPaintRegion.reset(); }
+    bool HasPaintRegion()      { return m_oPaintRegion.has_value(); }
+    std::optional<SwRegionRects> TakePaintRegion() { return 
std::move(m_oPaintRegion); }
+    const std::optional<SwRegionRects>& GetPaintRegion() { return 
m_oPaintRegion; }
+    void DeletePaintRegion() { m_oPaintRegion.reset(); }
 
     void AddPendingLOKInvalidation( const SwRect& rRect );
     std::vector<SwRect> TakePendingLOKInvalidations();
diff --git a/sw/source/core/view/viewimp.cxx b/sw/source/core/view/viewimp.cxx
index 11a983574d08..c048f578816f 100644
--- a/sw/source/core/view/viewimp.cxx
+++ b/sw/source/core/view/viewimp.cxx
@@ -121,20 +121,20 @@ bool SwViewShellImp::AddPaintRect( const SwRect &rRect )
     // In case of tiled rendering the visual area is the last painted tile -> 
not interesting.
     if ( rRect.Overlaps( m_pShell->VisArea() ) || 
comphelper::LibreOfficeKit::isActive() )
     {
-        if ( !m_pPaintRegion )
+        if ( !m_oPaintRegion )
         {
             // In case of normal rendering, this makes sure only visible 
rectangles are painted.
             // Otherwise get the rectangle of the full document, so all paint 
rectangles are invalidated.
             const SwRect& rArea = comphelper::LibreOfficeKit::isActive() ? 
m_pShell->GetLayout()->getFrameArea() : m_pShell->VisArea();
-            m_pPaintRegion.reset(new SwRegionRects);
-            m_pPaintRegion->ChangeOrigin(rArea);
+            m_oPaintRegion.emplace();
+            m_oPaintRegion->ChangeOrigin(rArea);
         }
-        if(!m_pPaintRegion->empty())
+        if(!m_oPaintRegion->empty())
         {
             // This function often gets called with rectangles that line up 
vertically.
             // Try to extend the last one downwards to include the new one 
(use Union()
             // in case the new one is actually already contained in the last 
one).
-            SwRect& last = m_pPaintRegion->back();
+            SwRect& last = m_oPaintRegion->back();
             if(last.Left() == rRect.Left() && last.Width() == rRect.Width()
                 && last.Bottom() + 1 >= rRect.Top() && last.Bottom() <= 
rRect.Bottom())
             {
@@ -142,21 +142,21 @@ bool SwViewShellImp::AddPaintRect( const SwRect &rRect )
                 // And these rectangles lined up vertically often come up in 
groups
                 // that line up horizontally. Try to extend the previous 
rectangle
                 // to the right to include the last one.
-                if(m_pPaintRegion->size() > 1)
+                if(m_oPaintRegion->size() > 1)
                 {
-                    SwRect& last2 = (*m_pPaintRegion)[m_pPaintRegion->size() - 
2];
+                    SwRect& last2 = (*m_oPaintRegion)[m_oPaintRegion->size() - 
2];
                     if(last2.Top() == last.Top() && last2.Height() == 
last.Height()
                         && last2.Right() + 1 >= last.Left() && last2.Right() 
<= last2.Right())
                     {
                         last2.Union(last);
-                        m_pPaintRegion->pop_back();
+                        m_oPaintRegion->pop_back();
                         return true;
                     }
                 }
                 return true;
             }
         }
-        (*m_pPaintRegion) += rRect;
+        (*m_oPaintRegion) += rRect;
         return true;
     }
     return false;
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index ddc7ca386318..d26ecaa71178 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -319,29 +319,29 @@ void SwViewShell::ImplEndAction( const bool bIdleEnd )
             }
             mbPaintWorks = true;
 
-            std::unique_ptr<SwRegionRects> pRegion = Imp()->TakePaintRegion();
+            std::optional<SwRegionRects> oRegion = Imp()->TakePaintRegion();
 
             //JP 27.11.97: what hid the selection, must also Show it,
             //             else we get Paint errors!
             // e.g. additional mode, page half visible vertically, in the
             // middle a selection and with another cursor jump to left
             // right border. Without ShowCursor the selection disappears.
-            bool bShowCursor = pRegion && dynamic_cast<const 
SwCursorShell*>(this) !=  nullptr;
+            bool bShowCursor = oRegion && dynamic_cast<const 
SwCursorShell*>(this) !=  nullptr;
             if( bShowCursor )
                 static_cast<SwCursorShell*>(this)->HideCursors();
 
-            if ( pRegion )
+            if ( oRegion )
             {
                 SwRootFrame* pCurrentLayout = GetLayout();
 
-                pRegion->LimitToOrigin();
-                pRegion->Compress( SwRegionRects::CompressFuzzy );
+                oRegion->LimitToOrigin();
+                oRegion->Compress( SwRegionRects::CompressFuzzy );
 
                 ScopedVclPtr<VirtualDevice> pVout;
-                while ( !pRegion->empty() )
+                while ( !oRegion->empty() )
                 {
-                    SwRect aRect( pRegion->back() );
-                    pRegion->pop_back();
+                    SwRect aRect( oRegion->back() );
+                    oRegion->pop_back();
 
                     bool bPaint = true;
                     if ( IsEndActionByVirDev() )
@@ -1749,32 +1749,32 @@ bool SwViewShell::CheckInvalidForPaint( const SwRect 
&rRect )
         aAction.Action(GetWin()->GetOutDev());
         --mnStartAction;
 
-        std::unique_ptr<SwRegionRects> pRegion = Imp()->TakePaintRegion();
-        if ( pRegion && aAction.IsBrowseActionStop() )
+        std::optional<SwRegionRects> oRegion = Imp()->TakePaintRegion();
+        if ( oRegion && aAction.IsBrowseActionStop() )
         {
             //only of interest when something has changed in the visible range
             bool bStop = true;
-            for ( size_t i = 0; i < pRegion->size(); ++i )
+            for ( size_t i = 0; i < oRegion->size(); ++i )
             {
-                const SwRect &rTmp = (*pRegion)[i];
+                const SwRect &rTmp = (*oRegion)[i];
                 bStop = rTmp.Overlaps( VisArea() );
                 if ( !bStop )
                     break;
             }
             if ( bStop )
-                pRegion.reset();
+                oRegion.reset();
         }
 
-        if ( pRegion )
+        if ( oRegion )
         {
-            pRegion->LimitToOrigin();
-            pRegion->Compress( SwRegionRects::CompressFuzzy );
+            oRegion->LimitToOrigin();
+            oRegion->Compress( SwRegionRects::CompressFuzzy );
             bRet = false;
-            if ( !pRegion->empty() )
+            if ( !oRegion->empty() )
             {
                 SwRegionRects aRegion( rRect );
-                for ( size_t i = 0; i < pRegion->size(); ++i )
-                {   const SwRect &rTmp = (*pRegion)[i];
+                for ( size_t i = 0; i < oRegion->size(); ++i )
+                {   const SwRect &rTmp = (*oRegion)[i];
                     if ( !rRect.Contains( rTmp ) )
                     {
                         InvalidateWindows( rTmp );

Reply via email to