mirror of
https://github.com/ShareX/ShareX.git
synced 2024-10-01 09:47:22 +13:00
Code refactoring
This commit is contained in:
parent
cd499d73d5
commit
1ea1dacb0f
6 changed files with 84 additions and 97 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue