From 7241178e3f2e0c2df139e44d9bc810d36f2696e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 26 Nov 2005 17:55:05 +0000 Subject: [PATCH] ViewLayers screen clipping is clipped to the parent bounds, but that is only a partial fix and should be done more elegantly. When moving a window, the part that we could blit is certainly not dirty, the pending dirty region that we drag along is clipped to the new visible region of the moved window git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15170 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../servers/app/newerClipping/Desktop.cpp | 4 +-- .../servers/app/newerClipping/ViewLayer.cpp | 33 +++++++++++++++++++ .../servers/app/newerClipping/ViewLayer.h | 4 +++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/tests/servers/app/newerClipping/Desktop.cpp b/src/tests/servers/app/newerClipping/Desktop.cpp index b4b25ebf7c..c3bffb0238 100644 --- a/src/tests/servers/app/newerClipping/Desktop.cpp +++ b/src/tests/servers/app/newerClipping/Desktop.cpp @@ -388,14 +388,14 @@ Desktop::MoveWindowBy(WindowLayer* window, int32 x, int32 y) // could move by blitting copyRegion.OffsetBy(x, y); newDirtyRegion.Exclude(©Region); + MarkClean(©Region); fDrawingEngine->MarkDirty(©Region); fDrawingEngine->Unlock(); } // include the moved peviously dirty region -// TODO: redesign dirty regions to be located in -// each window -> less intersecting alreadyDirtyRegion.OffsetBy(x, y); + alreadyDirtyRegion.IntersectWith(&window->VisibleRegion()); newDirtyRegion.Include(&alreadyDirtyRegion); MarkDirty(&newDirtyRegion); diff --git a/src/tests/servers/app/newerClipping/ViewLayer.cpp b/src/tests/servers/app/newerClipping/ViewLayer.cpp index 32971540a3..c37939d3d2 100644 --- a/src/tests/servers/app/newerClipping/ViewLayer.cpp +++ b/src/tests/servers/app/newerClipping/ViewLayer.cpp @@ -266,6 +266,33 @@ ViewLayer::ConvertToParent(BRegion* region) const fFrame.top - fScrollingOffset.y); } +// ConvertFromParent +void +ViewLayer::ConvertFromParent(BPoint* point) const +{ + // remove scrolling offset and convert to parent coordinate space + point->x += fScrollingOffset.x - fFrame.left; + point->y += fScrollingOffset.y - fFrame.top; +} + +// ConvertFromParent +void +ViewLayer::ConvertFromParent(BRect* rect) const +{ + // remove scrolling offset and convert to parent coordinate space + rect->OffsetBy(fScrollingOffset.x - fFrame.left, + fScrollingOffset.y - fFrame.top); +} + +// ConvertFromParent +void +ViewLayer::ConvertFromParent(BRegion* region) const +{ + // remove scrolling offset and convert to parent coordinate space + region->OffsetBy(fScrollingOffset.x - fFrame.left, + fScrollingOffset.y - fFrame.top); +} + // ConvertToTop void ViewLayer::ConvertToTop(BPoint* point) const @@ -637,6 +664,12 @@ ViewLayer::ScreenClipping(BRegion* windowContentClipping, bool force) const { if (!fScreenClippingValid || force) { fScreenClipping = fLocalClipping; + if (fParent) { + BRect parentWindow = fParent->Bounds(); + ConvertFromParent(&parentWindow); + BRegion visibleInParent(parentWindow); + fScreenClipping.IntersectWith(&visibleInParent); + } ConvertToTop(&fScreenClipping); fScreenClipping.IntersectWith(windowContentClipping); fScreenClippingValid = true; diff --git a/src/tests/servers/app/newerClipping/ViewLayer.h b/src/tests/servers/app/newerClipping/ViewLayer.h index 6515ac3fbd..675d7855cb 100644 --- a/src/tests/servers/app/newerClipping/ViewLayer.h +++ b/src/tests/servers/app/newerClipping/ViewLayer.h @@ -53,6 +53,10 @@ class ViewLayer { void ConvertToParent(BRect* rect) const; void ConvertToParent(BRegion* region) const; + void ConvertFromParent(BPoint* point) const; + void ConvertFromParent(BRect* rect) const; + void ConvertFromParent(BRegion* region) const; + void ConvertToTop(BPoint* point) const; void ConvertToTop(BRect* rect) const; void ConvertToTop(BRegion* region) const;