cleanup and removable of large portions of code duplication, fCurrentLayer and fCurrentLayer->CurrentState() are checked in _DispatchMessage already, so _DispatchGraphicsMessage() assumes they are valid

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14691 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2005-11-04 13:45:16 +00:00
parent 55e764c7f6
commit 13cff625f0
+67 -207
View File
@@ -530,7 +530,12 @@ if (fWinBorder->IsOffscreenWindow()) {
void void
ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
{ {
if (fCurrentLayer == NULL && code != AS_LAYER_CREATE_ROOT && code != AS_LAYER_CREATE) { // TODO: when creating a Layer, check for yet non-existing Layer::InitCheck()
// and take appropriate actions, then checking for fCurrentLayer->fLayerData
// is unnecessary
if ((fCurrentLayer == NULL || fCurrentLayer->CurrentState() == NULL) &&
code != AS_LAYER_CREATE_ROOT && code != AS_LAYER_CREATE) {
printf("ServerWindow %s received unexpected code - message offset %ld before top_view attached.\n", Title(), code - SERVER_TRUE); printf("ServerWindow %s received unexpected code - message offset %ld before top_view attached.\n", Title(), code - SERVER_TRUE);
return; return;
} }
@@ -1679,6 +1684,9 @@ myRootLayer->Unlock();
void void
ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link) ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
{ {
// NOTE: fCurrentLayer and fCurrentLayer->fLayerData cannot be NULL,
// _DispatchGraphicsMessage() is called from _DispatchMessage() which
// checks both these conditions
#ifndef NEW_CLIPPING #ifndef NEW_CLIPPING
BRegion rreg(fCurrentLayer->fVisible); BRegion rreg(fCurrentLayer->fVisible);
#else #else
@@ -1689,6 +1697,11 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
rreg.IntersectWith(&fWinBorder->RegionToBeUpdated()); rreg.IntersectWith(&fWinBorder->RegionToBeUpdated());
DisplayDriver* driver = fWinBorder->GetDisplayDriver(); DisplayDriver* driver = fWinBorder->GetDisplayDriver();
if (!driver) {
// ?!?
DTRACE(("ServerWindow %s: no display driver!!\n", Title()));
return;
}
driver->ConstrainClippingRegion(&rreg); driver->ConstrainClippingRegion(&rreg);
// rgb_color rrr = fCurrentLayer->CurrentState()->viewcolor.GetColor32(); // rgb_color rrr = fCurrentLayer->CurrentState()->viewcolor.GetColor32();
@@ -1707,8 +1720,6 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<float>(&x2); link.Read<float>(&x2);
link.Read<float>(&y2); link.Read<float>(&y2);
if (fCurrentLayer && fCurrentLayer->CurrentState()) {
BPoint p1(x1,y1); BPoint p1(x1,y1);
BPoint p2(x2,y2); BPoint p2(x2,y2);
driver->StrokeLine(fCurrentLayer->ConvertToTop(p1), driver->StrokeLine(fCurrentLayer->ConvertToTop(p1),
@@ -1722,7 +1733,6 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
// for DrawString(), also there needs to be a decision, if penlocation // for DrawString(), also there needs to be a decision, if penlocation
// is in View coordinates (I think it should be) or in screen coordinates. // is in View coordinates (I think it should be) or in screen coordinates.
fCurrentLayer->CurrentState()->SetPenLocation(p2); fCurrentLayer->CurrentState()->SetPenLocation(p2);
}
break; break;
} }
case AS_LAYER_INVERT_RECT: case AS_LAYER_INVERT_RECT:
@@ -1732,7 +1742,6 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
BRect rect; BRect rect;
link.Read<BRect>(&rect); link.Read<BRect>(&rect);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->InvertRect(fCurrentLayer->ConvertToTop(rect)); driver->InvertRect(fCurrentLayer->ConvertToTop(rect));
break; break;
} }
@@ -1747,8 +1756,8 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<float>(&bottom); link.Read<float>(&bottom);
BRect rect(left,top,right,bottom); BRect rect(left,top,right,bottom);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->StrokeRect(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState()); driver->StrokeRect(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
break; break;
} }
case AS_FILL_RECT: case AS_FILL_RECT:
@@ -1757,34 +1766,13 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
BRect rect; BRect rect;
link.Read<BRect>(&rect); link.Read<BRect>(&rect);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->FillRect(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState()); driver->FillRect(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
break; break;
} }
case AS_LAYER_DRAW_BITMAP_SYNC_AT_POINT: case AS_LAYER_DRAW_BITMAP_SYNC_AT_POINT:
{
DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_SYNC_AT_POINT: Layer name: %s\n", fTitle, fCurrentLayer->Name()));
int32 bitmapToken;
BPoint point;
link.Read<int32>(&bitmapToken);
link.Read<BPoint>(&point);
ServerBitmap* sbmp = fServerApp->FindBitmap(bitmapToken);
if (sbmp) {
BRect src = sbmp->Bounds();
BRect dst = src.OffsetToCopy(point);
dst = fCurrentLayer->ConvertToTop(dst);
driver->DrawBitmap(sbmp, src, dst, fCurrentLayer->CurrentState());
}
// TODO: Adi -- shouldn't AS_LAYER_DRAW_BITMAP_SYNC_AT_POINT sync with the client?
break;
}
case AS_LAYER_DRAW_BITMAP_ASYNC_AT_POINT: case AS_LAYER_DRAW_BITMAP_ASYNC_AT_POINT:
{ {
DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_ASYNC_AT_POINT: Layer name: %s\n", fTitle, fCurrentLayer->Name())); DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_(A)SYNC_AT_POINT: Layer name: %s\n", fTitle, fCurrentLayer->Name()));
int32 bitmapToken; int32 bitmapToken;
BPoint point; BPoint point;
@@ -1799,31 +1787,14 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
driver->DrawBitmap(sbmp, src, dst, fCurrentLayer->CurrentState()); driver->DrawBitmap(sbmp, src, dst, fCurrentLayer->CurrentState());
} }
// TODO: how should AS_LAYER_DRAW_BITMAP_SYNC_AT_POINT sync with the client?
break; break;
} }
case AS_LAYER_DRAW_BITMAP_SYNC_IN_RECT: case AS_LAYER_DRAW_BITMAP_SYNC_IN_RECT:
{
DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_SYNC_IN_RECT: Layer name: %s\n", fTitle, fCurrentLayer->Name()));
int32 bitmapToken;
BRect srcRect, dstRect;
link.Read<int32>(&bitmapToken);
link.Read<BRect>(&dstRect);
link.Read<BRect>(&srcRect);
ServerBitmap* sbmp = fServerApp->FindBitmap(bitmapToken);
if (sbmp) {
dstRect = fCurrentLayer->ConvertToTop(dstRect);
driver->DrawBitmap(sbmp, srcRect, dstRect, fCurrentLayer->CurrentState());
}
// TODO: Adi -- shouldn't AS_LAYER_DRAW_BITMAP_SYNC_IN_RECT sync with the client?
break;
}
case AS_LAYER_DRAW_BITMAP_ASYNC_IN_RECT: case AS_LAYER_DRAW_BITMAP_ASYNC_IN_RECT:
{ {
DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_ASYNC_IN_RECT: Layer name: %s\n", fTitle, fCurrentLayer->Name())); DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_(A)SYNC_IN_RECT: Layer name: %s\n", fTitle, fCurrentLayer->Name()));
int32 bitmapToken; int32 bitmapToken;
BRect srcRect, dstRect; BRect srcRect, dstRect;
@@ -1837,25 +1808,14 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
driver->DrawBitmap(sbmp, srcRect, dstRect, fCurrentLayer->CurrentState()); driver->DrawBitmap(sbmp, srcRect, dstRect, fCurrentLayer->CurrentState());
} }
// TODO: how should AS_LAYER_DRAW_BITMAP_SYNC_IN_RECT sync with the client?
break; break;
} }
case AS_STROKE_ARC: case AS_STROKE_ARC:
{
DTRACE(("ServerWindow %s: Message AS_STROKE_ARC\n", Title()));
float angle, span;
BRect r;
link.Read<BRect>(&r);
link.Read<float>(&angle);
link.Read<float>(&span);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->StrokeArc(fCurrentLayer->ConvertToTop(r),angle,span, fCurrentLayer->CurrentState());
break;
}
case AS_FILL_ARC: case AS_FILL_ARC:
{ {
DTRACE(("ServerWindow %s: Message AS_FILL_ARC\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_ARC\n", Title()));
float angle, span; float angle, span;
BRect r; BRect r;
@@ -1863,89 +1823,51 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<BRect>(&r); link.Read<BRect>(&r);
link.Read<float>(&angle); link.Read<float>(&angle);
link.Read<float>(&span); link.Read<float>(&span);
if (fCurrentLayer && fCurrentLayer->CurrentState())
if (code == AS_STROKE_ARC)
driver->StrokeArc(fCurrentLayer->ConvertToTop(r),angle,span, fCurrentLayer->CurrentState());
else
driver->FillArc(fCurrentLayer->ConvertToTop(r),angle,span, fCurrentLayer->CurrentState()); driver->FillArc(fCurrentLayer->ConvertToTop(r),angle,span, fCurrentLayer->CurrentState());
break; break;
} }
case AS_STROKE_BEZIER: case AS_STROKE_BEZIER:
{
DTRACE(("ServerWindow %s: Message AS_STROKE_BEZIER\n", Title()));
BPoint *pts;
int i;
pts = new BPoint[4];
for (i=0; i<4; i++)
link.Read<BPoint>(&(pts[i]));
if (fCurrentLayer && fCurrentLayer->CurrentState())
{
for (i=0; i<4; i++)
pts[i]=fCurrentLayer->ConvertToTop(pts[i]);
driver->StrokeBezier(pts, fCurrentLayer->CurrentState());
}
delete [] pts;
break;
}
case AS_FILL_BEZIER: case AS_FILL_BEZIER:
{ {
DTRACE(("ServerWindow %s: Message AS_FILL_BEZIER\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_BEZIER\n", Title()));
BPoint *pts; BPoint pts[4];
int i; for (int32 i = 0; i < 4; i++) {
pts = new BPoint[4];
for (i=0; i<4; i++)
link.Read<BPoint>(&(pts[i])); link.Read<BPoint>(&(pts[i]));
if (fCurrentLayer && fCurrentLayer->CurrentState())
{
for (i=0; i<4; i++)
pts[i] = fCurrentLayer->ConvertToTop(pts[i]); pts[i] = fCurrentLayer->ConvertToTop(pts[i]);
driver->FillBezier(pts, fCurrentLayer->CurrentState());
} }
delete [] pts;
if (code == AS_STROKE_BEZIER)
driver->StrokeBezier(pts, fCurrentLayer->CurrentState());
else
driver->FillBezier(pts, fCurrentLayer->CurrentState());
break; break;
} }
case AS_STROKE_ELLIPSE: case AS_STROKE_ELLIPSE:
{
DTRACE(("ServerWindow %s: Message AS_STROKE_ELLIPSE\n", Title()));
BRect rect;
link.Read<BRect>(&rect);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->StrokeEllipse(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
break;
}
case AS_FILL_ELLIPSE: case AS_FILL_ELLIPSE:
{ {
DTRACE(("ServerWindow %s: Message AS_FILL_ELLIPSE\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_ELLIPSE\n", Title()));
BRect rect; BRect rect;
link.Read<BRect>(&rect); link.Read<BRect>(&rect);
if (fCurrentLayer && fCurrentLayer->CurrentState())
if (code == AS_STROKE_ELLIPSE)
driver->StrokeEllipse(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
else
driver->FillEllipse(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState()); driver->FillEllipse(fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
break; break;
} }
case AS_STROKE_ROUNDRECT: case AS_STROKE_ROUNDRECT:
{
DTRACE(("ServerWindow %s: Message AS_STROKE_ROUNDRECT\n", Title()));
BRect rect;
float xrad,yrad;
link.Read<BRect>(&rect);
link.Read<float>(&xrad);
link.Read<float>(&yrad);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->StrokeRoundRect(fCurrentLayer->ConvertToTop(rect),xrad,yrad, fCurrentLayer->CurrentState());
break;
}
case AS_FILL_ROUNDRECT: case AS_FILL_ROUNDRECT:
{ {
DTRACE(("ServerWindow %s: Message AS_FILL_ROUNDRECT\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_ROUNDRECT\n", Title()));
BRect rect; BRect rect;
float xrad,yrad; float xrad,yrad;
@@ -1953,54 +1875,39 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<float>(&xrad); link.Read<float>(&xrad);
link.Read<float>(&yrad); link.Read<float>(&yrad);
if (fCurrentLayer && fCurrentLayer->CurrentState()) if (code == AS_STROKE_ROUNDRECT)
driver->StrokeRoundRect(fCurrentLayer->ConvertToTop(rect),xrad,yrad, fCurrentLayer->CurrentState());
else
driver->FillRoundRect(fCurrentLayer->ConvertToTop(rect),xrad,yrad, fCurrentLayer->CurrentState()); driver->FillRoundRect(fCurrentLayer->ConvertToTop(rect),xrad,yrad, fCurrentLayer->CurrentState());
break; break;
} }
case AS_STROKE_TRIANGLE: case AS_STROKE_TRIANGLE:
{
DTRACE(("ServerWindow %s: Message AS_STROKE_TRIANGLE\n", Title()));
BPoint pts[3];
BRect rect;
for (int i = 0; i < 3; i++)
link.Read<BPoint>(&(pts[i]));
link.Read<BRect>(&rect);
if (fCurrentLayer && fCurrentLayer->CurrentState()) {
for (int i = 0;i < 3; i++)
pts[i] = fCurrentLayer->ConvertToTop(pts[i]);
driver->StrokeTriangle(pts, fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
}
break;
}
case AS_FILL_TRIANGLE: case AS_FILL_TRIANGLE:
{ {
DTRACE(("ServerWindow %s: Message AS_FILL_TRIANGLE\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_TRIANGLE\n", Title()));
BPoint pts[3]; BPoint pts[3];
BRect rect; BRect rect;
for (int i = 0; i < 3; i++) for (int32 i = 0; i < 3; i++) {
link.Read<BPoint>(&(pts[i])); link.Read<BPoint>(&(pts[i]));
pts[i] = fCurrentLayer->ConvertToTop(pts[i]);
}
link.Read<BRect>(&rect); link.Read<BRect>(&rect);
if (fCurrentLayer && fCurrentLayer->CurrentState()) { if (code == AS_STROKE_TRIANGLE)
for (int i = 0; i < 3; i++) driver->StrokeTriangle(pts, fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
pts[i] = fCurrentLayer->ConvertToTop(pts[i]); else
driver->FillTriangle(pts, fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState()); driver->FillTriangle(pts, fCurrentLayer->ConvertToTop(rect), fCurrentLayer->CurrentState());
}
break; break;
} }
// TODO: get rid of all this code duplication!!
case AS_STROKE_POLYGON: case AS_STROKE_POLYGON:
case AS_FILL_POLYGON:
{ {
DTRACE(("ServerWindow %s: Message AS_STROKE_POLYGON\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_POLYGON\n", Title()));
BRect polyframe; BRect polyframe;
bool isclosed; bool isclosed;
@@ -2008,6 +1915,7 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
BPoint *pointlist; BPoint *pointlist;
link.Read<BRect>(&polyframe); link.Read<BRect>(&polyframe);
if (code == AS_STROKE_POLYGON)
link.Read<bool>(&isclosed); link.Read<bool>(&isclosed);
link.Read<int32>(&pointcount); link.Read<int32>(&pointcount);
@@ -2018,79 +1926,29 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
for (int32 i = 0; i < pointcount; i++) for (int32 i = 0; i < pointcount; i++)
pointlist[i] = fCurrentLayer->ConvertToTop(pointlist[i]); pointlist[i] = fCurrentLayer->ConvertToTop(pointlist[i]);
driver->StrokePolygon(pointlist,pointcount,polyframe, if (code == AS_STROKE_POLYGON)
fCurrentLayer->CurrentState(),isclosed); driver->StrokePolygon(pointlist, pointcount, polyframe, fCurrentLayer->CurrentState(), isclosed);
else
delete [] pointlist;
break;
}
case AS_FILL_POLYGON:
{
DTRACE(("ServerWindow %s: Message AS_FILL_POLYGON\n", Title()));
BRect polyframe;
int32 pointcount;
BPoint *pointlist;
link.Read<BRect>(&polyframe);
link.Read<int32>(&pointcount);
pointlist = new BPoint[pointcount];
link.Read(pointlist, sizeof(BPoint) * pointcount);
for (int32 i = 0; i < pointcount; i++)
pointlist[i] = fCurrentLayer->ConvertToTop(pointlist[i]);
driver->FillPolygon(pointlist, pointcount, polyframe, fCurrentLayer->CurrentState()); driver->FillPolygon(pointlist, pointcount, polyframe, fCurrentLayer->CurrentState());
delete [] pointlist; delete [] pointlist;
break; break;
} }
case AS_STROKE_SHAPE: case AS_STROKE_SHAPE:
{
DTRACE(("ServerWindow %s: Message AS_STROKE_SHAPE\n", Title()));
BRect shaperect;
int32 opcount;
int32 ptcount;
int32 *oplist;
BPoint *ptlist;
link.Read<BRect>(&shaperect);
link.Read<int32>(&opcount);
link.Read<int32>(&ptcount);
oplist = new int32[opcount];
ptlist = new BPoint[ptcount];
link.Read(oplist, sizeof(int32) * opcount);
link.Read(ptlist, sizeof(BPoint) * ptcount);
for (int32 i = 0; i < ptcount; i++)
ptlist[i] = fCurrentLayer->ConvertToTop(ptlist[i]);
driver->StrokeShape(shaperect, opcount, oplist, ptcount, ptlist, fCurrentLayer->CurrentState());
delete[] oplist;
delete[] ptlist;
break;
}
case AS_FILL_SHAPE: case AS_FILL_SHAPE:
{ {
DTRACE(("ServerWindow %s: Message AS_FILL_SHAPE\n", Title())); DTRACE(("ServerWindow %s: Message AS_STROKE/FILL_SHAPE\n", Title()));
BRect shaperect; BRect shaperect;
int32 opcount; int32 opcount;
int32 ptcount; int32 ptcount;
int32 *oplist;
BPoint *ptlist;
link.Read<BRect>(&shaperect); link.Read<BRect>(&shaperect);
link.Read<int32>(&opcount); link.Read<int32>(&opcount);
link.Read<int32>(&ptcount); link.Read<int32>(&ptcount);
oplist = new int32[opcount]; int32* oplist = new int32[opcount];
ptlist = new BPoint[ptcount]; BPoint* ptlist = new BPoint[ptcount];
link.Read(oplist, sizeof(int32) * opcount); link.Read(oplist, sizeof(int32) * opcount);
link.Read(ptlist, sizeof(BPoint) * ptcount); link.Read(ptlist, sizeof(BPoint) * ptcount);
@@ -2098,6 +1956,9 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
for (int32 i = 0; i < ptcount; i++) for (int32 i = 0; i < ptcount; i++)
ptlist[i] = fCurrentLayer->ConvertToTop(ptlist[i]); ptlist[i] = fCurrentLayer->ConvertToTop(ptlist[i]);
if (code == AS_STROKE_SHAPE)
driver->StrokeShape(shaperect, opcount, oplist, ptcount, ptlist, fCurrentLayer->CurrentState());
else
driver->FillShape(shaperect, opcount, oplist, ptcount, ptlist, fCurrentLayer->CurrentState()); driver->FillShape(shaperect, opcount, oplist, ptcount, ptlist, fCurrentLayer->CurrentState());
delete[] oplist; delete[] oplist;
@@ -2175,7 +2036,6 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<escapement_delta>(&delta); link.Read<escapement_delta>(&delta);
link.ReadString(&string); link.ReadString(&string);
if (fCurrentLayer && fCurrentLayer->CurrentState())
driver->DrawString(string, length, driver->DrawString(string, length,
fCurrentLayer->ConvertToTop(location), fCurrentLayer->ConvertToTop(location),
fCurrentLayer->CurrentState(), &delta); fCurrentLayer->CurrentState(), &delta);