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 }