hrev54316 adds 1 changeset to branch 'master'
old head: 2d69e313a8ed80986fb84b8b1bc04b03aa4b91cd
new head: 2e4991285be2010b88879e1754262efeb1fe3e46
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=2e4991285be2+%5E2d69e313a8ed
----------------------------------------------------------------------------
2e4991285be2: app_server: fix transformations in BPicture
Fixes #16122, #16147.
Change-Id: Iee7aa8a2325d34a526578a58507ea3690459c8d7
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2898
Reviewed-by: waddlesplash <waddlesplash@xxxxxxxxx>
[ X512 <danger_mail@xxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev54316
Commit: 2e4991285be2010b88879e1754262efeb1fe3e46
URL: https://git.haiku-os.org/haiku/commit/?id=2e4991285be2
Author: X512 <danger_mail@xxxxxxx>
Date: Sun Jun 7 08:08:41 2020 UTC
Committer: waddlesplash <waddlesplash@xxxxxxxxx>
Commit-Date: Wed Jun 10 04:04:24 2020 UTC
Ticket: https://dev.haiku-os.org/ticket/16122
Ticket: https://dev.haiku-os.org/ticket/16147
----------------------------------------------------------------------------
7 files changed, 65 insertions(+), 32 deletions(-)
src/servers/app/ServerPicture.cpp | 52 +++++++++++++++++---
src/servers/app/ServerWindow.cpp | 24 +++------
src/servers/app/drawing/DrawingEngine.cpp | 5 +-
src/servers/app/drawing/DrawingEngine.h | 3 +-
src/servers/app/drawing/Painter/Painter.h | 3 +-
.../interface/remote/RemoteDrawingEngine.cpp | 7 ++-
.../interface/remote/RemoteDrawingEngine.h | 3 +-
----------------------------------------------------------------------------
diff --git a/src/servers/app/ServerPicture.cpp
b/src/servers/app/ServerPicture.cpp
index 162f641a3b..4daa9cef58 100644
--- a/src/servers/app/ServerPicture.cpp
+++ b/src/servers/app/ServerPicture.cpp
@@ -208,10 +208,17 @@ ShapePainter::Draw(BRect frame, bool filled)
fPtStack.pop();
}
- BPoint offset(fCanvas->CurrentState()->PenLocation());
- fCanvas->PenToScreenTransform().Apply(&offset);
+ // this might seem a bit weird, but under R5, the shapes
+ // are always offset by the current pen location
+ BPoint screenOffset = fCanvas->CurrentState()->PenLocation();
+ frame.OffsetBy(screenOffset);
+
+ const SimpleTransform transform =
fCanvas->PenToScreenTransform();
+ transform.Apply(&screenOffset);
+ transform.Apply(&frame);
+
fCanvas->GetDrawingEngine()->DrawShape(frame, opCount, opList,
- ptCount, ptList, filled, offset, fCanvas->Scale());
+ ptCount, ptList, filled, screenOffset,
fCanvas->Scale());
delete[] opList;
delete[] ptList;
@@ -407,9 +414,18 @@ draw_string(void* _canvas, const char* string, size_t
length, float deltaSpace,
static void
draw_string_locations(void* _canvas, const char* string, size_t length,
- const BPoint* locations, size_t locationsCount)
+ const BPoint* _locations, size_t locationsCount)
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
+ BStackOrHeapArray<BPoint, 200> locations(locationsCount);
+ if (!locations.IsValid())
+ return;
+
+ const SimpleTransform transform = canvas->PenToScreenTransform();
+ for (size_t i = 0; i < locationsCount; i++) {
+ locations[i] = _locations[i];
+ transform.Apply(&locations[i]);
+ }
BPoint location = canvas->GetDrawingEngine()->DrawString(string, length,
locations);
@@ -758,8 +774,13 @@ static void
set_transform(void* _canvas, const BAffineTransform& transform)
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
+
+ BPoint leftTop(0, 0);
+ canvas->PenToScreenTransform().Apply(&leftTop);
+
canvas->CurrentState()->SetTransform(transform);
- canvas->GetDrawingEngine()->SetTransform(transform);
+ canvas->GetDrawingEngine()->SetTransform(
+ canvas->CurrentState()->CombinedTransform(), leftTop.x,
leftTop.y);
}
@@ -767,10 +788,15 @@ static void
translate_by(void* _canvas, double x, double y)
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
+
+ BPoint leftTop(0, 0);
+ canvas->PenToScreenTransform().Apply(&leftTop);
+
BAffineTransform transform = canvas->CurrentState()->Transform();
transform.PreTranslateBy(x, y);
canvas->CurrentState()->SetTransform(transform);
- canvas->GetDrawingEngine()->SetTransform(transform);
+ canvas->GetDrawingEngine()->SetTransform(
+ canvas->CurrentState()->CombinedTransform(), leftTop.x,
leftTop.y);
}
@@ -778,10 +804,15 @@ static void
scale_by(void* _canvas, double x, double y)
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
+
+ BPoint leftTop(0, 0);
+ canvas->PenToScreenTransform().Apply(&leftTop);
+
BAffineTransform transform = canvas->CurrentState()->Transform();
transform.PreScaleBy(x, y);
canvas->CurrentState()->SetTransform(transform);
- canvas->GetDrawingEngine()->SetTransform(transform);
+ canvas->GetDrawingEngine()->SetTransform(
+ canvas->CurrentState()->CombinedTransform(), leftTop.x,
leftTop.y);
}
@@ -789,10 +820,15 @@ static void
rotate_by(void* _canvas, double angleRadians)
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
+
+ BPoint leftTop(0, 0);
+ canvas->PenToScreenTransform().Apply(&leftTop);
+
BAffineTransform transform = canvas->CurrentState()->Transform();
transform.PreRotateBy(angleRadians);
canvas->CurrentState()->SetTransform(transform);
- canvas->GetDrawingEngine()->SetTransform(transform);
+ canvas->GetDrawingEngine()->SetTransform(
+ canvas->CurrentState()->CombinedTransform(), leftTop.x,
leftTop.y);
}
diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp
index f236c10969..16a4ad7b6a 100644
--- a/src/servers/app/ServerWindow.cpp
+++ b/src/servers/app/ServerWindow.cpp
@@ -3671,24 +3671,16 @@ ServerWindow::_DispatchPictureMessage(int32 code,
BPrivate::LinkReceiver& link)
link.Read<int32>(&opCount);
link.Read<int32>(&ptCount);
- uint32* opList = new(std::nothrow) uint32[opCount];
- BPoint* ptList = new(std::nothrow) BPoint[ptCount];
- if (opList != NULL && ptList != NULL
- && link.Read(opList, opCount * sizeof(uint32))
= B_OK- && link.Read(ptList, ptCount * sizeof(BPoint))
= B_OK) {- // This might seem a bit weird, but under BeOS,