diff OrthancStone/Sources/Scene2D/Scene2D.cpp @ 1989:e8b9a2ba1df1

Added left/right rotation buttons
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 31 Oct 2022 20:59:59 +0100
parents 7053b8a0aaec
children 07964689cb0b
line wrap: on
line diff
--- a/OrthancStone/Sources/Scene2D/Scene2D.cpp	Mon Oct 31 17:45:53 2022 +0100
+++ b/OrthancStone/Sources/Scene2D/Scene2D.cpp	Mon Oct 31 20:59:59 2022 +0100
@@ -241,17 +241,34 @@
     }
   }
 
-  void Scene2D::FitContent(unsigned int canvasWidth,
+  
+  static void AddTransformedPoint(Extent2D& extent,
+                                  const AffineTransform2D& forcedTransform,
+                                  double x,
+                                  double y)
+  {
+    forcedTransform.Apply(x, y);
+    extent.AddPoint(x, y);
+  }
+
+  
+  void Scene2D::FitContent(const AffineTransform2D& forcedTransform,
+                           unsigned int canvasWidth,
                            unsigned int canvasHeight)
   {
     Extent2D extent;
-
     GetBoundingBox(extent);
 
     if (!extent.IsEmpty())
     {
-      double zoomX = static_cast<double>(canvasWidth) / extent.GetWidth();
-      double zoomY = static_cast<double>(canvasHeight) / extent.GetHeight();
+      Extent2D extent2;
+      AddTransformedPoint(extent2, forcedTransform, extent.GetX1(), extent.GetY1());
+      AddTransformedPoint(extent2, forcedTransform, extent.GetX1(), extent.GetY2());
+      AddTransformedPoint(extent2, forcedTransform, extent.GetX2(), extent.GetY2());
+      AddTransformedPoint(extent2, forcedTransform, extent.GetX2(), extent.GetY1());
+
+      double zoomX = static_cast<double>(canvasWidth) / extent2.GetWidth();
+      double zoomY = static_cast<double>(canvasHeight) / extent2.GetHeight();
 
       double zoom = std::min(zoomX, zoomY);
       if (LinearAlgebra::IsCloseToZero(zoom))
@@ -259,8 +276,8 @@
         zoom = 1;
       }
 
-      double panX = extent.GetCenterX();
-      double panY = extent.GetCenterY();
+      double panX = extent2.GetCenterX();
+      double panY = extent2.GetCenterY();
 
       // Bring the center of the scene to (0,0)
       AffineTransform2D t1 = AffineTransform2D::CreateOffset(-panX, -panY);
@@ -268,7 +285,45 @@
       // Scale the scene
       AffineTransform2D t2 = AffineTransform2D::CreateScaling(zoom, zoom);
 
-      SetSceneToCanvasTransform(AffineTransform2D::Combine(t2, t1));
+      SetSceneToCanvasTransform(AffineTransform2D::Combine(t2, t1, forcedTransform));
     }
   }
+
+
+  void Scene2D::FitContent(unsigned int canvasWidth,
+                           unsigned int canvasHeight)
+  {
+    FitContent(AffineTransform2D() /* identity transform */, canvasWidth, canvasHeight);
+  }
+
+
+  void Scene2D::RotateViewport(double angle,
+                               unsigned int canvasWidth,
+                               unsigned int canvasHeight)
+  {
+    AffineTransform2D transform = AffineTransform2D::Combine(
+      AffineTransform2D::CreateRotation(angle),
+      GetSceneToCanvasTransform());
+    FitContent(transform, canvasWidth, canvasHeight);
+  }
+
+
+  void Scene2D::FlipViewportX(unsigned int canvasWidth,
+                              unsigned int canvasHeight)
+  {
+    AffineTransform2D transform = AffineTransform2D::Combine(
+      AffineTransform2D::CreateFlipX(),
+      GetSceneToCanvasTransform());
+    FitContent(transform, canvasWidth, canvasHeight);
+  }
+
+
+  void Scene2D::FlipViewportY(unsigned int canvasWidth,
+                              unsigned int canvasHeight)
+  {
+    AffineTransform2D transform = AffineTransform2D::Combine(
+      AffineTransform2D::CreateFlipY(),
+      GetSceneToCanvasTransform());
+    FitContent(transform, canvasWidth, canvasHeight);
+  }
 }