From 66baf9a194522631ed1fc8f7e60aa603cb10051d Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Sat, 28 Feb 2026 12:37:36 +0000 Subject: [PATCH] Make a few more things internal (#20772) * Make MathUtilities internal * Remove old overloads from LayoutHelper * Make DrawingContextHelper.WrapSkiaCanvas internal * Update API suppressions --------- Co-authored-by: Max Katz --- api/Avalonia.Skia.nupkg.xml | 12 +++++++ api/Avalonia.nupkg.xml | 36 +++++++++++++++++++ samples/ControlCatalog/Pages/GesturePage.cs | 4 +-- src/Avalonia.Base/Layout/LayoutHelper.cs | 35 +++++------------- src/Avalonia.Base/Utilities/MathUtilities.cs | 9 +---- .../Helpers/DrawingContextHelper.cs | 11 +----- 6 files changed, 61 insertions(+), 46 deletions(-) diff --git a/api/Avalonia.Skia.nupkg.xml b/api/Avalonia.Skia.nupkg.xml index 8e9d60f7d4..cd9dedbd0f 100644 --- a/api/Avalonia.Skia.nupkg.xml +++ b/api/Avalonia.Skia.nupkg.xml @@ -25,12 +25,24 @@ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll + + CP0002 + M:Avalonia.Skia.Helpers.DrawingContextHelper.WrapSkiaCanvas(SkiaSharp.SKCanvas,Avalonia.Vector) + baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll + current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll + CP0002 M:Avalonia.Skia.ISkiaGpuRenderTarget.BeginRenderingSession baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll + + CP0002 + M:Avalonia.Skia.Helpers.DrawingContextHelper.WrapSkiaCanvas(SkiaSharp.SKCanvas,Avalonia.Vector) + baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll + current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll + CP0002 M:Avalonia.Skia.ISkiaGpuRenderTarget.BeginRenderingSession diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml index bf32b82d3e..b729164b3b 100644 --- a/api/Avalonia.nupkg.xml +++ b/api/Avalonia.nupkg.xml @@ -211,6 +211,12 @@ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll current/Avalonia/lib/net10.0/Avalonia.Base.dll + + CP0001 + T:Avalonia.Utilities.MathUtilities + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + CP0001 T:Avalonia.Utilities.StringTokenizer @@ -595,6 +601,12 @@ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll current/Avalonia/lib/net8.0/Avalonia.Base.dll + + CP0001 + T:Avalonia.Utilities.MathUtilities + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + CP0001 T:Avalonia.Utilities.StringTokenizer @@ -1015,6 +1027,18 @@ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll current/Avalonia/lib/net10.0/Avalonia.Base.dll + + CP0002 + M:Avalonia.Layout.LayoutHelper.RoundLayoutSizeUp(Avalonia.Size,System.Double,System.Double) + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + + + CP0002 + M:Avalonia.Layout.LayoutHelper.RoundLayoutThickness(Avalonia.Thickness,System.Double,System.Double) + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + CP0002 M:Avalonia.Media.Color.ToUint32 @@ -2119,6 +2143,18 @@ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll current/Avalonia/lib/net8.0/Avalonia.Base.dll + + CP0002 + M:Avalonia.Layout.LayoutHelper.RoundLayoutSizeUp(Avalonia.Size,System.Double,System.Double) + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + + + CP0002 + M:Avalonia.Layout.LayoutHelper.RoundLayoutThickness(Avalonia.Thickness,System.Double,System.Double) + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + CP0002 M:Avalonia.Media.Color.ToUint32 diff --git a/samples/ControlCatalog/Pages/GesturePage.cs b/samples/ControlCatalog/Pages/GesturePage.cs index c480b512b4..7bc3b96c49 100644 --- a/samples/ControlCatalog/Pages/GesturePage.cs +++ b/samples/ControlCatalog/Pages/GesturePage.cs @@ -134,8 +134,8 @@ namespace ControlCatalog.Pages var currentSize = control.Bounds.Size * _currentScale; - currentOffset = new Vector3D(MathUtilities.Clamp(currentOffset.X, 0, currentSize.Width - control.Bounds.Width), - (float)MathUtilities.Clamp(currentOffset.Y, 0, currentSize.Height - control.Bounds.Height), + currentOffset = new Vector3D(Math.Clamp(currentOffset.X, 0, currentSize.Width - control.Bounds.Width), + (float)Math.Clamp(currentOffset.Y, 0, currentSize.Height - control.Bounds.Height), 0); compositionVisual.Offset = currentOffset * -1; diff --git a/src/Avalonia.Base/Layout/LayoutHelper.cs b/src/Avalonia.Base/Layout/LayoutHelper.cs index 84f1fc4bcc..c50053dc05 100644 --- a/src/Avalonia.Base/Layout/LayoutHelper.cs +++ b/src/Avalonia.Base/Layout/LayoutHelper.cs @@ -147,8 +147,7 @@ namespace Avalonia.Layout /// coordinates by rounding the size up to the nearest pixel. /// /// Input size. - /// DPI along x-dimension. - /// DPI along y-dimension. + /// The DPI scale. /// Value of size that will be rounded under screen DPI. /// /// This is a layout helper method. It takes DPI into account and also does not return @@ -156,14 +155,8 @@ namespace Avalonia.Layout /// associated with the UseLayoutRounding property and should not be used as a general rounding /// utility. /// - public static Size RoundLayoutSizeUp(Size size, double dpiScaleX, double dpiScaleY) - { - return new Size(RoundLayoutValueUp(size.Width, dpiScaleX), RoundLayoutValueUp(size.Height, dpiScaleY)); - } - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator", Justification = "The DPI scale should have been normalized.")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static Size RoundLayoutSizeUp(Size size, double dpiScale) + public static Size RoundLayoutSizeUp(Size size, double dpiScale) { // If DPI == 1, don't use DPI-aware rounding. return dpiScale == 1.0 ? @@ -180,8 +173,7 @@ namespace Avalonia.Layout /// coordinates. /// /// Input thickness. - /// DPI along x-dimension. - /// DPI along y-dimension. + /// The DPI scale. /// Value of thickness that will be rounded under screen DPI. /// /// This is a layout helper method. It takes DPI into account and also does not return @@ -189,19 +181,8 @@ namespace Avalonia.Layout /// associated with the UseLayoutRounding property and should not be used as a general rounding /// utility. /// - public static Thickness RoundLayoutThickness(Thickness thickness, double dpiScaleX, double dpiScaleY) - { - return new Thickness( - RoundLayoutValue(thickness.Left, dpiScaleX), - RoundLayoutValue(thickness.Top, dpiScaleY), - RoundLayoutValue(thickness.Right, dpiScaleX), - RoundLayoutValue(thickness.Bottom, dpiScaleY) - ); - } - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator", Justification = "The DPI scale should have been normalized.")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static Thickness RoundLayoutThickness(Thickness thickness, double dpiScale) + public static Thickness RoundLayoutThickness(Thickness thickness, double dpiScale) { // If DPI == 1, don't use DPI-aware rounding. return dpiScale == 1.0 ? @@ -219,7 +200,7 @@ namespace Avalonia.Layout [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator", Justification = "The DPI scale should have been normalized.")] [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static Point RoundLayoutPoint(Point point, double dpiScale) + public static Point RoundLayoutPoint(Point point, double dpiScale) { // If DPI == 1, don't use DPI-aware rounding. return dpiScale == 1.0 ? @@ -244,10 +225,11 @@ namespace Avalonia.Layout /// associated with the UseLayoutRounding property and should not be used as a general rounding /// utility. /// + [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator", Justification = "The DPI scale should have been normalized.")] public static double RoundLayoutValue(double value, double dpiScale) { // If DPI == 1, don't use DPI-aware rounding. - return MathUtilities.IsOne(dpiScale) ? + return dpiScale == 1.0 ? Math.Round(value) : Math.Round(value * dpiScale) / dpiScale; } @@ -265,10 +247,11 @@ namespace Avalonia.Layout /// associated with the UseLayoutRounding property and should not be used as a general rounding /// utility. /// + [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator", Justification = "The DPI scale should have been normalized.")] public static double RoundLayoutValueUp(double value, double dpiScale) { // If DPI == 1, don't use DPI-aware rounding. - return MathUtilities.IsOne(dpiScale) ? + return dpiScale == 1.0 ? Math.Ceiling(value) : Math.Ceiling(RoundTo8Digits(value) * dpiScale) / dpiScale; } diff --git a/src/Avalonia.Base/Utilities/MathUtilities.cs b/src/Avalonia.Base/Utilities/MathUtilities.cs index 1ebf4f6457..2c18836d75 100644 --- a/src/Avalonia.Base/Utilities/MathUtilities.cs +++ b/src/Avalonia.Base/Utilities/MathUtilities.cs @@ -1,19 +1,12 @@ using System; using System.Runtime.CompilerServices; -#if !BUILDTASK -using Avalonia.Metadata; -#endif namespace Avalonia.Utilities { /// /// Provides math utilities not provided in System.Math. /// -#if !BUILDTASK - [Unstable("This API might be removed in next major version. Please use corresponding BCL APIs.")] - public -#endif - static class MathUtilities + internal static class MathUtilities { // smallest such that 1.0+DoubleEpsilon != 1.0 internal const double DoubleEpsilon = 2.2204460492503131e-016; diff --git a/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs b/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs index fb9ccf78e6..4ed1ea2a11 100644 --- a/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs +++ b/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs @@ -33,16 +33,7 @@ namespace Avalonia.Skia.Helpers return Task.CompletedTask; } - /// - /// Wrap Skia canvas in drawing context so we can use Avalonia api to render to external skia canvas - /// this is useful in scenarios where canvas is not controlled by application, but received from another non avalonia api - /// like: SKCanvas canvas = SKDocument.BeginPage(...); - /// - /// Skia canvas to render into. - /// - /// DrawingContext - [Unstable("IDrawingContextImpl usage is not supported in Avalonia 11.0.")] - public static IDrawingContextImpl WrapSkiaCanvas(SKCanvas canvas, Vector dpi) + internal static IDrawingContextImpl WrapSkiaCanvas(SKCanvas canvas, Vector dpi) { var createInfo = new DrawingContextImpl.CreateInfo {