diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-04-09 01:47:48 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-04-09 01:47:48 +0300 |
| commit | 080f1697e97e13461ec6df4d31c8924d01257a1b (patch) | |
| tree | b1fe0285de7bc9bc52e9e2195e66fe022bf8f5b3 /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/PixelSnapHelpers.cs | |
| parent | 1608e69a417bc5e40a607c3958c4a60f19f66f1a (diff) | |
| download | Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.tar.gz Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.zip | |
MERGE
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/PixelSnapHelpers.cs')
| -rw-r--r-- | Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/PixelSnapHelpers.cs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/PixelSnapHelpers.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/PixelSnapHelpers.cs new file mode 100644 index 000000000..abd859533 --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/PixelSnapHelpers.cs @@ -0,0 +1,92 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Windows; +using System.Windows.Media; + +namespace Tango.Scripting.Editors.Utils +{ + /// <summary> + /// Contains static helper methods for aligning stuff on a whole number of pixels. + /// </summary> + public static class PixelSnapHelpers + { + /// <summary> + /// Gets the pixel size on the screen containing visual. + /// This method does not take transforms on visual into account. + /// </summary> + public static Size GetPixelSize(Visual visual) + { + if (visual == null) + throw new ArgumentNullException("visual"); + PresentationSource source = PresentationSource.FromVisual(visual); + if (source != null) { + Matrix matrix = source.CompositionTarget.TransformFromDevice; + return new Size(matrix.M11, matrix.M22); + } else { + return new Size(1, 1); + } + } + + /// <summary> + /// Aligns <paramref name="value"/> on the next middle of a pixel. + /// </summary> + /// <param name="value">The value that should be aligned</param> + /// <param name="pixelSize">The size of one pixel</param> + public static double PixelAlign(double value, double pixelSize) + { + // 0 -> 0.5 + // 0.1 -> 0.5 + // 0.5 -> 0.5 + // 0.9 -> 0.5 + // 1 -> 1.5 + return pixelSize * (Math.Round((value / pixelSize) + 0.5) - 0.5); + } + + /// <summary> + /// Aligns the borders of rect on the middles of pixels. + /// </summary> + public static Rect PixelAlign(Rect rect, Size pixelSize) + { + rect.X = PixelAlign(rect.X, pixelSize.Width); + rect.Y = PixelAlign(rect.Y, pixelSize.Height); + rect.Width = Round(rect.Width, pixelSize.Width); + rect.Height = Round(rect.Height, pixelSize.Height); + return rect; + } + + /// <summary> + /// Rounds <paramref name="point"/> to whole number of pixels. + /// </summary> + public static Point Round(Point point, Size pixelSize) + { + return new Point(Round(point.X, pixelSize.Width), Round(point.Y, pixelSize.Height)); + } + + /// <summary> + /// Rounds val to whole number of pixels. + /// </summary> + public static Rect Round(Rect rect, Size pixelSize) + { + return new Rect(Round(rect.X, pixelSize.Width), Round(rect.Y, pixelSize.Height), + Round(rect.Width, pixelSize.Width), Round(rect.Height, pixelSize.Height)); + } + + /// <summary> + /// Rounds <paramref name="value"/> to a whole number of pixels. + /// </summary> + public static double Round(double value, double pixelSize) + { + return pixelSize * Math.Round(value / pixelSize); + } + + /// <summary> + /// Rounds <paramref name="value"/> to an whole odd number of pixels. + /// </summary> + public static double RoundToOdd(double value, double pixelSize) + { + return Round(value - pixelSize, pixelSize * 2) + pixelSize; + } + } +} |
