mirror of
https://github.com/ShareX/ShareX.git
synced 2024-09-30 01:07:21 +13:00
Hide 100% zoom. CTRL+0 to reset. Fix magnifier and info text. Center zoom on mouse. Use GraphicsQualityManager.
This commit is contained in:
parent
e5609fcef6
commit
468d6ed3d6
3 changed files with 93 additions and 64 deletions
|
@ -34,20 +34,36 @@ public class GraphicsQualityManager : IDisposable
|
|||
private CompositingQuality previousCompositingQuality;
|
||||
private InterpolationMode previousInterpolationMode;
|
||||
private SmoothingMode previousSmoothingMode;
|
||||
private PixelOffsetMode previousPixelOffsetMode;
|
||||
private Graphics g;
|
||||
|
||||
public GraphicsQualityManager(Graphics g, bool setHighQuality = true)
|
||||
public enum Quality
|
||||
{
|
||||
Low,
|
||||
High,
|
||||
}
|
||||
|
||||
public GraphicsQualityManager(Graphics g, Quality? quality = Quality.High)
|
||||
{
|
||||
this.g = g;
|
||||
|
||||
previousCompositingQuality = g.CompositingQuality;
|
||||
previousInterpolationMode = g.InterpolationMode;
|
||||
previousSmoothingMode = g.SmoothingMode;
|
||||
previousPixelOffsetMode = g.PixelOffsetMode;
|
||||
|
||||
if (setHighQuality)
|
||||
if (!quality.HasValue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (quality.Value == Quality.High)
|
||||
{
|
||||
SetHighQuality();
|
||||
}
|
||||
else if (quality.Value == Quality.Low)
|
||||
{
|
||||
SetLowQuality();
|
||||
}
|
||||
}
|
||||
|
||||
public void SetHighQuality()
|
||||
|
@ -60,6 +76,17 @@ public void SetHighQuality()
|
|||
}
|
||||
}
|
||||
|
||||
public void SetLowQuality()
|
||||
{
|
||||
if (g != null)
|
||||
{
|
||||
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
|
||||
g.InterpolationMode = InterpolationMode.NearestNeighbor;
|
||||
g.SmoothingMode = SmoothingMode.HighSpeed;
|
||||
g.CompositingQuality = CompositingQuality.HighSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (g != null)
|
||||
|
@ -67,6 +94,7 @@ public void Dispose()
|
|||
g.CompositingQuality = previousCompositingQuality;
|
||||
g.InterpolationMode = previousInterpolationMode;
|
||||
g.SmoothingMode = previousSmoothingMode;
|
||||
g.PixelOffsetMode = previousPixelOffsetMode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,8 +132,6 @@ public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, B
|
|||
infoFontBig = new Font("Verdana", 16, FontStyle.Bold);
|
||||
markerPen = new Pen(Color.FromArgb(200, Color.Red));
|
||||
|
||||
MouseWheel += onMouseWheel;
|
||||
|
||||
if (ShareXResources.UseCustomTheme)
|
||||
{
|
||||
canvasBackgroundColor = ShareXResources.Theme.BackgroundColor;
|
||||
|
@ -170,24 +168,6 @@ public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, B
|
|||
public Point ScaledClientMousePosition => InputManager.ClientMousePosition.Scale(1 / ZoomFactor);
|
||||
public Point ScaledClientMouseVelocity => InputManager.MouseVelocity.Scale(1 / ZoomFactor);
|
||||
|
||||
private void onMouseWheel(object sender, MouseEventArgs e)
|
||||
{
|
||||
// TODO: center zoom on mouse position
|
||||
if ((ModifierKeys & Keys.Control) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (e.Delta > 0)
|
||||
{
|
||||
ZoomFactor *= 1.1F;
|
||||
}
|
||||
else if (ZoomFactor > 0.2)
|
||||
{
|
||||
ZoomFactor /= 1.1F;
|
||||
}
|
||||
UpdateTitle();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
SuspendLayout();
|
||||
|
@ -262,6 +242,7 @@ private void InitializeComponent()
|
|||
Shown += RegionCaptureForm_Shown;
|
||||
KeyDown += RegionCaptureForm_KeyDown;
|
||||
MouseDown += RegionCaptureForm_MouseDown;
|
||||
MouseWheel += RegionCaptureForm_MouseWheel;
|
||||
Resize += RegionCaptureForm_Resize;
|
||||
LocationChanged += RegionCaptureForm_LocationChanged;
|
||||
LostFocus += RegionCaptureForm_LostFocus;
|
||||
|
@ -298,9 +279,10 @@ internal void UpdateTitle()
|
|||
title.AppendFormat(" - FPS: {0}", FPSManager.FPS.ToString());
|
||||
}
|
||||
|
||||
if (ZoomFactor != 1.0)
|
||||
double zoomPercentage = Math.Round(ZoomFactor * 100);
|
||||
if (zoomPercentage != 100)
|
||||
{
|
||||
title.AppendFormat(" - ZOOM: {0}%", Math.Round(ZoomFactor * 100));
|
||||
title.AppendFormat(" - ZOOM: {0}%", zoomPercentage);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -651,6 +633,9 @@ internal void RegionCaptureForm_KeyDown(object sender, KeyEventArgs e)
|
|||
case Keys.Control | Keys.C:
|
||||
CopyAreaInfo();
|
||||
break;
|
||||
case Keys.Control | Keys.D0:
|
||||
ZoomFactor = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!IsEditorMode && e.KeyData >= Keys.D0 && e.KeyData <= Keys.D9)
|
||||
|
@ -675,6 +660,30 @@ private void RegionCaptureForm_MouseDown(object sender, MouseEventArgs e)
|
|||
}
|
||||
}
|
||||
|
||||
private void RegionCaptureForm_MouseWheel(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (!ModifierKeys.HasFlag(Keys.Control))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const float scaleAmount = 1.1F;
|
||||
Point mouseBefore = ScaledClientMousePosition;
|
||||
if (e.Delta > 0)
|
||||
{
|
||||
ZoomFactor *= scaleAmount;
|
||||
}
|
||||
else if (ZoomFactor > 0.2)
|
||||
{
|
||||
ZoomFactor /= scaleAmount;
|
||||
}
|
||||
Point mouseAfter = ScaledClientMousePosition;
|
||||
|
||||
Pan(new Point(mouseAfter.X - mouseBefore.X, mouseAfter.Y - mouseBefore.Y));
|
||||
|
||||
UpdateTitle();
|
||||
}
|
||||
|
||||
private void MonitorKey(int index)
|
||||
{
|
||||
if (index == 0)
|
||||
|
@ -820,13 +829,10 @@ protected override void OnPaint(PaintEventArgs e)
|
|||
|
||||
private void DrawBackground(Graphics g)
|
||||
{
|
||||
// TODO: dynamically improved scaling quality when zoom != 1 if FPS is high
|
||||
// especially when scaling down
|
||||
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
|
||||
g.InterpolationMode = InterpolationMode.NearestNeighbor;
|
||||
g.SmoothingMode = SmoothingMode.HighSpeed;
|
||||
g.CompositingQuality = CompositingQuality.HighSpeed;
|
||||
g.DrawImage(backgroundBrush.Image, CanvasRectangle);
|
||||
using (GraphicsQualityManager quality = new GraphicsQualityManager(g, GraphicsQualityManager.Quality.Low))
|
||||
{
|
||||
g.DrawImage(backgroundBrush.Image, CanvasRectangle);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawShapes(Graphics g)
|
||||
|
@ -1088,12 +1094,9 @@ private void DrawTextAnimation(Graphics g, TextAnimation textAnimation, Rectangl
|
|||
using (Brush textBrush = new SolidBrush(Color.FromArgb((int)(textAnimation.Opacity * 255), textColor)))
|
||||
using (Brush textShadowBrush = new SolidBrush(Color.FromArgb((int)(textAnimation.Opacity * 255), textShadowColor)))
|
||||
{
|
||||
var transform = g.Transform;
|
||||
using (Matrix identity = new Matrix())
|
||||
{
|
||||
g.Transform = identity; // ignore zoom
|
||||
DrawInfoText(g, textAnimation.Text, textRectangle, infoFontMedium, padding, backgroundBrush, outerBorderPen, innerBorderPen, textBrush, textShadowBrush);
|
||||
}
|
||||
Matrix transform = g.Transform;
|
||||
g.ScaleTransform(1 / ZoomFactor, 1 / ZoomFactor); // ignore zoom
|
||||
DrawInfoText(g, textAnimation.Text, textRectangle, infoFontMedium, padding, backgroundBrush, outerBorderPen, innerBorderPen, textBrush, textShadowBrush);
|
||||
g.Transform = transform;
|
||||
}
|
||||
}
|
||||
|
@ -1131,7 +1134,7 @@ private string GetInfoText()
|
|||
{
|
||||
if (IsEditorMode)
|
||||
{
|
||||
Point canvasRelativePosition = new Point(InputManager.ClientMousePosition.X - CanvasRectangle.X, InputManager.ClientMousePosition.Y - CanvasRectangle.Y);
|
||||
Point canvasRelativePosition = new Point(ScaledClientMousePosition.X - CanvasRectangle.X, ScaledClientMousePosition.Y - CanvasRectangle.Y);
|
||||
return $"X: {canvasRelativePosition.X} Y: {canvasRelativePosition.Y}";
|
||||
}
|
||||
else if (Mode == RegionCaptureMode.ScreenColorPicker || Options.UseCustomInfoText)
|
||||
|
@ -1192,8 +1195,6 @@ private void DrawCrosshair(Graphics g)
|
|||
|
||||
private void DrawCursorGraphics(Graphics g)
|
||||
{
|
||||
Point mousePos = InputManager.ClientMousePosition;
|
||||
Rectangle currentScreenRect0Based = CaptureHelpers.GetActiveScreenBounds0Based();
|
||||
int cursorOffsetX = 10, cursorOffsetY = 10, itemGap = 10, itemCount = 0;
|
||||
Size totalSize = Size.Empty;
|
||||
|
||||
|
@ -1205,7 +1206,7 @@ private void DrawCursorGraphics(Graphics g)
|
|||
if (itemCount > 0) totalSize.Height += itemGap;
|
||||
magnifierPosition = totalSize.Height;
|
||||
|
||||
magnifier = Magnifier(Canvas, mousePos, Options.MagnifierPixelCount, Options.MagnifierPixelCount, Options.MagnifierPixelSize);
|
||||
magnifier = Magnifier(Canvas, ScaledClientMousePosition, Options.MagnifierPixelCount, Options.MagnifierPixelCount, Options.MagnifierPixelSize);
|
||||
totalSize.Width = Math.Max(totalSize.Width, magnifier.Width);
|
||||
|
||||
totalSize.Height += magnifier.Height;
|
||||
|
@ -1232,6 +1233,8 @@ private void DrawCursorGraphics(Graphics g)
|
|||
//itemCount++;
|
||||
}
|
||||
|
||||
Point mousePos = InputManager.ClientMousePosition;
|
||||
Rectangle currentScreenRect0Based = CaptureHelpers.GetActiveScreenBounds0Based();
|
||||
int x = mousePos.X + cursorOffsetX;
|
||||
|
||||
if (x + totalSize.Width > currentScreenRect0Based.Right)
|
||||
|
@ -1246,32 +1249,29 @@ private void DrawCursorGraphics(Graphics g)
|
|||
y = mousePos.Y - cursorOffsetY - totalSize.Height;
|
||||
}
|
||||
|
||||
Matrix initialTranform = g.Transform;
|
||||
if (Options.ShowMagnifier)
|
||||
{
|
||||
Matrix transform = g.Transform;
|
||||
using (Matrix identity = new Matrix())
|
||||
g.ScaleTransform(1 / ZoomFactor, 1 / ZoomFactor); // ignore zoom
|
||||
if (Options.UseSquareMagnifier)
|
||||
{
|
||||
g.Transform = identity; // ignore zoom
|
||||
if (Options.UseSquareMagnifier)
|
||||
g.DrawImage(magnifier, x, y + magnifierPosition, magnifier.Width, magnifier.Height);
|
||||
g.DrawRectangleProper(Pens.White, x - 1, y + magnifierPosition - 1, magnifier.Width + 2, magnifier.Height + 2);
|
||||
g.DrawRectangleProper(Pens.Black, x, y + magnifierPosition, magnifier.Width, magnifier.Height);
|
||||
}
|
||||
else
|
||||
{
|
||||
using (GraphicsQualityManager quality = new GraphicsQualityManager(g))
|
||||
using (TextureBrush brush = new TextureBrush(magnifier))
|
||||
{
|
||||
g.DrawImage(magnifier, x, y + magnifierPosition, magnifier.Width, magnifier.Height);
|
||||
g.DrawRectangleProper(Pens.White, x - 1, y + magnifierPosition - 1, magnifier.Width + 2, magnifier.Height + 2);
|
||||
g.DrawRectangleProper(Pens.Black, x, y + magnifierPosition, magnifier.Width, magnifier.Height);
|
||||
}
|
||||
else
|
||||
{
|
||||
using (GraphicsQualityManager quality = new GraphicsQualityManager(g))
|
||||
using (TextureBrush brush = new TextureBrush(magnifier))
|
||||
{
|
||||
brush.TranslateTransform(x, y + magnifierPosition);
|
||||
brush.TranslateTransform(x, y + magnifierPosition);
|
||||
|
||||
g.FillEllipse(brush, x, y + magnifierPosition, magnifier.Width, magnifier.Height);
|
||||
g.DrawEllipse(Pens.White, x - 1, y + magnifierPosition - 1, magnifier.Width + 2 - 1, magnifier.Height + 2 - 1);
|
||||
g.DrawEllipse(Pens.Black, x, y + magnifierPosition, magnifier.Width - 1, magnifier.Height - 1);
|
||||
}
|
||||
g.FillEllipse(brush, x, y + magnifierPosition, magnifier.Width, magnifier.Height);
|
||||
g.DrawEllipse(Pens.White, x - 1, y + magnifierPosition - 1, magnifier.Width + 2 - 1, magnifier.Height + 2 - 1);
|
||||
g.DrawEllipse(Pens.Black, x, y + magnifierPosition, magnifier.Width - 1, magnifier.Height - 1);
|
||||
}
|
||||
}
|
||||
g.Transform = transform;
|
||||
g.Transform = initialTranform;
|
||||
}
|
||||
|
||||
if (Options.ShowInfo)
|
||||
|
@ -1302,7 +1302,9 @@ private void DrawCursorGraphics(Graphics g)
|
|||
infoTextRect.Location = new Point(x + (totalSize.Width / 2) - (infoTextRect.Width / 2), y + infoTextPosition);
|
||||
Point padding = new Point(infoTextPadding, infoTextPadding);
|
||||
|
||||
g.ScaleTransform(1 / ZoomFactor, 1 / ZoomFactor); // ignore zoom
|
||||
DrawInfoText(g, infoText, infoTextRect, infoFont, padding);
|
||||
g.Transform = initialTranform;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -144,12 +144,11 @@ public override void OnDraw(Graphics g)
|
|||
thumbColor = ThumbColor;
|
||||
}
|
||||
|
||||
var transform = g.Transform;
|
||||
using (Brush trackBrush = new SolidBrush(TrackColor))
|
||||
using (Brush thumbBrush = new SolidBrush(thumbColor))
|
||||
using (Matrix identity = new Matrix())
|
||||
{
|
||||
g.Transform = identity; // ignore editor scaling
|
||||
var savedTransform = g.Transform;
|
||||
g.ScaleTransform(1 / form.ZoomFactor, 1 / form.ZoomFactor); // ignore zoom
|
||||
if (IsCapsule)
|
||||
{
|
||||
g.SmoothingMode = SmoothingMode.HighQuality;
|
||||
|
@ -166,8 +165,8 @@ public override void OnDraw(Graphics g)
|
|||
g.FillRectangle(trackBrush, Rectangle);
|
||||
g.FillRectangle(thumbBrush, ThumbRectangle);
|
||||
}
|
||||
g.Transform = savedTransform;
|
||||
}
|
||||
g.Transform = transform;
|
||||
}
|
||||
|
||||
private void Scroll(Point position)
|
||||
|
|
Loading…
Reference in a new issue