summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorChris Sherlock <chris.sherlock79@gmail.com>2014-04-25 02:23:22 +1000
committerChris Sherlock <chris.sherlock79@gmail.com>2014-04-25 02:35:57 +1000
commit95711f5b9e7b6a982d1762d37d5a38e0f40b86f9 (patch)
tree9ccb32dbd8088eaad7b5c1dbd466a056e6f8fc54 /vcl
parent07ed9492cc73c5328f1d4fb43bfa9ada17d1ad2c (diff)
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
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/outdev/clipping.cxx96
-rw-r--r--vcl/source/window/window.cxx33
2 files changed, 65 insertions, 64 deletions
diff --git a/vcl/source/outdev/clipping.cxx b/vcl/source/outdev/clipping.cxx
index 48253c5d31c0..cc976b06b22c 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 cf53f2ae3bff..9fe3df56c1b7 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 );