Mercurial > hg > orthanc-stone
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); + } }