From X512 <danger_mail@xxxxxxx>:
X512 has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2898 ;)
Change subject: app_server: fix transformations in BPicture
......................................................................
app_server: fix transformations in BPicture
Fixes #16122, #16147.
Change-Id: Iee7aa8a2325d34a526578a58507ea3690459c8d7
---
M src/servers/app/ServerPicture.cpp
M src/servers/app/ServerWindow.cpp
M src/servers/app/drawing/DrawingEngine.cpp
M src/servers/app/drawing/DrawingEngine.h
M src/servers/app/drawing/Painter/Painter.h
M src/servers/app/drawing/interface/remote/RemoteDrawingEngine.cpp
M src/servers/app/drawing/interface/remote/RemoteDrawingEngine.h
7 files changed, 63 insertions(+), 32 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/98/2898/1
diff --git a/src/servers/app/ServerPicture.cpp
b/src/servers/app/ServerPicture.cpp
index 162f641..4daa9ce 100644
--- a/src/servers/app/ServerPicture.cpp
+++ b/src/servers/app/ServerPicture.cpp
@@ -208,10 +208,17 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 f236c10..16a4ad7 100644
--- a/src/servers/app/ServerWindow.cpp
+++ b/src/servers/app/ServerWindow.cpp
@@ -3671,24 +3671,16 @@
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,