From af675e2c03c8cf1bec7a9e085d06079025a76216 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Wed, 18 Jan 2006 20:49:29 +0000 Subject: [PATCH] implemented some more stuff for bpicture support. In theory StrokeLine, Stroke/FillRect should work but in practice they don't. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16005 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/ServerPicture.cpp | 32 ++++++++++++------------------- src/servers/app/ServerWindow.cpp | 32 ++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/servers/app/ServerPicture.cpp b/src/servers/app/ServerPicture.cpp index 99fff6d775..d60f15e1c2 100644 --- a/src/servers/app/ServerPicture.cpp +++ b/src/servers/app/ServerPicture.cpp @@ -1,13 +1,16 @@ +#include "DrawingEngine.h" #include "ServerBitmap.h" #include "ServerPicture.h" #include "ServerTokenSpace.h" #include "ViewLayer.h" +#include "WindowLayer.h" #include #include #include + static void nop() { @@ -26,30 +29,25 @@ move_pen_by(ViewLayer *view, BPoint delta) static void stroke_line(ViewLayer *view, BPoint start, BPoint end) { - //view->MovePenTo(start); - //view->StrokeLine(end); - printf("StrokeLine(BPoint(%.2f, %.2f), BPoint(%.2f, %.2f))\n", start.x, start.y, - end.x, end.y); + view->ConvertToScreenForDrawing(&start); + view->ConvertToScreenForDrawing(&end); + view->Window()->GetDrawingEngine()->StrokeLine(start, end, view->CurrentState()->HighColor()); } static void stroke_rect(ViewLayer *view, BRect rect) { - //view->StrokeRect(rect); - - printf("StrokeRect(BRect(%.2f, %.2f, %.2f, %.2f))\n", rect.left, rect.top, - rect.right, rect.bottom); + view->ConvertToScreenForDrawing(&rect); + view->Window()->GetDrawingEngine()->StrokeRect(rect, view->CurrentState()->HighColor()); } static void fill_rect(ViewLayer *view, BRect rect) { - //view->FillRect(rect); - - printf("FillRect(BRect(%.2f, %.2f, %.2f, %.2f))\n", rect.left, rect.top, - rect.right, rect.bottom); + view->ConvertToScreenForDrawing(&rect); + view->Window()->GetDrawingEngine()->FillRect(rect, view->CurrentState()->HighColor()); } @@ -297,20 +295,14 @@ set_pen_size(ViewLayer *view, float size) static void set_fore_color(ViewLayer *view, rgb_color color) { - //view->SetHighColor(color); - - printf("SetForeColor(%d, %d, %d, %d)\n", color.red, color.green, - color.blue, color.alpha); + view->CurrentState()->SetHighColor(RGBColor(color)); } static void set_back_color(ViewLayer *view, rgb_color color) { - //view->SetLowColor(color); - - printf("SetBackColor(%d, %d, %d, %d)\n", color.red, color.green, - color.blue, color.alpha); + view->CurrentState()->SetLowColor(RGBColor(color)); } diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index f91764ab10..4dd324624c 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -2187,6 +2187,7 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code, BPrivate::LinkReceiver &li if (picture != NULL) { fCurrentLayer->ConvertToScreenForDrawing(&where); fCurrentLayer->CurrentState()->SetPenLocation(where); + // TODO: pass the location to the play method and handle it there picture->Play(fCurrentLayer); } } @@ -2218,15 +2219,44 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link) switch (code) { case AS_FILL_RECT: + case AS_STROKE_RECT: { BRect rect; link.Read(&rect); - picture->BeginOp(B_PIC_FILL_RECT); + picture->BeginOp(code == AS_FILL_RECT ? B_PIC_FILL_RECT : B_PIC_STROKE_RECT); picture->AddRect(rect); picture->EndOp(); break; } + + case AS_STROKE_LINE: + { + float x1, y1, x2, y2; + + link.Read(&x1); + link.Read(&y1); + link.Read(&x2); + link.Read(&y2); + + picture->BeginOp(B_PIC_STROKE_LINE); + picture->AddCoord(BPoint(x1, y1)); + picture->AddCoord(BPoint(x2, y2)); + picture->EndOp(); + break; + } + + case AS_LAYER_SET_LOW_COLOR: + case AS_LAYER_SET_HIGH_COLOR: + { + rgb_color color; + link.Read(&color, sizeof(rgb_color)); + + picture->BeginOp(code == AS_LAYER_SET_HIGH_COLOR ? B_PIC_SET_FORE_COLOR : B_PIC_SET_BACK_COLOR); + picture->AddColor(color); + picture->EndOp(); + break; + } case AS_LAYER_DRAW_BITMAP: {