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
This commit is contained in:
Stefano Ceccherini 2007-08-13 14:07:12 +00:00
parent b1b69140a1
commit 690c7474a4
4 changed files with 64 additions and 34 deletions

View File

@ -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 &center, 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 &center, 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

View File

@ -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<BPoint>(point);
EndOp();
} catch (status_t &status) {
return status;
}
return B_OK;
}
status_t
PictureDataWriter::WriteSetPenSize(const float &penSize)
{

View File

@ -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<void *>(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(),

View File

@ -2400,6 +2400,14 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver &link)
break;
}
case AS_LAYER_SET_PEN_LOC:
{
float x, y;
link.Read<float>(&x);
link.Read<float>(&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<int32>(&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<int32>(picture->Token());