[haiku-commits] Change in haiku[master]: app_server: fix transformations in BPicture

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 7 Jun 2020 14:56:42 +0000

From X512 <danger_mail@xxxxxxx>:

X512 has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/2889 ;)


Change subject: app_server: fix transformations in BPicture
......................................................................

app_server: fix transformations in BPicture

Change-Id: I16a38919d25836546389aff6093415eda781668f
---
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
5 files changed, 58 insertions(+), 30 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/89/2889/1

diff --git a/src/servers/app/ServerPicture.cpp 
b/src/servers/app/ServerPicture.cpp
index 3e26ff5..9966431 100644
--- a/src/servers/app/ServerPicture.cpp
+++ b/src/servers/app/ServerPicture.cpp
@@ -207,10 +207,19 @@
                        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;
@@ -414,12 +423,22 @@

 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);
+       ArrayDeleter<BPoint> locations(new(std::nothrow) 
BPoint[locationsCount]);
+       if (locations.Get() == NULL)
+               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);
+               locations.Get());

        canvas->PenToScreenTransform().Apply(&location);
        canvas->CurrentState()->SetPenLocation(location);
@@ -765,8 +784,12 @@
 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);
 }


@@ -774,10 +797,14 @@
 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);
 }


@@ -785,10 +812,14 @@
 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);
 }


@@ -796,10 +827,14 @@
 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 1690158..a4872ee 100644
--- a/src/servers/app/ServerWindow.cpp
+++ b/src/servers/app/ServerWindow.cpp
@@ -3708,24 +3708,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, 
the shapes
-                               // are always offset by the current pen location
-                               BPoint penLocation
-                                       = 
fCurrentView->CurrentState()->PenLocation();
-                               for (int32 i = 0; i < ptCount; i++) {
-                                       ptList[i] += penLocation;
-                               }
-                               const bool fill = (code == AS_FILL_SHAPE);
-                               picture->WriteDrawShape(opCount, opList, 
ptCount, ptList, fill);
+                       ArrayDeleter<uint32> opList(new(std::nothrow) 
uint32[opCount]);
+                       ArrayDeleter<BPoint> ptList(new(std::nothrow) 
BPoint[ptCount]);
+                       if (opList.Get() == NULL || ptList.Get() == NULL
+                               || link.Read(opList.Get(), opCount * 
sizeof(uint32)) < B_OK
+                               || link.Read(ptList.Get(), ptCount * 
sizeof(BPoint)) < B_OK) {
+                               break;
                        }
+                       picture->WriteDrawShape(opCount, opList.Get(), ptCount,
+                               ptList.Get(), code == AS_FILL_SHAPE);

-                       delete[] opList;
-                       delete[] ptList;
                        break;
                }

diff --git a/src/servers/app/drawing/DrawingEngine.cpp 
b/src/servers/app/drawing/DrawingEngine.cpp
index c4e50f6..8d50de8 100644
--- a/src/servers/app/drawing/DrawingEngine.cpp
+++ b/src/servers/app/drawing/DrawingEngine.cpp
@@ -323,9 +323,10 @@


 void
-DrawingEngine::SetTransform(const BAffineTransform& transform)
+DrawingEngine::SetTransform(const BAffineTransform& transform, int32 xOffset,
+       int32 yOffset)
 {
-       fPainter->SetTransform(transform);
+       fPainter->SetTransform(transform, xOffset, yOffset);
 }


diff --git a/src/servers/app/drawing/DrawingEngine.h 
b/src/servers/app/drawing/DrawingEngine.h
index dc010bb..763e8f9 100644
--- a/src/servers/app/drawing/DrawingEngine.h
+++ b/src/servers/app/drawing/DrawingEngine.h
@@ -86,7 +86,8 @@
                                                                alpha_function 
alphaFunc);
        virtual void                    SetFont(const ServerFont& font);
        virtual void                    SetFont(const DrawState* state);
-       virtual void                    SetTransform(const BAffineTransform& 
transform);
+       virtual void                    SetTransform(const BAffineTransform& 
transform,
+                                                               int32 xOffset, 
int32 yOffset);

                        void                    SuspendAutoSync();
                        void                    Sync();
diff --git a/src/servers/app/drawing/Painter/Painter.h 
b/src/servers/app/drawing/Painter/Painter.h
index fc22b08..c997dfd 100644
--- a/src/servers/app/drawing/Painter/Painter.h
+++ b/src/servers/app/drawing/Painter/Painter.h
@@ -68,8 +68,7 @@

                                                                // object 
settings
                        void                            
SetTransform(BAffineTransform transform,
-                                                                       int32 
xOffset = 0,
-                                                                       int32 
yOffset = 0);
+                                                                       int32 
xOffset, int32 yOffset);

        inline  bool                            IsIdentityTransform() const
                                                                        { 
return fIdentityTransform; }

--
To view, visit https://review.haiku-os.org/c/haiku/+/2889
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I16a38919d25836546389aff6093415eda781668f
Gerrit-Change-Number: 2889
Gerrit-PatchSet: 1
Gerrit-Owner: X512 <danger_mail@xxxxxxx>
Gerrit-MessageType: newchange

Other related posts: