Code refactoring

This commit is contained in:
Jaex 2022-02-15 11:01:29 +03:00
parent cd499d73d5
commit 1ea1dacb0f
6 changed files with 84 additions and 97 deletions

View file

@ -166,11 +166,8 @@ public static Rectangle Offset(this Rectangle rect, int offset)
public static Rectangle Scale(this Rectangle rect, float scaleFactor) public static Rectangle Scale(this Rectangle rect, float scaleFactor)
{ {
return new Rectangle( return new Rectangle((int)Math.Round(rect.X * scaleFactor), (int)Math.Round(rect.Y * scaleFactor),
(int)Math.Round(rect.X * scaleFactor), (int)Math.Round(rect.Width * scaleFactor), (int)Math.Round(rect.Height * 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) public static Rectangle LocationOffset(this Rectangle rect, int x, int y)

View file

@ -37,13 +37,7 @@ public class GraphicsQualityManager : IDisposable
private PixelOffsetMode previousPixelOffsetMode; private PixelOffsetMode previousPixelOffsetMode;
private Graphics g; private Graphics g;
public enum Quality public GraphicsQualityManager(Graphics g, bool highQuality)
{
Low,
High,
}
public GraphicsQualityManager(Graphics g, Quality? quality = Quality.High)
{ {
this.g = g; this.g = g;
@ -52,15 +46,11 @@ public GraphicsQualityManager(Graphics g, Quality? quality = Quality.High)
previousSmoothingMode = g.SmoothingMode; previousSmoothingMode = g.SmoothingMode;
previousPixelOffsetMode = g.PixelOffsetMode; previousPixelOffsetMode = g.PixelOffsetMode;
if (!quality.HasValue) if (highQuality)
{
return;
}
if (quality.Value == Quality.High)
{ {
SetHighQuality(); SetHighQuality();
} }
else if (quality.Value == Quality.Low) else
{ {
SetLowQuality(); SetLowQuality();
} }
@ -80,10 +70,10 @@ public void SetLowQuality()
{ {
if (g != null) if (g != null)
{ {
g.PixelOffsetMode = PixelOffsetMode.HighSpeed; g.CompositingQuality = CompositingQuality.HighSpeed;
g.InterpolationMode = InterpolationMode.NearestNeighbor; g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.SmoothingMode = SmoothingMode.HighSpeed; g.SmoothingMode = SmoothingMode.HighSpeed;
g.CompositingQuality = CompositingQuality.HighSpeed; g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
} }
} }

View file

@ -68,6 +68,24 @@ public sealed class RegionCaptureForm : Form
public Vector2 CanvasCenterOffset { get; set; } = new Vector2(0f, 0f); 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 ShapeManager ShapeManager { get; private set; }
internal bool IsClosing { get; private set; } internal bool IsClosing { get; private set; }
internal FPSManager FPSManager { 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 Color canvasBackgroundColor, canvasBorderColor, textColor, textShadowColor, textBackgroundColor, textOuterBorderColor, textInnerBorderColor;
private float zoomFactor = 1; 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) public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, Bitmap canvas = null)
{ {
Mode = mode; Mode = mode;
@ -179,9 +182,6 @@ public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, B
InitializeComponent(); InitializeComponent();
} }
public Point ScaledClientMousePosition => InputManager.ClientMousePosition.Scale(1 / ZoomFactor);
public Point ScaledClientMouseVelocity => InputManager.MouseVelocity.Scale(1 / ZoomFactor);
private void InitializeComponent() private void InitializeComponent()
{ {
SuspendLayout(); SuspendLayout();
@ -270,7 +270,7 @@ internal void UpdateTitle()
{ {
if (forceClose) return; if (forceClose) return;
var title = new StringBuilder(); StringBuilder title = new StringBuilder();
if (IsEditorMode) if (IsEditorMode)
{ {
@ -281,6 +281,12 @@ internal void UpdateTitle()
title.AppendFormat(" - {0}x{1}", Canvas.Width, Canvas.Height); 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); string fileName = Helpers.GetFileNameSafe(ImageFilePath);
if (!string.IsNullOrEmpty(fileName)) if (!string.IsNullOrEmpty(fileName))
@ -292,12 +298,6 @@ internal void UpdateTitle()
{ {
title.AppendFormat(" - FPS: {0}", FPSManager.FPS.ToString()); title.AppendFormat(" - FPS: {0}", FPSManager.FPS.ToString());
} }
double zoomPercentage = Math.Round(ZoomFactor * 100);
if (zoomPercentage != 100)
{
title.AppendFormat(" - ZOOM: {0}%", zoomPercentage);
}
} }
else 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, Rectangle limitRectangle = new Rectangle(ClientArea.X + panLimitSize.Width, ClientArea.Y + panLimitSize.Height,
ClientArea.Width - (panLimitSize.Width * 2), ClientArea.Height - (panLimitSize.Height * 2)); 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.Max(deltaX, limitRectangle.Left - CanvasRectangle.Right);
deltaX = Math.Min(deltaX, limitRectangle.Right - CanvasRectangle.Left); deltaX = Math.Min(deltaX, limitRectangle.Right - CanvasRectangle.Left);
@ -477,7 +480,7 @@ private void AutomaticPan(Vector2 centerOffset)
if (IsEditorMode) if (IsEditorMode)
{ {
Rectangle canvas = CanvasRectangle.Scale(ZoomFactor); 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 y = ClientArea.Height / 2 + centerOffset.Y;
float newX = x - canvas.Width / 2; float newX = x - canvas.Width / 2;
float newY = y - canvas.Height / 2; float newY = y - canvas.Height / 2;
@ -504,6 +507,15 @@ public void CenterCanvas()
AutomaticPan(); AutomaticPan();
} }
public void ZoomTransform(Graphics g, bool invertZoom = false)
{
if (IsZoomed)
{
float scale = invertZoom ? 1 / ZoomFactor : ZoomFactor;
g.ScaleTransform(scale, scale);
}
}
public void SetDefaultCursor() public void SetDefaultCursor()
{ {
if (Cursor != defaultCursor) if (Cursor != defaultCursor)
@ -551,6 +563,7 @@ private void RegionCaptureForm_Shown(object sender, EventArgs e)
{ {
editorPanTipAnimation.Start(); editorPanTipAnimation.Start();
} }
if (Options.ZoomToFitOnOpen) if (Options.ZoomToFitOnOpen)
{ {
ZoomToFit(); ZoomToFit();
@ -694,12 +707,10 @@ private void RegionCaptureForm_MouseDown(object sender, MouseEventArgs e)
private void RegionCaptureForm_MouseWheel(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) private void Zoom(bool closer, bool atMouse = true)
@ -718,18 +729,9 @@ private void Zoom(bool closer, bool atMouse = true)
private void ZoomToFit() private void ZoomToFit()
{ {
ZoomFactor = Math.Min((float)ClientArea.Width/CanvasRectangle.Width, (float)ClientArea.Height/CanvasRectangle.Height); ZoomFactor = Math.Min((float)ClientArea.Width / CanvasRectangle.Width, (float)ClientArea.Height / CanvasRectangle.Height);
CenterCanvas();
}
private Point ScaledClientCenter CenterCanvas();
{
get
{
return new Point(
(int)Math.Round(ClientArea.Width / 2f / ZoomFactor),
(int)Math.Round(ClientArea.Height / 2f / ZoomFactor));
}
} }
private void MonitorKey(int index) private void MonitorKey(int index)
@ -868,14 +870,11 @@ protected override void OnPaint(PaintEventArgs e)
{ {
Invalidate(); Invalidate();
} }
g.PixelOffsetMode = PixelOffsetMode.Default;
g.InterpolationMode = InterpolationMode.Default;
} }
private void DrawBackground(Graphics g) 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.CompositingMode = CompositingMode.SourceCopy;
g.DrawImage(backgroundBrush.Image, CanvasRectangle); g.DrawImage(backgroundBrush.Image, CanvasRectangle);
@ -1309,7 +1308,7 @@ private void DrawCursorGraphics(Graphics g)
} }
else else
{ {
using (GraphicsQualityManager quality = new GraphicsQualityManager(g)) using (GraphicsQualityManager quality = new GraphicsQualityManager(g, true))
using (TextureBrush brush = new TextureBrush(magnifier)) using (TextureBrush brush = new TextureBrush(magnifier))
{ {
brush.TranslateTransform(x, y + magnifierPosition); brush.TranslateTransform(x, y + magnifierPosition);

View file

@ -90,8 +90,8 @@ public class RegionCaptureOptions
// Image editor // Image editor
public ImageEditorStartMode ImageEditorStartMode = ImageEditorStartMode.AutoSize; public ImageEditorStartMode ImageEditorStartMode = ImageEditorStartMode.AutoSize;
public bool ZoomToFitOnOpen = false;
public WindowState ImageEditorWindowState = new WindowState(); public WindowState ImageEditorWindowState = new WindowState();
public bool ZoomToFitOnOpen = false;
public bool EditorAutoCopyImage = false; public bool EditorAutoCopyImage = false;
public bool AutoCloseEditorOnTask = false; public bool AutoCloseEditorOnTask = false;
public bool ShowEditorPanTip = true; public bool ShowEditorPanTip = true;

View file

@ -60,13 +60,13 @@ public void Update()
if (Orientation == Orientation.Horizontal) if (Orientation == Orientation.Horizontal)
{ {
isScrollbarNeeded = form.CanvasRectangle.Left < form.ClientArea.Left isScrollbarNeeded = form.CanvasRectangle.Left < form.ClientArea.Left ||
|| (form.CanvasRectangle.Right * form.ZoomFactor) > form.ClientArea.Right; (form.CanvasRectangle.Right * form.ZoomFactor) > form.ClientArea.Right;
} }
else else
{ {
isScrollbarNeeded = form.CanvasRectangle.Top < form.ClientArea.Top isScrollbarNeeded = form.CanvasRectangle.Top < form.ClientArea.Top ||
|| (form.CanvasRectangle.Bottom * form.ZoomFactor) > form.ClientArea.Bottom; (form.CanvasRectangle.Bottom * form.ZoomFactor) > form.ClientArea.Bottom;
} }
Visible = isScrollbarNeeded || IsDragging; Visible = isScrollbarNeeded || IsDragging;
@ -147,8 +147,9 @@ public override void OnDraw(Graphics g)
using (Brush trackBrush = new SolidBrush(TrackColor)) using (Brush trackBrush = new SolidBrush(TrackColor))
using (Brush thumbBrush = new SolidBrush(thumbColor)) using (Brush thumbBrush = new SolidBrush(thumbColor))
{ {
var savedTransform = g.Transform; Matrix savedTransform = g.Transform;
form.ZoomTransform(g, true); form.ZoomTransform(g, true);
if (IsCapsule) if (IsCapsule)
{ {
g.SmoothingMode = SmoothingMode.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality;
@ -165,6 +166,7 @@ public override void OnDraw(Graphics g)
g.FillRectangle(trackBrush, Rectangle); g.FillRectangle(trackBrush, Rectangle);
g.FillRectangle(thumbBrush, ThumbRectangle); g.FillRectangle(thumbBrush, ThumbRectangle);
} }
g.Transform = savedTransform; g.Transform = savedTransform;
} }
} }

View file

@ -501,36 +501,35 @@ private void form_MouseDoubleClick(object sender, MouseEventArgs e)
private void form_MouseWheel(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 (e.Delta > 0)
{
if (Options.ShowMagnifier)
{ {
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) if (Form.IsAnnotationMode)
{ {
tsmiShowMagnifier.Checked = Options.ShowMagnifier; tsmiShowMagnifier.Checked = Options.ShowMagnifier;
tslnudMagnifierPixelCount.Content.Value = Options.MagnifierPixelCount; tslnudMagnifierPixelCount.Content.Value = Options.MagnifierPixelCount;
}
} }
} }