[Libreoffice-commits] core.git: include/vcl vcl/source

Chris Sherlock chris.sherlock79 at gmail.com
Thu Apr 24 09:36:49 PDT 2014


 include/vcl/outdev.hxx         |    4 +
 include/vcl/window.hxx         |    2 
 vcl/source/outdev/clipping.cxx |   96 +++++++++++++----------------------------
 vcl/source/window/window.cxx   |   33 ++++++++++++++
 4 files changed, 70 insertions(+), 65 deletions(-)

New commits:
commit 95711f5b9e7b6a982d1762d37d5a38e0f40b86f9
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Fri Apr 25 02:23:22 2014 +1000

    fdo#74702 Move ImplInitClipRegion Window code out of OutputDevice
    
    Window instances need to handle overlapped window clipping,
    VirtualDevice and Printer do not have to worry about this. This code
    should be kept in the class that handles it, so I'm seperating it out.
    
    Change-Id: Ie7df90c983f7a858b563d4f892ceb64d575c0319

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index dbed1f0..115e953 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -455,10 +455,12 @@ public:
      */
     ///@{
 
-    SAL_DLLPRIVATE void         ImplInitClipRegion();
     SAL_DLLPRIVATE bool         ImplSelectClipRegion( const Region&, SalGraphics* pGraphics = NULL );
     SAL_DLLPRIVATE void         ImplSetClipRegion( const Region* pRegion );
 
+protected:
+    virtual void                ImplInitClipRegion();
+
     ///@}
 
 public:
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 39f9357..928aa2a 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -567,6 +567,8 @@ protected:
     virtual bool                AcquireGraphics() const SAL_OVERRIDE;
     virtual void                ReleaseGraphics( bool bRelease = true ) SAL_OVERRIDE;
 
+    virtual void                ImplInitClipRegion() SAL_OVERRIDE;
+
     // FIXME: this is a hack to workaround missing layout functionality
     SAL_DLLPRIVATE void ImplAdjustNWFSizes();
 
diff --git a/vcl/source/outdev/clipping.cxx b/vcl/source/outdev/clipping.cxx
index 48253c5..cc976b0 100644
--- a/vcl/source/outdev/clipping.cxx
+++ b/vcl/source/outdev/clipping.cxx
@@ -58,83 +58,51 @@ void OutputDevice::ImplInitClipRegion()
 {
     DBG_TESTSOLARMUTEX();
 
-    if ( GetOutDevType() == OUTDEV_WINDOW )
+    if ( mbClipRegion )
     {
-        Window* pWindow = (Window*)this;
-        Region  aRegion;
-
-        // Put back backed up background
-        if ( pWindow->mpWindowImpl->mpFrameData->mpFirstBackWin )
-            pWindow->ImplInvalidateAllOverlapBackgrounds();
-        if ( pWindow->mpWindowImpl->mbInPaint )
-            aRegion = *(pWindow->mpWindowImpl->mpPaintRegion);
-        else
-        {
-            aRegion = *(pWindow->ImplGetWinChildClipRegion());
-            // --- RTL -- only this region is in frame coordinates, so re-mirror it
-            // the mpWindowImpl->mpPaintRegion above is already correct (see ImplCallPaint()) !
-            if( ImplIsAntiparallel() )
-                ReMirror ( aRegion );
-        }
-        if ( mbClipRegion )
-            aRegion.Intersect( ImplPixelToDevicePixel( maRegion ) );
-        if ( aRegion.IsEmpty() )
+        if ( maRegion.IsEmpty() )
             mbOutputClipped = true;
         else
         {
             mbOutputClipped = false;
-            ImplSelectClipRegion( aRegion );
-        }
-        mbClipRegionSet = true;
-    }
-    else
-    {
-        if ( mbClipRegion )
-        {
-            if ( maRegion.IsEmpty() )
+
+            // #102532# Respect output offset also for clip region
+            Region aRegion( ImplPixelToDevicePixel( maRegion ) );
+            const bool bClipDeviceBounds( ! GetPDFWriter()
+                                          && GetOutDevType() != OUTDEV_PRINTER );
+            if( bClipDeviceBounds )
+            {
+                // Perform actual rect clip against outdev
+                // dimensions, to generate empty clips whenever one of the
+                // values is completely off the device.
+                Rectangle aDeviceBounds( mnOutOffX, mnOutOffY,
+                                         mnOutOffX+GetOutputWidthPixel()-1,
+                                         mnOutOffY+GetOutputHeightPixel()-1 );
+                aRegion.Intersect( aDeviceBounds );
+            }
+
+            if ( aRegion.IsEmpty() )
+            {
                 mbOutputClipped = true;
+            }
             else
             {
                 mbOutputClipped = false;
-
-                // #102532# Respect output offset also for clip region
-                Region aRegion( ImplPixelToDevicePixel( maRegion ) );
-                const bool bClipDeviceBounds( ! GetPDFWriter()
-                                              && GetOutDevType() != OUTDEV_PRINTER );
-                if( bClipDeviceBounds )
-                {
-                    // Perform actual rect clip against outdev
-                    // dimensions, to generate empty clips whenever one of the
-                    // values is completely off the device.
-                    Rectangle aDeviceBounds( mnOutOffX, mnOutOffY,
-                                             mnOutOffX+GetOutputWidthPixel()-1,
-                                             mnOutOffY+GetOutputHeightPixel()-1 );
-                    aRegion.Intersect( aDeviceBounds );
-                }
-
-                if ( aRegion.IsEmpty() )
-                {
-                    mbOutputClipped = true;
-                }
-                else
-                {
-                    mbOutputClipped = false;
-                    ImplSelectClipRegion( aRegion );
-                }
+                ImplSelectClipRegion( aRegion );
             }
-
-            mbClipRegionSet = true;
         }
-        else
-        {
-            if ( mbClipRegionSet )
-            {
-                mpGraphics->ResetClipRegion();
-                mbClipRegionSet = false;
-            }
 
-            mbOutputClipped = false;
+        mbClipRegionSet = true;
+    }
+    else
+    {
+        if ( mbClipRegionSet )
+        {
+            mpGraphics->ResetClipRegion();
+            mbClipRegionSet = false;
         }
+
+        mbOutputClipped = false;
     }
 
     mbInitClipRegion = false;
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index cf53f2a..9fe3df5 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -406,6 +406,39 @@ bool Window::AcquireGraphics() const
     return mpGraphics ? true : false;
 }
 
+void Window::ImplInitClipRegion()
+{
+    DBG_TESTSOLARMUTEX();
+
+    Region  aRegion;
+
+    // Put back backed up background
+    if ( mpWindowImpl->mpFrameData->mpFirstBackWin )
+        ImplInvalidateAllOverlapBackgrounds();
+    if ( mpWindowImpl->mbInPaint )
+        aRegion = *(mpWindowImpl->mpPaintRegion);
+    else
+    {
+        aRegion = *(ImplGetWinChildClipRegion());
+        // --- RTL -- only this region is in frame coordinates, so re-mirror it
+        // the mpWindowImpl->mpPaintRegion above is already correct (see ImplCallPaint()) !
+        if( ImplIsAntiparallel() )
+            ReMirror ( aRegion );
+    }
+    if ( mbClipRegion )
+        aRegion.Intersect( ImplPixelToDevicePixel( maRegion ) );
+    if ( aRegion.IsEmpty() )
+        mbOutputClipped = true;
+    else
+    {
+        mbOutputClipped = false;
+        ImplSelectClipRegion( aRegion );
+    }
+    mbClipRegionSet = true;
+
+    mbInitClipRegion = false;
+}
+
 void Window::EnableRTL ( bool bEnable )
 {
     StateChanged( STATE_CHANGE_MIRRORING );


More information about the Libreoffice-commits mailing list