Mercurial > hg > orthanc-stone
comparison 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 |
comparison
equal
deleted
inserted
replaced
1988:3c84c34322d7 | 1989:e8b9a2ba1df1 |
---|---|
239 it->second->GetLayer().GetBoundingBox(tmp); | 239 it->second->GetLayer().GetBoundingBox(tmp); |
240 target.Union(tmp); | 240 target.Union(tmp); |
241 } | 241 } |
242 } | 242 } |
243 | 243 |
244 void Scene2D::FitContent(unsigned int canvasWidth, | 244 |
245 static void AddTransformedPoint(Extent2D& extent, | |
246 const AffineTransform2D& forcedTransform, | |
247 double x, | |
248 double y) | |
249 { | |
250 forcedTransform.Apply(x, y); | |
251 extent.AddPoint(x, y); | |
252 } | |
253 | |
254 | |
255 void Scene2D::FitContent(const AffineTransform2D& forcedTransform, | |
256 unsigned int canvasWidth, | |
245 unsigned int canvasHeight) | 257 unsigned int canvasHeight) |
246 { | 258 { |
247 Extent2D extent; | 259 Extent2D extent; |
248 | |
249 GetBoundingBox(extent); | 260 GetBoundingBox(extent); |
250 | 261 |
251 if (!extent.IsEmpty()) | 262 if (!extent.IsEmpty()) |
252 { | 263 { |
253 double zoomX = static_cast<double>(canvasWidth) / extent.GetWidth(); | 264 Extent2D extent2; |
254 double zoomY = static_cast<double>(canvasHeight) / extent.GetHeight(); | 265 AddTransformedPoint(extent2, forcedTransform, extent.GetX1(), extent.GetY1()); |
266 AddTransformedPoint(extent2, forcedTransform, extent.GetX1(), extent.GetY2()); | |
267 AddTransformedPoint(extent2, forcedTransform, extent.GetX2(), extent.GetY2()); | |
268 AddTransformedPoint(extent2, forcedTransform, extent.GetX2(), extent.GetY1()); | |
269 | |
270 double zoomX = static_cast<double>(canvasWidth) / extent2.GetWidth(); | |
271 double zoomY = static_cast<double>(canvasHeight) / extent2.GetHeight(); | |
255 | 272 |
256 double zoom = std::min(zoomX, zoomY); | 273 double zoom = std::min(zoomX, zoomY); |
257 if (LinearAlgebra::IsCloseToZero(zoom)) | 274 if (LinearAlgebra::IsCloseToZero(zoom)) |
258 { | 275 { |
259 zoom = 1; | 276 zoom = 1; |
260 } | 277 } |
261 | 278 |
262 double panX = extent.GetCenterX(); | 279 double panX = extent2.GetCenterX(); |
263 double panY = extent.GetCenterY(); | 280 double panY = extent2.GetCenterY(); |
264 | 281 |
265 // Bring the center of the scene to (0,0) | 282 // Bring the center of the scene to (0,0) |
266 AffineTransform2D t1 = AffineTransform2D::CreateOffset(-panX, -panY); | 283 AffineTransform2D t1 = AffineTransform2D::CreateOffset(-panX, -panY); |
267 | 284 |
268 // Scale the scene | 285 // Scale the scene |
269 AffineTransform2D t2 = AffineTransform2D::CreateScaling(zoom, zoom); | 286 AffineTransform2D t2 = AffineTransform2D::CreateScaling(zoom, zoom); |
270 | 287 |
271 SetSceneToCanvasTransform(AffineTransform2D::Combine(t2, t1)); | 288 SetSceneToCanvasTransform(AffineTransform2D::Combine(t2, t1, forcedTransform)); |
272 } | 289 } |
290 } | |
291 | |
292 | |
293 void Scene2D::FitContent(unsigned int canvasWidth, | |
294 unsigned int canvasHeight) | |
295 { | |
296 FitContent(AffineTransform2D() /* identity transform */, canvasWidth, canvasHeight); | |
297 } | |
298 | |
299 | |
300 void Scene2D::RotateViewport(double angle, | |
301 unsigned int canvasWidth, | |
302 unsigned int canvasHeight) | |
303 { | |
304 AffineTransform2D transform = AffineTransform2D::Combine( | |
305 AffineTransform2D::CreateRotation(angle), | |
306 GetSceneToCanvasTransform()); | |
307 FitContent(transform, canvasWidth, canvasHeight); | |
308 } | |
309 | |
310 | |
311 void Scene2D::FlipViewportX(unsigned int canvasWidth, | |
312 unsigned int canvasHeight) | |
313 { | |
314 AffineTransform2D transform = AffineTransform2D::Combine( | |
315 AffineTransform2D::CreateFlipX(), | |
316 GetSceneToCanvasTransform()); | |
317 FitContent(transform, canvasWidth, canvasHeight); | |
318 } | |
319 | |
320 | |
321 void Scene2D::FlipViewportY(unsigned int canvasWidth, | |
322 unsigned int canvasHeight) | |
323 { | |
324 AffineTransform2D transform = AffineTransform2D::Combine( | |
325 AffineTransform2D::CreateFlipY(), | |
326 GetSceneToCanvasTransform()); | |
327 FitContent(transform, canvasWidth, canvasHeight); | |
273 } | 328 } |
274 } | 329 } |