From 690c7474a4d9597b5deceeaa4b582f2b2a6baaaf Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Mon, 13 Aug 2007 14:07:12 +0000 Subject: [PATCH] Implemented BPicture's SetPenLocation() op, also nested AppendToPicture() (but still doesn't work :( ). Moved some functions around in PictureDataWriter.h. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21925 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/interface/PictureDataWriter.h | 52 +++++++++---------- src/kits/interface/PictureDataWriter.cpp | 14 +++++ src/servers/app/ServerPicture.cpp | 7 +-- src/servers/app/ServerWindow.cpp | 25 +++++++-- 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/headers/private/interface/PictureDataWriter.h b/headers/private/interface/PictureDataWriter.h index 3e67796ce4..00e57ecabe 100644 --- a/headers/private/interface/PictureDataWriter.h +++ b/headers/private/interface/PictureDataWriter.h @@ -23,38 +23,18 @@ public: status_t SetTo(BPositionIO *data); + status_t WriteSetHighColor(const rgb_color &color); + status_t WriteSetLowColor(const rgb_color &color); status_t WriteSetOrigin(const BPoint &point); - status_t WriteInvertRect(const BRect &rect); - status_t WriteSetDrawingMode(const drawing_mode &mode); + status_t WriteSetPenLocation(const BPoint &point); status_t WriteSetPenSize(const float &penSize); status_t WriteSetLineMode(const cap_mode &cap, const join_mode &join, const float &miterLimit); status_t WriteSetScale(const float &scale); - status_t WriteDrawRect(const BRect &rect, const bool &fill); - status_t WriteDrawRoundRect(const BRect &rect, const BPoint &radius, const bool &fill); - status_t WriteDrawEllipse(const BRect &rect, const bool &fill); - status_t WriteDrawArc(const BPoint ¢er, const BPoint &radius, - const float &startTheta, const float &arcTheta, const bool &fill); - status_t WriteDrawPolygon(const int32 &numPoints, BPoint *points, - const bool &isClosed, const bool &fill); - status_t WriteDrawBezier(const BPoint points[4], const bool &fill); - - status_t WriteStrokeLine(const BPoint &start, const BPoint &end); + status_t WritePushState(); + status_t WritePopState(); - status_t WriteSetHighColor(const rgb_color &color); - status_t WriteSetLowColor(const rgb_color &color); - - status_t WriteDrawString(const BPoint &where, const char *string, - const int32 &length, const escapement_delta &delta); - status_t WriteDrawShape(const int32 &opCount, const void *opList, - const int32 &ptCount, const void *ptList, const bool &fill); - status_t WriteDrawBitmap(const BRect &srcRect, const BRect &dstRect, const int32 &width, const int32 &height, - const int32 &bytesPerRow, const int32 &colorSpace, const int32 &flags, - const void *data, const int32 &length); - - status_t WriteDrawPicture(const BPoint &where, const int32 &token); - status_t WriteSetFontFamily(const font_family &family); status_t WriteSetFontStyle(const font_style &style); status_t WriteSetFontSpacing(const int32 &spacing); @@ -65,9 +45,25 @@ public: status_t WriteSetFontShear(const int32 &shear); status_t WriteSetFontFace(const int32 &face); - status_t WritePushState(); - status_t WritePopState(); - + status_t WriteStrokeLine(const BPoint &start, const BPoint &end); + status_t WriteInvertRect(const BRect &rect); + status_t WriteDrawRect(const BRect &rect, const bool &fill); + status_t WriteDrawRoundRect(const BRect &rect, const BPoint &radius, const bool &fill); + status_t WriteDrawEllipse(const BRect &rect, const bool &fill); + status_t WriteDrawArc(const BPoint ¢er, const BPoint &radius, + const float &startTheta, const float &arcTheta, const bool &fill); + status_t WriteDrawPolygon(const int32 &numPoints, BPoint *points, + const bool &isClosed, const bool &fill); + status_t WriteDrawBezier(const BPoint points[4], const bool &fill); + status_t WriteDrawString(const BPoint &where, const char *string, + const int32 &length, const escapement_delta &delta); + status_t WriteDrawShape(const int32 &opCount, const void *opList, + const int32 &ptCount, const void *ptList, const bool &fill); + status_t WriteDrawBitmap(const BRect &srcRect, const BRect &dstRect, const int32 &width, const int32 &height, + const int32 &bytesPerRow, const int32 &colorSpace, const int32 &flags, + const void *data, const int32 &length); + + status_t WriteDrawPicture(const BPoint &where, const int32 &token); protected: // throw a status_t on error diff --git a/src/kits/interface/PictureDataWriter.cpp b/src/kits/interface/PictureDataWriter.cpp index 0adb62cc20..27b4840a67 100644 --- a/src/kits/interface/PictureDataWriter.cpp +++ b/src/kits/interface/PictureDataWriter.cpp @@ -88,6 +88,20 @@ PictureDataWriter::WriteSetDrawingMode(const drawing_mode &mode) } +status_t +PictureDataWriter::WriteSetPenLocation(const BPoint &point) +{ + try { + BeginOp(B_PIC_SET_PEN_LOCATION); + Write(point); + EndOp(); + } catch (status_t &status) { + return status; + } + return B_OK; +} + + status_t PictureDataWriter::WriteSetPenSize(const float &penSize) { diff --git a/src/servers/app/ServerPicture.cpp b/src/servers/app/ServerPicture.cpp index 00b417035f..27ed94996b 100644 --- a/src/servers/app/ServerPicture.cpp +++ b/src/servers/app/ServerPicture.cpp @@ -735,8 +735,6 @@ ServerPicture::ServerPicture(const ServerPicture &picture) fPictures(NULL), fUsurped(NULL) { - fToken = gTokenSpace.NewToken(kPictureToken, this); - BMallocIO *mallocIO = new (std::nothrow) BMallocIO(); if (mallocIO == NULL) return; @@ -747,6 +745,8 @@ ServerPicture::ServerPicture(const ServerPicture &picture) if (mallocIO->SetSize(size) < B_OK) return; + fToken = gTokenSpace.NewToken(kPictureToken, this); + picture.fData->ReadAt(0, const_cast(mallocIO->Buffer()), size); PictureDataWriter::SetTo(fData); @@ -790,7 +790,8 @@ ServerPicture::SyncState(ViewLayer *view) // TODO: Finish this BeginOp(B_PIC_ENTER_STATE_CHANGE); -// WriteSetPenLocation(view->CurrentState()->PenLocation()); + WriteSetOrigin(view->CurrentState()->Origin()); + WriteSetPenLocation(view->CurrentState()->PenLocation()); WriteSetPenSize(view->CurrentState()->PenSize()); WriteSetScale(view->CurrentState()->Scale()); WriteSetLineMode(view->CurrentState()->LineCapMode(), view->CurrentState()->LineJoinMode(), diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index a1cfe4893f..4f0726206c 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -2400,6 +2400,14 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link) break; } + case AS_LAYER_SET_PEN_LOC: + { + float x, y; + link.Read(&x); + link.Read(&y); + picture->WriteSetPenLocation(BPoint(x, y)); + break; + } case AS_LAYER_SET_PEN_SIZE: { float penSize; @@ -2697,12 +2705,23 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link) break; } + case AS_LAYER_APPEND_TO_PICTURE: + { + int32 pictureToken; + link.Read(&pictureToken); + ServerPicture *appendPicture = App()->FindPicture(pictureToken); + if (appendPicture) { + picture->SyncState(fCurrentLayer); + appendPicture->Usurp(picture); + } + fCurrentLayer->SetPicture(appendPicture); + // we don't care if it's NULL + break; + } + case AS_LAYER_END_PICTURE: { ServerPicture *steppedDown = picture->StepDown(); - if (!steppedDown) - return false; - fCurrentLayer->SetPicture(steppedDown); fLink.StartMessage(B_OK); fLink.Attach(picture->Token());