Removed a bug in Layer::Invalidate()
Fixed a bunch of redraw problems git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2131 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -145,6 +145,7 @@ printf("BeDecorator()::_DoLayout()"); rect.PrintToStream();
|
|||||||
closerect.top+=(look==WLOOK_FLOATING)?6:4;
|
closerect.top+=(look==WLOOK_FLOATING)?6:4;
|
||||||
closerect.right=closerect.left+10;
|
closerect.right=closerect.left+10;
|
||||||
closerect.bottom=closerect.top+10;
|
closerect.bottom=closerect.top+10;
|
||||||
|
closerect.OffsetBy(taboffset,0);
|
||||||
|
|
||||||
borderrect.top+=19;
|
borderrect.top+=19;
|
||||||
|
|
||||||
@@ -155,11 +156,13 @@ printf("BeDecorator()::_DoLayout()"); rect.PrintToStream();
|
|||||||
if(titlewidth>0)
|
if(titlewidth>0)
|
||||||
{
|
{
|
||||||
tabrect.right=closerect.right+textoffset+titlewidth+15;
|
tabrect.right=closerect.right+textoffset+titlewidth+15;
|
||||||
if(tabrect.right>frame.right)
|
|
||||||
tabrect.right=frame.right;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tabrect.right=tabrect.left+tabrect.Width()/2;
|
tabrect.right=tabrect.left+tabrect.Width()/2;
|
||||||
|
tabrect.OffsetBy(taboffset,0);
|
||||||
|
if(tabrect.right>frame.right)
|
||||||
|
tabrect.right=frame.right;
|
||||||
|
|
||||||
|
|
||||||
if(look==WLOOK_FLOATING)
|
if(look==WLOOK_FLOATING)
|
||||||
tabrect.top+=4;
|
tabrect.top+=4;
|
||||||
@@ -201,7 +204,7 @@ void BeDecorator::MoveBy(BPoint pt)
|
|||||||
zoomrect.OffsetBy(pt);
|
zoomrect.OffsetBy(pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
BPoint BeDecorator::SlideTab(float dx, float dy=0)
|
BRect BeDecorator::SlideTab(float dx, float dy=0)
|
||||||
{
|
{
|
||||||
// Check to see if we would slide it out of bounde
|
// Check to see if we would slide it out of bounde
|
||||||
if( (tabrect.right+dx) > frame.right)
|
if( (tabrect.right+dx) > frame.right)
|
||||||
@@ -209,10 +212,31 @@ BPoint BeDecorator::SlideTab(float dx, float dy=0)
|
|||||||
if( (tabrect.left+dx) < frame.left)
|
if( (tabrect.left+dx) < frame.left)
|
||||||
dx=frame.left-tabrect.left;
|
dx=frame.left-tabrect.left;
|
||||||
|
|
||||||
|
taboffset+=int32(dx);
|
||||||
|
if(taboffset<0)
|
||||||
|
{
|
||||||
|
dx-=taboffset;
|
||||||
|
taboffset=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BRect oldrect(tabrect);
|
||||||
tabrect.OffsetBy(dx,0);
|
tabrect.OffsetBy(dx,0);
|
||||||
closerect.OffsetBy(dx,0);
|
closerect.OffsetBy(dx,0);
|
||||||
zoomrect.OffsetBy(dx,0);
|
zoomrect.OffsetBy(dx,0);
|
||||||
return BPoint(dx,0);
|
|
||||||
|
if(dx>0)
|
||||||
|
{
|
||||||
|
if(tabrect.left<oldrect.right)
|
||||||
|
oldrect.right=tabrect.left;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(dx<0)
|
||||||
|
{
|
||||||
|
if(tabrect.right>oldrect.left)
|
||||||
|
oldrect.left=tabrect.right;
|
||||||
|
}
|
||||||
|
|
||||||
|
return oldrect;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BeDecorator::ResizeBy(float x, float y)
|
void BeDecorator::ResizeBy(float x, float y)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public:
|
|||||||
void Draw(void);
|
void Draw(void);
|
||||||
BRegion *GetFootprint(void);
|
BRegion *GetFootprint(void);
|
||||||
click_type Clicked(BPoint pt, int32 buttons, int32 modifiers);
|
click_type Clicked(BPoint pt, int32 buttons, int32 modifiers);
|
||||||
|
BRect SlideTab(float dx, float dy=0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _DrawClose(BRect r);
|
void _DrawClose(BRect r);
|
||||||
@@ -30,7 +31,7 @@ protected:
|
|||||||
void _DoLayout(void);
|
void _DoLayout(void);
|
||||||
void _SetFocus(void);
|
void _SetFocus(void);
|
||||||
void DrawBlendedRect(BRect r, bool down);
|
void DrawBlendedRect(BRect r, bool down);
|
||||||
uint32 taboffset;
|
int32 taboffset;
|
||||||
|
|
||||||
RGBColor tab_highcol, tab_lowcol;
|
RGBColor tab_highcol, tab_lowcol;
|
||||||
RGBColor button_highcol, button_lowcol;
|
RGBColor button_highcol, button_lowcol;
|
||||||
@@ -40,7 +41,6 @@ protected:
|
|||||||
uint64 solidhigh, solidlow;
|
uint64 solidhigh, solidlow;
|
||||||
float titlewidth;
|
float titlewidth;
|
||||||
|
|
||||||
bool slidetab;
|
|
||||||
int textoffset, titlechars;
|
int textoffset, titlechars;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <Region.h>
|
||||||
#include "Decorator.h"
|
#include "Decorator.h"
|
||||||
#include "DisplayDriver.h"
|
#include "DisplayDriver.h"
|
||||||
|
|
||||||
@@ -160,6 +161,11 @@ void Decorator::MoveBy(BPoint pt)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BRect Decorator::SlideTab(float dx, float dy=0)
|
||||||
|
{
|
||||||
|
return BRect(0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
void Decorator::ResizeBy(float x, float y)
|
void Decorator::ResizeBy(float x, float y)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -238,11 +244,12 @@ void Decorator::_DrawZoom(BRect r)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
SRegion Decorator::GetFootprint(void)
|
BRegion *Decorator::GetFootprint(void)
|
||||||
{
|
{
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
click_type Decorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
|
click_type Decorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
|
||||||
{
|
{
|
||||||
return CLICK_NONE;
|
return CLICK_NONE;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class Layer;
|
|||||||
class DisplayDriver;
|
class DisplayDriver;
|
||||||
|
|
||||||
typedef enum { CLICK_NONE=0, CLICK_ZOOM, CLICK_CLOSE, CLICK_MINIMIZE,
|
typedef enum { CLICK_NONE=0, CLICK_ZOOM, CLICK_CLOSE, CLICK_MINIMIZE,
|
||||||
CLICK_TAB, CLICK_DRAG, CLICK_MOVETOBACK, CLICK_MOVETOFRONT,
|
CLICK_TAB, CLICK_DRAG, CLICK_MOVETOBACK, CLICK_MOVETOFRONT, CLICK_SLIDETAB,
|
||||||
|
|
||||||
CLICK_RESIZE, CLICK_RESIZE_L, CLICK_RESIZE_T,
|
CLICK_RESIZE, CLICK_RESIZE_L, CLICK_RESIZE_T,
|
||||||
CLICK_RESIZE_R, CLICK_RESIZE_B, CLICK_RESIZE_LT, CLICK_RESIZE_RT,
|
CLICK_RESIZE_R, CLICK_RESIZE_B, CLICK_RESIZE_LT, CLICK_RESIZE_RT,
|
||||||
@@ -36,7 +36,7 @@ typedef enum { CLICK_NONE=0, CLICK_ZOOM, CLICK_CLOSE, CLICK_MINIMIZE,
|
|||||||
#define WFEEL_FLOATING_SUBSET 4
|
#define WFEEL_FLOATING_SUBSET 4
|
||||||
#define WFEEL_FLOATING_APP 5
|
#define WFEEL_FLOATING_APP 5
|
||||||
#define WFEEL_FLOATING_WINDOW 6
|
#define WFEEL_FLOATING_WINDOW 6
|
||||||
|
/*
|
||||||
#define NOT_MOVABLE 0x00000001
|
#define NOT_MOVABLE 0x00000001
|
||||||
#define NOT_CLOSABLE 0x00000020
|
#define NOT_CLOSABLE 0x00000020
|
||||||
#define NOT_ZOOMABLE 0x00000040
|
#define NOT_ZOOMABLE 0x00000040
|
||||||
@@ -52,7 +52,7 @@ typedef enum { CLICK_NONE=0, CLICK_ZOOM, CLICK_CLOSE, CLICK_MINIMIZE,
|
|||||||
#define NOT_ANCHORED_ON_ACTIVATE 0x00020000
|
#define NOT_ANCHORED_ON_ACTIVATE 0x00020000
|
||||||
#define ASYNCHRONOUS_CONTROLS 0x00080000
|
#define ASYNCHRONOUS_CONTROLS 0x00080000
|
||||||
#define QUIT_ON_WINDOW_CLOSE 0x00100000
|
#define QUIT_ON_WINDOW_CLOSE 0x00100000
|
||||||
|
*/
|
||||||
class Decorator
|
class Decorator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -82,6 +82,7 @@ public:
|
|||||||
|
|
||||||
virtual void MoveBy(float x, float y);
|
virtual void MoveBy(float x, float y);
|
||||||
virtual void MoveBy(BPoint pt);
|
virtual void MoveBy(BPoint pt);
|
||||||
|
virtual BRect SlideTab(float dx, float dy=0);
|
||||||
virtual void ResizeBy(float x, float y);
|
virtual void ResizeBy(float x, float y);
|
||||||
virtual void ResizeBy(BPoint pt);
|
virtual void ResizeBy(BPoint pt);
|
||||||
virtual void Draw(BRect r);
|
virtual void Draw(BRect r);
|
||||||
@@ -92,7 +93,7 @@ public:
|
|||||||
virtual void DrawTab(void);
|
virtual void DrawTab(void);
|
||||||
virtual void DrawTitle(void);
|
virtual void DrawTitle(void);
|
||||||
virtual void DrawZoom(void);
|
virtual void DrawZoom(void);
|
||||||
//virtual SRegion GetFootprint(void);
|
virtual BRegion *GetFootprint(void);
|
||||||
virtual click_type Clicked(BPoint pt, int32 buttons, int32 modifiers);
|
virtual click_type Clicked(BPoint pt, int32 buttons, int32 modifiers);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
|
||||||
//#define DEBUG_LAYERS
|
//#define DEBUG_LAYERS
|
||||||
|
//#define DEBUG_REDRAW
|
||||||
|
|
||||||
int64 solidhigh64=0xFFFFFFFFFFFFFFFFLL;
|
int64 solidhigh64=0xFFFFFFFFFFFFFFFFLL;
|
||||||
int64 solidlow64=0LL;
|
int64 solidlow64=0LL;
|
||||||
int64 mixedpat64=0xCCCCCCCCCCCCCCCCLL;
|
int64 mixedpat64=0xCCCCCCCCCCCCCCCCLL;
|
||||||
@@ -22,6 +24,11 @@ int8 *solidhigh=(int8*)&solidhigh64;
|
|||||||
int8 *solidlow=(int8*)&solidlow64;
|
int8 *solidlow=(int8*)&solidlow64;
|
||||||
int8 *mixedpat=(int8*)&mixedpat64;
|
int8 *mixedpat=(int8*)&mixedpat64;
|
||||||
|
|
||||||
|
bool TestLineIntersect(const BRect&r, float x1, float y1, float x2, float y2,bool vertical=true);
|
||||||
|
bool TestRectIntersection(const BRect &r,const BRect &r2);
|
||||||
|
bool TestRegionIntersection(BRegion *r,const BRect &r2);
|
||||||
|
void IntersectRegionWith(BRegion *r,const BRect &r2);
|
||||||
|
|
||||||
Layer::Layer(BRect rect, const char *layername, ServerWindow *srvwin,
|
Layer::Layer(BRect rect, const char *layername, ServerWindow *srvwin,
|
||||||
int32 viewflags, int32 token)
|
int32 viewflags, int32 token)
|
||||||
{
|
{
|
||||||
@@ -469,20 +476,21 @@ void Layer::Invalidate(BRect rect)
|
|||||||
{
|
{
|
||||||
// Make our own section dirty and pass it on to any children, if necessary....
|
// Make our own section dirty and pass it on to any children, if necessary....
|
||||||
// YES, WE ARE SHARING DIRT! Mudpies anyone? :D
|
// YES, WE ARE SHARING DIRT! Mudpies anyone? :D
|
||||||
#ifdef DEBUG_LAYERS
|
#ifdef DEBUG_REDRAW
|
||||||
printf("Layer %s::Invalidate\n",name->String());
|
printf("Layer %s::Invalidate(%f,%f,%f,%f)\n",name->String(),rect.left,rect.top,
|
||||||
printf("Frame: ");frame.PrintToStream();
|
rect.right,rect.bottom);
|
||||||
printf("Invalid rect: ");rect.PrintToStream();
|
|
||||||
printf("Visible: ");visible->PrintToStream();
|
|
||||||
printf("----------------\n");
|
|
||||||
#endif
|
#endif
|
||||||
if(Frame().Intersects(rect))
|
// if(Frame().Intersects(rect) || Frame().Contains(rect))
|
||||||
|
if(TestRectIntersection(Frame(),rect))
|
||||||
{
|
{
|
||||||
// Clip the rectangle to the visible region of the layer
|
// Clip the rectangle to the visible region of the layer
|
||||||
if(visible->Intersects(rect))
|
// if(visible->Intersects(rect))
|
||||||
|
if(TestRegionIntersection(visible,rect))
|
||||||
{
|
{
|
||||||
BRegion reg(rect);
|
// BRegion reg(rect);
|
||||||
reg.IntersectWith(visible);
|
// reg.IntersectWith(visible);
|
||||||
|
BRegion reg(*visible);
|
||||||
|
IntersectRegionWith(®,rect);
|
||||||
if(reg.CountRects()>0)
|
if(reg.CountRects()>0)
|
||||||
{
|
{
|
||||||
is_dirty=true;
|
is_dirty=true;
|
||||||
@@ -491,6 +499,19 @@ printf("----------------\n");
|
|||||||
else
|
else
|
||||||
invalid=new BRegion(reg);
|
invalid=new BRegion(reg);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_REDRAW
|
||||||
|
printf("\tRegion intersection had no rectangles\n");rect.PrintToStream();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_REDRAW
|
||||||
|
printf("\tRectangle did not intersect frame(%.1f,%.1f,%.1f,%.1f)\n", Frame().left,
|
||||||
|
Frame().top,Frame().right,Frame().bottom);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(Layer *lay=topchild;lay!=NULL; lay=lay->lowersibling)
|
for(Layer *lay=topchild;lay!=NULL; lay=lay->lowersibling)
|
||||||
@@ -913,7 +934,7 @@ void RootLayer::RequestDraw(void)
|
|||||||
|
|
||||||
ASSERT(driver!=NULL);
|
ASSERT(driver!=NULL);
|
||||||
|
|
||||||
#ifdef DEBUG_LAYERS
|
#ifdef DEBUG_REDRAW
|
||||||
printf("Root::RequestDraw: invalid rects: %ld\n",invalid->CountRects());
|
printf("Root::RequestDraw: invalid rects: %ld\n",invalid->CountRects());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -923,8 +944,8 @@ printf("Root::RequestDraw: invalid rects: %ld\n",invalid->CountRects());
|
|||||||
{
|
{
|
||||||
if(invalid->RectAt(i).IsValid())
|
if(invalid->RectAt(i).IsValid())
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_LAYERS
|
#ifdef DEBUG_REDRAW
|
||||||
printf("Root::RequestDraw:FillRect, color ",layerdata->lowcolor.PrintToStream());
|
printf("Root::RequestDraw:FillRect, color "); layerdata->lowcolor.PrintToStream();
|
||||||
#endif
|
#endif
|
||||||
driver->FillRect(invalid->RectAt(i),layerdata, solidlow);
|
driver->FillRect(invalid->RectAt(i),layerdata, solidlow);
|
||||||
}
|
}
|
||||||
@@ -949,7 +970,7 @@ void RootLayer::SetColor(RGBColor col)
|
|||||||
{
|
{
|
||||||
layerdata->lowcolor=col;
|
layerdata->lowcolor=col;
|
||||||
#ifdef DEBUG_LAYERS
|
#ifdef DEBUG_LAYERS
|
||||||
printf("Root::SetColor - ",col.PrintToStream());
|
printf("Root::SetColor - "); col.PrintToStream();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -957,3 +978,57 @@ RGBColor RootLayer::GetColor(void) const
|
|||||||
{
|
{
|
||||||
return layerdata->lowcolor;
|
return layerdata->lowcolor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Code stolen from the OBOS version of Rect.cpp. BeOS R5 version returns false
|
||||||
|
// if the rectangles are exactly equal
|
||||||
|
bool TestRectIntersection(const BRect &r,const BRect &r2)
|
||||||
|
{
|
||||||
|
return TestLineIntersect(r, r2.left, r2.top, r2.left, r2.bottom) ||
|
||||||
|
TestLineIntersect(r, r2.left, r2.top, r2.right, r2.top, false) ||
|
||||||
|
TestLineIntersect(r, r2.right, r2.top, r2.right, r2.bottom) ||
|
||||||
|
TestLineIntersect(r, r2.left, r2.bottom, r2.right, r2.bottom, false) ||
|
||||||
|
r.Contains(r2) ||
|
||||||
|
r2.Contains(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TestRegionIntersection(BRegion *r,const BRect &r2)
|
||||||
|
{
|
||||||
|
for(int32 i=0; i<r->CountRects(); i++)
|
||||||
|
if(TestRectIntersection(r->RectAt(i),r2));
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntersectRegionWith(BRegion *r,const BRect &r2)
|
||||||
|
{
|
||||||
|
// We have three conditions:
|
||||||
|
// 1) Region frame contains rect. Action: call Include()
|
||||||
|
// 2) Rect intersects region frame. Action: call IntersectWith
|
||||||
|
// 3) Region frame does not intersect rectangle. Make the region empty
|
||||||
|
if(r->Frame().Contains(r2))
|
||||||
|
r->Include(r2);
|
||||||
|
if(r->Frame().Intersects(r2))
|
||||||
|
{
|
||||||
|
BRegion reg(r2);
|
||||||
|
r->IntersectWith(®);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
r->MakeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TestLineIntersect(const BRect& r, float x1, float y1, float x2, float y2,
|
||||||
|
bool vertical)
|
||||||
|
{
|
||||||
|
if (vertical)
|
||||||
|
{
|
||||||
|
return (x1 >= r.left && x1 <= r.right) &&
|
||||||
|
((y1 >= r.top && y1 <= r.bottom) ||
|
||||||
|
(y2 >= r.top && y2 <= r.bottom));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (y1 >= r.top && y1 <= r.bottom) &&
|
||||||
|
((x1 >= r.left && x1 <= r.right) ||
|
||||||
|
(x2 >= r.left && x2 <= r.right));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user