diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 029c8a9c77..9e92e8e428 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -213,6 +213,7 @@ enum { AS_FILL_TRIANGLE, AS_DRAW_STRING, + AS_DRAW_STRING_WITH_DELTA, AS_SYNC, diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp index cd7b5eb656..75f32de91d 100644 --- a/src/kits/interface/View.cpp +++ b/src/kits/interface/View.cpp @@ -2424,20 +2424,16 @@ BView::DrawString(const char *string, int32 length, BPoint location, if (fOwner) { check_lock(); - fOwner->fLink->StartMessage(AS_DRAW_STRING); + // quite often delta will be NULL + if (delta) + fOwner->fLink->StartMessage(AS_DRAW_STRING_WITH_DELTA); + else + fOwner->fLink->StartMessage(AS_DRAW_STRING); fOwner->fLink->Attach(length); fOwner->fLink->Attach(location); - // Quite often delta will be NULL, so we have to accomodate this. if (delta) fOwner->fLink->Attach(*delta); - else { - escapement_delta tdelta; - tdelta.space = 0; - tdelta.nonspace = 0; - - fOwner->fLink->Attach(tdelta); - } fOwner->fLink->AttachString(string, length); diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 64fd8d960c..e0894f2fa1 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -2241,8 +2241,13 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code, BPrivate::LinkReceiver &li if (link.Read(opList, opCount * sizeof(uint32)) >= B_OK && link.Read(ptList, ptCount * sizeof(BPoint)) >= B_OK) { - for (int32 i = 0; i < ptCount; i++) + // this might seem a bit weird, but under R5, the shapes + // are always offset by the current pen location + BPoint penLocation = fCurrentLayer->CurrentState()->PenLocation(); + for (int32 i = 0; i < ptCount; i++) { + ptList[i] += penLocation; fCurrentLayer->ConvertToScreenForDrawing(&ptList[i]); + } drawingEngine->DrawShape(shapeFrame, opCount, opList, ptCount, ptList, code == AS_FILL_SHAPE); @@ -2296,27 +2301,31 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code, BPrivate::LinkReceiver &li break; } case AS_DRAW_STRING: + case AS_DRAW_STRING_WITH_DELTA: { DTRACE(("ServerWindow %s: Message AS_DRAW_STRING\n", Title())); char* string; int32 length; BPoint location; - escapement_delta delta; + escapement_delta _delta; + escapement_delta* delta = NULL; link.Read(&length); link.Read(&location); - link.Read(&delta); + if (code == AS_DRAW_STRING_WITH_DELTA) { + link.Read(&_delta); + if (_delta.nonspace != 0.0 || _delta.space != 0.0) + delta = &_delta; + } link.ReadString(&string); + fCurrentLayer->ConvertToScreenForDrawing(&location); BPoint penLocation = drawingEngine->DrawString(string, length, - location, &delta); + location, delta); fCurrentLayer->ConvertFromScreenForDrawing(&penLocation); fCurrentLayer->CurrentState()->SetPenLocation(penLocation); - // pen location has changed, update DrawingEngine - // TODO: optimize with flags - _UpdateDrawState(fCurrentLayer); free(string); break;