summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Sherlock <chris.sherlock79@gmail.com>2014-06-01 21:57:04 +1000
committerChris Sherlock <chris.sherlock79@gmail.com>2014-07-19 23:32:16 +1000
commit1242044880864aba7daad9c8ee83321c4b0bbc46 (patch)
tree2197529ba17606a3c645091578d6f7f5b4ccd56b
parent334397dc84219da33ac86640998f4810c9d9245e (diff)
vcl: move more Window clipping functions into ClipManager
Moved ImplIntersectWindowClipRegion to ClipManager as private function intersectClipRegion, as this is only used by ImplClipBoundaries. ImplClipBoundaries was also moved to ClipManager as ClipBoundaries. Change-Id: Id026e232e6738b2338043344d08677e7c4d09b1c
-rw-r--r--include/vcl/window.hxx2
-rw-r--r--vcl/inc/clipmgr.hxx2
-rw-r--r--vcl/source/window/clipmgr.cxx47
-rw-r--r--vcl/source/window/clipping.cxx43
-rw-r--r--vcl/source/window/paint.cxx15
-rw-r--r--vcl/source/window/window.cxx8
-rw-r--r--vcl/source/window/window2.cxx9
7 files changed, 71 insertions, 55 deletions
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index cecdb366dfea..338a3c0f7f9b 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -522,13 +522,11 @@ private:
SAL_DLLPRIVATE void ImplUpdateSysObjOverlapsClip();
SAL_DLLPRIVATE void ImplUpdateSysObjClip();
- SAL_DLLPRIVATE void ImplIntersectWindowClipRegion( Region& rRegion );
SAL_DLLPRIVATE void ImplIntersectWindowRegion( Region& rRegion );
SAL_DLLPRIVATE void ImplExcludeWindowRegion( Region& rRegion );
SAL_DLLPRIVATE void ImplExcludeOverlapWindows( Region& rRegion );
SAL_DLLPRIVATE void ImplExcludeOverlapWindows2( Region& rRegion );
- SAL_DLLPRIVATE void ImplClipBoundaries( Region& rRegion, bool bThis, bool bOverlaps );
SAL_DLLPRIVATE bool ImplClipChildren( Region& rRegion );
SAL_DLLPRIVATE void ImplClipAllChildren( Region& rRegion );
diff --git a/vcl/inc/clipmgr.hxx b/vcl/inc/clipmgr.hxx
index 64a6cea61f9d..fcf4a4344dde 100644
--- a/vcl/inc/clipmgr.hxx
+++ b/vcl/inc/clipmgr.hxx
@@ -36,12 +36,14 @@ private:
ClipManager() {};
void clipSiblings( Window* pWindow, Region& rRegion );
+ void intersectClipRegion( Window* pWindow, Region& rRegion );
public:
~ClipManager() { instanceFlag = false; }
static ClipManager *GetInstance();
void InitClipRegion( Window *pWindow );
+ void ClipBoundaries( Window* pWindow, Region& rRegion, bool bThis, bool bOverlaps );
};
#endif
diff --git a/vcl/source/window/clipmgr.cxx b/vcl/source/window/clipmgr.cxx
index 4c84a4129620..77d807c68927 100644
--- a/vcl/source/window/clipmgr.cxx
+++ b/vcl/source/window/clipmgr.cxx
@@ -56,7 +56,7 @@ void ClipManager::InitClipRegion( Window *pWindow )
clipSiblings( pWindow, pWindow->mpWindowImpl->maWinClipRegion );
// Clip Parent Boundaries
- pWindow->ImplClipBoundaries( pWindow->mpWindowImpl->maWinClipRegion, false, true );
+ ClipBoundaries( pWindow, pWindow->mpWindowImpl->maWinClipRegion, false, true );
// Clip Children
if ( (pWindow->GetStyle() & WB_CLIPCHILDREN) || pWindow->mpWindowImpl->mbClipChildren )
@@ -65,6 +65,51 @@ void ClipManager::InitClipRegion( Window *pWindow )
pWindow->mpWindowImpl->mbInitWinClipRegion = false;
}
+void ClipManager::ClipBoundaries( Window* pWindow, Region& rRegion, bool bThis, bool bOverlaps )
+{
+ if ( bThis )
+ intersectClipRegion( pWindow, rRegion );
+ else if ( pWindow->ImplIsOverlapWindow() )
+ {
+ // clip to frame if required
+ if ( !pWindow->mpWindowImpl->mbFrame )
+ rRegion.Intersect( Rectangle( Point( 0, 0 ), pWindow->GetOutputSizePixel() ) );
+
+ if ( bOverlaps && !rRegion.IsEmpty() )
+ {
+ // Clip Overlap Siblings
+ Window* pStartOverlapWindow = pWindow;
+ while ( !pStartOverlapWindow->mpWindowImpl->mbFrame )
+ {
+ Window* pOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow->mpWindowImpl->mpFirstOverlap;
+ while ( pOverlapWindow && (pOverlapWindow != pStartOverlapWindow) )
+ {
+ pOverlapWindow->ImplExcludeOverlapWindows2( rRegion );
+ pOverlapWindow = pOverlapWindow->mpWindowImpl->mpNext;
+ }
+ pStartOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow;
+ }
+
+ // Clip Child Overlap Windows
+ pWindow->ImplExcludeOverlapWindows( rRegion );
+ }
+ }
+ else
+ {
+ intersectClipRegion( pWindow->ImplGetParent(), rRegion );
+ }
+}
+
+void ClipManager::intersectClipRegion( Window* pWindow, Region& rRegion )
+{
+ ClipManager *clipMgr = ClipManager::GetInstance();
+
+ if ( pWindow->mpWindowImpl->mbInitWinClipRegion )
+ clipMgr->InitClipRegion(pWindow);
+
+ rRegion.Intersect( pWindow->mpWindowImpl->maWinClipRegion );
+}
+
void ClipManager::clipSiblings( Window* pWindow, Region& rRegion )
{
Window* pChildWindow = pWindow->ImplGetParent()->mpWindowImpl->mpFirstChild;
diff --git a/vcl/source/window/clipping.cxx b/vcl/source/window/clipping.cxx
index 29485e029d0a..70084f065529 100644
--- a/vcl/source/window/clipping.cxx
+++ b/vcl/source/window/clipping.cxx
@@ -182,39 +182,6 @@ void Window::EnableClipSiblings( bool bClipSiblings )
mpWindowImpl->mbClipSiblings = bClipSiblings;
}
-void Window::ImplClipBoundaries( Region& rRegion, bool bThis, bool bOverlaps )
-{
- if ( bThis )
- ImplIntersectWindowClipRegion( rRegion );
- else if ( ImplIsOverlapWindow() )
- {
- // clip to frame if required
- if ( !mpWindowImpl->mbFrame )
- rRegion.Intersect( Rectangle( Point( 0, 0 ), Size( mpWindowImpl->mpFrameWindow->mnOutWidth, mpWindowImpl->mpFrameWindow->mnOutHeight ) ) );
-
- if ( bOverlaps && !rRegion.IsEmpty() )
- {
- // Clip Overlap Siblings
- Window* pStartOverlapWindow = this;
- while ( !pStartOverlapWindow->mpWindowImpl->mbFrame )
- {
- Window* pOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow->mpWindowImpl->mpFirstOverlap;
- while ( pOverlapWindow && (pOverlapWindow != pStartOverlapWindow) )
- {
- pOverlapWindow->ImplExcludeOverlapWindows2( rRegion );
- pOverlapWindow = pOverlapWindow->mpWindowImpl->mpNext;
- }
- pStartOverlapWindow = pStartOverlapWindow->mpWindowImpl->mpOverlapWindow;
- }
-
- // Clip Child Overlap Windows
- ImplExcludeOverlapWindows( rRegion );
- }
- }
- else
- ImplGetParent()->ImplIntersectWindowClipRegion( rRegion );
-}
-
bool Window::ImplClipChildren( Region& rRegion )
{
bool bOtherClip = false;
@@ -494,16 +461,6 @@ bool Window::ImplSetClipFlag( bool bSysObjOnlySmaller )
return mpWindowImpl->mpFrameWindow->ImplSetClipFlagOverlapWindows( bSysObjOnlySmaller );
}
-void Window::ImplIntersectWindowClipRegion( Region& rRegion )
-{
- ClipManager *clipMgr = ClipManager::GetInstance();
-
- if ( mpWindowImpl->mbInitWinClipRegion )
- clipMgr->InitClipRegion(this);
-
- rRegion.Intersect( mpWindowImpl->maWinClipRegion );
-}
-
void Window::ImplIntersectWindowRegion( Region& rRegion )
{
rRegion.Intersect( Rectangle( Point( mnOutOffX, mnOutOffY ),
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 18fab8a0258d..79a192e58e7c 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -31,6 +31,7 @@
#include <salgdi.hxx>
#include <salframe.hxx>
#include <svdata.hxx>
+#include <clipmgr.hxx>
#define IMPL_PAINT_PAINT ((sal_uInt16)0x0001)
#define IMPL_PAINT_PAINTALL ((sal_uInt16)0x0002)
@@ -377,9 +378,10 @@ void Window::ImplInvalidateFrameRegion( const Region* pRegion, sal_uInt16 nFlags
void Window::ImplInvalidateOverlapFrameRegion( const Region& rRegion )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
Region aRegion = rRegion;
- ImplClipBoundaries( aRegion, true, true );
+ clipMgr->ClipBoundaries( this, aRegion, true, true );
if ( !aRegion.IsEmpty() )
ImplInvalidateFrameRegion( &aRegion, INVALIDATE_CHILDREN );
@@ -407,6 +409,7 @@ void Window::ImplInvalidateParentFrameRegion( Region& rRegion )
void Window::ImplInvalidate( const Region* pRegion, sal_uInt16 nFlags )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
// reset background storage
if ( mpWindowImpl->mpFrameData->mpFirstBackWin )
@@ -468,7 +471,7 @@ void Window::ImplInvalidate( const Region* pRegion, sal_uInt16 nFlags )
else
aRegion.Intersect( *pRegion );
}
- ImplClipBoundaries( aRegion, true, true );
+ clipMgr->ClipBoundaries( this, aRegion, true, true );
if ( nFlags & INVALIDATE_NOCHILDREN )
{
nFlags &= ~INVALIDATE_CHILDREN;
@@ -595,6 +598,8 @@ void Window::ImplValidateFrameRegion( const Region* pRegion, sal_uInt16 nFlags )
void Window::ImplValidate( const Region* pRegion, sal_uInt16 nFlags )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
+
// assemble region
bool bValidateAll = !pRegion;
sal_uInt16 nOrgFlags = nFlags;
@@ -615,7 +620,7 @@ void Window::ImplValidate( const Region* pRegion, sal_uInt16 nFlags )
Region aRegion( aRect );
if ( pRegion )
aRegion.Intersect( *pRegion );
- ImplClipBoundaries( aRegion, true, true );
+ clipMgr->ClipBoundaries( this, aRegion, true, true );
if ( nFlags & VALIDATE_NOCHILDREN )
{
nFlags &= ~VALIDATE_CHILDREN;
@@ -1183,6 +1188,8 @@ void Window::Erase()
void Window::ImplScroll( const Rectangle& rRect,
long nHorzScroll, long nVertScroll, sal_uInt16 nFlags )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
+
if ( !IsDeviceOutputNecessary() )
return;
@@ -1265,7 +1272,7 @@ void Window::ImplScroll( const Rectangle& rRect,
aRegion.Exclude( aInvalidateRegion );
- ImplClipBoundaries( aRegion, false, true );
+ clipMgr->ClipBoundaries( this, aRegion, false, true );
if ( !bScrollChildren )
{
if ( nOrgFlags & SCROLL_NOCHILDREN )
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 3b69b66240e1..c82b4f2dddc7 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1504,6 +1504,8 @@ void Window::ImplUpdateSysObjPos()
void Window::ImplPosSizeWindow( long nX, long nY,
long nWidth, long nHeight, sal_uInt16 nFlags )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
+
bool bNewPos = false;
bool bNewSize = false;
bool bCopyBits = false;
@@ -1720,7 +1722,7 @@ void Window::ImplPosSizeWindow( long nX, long nY,
Size( mnOutWidth, mnOutHeight ) ) );
if ( mpWindowImpl->mbWinRegion )
aRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
- ImplClipBoundaries( aRegion, false, true );
+ clipMgr->ClipBoundaries( this, aRegion, false, true );
if ( !pOverlapRegion->IsEmpty() )
{
pOverlapRegion->Move( mnOutOffX-nOldOutOffX, mnOutOffY-nOldOutOffY );
@@ -1773,7 +1775,7 @@ void Window::ImplPosSizeWindow( long nX, long nY,
aRegion.Exclude( *pOldRegion );
if ( mpWindowImpl->mbWinRegion )
aRegion.Intersect( ImplPixelToDevicePixel( mpWindowImpl->maWinRegion ) );
- ImplClipBoundaries( aRegion, false, true );
+ clipMgr->ClipBoundaries( this, aRegion, false, true );
if ( !aRegion.IsEmpty() )
ImplInvalidateFrameRegion( &aRegion, INVALIDATE_CHILDREN );
}
@@ -1786,7 +1788,7 @@ void Window::ImplPosSizeWindow( long nX, long nY,
Region aRegion( *pOldRegion );
if ( !mpWindowImpl->mbPaintTransparent )
ImplExcludeWindowRegion( aRegion );
- ImplClipBoundaries( aRegion, false, true );
+ clipMgr->ClipBoundaries( this, aRegion, false, true );
if ( !aRegion.IsEmpty() && !mpWindowImpl->mpBorderWindow )
ImplInvalidateParentFrameRegion( aRegion );
}
diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx
index cabf358f094c..e7e65bd9b753 100644
--- a/vcl/source/window/window2.cxx
+++ b/vcl/source/window/window2.cxx
@@ -44,6 +44,7 @@
#include <salgdi.hxx>
#include <salframe.hxx>
#include <scrwnd.hxx>
+#include <clipmgr.hxx>
using namespace com::sun::star;
@@ -232,6 +233,8 @@ void Window::HideTracking()
void Window::InvertTracking( const Rectangle& rRect, sal_uInt16 nFlags )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
+
OutputDevice *pOutDev = GetOutDev();
Rectangle aRect( pOutDev->ImplLogicToDevicePixel( rRect ) );
@@ -270,7 +273,7 @@ void Window::InvertTracking( const Rectangle& rRect, sal_uInt16 nFlags )
Point aPoint( mnOutOffX, mnOutOffY );
Region aRegion( Rectangle( aPoint,
Size( mnOutWidth, mnOutHeight ) ) );
- ImplClipBoundaries( aRegion, false, false );
+ clipMgr->ClipBoundaries( this, aRegion, false, false );
pOutDev->SelectClipRegion( aRegion, pGraphics );
}
}
@@ -294,6 +297,8 @@ void Window::InvertTracking( const Rectangle& rRect, sal_uInt16 nFlags )
void Window::InvertTracking( const Polygon& rPoly, sal_uInt16 nFlags )
{
+ ClipManager *clipMgr = ClipManager::GetInstance();
+
sal_uInt16 nPoints = rPoly.GetSize();
if ( nPoints < 2 )
@@ -334,7 +339,7 @@ void Window::InvertTracking( const Polygon& rPoly, sal_uInt16 nFlags )
Point aPoint( mnOutOffX, mnOutOffY );
Region aRegion( Rectangle( aPoint,
Size( mnOutWidth, mnOutHeight ) ) );
- ImplClipBoundaries( aRegion, false, false );
+ clipMgr->ClipBoundaries( this, aRegion, false, false );
pOutDev->SelectClipRegion( aRegion, pGraphics );
}
}