Added a couple of conversion methods for BPoints

Did some serious playing with update code in ServerWindow and Layer
BView::StrokeLine calls draw to the screen(!!!)


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8935 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm
2004-09-14 00:51:51 +00:00
parent 82b76be31e
commit a3d34bb143
3 changed files with 96 additions and 33 deletions
+23 -2
View File
@@ -1343,6 +1343,16 @@ BRegion Layer::ConvertFromParent(BRegion *reg)
return newreg; return newreg;
} }
BPoint Layer::ConvertToTop(BPoint pt)
{
if (fParent!=NULL)
{
return(fParent->ConvertToTop(pt+fFrame.LeftTop()));
}
else
return(pt);
}
//! Converts the passed region to screen coordinates //! Converts the passed region to screen coordinates
BRegion Layer::ConvertToTop(BRegion *reg) BRegion Layer::ConvertToTop(BRegion *reg)
{ {
@@ -1361,6 +1371,16 @@ BRect Layer::ConvertToTop(BRect rect)
return(rect); return(rect);
} }
BPoint Layer::ConvertFromTop(BPoint pt)
{
if (fParent!=NULL)
{
return(fParent->ConvertFromTop(pt-fFrame.LeftTop()));
}
else
return(pt);
}
//! Converts the passed region from screen coordinates //! Converts the passed region from screen coordinates
BRegion Layer::ConvertFromTop(BRegion *reg) BRegion Layer::ConvertFromTop(BRegion *reg)
{ {
@@ -1423,8 +1443,9 @@ void Layer::SendUpdateMsg()
{ {
BMessage msg; BMessage msg;
msg.what = _UPDATE_; msg.what = _UPDATE_;
msg.AddRect( "_rect", ConvertFromTop(fUpdateReg.Frame()) ); msg.AddRect("_rect", ConvertFromTop(fUpdateReg.Frame()) );
msg.AddRect( "debug_rect", fUpdateReg.Frame() ); msg.AddRect("debug_rect", fUpdateReg.Frame() );
msg.AddInt32("_token",fViewToken);
fServerWin->SendMessageToClient( &msg ); fServerWin->SendMessageToClient( &msg );
} }
+4
View File
@@ -120,8 +120,12 @@ public:
BRegion ConvertToParent(BRegion *reg); BRegion ConvertToParent(BRegion *reg);
BRect ConvertFromParent(BRect rect); BRect ConvertFromParent(BRect rect);
BRegion ConvertFromParent(BRegion *reg); BRegion ConvertFromParent(BRegion *reg);
BPoint ConvertToTop(BPoint pt);
BRegion ConvertToTop(BRegion *reg); BRegion ConvertToTop(BRegion *reg);
BRect ConvertToTop(BRect rect); BRect ConvertToTop(BRect rect);
BPoint ConvertFromTop(BPoint pt);
BRegion ConvertFromTop(BRegion *reg); BRegion ConvertFromTop(BRegion *reg);
BRect ConvertFromTop(BRect rect); BRect ConvertFromTop(BRect rect);
+69 -31
View File
@@ -34,6 +34,7 @@
#include <GraphicsDefs.h> #include <GraphicsDefs.h>
#include <PortLink.h> #include <PortLink.h>
#include <Session.h> #include <Session.h>
#include "Desktop.h"
#include "AppServer.h" #include "AppServer.h"
#include "Layer.h" #include "Layer.h"
#include "RootLayer.h" #include "RootLayer.h"
@@ -49,7 +50,7 @@
#include "CursorManager.h" #include "CursorManager.h"
#include "Workspace.h" #include "Workspace.h"
//#define DEBUG_SERVERWINDOW #define DEBUG_SERVERWINDOW
//#define DEBUG_SERVERWINDOW_MOUSE //#define DEBUG_SERVERWINDOW_MOUSE
//#define DEBUG_SERVERWINDOW_KEYBOARD //#define DEBUG_SERVERWINDOW_KEYBOARD
@@ -89,6 +90,7 @@ read_from_buffer(int8 **_buffer)
return value; return value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/*
static int8 *read_pattern_from_buffer(int8 **_buffer) static int8 *read_pattern_from_buffer(int8 **_buffer)
{ {
int8 *pattern = *_buffer; int8 *pattern = *_buffer;
@@ -97,6 +99,7 @@ static int8 *read_pattern_from_buffer(int8 **_buffer)
return pattern; return pattern;
} }
*/
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
template<class Type> void template<class Type> void
write_to_buffer(int8 **_buffer, Type value) write_to_buffer(int8 **_buffer, Type value)
@@ -680,7 +683,6 @@ void ServerWindow::DispatchMessage(int32 code)
printf("ServerWindow %s received unexpected code - message offset %lx before top_view attached.\n",fTitle.String(), code - SERVER_TRUE); printf("ServerWindow %s received unexpected code - message offset %lx before top_view attached.\n",fTitle.String(), code - SERVER_TRUE);
return; return;
} }
switch(code) switch(code)
{ {
//--------- BView Messages ----------------- //--------- BView Messages -----------------
@@ -1084,7 +1086,7 @@ void ServerWindow::DispatchMessage(int32 code)
} }
case AS_LAYER_SET_SCALE: case AS_LAYER_SET_SCALE:
{ {
STRACE(("ServerWindow %s: Message AS_LAYER_SET_SCALE: Layer: %s\n",fTitle.String(), cl->_name->String())); STRACE(("ServerWindow %s: Message AS_LAYER_SET_SCALE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->Read<float>(&(cl->fLayerData->scale)); fSession->Read<float>(&(cl->fLayerData->scale));
break; break;
} }
@@ -1118,7 +1120,7 @@ void ServerWindow::DispatchMessage(int32 code)
} }
case AS_LAYER_GET_PEN_LOC: case AS_LAYER_GET_PEN_LOC:
{ {
STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->_name->String())); STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->StartMessage(SERVER_TRUE); fSession->StartMessage(SERVER_TRUE);
fSession->Attach<BPoint>(cl->fLayerData->penlocation); fSession->Attach<BPoint>(cl->fLayerData->penlocation);
fSession->Flush(); fSession->Flush();
@@ -1127,14 +1129,14 @@ void ServerWindow::DispatchMessage(int32 code)
} }
case AS_LAYER_SET_PEN_SIZE: case AS_LAYER_SET_PEN_SIZE:
{ {
STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->_name->String())); STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->Read<float>(&(cl->fLayerData->pensize)); fSession->Read<float>(&(cl->fLayerData->pensize));
break; break;
} }
case AS_LAYER_GET_PEN_SIZE: case AS_LAYER_GET_PEN_SIZE:
{ {
STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->_name->String())); STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->StartMessage(SERVER_TRUE); fSession->StartMessage(SERVER_TRUE);
fSession->Attach<float>(cl->fLayerData->pensize); fSession->Attach<float>(cl->fLayerData->pensize);
fSession->Flush(); fSession->Flush();
@@ -1465,11 +1467,13 @@ void ServerWindow::DispatchMessage(int32 code)
} }
case AS_BEGIN_UPDATE: case AS_BEGIN_UPDATE:
{ {
STRACE(("ServerWindowo %s: AS_BEGIN_UPDATE\n",fTitle.String()));
cl->UpdateStart(); cl->UpdateStart();
break; break;
} }
case AS_END_UPDATE: case AS_END_UPDATE:
{ {
STRACE(("ServerWindowo %s: AS_END_UPDATE\n",fTitle.String()));
cl->UpdateEnd(); cl->UpdateEnd();
break; break;
} }
@@ -1680,6 +1684,30 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message Zoom unimplemented\n",fTitle.String())); STRACE(("ServerWindow %s: Message Zoom unimplemented\n",fTitle.String()));
break; break;
} }
// -------------------- Graphics messages ----------------------------------
case AS_STROKE_LINE:
{
// TODO: Add clipping TO AS_STROKE_LINE
float x1, y1, x2, y2;
fSession->Read<float>(&x1);
fSession->Read<float>(&y1);
fSession->Read<float>(&x2);
fSession->Read<float>(&y2);
if (cl && cl->fLayerData)
{
BPoint p1(x1,y1);
BPoint p2(x2,y2);
desktop->GetDisplayDriver()->StrokeLine(cl->ConvertToTop(p1),cl->ConvertToTop(p2),
cl->fLayerData);
}
break;
}
default: default:
{ {
printf("ServerWindow %s received unexpected code - message offset %lx\n",fTitle.String(), code - SERVER_TRUE); printf("ServerWindow %s received unexpected code - message offset %lx\n",fTitle.String(), code - SERVER_TRUE);
@@ -1695,7 +1723,7 @@ void ServerWindow::DispatchMessage(int32 code)
*/ */
void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer) void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
{ {
Layer *layer; /* Layer *layer;
LayerData *layerdata; LayerData *layerdata;
int32 code; int32 code;
int32 view_token; int32 view_token;
@@ -1711,14 +1739,14 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
return; return;
// TODO: fix sibling-related clipping calculations in DispatchGraphicsMessage // TODO: fix sibling-related clipping calculations in DispatchGraphicsMessage
/* WindowClipRegion.Set(fWinBorder->Frame()); // WindowClipRegion.Set(fWinBorder->Frame());
sibling = fWinBorder->UpperSibling(); // sibling = fWinBorder->UpperSibling();
while (sibling) // while (sibling)
{ // {
WindowClipRegion.Exclude(sibling->Frame()); // WindowClipRegion.Exclude(sibling->Frame());
sibling = sibling->UpperSibling(); // sibling = sibling->UpperSibling();
} // }
*/
if (!WindowClipRegion.Frame().IsValid()) if (!WindowClipRegion.Frame().IsValid())
return; return;
@@ -1899,10 +1927,15 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
x2 = read_from_buffer<float>(&msgbuffer); x2 = read_from_buffer<float>(&msgbuffer);
y2 = read_from_buffer<float>(&msgbuffer); y2 = read_from_buffer<float>(&msgbuffer);
pattern = read_pattern_from_buffer(&msgbuffer); pattern = read_pattern_from_buffer(&msgbuffer);
//BPoint p1(x1,y1); // BPoint p1(x1,y1);
//BPoint p2(x2,y2); // BPoint p2(x2,y2);
//if (layerdata)
//fServerApp->_driver->StrokeLine(p1,p2,layerdata,pattern); // TODO: This printf should remain in place to until it actually gets printed
// while testing with a test app which calls StrokeLine()
printf("AS_STROKE_LINE\n");
// if (cl && cl->fLayerData)
// desktop->GetDisplayDriver()->StrokeLine(p1,p2,cl->fLayerData);
sizeRemaining -= AS_STROKE_LINE_MSG_SIZE; sizeRemaining -= AS_STROKE_LINE_MSG_SIZE;
} }
else else
@@ -2103,18 +2136,18 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
right = read_from_buffer<float>(&msgbuffer); right = read_from_buffer<float>(&msgbuffer);
bottom = read_from_buffer<float>(&msgbuffer); bottom = read_from_buffer<float>(&msgbuffer);
pattern = read_pattern_from_buffer(&msgbuffer); pattern = read_pattern_from_buffer(&msgbuffer);
/*
BRect rect(left,top,right,bottom); // BRect rect(left,top,right,bottom);
if (layerdata && numRects) // if (layerdata && numRects)
if (numRects == 1) // if (numRects == 1)
fServerApp->_driver->FillRect(rect,layerdata,pattern); // fServerApp->_driver->FillRect(rect,layerdata,pattern);
else // else
{ // {
int i; // int i;
for (i=0; i<numRects; i++) // for (i=0; i<numRects; i++)
fServerApp->_driver->FillRect(LayerClipRegion.RectAt(i),layerdata,pattern); // fServerApp->_driver->FillRect(LayerClipRegion.RectAt(i),layerdata,pattern);
} // }
*/
sizeRemaining -= AS_FILL_RECT_MSG_SIZE; sizeRemaining -= AS_FILL_RECT_MSG_SIZE;
} }
else else
@@ -2223,6 +2256,10 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
// TODO: Implement AS_SET_FONT_SIZE // TODO: Implement AS_SET_FONT_SIZE
break; break;
} }
// graphics messages
default: default:
{ {
sizeRemaining -= sizeof(int32); sizeRemaining -= sizeof(int32);
@@ -2231,6 +2268,7 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
} }
} }
} }
*/
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/*! /*!