From 1ea1dacb0f3da561cd0eaef25da4fcbcf41e28ea Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 15 Feb 2022 11:01:29 +0300 Subject: [PATCH] Code refactoring --- ShareX.HelpersLib/Extensions/Extensions.cs | 7 +- ShareX.HelpersLib/GraphicsQualityManager.cs | 20 +--- .../Forms/RegionCaptureForm.cs | 93 +++++++++---------- .../RegionCaptureOptions.cs | 2 +- .../RegionHelpers/ImageEditorScrollbar.cs | 12 ++- .../Shapes/ShapeManager.cs | 47 +++++----- 6 files changed, 84 insertions(+), 97 deletions(-) diff --git a/ShareX.HelpersLib/Extensions/Extensions.cs b/ShareX.HelpersLib/Extensions/Extensions.cs index 1da1913e8..379f7377e 100644 --- a/ShareX.HelpersLib/Extensions/Extensions.cs +++ b/ShareX.HelpersLib/Extensions/Extensions.cs @@ -166,11 +166,8 @@ public static Rectangle Offset(this Rectangle rect, int offset) public static Rectangle Scale(this Rectangle rect, float scaleFactor) { - return new Rectangle( - (int)Math.Round(rect.X * scaleFactor), - (int)Math.Round(rect.Y * scaleFactor), - (int)Math.Round(rect.Width * scaleFactor), - (int)Math.Round(rect.Height * scaleFactor)); + return new Rectangle((int)Math.Round(rect.X * scaleFactor), (int)Math.Round(rect.Y * scaleFactor), + (int)Math.Round(rect.Width * scaleFactor), (int)Math.Round(rect.Height * scaleFactor)); } public static Rectangle LocationOffset(this Rectangle rect, int x, int y) diff --git a/ShareX.HelpersLib/GraphicsQualityManager.cs b/ShareX.HelpersLib/GraphicsQualityManager.cs index cd8b91557..afb2731c4 100644 --- a/ShareX.HelpersLib/GraphicsQualityManager.cs +++ b/ShareX.HelpersLib/GraphicsQualityManager.cs @@ -37,13 +37,7 @@ public class GraphicsQualityManager : IDisposable private PixelOffsetMode previousPixelOffsetMode; private Graphics g; - public enum Quality - { - Low, - High, - } - - public GraphicsQualityManager(Graphics g, Quality? quality = Quality.High) + public GraphicsQualityManager(Graphics g, bool highQuality) { this.g = g; @@ -52,15 +46,11 @@ public GraphicsQualityManager(Graphics g, Quality? quality = Quality.High) previousSmoothingMode = g.SmoothingMode; previousPixelOffsetMode = g.PixelOffsetMode; - if (!quality.HasValue) - { - return; - } - if (quality.Value == Quality.High) + if (highQuality) { SetHighQuality(); } - else if (quality.Value == Quality.Low) + else { SetLowQuality(); } @@ -80,10 +70,10 @@ public void SetLowQuality() { if (g != null) { - g.PixelOffsetMode = PixelOffsetMode.HighSpeed; + g.CompositingQuality = CompositingQuality.HighSpeed; g.InterpolationMode = InterpolationMode.NearestNeighbor; g.SmoothingMode = SmoothingMode.HighSpeed; - g.CompositingQuality = CompositingQuality.HighSpeed; + g.PixelOffsetMode = PixelOffsetMode.HighSpeed; } } diff --git a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs index a9b808012..c501f1099 100644 --- a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs @@ -68,6 +68,24 @@ public sealed class RegionCaptureForm : Form public Vector2 CanvasCenterOffset { get; set; } = new Vector2(0f, 0f); + public float ZoomFactor + { + get + { + return zoomFactor; + } + set + { + zoomFactor = value.Clamp(0.2f, 6f); + } + } + + public bool IsZoomed => Math.Round(ZoomFactor * 100) != 100; + + internal Point ScaledClientMousePosition => InputManager.ClientMousePosition.Scale(1 / ZoomFactor); + internal Point ScaledClientMouseVelocity => InputManager.MouseVelocity.Scale(1 / ZoomFactor); + internal Point ScaledClientCenter => new Point((int)Math.Round(ClientArea.Width / 2f / ZoomFactor), (int)Math.Round(ClientArea.Height / 2f / ZoomFactor)); + internal ShapeManager ShapeManager { get; private set; } internal bool IsClosing { get; private set; } internal FPSManager FPSManager { get; private set; } @@ -90,21 +108,6 @@ public sealed class RegionCaptureForm : Form private Color canvasBackgroundColor, canvasBorderColor, textColor, textShadowColor, textBackgroundColor, textOuterBorderColor, textInnerBorderColor; private float zoomFactor = 1; - public float ZoomFactor - { - get { return zoomFactor; } - set { zoomFactor = Math.Max(0.2F, Math.Min(6F, value)); } // constrain range from 20% - 600% - } - - public void ZoomTransform(Graphics g, bool invertZoom = false) - { - if (Math.Round(ZoomFactor * 100) != 100) - { - float scale = invertZoom ? 1 / ZoomFactor : ZoomFactor; - g.ScaleTransform(scale, scale); - } - } - public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, Bitmap canvas = null) { Mode = mode; @@ -179,9 +182,6 @@ public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, B InitializeComponent(); } - public Point ScaledClientMousePosition => InputManager.ClientMousePosition.Scale(1 / ZoomFactor); - public Point ScaledClientMouseVelocity => InputManager.MouseVelocity.Scale(1 / ZoomFactor); - private void InitializeComponent() { SuspendLayout(); @@ -270,7 +270,7 @@ internal void UpdateTitle() { if (forceClose) return; - var title = new StringBuilder(); + StringBuilder title = new StringBuilder(); if (IsEditorMode) { @@ -281,6 +281,12 @@ internal void UpdateTitle() title.AppendFormat(" - {0}x{1}", Canvas.Width, Canvas.Height); } + if (IsZoomed) + { + int zoomPercentage = (int)Math.Round(ZoomFactor * 100); + title.AppendFormat(" ({0}%)", zoomPercentage); + } + string fileName = Helpers.GetFileNameSafe(ImageFilePath); if (!string.IsNullOrEmpty(fileName)) @@ -292,12 +298,6 @@ internal void UpdateTitle() { title.AppendFormat(" - FPS: {0}", FPSManager.FPS.ToString()); } - - double zoomPercentage = Math.Round(ZoomFactor * 100); - if (zoomPercentage != 100) - { - title.AppendFormat(" - ZOOM: {0}%", zoomPercentage); - } } else { @@ -436,7 +436,10 @@ private void Pan(int deltaX, int deltaY, bool usePanningStretch = true) Rectangle limitRectangle = new Rectangle(ClientArea.X + panLimitSize.Width, ClientArea.Y + panLimitSize.Height, ClientArea.Width - (panLimitSize.Width * 2), ClientArea.Height - (panLimitSize.Height * 2)); - limitRectangle = limitRectangle.Scale(1 / ZoomFactor); + if (IsZoomed) + { + limitRectangle = limitRectangle.Scale(1 / ZoomFactor); + } deltaX = Math.Max(deltaX, limitRectangle.Left - CanvasRectangle.Right); deltaX = Math.Min(deltaX, limitRectangle.Right - CanvasRectangle.Left); @@ -477,7 +480,7 @@ private void AutomaticPan(Vector2 centerOffset) if (IsEditorMode) { Rectangle canvas = CanvasRectangle.Scale(ZoomFactor); - float x = ClientArea.Width / 2 + centerOffset.X; + float x = ClientArea.Width / 2 + centerOffset.X; float y = ClientArea.Height / 2 + centerOffset.Y; float newX = x - canvas.Width / 2; float newY = y - canvas.Height / 2; @@ -504,6 +507,15 @@ public void CenterCanvas() AutomaticPan(); } + public void ZoomTransform(Graphics g, bool invertZoom = false) + { + if (IsZoomed) + { + float scale = invertZoom ? 1 / ZoomFactor : ZoomFactor; + g.ScaleTransform(scale, scale); + } + } + public void SetDefaultCursor() { if (Cursor != defaultCursor) @@ -551,6 +563,7 @@ private void RegionCaptureForm_Shown(object sender, EventArgs e) { editorPanTipAnimation.Start(); } + if (Options.ZoomToFitOnOpen) { ZoomToFit(); @@ -694,12 +707,10 @@ private void RegionCaptureForm_MouseDown(object sender, MouseEventArgs e) private void RegionCaptureForm_MouseWheel(object sender, MouseEventArgs e) { - if (!IsEditorMode || !ModifierKeys.HasFlag(Keys.Control)) + if (IsEditorMode && ModifierKeys == Keys.Control) { - return; + Zoom(e.Delta > 0); } - - Zoom(e.Delta > 0); } private void Zoom(bool closer, bool atMouse = true) @@ -718,18 +729,9 @@ private void Zoom(bool closer, bool atMouse = true) private void ZoomToFit() { - ZoomFactor = Math.Min((float)ClientArea.Width/CanvasRectangle.Width, (float)ClientArea.Height/CanvasRectangle.Height); - CenterCanvas(); - } + ZoomFactor = Math.Min((float)ClientArea.Width / CanvasRectangle.Width, (float)ClientArea.Height / CanvasRectangle.Height); - private Point ScaledClientCenter - { - get - { - return new Point( - (int)Math.Round(ClientArea.Width / 2f / ZoomFactor), - (int)Math.Round(ClientArea.Height / 2f / ZoomFactor)); - } + CenterCanvas(); } private void MonitorKey(int index) @@ -868,14 +870,11 @@ protected override void OnPaint(PaintEventArgs e) { Invalidate(); } - - g.PixelOffsetMode = PixelOffsetMode.Default; - g.InterpolationMode = InterpolationMode.Default; } private void DrawBackground(Graphics g) { - using (GraphicsQualityManager quality = new GraphicsQualityManager(g, GraphicsQualityManager.Quality.Low)) + using (GraphicsQualityManager quality = new GraphicsQualityManager(g, false)) { g.CompositingMode = CompositingMode.SourceCopy; g.DrawImage(backgroundBrush.Image, CanvasRectangle); @@ -1309,7 +1308,7 @@ private void DrawCursorGraphics(Graphics g) } else { - using (GraphicsQualityManager quality = new GraphicsQualityManager(g)) + using (GraphicsQualityManager quality = new GraphicsQualityManager(g, true)) using (TextureBrush brush = new TextureBrush(magnifier)) { brush.TranslateTransform(x, y + magnifierPosition); diff --git a/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs b/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs index c34bfe4c9..8ea0b5a11 100644 --- a/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs +++ b/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs @@ -90,8 +90,8 @@ public class RegionCaptureOptions // Image editor public ImageEditorStartMode ImageEditorStartMode = ImageEditorStartMode.AutoSize; - public bool ZoomToFitOnOpen = false; public WindowState ImageEditorWindowState = new WindowState(); + public bool ZoomToFitOnOpen = false; public bool EditorAutoCopyImage = false; public bool AutoCloseEditorOnTask = false; public bool ShowEditorPanTip = true; diff --git a/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs b/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs index 97662be13..c5873e534 100644 --- a/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs +++ b/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs @@ -60,13 +60,13 @@ public void Update() if (Orientation == Orientation.Horizontal) { - isScrollbarNeeded = form.CanvasRectangle.Left < form.ClientArea.Left - || (form.CanvasRectangle.Right * form.ZoomFactor) > form.ClientArea.Right; + isScrollbarNeeded = form.CanvasRectangle.Left < form.ClientArea.Left || + (form.CanvasRectangle.Right * form.ZoomFactor) > form.ClientArea.Right; } else { - isScrollbarNeeded = form.CanvasRectangle.Top < form.ClientArea.Top - || (form.CanvasRectangle.Bottom * form.ZoomFactor) > form.ClientArea.Bottom; + isScrollbarNeeded = form.CanvasRectangle.Top < form.ClientArea.Top || + (form.CanvasRectangle.Bottom * form.ZoomFactor) > form.ClientArea.Bottom; } Visible = isScrollbarNeeded || IsDragging; @@ -147,8 +147,9 @@ public override void OnDraw(Graphics g) using (Brush trackBrush = new SolidBrush(TrackColor)) using (Brush thumbBrush = new SolidBrush(thumbColor)) { - var savedTransform = g.Transform; + Matrix savedTransform = g.Transform; form.ZoomTransform(g, true); + if (IsCapsule) { g.SmoothingMode = SmoothingMode.HighQuality; @@ -165,6 +166,7 @@ public override void OnDraw(Graphics g) g.FillRectangle(trackBrush, Rectangle); g.FillRectangle(thumbBrush, ThumbRectangle); } + g.Transform = savedTransform; } } diff --git a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs index db236282d..d19f12781 100644 --- a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs +++ b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs @@ -501,36 +501,35 @@ private void form_MouseDoubleClick(object sender, MouseEventArgs e) private void form_MouseWheel(object sender, MouseEventArgs e) { - if ((Control.ModifierKeys & Keys.Control) != 0) + if (Control.ModifierKeys == Keys.None) { - return; - } - if (e.Delta > 0) - { - if (Options.ShowMagnifier) + if (e.Delta > 0) { - Options.MagnifierPixelCount = Math.Min(Options.MagnifierPixelCount + 2, RegionCaptureOptions.MagnifierPixelCountMaximum); + if (Options.ShowMagnifier) + { + Options.MagnifierPixelCount = Math.Min(Options.MagnifierPixelCount + 2, RegionCaptureOptions.MagnifierPixelCountMaximum); + } + else + { + Options.ShowMagnifier = true; + } } - else + else if (e.Delta < 0) { - Options.ShowMagnifier = true; + int magnifierPixelCount = Options.MagnifierPixelCount - 2; + if (magnifierPixelCount < RegionCaptureOptions.MagnifierPixelCountMinimum) + { + magnifierPixelCount = RegionCaptureOptions.MagnifierPixelCountMinimum; + Options.ShowMagnifier = false; + } + Options.MagnifierPixelCount = magnifierPixelCount; } - } - else if (e.Delta < 0) - { - int magnifierPixelCount = Options.MagnifierPixelCount - 2; - if (magnifierPixelCount < RegionCaptureOptions.MagnifierPixelCountMinimum) - { - magnifierPixelCount = RegionCaptureOptions.MagnifierPixelCountMinimum; - Options.ShowMagnifier = false; - } - Options.MagnifierPixelCount = magnifierPixelCount; - } - if (Form.IsAnnotationMode) - { - tsmiShowMagnifier.Checked = Options.ShowMagnifier; - tslnudMagnifierPixelCount.Content.Value = Options.MagnifierPixelCount; + if (Form.IsAnnotationMode) + { + tsmiShowMagnifier.Checked = Options.ShowMagnifier; + tslnudMagnifierPixelCount.Content.Value = Options.MagnifierPixelCount; + } } }