diff --git a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs index d4d2e41bd..e2e28ad20 100644 --- a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs @@ -57,8 +57,6 @@ public sealed class RegionCaptureForm : Form public bool IsAnnotated => ShapeManager != null && ShapeManager.IsAnnotated; public Point CurrentPosition { get; private set; } - private Size oldSize; - private Vector2 panError = new Vector2(0f, 0f); public Color CurrentColor { @@ -80,6 +78,8 @@ public Color CurrentColor public SimpleWindowInfo SelectedWindow { get; private set; } + public Vector2 CanvasCenterPoint { get; set; } = new Vector2(0.5f, 0.5f); + internal ShapeManager ShapeManager { get; private set; } internal List DrawableObjects { get; private set; } @@ -107,7 +107,6 @@ public RegionCaptureForm(RegionCaptureMode mode) Mode = mode; ScreenRectangle0Based = CaptureHelpers.GetScreenBounds0Based(); - oldSize = ScreenRectangle0Based.Size; ImageRectangle = ScreenRectangle0Based; InitializeComponent(); @@ -217,6 +216,8 @@ internal void InitBackground(Image img) if (IsEditorMode) { + ImageRectangle = new Rectangle(ImageRectangle.X, ImageRectangle.Y, Image.Width, Image.Height); + using (Bitmap background = new Bitmap(Image.Width, Image.Height)) using (Graphics g = Graphics.FromImage(background)) { @@ -259,29 +260,6 @@ internal void InitBackground(Image img) } } - private void CenterCanvas(bool updateCoordinates = true) - { - if (updateCoordinates) - { - UpdateCoordinates(); - } - - Rectangle rect = ScreenRectangle0Based; - - /*if (Image.Width > rect.Width || Image.Height > rect.Height) - { - rect = ScreenRectangle0Based; - }*/ - - ImageRectangle = new Rectangle(rect.X + rect.Width / 2 - Image.Width / 2, rect.Y + rect.Height / 2 - Image.Height / 2, Image.Width, Image.Height); - - if (backgroundBrush != null) - { - backgroundBrush.ResetTransform(); - backgroundBrush.TranslateTransform(ImageRectangle.X, ImageRectangle.Y); - } - } - private void OnMoved() { if (ShapeManager != null) @@ -300,23 +278,49 @@ private void OnMoved() } } + private void Pan(int deltaX, int deltaY, bool updateCenterPoint = false) + { + ImageRectangle = ImageRectangle.LocationOffset(deltaX, deltaY); + backgroundBrush.TranslateTransform(deltaX, deltaY); + ShapeManager.MoveAll(deltaX, deltaY); + + if (updateCenterPoint) + { + UpdateCenterPoint(); + } + } + + private void Pan(Point delta, bool updateCenterPoint = false) + { + Pan(delta.X, delta.Y, updateCenterPoint); + } + + private void UpdatePan(Vector2 center) + { + int x = (int)Math.Round(ScreenRectangle0Based.Width * center.X); + int y = (int)Math.Round(ScreenRectangle0Based.Height * center.Y); + int newX = x - ImageRectangle.Width / 2; + int newY = y - ImageRectangle.Height / 2; + int deltaX = newX - ImageRectangle.X; + int deltaY = newY - ImageRectangle.Y; + Pan(deltaX, deltaY); + } + private void UpdatePan() { - Size NewSize = ScreenRectangle0Based.Size; - if (oldSize == NewSize) - { - return; - } + UpdatePan(CanvasCenterPoint); + } - panError += new Vector2((float)(NewSize.Width - oldSize.Width) / 2, (float)(NewSize.Height - oldSize.Height) / 2); - Point ResizeDelta = new Point((int)panError.X, (int)panError.Y); + private void UpdateCenterPoint() + { + CanvasCenterPoint = new Vector2((ImageRectangle.X + ImageRectangle.Width / 2f) / ScreenRectangle0Based.Width, + (ImageRectangle.Y + ImageRectangle.Height / 2f) / ScreenRectangle0Based.Height); + } - panError.X %= 1; - panError.Y %= 1; - - Pan(ResizeDelta); - - oldSize = ScreenRectangle0Based.Size; + private void CenterCanvas() + { + CanvasCenterPoint = new Vector2(0.5f, 0.5f); + UpdatePan(); } public void SetDefaultCursor() @@ -527,7 +531,7 @@ private new void Update() if (ShapeManager.IsPanning) { - Pan(InputManager.MouseVelocity); + Pan(InputManager.MouseVelocity, true); } borderDotPen.DashOffset = (float)timerStart.Elapsed.TotalSeconds * -15; @@ -535,14 +539,6 @@ private new void Update() ShapeManager.Update(); } - private void Pan(Point delta) - { - ImageRectangle = ImageRectangle.LocationOffset(delta.X, delta.Y); - backgroundBrush.TranslateTransform(delta.X, delta.Y); - - ShapeManager.MoveAll(delta); - } - protected override void OnPaintBackground(PaintEventArgs e) { //base.OnPaintBackground(e);