From 64150e75b5eb49b818283b73fb0b6684827da86a Mon Sep 17 00:00:00 2001 From: shadow303 Date: Wed, 9 Jul 2003 02:28:33 +0000 Subject: [PATCH] Begin adding clipping to graphics message processing. Add sibling access functions to layers. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3912 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/Layer.h | 2 ++ src/servers/app/server/ServerWindow.cpp | 37 ++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/servers/app/server/Layer.h b/src/servers/app/server/Layer.h index 4ceac8978f..ee8d447dd3 100644 --- a/src/servers/app/server/Layer.h +++ b/src/servers/app/server/Layer.h @@ -64,6 +64,8 @@ public: void MakeBottomChild(void); Layer *FindLayer(int32 token); Layer *GetChildAt(BPoint pt, bool recursive=false); + Layer *GetUpperSibling() { return _uppersibling; } + Layer *GetLowerSibling() { return _lowersibling; } PortLink *GetLink(void); const char *GetName(void) { return (_name)?_name->String():NULL; } LayerData *GetLayerData(void) { return _layerdata; } diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index 008c9a108c..07615ebfa5 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -634,19 +634,42 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer) int32 code; int32 view_token; uint32 sizeRemaining = (uint32)msgsize; + BRegion WindowClipRegion; + BRegion LayerClipRegion; + Layer *sibling; + int32 numRects; if ( !msgsize || !msgbuffer ) return; + if ( IsHidden() ) + return; + + WindowClipRegion.Set(_winborder->Frame()); + sibling = _winborder->GetUpperSibling(); + while ( sibling ) + { + WindowClipRegion.Exclude(sibling->Frame()); + sibling = sibling->GetUpperSibling(); + } + + if ( !WindowClipRegion.Frame().IsValid() ) + return; // We need to decide whether coordinates are specified in view or root coordinates. // For now, we assume root level coordinates. - while (sizeRemaining > 2*sizeof(int32)) + code = AS_BEGIN_UPDATE; + while ((sizeRemaining > 2*sizeof(int32)) && (code != AS_END_UPDATE)) { code = read_from_buffer(&msgbuffer); view_token = read_from_buffer(&msgbuffer); layer = _workspace->GetRoot()->FindLayer(view_token); if ( layer ) + { layerdata = layer->GetLayerData(); + LayerClipRegion.Set(layer->Frame()); + LayerClipRegion.IntersectWith(&WindowClipRegion); + numRects = LayerClipRegion.CountRects(); + } else { layerdata = NULL; @@ -999,7 +1022,6 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer) } case AS_FILL_RECT: { - // TODO:: Add clipping if ( sizeRemaining >= AS_FILL_RECT_MSG_SIZE ) { float left, top, right, bottom; @@ -1010,8 +1032,15 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer) bottom = read_from_buffer(&msgbuffer); pattern = read_pattern_from_buffer(&msgbuffer); BRect rect(left,top,right,bottom); - if ( layerdata ) - _app->_driver->FillRect(rect,layerdata,pattern); + if ( layerdata && numRects ) + if ( numRects == 1 ) + _app->_driver->FillRect(rect,layerdata,pattern); + else + { + int i; + for (i=0; i_driver->FillRect(LayerClipRegion.RectAt(i),layerdata,pattern); + } sizeRemaining -= AS_FILL_RECT_MSG_SIZE; } else