From 0442c3b337de3dba8d0f2efa5b2814da0d9050d9 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Wed, 19 Apr 2023 12:00:12 +0200 Subject: [PATCH 01/40] Introduce advanced render options --- src/Avalonia.Base/Media/DrawingContext.cs | 26 +--- src/Avalonia.Base/Media/DrawingGroup.cs | 10 +- src/Avalonia.Base/Media/DrawingImage.cs | 4 +- src/Avalonia.Base/Media/EdgeMode.cs | 10 ++ src/Avalonia.Base/Media/GlyphRun.cs | 42 ++++-- src/Avalonia.Base/Media/GlyphRunMetrics.cs | 23 ++-- src/Avalonia.Base/Media/IImage.cs | 4 +- src/Avalonia.Base/Media/ITileBrush.cs | 8 -- src/Avalonia.Base/Media/Imaging/Bitmap.cs | 6 +- .../Media/Imaging/BitmapBlendingMode.cs | 6 +- .../Media/Imaging/BitmapInterpolationMode.cs | 10 +- .../Media/Imaging/CroppedBitmap.cs | 4 +- .../Media/ImmediateDrawingContext.cs | 5 +- .../Media/Immutable/ImmutableImageBrush.cs | 7 +- .../Media/Immutable/ImmutableTileBrush.cs | 11 +- .../Media/PlatformDrawingContext.cs | 16 +-- src/Avalonia.Base/Media/RenderOptions.cs | 127 +++++++++++++++--- src/Avalonia.Base/Media/TextDecoration.cs | 8 +- src/Avalonia.Base/Media/TextRenderingMode.cs | 11 ++ src/Avalonia.Base/Media/TileBrush.cs | 13 -- .../Platform/IDrawingContextImpl.cs | 21 +-- src/Avalonia.Base/Platform/IGlyphRunBuffer.cs | 22 --- src/Avalonia.Base/Platform/IGlyphRunImpl.cs | 19 ++- .../Platform/IPlatformRenderInterface.cs | 3 +- .../Composition/CompositingRenderer.cs | 4 +- .../Drawing/CompositionDrawingContext.cs | 36 +---- .../Composition/Server/DrawingContextProxy.cs | 21 ++- .../Server/ServerCompositionTarget.cs | 2 +- .../Server/ServerCompositionVisual.cs | 7 + .../Rendering/ImmediateRenderer.cs | 18 ++- .../SceneGraph/BitmapBlendModeNode.cs | 68 ---------- .../Rendering/SceneGraph/GlyphRunNode.cs | 5 +- .../Rendering/SceneGraph/ImageNode.cs | 21 +-- src/Avalonia.Base/Visual.cs | 4 +- src/Avalonia.Base/composition-schema.xml | 1 + src/Avalonia.Controls/Image.cs | 4 +- .../HeadlessPlatformRenderInterface.cs | 13 +- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 41 ++---- src/Skia/Avalonia.Skia/GlyphRunImpl.cs | 118 ++++++++++++++-- .../Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs | 1 - .../Avalonia.Skia/PlatformRenderInterface.cs | 65 +-------- src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs | 4 +- .../Avalonia.Direct2D1/Direct2D1Platform.cs | 54 +------- .../Media/DrawingContextImpl.cs | 70 +++++++--- .../Avalonia.Direct2D1/Media/GlyphRunImpl.cs | 93 +++++++++++-- .../Media/ImageBrushImpl.cs | 9 +- .../Media/Imaging/BitmapImpl.cs | 2 +- .../Media/Imaging/D2DBitmapImpl.cs | 11 +- .../Imaging/D2DRenderTargetBitmapImpl.cs | 6 +- .../Media/Imaging/WicBitmapImpl.cs | 10 +- .../SceneGraph/DrawOperationTests.cs | 3 +- .../VisualTree/MockRenderInterface.cs | 2 +- .../NullDrawingContextImpl.cs | 5 +- tests/Avalonia.Benchmarks/NullGlyphRun.cs | 21 --- .../NullRenderingPlatform.cs | 4 +- .../Media/GlyphRunTests.cs | 23 ++++ .../Shapes/EllipseTests.cs | 44 ++++++ tests/Avalonia.UnitTests/MockGlyphRun.cs | 25 ++-- .../MockPlatformRenderInterface.cs | 21 +-- ...hould_Render_GlyphRun_Aliased.expected.png | Bin 0 -> 1132 bytes .../ImageBrush_Fill_NoTile.expected.png | Bin 118742 -> 39795 bytes .../ImageBrush_Tile_Fill.expected.png | Bin 3945 -> 4185 bytes ...ImageBrush_Tile_UniformToFill.expected.png | Bin 3651 -> 3871 bytes ...ageBrush_UniformToFill_NoTile.expected.png | Bin 14445 -> 9016 bytes .../ImageBrush_Uniform_NoTile.expected.png | Bin 11325 -> 7508 bytes .../ImageDrawing_Fill.expected.png | Bin 11529 -> 6932 bytes .../VisualBrush_Fill_NoTile.expected.png | Bin 117975 -> 39511 bytes .../VisualBrush_Grip_144_Dpi.expected.png | Bin 271 -> 199 bytes ...ualBrush_UniformToFill_NoTile.expected.png | Bin 14390 -> 8882 bytes .../VisualBrush_Uniform_NoTile.expected.png | Bin 11334 -> 7408 bytes .../Should_Render_Circle_Aliased.expected.png | Bin 0 -> 1634 bytes ...uld_Render_Circle_Antialiased.expected.png | Bin 0 -> 5379 bytes ...hould_Render_GlyphRun_Aliased.expected.png | Bin 0 -> 1066 bytes .../Should_Render_Circle_Aliased.expected.png | Bin 0 -> 1655 bytes ...uld_Render_Circle_Antialiased.expected.png | Bin 0 -> 7173 bytes 75 files changed, 663 insertions(+), 589 deletions(-) create mode 100644 src/Avalonia.Base/Media/EdgeMode.cs create mode 100644 src/Avalonia.Base/Media/TextRenderingMode.cs delete mode 100644 src/Avalonia.Base/Platform/IGlyphRunBuffer.cs delete mode 100644 src/Avalonia.Base/Rendering/SceneGraph/BitmapBlendModeNode.cs delete mode 100644 tests/Avalonia.Benchmarks/NullGlyphRun.cs create mode 100644 tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Aliased.expected.png create mode 100644 tests/TestFiles/Direct2D1/Shapes/Ellipse/Should_Render_Circle_Aliased.expected.png create mode 100644 tests/TestFiles/Direct2D1/Shapes/Ellipse/Should_Render_Circle_Antialiased.expected.png create mode 100644 tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Aliased.expected.png create mode 100644 tests/TestFiles/Skia/Shapes/Ellipse/Should_Render_Circle_Aliased.expected.png create mode 100644 tests/TestFiles/Skia/Shapes/Ellipse/Should_Render_Circle_Antialiased.expected.png diff --git a/src/Avalonia.Base/Media/DrawingContext.cs b/src/Avalonia.Base/Media/DrawingContext.cs index 18d6968168..c38f4d656d 100644 --- a/src/Avalonia.Base/Media/DrawingContext.cs +++ b/src/Avalonia.Base/Media/DrawingContext.cs @@ -4,7 +4,6 @@ using Avalonia.Platform; using Avalonia.Rendering.SceneGraph; using Avalonia.Threading; using Avalonia.Utilities; -using Avalonia.Media.Imaging; namespace Avalonia.Media { @@ -53,12 +52,10 @@ namespace Avalonia.Media /// The image. /// The rect in the image to draw. /// The rect in the output to draw to. - /// The bitmap interpolation mode. - public virtual void DrawImage(IImage source, Rect sourceRect, Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode = default) + public virtual void DrawImage(IImage source, Rect sourceRect, Rect destRect) { _ = source ?? throw new ArgumentNullException(nameof(source)); - source.Draw(this, sourceRect, destRect, bitmapInterpolationMode); + source.Draw(this, sourceRect, destRect); } /// @@ -68,8 +65,7 @@ namespace Avalonia.Media /// The opacity to draw with. /// The rect in the image to draw. /// The rect in the output to draw to. - /// The bitmap interpolation mode. - internal abstract void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default); + internal abstract void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect); /// /// Draws a line. @@ -286,8 +282,7 @@ namespace Avalonia.Media Opacity, Clip, GeometryClip, - OpacityMask, - BitmapBlendMode + OpacityMask } public RestoreState(DrawingContext context, PushedStateType type) @@ -312,8 +307,6 @@ namespace Avalonia.Media _context.PopGeometryClipCore(); else if (_type == PushedStateType.OpacityMask) _context.PopOpacityMaskCore(); - else if (_type == PushedStateType.BitmapBlendMode) - _context.PopBitmapBlendModeCore(); } } @@ -394,16 +387,6 @@ namespace Avalonia.Media } protected abstract void PushOpacityMaskCore(IBrush mask, Rect bounds); - public PushedState PushBitmapBlendMode(BitmapBlendingMode blendingMode) - { - PushBitmapBlendMode(blendingMode); - _states ??= StateStackPool.Get(); - _states.Push(new RestoreState(this, RestoreState.PushedStateType.BitmapBlendMode)); - return new PushedState(this); - } - - protected abstract void PushBitmapBlendModeCore(BitmapBlendingMode blendingMode); - /// /// Pushes a matrix transformation. /// @@ -431,7 +414,6 @@ namespace Avalonia.Media protected abstract void PopGeometryClipCore(); protected abstract void PopOpacityCore(); protected abstract void PopOpacityMaskCore(); - protected abstract void PopBitmapBlendModeCore(); protected abstract void PopTransformCore(); private static bool PenIsVisible(IPen? pen) diff --git a/src/Avalonia.Base/Media/DrawingGroup.cs b/src/Avalonia.Base/Media/DrawingGroup.cs index c96d2aad57..5a5bd50c7c 100644 --- a/src/Avalonia.Base/Media/DrawingGroup.cs +++ b/src/Avalonia.Base/Media/DrawingGroup.cs @@ -196,13 +196,7 @@ namespace Avalonia.Media throw new NotImplementedException(); } - protected override void PushBitmapBlendModeCore(BitmapBlendingMode blendingMode) - { - throw new NotImplementedException(); - } - - internal override void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + internal override void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { throw new NotImplementedException(); } @@ -321,8 +315,6 @@ namespace Avalonia.Media protected override void PopOpacityMaskCore() => Pop(); - protected override void PopBitmapBlendModeCore() => Pop(); - protected override void PopTransformCore() => Pop(); /// diff --git a/src/Avalonia.Base/Media/DrawingImage.cs b/src/Avalonia.Base/Media/DrawingImage.cs index 52fbd87db7..c83e8eb6ee 100644 --- a/src/Avalonia.Base/Media/DrawingImage.cs +++ b/src/Avalonia.Base/Media/DrawingImage.cs @@ -1,6 +1,5 @@ using System; using Avalonia.Metadata; -using Avalonia.Media.Imaging; namespace Avalonia.Media { @@ -43,8 +42,7 @@ namespace Avalonia.Media void IImage.Draw( DrawingContext context, Rect sourceRect, - Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode) + Rect destRect) { var drawing = Drawing; diff --git a/src/Avalonia.Base/Media/EdgeMode.cs b/src/Avalonia.Base/Media/EdgeMode.cs new file mode 100644 index 0000000000..f50a2f7164 --- /dev/null +++ b/src/Avalonia.Base/Media/EdgeMode.cs @@ -0,0 +1,10 @@ +namespace Avalonia.Media +{ + public enum EdgeMode : byte + { + Unspecified, + + Antialias, + Aliased + } +} diff --git a/src/Avalonia.Base/Media/GlyphRun.cs b/src/Avalonia.Base/Media/GlyphRun.cs index d795cca894..20e0f96ff7 100644 --- a/src/Avalonia.Base/Media/GlyphRun.cs +++ b/src/Avalonia.Base/Media/GlyphRun.cs @@ -153,7 +153,7 @@ namespace Avalonia.Media /// /// Gets the conservative bounding box of the . /// - public Rect Bounds => PlatformImpl.Item.Bounds; + public Rect Bounds => new Rect(new Size(Metrics.WidthIncludingTrailingWhitespace, Metrics.Height)); /// /// @@ -166,7 +166,7 @@ namespace Avalonia.Media /// public Point BaselineOrigin { - get => PlatformImpl.Item.BaselineOrigin; + get => _baselineOrigin ?? new Point(0, Metrics.Baseline); set => Set(ref _baselineOrigin, value); } @@ -676,13 +676,17 @@ namespace Avalonia.Media } } - return new GlyphRunMetrics( - width, - trailingWhitespaceLength, - newLineLength, - firstCluster, - lastCluster - ); + return new GlyphRunMetrics + { + Baseline = -GlyphTypeface.Metrics.Ascent * Scale, + Width = width, + WidthIncludingTrailingWhitespace = widthIncludingTrailingWhitespace, + Height = height, + NewLineLength = newLineLength, + TrailingWhitespaceLength = trailingWhitespaceLength, + FirstCluster = firstCluster, + LastCluster = lastCluster + }; } private int GetTrailingWhitespaceLength(bool isReversed, out int newLineLength, out int glyphCount) @@ -820,10 +824,11 @@ namespace Avalonia.Media private IRef CreateGlyphRunImpl() { var platformImpl = s_renderInterface.CreateGlyphRun( - GlyphTypeface, - FontRenderingEmSize, - GlyphInfos, - _baselineOrigin ?? new Point(0, -GlyphTypeface.Metrics.Ascent * Scale)); + GlyphTypeface, + FontRenderingEmSize, + GlyphInfos, + BaselineOrigin, + Bounds); _platformImpl = RefCountable.Create(platformImpl); @@ -835,5 +840,16 @@ namespace Avalonia.Media _platformImpl?.Dispose(); _platformImpl = null; } + + /// + /// Gets the intersections of specified upper and lower limit. + /// + /// Upper limit. + /// Lower limit. + /// + public IReadOnlyList GetIntersections(float lowerLimit, float upperLimit) + { + return PlatformImpl.Item.GetIntersections(lowerLimit, upperLimit); + } } } diff --git a/src/Avalonia.Base/Media/GlyphRunMetrics.cs b/src/Avalonia.Base/Media/GlyphRunMetrics.cs index 09b183d044..9ca1d5ea12 100644 --- a/src/Avalonia.Base/Media/GlyphRunMetrics.cs +++ b/src/Avalonia.Base/Media/GlyphRunMetrics.cs @@ -2,23 +2,20 @@ { public readonly record struct GlyphRunMetrics { - public GlyphRunMetrics(double width, int trailingWhitespaceLength, int newLineLength, int firstCluster, int lastCluster) - { - Width = width; - TrailingWhitespaceLength = trailingWhitespaceLength; - NewLineLength = newLineLength; - FirstCluster = firstCluster; - LastCluster = lastCluster; - } + public double Baseline { get; init; } - public double Width { get; } + public double Width { get; init; } - public int TrailingWhitespaceLength { get; } + public double WidthIncludingTrailingWhitespace { get; init; } - public int NewLineLength { get; } + public double Height { get; init; } - public int FirstCluster { get; } + public int TrailingWhitespaceLength { get; init; } - public int LastCluster { get; } + public int NewLineLength { get; init; } + + public int FirstCluster { get; init; } + + public int LastCluster { get; init; } } } diff --git a/src/Avalonia.Base/Media/IImage.cs b/src/Avalonia.Base/Media/IImage.cs index cbe25b7b58..4e0b952b88 100644 --- a/src/Avalonia.Base/Media/IImage.cs +++ b/src/Avalonia.Base/Media/IImage.cs @@ -18,11 +18,9 @@ namespace Avalonia.Media /// The drawing context. /// The rect in the image to draw. /// The rect in the output to draw to. - /// The bitmap interpolation mode. void Draw( DrawingContext context, Rect sourceRect, - Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode); + Rect destRect); } } diff --git a/src/Avalonia.Base/Media/ITileBrush.cs b/src/Avalonia.Base/Media/ITileBrush.cs index cb5a591003..586f6053a1 100644 --- a/src/Avalonia.Base/Media/ITileBrush.cs +++ b/src/Avalonia.Base/Media/ITileBrush.cs @@ -39,13 +39,5 @@ namespace Avalonia.Media /// Gets the brush's tile mode. /// TileMode TileMode { get; } - - /// - /// Gets the bitmap interpolation mode. - /// - /// - /// The bitmap interpolation mode. - /// - BitmapInterpolationMode BitmapInterpolationMode { get; } } } diff --git a/src/Avalonia.Base/Media/Imaging/Bitmap.cs b/src/Avalonia.Base/Media/Imaging/Bitmap.cs index c4720d772e..07bb3db100 100644 --- a/src/Avalonia.Base/Media/Imaging/Bitmap.cs +++ b/src/Avalonia.Base/Media/Imaging/Bitmap.cs @@ -224,15 +224,13 @@ namespace Avalonia.Media.Imaging void IImage.Draw( DrawingContext context, Rect sourceRect, - Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode) + Rect destRect) { context.DrawBitmap( PlatformImpl, 1, sourceRect, - destRect, - bitmapInterpolationMode); + destRect); } private static IPlatformRenderInterface GetFactory() diff --git a/src/Avalonia.Base/Media/Imaging/BitmapBlendingMode.cs b/src/Avalonia.Base/Media/Imaging/BitmapBlendingMode.cs index eb39020939..73a3f7b269 100644 --- a/src/Avalonia.Base/Media/Imaging/BitmapBlendingMode.cs +++ b/src/Avalonia.Base/Media/Imaging/BitmapBlendingMode.cs @@ -3,8 +3,10 @@ namespace Avalonia.Media.Imaging /// /// Controls the way the bitmaps are drawn together. /// - public enum BitmapBlendingMode + public enum BitmapBlendingMode : byte { + Unspecified, + /// /// Source is placed over the destination. /// @@ -52,6 +54,6 @@ namespace Avalonia.Media.Imaging /// /// Display the sum of the source image and destination image. /// - Plus, + Plus } } diff --git a/src/Avalonia.Base/Media/Imaging/BitmapInterpolationMode.cs b/src/Avalonia.Base/Media/Imaging/BitmapInterpolationMode.cs index 7cdb5d8b9f..eaa64892a4 100644 --- a/src/Avalonia.Base/Media/Imaging/BitmapInterpolationMode.cs +++ b/src/Avalonia.Base/Media/Imaging/BitmapInterpolationMode.cs @@ -3,12 +3,14 @@ /// /// Controls the performance and quality of bitmap scaling. /// - public enum BitmapInterpolationMode + public enum BitmapInterpolationMode : byte { + Unspecified, + /// - /// Uses the default behavior of the underling render backend. + /// Disable interpolation. /// - Default, + None, /// /// The best performance but worst image quality. @@ -18,7 +20,7 @@ /// /// Good performance and decent image quality. /// - MediumQuality, + MediumQuality, /// /// Highest quality but worst performance. diff --git a/src/Avalonia.Base/Media/Imaging/CroppedBitmap.cs b/src/Avalonia.Base/Media/Imaging/CroppedBitmap.cs index 8cdf5b592a..93556679e9 100644 --- a/src/Avalonia.Base/Media/Imaging/CroppedBitmap.cs +++ b/src/Avalonia.Base/Media/Imaging/CroppedBitmap.cs @@ -83,12 +83,12 @@ namespace Avalonia.Media.Imaging } } - public void Draw(DrawingContext context, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode) + public void Draw(DrawingContext context, Rect sourceRect, Rect destRect) { if (Source is not IBitmap bmp) return; var topLeft = SourceRect.TopLeft.ToPointWithDpi(bmp.Dpi); - Source.Draw(context, sourceRect.Translate(new Vector(topLeft.X, topLeft.Y)), destRect, bitmapInterpolationMode); + Source.Draw(context, sourceRect.Translate(new Vector(topLeft.X, topLeft.Y)), destRect); } } } diff --git a/src/Avalonia.Base/Media/ImmediateDrawingContext.cs b/src/Avalonia.Base/Media/ImmediateDrawingContext.cs index 58b153482d..7ddccc80e7 100644 --- a/src/Avalonia.Base/Media/ImmediateDrawingContext.cs +++ b/src/Avalonia.Base/Media/ImmediateDrawingContext.cs @@ -80,11 +80,10 @@ namespace Avalonia.Media /// The bitmap. /// The rect in the image to draw. /// The rect in the output to draw to. - /// The bitmap interpolation mode. - public void DrawBitmap(IBitmap source, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = default) + public void DrawBitmap(IBitmap source, Rect sourceRect, Rect destRect) { _ = source ?? throw new ArgumentNullException(nameof(source)); - PlatformImpl.DrawBitmap(source.PlatformImpl, 1, sourceRect, destRect, bitmapInterpolationMode); + PlatformImpl.DrawBitmap(source.PlatformImpl, 1, sourceRect, destRect); } /// diff --git a/src/Avalonia.Base/Media/Immutable/ImmutableImageBrush.cs b/src/Avalonia.Base/Media/Immutable/ImmutableImageBrush.cs index 668a907fdf..175038ba75 100644 --- a/src/Avalonia.Base/Media/Immutable/ImmutableImageBrush.cs +++ b/src/Avalonia.Base/Media/Immutable/ImmutableImageBrush.cs @@ -22,7 +22,6 @@ namespace Avalonia.Media.Immutable /// How the source rectangle will be stretched to fill the destination rect. /// /// The tile mode. - /// The bitmap interpolation mode. public ImmutableImageBrush( IBitmap? source, AlignmentX alignmentX = AlignmentX.Center, @@ -33,8 +32,7 @@ namespace Avalonia.Media.Immutable RelativePoint transformOrigin = default, RelativeRect? sourceRect = null, Stretch stretch = Stretch.Uniform, - TileMode tileMode = TileMode.None, - BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + TileMode tileMode = TileMode.None) : base( alignmentX, alignmentY, @@ -44,8 +42,7 @@ namespace Avalonia.Media.Immutable transformOrigin, sourceRect ?? RelativeRect.Fill, stretch, - tileMode, - bitmapInterpolationMode) + tileMode) { Source = source; } diff --git a/src/Avalonia.Base/Media/Immutable/ImmutableTileBrush.cs b/src/Avalonia.Base/Media/Immutable/ImmutableTileBrush.cs index 1ee52365e0..7e139af516 100644 --- a/src/Avalonia.Base/Media/Immutable/ImmutableTileBrush.cs +++ b/src/Avalonia.Base/Media/Immutable/ImmutableTileBrush.cs @@ -21,7 +21,6 @@ namespace Avalonia.Media.Immutable /// How the source rectangle will be stretched to fill the destination rect. /// /// The tile mode. - /// The bitmap interpolation mode. protected ImmutableTileBrush( AlignmentX alignmentX, AlignmentY alignmentY, @@ -31,8 +30,7 @@ namespace Avalonia.Media.Immutable RelativePoint transformOrigin, RelativeRect sourceRect, Stretch stretch, - TileMode tileMode, - BitmapInterpolationMode bitmapInterpolationMode) + TileMode tileMode) { AlignmentX = alignmentX; AlignmentY = alignmentY; @@ -43,7 +41,6 @@ namespace Avalonia.Media.Immutable SourceRect = sourceRect; Stretch = stretch; TileMode = tileMode; - BitmapInterpolationMode = bitmapInterpolationMode; } /// @@ -60,8 +57,7 @@ namespace Avalonia.Media.Immutable source.TransformOrigin, source.SourceRect, source.Stretch, - source.TileMode, - source.BitmapInterpolationMode) + source.TileMode) { } @@ -95,8 +91,5 @@ namespace Avalonia.Media.Immutable /// public TileMode TileMode { get; } - - /// - public BitmapInterpolationMode BitmapInterpolationMode { get; } } } diff --git a/src/Avalonia.Base/Media/PlatformDrawingContext.cs b/src/Avalonia.Base/Media/PlatformDrawingContext.cs index eb8a93722c..63cbb3069b 100644 --- a/src/Avalonia.Base/Media/PlatformDrawingContext.cs +++ b/src/Avalonia.Base/Media/PlatformDrawingContext.cs @@ -25,6 +25,12 @@ internal sealed class PlatformDrawingContext : DrawingContext, IDrawingContextWi _ownsImpl = ownsImpl; } + public RenderOptions RenderOptions + { + get => _impl.RenderOptions; + set => _impl.RenderOptions = value; + } + protected override void DrawLineCore(IPen pen, Point p1, Point p2) => _impl.DrawLine(pen, p1, p2); @@ -37,9 +43,8 @@ internal sealed class PlatformDrawingContext : DrawingContext, IDrawingContextWi protected override void DrawEllipseCore(IBrush? brush, IPen? pen, Rect rect) => _impl.DrawEllipse(brush, pen, rect); - internal override void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) => - _impl.DrawBitmap(source, opacity, sourceRect, destRect, bitmapInterpolationMode); + internal override void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) => + _impl.DrawBitmap(source, opacity, sourceRect, destRect); public override void Custom(ICustomDrawOperation custom) => custom.Render(_impl); @@ -65,9 +70,6 @@ internal sealed class PlatformDrawingContext : DrawingContext, IDrawingContextWi protected override void PushOpacityMaskCore(IBrush mask, Rect bounds) => _impl.PushOpacityMask(mask, bounds); - protected override void PushBitmapBlendModeCore(BitmapBlendingMode blendingMode) => - _impl.PushBitmapBlendMode(blendingMode); - protected override void PushTransformCore(Matrix matrix) { _transforms ??= TransformStackPool.Get(); @@ -84,8 +86,6 @@ internal sealed class PlatformDrawingContext : DrawingContext, IDrawingContextWi protected override void PopOpacityMaskCore() => _impl.PopOpacityMask(); - protected override void PopBitmapBlendModeCore() => _impl.PopBitmapBlendMode(); - protected override void PopTransformCore() => _impl.Transform = (_transforms ?? throw new ObjectDisposedException(nameof(PlatformDrawingContext))).Pop(); diff --git a/src/Avalonia.Base/Media/RenderOptions.cs b/src/Avalonia.Base/Media/RenderOptions.cs index 5863d0ac58..639498543b 100644 --- a/src/Avalonia.Base/Media/RenderOptions.cs +++ b/src/Avalonia.Base/Media/RenderOptions.cs @@ -1,36 +1,131 @@ using Avalonia.Media.Imaging; namespace Avalonia.Media -{ - public class RenderOptions +{ + public readonly record struct RenderOptions { + public BitmapInterpolationMode BitmapInterpolationMode { get; init; } + public EdgeMode EdgeMode { get; init; } + public TextRenderingMode TextRenderingMode { get; init; } + public BitmapBlendingMode BitmapBlendingMode { get; init; } + + /// + /// Gets the value of the BitmapInterpolationMode attached property for a visual. + /// + /// The control. + /// The control's left coordinate. + public static BitmapInterpolationMode GetBitmapInterpolationMode(Visual visual) + { + return visual.RenderOptions.BitmapInterpolationMode; + } + /// - /// Defines the property. + /// Sets the value of the BitmapInterpolationMode attached property for a visual. /// - public static readonly StyledProperty BitmapInterpolationModeProperty = - AvaloniaProperty.RegisterAttached( - "BitmapInterpolationMode", - BitmapInterpolationMode.MediumQuality, - inherits: true); + /// The control. + /// The left value. + public static void SetBitmapInterpolationMode(Visual visual, BitmapInterpolationMode value) + { + visual.RenderOptions = visual.RenderOptions with { BitmapInterpolationMode = value }; + } /// - /// Gets the value of the BitmapInterpolationMode attached property for a control. + /// Gets the value of the BitmapBlendingMode attached property for a visual. /// - /// The control. + /// The control. /// The control's left coordinate. - public static BitmapInterpolationMode GetBitmapInterpolationMode(AvaloniaObject element) + public static BitmapBlendingMode GetBitmapBlendingMode(Visual visual) { - return element.GetValue(BitmapInterpolationModeProperty); + return visual.RenderOptions.BitmapBlendingMode; } /// - /// Sets the value of the BitmapInterpolationMode attached property for a control. + /// Sets the value of the BitmapBlendingMode attached property for a visual. /// - /// The control. + /// The control. /// The left value. - public static void SetBitmapInterpolationMode(AvaloniaObject element, BitmapInterpolationMode value) + public static void SetBitmapBlendingMode(Visual visual, BitmapBlendingMode value) { - element.SetValue(BitmapInterpolationModeProperty, value); + visual.RenderOptions = visual.RenderOptions with { BitmapBlendingMode = value }; + } + + /// + /// Gets the value of the EdgeMode attached property for a visual. + /// + /// The control. + /// The control's left coordinate. + public static EdgeMode GetEdgeMode(Visual visual) + { + return visual.RenderOptions.EdgeMode; + } + + /// + /// Sets the value of the EdgeMode attached property for a visual. + /// + /// The control. + /// The left value. + public static void SetEdgeMode(Visual visual, EdgeMode value) + { + visual.RenderOptions = visual.RenderOptions with { EdgeMode = value }; + } + + /// + /// Gets the value of the TextRenderingMode attached property for a visual. + /// + /// The control. + /// The control's left coordinate. + public static TextRenderingMode GetTextRenderingMode(Visual visual) + { + return visual.RenderOptions.TextRenderingMode; + } + + /// + /// Sets the value of the TextRenderingMode attached property for a visual. + /// + /// The control. + /// The left value. + public static void SetTextRenderingMode(Visual visual, TextRenderingMode value) + { + visual.RenderOptions = visual.RenderOptions with { TextRenderingMode = value }; + } + + public RenderOptions MergeWith(RenderOptions other) + { + var bitmapInterpolationMode = BitmapInterpolationMode; + + if (bitmapInterpolationMode == BitmapInterpolationMode.Unspecified) + { + bitmapInterpolationMode = other.BitmapInterpolationMode; + } + + var edgeMode = EdgeMode; + + if (edgeMode == EdgeMode.Unspecified) + { + edgeMode = other.EdgeMode; + } + + var textRenderingMode = TextRenderingMode; + + if (textRenderingMode == TextRenderingMode.Unspecified) + { + textRenderingMode = other.TextRenderingMode; + } + + var bitmapBlendingMode = BitmapBlendingMode; + + if (bitmapBlendingMode == BitmapBlendingMode.Unspecified) + { + bitmapBlendingMode = other.BitmapBlendingMode; + } + + return new RenderOptions + { + BitmapInterpolationMode = bitmapInterpolationMode, + EdgeMode = edgeMode, + TextRenderingMode = textRenderingMode, + BitmapBlendingMode = bitmapBlendingMode + }; } } } diff --git a/src/Avalonia.Base/Media/TextDecoration.cs b/src/Avalonia.Base/Media/TextDecoration.cs index e89a7d8826..8661959aa6 100644 --- a/src/Avalonia.Base/Media/TextDecoration.cs +++ b/src/Avalonia.Base/Media/TextDecoration.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Avalonia.Collections; -using Avalonia.Collections.Pooled; using Avalonia.Media.TextFormatting; -using Avalonia.Platform; -using Avalonia.Utilities; namespace Avalonia.Media { @@ -218,7 +214,7 @@ namespace Avalonia.Media { var offsetY = glyphRun.BaselineOrigin.Y - origin.Y; - var intersections = glyphRun.PlatformImpl.Item.GetIntersections((float)(thickness * 0.5d - offsetY), (float)(thickness * 1.5d - offsetY)); + var intersections = glyphRun.GetIntersections((float)(thickness * 0.5d - offsetY), (float)(thickness * 1.5d - offsetY)); if (intersections.Count > 0) { diff --git a/src/Avalonia.Base/Media/TextRenderingMode.cs b/src/Avalonia.Base/Media/TextRenderingMode.cs new file mode 100644 index 0000000000..927d2bce73 --- /dev/null +++ b/src/Avalonia.Base/Media/TextRenderingMode.cs @@ -0,0 +1,11 @@ +namespace Avalonia.Media +{ + public enum TextRenderingMode : byte + { + Unspecified, + + SubpixelAntialias, + Antialias, + Alias + } +} diff --git a/src/Avalonia.Base/Media/TileBrush.cs b/src/Avalonia.Base/Media/TileBrush.cs index ab1ee2d604..d7b818a174 100644 --- a/src/Avalonia.Base/Media/TileBrush.cs +++ b/src/Avalonia.Base/Media/TileBrush.cs @@ -83,7 +83,6 @@ namespace Avalonia.Media SourceRectProperty, StretchProperty, TileModeProperty); - RenderOptions.BitmapInterpolationModeProperty.OverrideDefaultValue(BitmapInterpolationMode.Default); } /// @@ -140,17 +139,5 @@ namespace Avalonia.Media get { return (TileMode)GetValue(TileModeProperty); } set { SetValue(TileModeProperty, value); } } - - /// - /// Gets or sets the bitmap interpolation mode. - /// - /// - /// The bitmap interpolation mode. - /// - public BitmapInterpolationMode BitmapInterpolationMode - { - get { return RenderOptions.GetBitmapInterpolationMode(this); } - set { RenderOptions.SetBitmapInterpolationMode(this, value); } - } } } diff --git a/src/Avalonia.Base/Platform/IDrawingContextImpl.cs b/src/Avalonia.Base/Platform/IDrawingContextImpl.cs index 1359ad6603..cb28ff8d47 100644 --- a/src/Avalonia.Base/Platform/IDrawingContextImpl.cs +++ b/src/Avalonia.Base/Platform/IDrawingContextImpl.cs @@ -2,8 +2,8 @@ using System; using Avalonia.Media; using Avalonia.Rendering.SceneGraph; using Avalonia.Utilities; -using Avalonia.Media.Imaging; using Avalonia.Metadata; +using Avalonia.Media.Imaging; namespace Avalonia.Platform { @@ -13,6 +13,11 @@ namespace Avalonia.Platform [Unstable] public interface IDrawingContextImpl : IDisposable { + /// + /// Gets or sets the current render options used to control the rendering behavior of drawing operations. + /// + RenderOptions RenderOptions { get; set; } + /// /// Gets or sets the current transform of the drawing context. /// @@ -31,8 +36,7 @@ namespace Avalonia.Platform /// The opacity to draw with. /// The rect in the image to draw. /// The rect in the output to draw to. - /// The bitmap interpolation mode. - void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default); + void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect); /// /// Draws a bitmap image. @@ -157,17 +161,6 @@ namespace Avalonia.Platform /// void PopGeometryClip(); - /// - /// Pushes a bitmap blending value. - /// - /// The bitmap blending mode. - void PushBitmapBlendMode(BitmapBlendingMode blendingMode); - - /// - /// Pops the latest pushed bitmap blending value. - /// - void PopBitmapBlendMode(); - /// /// Adds a custom draw operation /// diff --git a/src/Avalonia.Base/Platform/IGlyphRunBuffer.cs b/src/Avalonia.Base/Platform/IGlyphRunBuffer.cs deleted file mode 100644 index c1fc7a5967..0000000000 --- a/src/Avalonia.Base/Platform/IGlyphRunBuffer.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Drawing; - -namespace Avalonia.Platform -{ - public interface IGlyphRunBuffer - { - Span GlyphIndices { get; } - - IGlyphRunImpl Build(); - } - - public interface IHorizontalGlyphRunBuffer : IGlyphRunBuffer - { - Span GlyphPositions { get; } - } - - public interface IPositionedGlyphRunBuffer : IGlyphRunBuffer - { - Span GlyphPositions { get; } - } -} diff --git a/src/Avalonia.Base/Platform/IGlyphRunImpl.cs b/src/Avalonia.Base/Platform/IGlyphRunImpl.cs index fccea27c43..2342f32307 100644 --- a/src/Avalonia.Base/Platform/IGlyphRunImpl.cs +++ b/src/Avalonia.Base/Platform/IGlyphRunImpl.cs @@ -1,25 +1,36 @@ using System; using System.Collections.Generic; +using Avalonia.Media; using Avalonia.Metadata; namespace Avalonia.Platform { /// - /// Actual implementation of a glyph run that stores platform dependent resources. + /// An immutable platform representation of a . /// [Unstable] - public interface IGlyphRunImpl : IDisposable + public interface IGlyphRunImpl : IDisposable { /// - /// Gets the conservative bounding box of the glyph run./>. + /// Gets the for the . /// - Rect Bounds { get; } + IGlyphTypeface GlyphTypeface { get; } + + /// + /// Gets the em size used for rendering the . + /// + double FontRenderingEmSize { get; } /// /// Gets the baseline origin of the glyph run./>. /// Point BaselineOrigin { get; } + /// + /// Gets the conservative bounding box of the glyph run./>. + /// + Rect Bounds { get; } + /// /// Gets the intersections of specified upper and lower limit. /// diff --git a/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs index 81fe2c046f..c37233d52c 100644 --- a/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs +++ b/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs @@ -169,8 +169,9 @@ namespace Avalonia.Platform /// The font rendering em size. /// The list of glyphs. /// The baseline origin of the run. Can be null. + /// the conservative bounding box of the run /// An . - IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphInfos, Point baselineOrigin); + IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds); /// /// Creates a backend-specific object using a low-level API graphics context diff --git a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs index 814ecdba29..1bf52729a0 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs @@ -260,6 +260,8 @@ public class CompositingRenderer : IRendererWithCompositor if (!comp.Effect.EffectEquals(visual.Effect)) comp.Effect = visual.Effect?.ToImmutable(); + comp.RenderOptions = visual.RenderOptions; + var renderTransform = Matrix.Identity; if (visual.HasMirrorTransform) @@ -272,8 +274,6 @@ public class CompositingRenderer : IRendererWithCompositor renderTransform *= (-offset) * visual.RenderTransform.Value * (offset); } - - comp.TransformMatrix = MatrixUtils.ToMatrix4x4(renderTransform); _recorder.BeginUpdate(comp.DrawList); diff --git a/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs b/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs index f81cc5a1a0..ec419e6313 100644 --- a/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs +++ b/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs @@ -78,15 +78,14 @@ internal sealed class CompositionDrawingContext : DrawingContext, IDrawingContex } } - internal override void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + internal override void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { var next = NextDrawAs(); if (next == null || - !next.Item.Equals(Transform, source, opacity, sourceRect, destRect, bitmapInterpolationMode)) + !next.Item.Equals(Transform, source, opacity, sourceRect, destRect)) { - Add(new ImageNode(Transform, source, opacity, sourceRect, destRect, bitmapInterpolationMode)); + Add(new ImageNode(Transform, source, opacity, sourceRect, destRect)); } else { @@ -227,20 +226,6 @@ internal sealed class CompositionDrawingContext : DrawingContext, IDrawingContex } } - protected override void PopBitmapBlendModeCore() - { - var next = NextDrawAs(); - - if (next == null || !next.Item.Equals(null)) - { - Add(new BitmapBlendModeNode()); - } - else - { - ++_drawOperationIndex; - } - } - protected override void PopOpacityCore() { var next = NextDrawAs(); @@ -354,21 +339,6 @@ internal sealed class CompositionDrawingContext : DrawingContext, IDrawingContex _needsToPopOpacityMask.Push(needsToPop); } - /// - protected override void PushBitmapBlendModeCore(BitmapBlendingMode blendingMode) - { - var next = NextDrawAs(); - - if (next == null || !next.Item.Equals(blendingMode)) - { - Add(new BitmapBlendModeNode(blendingMode)); - } - else - { - ++_drawOperationIndex; - } - } - private void Add(T node) where T : class, IDrawOperation { if (_drawOperationIndex < _builder.Count) diff --git a/src/Avalonia.Base/Rendering/Composition/Server/DrawingContextProxy.cs b/src/Avalonia.Base/Rendering/Composition/Server/DrawingContextProxy.cs index 1ec1362a4c..cdce741020 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/DrawingContextProxy.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/DrawingContextProxy.cs @@ -42,15 +42,20 @@ internal class CompositorDrawingContextProxy : IDrawingContextImpl, set => _impl.Transform = (_transform = value) * PostTransform; } + public RenderOptions RenderOptions + { + get => _impl.RenderOptions; + set => _impl.RenderOptions = value; + } + public void Clear(Color color) { _impl.Clear(color); } - public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { - _impl.DrawBitmap(source, opacity, sourceRect, destRect, bitmapInterpolationMode); + _impl.DrawBitmap(source, opacity, sourceRect, destRect); } public void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect) @@ -133,16 +138,6 @@ internal class CompositorDrawingContextProxy : IDrawingContextImpl, _impl.PopGeometryClip(); } - public void PushBitmapBlendMode(BitmapBlendingMode blendingMode) - { - _impl.PushBitmapBlendMode(blendingMode); - } - - public void PopBitmapBlendMode() - { - _impl.PopBitmapBlendMode(); - } - public void Custom(ICustomDrawOperation custom) { _impl.Custom(custom); diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs index 3e88b9e77b..45275bdfe1 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs @@ -181,7 +181,7 @@ namespace Avalonia.Rendering.Composition.Server else targetContext.DrawBitmap(RefCountable.CreateUnownedNotClonable(_layer), 1, new Rect(_layerSize), - new Rect(Size), BitmapInterpolationMode.LowQuality); + new Rect(Size)); if (DebugOverlays != RendererDebugOverlays.None) { diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs index 6e7ef85183..853b90be5e 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs @@ -66,6 +66,8 @@ namespace Avalonia.Rendering.Composition.Server if (OpacityMaskBrush != null) canvas.PushOpacityMask(OpacityMaskBrush, boundsRect); + canvas.RenderOptions = RenderOptions; + RenderCore(canvas, currentTransformedClip); // Hack to force invalidation of SKMatrix @@ -122,6 +124,11 @@ namespace Avalonia.Rendering.Composition.Server var wasVisible = IsVisibleInFrame; + if(Parent != null) + { + RenderOptions = RenderOptions.MergeWith(Parent.RenderOptions); + } + // Calculate new parent-relative transform if (_combinedTransformDirty) { diff --git a/src/Avalonia.Base/Rendering/ImmediateRenderer.cs b/src/Avalonia.Base/Rendering/ImmediateRenderer.cs index 9b7d358b1d..4e264f6951 100644 --- a/src/Avalonia.Base/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Base/Rendering/ImmediateRenderer.cs @@ -97,7 +97,18 @@ namespace Avalonia.Rendering using (visual.OpacityMask != null ? context.PushOpacityMask(visual.OpacityMask, bounds) : default) using (context.PushTransform(Matrix.Identity)) { - visual.Render(context); + var currentRenderOptions = default(RenderOptions); + + var platformContext = context as PlatformDrawingContext; + + if(platformContext != null) + { + currentRenderOptions = platformContext.RenderOptions; + + platformContext.RenderOptions = visual.RenderOptions.MergeWith(platformContext.RenderOptions); + } + + visual.Render(context); var childrenEnumerable = visual.HasNonUniformZIndexChildren ? visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance) @@ -115,6 +126,11 @@ namespace Avalonia.Rendering Render(context, child, childClipRect); } } + + if(platformContext != null) + { + platformContext.RenderOptions = currentRenderOptions; + } } } } diff --git a/src/Avalonia.Base/Rendering/SceneGraph/BitmapBlendModeNode.cs b/src/Avalonia.Base/Rendering/SceneGraph/BitmapBlendModeNode.cs deleted file mode 100644 index b1190a159b..0000000000 --- a/src/Avalonia.Base/Rendering/SceneGraph/BitmapBlendModeNode.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Avalonia.Platform; -using Avalonia.Media.Imaging; - -namespace Avalonia.Rendering.SceneGraph -{ - /// - /// A node in the scene graph which represents an bitmap blending mode push or pop. - /// - internal class BitmapBlendModeNode : IDrawOperation - { - /// - /// Initializes a new instance of the class that represents an - /// push. - /// - /// The to push. - public BitmapBlendModeNode(BitmapBlendingMode bitmapBlend) - { - BlendingMode = bitmapBlend; - } - - /// - /// Initializes a new instance of the class that represents an - /// pop. - /// - public BitmapBlendModeNode() - { - } - - /// - public Rect Bounds => default; - - /// - /// Gets the BitmapBlend to be pushed or null if the operation represents a pop. - /// - public BitmapBlendingMode? BlendingMode { get; } - - /// - public bool HitTest(Point p) => false; - - /// - /// Determines if this draw operation equals another. - /// - /// the how to compare - /// True if the draw operations are the same, otherwise false. - /// - /// The properties of the other draw operation are passed in as arguments to prevent - /// allocation of a not-yet-constructed draw operation object. - /// - public bool Equals(BitmapBlendingMode? blendingMode) => BlendingMode == blendingMode; - - /// - public void Render(IDrawingContextImpl context) - { - if (BlendingMode.HasValue) - { - context.PushBitmapBlendMode(BlendingMode.Value); - } - else - { - context.PopBitmapBlendMode(); - } - } - - public void Dispose() - { - } - } -} diff --git a/src/Avalonia.Base/Rendering/SceneGraph/GlyphRunNode.cs b/src/Avalonia.Base/Rendering/SceneGraph/GlyphRunNode.cs index 1c4e63b34a..764c5c65f9 100644 --- a/src/Avalonia.Base/Rendering/SceneGraph/GlyphRunNode.cs +++ b/src/Avalonia.Base/Rendering/SceneGraph/GlyphRunNode.cs @@ -1,5 +1,4 @@ -using System; -using Avalonia.Media; +using Avalonia.Media; using Avalonia.Platform; using Avalonia.Utilities; @@ -18,7 +17,7 @@ namespace Avalonia.Rendering.SceneGraph /// The glyph run to draw. public GlyphRunNode( Matrix transform, - IImmutableBrush foreground, + IImmutableBrush? foreground, IRef glyphRun) : base(glyphRun.Item.Bounds, transform, foreground) { diff --git a/src/Avalonia.Base/Rendering/SceneGraph/ImageNode.cs b/src/Avalonia.Base/Rendering/SceneGraph/ImageNode.cs index ac946cc8b2..caf0eee175 100644 --- a/src/Avalonia.Base/Rendering/SceneGraph/ImageNode.cs +++ b/src/Avalonia.Base/Rendering/SceneGraph/ImageNode.cs @@ -1,6 +1,5 @@ using Avalonia.Platform; using Avalonia.Utilities; -using Avalonia.Media.Imaging; namespace Avalonia.Rendering.SceneGraph { @@ -17,15 +16,13 @@ namespace Avalonia.Rendering.SceneGraph /// The draw opacity. /// The source rect. /// The destination rect. - /// The bitmap interpolation mode. - public ImageNode(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode) + public ImageNode(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect) : base(destRect, transform) { Source = source.Clone(); Opacity = opacity; SourceRect = sourceRect; DestRect = destRect; - BitmapInterpolationMode = bitmapInterpolationMode; SourceVersion = Source.Item.Version; } @@ -53,14 +50,6 @@ namespace Avalonia.Rendering.SceneGraph /// Gets the destination rect. /// public Rect DestRect { get; } - - /// - /// Gets the bitmap interpolation mode. - /// - /// - /// The scaling mode. - /// - public BitmapInterpolationMode BitmapInterpolationMode { get; } /// /// Determines if this draw operation equals another. @@ -70,27 +59,25 @@ namespace Avalonia.Rendering.SceneGraph /// The opacity of the other draw operation. /// The source rect of the other draw operation. /// The dest rect of the other draw operation. - /// The bitmap interpolation mode. /// True if the draw operations are the same, otherwise false. /// /// The properties of the other draw operation are passed in as arguments to prevent /// allocation of a not-yet-constructed draw operation object. /// - public bool Equals(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode) + public bool Equals(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect) { return transform == Transform && Equals(source.Item, Source.Item) && source.Item.Version == SourceVersion && opacity == Opacity && sourceRect == SourceRect && - destRect == DestRect && - bitmapInterpolationMode == BitmapInterpolationMode; + destRect == DestRect; } /// public override void Render(IDrawingContextImpl context) { - context.DrawBitmap(Source, Opacity, SourceRect, DestRect, BitmapInterpolationMode); + context.DrawBitmap(Source, Opacity, SourceRect, DestRect); } /// diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs index 79cc760fc6..e626dc5249 100644 --- a/src/Avalonia.Base/Visual.cs +++ b/src/Avalonia.Base/Visual.cs @@ -318,7 +318,9 @@ namespace Avalonia internal CompositionDrawListVisual? CompositionVisual { get; private set; } internal CompositionVisual? ChildCompositionVisual { get; set; } - + + internal RenderOptions RenderOptions { get; set; } + public bool HasNonUniformZIndexChildren { get; private set; } /// diff --git a/src/Avalonia.Base/composition-schema.xml b/src/Avalonia.Base/composition-schema.xml index 91d718dfd8..a24c249eed 100644 --- a/src/Avalonia.Base/composition-schema.xml +++ b/src/Avalonia.Base/composition-schema.xml @@ -30,6 +30,7 @@ + diff --git a/src/Avalonia.Controls/Image.cs b/src/Avalonia.Controls/Image.cs index b14cc78e60..7996b982eb 100644 --- a/src/Avalonia.Controls/Image.cs +++ b/src/Avalonia.Controls/Image.cs @@ -91,9 +91,7 @@ namespace Avalonia.Controls Rect sourceRect = new Rect(sourceSize) .CenterRect(new Rect(destRect.Size / scale)); - var interpolationMode = RenderOptions.GetBitmapInterpolationMode(this); - - context.DrawImage(source, sourceRect, destRect, interpolationMode); + context.DrawImage(source, sourceRect, destRect); } } diff --git a/src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs b/src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs index 431989134a..f2d86a2e9d 100644 --- a/src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs +++ b/src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; using System.IO; -using System.Numerics; using System.Runtime.InteropServices; using Avalonia.Media; using Avalonia.Platform; -using Avalonia.Rendering; using Avalonia.Rendering.SceneGraph; using Avalonia.Utilities; using Avalonia.Media.Imaging; @@ -125,7 +123,8 @@ namespace Avalonia.Headless IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphInfos, - Point baselineOrigin) + Point baselineOrigin, + Rect bounds) { return new HeadlessGlyphRunStub(); } @@ -136,6 +135,10 @@ namespace Avalonia.Headless public Point BaselineOrigin => new Point(0, 8); + public IGlyphTypeface GlyphTypeface => new HeadlessGlyphTypefaceImpl(); + + public double FontRenderingEmSize => 12; + public void Dispose() { } @@ -372,6 +375,8 @@ namespace Avalonia.Headless public Matrix Transform { get; set; } + public RenderOptions RenderOptions { get; set; } + public void Clear(Color color) { @@ -454,7 +459,7 @@ namespace Avalonia.Headless { } - public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { } diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index f48d45f961..03288ca109 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -5,12 +5,10 @@ using System.Linq; using System.Threading; using Avalonia.Media; using Avalonia.Platform; -using Avalonia.Rendering; using Avalonia.Rendering.SceneGraph; using Avalonia.Rendering.Utilities; using Avalonia.Utilities; using Avalonia.Media.Imaging; -using Avalonia.Skia.Helpers; using SkiaSharp; using ISceneBrush = Avalonia.Media.ISceneBrush; @@ -27,10 +25,8 @@ namespace Avalonia.Skia private readonly Vector _dpi; private readonly Stack _maskStack = new(); private readonly Stack _opacityStack = new(); - private readonly Stack _blendingModeStack = new(); private readonly Matrix? _postTransform; private double _currentOpacity = 1.0f; - private BitmapBlendingMode _currentBlendingMode = BitmapBlendingMode.SourceOver; private readonly bool _canTextUseLcdRendering; private Matrix _currentTransform; private bool _disposed; @@ -171,6 +167,8 @@ namespace Avalonia.Skia public SKCanvas Canvas { get; } public SKSurface? Surface { get; } + public RenderOptions RenderOptions { get; set; } + private void CheckLease() { if (_leased) @@ -185,7 +183,7 @@ namespace Avalonia.Skia } /// - public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode) + public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { CheckLease(); var drawableImage = (IDrawableBitmapImpl)source.Item; @@ -194,8 +192,8 @@ namespace Avalonia.Skia var paint = SKPaintCache.Shared.Get(); paint.Color = new SKColor(255, 255, 255, (byte)(255 * opacity * (_useOpacitySaveLayer ? 1 : _currentOpacity))); - paint.FilterQuality = bitmapInterpolationMode.ToSKFilterQuality(); - paint.BlendMode = _currentBlendingMode.ToSKBlendMode(); + paint.FilterQuality = RenderOptions.BitmapInterpolationMode.ToSKFilterQuality(); + paint.BlendMode = RenderOptions.BitmapBlendingMode.ToSKBlendMode(); drawableImage.Draw(this, s, d, paint); SKPaintCache.Shared.ReturnReset(paint); @@ -206,7 +204,7 @@ namespace Avalonia.Skia { CheckLease(); PushOpacityMask(opacityMask, opacityMaskRect); - DrawBitmap(source, 1, new Rect(0, 0, source.Item.PixelSize.Width, source.Item.PixelSize.Height), destRect, BitmapInterpolationMode.Default); + DrawBitmap(source, 1, new Rect(0, 0, source.Item.PixelSize.Width, source.Item.PixelSize.Height), destRect); PopOpacityMask(); } @@ -522,7 +520,9 @@ namespace Avalonia.Skia { var glyphRunImpl = (GlyphRunImpl)glyphRun.Item; - Canvas.DrawText(glyphRunImpl.TextBlob, (float)glyphRun.Item.BaselineOrigin.X, + var textBlob = glyphRunImpl.GetTextBlob(RenderOptions); + + Canvas.DrawText(textBlob, (float)glyphRun.Item.BaselineOrigin.X, (float)glyphRun.Item.BaselineOrigin.Y, paintWrapper.Paint); } } @@ -652,21 +652,6 @@ namespace Avalonia.Skia Canvas.Restore(); } - /// - public void PushBitmapBlendMode(BitmapBlendingMode blendingMode) - { - CheckLease(); - _blendingModeStack.Push(_currentBlendingMode); - _currentBlendingMode = blendingMode; - } - - /// - public void PopBitmapBlendMode() - { - CheckLease(); - _currentBlendingMode = _blendingModeStack.Pop(); - } - public void Custom(ICustomDrawOperation custom) { CheckLease(); @@ -914,12 +899,14 @@ namespace Avalonia.Skia context.Clear(Colors.Transparent); context.PushClip(calc.IntermediateClip); context.Transform = calc.IntermediateTransform; + context.RenderOptions = RenderOptions; + context.DrawBitmap( RefCountable.CreateUnownedNotClonable(tileBrushImage), 1, sourceRect, - targetRect, - tileBrush.BitmapInterpolationMode); + targetRect); + context.PopClip(); } @@ -1152,7 +1139,7 @@ namespace Avalonia.Skia { var paintWrapper = new PaintWrapper(paint); - paint.IsAntialias = true; + paint.IsAntialias = RenderOptions.EdgeMode != EdgeMode.Aliased; double opacity = brush.Opacity * (_useOpacitySaveLayer ? 1 :_currentOpacity); diff --git a/src/Skia/Avalonia.Skia/GlyphRunImpl.cs b/src/Skia/Avalonia.Skia/GlyphRunImpl.cs index 0521e238f3..7331740b56 100644 --- a/src/Skia/Avalonia.Skia/GlyphRunImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphRunImpl.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using Avalonia.Media; +using Avalonia.Media.TextFormatting; using Avalonia.Platform; using SkiaSharp; @@ -7,30 +9,122 @@ namespace Avalonia.Skia { internal class GlyphRunImpl : IGlyphRunImpl { - public GlyphRunImpl(SKTextBlob textBlob, Size size, Point baselineOrigin) + private readonly GlyphTypefaceImpl _glyphTypefaceImpl; + private readonly ushort[] _glyphIndices; + private readonly SKPoint[] _glyphPositions; + + private readonly Dictionary _textBlobCache = new(1); + + public GlyphRunImpl(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, + IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { - TextBlob = textBlob ?? throw new ArgumentNullException(nameof(textBlob)); + if (glyphTypeface == null) + { + throw new ArgumentNullException(nameof(glyphTypeface)); + } + + _glyphTypefaceImpl = (GlyphTypefaceImpl)glyphTypeface; + + if (glyphInfos == null) + { + throw new ArgumentNullException(nameof(glyphInfos)); + } + + var count = glyphInfos.Count; + _glyphIndices = new ushort[count]; + _glyphPositions = new SKPoint[count]; + + var currentX = 0.0; + + for (int i = 0; i < count; i++) + { + var glyphInfo = glyphInfos[i]; + var offset = glyphInfo.GlyphOffset; + + _glyphIndices[i] = glyphInfo.GlyphIndex; - Bounds = new Rect(new Point(baselineOrigin.X, 0), size); + _glyphPositions[i] = new SKPoint((float)(currentX + offset.X), (float)offset.Y); + currentX += glyphInfos[i].GlyphAdvance; + } + + FontRenderingEmSize = fontRenderingEmSize; BaselineOrigin = baselineOrigin; + Bounds = bounds; } - /// - /// Gets the text blob to draw. - /// - public SKTextBlob TextBlob { get; } + public IGlyphTypeface GlyphTypeface => _glyphTypefaceImpl; - public Rect Bounds { get; } + public double FontRenderingEmSize { get; } public Point BaselineOrigin { get; } - public IReadOnlyList GetIntersections(float upperBound, float lowerBound) => - TextBlob.GetIntercepts(lowerBound, upperBound); + public Rect Bounds { get; } + + public SKTextBlob GetTextBlob(RenderOptions renderOptions) + { + var edging = SKFontEdging.SubpixelAntialias; + + switch (renderOptions.TextRenderingMode) + { + case TextRenderingMode.Alias: + edging = SKFontEdging.Alias; + break; + case TextRenderingMode.Antialias: + edging = SKFontEdging.Antialias; + break; + case TextRenderingMode.Unspecified: + edging = renderOptions.EdgeMode == EdgeMode.Aliased ? SKFontEdging.Alias : SKFontEdging.SubpixelAntialias; + break; + } + + if (_textBlobCache.TryGetValue(edging, out var textBlob)) + { + return textBlob; + } - void IDisposable.Dispose() + var font = SKFontCache.Shared.Get(); + + font.LinearMetrics = true; + font.Subpixel = edging == SKFontEdging.SubpixelAntialias; + font.Edging = edging; + font.Hinting = SKFontHinting.Full; + font.Size = (float)FontRenderingEmSize; + font.Typeface = _glyphTypefaceImpl.Typeface; + font.Embolden = (_glyphTypefaceImpl.FontSimulations & FontSimulations.Bold) != 0; + font.SkewX = (_glyphTypefaceImpl.FontSimulations & FontSimulations.Oblique) != 0 ? -0.2f : 0; + + var builder = SKTextBlobBuilderCache.Shared.Get(); + + var runBuffer = builder.AllocatePositionedRun(font, _glyphIndices.Length); + + runBuffer.SetPositions(_glyphPositions); + runBuffer.SetGlyphs(_glyphIndices); + + SKFontCache.Shared.Return(font); + + textBlob = builder.Build(); + + SKTextBlobBuilderCache.Shared.Return(builder); + + _textBlobCache.Add(edging, textBlob); + + return textBlob; + } + + public void Dispose() { - TextBlob.Dispose(); + foreach (var pair in _textBlobCache) + { + pair.Value.Dispose(); + } + } + + public IReadOnlyList GetIntersections(float lowerLimit, float upperLimit) + { + var textBlob = GetTextBlob(default); + + return textBlob.GetIntercepts(lowerLimit, upperLimit); } } } diff --git a/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs b/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs index 797c565ca1..ce292eb826 100644 --- a/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs @@ -1,5 +1,4 @@ using Avalonia.Platform; -using Avalonia.Rendering; namespace Avalonia.Skia { diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index a9a79ff0c5..b486f8ad42 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -5,8 +5,8 @@ using Avalonia.Media; using Avalonia.OpenGL; using Avalonia.Platform; using Avalonia.Media.Imaging; -using Avalonia.Media.TextFormatting; using SkiaSharp; +using Avalonia.Media.TextFormatting; namespace Avalonia.Skia { @@ -209,67 +209,10 @@ namespace Avalonia.Skia return new WriteableBitmapImpl(size, dpi, format, alphaFormat); } - public IGlyphRunImpl CreateGlyphRun( - IGlyphTypeface glyphTypeface, - double fontRenderingEmSize, - IReadOnlyList glyphInfos, - Point baselineOrigin) + public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, + IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { - if (glyphTypeface == null) - { - throw new ArgumentNullException(nameof(glyphTypeface)); - } - - if (glyphInfos == null) - { - throw new ArgumentNullException(nameof(glyphInfos)); - } - - var glyphTypefaceImpl = (GlyphTypefaceImpl)glyphTypeface; - - var font = SKFontCache.Shared.Get(); - - font.LinearMetrics = true; - font.Subpixel = true; - font.Edging = SKFontEdging.SubpixelAntialias; - font.Hinting = SKFontHinting.Full; - font.Size = (float)fontRenderingEmSize; - font.Typeface = glyphTypefaceImpl.Typeface; - font.Embolden = (glyphTypefaceImpl.FontSimulations & FontSimulations.Bold) != 0; - font.SkewX = (glyphTypefaceImpl.FontSimulations & FontSimulations.Oblique) != 0 ? -0.2f : 0; - - - var builder = SKTextBlobBuilderCache.Shared.Get(); - var count = glyphInfos.Count; - - var runBuffer = builder.AllocatePositionedRun(font, count); - - var glyphSpan = runBuffer.GetGlyphSpan(); - var positionSpan = runBuffer.GetPositionSpan(); - - SKFontCache.Shared.Return(font); - - var width = 0.0; - - for (int i = 0; i < count; i++) - { - var glyphInfo = glyphInfos[i]; - var offset = glyphInfo.GlyphOffset; - - glyphSpan[i] = glyphInfo.GlyphIndex; - - positionSpan[i] = new SKPoint((float)(width + offset.X), (float)offset.Y); - - width += glyphInfo.GlyphAdvance; - } - - var scale = fontRenderingEmSize / glyphTypeface.Metrics.DesignEmHeight; - var height = glyphTypeface.Metrics.LineSpacing * scale; - var skTextBlob = builder.Build(); - - SKTextBlobBuilderCache.Shared.Return(builder); - - return new GlyphRunImpl(skTextBlob, new Size(width, height), baselineOrigin); + return new GlyphRunImpl(glyphTypeface, fontRenderingEmSize, glyphInfos, baselineOrigin, bounds); } } } diff --git a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs index c66b53284a..a1fdfdbd2e 100644 --- a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs +++ b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs @@ -19,7 +19,8 @@ namespace Avalonia.Skia return SKFilterQuality.Medium; case BitmapInterpolationMode.HighQuality: return SKFilterQuality.High; - case BitmapInterpolationMode.Default: + case BitmapInterpolationMode.None: + case BitmapInterpolationMode.Unspecified: return SKFilterQuality.None; default: throw new ArgumentOutOfRangeException(nameof(interpolationMode), interpolationMode, null); @@ -30,6 +31,7 @@ namespace Avalonia.Skia { switch (blendingMode) { + case BitmapBlendingMode.Unspecified: case BitmapBlendingMode.SourceOver: return SKBlendMode.SrcOver; case BitmapBlendingMode.Source: diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index 826296b055..fc1a358492 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -160,59 +160,9 @@ namespace Avalonia.Direct2D1 public IStreamGeometryImpl CreateStreamGeometry() => new StreamGeometryImpl(); public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList children) => new GeometryGroupImpl(fillRule, children); public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2) => new CombinedGeometryImpl(combineMode, g1, g2); - - public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, - IReadOnlyList glyphInfos, Point baselineOrigin) + public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { - var glyphTypefaceImpl = (GlyphTypefaceImpl)glyphTypeface; - - var glyphCount = glyphInfos.Count; - - var run = new SharpDX.DirectWrite.GlyphRun - { - FontFace = glyphTypefaceImpl.FontFace, - FontSize = (float)fontRenderingEmSize - }; - - var indices = new short[glyphCount]; - - for (var i = 0; i < glyphCount; i++) - { - indices[i] = (short)glyphInfos[i].GlyphIndex; - } - - run.Indices = indices; - - run.Advances = new float[glyphCount]; - - var width = 0.0; - - for (var i = 0; i < glyphCount; i++) - { - var advance = glyphInfos[i].GlyphAdvance; - - width += advance; - - run.Advances[i] = (float)advance; - } - - run.Offsets = new GlyphOffset[glyphCount]; - - for (var i = 0; i < glyphCount; i++) - { - var (x, y) = glyphInfos[i].GlyphOffset; - - run.Offsets[i] = new GlyphOffset - { - AdvanceOffset = (float)x, - AscenderOffset = (float)y - }; - } - - var scale = fontRenderingEmSize / glyphTypeface.Metrics.DesignEmHeight; - var height = glyphTypeface.Metrics.LineSpacing * scale; - - return new GlyphRunImpl(run, new Size(width, height), baselineOrigin); + return new GlyphRunImpl(glyphTypeface, fontRenderingEmSize, glyphInfos, baselineOrigin, bounds); } class D2DApi : IPlatformRenderInterfaceContext diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index 318b0fe9ae..8968c891e6 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Numerics; using Avalonia.Media; using Avalonia.Platform; -using Avalonia.Rendering; using Avalonia.Rendering.SceneGraph; using Avalonia.Utilities; using Avalonia.Media.Imaging; @@ -76,6 +75,16 @@ namespace Avalonia.Direct2D1.Media set => throw new NotSupportedException(); } + public RenderOptions RenderOptions + { + get => _renderOptions; + set + { + _renderOptions = value; + ApplyRenderOptions(value); + } + } + /// public void Clear(Color color) { @@ -119,15 +128,14 @@ namespace Avalonia.Direct2D1.Media /// The opacity to draw with. /// The rect in the image to draw. /// The rect in the output to draw to. - /// The bitmap interpolation mode. - public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode) + public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { using (var d2d = ((BitmapImpl)source.Item).GetDirect2DBitmap(_deviceContext)) { - var interpolationMode = GetInterpolationMode(bitmapInterpolationMode); - + var interpolationMode = GetInterpolationMode(RenderOptions.BitmapInterpolationMode); + // TODO: How to implement CompositeMode here? - + _deviceContext.DrawBitmap( d2d.Value, destRect.ToSharpDX(), @@ -143,13 +151,14 @@ namespace Avalonia.Direct2D1.Media switch (interpolationMode) { case BitmapInterpolationMode.LowQuality: - return InterpolationMode.NearestNeighbor; - case BitmapInterpolationMode.MediumQuality: return InterpolationMode.Linear; + case BitmapInterpolationMode.MediumQuality: + return InterpolationMode.MultiSampleLinear; case BitmapInterpolationMode.HighQuality: return InterpolationMode.HighQualityCubic; - case BitmapInterpolationMode.Default: - return InterpolationMode.Linear; + case BitmapInterpolationMode.None: + case BitmapInterpolationMode.Unspecified: + return InterpolationMode.NearestNeighbor; default: throw new ArgumentOutOfRangeException(nameof(interpolationMode), interpolationMode, null); } @@ -158,15 +167,16 @@ namespace Avalonia.Direct2D1.Media public static CompositeMode GetCompositeMode(BitmapBlendingMode blendingMode) { switch (blendingMode) - { + { case BitmapBlendingMode.SourceIn: return CompositeMode.SourceIn; case BitmapBlendingMode.SourceOut: return CompositeMode.SourceOut; + case BitmapBlendingMode.Unspecified: case BitmapBlendingMode.SourceOver: return CompositeMode.SourceOver; case BitmapBlendingMode.SourceAtop: - return CompositeMode.SourceAtop; + return CompositeMode.SourceAtop; case BitmapBlendingMode.DestinationIn: return CompositeMode.DestinationIn; case BitmapBlendingMode.DestinationOut: @@ -193,8 +203,10 @@ namespace Avalonia.Direct2D1.Media /// The rect in the output to draw to. public void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect) { + var interpolationMode = GetInterpolationMode(RenderOptions.BitmapInterpolationMode); + using (var d2dSource = ((BitmapImpl)source.Item).GetDirect2DBitmap(_deviceContext)) - using (var sourceBrush = new BitmapBrush(_deviceContext, d2dSource.Value)) + using (var sourceBrush = new BitmapBrush1(_deviceContext, d2dSource.Value, new BitmapBrushProperties1 { InterpolationMode = interpolationMode })) using (var d2dOpacityMask = CreateBrush(opacityMask, opacityMaskRect.Size)) using (var geometry = new SharpDX.Direct2D1.RectangleGeometry(Direct2D1Platform.Direct2D1Factory, destRect.ToDirect2D())) { @@ -388,9 +400,11 @@ namespace Avalonia.Direct2D1.Media { using (var brush = CreateBrush(foreground, glyphRun.Item.Bounds.Size)) { - var glyphRunImpl = (GlyphRunImpl)glyphRun.Item; + var immutableGlyphRun = (GlyphRunImpl)glyphRun.Item; - _renderTarget.DrawGlyphRun(glyphRun.Item.BaselineOrigin.ToSharpDX(), glyphRunImpl.GlyphRun, + var dxGlyphRun = immutableGlyphRun.GlyphRun; + + _renderTarget.DrawGlyphRun(glyphRun.Item.BaselineOrigin.ToSharpDX(), dxGlyphRun, brush.PlatformBrush, MeasuringMode.Natural); } } @@ -433,6 +447,8 @@ namespace Avalonia.Direct2D1.Media readonly Stack _layers = new Stack(); private readonly Stack _layerPool = new Stack(); + private RenderOptions _renderOptions; + /// /// Pushes an opacity value. /// @@ -546,7 +562,7 @@ namespace Avalonia.Direct2D1.Media return new ImageBrushImpl( sceneBrushContent.Brush, _deviceContext, - new D2DBitmapImpl(intermediate.Bitmap), + new D2DBitmapImpl(intermediate.Bitmap.QueryInterface()), destinationSize); } @@ -608,8 +624,28 @@ namespace Avalonia.Direct2D1.Media { PopLayer(); } - + public void Custom(ICustomDrawOperation custom) => custom.Render(this); public object GetFeature(Type t) => null; + + private void ApplyRenderOptions(RenderOptions renderOptions) + { + _deviceContext.AntialiasMode = renderOptions.EdgeMode != EdgeMode.Aliased ? AntialiasMode.PerPrimitive : AntialiasMode.Aliased; + switch (renderOptions.TextRenderingMode) + { + case TextRenderingMode.Unspecified: + _deviceContext.TextAntialiasMode = renderOptions.EdgeMode != EdgeMode.Aliased ? TextAntialiasMode.Default : TextAntialiasMode.Aliased; + break; + case TextRenderingMode.Alias: + _deviceContext.TextAntialiasMode = TextAntialiasMode.Aliased; + break; + case TextRenderingMode.Antialias: + _deviceContext.TextAntialiasMode = TextAntialiasMode.Grayscale; + break; + case TextRenderingMode.SubpixelAntialias: + _deviceContext.TextAntialiasMode = TextAntialiasMode.Cleartype; + break; + } + } } } diff --git a/src/Windows/Avalonia.Direct2D1/Media/GlyphRunImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/GlyphRunImpl.cs index 2e7a4b67f6..df147c4525 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/GlyphRunImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/GlyphRunImpl.cs @@ -1,31 +1,106 @@ using System; using System.Collections.Generic; +using Avalonia.Media; +using Avalonia.Media.TextFormatting; using Avalonia.Platform; using SharpDX.DirectWrite; +#nullable enable + namespace Avalonia.Direct2D1.Media { internal class GlyphRunImpl : IGlyphRunImpl { - public GlyphRunImpl(GlyphRun glyphRun, Size size, Point baselineOrigin) + private readonly GlyphTypefaceImpl _glyphTypefaceImpl; + + private readonly short[] _glyphIndices; + private readonly float[] _glyphAdvances; + private readonly GlyphOffset[] _glyphOffsets; + + private SharpDX.DirectWrite.GlyphRun? _glyphRun; + + public GlyphRunImpl(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, + IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { - Bounds = new Rect(new Point(baselineOrigin.X, 0), size); + _glyphTypefaceImpl = (GlyphTypefaceImpl)glyphTypeface; + + FontRenderingEmSize = fontRenderingEmSize; BaselineOrigin = baselineOrigin; - GlyphRun = glyphRun; + Bounds = bounds; + + var glyphCount = glyphInfos.Count; + + _glyphIndices = new short[glyphCount]; + + for (var i = 0; i < glyphCount; i++) + { + _glyphIndices[i] = (short)glyphInfos[i].GlyphIndex; + } + + _glyphAdvances = new float[glyphCount]; + + var width = 0.0; + + for (var i = 0; i < glyphCount; i++) + { + var advance = glyphInfos[i].GlyphAdvance; + + width += advance; + + _glyphAdvances[i] = (float)advance; + } + + _glyphOffsets = new GlyphOffset[glyphCount]; + + for (var i = 0; i < glyphCount; i++) + { + var (x, y) = glyphInfos[i].GlyphOffset; + + _glyphOffsets[i] = new GlyphOffset + { + AdvanceOffset = (float)x, + AscenderOffset = (float)y + }; + } + } + + public SharpDX.DirectWrite.GlyphRun GlyphRun + { + get + { + if (_glyphRun != null) + { + return _glyphRun; + } + + _glyphRun = new SharpDX.DirectWrite.GlyphRun + { + FontFace = _glyphTypefaceImpl.FontFace, + FontSize = (float)FontRenderingEmSize, + Advances = _glyphAdvances, + Indices = _glyphIndices, + Offsets = _glyphOffsets + }; + + return _glyphRun; + } } - public Rect Bounds{ get; } + public IGlyphTypeface GlyphTypeface => _glyphTypefaceImpl; + + public double FontRenderingEmSize { get; } public Point BaselineOrigin { get; } - public GlyphRun GlyphRun { get; } + public Rect Bounds { get; } + + public IReadOnlyList GetIntersections(float lowerBound, float upperBound) => Array.Empty(); public void Dispose() { - //GlyphRun?.Dispose(); - } + //_glyphRun?.Dispose(); - public IReadOnlyList GetIntersections(float lowerBound, float upperBound) - => Array.Empty(); + _glyphRun = null; + } } } diff --git a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs index a08c96c40c..e0611b5870 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs @@ -7,9 +7,7 @@ namespace Avalonia.Direct2D1.Media { internal sealed class ImageBrushImpl : BrushImpl { - private readonly OptionalDispose _bitmap; - - private readonly Avalonia.Media.Imaging.BitmapInterpolationMode _bitmapInterpolationMode; + private readonly OptionalDispose _bitmap; public ImageBrushImpl( ITileBrush brush, @@ -40,8 +38,6 @@ namespace Avalonia.Direct2D1.Media GetBrushProperties(brush, calc.DestinationRect)); } } - - _bitmapInterpolationMode = brush.BitmapInterpolationMode; } public override void Dispose() @@ -103,8 +99,7 @@ namespace Avalonia.Direct2D1.Media context.Clear(Colors.Transparent); context.PushClip(calc.IntermediateClip); context.Transform = calc.IntermediateTransform; - - context.DrawBitmap(RefCountable.CreateUnownedNotClonable(bitmap), 1, rect, rect, _bitmapInterpolationMode); + context.DrawBitmap(RefCountable.CreateUnownedNotClonable(bitmap), 1, rect, rect); context.PopClip(); } diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs index 740efe833f..ac21d7cf6e 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs @@ -1,7 +1,7 @@ using System; using System.IO; using Avalonia.Platform; -using D2DBitmap = SharpDX.Direct2D1.Bitmap; +using D2DBitmap = SharpDX.Direct2D1.Bitmap1; namespace Avalonia.Direct2D1.Media { diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs index 940d4673b5..2373a90ebc 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs @@ -1,7 +1,8 @@ using System; using System.IO; +using Avalonia.Metadata; +using SharpDX.Direct2D1; using SharpDX.WIC; -using Bitmap = SharpDX.Direct2D1.Bitmap; namespace Avalonia.Direct2D1.Media { @@ -10,7 +11,7 @@ namespace Avalonia.Direct2D1.Media /// internal class D2DBitmapImpl : BitmapImpl { - private readonly Bitmap _direct2DBitmap; + private readonly Bitmap1 _direct2DBitmap; /// /// Initialize a new instance of the class @@ -22,7 +23,7 @@ namespace Avalonia.Direct2D1.Media /// or if the render target is a , /// the device associated with this context, to be renderable. /// - public D2DBitmapImpl(Bitmap d2DBitmap) + public D2DBitmapImpl(Bitmap1 d2DBitmap) { _direct2DBitmap = d2DBitmap ?? throw new ArgumentNullException(nameof(d2DBitmap)); } @@ -36,9 +37,9 @@ namespace Avalonia.Direct2D1.Media _direct2DBitmap.Dispose(); } - public override OptionalDispose GetDirect2DBitmap(SharpDX.Direct2D1.RenderTarget target) + public override OptionalDispose GetDirect2DBitmap(SharpDX.Direct2D1.RenderTarget target) { - return new OptionalDispose(_direct2DBitmap, false); + return new OptionalDispose(_direct2DBitmap, false); } public override void Save(Stream stream, int? quality = null) diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs index 6b1ca911fb..2a3bf617f7 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs @@ -5,7 +5,7 @@ using Avalonia.Rendering; using Avalonia.Utilities; using SharpDX; using SharpDX.Direct2D1; -using D2DBitmap = SharpDX.Direct2D1.Bitmap; +using D2DBitmap = SharpDX.Direct2D1.Bitmap1; namespace Avalonia.Direct2D1.Media.Imaging { @@ -14,7 +14,7 @@ namespace Avalonia.Direct2D1.Media.Imaging private readonly BitmapRenderTarget _renderTarget; public D2DRenderTargetBitmapImpl(BitmapRenderTarget renderTarget) - : base(renderTarget.Bitmap) + : base(renderTarget.Bitmap.QueryInterface()) { _renderTarget = renderTarget; } @@ -53,7 +53,7 @@ namespace Avalonia.Direct2D1.Media.Imaging public override OptionalDispose GetDirect2DBitmap(SharpDX.Direct2D1.RenderTarget target) { - return new OptionalDispose(_renderTarget.Bitmap, false); + return new OptionalDispose(_renderTarget.Bitmap.QueryInterface(), false); } public override void Save(Stream stream, int? quality = null) diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs index 533a29f68c..2fa1e5bd7a 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs @@ -1,11 +1,10 @@ using System; using System.IO; -using Avalonia.Direct2D1.Media.Imaging; using Avalonia.Win32.Interop; using SharpDX.WIC; using APixelFormat = Avalonia.Platform.PixelFormat; using AlphaFormat = Avalonia.Platform.AlphaFormat; -using D2DBitmap = SharpDX.Direct2D1.Bitmap; +using D2DBitmap = SharpDX.Direct2D1.Bitmap1; using Avalonia.Platform; using PixelFormat = SharpDX.WIC.PixelFormat; @@ -22,7 +21,7 @@ namespace Avalonia.Direct2D1.Media { switch (interpolationMode) { - case Avalonia.Media.Imaging.BitmapInterpolationMode.Default: + case Avalonia.Media.Imaging.BitmapInterpolationMode.Unspecified: return BitmapInterpolationMode.Fant; case Avalonia.Media.Imaging.BitmapInterpolationMode.LowQuality: @@ -184,7 +183,10 @@ namespace Avalonia.Direct2D1.Media { using var converter = new FormatConverter(Direct2D1Platform.ImagingFactory); converter.Initialize(WicImpl, SharpDX.WIC.PixelFormat.Format32bppPBGRA); - return new OptionalDispose(D2DBitmap.FromWicBitmap(renderTarget, converter), true); + + var d2dBitmap = D2DBitmap.FromWicBitmap(renderTarget, converter).QueryInterface(); + + return new OptionalDispose(d2dBitmap, true); } public override void Save(Stream stream, int? quality = null) diff --git a/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs b/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs index 34878bd08d..86f461673e 100644 --- a/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs +++ b/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs @@ -51,8 +51,7 @@ namespace Avalonia.Base.UnitTests.Rendering.SceneGraph bitmap, 1, new Rect(1, 1, 1, 1), - new Rect(1, 1, 1, 1), - BitmapInterpolationMode.Default); + new Rect(1, 1, 1, 1)); Assert.Equal(2, bitmap.RefCount); diff --git a/tests/Avalonia.Base.UnitTests/VisualTree/MockRenderInterface.cs b/tests/Avalonia.Base.UnitTests/VisualTree/MockRenderInterface.cs index d494c47a55..37adb03628 100644 --- a/tests/Avalonia.Base.UnitTests/VisualTree/MockRenderInterface.cs +++ b/tests/Avalonia.Base.UnitTests/VisualTree/MockRenderInterface.cs @@ -78,7 +78,7 @@ namespace Avalonia.Base.UnitTests.VisualTree } public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, - IReadOnlyList glyphInfos, Point baselineOrigin) + IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.Benchmarks/NullDrawingContextImpl.cs b/tests/Avalonia.Benchmarks/NullDrawingContextImpl.cs index 40d504a0ac..3513843367 100644 --- a/tests/Avalonia.Benchmarks/NullDrawingContextImpl.cs +++ b/tests/Avalonia.Benchmarks/NullDrawingContextImpl.cs @@ -15,12 +15,13 @@ namespace Avalonia.Benchmarks public Matrix Transform { get; set; } + public RenderOptions RenderOptions { get; set; } + public void Clear(Color color) { } - public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, - BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect) { } diff --git a/tests/Avalonia.Benchmarks/NullGlyphRun.cs b/tests/Avalonia.Benchmarks/NullGlyphRun.cs deleted file mode 100644 index 5b584f302d..0000000000 --- a/tests/Avalonia.Benchmarks/NullGlyphRun.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using Avalonia.Platform; - -namespace Avalonia.Benchmarks -{ - internal class NullGlyphRun : IGlyphRunImpl - { - public Rect Bounds => default; - - public Point BaselineOrigin => default; - - public void Dispose() - { - } - - public IReadOnlyList GetIntersections(float lowerBound, float upperBound) - { - return null; - } - } -} diff --git a/tests/Avalonia.Benchmarks/NullRenderingPlatform.cs b/tests/Avalonia.Benchmarks/NullRenderingPlatform.cs index d40abd9f47..55cd9e8d4b 100644 --- a/tests/Avalonia.Benchmarks/NullRenderingPlatform.cs +++ b/tests/Avalonia.Benchmarks/NullRenderingPlatform.cs @@ -124,9 +124,9 @@ namespace Avalonia.Benchmarks } public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, - IReadOnlyList glyphInfos, Point baselineOrigin) + IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { - return new MockGlyphRun(glyphInfos); + return new MockGlyphRun(glyphTypeface, fontRenderingEmSize, baselineOrigin, bounds); } public IPlatformRenderInterfaceContext CreateBackendContext(IPlatformGraphicsContext graphicsContext) diff --git a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs index 772d6e1023..1b5083924a 100644 --- a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs +++ b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs @@ -111,6 +111,29 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } + [Win32Fact("For consistent results")] + public async Task Should_Render_GlyphRun_Aliased() + { + var control = new PositionedGlyphRunControl + { + [TextElement.ForegroundProperty] = new SolidColorBrush { Color = Colors.Black } + }; + + RenderOptions.SetTextRenderingMode(control, TextRenderingMode.Alias); + + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 190, + Height = 120, + Child = control + }; + + await RenderToFile(target); + + CompareImages(); + } + public class GlyphRunGeometryControl : Control { public GlyphRunGeometryControl() diff --git a/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs b/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs index 43f15e0fad..0851760987 100644 --- a/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs @@ -35,5 +35,49 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } + + [Fact] + public async Task Should_Render_Circle_Aliased() + { + var target = new Border + { + Background = Brushes.White, + Padding = new Thickness(8), + Width = 200, + Height = 200, + Child = new Ellipse + { + Stroke = Brushes.Black, + StrokeThickness = 3.5, + } + }; + + RenderOptions.SetEdgeMode(target, EdgeMode.Aliased); + + await RenderToFile(target); + CompareImages(); + } + + [Fact] + public async Task Should_Render_Circle_Antialiased() + { + var target = new Border + { + Background = Brushes.White, + Padding = new Thickness(8), + Width = 200, + Height = 200, + Child = new Ellipse + { + Stroke = Brushes.Black, + StrokeThickness = 3.5, + } + }; + + RenderOptions.SetEdgeMode(target, EdgeMode.Antialias); + + await RenderToFile(target); + CompareImages(); + } } } diff --git a/tests/Avalonia.UnitTests/MockGlyphRun.cs b/tests/Avalonia.UnitTests/MockGlyphRun.cs index 4561d3b3f2..805c0b6a8a 100644 --- a/tests/Avalonia.UnitTests/MockGlyphRun.cs +++ b/tests/Avalonia.UnitTests/MockGlyphRun.cs @@ -1,33 +1,34 @@ using System; using System.Collections.Generic; -using Avalonia.Media.TextFormatting; +using Avalonia.Media; using Avalonia.Platform; namespace Avalonia.UnitTests { public class MockGlyphRun : IGlyphRunImpl { - public MockGlyphRun(IReadOnlyList glyphInfos) + public MockGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, Point baselineOrigin, Rect bounds) { - var width = 0.0; + GlyphTypeface = glyphTypeface; + FontRenderingEmSize = fontRenderingEmSize; + BaselineOrigin = baselineOrigin; + Bounds =bounds; + } - for (var i = 0; i < glyphInfos.Count; ++i) - { - width += glyphInfos[i].GlyphAdvance; - } + public IGlyphTypeface GlyphTypeface { get; } - Bounds = new Rect(new Size(width, 10)); - } + public double FontRenderingEmSize { get; } - public Rect Bounds { get; } + public Point BaselineOrigin { get; } - public Point BaselineOrigin => new Point(0, 8); + public Rect Bounds { get; } public void Dispose() { + } - public IReadOnlyList GetIntersections(float lowerBound, float upperBound) + public IReadOnlyList GetIntersections(float lowerLimit, float upperLimit) => Array.Empty(); } } diff --git a/tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs b/tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs index 720755f2b0..8647461c0e 100644 --- a/tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs +++ b/tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs @@ -5,7 +5,6 @@ using Avalonia.Media; using Avalonia.Platform; using Avalonia.Media.Imaging; using Avalonia.Media.TextFormatting; -using Avalonia.Rendering; using Moq; namespace Avalonia.UnitTests @@ -149,10 +148,9 @@ namespace Avalonia.UnitTests throw new NotImplementedException(); } - public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, - IReadOnlyList glyphInfos, Point baselineOrigin) + public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphInfos, Point baselineOrigin, Rect bounds) { - return new MockGlyphRun(glyphInfos); + return new MockGlyphRun(glyphTypeface, fontRenderingEmSize, baselineOrigin, bounds); } public IPlatformRenderInterfaceContext CreateBackendContext(IPlatformGraphicsContext graphicsContext) => this; @@ -162,21 +160,6 @@ namespace Avalonia.UnitTests return Mock.Of(); } - public IGlyphRunBuffer AllocateGlyphRun(IGlyphTypeface glyphTypeface, float fontRenderingEmSize, int length) - { - return Mock.Of(); - } - - public IHorizontalGlyphRunBuffer AllocateHorizontalGlyphRun(IGlyphTypeface glyphTypeface, float fontRenderingEmSize, int length) - { - return Mock.Of(); - } - - public IPositionedGlyphRunBuffer AllocatePositionedGlyphRun(IGlyphTypeface glyphTypeface, float fontRenderingEmSize, int length) - { - return Mock.Of(); - } - public bool SupportsIndividualRoundRects { get; set; } public AlphaFormat DefaultAlphaFormat => AlphaFormat.Premul; diff --git a/tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Aliased.expected.png b/tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Aliased.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..f13080906798e6ee198da1917ec03dab661242ce GIT binary patch literal 1132 zcmV-y1e5!TP)Px#1ZP1_K>z@;j|==^1poj97D+@wRCr$P*zIoHFbsv^ZufuB8-&GM(%A_qi=TQQ zpy)qaqK;^`UjP6A00000000000000000000000000000000000fINOYegjc{J$`H5 z%5Ik6OE(|A-q}OCt5burtf9D01YajA_-86zhKRbotxtyHX^RrM=1jqVmh}>3sn>t? z`T6*b+D5=KUCNB>c|q`d$q=?ofj_k9_!$eE$*506jiTN=B|7+oxQEQ=c>4EG^dCjD z1&dmDwTtRer&TqPu2uWKR>2=4)-GA^>UG@>mSvqXoZq`OT)rbBJcrB&dL<(G&t__7 zwVv7Y^Q_P1yZEn8E#n}y!MWRD&SVVz@LZp_@2VVpivz8~IzX#E2hzjGcSQyNQ)s;l zRZ&!Zv<)ZaIWp?(Vb#~MMd*j>!QXk@88UwrQ-84|g1>uMtJ0iX>d+4vJN|Rg(iadl zb(rz_g4k=-?FaAR6Vl$we4(>-{IkL_?qInNqt3vW#E!JKr5coH@Chfre<0!@WIH}7Yx46ca^hB26OAdzvd_}jv!6W#d2eeBVr2F(} z79|@JqfRX&@Lr*B-9$13Uvoe^jyp%#H9_35PAb*~k{p(H4HnOo(u6O{s=Z71TJn-H z>hv)JSTckWqJuwkP#o?*N7$)}l4bBC$AStY$t=RY0HaPl<5C|#m{c|Rbh|&e1e2_S zFF6S7@a`4{E`S1~PCr}#0jsVnDg51cd%WYjh<6UNLB6vV={v15WXhuBdxb;tjM>0s zGxmD?Xmr{Ca*R6lXfFWaKcVd)64?s9a*tkLGbv52wd;~T+jGCmtnT<3yGzD3tx_^{ z88GV9Ck=n+2B1dpai#UwWM%L(ca-kkE;6JgYfH!93**iM!N-+)#`<*wTvNOFM!!Nyo{uRs{3v_@zFBcp*KzQcZeQwQ*NTRqeMZ{w&jvsJr%a&w9-`Ji6aI9yw(R(kBS+_PXC_D)>fs&!x9?-r zsbePagGK0PpLy(IW*?tCKl|hJXEq>Rbaa=oSf})vnOL5~s(NVGc>8Q;iXwTbWwA9@ zueDn6JO)mG(sMD8M^U2cWRJ6gb*6}1d?#Vlh<-%{#@iP^nWH-8D>^Ex9k?&Sx z)afBp=t^7wP4GL81c$17%N(-kwY`0}W?_=UOjk?0|G@;N{K#GanxNx$-SlQ3me^~ z6;sl+z5YVwcdnSnRDK#a?f3O2-C&T&y0QM1AQ@FgDbNs}B?Zx44c+Ej&oU_4*;7J< z*{iI&FWhzNvDZkL^cU&99vJ6yCE|H9t|>cZuGP&17ez&40xWHfgP1D%6&z}6D&3ku zcqotMk^9)fhHzG8eSMwSu*y{gYR@NyRFaW7dhZ zLj06XBCys}xMJ;G{fN)Mr(TYHftx!M`O;2bUmxAAb3Zwmi24r27h^8<=ic7lD?Yl( zfq$=>;B^JF;EQ0s6l;m2cSGzGN!~C~%E=@@5tUAfg~a&YXYvd8(p0~yvMF;49&xY5c6}#&PsQg9ED=X#Q{kj%oV3qb zYTLtXg8Fu&hntIw7QtL>Cu7wn{QKJTXxvPlKc&(0VZulwEH?k8g>skB`j_8lDlm~< zP`9(@q^-VcSHrZB{w~A1LHHP1ZjuSXeZF3mDf9Bpa6wJN!y-TlguFRkcn|)2iSmrT zP_oH+(*os!qaRlXRhu7^dvcJHk_HiLVc!>eT0eqk-!>lJ#CY+TDJaBP23eq=Oz-yJ-$nnP0$!DT5Mo^5CR-eD8~O`$~2UcwX%L<0zvp5Qfi6|B9<7Mh++!&_ZY zK!c!Y)c-wRR?=vAPgo=Js!~)|R4DhQKnFs~Du-FXU@z)U{PvFr?_*dCg0MCJoM4#WRTkFBL8IW zaJ&^NKF5_#z=O|y?HNut3A}9f^#euk8D5m@-ol3+v*omlos2dkse@@6QQgK)+nseT z-c;6_fbKEd^T1<>tkG)}Bjohqd)i{6oMTHYLsD8&LVH12_ma77nC#8!Ow;w{#CO{S z0+U6)MR*UeWnZmgCwd3yN?-x6knAY%$A5se^Wz#HYE1Y86;XYq_nE3+(p<&7;lSwX{$W8ASS~W|wZjtzbgdh9+ z`&+Qa8-7F50b5!X%<-Ztz-;Lc#SWTgza&#(#sc}vKJHFPLf$+3;8|k%D;?BR%Jzi# z(t#34{E6iX|0BAp%M)#`{eFyfv^ghB$R&jNQv=2U^du&Q7G6XOX8 z{8%u`b+LV}8!a+3zvWz1UT#ur+IF~NW@bj@nHd=s6*3#%K|n|-gHJ##`yYn6V(3M^U zg&TCsX(+*tMuxQgA?+J>?lr|?D_(E#@oB4DhlYmGM{uQNuZ;gtGhK|7cD_}+xV`E< zR)3fK*BoSYZ0riW)Kk<8;&pW%^UN=2TXP@tx(EbEBqn}U*L*42yCf?wFU>@JDr2x( zoq@;PRp{N#FA2#Cy2vEsfyO9*VWFYNRFHDhtUFD?WV;FR!>SV@gD9H5Z+EW(#g!-` zJe)Rs-1H`3nb|beZ=$y`mN`!d6LYd}CW`NC^LjzbQ*zo=rAogPhsbCaiVLB5N{f0` zA4k`MGngw3bGg@!G;ab@089KUDLZn9MlRBnyLb?iVC(VRzu(N#fd~HD~a{W`LDboBW}ZX?l%f2_-51W7DGB9@f8{768d%gCK3f=&_vwEH3{yTIyFDILd}GW;{Zr(` z8md6O_#K_26XKarj>w~URDmYvsBNE^6|uD4snhE4RW95!)krv5?60hlq0FGd76z1m zdY~-||Dh(KpVIXrPp#y~Vj01n2_??7jlODkLIG(_V@hE;b9Bn-(|`9Mc*L@FK&@*w zevoffOXtG;^LM7E#?A*+4jX^&JE*3&_pUiZw94b35rZ|dd&UBr-9Wo=nq$ApXS}FW z`Qi6DPSA)5X-WE^knoo(gU)7wCKB&d7hh=OQBXNRwZS8}ubU2}Z~m_ZSd56u2RWFq zv9XCzb9pv4HbfE<5_I82XUjZ^U*KlxpG8|hke{sQT`V7*n#P0}{@c&UBjY_#J9KO} zrw!|vKTHXGual9J4_f6&=0=#BO-za59u@_7tRv-Ka8q4Zkr7OKKU8N4o-@%XnwbzR%n_f;b1|-C`R(0Ozg|kB zdX52WUbnrXdZ$YB66XK4z1yKI5OL&EsX?HuQ=|a^jdZo*&8r?i<$Fy-2N!7VXzP zH8<{V6*hfGc*jOzAp(iBPkBELBL+~aQo#qYk%yn2B6cU+553}wNa*r%to*zzKbmui zv=}@g6(i=)P2;ic#zbdOM+P@fXtL++aV$Trkn;TedpC|Ghq;rCr&@@8WP=zI;?-^l zO_dNvomMsv*{=i}8JO6jTMy#Oo%TmTKEGcJo&lOVjQUX3aDjj4RQP5Y_WkMUp%k`jO(p_>v6=vx3gd3`F0r(~C6+6Rxup-ZDoI-H zegugBrKGRpcp-0KnJHN+75(U!cECsj?9CdmQg)i0eC0?vF!s>&$hv78cG3M$JL!}& zN)FYuJ|<86xrEKW&kXcZQ#KNRio{~=EC7MLdN4yhO9o6pvuJ(mFe!2%`HZIxp`R(A zjs^xac99AvVZl$UPC)O%at#fgW!o3PcX*EJwCZz%yPaoKf#Hm=$w)w8x=2f7vYl{7 z`y%D?MTb)Q!kLkdd&y_6$hTGb9i)6k==$K0=MX11jk}15$RKtLoWjJe`8%N@7Z!-Fwul7&B%GmMyj1>5uKeKCtyHl3j zURh!PRSQltpBRl9Z|}x$O-6Q4Yu^01L@;?b;Q(gVFtoDWl5`$tr`i7Q&5WO}43W|d z+!JrmCU=%SmL8J_Gdq0U^+H7?I(JbNe)?NmzPwBGrpr}0xm2ycnwmb<_w-B_l)^jI zS1AvRe0Ls|x^13y}X{3+HNR~mUldx1H( zR%*x`!O@k15UKM}Je>}OA1Hb60#*7V*TfIQmR*w}%elkgi9gNf7}pK9e6Y_^ID^)& z$bzS)q1a`x{>qd8wBLnDE32?pQgVdQN-ovhr9aI^*J6^()!cz`&ASY+bFKU{T%>%A zw9~c0mT%rXPs-AEt{o{L2H*JG$E72?m)m94%_{Zo?~#boovUQ__sRuqSvtByPqv@b zm%@?8L$)0p#I_$Gnz+0rWX}Xw%vr6~?edUt3}P%M7Q^ zxweXNPSTfXqmxv7TkDbS`rmO!3^(Cn(k!`A&5kX{iu>22g{PhSd8wjmEBnS&;xK)k zTE9+LK&j%YZ(;qP@_(=ys9q>zlzVb9-9?urBIUpHz|%;pL~CSaV&Xj?%t}BZdXvKb zIoyg%eGZ5Z>eHlZ-iB;;s5>lrjo(UfyXNFgOD z^g*$0NKyPkk@DP}Ay_A+b|`*T^rt%z@}hzb>Sj% z{u!RuaX@&=sJmzt-dKVmd4PPl*}uf`<{$c4_T{HQsBmcD^umIJZ}=>a#t$*V{#zd* z8-Aa&sujx@WheZi2WmV!|EZMi`fNOXv6l`*E@6YAFmmhv>`IzV8b7ppRdTYk-?K7# zRDS3?Z%F-T0=t*yGTmPCc1454T-4>Ht8`JD1^~j7E=#%gDloGc9AL8>O#o4)yG*G| zjA&l?tMUYO!(KnHn;CG!YV#7vAiB32mqD;(Jx3*bFwVAXmYL;hPjH8!}7Kz%>K2|xVB&WH2_S`$^tX% z-trF!kY2p<-`>B;HZjh!Ysc6NBrG#26o+rBlnEuU+C89OIB7coWzbbxn}R=Tg8A>? zzfYt?XY=;$i#O{3y~nTKq$KL)*~m{W*ZL#j@5B&jU#OBME|B6eof@WX0ASyr)3()d zF;QdkGN^&^Nk26p>S!yZ!GA4zYB1Y1?6H7UjglMuu)3)L&lC~qg@n*P5ujN(X=Q-* zE`4`N+sDmwhETSJ=Pu4JEwn?T}qXqhWp}m9?Dof*#<^K-NF$M1h?y zhIFTfG+QHWb#z!I&Vut_&GjQr7I5)V{^Whl{w?8nHOYS~DS(@|txhO*f3sU58G$IV zbet>-`H$pK(CXKk>i^S9U*0S&mmz}SQO-M{cmRqyX+XVWdJ)g$m78UG*x0V;9aUzL?*v4*$`_YC#KBC5LpZ3W6c$JzK{1FgNM4pF$ zi_~Cw^I$Q%zVPZ*qSD|q5B-Fg)!*CvRL=VpXP z4!?!U18%w3WTM>s)ZXv&y#2s?5=S`VF)=zIj8PS^YxMYi&Ge8cg zcNtmy>(rALwg#d}gK3_Xw@E?=rZ#Oyid!#omhdh5Ev@sfNV=jcN5ay_W`pk&(Nno= zk55?H3h6(iNwa(LsCUdskiM@<0-?2yqPJ>jgsK~D&cCYJc|QK_z##&VgLFz<>6ahP zd?bJQ$SN?+G{i+7_7nY8;?h)>U(~^4%Qr&ySsYrbtmj@VAzmBZs6}^*5V5+WVf9HA ze72I~_4h&fK5LuJY|3{z+F|wjt_FtPYMuCE;n7sE{3WTQpJS zbNPj)Cutc5%k4vfc?shaW;OTX(WdRp9$|1*=m33c9Uy}7nuX3VS>@&>Oy<>vA`K(*0l@r(=Dh-+a z>Y;0*I2#EWPEagx2j%teVYJ&(7^F2|qFwF^I7wu6{4=Zc)9ndr8K%%*HCxO+g&hL) zR_5liNu_|AR9tKy&TOm?S0ngK-Z(WEPUWE-Q7pl+#WG-i%w~AgP~u63tql~L5w*gXx?QKdh5S+%$Aoo( zgaRlzSXrVNl;#E7Q|L+x(oCyS=j7%}i`xGK zlY+Nb`5T#w-tzBfq=7GXjq0fzjcf&&D&!7jd{$TI7&+)=uJQJ>&!5Pck+(mQ3OwlPTU4DW+Fv9bl*{2a>?YTvajU>L{s`S0x9!Lb5g0 zQr;l5v$_qMO(=bNXQ7vd4&I3t?LRhOt&~u44JkH#m3sMDdXFKotSRO|l(;##%pm=};-a|!MIaxUO%8zp& zt!f|Wz#~`#)fqRgtfEV^a}3Ip;coALX{Vc=&dC0cmsI{->*SY{lM|DXfh@zZ;jS~& z{QGFJl>q@oNr&;Bwb`_iDBh<-h~n8CATH9;v)^{L3#}S+eG^QPu>rY^fWJ9@sRUCZ zt=IFr@Tyr@LI3bw`(H6+W^b(*QHO@h?J|~ZSL4WSa383C9FB3`HS`fc#Wr*HJu9Yn zSXfvBzS2&?btIeUHAsp4};w_ye1#EB(I6X`FMg<&;Fx` z+wwXTiN!hrvyu6E9KtBQ*W3L}m>51+amZg<@zk~Z$kI$hD55)U$@>VuU(jlER?#P? z>}s9JtCHe!*d|q84LYjcM(8MCbaSO16CM>nc*x+h**W$~6vmp-6CBPF{3Gs5eld0G zoM5aW{RqWvm8TO(**BMmUQ+~8Jh^)V>9nXd;yWzpt}D2r*~aipK5ww>^|6kYDydl| zlaE2hq)zG&0dsYqC-+N;=GT9!Nb1NiP{qk%umKI z+R-s9*8Ltcp^nYwtgJLB>G2K99PNw;^6BZh?rGdmdG8IKAXv@=6kbd03Pwb&i>fY< zo6YvoQlcdUR8JowR5?zvdWo0yfNJhS$&XoZtqxsR_G+2z7J`u_LRPH1t-sQDw%_L_ zQR#72e3p%7dR~s$NGWlvOzmNg=;TTx$*X<^<`;l4yDr|9l90wmhKbJj_J0Uc&R^Ia zq^zH8j5(|83W>(vpdg0B-F~UDj1-5-PPQ(#a+Pd@1y?=lnabzCW{FoQYv~k+EEs2w zVX7-iP{E-hC(GVmY08$qz6PC4E%iQkM7x&Ce@QLlt5-%c?O}?Rdx<&V1X zq|8N2POMw?F>3Df^85ZQ^*m`&_H;ex1cMdIX#$VpNqs|D_3XmJ@_`Lk@)?2R8BQVY z26tS3zVA?MM5;4vOX^*DvKOqp_S^O=-3jFF>3pqH+8Vcw)cR@iD%r3u0Lq`-$9ca( z!UI{X`QeF|8W6HooC=wNaOAC{BGVM&!=DJP3?Gc05G&%argd^(K>HgRTvn>LY2{B2 zu5>dwOOKECm*{UTJ=_2B!~{2{6+KFKDOC7zY=sl2a|0TepY8i^#UDow4UP2X*#(U1 zxspse&*&un<_sWl99~+rH8S9hU(jUWg;}W{=3&gns#v!v>@&hYZT{3upBOkXmD1LE zOmgeT-v{`G*eCfyY}tCLOGl~;4=`q#84Fdu_W=lW@EoTb8>`BpOvF9Y)vXzWmdwqW z_^68ibzlxAkLIr6OwM#vv6--=6~9hztXK!f2fBh)a$;G+i>t$9?b_+UC8}Xa!NxGU9QN-g0cYTa1-@B0 z@eQn{3TsI*Q5A%e0w2wR@rWunWUp(MYUVs(ZrYIEs|TIX27<202V1;p_Z*NERFgLh z(3!r4gunG=0`2%K8wgzAagpfB+v1!F&(5plf0*g1d-|(-dT4;vMe$eoIkhV-)&sD|Bnw_ct?n*5qkH z`bBps5DN^xgL(80;Mz1Rlv&(yMfuW~E?uInNGV7pF*~nkio1B=FrEkM(=Xz|Dr}r0 zfE^FS0UHy$tc;@g4jjzR3r1LuUd7M%go7_1PwU0EP|SDxoeQU1>%IT<2h<==Q<$)bZwl%7KhC{i5=;-?*SQ1(Her*qaLCl zk5`y5{;@)teFuLdcee-+Jas8@c~Gk`pCQv8%Ulbejq@j9paZnk)9)099vazrwGL(2 z?n8<^THI<4{r!>kJ*w*Cc-ZF-!k}80y$+seXb|)1?uO(){{T3$U*+-)zM;widztL5Y?h~v1 zlKMc%P!OiYraXWQO}9gy09o<9t>KkFS123a-<<0vnwgoQOTyyxIn9R=XbvMBkRU)L zx-rae|JE|i$UNICs9h}aOx7E=IEB70tll3#()KRc`Cwouga;t8o6(4%&&sevyeLRG zUmjKUXe|uLbS0uV$^b=)-+bVS>BL8W)$2cW;efU~vEd9X{yN&)U!DjEFyCPAL>Mir z@_%z}BjCaUHN5dSd3UkFgdgS!C5y!F&YkL+8e3M`b{8Axy?ffjQT)K;Gc58)Er;8K z3Lp=f!&Z`4k`&>`!vL-0WPyd1%(C^)hZFN6e=VTOmQ}HBeOkHrKVP+A4~>kjee(8h zMdJpJ#}CvuVt5J0z}s&mh7NICxz)r-x8Eq8mEp^oUK+*K5tz1MVXLBkY^;Qzd6W%U zzip#AI>Lxgb&xz({EL>Sf1a#onCR%xPb`2&vVd6>y`6*^}?oLsmn-KD-TknkEj zqhPrugp!^cXe)qCz0zj3{Mi@;bBp}A;=+CgT&a91@zQ9xnRfIs#@L5(IOhDaZ(=VKGo~ztf{vCI|T(pw*a~a(-NrAG~!#-R6dh`+hs~ONLlJd z(7{#(rC$307CivQS2-B`xD}T9O|};xEnvnHp7FJ-=YikF7|FhmU|ilA_V+i18%8$d zGx@b$<}88P^lat19WEe>&H5%eLEjZ>cenEB0{jDIMB5!#n%?v7fWfJFR}GUN^7d{l z+xgY_;0B#_E4z$3INg+kt@xLm8)e^2*PIW*K-Q|obZTp%?#B*3&{uO*pkaOvTiIMn7Cm#o%9O^6?_2 z7JYVkZNp@8?_+sB(!Ox`a0T5BHz1)qs3Jd`G+q_-Bkq59 zN~0aK!zt9wlX+^t7+D__TM~R2fswyy&zVC4U7Y8xL*t-(LD;TL+3;9TA#7`GvZZSr zSO!8p4dXPT{kV9d%;%ao-3wULo0~=TQ&WaMiDY-~eCl1o61N@2o1Nt!&!sKj92}9p z2vX_jw)a^av~Ol|28^)`S2b;1#U^Ze{p4PBL4Fgqd)KANbBy>$E8aAk={@Qj`Q8>S z040kXb;K3Fy5|6=EwMun@%peHj^YA6)K1&h0^&}skjqaSWzJF~gjR;}?D)S&MW`Joz0H`|Gihj=<;)goCR0eK~vsRa}D#)y_Ro9MJdW{?8{ILar)>z=1Nbe!Bc%q+gOP z(63jM=@AgpH=r<-xI|5DS%TYfagZl3Be7Dc`1UMXSE}x>Ay=U4z~)R|G7MsPh`<{3 z5me%evk_DT$VhXp-@$)`gsuu3N(rI=D?kdr=lgdLQHMyx=xBoIGaO}r4m$|%diicD zALIc!{J|0ytCwN!0&LF2F@CrRK?yB1)K3>IMlfG%zj@w0vob^$0tBEDJ{Pq&=>W12 z=4k)=*|-2uz+OKHu8shC)Wm)ZYYjA~yIBbkeic4%&l!BVQR_ZJD+&Q z#BjQo#D)g&THbnX2igDi$tr>?F}hv^>_J^;igmn)#Af$ma>lFSu00&!U#Vfd2J*<(?ypoQ8|B=1 zp!=cJidtN46LYfwjMzoh=_2&ARAW)MLKsBuHrv(27I{qz{w;8^zb$JI{uVgNQ z?wZY54t+{p?4dLMPNX4VF`R}Pqgz)>!A$| z4OJ>P*Q&l~jqWYC=>mb8uI{sq0YX4DhjB-5wfSYk1>rQ?Z@Nx$4TwXrAG9$(pIOw| z*4Bnp5Vm4*UG?Mwf!5dS+_syCS^Yl`d+Mr=wGH`w^QAC6L&OY{z9}1cd$*CwD;5FV zA9gN)O99ZjVl$qIsVRJrw>inVv*aT|mqEgDaH)bzY0ccDw=@JOYZT~{gB&T|=o^P9 zNfJjuXID^W?z$wJT{x~^4C~{oF#qPd15#Mq3C0VUJdT_^YfGB+Lx`w z7+MTW)P|+}YImWwFuMIZ2_H`GLOeXsc3IZuR;qndAi1qh+1qDtjGYCCevJiD z3lJmCEps1^ITL||Zk9RG%Go-H`La z5b!F+PxrU&J|}|)yrE&VBIFK0#}%kiVC~=W@=t7GxH<7JGR}x4&>t*r)ZbK)#P2yB z0SILl$$+OkJ7{~C#smr7Cdh#_{;*}2oQGB(Rl}Sg0>m{S&w$RDRe$4)Y9swxT=H{d zwaLxH$;wVuGaWvcp9*U+?C6oXD*_zI0B-wmU?5Ha&=!oxu^S$Hy}A1OYmWOI{)(ih zSw#4OHML%^ntI9yQ;gG$el9M4Yytw^vanduH4!F_40cY(itq27yut2xxO0#%S!@2Ds?$<*H1Kxe&gRfq^Z z36hqn1AlU&G;?`XX=R!>hX z9|-s3n*d|{qF|^bPT^Dd;ah!sZuj5QDf`aZ(NDLS(oh0TIcnd^4(pcGN`LqD(w6XF zE6?mJ;yFc?AI7oR_ZYT35 z1;9ITnSXAZ^aXx&WvMMEER3jRJFmNwN_E0Y|%tr_CWPyW0*$-wwwdHC-`0nP?^85KihldygRz&qCDeq*nVVccHW zK&o(FV~9e!bV6Sp?{6&-F=FH=I4s&fq?#Xq8|Z)?R@nbd<6KGgn#)~s9QUE8{RlQ~ zi7Eb~{WF9Y+_-g-4{#w)_vw&*9`lB-XqmZdr-awlyYW0rkGU;l`RUh+sShP-_8d+C z4LpEy9V#NUwCs0z3+lIRZrfL2drFQxPY@iGdb-*=VYf5a)~rlC0(*J5zut36gA9K` zH~W(-m2YM`U%6`oU>dyLYUm zDy&@b?nmXK8#44ZOx0aCXGceS`gB8^lyZ+Ki+I;%Tw-drv869nVfe9*Q5_KE;%C-s z+BH=Cp)5_sPa=&;25%_eZgXG~t~q{Nq(2Iu<0QHMX<8mkhHhUD0P0V6-vW_M9lR_~ z*oY`Y58XjAu3z@~yUok2Ai`6j&*6gGF-03fyFOgDsU=2%TnXlI z$-9#X57K7C$5CgkR+H!hY!nr3fBNrSglN#TiC%!Q#X>FO&C$ z*#`VYmH9lnV*56|v&g@d`{T5)|4;5|ubYjV7b~_WdiIw?cLr+Qh!Dfw3IcR%OB*wE z;bi+TOl&-~5@cPGn_h}X)xM&!-)qZrXSOnjqiWQ#HWAL&i)np*eRNcUt}ovhr>3UT zvM@7CnHwpz^xVrJ9ccz}{?>Q#Hka*sWK>l)d!;COrXiJ6B9J0@r}-DP4E_aHR*Y>f z26f2pECpaauukbzAS9%xOFL|*Y#7wLQz{JlRT_p~p}3a|`q zh5iUN?^|J-zQK=TmZCA?Nm?zFmlW_w))PY zxlz*d>1Ec;12**`MiB4txoQFfFje0<+&pjsj6tfhMdVRB41fg#?;MsTv0p%wlasri z8>02>3kVA-PumL**%x)@_cyPqdS*HThj+<{;2S2Ogof-eHjA~!YbKwPJnNpB2y6HU z2FhF|K5Mvnlmd%^8=oc??Tv-pAI0rTFS>AUUUZHkPitD<>@TgMTZ^dO`B1NC^*j;7 zVaA%-a6m789?seEDd0IeFxt;}4sg{UqPrjAW`y?wym6uq7A8q^x}{sl-}E=#qwNpn z%g5igHNGelv(0REcd|mbsq~rqFue5$u|HE=YM;yG;FlWTGu~;X8dQ zPgJ#?44H@Z)vXF5g547mwBvm{MaL|GNHC%2numX)Q@6Oor(irZdiIJf>-+ukgVz0( z()i3740k|icSqkRtnP>kLmR))VbrI7?2r1q`^)$6paAz~xzb`9$>O~ytW~Rk$y|?i zXNa_NF6tAWUFKB4hQHX>{ zfZG(h@XVpl8c2clOTZO~2B@|1*Fz#V$WV4Bq1+!wvzH2A6}UMX%U2&1)T_(K zhP-^Ft(=tR0d+Ppc@zbM<-htcBmdbbs`W7)MjQ~=g0qK4DZ5Gx&F2F08bDpMRQtW9 zUq9$pa}mdf(kn=FhPCQuMtsb;8JlnMyCi6Z>!Z*RRHjg24i4k&lAS7um``~Py%6`U zO=ZeK7fVqgnX9fC@Z1Yi2kQTOiI&66vi4;&vd_%kXCZ#qkz21yH8;Pk#PWo=u+ zNdMvT`^+l(^zxEd{j;>uHf|!da4Hw&-A6WCxD8g`dy!dovW!ZwZM~10brhte!I$1Q zX{!>=+tFz&pY-t$@m<&etoyQDx&+Ewtxg+obG3SCF*p@sIxoN2Aj+)9(R8h}(b zmltE1Xl|O;nbaF{kG>t!iEhL8f1axcqzueXUqt4v)N$D;jGpnf%3w-^a{U zZ!Vl;b4e3e;8}^j=q$ybRaC^Pk8kx`*Ng$DjrXi%OkG8BZlYFsBid>;km1cAi!x0o zXBAC^o5Up~fZ5BD5KB$9RDgsG{qb8UCtg`EeIl z{4)NKT)LZ30dQKGvI{@>0#i#Zq`hQ*6^ocsrFnJrTTv&#a!6SxmL=GJ*5p-@?V=~F zdAVg(Y56_$JNe$k1DTct*>dxeC+`c|?)@f#BoGr6OP^gS3-SrTjZCCcwagX0wymk6 zg6fau?;0h^6uc}(O0aA7dXdJmu4KIsfV!XlFDGFY+Wzb7xA ze~Z1GEJ&TN>XHa8@CEL8roY6L^PN3D(1SAIG;QnlKB9h169n5_as%DBvIw zC|T-RJzwp7&u?jc6Yb@`YoK3hDZ>a%wU15iUEZPrt0=%S*A8m>tS~_=Oq?&uea_tj z?$(xI-Q(QC=?3st=4-QGG76Q<8Xzqy{xjRv0l~= zzTEc0^yP-aJ-AC>OiF5GdmOvF!-`8MHeZ79PrtSR)~`R2%OZ}Tys6NlJ{DXXL%8g? zVM$aYkYPfdZAV^feSC;kb}9od_3W*R_}pW2>2nn#8jUg{vU##DbSlC(n<)qcyO z_z8Y0bhn^BheS81-x$@-0x5zS+7kaXgNxptZ;U@S7YZ9`X_4Lp(3<|d1CG}dzW$#O z3M(x$rUw|VXLwzKj^X+uKwVIj_a>kWc~Uj(?1_Fcl!m|3mFL$lL~Xt^(k5j2c2$$S z@~MKw^4(etRDSEMyUA3NVFxa}IC4ycl%l}arV%Vi1qTcD`_bsF$SejHfH`@Hr@FDW z0;RXItzY`e!sBrLqvd|zaG_O~cs)ax!uA_GyB@glVBWzf`bOn|A}k=rX{%r|g}T&KE%um{&>8jE1OG)`QU2SwcE8HcOVJ8- zrrA$&EzKo|z9FoLn=nKr{Dx=y)nrSfF1=6R^~+}=8+6T&kGtz?M@p9#cW~`Xs_>y} zua2|oeST3#ytK!hYj(u&-p@BStm=B^pLSTpI%E>nR(sV~sj*u>cBQ{&7ZtMEhG7=& zw8kH6C$R&x!_9($uP7%x4P+6(7~-9>*^h0Co9k>(89C~OG6XhC&!V9UwbsZ%m7w~sTv>-VVv&9A5%{!3Lpw>Hk_@g^Zh$WP}qym!pp1 z-rZ_}RJ;XlN~xUo$&h@W=PB-ir2O;{!El#hJ^)gG6ihCXD! zCAiqY_1GP)TQb%RFI&-mToYYwp%Lvr_yBc^r4*ntlDLF*>9yO&@aS{JA{=qheSyw z60lWkT`FlMtj8Rn8A~rhl*@Y?*BU(&HLOj!Sotj|Zb6PY(FwSgkL(i+UkB8)4qEM; zRqEx{%ca?=pCW7uSLt?Z1Hzv=S*__*>qa;(_Ots$4Ou?iuna;Dz9!xV`fXw9JamK%c$N-?xFzn6VM_O( z^QLuzSH@S9#;N0j+9OsUdTQv)H+fNnKTWblA*=$Fk_7SXu8%VFtm8}=?{nVYjbLhC z_sTjdlTK|+6dK<0u30w#S25kb9U_)_GQT`6XS_93=hjSvvgYv43!55!Ot3xoLTs2n zDqbUWJjpk{a3o)^jT>VR-NC(0xrzTak8Z8I*E-Rqic^> zh{zwS)1d^L8nbvC8;8W0`aSW$GKQ7?{6!1WQIFL)HZtFY@6zl&e^IyCe134~^s%8v~?JzY}88z(5_VjO^@?moO@JHdm`edjn;F_Dw~$<=xx+^}HD;VQ)eM)NeG6iA9WgXh_npHPx{oa?94M=q z<-J6x6Oit4h~YJn0x*rGU-%{+hJ|@cBh)%2#1yYoQ;ys4S18?(!@o#{epMVI?-U)b z*-v#PdchdaFnm=NHVY;S&I#wIu~OzSiDqE*gF6uS=ZtM6^rfL&k04?gV1n`>PTxTy zl|QVz0fGic(ND6(5oQb|`$8)$A(m@HLouQ@zidk3!>=P+@5MUlmZ;Kx%rf8}2}a3J z93m@CwmZH|w=aof9po}!V~8xDFFOD3fbpcXj)0mT;ZA0xF%)I_c=oEv+Zk*dS!ho{ zlLK~pPmh78-XVaWaa*$vH;)hO7{bLjJ)wLy3k%KPObrdik|yoDufn3QOR+3pF?)e* z(pGr$Wy+U`no_`8^v#By8F1*tPe4QV?HE3bNG9@M5^CM+q=Aks0K_!LbGA#$>CJxt z_~Q?q4QS*Z3htMm=u=I9LRIbNBBATyZY`DJGR}Ea*O{E4Thk zD%UqNWV*#T%XjwE;Q&R8aZ`^Kgp?JSXn~!c8#jzEg(y%Z6c3zm|1HnY7f-;Y&Rtd1 z1y-yEHmd6(MqyV4?){n#*5uOMh&DM8fj8m&lK@>e_vbLcHu1SYJ6K8(YE6B(-l=kQuM|9 z&hA$^0u$@x&o9(H8r}1N`|9Vd+37vnr!cEEPyS4lPV*Q;u)n(9Ep{!WDd9)N%SYzJ z@5aoJos^3U@Y~}6WHN>NKsYIos)#u77 z#9g-^{W+SZy^Gn8tF^TAkKxo;50E@7RLiKk9NnaOq`2oumiSqTZ4y4c%cua>UN0Eb zmD(;AS6xqtC8oCH^tk3isfF@3d=K?>=fTi45K|q3g|Buq3NYN1`O8)DXz_-1DI{}vao$u zQ5q+Sn669K>YC@CjBe*yn4%keCr0jVPEle-8}JUj5$Qh|RVyxGTCBO*lpHvacc6ky zDVQt@AlmLuQ3`ggSv}e(ia*$|jhJODE8Nn)} zJ<=Z(IaB|R+%KTN*{(G9S3Q&vkI9ez@ce%JxdJ+j8d26k(mNRXkq@~<2E2dZ`g0_NT=A-{~eCwWcewQk*z+BoHu_eg!^!o#F z+RMrWzCczCCUje}35IzGUbt}$={DzQXNI6=Z64&e3{eGRh&M!T0$+Z#RUOy0S7lA9 zDPk^Hu-O4$DFGI$9NUjWE8EjGF{)}@388O@feg=Rl)CWo^oGi4!Kpg3GpA23E-=8B z@7^Pk3sXLH26#h%L=5I@5NKyeNgR;hvXr7`8Nv>!;!)bMwumLzkd?0);zB%S-zfUs z)00ajJ^J?3hY^YKP~hqhP+ab>x}x1yQuzJ%k26~Eu3w9r-gFjGRZcoYLC}sBBO8ay zb5Aj2=hA#?^--H!tkVY|HgnI9SyBi#L~``xWo0EXpwG)Pe6TkBsfzxGF1EBPvg)|a z0oQ`8K~9aP;pS{dzR;Hdy(2bsr;8AJ7olETW_3U68!tI6a0LLMV*&UgaHmJK1G-&_ zW)wPXRAZ^ua#I1*LBp3aWB$L!zB``kJ^o);a$DS#kkyhxHf7h%$gVgp8U4zcX@1 z?e~|8aV|hL#5gpms&+WMuexNbjjTG=l9sWzj=$vd^~A~CbgeZnVHk22Aj z`^dS2kOMzIsr>j{bv;(thg*^ISMCqlt-BJxQ}wp%^*Ro!2pURh5~gpYNrcSA3^0PVtcha^IExwNr1!f-sUYfCh^l^-ABVKw-zQdIpoy5vgP3OZZrliJMPXAlfJ z>6#-3Y^BY@Zrb{~gk#!nY3>40w#FW%eiGC;$<~n-9$muG)lL^# zOOHI<6QJ}_r~#ME`TNQ|o8-d08&9Jq-hh>Au4W(3UekB!O!wD%l?I!$YeBIWqa5)J zo}Its1qiu1Fo_{_4Og|+qQP6gTBoselI=?37?pr$v9-WcQqN02y3mO)c?_qTitsTY z9377Bev`YtHFO)TYBT#CK4gxaQyGeP>eV1Cn)lkx>U_BIM=~VUy+c48H&^Gi*@Wq& z<KE`g?iK6i-Q;SG20-cdtBn zyPWJ6_#~=PZgeUkmL;FB{raIzj13BK!lD@GaFiih2T^o0Q$e~8*|nEyxXfvh?~=-h zuUuG;z8M?*gMf2A(Rc>wBMcG#Vsier&9j;TPBPWS;Y)7UNb7RxBRTIvYTN!H9*rGg zw9;}}@u!mOct3HCTWi6RhhAAAK9@mfQS_C#!{qZy)zyVqHbngDcyci47fu~dzOYhb z9nQ42(y>bW4||y`649#JHwSNO6dENQtke@)7eW|v-T20V+=)6v<+-NQo^x{w9^a6c z{N;=Oq1L{mDtmAj!IgI|?ei)J7CFcn=G6@6FfGsIWf;7<&KdDlk5(E&MC_N#fzI3) z2AX(V>X?HSVY{4X%}D+hrB^rwpc$)hCX%GfKS$*9C(bZBo)eS=Kj=1a?EwyJnEYqp zXX?KS#!ifNvQI@MOHs;=r{=8L_Q|SGYI}TvC=={>GwqjX3?FpO}{Y zm*o9upj#n7f*qWjn;WuRBTV$qz~LA)6p8RjH-CrOl)?rpJ3sG@=)?fe{7;vA#fZ!b zfC&t*5B1M|Y6RJ+bR|dA_uIFRsakeDy*kviKB-jx(+lNG6N-YAi#nzD z%92ZXq{ZOoxca)%Z%4@150xQE;uk~q_i8pv@1PX%LX%e&5vX%@)ib;fJZ;d=^pmt% z`~ZzHhXxk1e$HI8FLxBt-89-LV5dP(h60}}Ry~OH8yyHAr9y@{)yixY4Jj#|iY|I? zPLqASr-1O|4e`n6e?jF(P8Lcq_a2{tW&qKf@k~Ov!i)5Si;}0mg z)IJVyw*$DSowrd_m6eZ3Vh`@uSs$?w{~iM7W2^bHDv={dkuBw~k|4BxF(6>C>J`h8 zR@sYZxVd~G&mOno#GxijH_lj>fy~2qJ7W%rP5tPjSpvE%C}64GQCW}t$JxJhbsHV} zkF{rHR8xF0J)NMF@BpFAgJ!76;H;KY?O3{%pwr>HZz&nKBthpZI!Axrm$apiB|Gcs ztA08EdNFn_w-Vz<6!4T3vsx~yj9mqmnw7)ZK1K|(dKw*fH4OJR_@3M~+Tcsz3`^~y zIP=by{1sB^-}B+qr>D~M-pRa(s>6`o$$`9un$yiW?XuKW#b?baBXMnQ&7;R)ok9L5 zyD*lCy5>5s>uF4X=@43Ej5ArKX0RRFG+{vGr*z4Sd0^AALe=w%?*N^-E%^`$X|Y+A z1??MFM~dcbxBA|V*Q4mqD?QZjj!=%XA4zHYw=3Wu=}O)<9HH30zDy+gXYlwWX`7ZO zQvm)#a>5{-@f4}W=i91}a|KxwWDAns?~+^G#@W6rK=hM6K&s`YCcjtET$ouHj8)_s z%Q0LJJ{1q6gel1w@aLZAFm3;=ke-&5-F*$>I`pe-pW-sFv@;<|dG;Qp3f8F3wHGt= zoMYqNtVOjh?31AegcPT6N&deioiMaYH&vhK>Ou@j_Xd9Ah@mkM>k&;(IT3U8!JeEJ zZ0p!6_OGJbswY&Uy{c5Ap5olq&!>ShlgD^`cWo*_UTAcKo1Ar%6pZ69cu>h?El+w( z-yH#(?m;g&?43MffKsMwPmh-uvf9--^t({V+u{c%#FG~0=IvSKQ=2^L6h9!GgHr0G zU~;!_VOEDilGxn>tdrn1E4sYWT6}f&MM3M?6lV>w7yN>=&EYmu{z6MOMF*w&I(r>qZxM^x}zOqMM2f_2f#qk3Q?_F$J#EWMV^8 z{8aR)nalhF`}0Nx>uI!Y=%4QEFvtxruI{GyrHp>e=s@*>9CvyC?yZYQA2#loZDzKT zQd=uz7F>;7#vCxO#NqZHA0=u%7R{c)HmfSmTAXY5*%}02mWDQZn%t?X)7$L-1u3zi zXy!Un2A%2^4kkn#0udEVL-al1WCXRC%<0~c`k3sxTWi(0LE@FS*RQoR(bKnO-di13 zbqoA)#%<;dO}A9@$tPa7zTN#6k{+R8lv}bAeuwc!7p^v9#is8{#m&C+ovn{oXJ%&A zROO=_7l)^rb7Xpw5V2H>fmsqp;Kor4i=D6b|Gv-hKpcp7z$-a$`gFhS8!?^XFk)L@ zC35FPbaUN82bKulU-Op)1Eetf%0zUycPEXQ7S-NvwO;Hlw3tap4ZPCS99z?u(V)JN zZcyUvTt!G1q*XkYzRV?kxQB6K3V@-YIvdLL7^9$kAY9EfLN&$nH}No68w#82*N-@U zcc%l4(H()#$jExiDURz0FROaqq!|TK%feo9yHNiLw85QMZTruY*AL@eBJi_Xeb&vZ z0?$Wkbs$#yv9mZS_0HfV=1krF8#U zo-U03tX~HDO3U`;n?#Kg$w@0lr?1J^gtvZ|YJq*&u&awjjeT{gV1+YT(jUJKU8d*n z$1H|^y9);h=J=^8{Ku4gDti8d%qvho^N)cWU7`LkFS%;&c5L<7w_VnYG3S%NQ|(^7 z_wWIk5OQ&86VJxKp|T#noea?dn15=Z8Ps>a;&hozW3m;avZMv+xUHWRMP3k5t6GNX z&1V0`koDoihg*&vx}j-LVE4t~j=KUjPv9C&=k7uuB80BcwwY-yYtdkllhr7p+g#}s zj$d>V1vUMPalu-Ij@@uV0t)TG(`H4hNO{Q}sVHI%i{|T7y;zQ=3+*aO60;=W(%@3^U|S;<55N`uhHFh;txmfmE(%@3;5OB1LA&$k-tD zep`#KH}xgy)+#C%StpB^+i%hcU3xFg&XVUsV7)fGlX84b*t8G2rj4IEE$eP-Cf=Yn z231Zwht;q9o`E=*k5@V4z7H$ez8SJIzXP%?5!gC%j$3}1f|E`C>1R*~O5QHuiRV_j zuq269iC(KwJ+2}#<5L*|`faDJJ2H5+3WJr^zQ5Eh0lY%&+_k&Q{%ccG3d^i(eQp=G z`@}>4$X2Z2?e({-v3=sq1;wIYGFiFLvoi02X#z=Zc%U&d>IwCTlcMHE=|LvH3%K;8 zJt%(l>hP31v^D4>a8heJhMMeXqBkrIwg~x`n|zL;<`|{E&viVC&HxYboIjjAHyhr} zjVlm7Qq>mrb6@-@*3~E^#h+V(^fZXZc=8)5 z1EX7C^Q;=GWH-Ze25|EJiXt8O^$485q{2u2Q_bk9>vC@y-u__hxl7dAxLZykAVHZNGdRLBBc|VxUq9&H<1BD$7p^{^W7ps#c=>JE;}I9`=?FC^8|R{H#)#IC zhpKK9F`u3Qj2YI|{Vxg340^UUARmGnzEXtcd7;Q%H6UTdIkL=}~>#ywASpQ>1 zeq?@t;8^(%Y=wW&N>M!wJY=@_J*(Y4@@C@Bi5ELH!`fnxoxFrK(G*E`)Y?m^4R8ZW zdYp)#6h_@?b`sRDqrSw4H8%@$chY-pW9&X6oAIwR7xMV%oDuF>st<@p7^rq%rhpyr zN3^{2Tz>0u60@4C6y1QIDo+Wu$W zG~<$uM2In!MuI=_4^SnC1+hzHJj5?1k5ABBxa5M5HtFp7c|nYGAS;o?y{I24@LrjY$7q2!_JSfJL8lNC{V2wfkkuh87LKNMPivtZAgzg=v< zZ@gBu$r+BbMn<=QmBDQIS>gA4Rws%#8nABnls8H}VVsZ$fW^%2@G*+mEMFLJ2*oG(jXA^ws%=Rd=xBn|^2j*RTd<{o;e*UY> zL(GQ`1r~wKIiDsR=&6%RaXi7;8GBYVwGzm6k?=r7BD(8Y&g<7)e1e*pIss?J$M9U%NVrGS z7-vOa{_I*>6~yj~Rf&C>CK=0$(L1W>l6C31)Tav2B!_L~Co=v;fTe&>5b4>rsUTwn z`gngY9}8Gi%QooSE&MnsXt&&w>|nfyeoE&EQA^wwxV`2iuwkPIs{#|#*pkCj(-FR8 z@72{~N~E442@2OL)e7nN`b^aDC5MItzG%f_eJVe_Ucg7v4C3*}3v$^99%=rgPng&w zPtk0?LjrAdtK<~JybmcmCA@l#v7CkC2a(f7Rch{8Wg#v$^a=M|STl9!#6seaCF&dF zTd|QD{0+9=i+M5RovPG|dYstn{0&SYNy{Tzoj3Z@;LQ?|g2J1m{3<)qasuw~58+OF z^-=5Ech=(#fD@IrO{t4|W55}rdhlw#><`DU-tw#&9vEsQurt|+e!k5RP1Ru6y-Bo3 z`qnIU_To{@h1u`|l7)PsHr(OJh1XEA2DNl~_6$+FQR?82D9P3CiMYmnh4y5rCChp% z!IV8l>T<14d^L(2tE&HLGho{po5-of5Az9ba&+vsycUumpXL`?>3T8E-?!NCk$A2+ ztoF5u_Zf?eoJ|!y%Sl-J60Hk2;t_nST5*Eo&eL@ymQHQ8I%|+dfT!@Y?5bm+tQgO z6yrY&k{9r`K|E4uF2&f|y=nuNFHHB?fxu@n)Zku*Wskdxw;ckUz+N(EIw1O0IaDQo6n$+)N@)2Jfr>5y8a1i0hA$@g!U3)fC$4}4|)`6q!)*LdwF4t`TWNQezFjW8_SEZc*G_pJ7N z+rIA%j2CWb@XQxj7gLb#^=*Z8=0amp8GZ}3QM|WbTaT!>E%En7*}F7eBRb`p#ap7# z?|yu6Tgh5i+>)r)`sW?db|0!_i`Z+pxVaUgV(f3Llx|R0Nh8_1D=AW$dO=bN@Fv|o zhntby1$&%WzvAqccpSqS5yY7stPxzHAS7b!$@uZ{QQe7tgBY+K7f10IjI zUC71t3zXQ541}^pv`~maopgN~lW~x*rLjmd5&x{}axRgt2-zzlOKSXc0T??%wbEgig-^xLC4dyP_bK z$wm~Nx+udezR`}He`^t->(-M*AN?9Qm)J*+o^CT&E}oebq@*aW^YkzulN)bhTRKI! z@FmdXEGFe#aEKmD-b$=0B@N#@ECL%_#|BS84R#~GO4>Nu3ZC-KXz!_cao6>WP7b|) z-PpMj%}p^Cz^sEI&v3VwuWB28+8gR6xS+xn{vT}xcY?UfsD_}~(%V+?5@M1M)O^N1 zbKQ4@#H)V>*y6_*t4?2DtC(=(nPS-r3d4NK>DEO!P<>&yvbMfrn6HnynatB*P#9Cd+09Vc}q;BT)py-a+2MX|b> zN#Xm^-KTOT`7rhFjy+6J^=vj$-d)CXh?O-oNyhwM&2_1BKV&DmJY&2msgt((Vy8`- zyR1!z96`G5*$%QI?+Tac4fBh0CqC~8t0?eoJIFz`biSnwiH8p^0l>v^`$l z0|ow>xegk#lYb9+EFo}2o44e78|omyUnKol+YWOlxH*`l6i`ld1$?oX7yuQtCTDA7 z9Lv%vF6e@B*V92~GGW`jq% zirVeVe4lpVK`N<mBx8f1C?;*L%+dd6_T(7L~7E2d+^|@>jdqMPak_I?Z!-d#R`tmWCH*nu^lRMrMY9sus4E>zVBLW3jlS zWa^FOfB&!?WdHavk#=hm-6!5NJ{Hc1p@LpCUcNkrb6bhP99Ezy<;G+4d%Kbfp@8@* z)+^tBAqV-ERGo-|eB-YT6{s5s_G2e9s=(7zqQD<&y_024;V8!@U>1+G;$yCAYXh2| zBaCn6PwaWABdkQVT=Q;WvUzLr`kv**)~2HEEIHs05>qS8TvqLPt~p#db)0gyz%--8Y}BcQDDjMTA7pSJ478Bhv=#7m{yms^dfO*f&3aqS$RhIlF|H%0Odvzf zTRZ+V8UXA|JITIzleRY^&56#m7pQ07dOhoVTES&ubp;u9nq)b>RNE1~NfWolLN{;M znNfX3CxTN?P?f9lY+XM+**jK5vJJ!_@;)tq{L1DWSF$i-?BrJCZ#T;pMx5RM6!YFPShRnv}RyV>f7wKER3@aTu&7)NVL9tbVX;n7W;x~pRXo`<^TI4gkcyw@fm z=ld#ld>d1AwC|37wdHonc~BqW$-W2#GatQTyE@nW(ukFCX9RBgrfBK|9WkioXflav zt2VVoJ7{Z2&ni1u25MsMSza~(u=T``yfEJkz3Jh;Zme(Yh%bSZPEKB9>8zF^v}5;K zY6DfQD@de}cqvdsQ{%wwN-+?%Kv@l?r__sAE)K@l4IV`w;Xpbf_i;X@X=omdnYrfC zT+z7<85OnnW305;<;(B6fb7fMZ%Zi9l%m=reeK%yESD(Ii@e$|U%WBgh?u0;OM@@w z;%K94MC2Z6SRJ*l1h+R}?B&7LJZuF7#-upHDB=+pw!wxniP&tu8?k^ktVHP4GAHdQ zn#F~i2`pCoGShT+AwE|(YF?k${C>K_ESrzK?kHtw^oHXa2yf6EG_=#_AYnuun(KEN z85pu-$)3N~8L+M>0DgL~kvf3Uk);F@8GCr^?bz@f)R+K=YU~jyrde{b>gMNVDU4*b z*w=iT-!twWCgdtd#@L6RUG&`?EBFPfD)Xj-PuX~=wN zB^&e=T9qKXHg6;@jHw5gh5Cs|6mYRuA4&u^-KexOWA15Nu3*IZjF8sR)Q0S7gsxS) zVcT*~>6yhn6RN?}AGejY8>Di<-(4z8%*Ja6=IAIlJ=uDo3#joqlw2>@t9<(OPnk&EZehNu8~QMC+RRmnJg*Cbm9VuC$SwSsrl*R@2RcGV9e zbJKN=&|hlLvIkW6amneScp4Y0KAc-Y?8~I6%#Zp~a7BdzC&GaI0aYTJ&eRWU1b>Ig z3D-^WpUazedN&On9Ik52q28M?x^!C}nrAW>quz`V&+P9Fb2Bm1(?2~ZDxlv-Slvc; zz_L!3?3`;?^du@pFJhmsiA_N;%7iiuAy=MYXHP_(Z}CGz)H;`s8m^TTh~qQ=RFGr1 zrMJRrpkbm>!Ce2^fDuOFuQ+#i3KK%@8;(DX^N((xb_!DO1mzA!3JVDtuN`-`us3QJ zCOer64IrS3w*i`5BN65Gn4xA*r-uDztoRd+&~weD+;L34mWQ19pmq5dP2s%t?c0jl zs7Hc}Ufz2Cb`I`f-2!ve8zlVI8rj(i zY3u2QXwdq?-)ghm-pmD#R&PVM5Di7gDnP~UT)X;QnZ)O}LYpuCfXP6^jt70(La|^Q znIi^?!l#sU_WtpXQW2uRsnE>9YkQAOl-X{c8~bL-KqHH<+mQh0Cs{Wm%b}duazV3W zWCyN;F`RaAPs@da$e$=0pE0}kYA-z5WKDVbgFIx{p)R>6W^XD=hNo1*pAF0l6l8Sn zc&?2-BJ_e)og7Tk=H~27kj1FMhPrxabn`9ZXvnd!j8OvSjQ33WJU%~iy|kC?xlU4Y zaw19@Mbs1BoR*Z&AbPaKyVu4%!vuLJGO~z}kdOqRGnt^&^7s9@`QjXK5_Lp}`Qptw z^Y)UxDh0YZoD82x`5(v^G^Hg?5$ZU$CJ{u`P_Oqlx8>BMAa;~OvH`J!tjs#NE+gYK zd~;$c4g3u)NzNb9v6~Fz z8-4aVC|QYKSMe1Z2a$_JlqbXau&R-FTYL|ogfPK<7SH`4;H=`uirvy?w5iZGK#1rvj?h-m=v3ZqB{uiq%&xu~zsTP>Ot(_34QoGfY3( z)15oQPICd3H=P5MW@a~-03uI=(U^o_`S5vfKlpHl4~x%QnKEZnVwqE-mGZ$$+(2D! zQ8Qu|xROG+^+I9?$(Zn-67M^+>kzm)fTP-!Hu85@SoF5qfpSXLi!<-f0nyFH8lkYD z?)-qVj-kg?Ds!LmySx?s#lRJH@iRrsLlx9) zU*ly|-kMU%kV-H}Vz3@}n_u5r>&D%koFGssELMQr(P6k$LNj7p|Lo#o3F+KKxw5Oo zNFNBc+$AJtg=;LB*(f4_sljJdFlU&b*d(b2Ofw_eoD}9c@HPUCwXp z$0OjOmfo)3mTPtSq5fVR&ITHNpt<)-X!pS&^q+?T#LV z{N?Mb;HxJA4zv&K0@HOegU1fN}MJ%^iQ#Zp3RBUbnBWj|QA3D>``lQP>QddVBS&=qAd>Eu3`RY z&*4scmd)65F}ft~!QD`?^P>ooA$?4Ok=>k&_KG&8KwoitrcOthP3X9usJ^Y*{ppMc zCMs`)v}0U5PbANi7za!kn$g%yXf>uzw5i?bnd^^uirnaI*%$o$iqy!SiohJPIZq&- zG(Qjl6p%9&wq~o*{e6OHX|d7xP5mZXp|Ad0B@E1@X9%Auv%b3pSGO;Rf`!P!ms@ui z%_E~$BjkF5+!lJhGZ&39$(@?wDdoa(fvMmcgc&qbn z0+DMEFXoK6IFq@VSzA_G&2kA(cMBT~zn%`iS|M&)sy)%?&0enPf;vTv6|t*$2tdm3 zTv1VeJ3g9QFUpj@o{d^zp&bU;ed9BU$z;Yir-SXf&dr2Mtrb^VOz%Dg4a8?-Wfgn4 z)18?;`3{^pv+y{Yq}{%C1*SJ3UN5gapa|Hl*)g~wNqV4`e-RfFv`Ltl1;iSMHhXc7%$ zm{8DC@v;LnOpb2xShC~nK$fde381i7($1P^v0FjQM_3(@n6n=&4FK|o4FaIar3_@$Fn97G%)R)#~({I}c>7X&YWHSzNN6EVBw8 z@)*;@#);orDkh=U^@^8g%L0c9wYEy0ZYIbDA)i>sA5jG}GdX`;kP@|8tD{ zHZ>xKr>;5(V(Y>&?dAL)t)(WxIQ+!?COOS-hN4XG0JXb`W2vL=9%ZuzI)c95Y0o@9j<=*J!Rm9;?CN zu{e8z^xB*EX;R=pW3Jl2YF6)hUGggA*_Zd&ADMc2s5%>at(X2?w8z(OrJvJcjWMK} z=kpT%HV9Q>)n3N6AO19AO)@I2V^T{O-zyqZcdQbq?NiO(=8G3@|It|xxFF~6*3iA} zoEDQTEf?%|mNJZzs;V611;q4`-b=Bol@fBD4G%Yy_f$1abzY~67gF=uc~%`&f0L%a z=Y43}7YnF09w?ixV67c|O(k#T}XOchwGbZDUD6;Fnm8 zb_31IsFO~ibON%ZD2$mjpGZvYXSl0*no(l8-csQ;BHPDRZt1!*ddmzOZPV?}V%?#> z_{NO$i=_GwSF66qm7bt1g#Mr-I+IpEx|>+3)x!~iU$U5;Eu*GIL|=Nuu3jz-5)lbe zGg=}ohpl@-f{O0t_hbGds4v}T@(_=TTJTlH7@fE|&T%Xe3=`fwES_&VIYLmhIrE%v zZnl|5h*Lze%V}XzYWZPh%*6B7>al+%fz-maRd?=M=kkjrl2hR>;=!I;U+ zSf9r{C@Ixhn_TKq>=$eY1eEA5hl!Ndpqb0vVnYbUpX0W;NQmBZssGrotHoLgNE221 z{rvhq?Rk%~*TZH94iiy+(PxiX0e*%pBFj6a>+^W+-op85#J51GxOTjA5T`h%6)RF^ z#_2#<(!aqr12wuvIeV!j4UI6D2%)7tIy$+y!=ocfsoEu77$+YOkD0Xg5PERZ{xDBP zFzV?}7CxBc$jwW7sEgxT^akjgaF6aq^cIhLb+wG6YhHGw^T58P3-v2XR}?n4<>`vP zqu3xPwRrLngS=~mv-avuJ==A32-11_{H*<5Q_aa_7cKs!yt0!1ai2`?nggwH82k9eiyMo9?{9eQsx7O%>^Na?P2+a5xzgA20C&>z*`hIjP6g^y zyG^blq1;NkQMyYb(0_q6YndN&qwMPp*N79V+&;C5K~^e}rqNS{1%X=(ve>!?5N=DUV}43t2*quI{u4$R!?p;~h#eSoe#vafHfKFQV|7W;3|I=;879 zfatRS*bA;28iBeVh@_wNakRP4D?Xd8U(#P4(PT3vl-h<4txXR~`2(HJFEZ+6f1Vhs zP1iWCm}lm7x3>stR&U)76`VGP+lxg!Eu$qk_j%5nMdj^l_jd9th~AI`2k*CJph@6y z*mHbKd0?Yb)9_#qDHgN>h_!ToHY>9E4|U0d|MqH$bnueY?rM`26x1Py9;Mf0=X3TzT} zuxf;#h?T&o^eRgIxL+wAg-|RxrIue*c7;|HTrp6w?6|cfYS3Er&!I=Uhn50#Ij+&K zPZ;#?cZ8Hei6vl&D)Pd*Da+Qu4lhKgc6(Yl2O`hbb~OYrWzkL&^DDiHZ5w&M>jhxK z?LmM9L(Z8`s_a?%laOs9eT6rQP5Me_ZHY z#SGYXuP(iQi0BzPNomR)UaPlw(JBly%G2=bB(Tx8ZO zDc}cGD&gK|)u-+kjkP;o_20j&i`J?7Sl`vs?TroKMJdH6E1UouTExEVCod=6ep{n~ zrss}#c`)SG)5O+4z^;m9DKk~*Iq~eVuIu5h?|ae1G@7AfpPSDGh0-wtJ{iEi{TrTA z@eiZW2H_2_r`WvL;%|MbVum63wQ+Qwa0RUcZr!$H^pvQHB=Cd#_fwc#N7Nb*O8QF@&ncwHQ^JZ^PDMzV_tS;wV2XaW$CJh7=us~0B3$0l?uEddzC#JTh%|Fp$JZ1 zpbu`!!{QeCL&aq1JEb91OyU@CWddzY`nI=sjqsESm3-5AaG;~J-WpiL8oZz->$q>* z(2kIY!uIY_zxbmM8C50fsUFk~Q^0>YxSPAl)~-v)@gsC5IV2$y1aDRrYf()do>r0E z)EX2wruarCxT}G`0CF!T8Nvs=_wg3N;`?iYh@1(0!AfaiB8bx*E$ik3L^GdN8wLr0`xt)vT=7;=8#i|41_s6^mI6e0^lymwmG9BU zB$+9Vysh32gO>6G00f9dYBkbPVizhxR7`I16w==K?RlGhb_4@z@sYGfII zkXyHqyr42~h773_4ml{K^Fo)r_`uIjn<8ji5|8!jeR^i)%naRY*Mgo9Wz7UbSNW^Q z_CfbluX@vJ%~lor&DvSKSpDIAT0_x%T8VG*kzZZU5pO<4kua;#hD*pHcKHgq?8jdp z0R!_fVhJ*-ja5~Ton@VTIm>;zG~It%hnL>Zx;KF*-;D@~aO@j9^gCJ28YRncmDiAj;LmW?oA5|m7{~I zwz#_6oxi!xQ{U9VjD&fC z57G9RW=_tUf$L~3E{`9xAD6&n4~(|g|ke$U5%YTM6SQ}wWjIn@;3*=lyN#B?3epZwTi zVamwg)KOv!;(#aKnftgs2x^l1=MVk#`p=(ME06jL)%0700zq!jQ`on{IsT?j79OFABWw?^%f5Hi+sW(4_O=i0 zi0Bgz`Qzu!$yPfI`hcDm1|&Q1mEEwO;FUL;JLiy?0_M2A9N}gqxUVmLXRKyi+qr&T z7UDRQTqfe|>jhsr8B(gXa$8*e)1Ptw8o6x^MV~<-9_mi&d;(}9+VL$9;zq3Q49Gyl z2Ra6C+vloC)JE5-^8_U`%ESxraChB0tB}?Cr$f~Tb$(^q=I4RoWmPWWkIy&>0N`gU zPW8#Fl%~tIS%$L~PBf|WJbd}DS@s^7qsiv99&NXcvpjaR!$-+TF< z*W}r|wboLqsUKb2(HDXxohZblUcBF7o*V64KMx~te4MCxHN!zwwC?5&%Su_ybN_kG zNMqy`HkJQj!N(a2aI5p%9dHci|9KD(*f^S;YJYc~BXozy>Og!Bu=sv`^%TTr`WsHq zXW6%Xi0Y3+1$=ZrZxw(fA_|Ko(d%Uyh{rK8k|3=Z){Y&xvUk zj$n^nklYI<;hQHCVtd`7dG+c=`;}NwFh4qd=61Z8<%_1@b~#$7pg0H*s;$S5y5W!F z7y6Ct+3N$F|A{YitfPCt~Qni8Vt4 z47O;tQkNhuAaHEo2l|{wEXGp*hmy+Z*2%MOFz+=0r=au!qsFT7p2Q&#Z~Zys1dFJ!|P?qRoN9B>TILCENz;)-pS7V#c|ERku(R$bvc(uJ)*8pr-T zuu6A=J>4FU?e@9m`r)1cB@8E&cg{=Rv~W6Sa;!pL>JEiG75x3iP4qdEw1ipJbdBj) z->m{ro5CYjC7B>obQPRC>mQ8EHkJR-#FHz0g0B3q+ON@(LV&wiOH1DVY>_DgCE3Em zm2d{+eOX#Su#~j_f$i1WNYMxX|Z7|PsI6*(my8U zi5Q3MN3RSJUl!?x%S!|?dq|kyQD6RsrP#fTLkF zNuYc5W;1e~pdMz`*nBjxd-|AW%}Yp#zf0LXdT>p06z#)_;rgqa#4@F=17dD}HA`U} z8t6{ixgO>3+>C@vYK`m6nMhZ-|Fqgh>&)6dZ6frp3EXVBC@rE+G&o#BqTqtUCe_%^ z3KPblLiYpz^XCJa<{Vv|^iMb$*4B*$SfT0<&zm$UBTHr9CCM`rS%S&sIUnD?erzV# zQ{UKcbaNGUL_WtC#zD$M{?+u^Q&8 zLstkI8ue{Eucsk2Oj;I`ys^spIaAMB9zN_TZ=S!>)=j!e{-+N$%xKUBg8&31f=Y~%4CW6yNJS?2HtV<|z;Rw1Y{P~-zb*AfsF?1xh+gkHXm|&e= zH;9Lv_Dsoawz5&YzWb*yyR`{53lK%bF&;6{Nl+x`MVesh(9o5Ves`y?h(zG(9@M3N z@tpK{MxoC39w|Z^?7BCKIS;`(7*cW2(f8TUU%Cl)NT8ZYHQ=~jCF6hd)VSZrSg;zZ zc0DpyrR&ab8lP_Fr(aC7mzqvej#YATxGQ{)Io;cPx*f$1K1f4v9R7LkH6Xzo1A zca%2u%740{!(w1jRqGh%5tWc)Ed#KR^A1rV!DnM%nV6MFBDwwi+3i&58Yw}`luf9n zlrL5JtM6EXbRoJAukxhZF4nQpA^4wlw%I!eiaBVr@%F_fZ$DKppIco~eKE&7x45>Q zo|3XGW7`3LS4U0sij0j=j!4c!8m&oi7*v_$*qWeQ|9XAZooXFjOX#8?bn(pIyH-vj z-KlvN6G=-Y3pmci2P=7?l-LOewSF04sh9xaHK+#mMN!x z6hn5!5sr23s~26ntuuCd@$){_q52lmCQSV|V`x{2TheF6JBnSZ>~c@Kbu&AP67ug( z4y{JTP{>%d`h}fBVeYA>PQkOz|F_>eM5FD2O}?!W^g8Ab_)T=YI&}tYBRJz^)1}nZ z&PjFa=n87Dgg0J|wq0XX)VzEGU%Rhj>9$+Q_@}}F z2|OH8jvRqapmf~Xf<@TLi@?mYSd4sUL`&O3h(RR zGY@zkCwy8sAXI2V;bQs+SvkKk6noT9FF{8cSrMCg*Pjvzw&*XUjPpLwDB@s~FYF;Z z>2V*iRVfU8Pu2Nk4_LP#lWjt-w7J#S(;N5^o801JhSOYJ)q{ypOt+|ZBPVm_19ea< z$791U27851#y;J>J{~{UHegIWo_)D)BPv2QWYHhDpX`&6Fq)geGj4bo4nMlP^Owru zDWNd&J2h%O6i}ba06~t-kEh!c8DyXZOyDBBVPxS9zyn1MJ{qFoH zAhB;g%0F@QNTS_rKr>f7#l7ef?bVK*z=}dfDQe@G*wpjfieB)@$Ks)me@mAwXjFwv zU1nzPXr^_0<8-SELfV5Vgxc3HHV?o(UO%Z=u4v0Oh?H5xr`{?_JK;gT?Ib7Ws(-3R ziPr#Vr&f0TUp@~cMU_|~2*WZe&ndp`#?XvC%ed0e*4AqBstn=s!AgT_iBA_c+~`5V!{A=(BUV^Yc~m%?j=h4K=7Rb* z7yr7a7kF?ScPkDu$_2s3B(>fGOCp!}tpibnI;EWy$EFM1B^X z{>+`FshQ`uf!^u_RycEnDUdeM=$|J+{6cU^P!~1xz?ZCCh>!1xm9w+6lN4#Z4*&M^ zTgZi<$6Lm_WI<4Se|zrEXCCcp!$h?Z{A}yX|H~)cZ92x=&0d-c%Mv=b&xS3X+MDa2 zgW6-NYFr4Mv!B+|ze7B%k%v)VQAX}TBPTw+)j%n5JVQFMKYiwx_4l+{!s;Qe#25W- zShCe@dl~|t>#ZIdB3>7dpSt<*{0)D&AN+5N@?lhivXNbLimI~Aoa1!z?b|wm52hKi z8$TbD>v0Bua5k|1_GE%=8GN9qq2T?Ct-;nI2b&oxS|$PD%Qf7aY^8I1F&9Y|&aprP za!xK)K`MQVn(-!-q>&K8tO1l~B=eC>MIv;sax#(eF-k&sML3;A?! zz4fdUxhZaJjGw8b>p8*ta2-jWNPUzvjE^n*7%o7(fQd-=9Jigp?eKO+(utqGU_)$` jRFM9^{d3YYZjE)Q(cyFH9eMh)7U^k`$08NNh3)3Me!=D5xa6$vLM6$tpQZZn8uLq>)TF0+KUnBc?Y;I|t2*qNh9Wr$1IeXJm&lcsU|N?h zT|p845EFs_@}(1A5B~bgRZCI!61w;93iy}5EuW}Axpb*4hV<0<>ZMB;SY_Cg7q1Q0 z>#rr;T}Y`u<6KI2?bW;Y`1-SZ_wU53IT^{^Sx1Uhi=Qn`NUfdqqRC%JU3p-1g+uWQ z74h{1*ItQ8mtKjBzWpN7o8`?oE9^(?aYOXhkEvlkJ=_bO`oj}8YFT2IK#Kq0|H!$N zpdyu-{NtBDq$FX-uw^bL?d<2Z!YdH_ujkk?)0mVJ!z{^rgR&JC7Ed1;yB|&w{@0_U zys?}9D6iNwJNFW|46;%vP9L8t{FLTCZgtBV; z3H@A!C@n>o_dgoufBKxa@oQa!jn^(^3gcHG=|6HPzD)m2_nV6v`YTrKk3>Z#jrGTb zcrPyvGl97`WEP9>n{Z@8s1#OGG7j-r(<8UW;4lPo$V3X(8p6?#auxzlN{z+F#8#$jBPZSAEqIOkSd0qF>0GmG83f zT{~YTai~~0f$!A_w|0@)!uLc{B2jFiPKo|7_mT6@t&(TivVYW$b{6#L0_VzLM8d9} zMixZ$I2=nrilCW5#b5t^q&E`~R-~a*gG6}4y`RUR)b8z|JQl5M2kts=xY{E#>^bll zu?){+kKc!;YNVI5q$a-75Q{r*j`lvHp;EiISb7hpuniZn9&ByYKcD)3t)Svb0Ficy z7qa+8+3d%~GV|`FECpG?L{Zz3N(NDzz>at4uT=j2&)gwo7VTi6h`?ijj~3wLU3w7| z-D5~Jod_A?*30>QP1>#P(6BkFTfRws^5JAm7OovBAAc!O%kvB7#9ogYU4Uq%bW@Cd zM%1~l4%3IKncU^UVp`J`4o|VjH6r2bbnr+kHt7z*ob1pg)U%w-Q{RClPyS=xt?i3g z_y01j5Q<)oNcaxn2|(1IfCV$_H!|4?g($SgE#;+|JQDQ3gFwltK{S;h36J_5Y5E$n zZ|xD~-Wi~Wx;(u|sE|p%5apn%PzsDsfM=R2+!1%UtHxWZytaTe6Y=z`#;B8malsVA zAP_g`agiVpy9!kPGsbh zAJua%m*h?u)doy`3iWI)ECmLWV>Ol*%t5^*<5Q@plu6p|SVr#sNkNAHXWxT2H3d^$ z`Oiy7yV9xUgwl1mauu1k3dD^w$luRZGQZ`_#t=5ZmP&u!mD`0DcW>ak5=O_vl_O6cU;o#$z*;*Jcd6C(%pf;b%nGV&&fZXRJjSvyeO zxEpQne}2>-bzAcxJ<_=Cu|mwi?y{&wLTDcJH-z!a!M)iq>sBiT&8L})rMXK(c3R!a zOB2|0-K~I|pQrPbM_Mm3gV9(t*6H-yx9}8@G8rqYZNf zllKvO=#tH%)n+SgmzNr0OSj<*aKX$?`ltWv^p{OB9$V8C*^^jgamlNi-Vto|kt>d^ z)MInzvZ9AEn$Qok1&h znOaw9w}zdJMdVq)(h{=e|7+J|CUeRvvr!3$sOdi zs~tM2r3V}dea0_#*K$bn>=gg=-p+yng#%i$#G0_s7bXlJpJq9<$o%gSFF z*8H`OgVy-bH{n0vw(t-HsOsUtWCawm@Jo;=k;QEHIF5%y$|l^&ym}_Ci?}kb=LMrE zK~uZdP|AbNx~=iG(nbfzuiL@(X9p8vHbb0gl1LkYdrk#K4)VwaSTdO)w{&X?=yvL=q_sjS0DxLC0Auy zd?Jrduo4@kG9>=uDC@%dV&>xTVyx8vY|V(fBa+E}cd4f$>W+A@z6uNM^j8{oK(tSE zJZS8+YHbECgQQ$xn^m57&9^NjjRzyno^~3Mu)s(d)}P5J*U!JZN@_P=X)Wfyu6wea z8zUPSrzqkw-${|d<|1L*PWI~SYv)j#xXaz0v8El-`R58Ouyim(pF9cQ!1p#ZJrt6{ zy1T+kOR2%sfmO;!{QT~^;m+uMoh9%=0Acy^zTGu}cEm6{mNp#Qgle3xTgp^`hd=1@;H>rUb$)l_GJx%|4*fD;|q*TMflUo0J`tcj!XaG0223hD(wT9)sd zZpqHy9eUz0R^FBbMcDkX#1T_=;SId`P%486nLj_T+*#s?UzFNi>Z@7kPM!eu61)#3 z>yT-jBu}6c)TgDeZgK(AjOneK6rGX(+ciC+{c+xK!)mh=)dt(;aKWkBob%_zEH32q zYAmqcC--%1xUKtl&rh}{n9u)oJbSLZg#Vc7#VxXyB5j{aIAU}v?eB?M{?@rnwq!%g z5#PD^9DU(__Hiu+eTWbt$+3vPQ7uaxYfD&hs-E7AhjJZw=ehQ=G{*+(#8*Ox(U#VcB=X`U`*kUfkJE za%1KFET6$lkjyFS(;r#KmFPB{{-A__L!_Id$(h%$;X>KwGrga;mW)n@ix8)7n7~O2 zYjERvUH!_*M6}mg;sQZHA(RyMW*Y1R-(x1#&bP-bH)bx*W;V7vm}{0Yy`gUY>{=N6 ziE5+Aw^MG(=24>s=sNA8kTg2n5*-$(7a2p{RYS*Ltcz=u)RjaF(ZQ(H66pd@q-~Ql45?-`5 zobwDhR&Fk4-2C?)F*{WKcKaQ|0TYFBNhnCMbA16Ib24F~VZq!{p!{eNA|gc6P8AS}VbjN$chjUvdAkcFz<3HvPxnjx z?YHU=4N$MTPV#!VO}GL(&1)~m-Kc8=AvuIMx@dk>enH(LF;O)v|AIO`>`CGP*o_Q? zbKh>{u+ScL$9}do>|i#6f1Ka{NY#5b?EZRwvH?klnEm*zoP<ZYul&y44jOe_-QbDJ6o1U0uFpLlm`}dc- zUsGDVJl~G-uQWVc)nU0x<0=7wijkyfu@)#=*U))Gb|xH4Sb-Exk_~1AZq#ftjN!`l ze}6wm*T~qlxlQ2rumi(VDV$!iDVj-YT>5yK_2g&3&1TjC)tp4Id59}`K%LG`&}9ka zB&v;bVYDb%B%;++&p|O`q?M$0Qg2l5-ejsAz9T*kl3EK=_l~b@=&UT*%$mGkKC$fE z#M+|nbj&pDCrO?EnL9Y$?F%91$S_fUn+VcED6Z*t@-2NxGE5-LRrBM~M9C}rKef)) zRs)cSK7X79Qb0<&ONedw-=dE~5F+nUE61(!k~DJP6d9##=92kq^eQaIT>SIO`ljo> z<;1~5Qltd&@SAGX8t{AcxJ1pAw<%zo?uyyza=!XAAOEyjG|j@6P9rLSO7_-mLWE;O z2fv`|g3HWkCj2o5PEiub@7j!y{#cU`>h5a_M4b+%>FylSZV;`(m#p)>kH$oT3h|)@ z=qcGy)hC3Pyr)!=bA@G!_&x@OIk=B6MmwXgqW7UT0@nAOaq1kRQYvA$WkdgbyDcGd z#pQ}JtC)=dzSPi>l!o_9nQ6y(acP5%KgdBXcC*Uy9AiZ0cLN*@+gRgIH>&J5P6>)lbCYBH2uI6TYuK<{M3(f#)s`wa>OjX_X4debGc=j?6`uqC>K^qD>P znF3M+5-OzQUaWPpZIEqF#IZ_FqR3{-Pf!zYT^B{ccwg!fR^gqODkOEtNT~VmTnXdm zz-L(!cB5bViLF55s5WUMnW(Z&9<&VVd}1aL)G4@p`u(elh0b}ed~2Mdfh#=2IEX^_ z)-8rJ0Y%rzTIYkhnKLL%*#F{WCIo-?BWnqG2v8s)zXULmf$Wf^A?=10uQt(1(I0Kj zTE^BtH2^gNPva$02^n1}H($dQ zpn8^7u0SOw!dREoAi=TPB-h|~;Jb)Ode5f)xHVr|Q>E&<=(<29hROc#*zcI{hL3N< z6X7pOatHHERPt2_e9-0MIR6IOAQJ5cpQGI(IL1Z0+D?yW!@rS2dG62l9O#)21lj{b z7ghP|&H7|6zJi0$yx5n;j9Yqp<(e$(JujB-V^u`?J-{V(qG6@;mzR z9O|DHW0*$jy*(~$kQIwPX(5NBPRh4Fi~IeNs}P@7Vx+JR$P!+&j&)a&DEzntn5`Rt z4v7AnUJZm@C(fulvBz@F+%p-|kUN&ST39%(Ad-YnYJvcipAli~!6!zBCKDGT6o-?qG*p9V%NLE)F@Q zrW{NDhgAB%{L*zHl$%c*yw_=f+&zh>uPstFddp*_n`c%@UgxC_l2)^o)BJV-o&4=1 zvOZSl3X?+m`o%sIn%x%L)}`JW-l*xi_t&NFCnGEl_%BRG>O5AzwT0nK&5nEJ_m~!c z+fjeFwHXQxgh+>UMH=if`OExf2>9+J8!f*T@2A9=PT?G|Z(U_G{8=H20kB7Wwqxb_ z`v+TN3(1BKI(sYB(eVnI`~Na5|A(WB{+mt>+c0<=EU=b|V6s~%V*S|eR4#OnN}gIU zAlBGaqSMrk_rmgZ3_i9AhLVqVB@0llXZ>xNd*~TSX0f;QOd&b*>^K9Xak!Bt`QA?e zMF+yvG%rCE*U@Pt6hRRXmNMTbzr`9YPpOfq7^|MSyCm5Bm6m??G>a1QoC32xnIEyg zIwp)#)3Q*`FEMQN6ZoJP@h{o*e;661H%;klsmrNJUeUkUOgu;B`3fjf-lSdQppYB= z79^2JBt*saiSxozNx4nQPK4L8kWoARf7lHd4Sy6( zb+hbc_MP+%n=5qh`N!TogG~KN~lbPo)0FIJ4dGhvfl_= zCBszydK64k<7#%CAloLz-eAd&?IdX4=S4Fz}u7r&M>E)HOJUnQz*L{S|H7rvuMfdaoiZl@rxoMtt^E{U2mJNz?J52UptP_ZGqKhCz2a)szO|YxzuJO6B;hM(rKDg{+5MJ1hZ! z$_f#oYc|U)`BW`TWnG0kWxK2*$6^rg-fe3GJBp-Oy27eV{Q;c!tGUW}y;b2bt7=C) zG*UD>SXldioOBeuS|odSp%i)py#keN75Wk9rpp4UO{$RVyG&a4o@D2$&yke(yX-s- zq19;yd7iZVp-JQbX~P24{ z*6`CWx;fq^Y>O=enq>oDJx5-zj~YR(`{km{hBidQwH0D!sopp7(u6+K>QLUWc!8&v z`l#8D&Uk45gQs+Kk&@Le-apf`(QP0)Pg4ydlZPAp9TNHv9>VqKX$Xr&z4;$!gN%&h z;WmsLLc{k-(>TJ&2n-32l;@PH<0p(Qf4*-r5mEGx+4Szf5_M+8D%&Pw$ZxKWN zVW#N$)RrtOQ%a`@Bp}6IAnW9Cqe2~!Ipd2n7t(ZUs{?{bX0PvwP1pJ{DTOVGNX=nY zbnIi(-uFCV{m^iJ#uhhLVfobdM}c~+g3H-FR^Q}*M2bob<&z>1y9Q^*a?~Z&>B2NE zyB?|f{&JzUsM9orxs`*BJ^~P%z%{hz?jno69zY02k8)p(y@#Ca{m?!KP4kaMX^48K zQ9(xk`cmulhX=XLV`U#Rk42=CKCx$1-NXuHz-0<`3|D4VG!o+1K5{rOLO&x5>*tTV z6yShnKI56_b7(kPbmD9CF)))#m;N71cb!3v=E)rdoeIOBXO5VmHuTr_==mEkF2PV3 zhaOpMyL=BtpWffYXv9MpmmZrjcbbSb)oSA!m#an!c;9c6~_luQu zA`+VsNUwv#g)vExOkrBo+)z37ulZP^D{A*OHOPu`(lA#{)ocAgbG(qKqfe;FzX)Vq z=V|AI|9;wY|0d@c_&$Js3LkJXZ7}Oh6 z-WsebCTDmwx(T{*@4W%VjSiXfGT+^_naXQSufI9e{tEtb335BhizO!oCVo^wr%t1U z>WP4N2Pr-Bxe_|_T%A_5%tYj-spm3kvKNV2Bf?)nJ7WFjy@rsbwqJ^iBcR=)Pv-)~LE57ts<06s}73Y=tE-j+4C=Q}HRcc;6LO!*WO8wO0pEFZP}`8JRq| zM$T}{qL#A0Rkz(CIE_Lu#F0#)qKx#4L}yTTtI>JI+AB0a#=&LZxynWGj#w&bgr50_ ztE7;W-uWio^zFHhiEjQzyQfn7F9gzfbkJn1&e6;=Og8?4`JjcCBYGZc@@|5a7gU9LuD|SSrYsCEj`15a=NmKcm`(;_)|;*|SAx13ti&Pu z7^TSqJN}iXFwEHQ`f2S6-W2Vxx?+o-fJ+g0)HFy+fBtL0wjO}r86_}a-e>!GIT6>6 zXvQY1?`9;LK30jWFu^xvc`YmhT|wwFK!~@%hh92Udz=u*ppv@VzflE>aCR`2 zYZsXqBoQD?olxz#%ieg}1|vD5o7D#Aei4g3a;$_Fg21ycwupJ`yTx*NCr8}U&q?*D z3$?r9w(WOKhg3(7_W7+8o;&f*XR}lifPxOy2i@2Y0GlmZf^XK80jjh)h*U0N_h(Z; zlNAXIl(EDGFcMY*Ww`x`StGV0fFpw z^gDUwy;f3V2l~OLH-u@yn}lBq6A@YdrCs@5J|RwDRiw9#j%v{4b`{RxQ&3(~Tr7*5 z_Xgl2mLI?F5yc0(;n&c0y$)Zu+wWx>0$>0@?bdHS8~!ktqD-yO*UjSb%WPGs5=1>h zrw;8(IgqE>zYiU>kI!pmiw%w$ODDoLPD~+Ve2>|!mC>kYEjD7#c`7D&9hhzTKy)N^y%-GgVKxR(u4S{ z)7FNQsjYFqL(!)m3bfV%hk#JLteJ#QKrtp2gLd+r-bdhNFrjwR>)3(ewxF)Ow31E- zrLd_QM?~xnOsV3{G6;R~-284koG3u4_P@LOnEczEZ1_2XD!6+2* zF2-q;L%hGK4elon;k%)AICSH=*GV(jBpx%qHNKm!S)`?5&kUT~ZnMO7Da8UEATT8n zaAh};DGaO-n0t#j%B%Z3dK_Hxc$i~qE^1RrwtW7$6zqAjd+%THXvL6`4E zbWMU@`yW2OCq^-<{8vlJ1n5d-)YGJ#-_(zEO3xKHJe_fo*;hXKDc|HDIe!hHQl{FWf=Df}@_< zNWMg7OnnAQVS6;=9Y{*!#o3nqV4iZd^^XF9=YSt_0xf?n@%pPxj~)*|T5PlCwL#tO zT?PGM-f3fhX)5Fp>;q()N~>JfxZO_Hn9&-b2J}~2{{Gq2WCh69M?+eJLm`~z!0jN% z@EMXQJ5S>?r<}#N1;Hx+V73uoQHvWgoG$qNT@UIINi{L=T6u^Ki$ckCJ;-W7^%MSB=S zhcDkdHzE-XL8;;(6`Xa*H5!HRN5{*#+0^SX{->sO7w0E(+`Lgm4&^1u%tgOG8e9M02xCQd8-KrkPrrdAYbahhFrlOx`WV@@s88;Ho}?#Fv8)s}~w z6g@9?nOUHbfE`-;^~N?nqW4Q)OT$v?#`ql7*p*FtyFSm5^DMvwSRWsJ=EgS>8s(Jw4+AJ|K@iMRE@-grQ|%6-4qz*%ag z*+}Te&KK3zWMGI1k?cC&Uz;!oZL4AJ8v6agaSQXgfXGI+=hMDSDLF5@Ad=h7OFtNhlR9(~ep?Wm(uRO0_kDQ@^Y8y+(%Q*n$J^wHtS> zKpv4!88Q3(ZhB^TB!#a(oU+tGAYX=BXcxWU+P4O*muD@6vTA(| z5|qTCehZmpzu24*{-^mA$F7<*dX3q~i2v(vS*y#HHpAQxU;q99wplb;L8tWrb_br< zYQin!+@r?Gno~Fd`}&PnOQ(x2*0!{MgaG`W=_pIFtNR=uY}iV9?|l&~dF5{d9lowj zOnJW+BF_;It(1bJ)Kf2M)+pC6_MmMMkxy8P3hm2ZzYSwENl8w&6t?WG1nb@!e3RJ$ za6)7q2b<~3Wa4%MUj-I_fWuS~C=rkK^h8I}hrH3R=G}O{Ptbne@Z8={MyccG?a^D9hPh*GgvdA=x{ryzpVulR94|5^bGGvI zU{IC+YKwA70R<*f+Zb{`TW(z!e}eXayTa2DZlU>1&ttpeLONN6d0tgH*qv96=7~j(J-4zSnTH|o4K67`jODozkJ7# zF~yA$pYB(PCZ=ibP;|AL4O+YJF7}97_TKeA*{In#JDjNjG0-r}f@@5wa< zNvc_Qa$)6=(mAt(=SKaLQQJ%%knK?6svdn%fPvO}5RoJ?o0E zK5xDLDmK}YN4vBdnBhVaaB?9xtT{~8KEMOKwYRG6H_9z~)=3(Zt4f|VaToJH_A+KH zImSmmTkX2fzs$n#ATWG`=j=DD-@0JM{S+)`IJJg>L(K^y4L(<-Q-h!U@_Dp|e@Hzv z?rK_RNp%j73VH5J8FhZN+rGtXk`_+jIyM@KlM*Y^ZKgVKb`I!XIy zH5ARljUX|1B}@pqag{#^DJi2mP!*UM`tC}34QbT=#a_grLL;U&ahy8Wu;qtGH|%TM z0`hvwdGhsMkL6dh7%qA#$87qB zjChrsK0nKD{>WJMH1iStc{wbBBlIUq8TeCv{ zfNY#9{+T%%I7m`rVHpj3Gk$zIb-ci`t z3b*MfCgyyXLVpWbnZk`|uIHGb)D*--0U-brwjKFwJzT7FvqK;y()TjZK`g&dn%(dl z$!pVM?N*|0-Fm~xLE*`PEyUtfVU)PYY~q4WdZo)bKc+?SjtE>$`sVlw75f!(pCXJT zcGF2}_E?;DchU>?Wb@9d{_179d3OEz>LfJrvSIz{9_lEC+&Mvs_Q(fM9ToXTcejjh1$#9|m zu-D1uMH>IJ4{HW^BU;Mt0%#;VxnE@~CFs7cT~U5PmfKYu$t2}93R;ehY45EnP)_9P-=lEl99 zC8loLrNrHuN~`NJgLW>1==%81!UoTIYVa?&;QX+suE|tyfQaP!-hJ$=r)%BuYVki+ zK7LT7$Mz7Wyt1oQ0??U88FQV1a}<)YYUonjUW-Z4E#92OJR?DmD2E{6yZY#R)NNQ@ zD*fjJ`A!=txliRoXduP*+coz)jnX%5rYD)8I=v0^9h+_gQ)!si1Ocb1g1{$f?^c#t z!>Fr0whZn(bhlGVJo_^jV-Emqws!nDaQsoytHmOp5y|}6w^4x!c+|lxzQL)g>?Ui= z$QeX9^YqVlWiBeD_WI>UfHSPW=@~H#%)P%K8MMZNm#O2lr<*s?793DZ!Qskm@o0)B z9{`a9EPB)F$v#nx0nb+_NvOUF?+S4p!HJY@n{FGs_CYl-hSNluo0pt*8TPvEw$A8# z7CG4pVl4H+*3684jRT`JK@fcSGkj`%ct*ZvD-9tBk4(t9@*ryLPb4IDWeMyig1`+t zwCTRTo2~&$0`{uG2eUDW5q3)%wxW;aBP{Bhvxijj1z5kOoaekNWo|LISMIBXY>bqo zP5GT{9F#cvb~gam&;+4l$&f^nPy(|7#TdEHPA~cuV#e9G8(CMJRvf3A(I|X{{0$AS zt`U$#Yb-N8+Y2-@iZnSO#XwRlBQov!6#EFzhNr{dN4KFrWydHnS7IDN|6=9*v~mZ# zhOPi^HtD=}s;0c?khjwVU#tkzkm~G=Lsyr8k>%w9HX+nT$fhVPLhw1nxBsUlpw6ma zZ=0L|vE2@b5)`u@Wb5wkCS}z~5aXEz&?{7wPD$ZC1t#zLx*}Q>?F)_d%Q2o3**cm& zY_KFiZ2OW6WEJe9>EV(pxzbyispp$73~)StWWE?ZB^) z+i&dtJ%NkC98!L{XSaRn*o3h(+Zjx4Apvz)$q<7l~oh%kDO^IW*c9K4d+JJm3KMmGWtRZ^1Q4A^_8b zQa$lmuj1VR@S=1Ak4v~&cx}$@oKW@-fUSPO`D=qQO7T-$R4ciF^&J7Ooqlox!BXk} zC&ZsvQ&r);5igJSXVh^XuouAJ^2jK}YjPacF(J?7Rz(q3-5A*My*OpBbwV;BSPoWx ze4GF>;l`+-wyJFFO?ov-9!|siDiUM+*flA;KNI?Dye5i+=U%qyMgPa4uMkFvaBN4JMEWBB9Z}Bv(CK) z==a_S$7`h%z=3N&g+>9I(IhZKT?w zuea~Ky~gxq!lAAQ>$XBQ{hXUHC-Ek6B%k#fwr&3nX@GKxg(@vq1xl^TkH=3bET71A zzBBe<o9?-(YjJ{nuIjCv0k9o8cI_0z5lWoe|{=DL!0)Bh*9$i;7RLhbX z99YqB!=r7Z)S9P&YHBM`%e;&2rs{!L*}Pn3WKp>R@|?5PketNv4cc7A_PS41^G9Cz zzmhqbLiL5T0xhI~8=eH2gg5l}eFh8w!1CbElA}z`JgiRwS|sktCsvnV;D>vM@yLKR zFWNbEFF^6o`R3HAZ##qI_Ot^P$so!-WZs)8HQ~NKN|}1me@`h?EqAN7^8tL7j#91a zTNWsx1z4r{+ij%nW#HzP~|n zV$jGc=fZsWw)1=^C2(EnEOU4Np~^|2(}1M7W!;9vgVY+?#Kge*RvbI+EEsHtu`N|S zv29a5JKmS0&N|s@oblU<&l+8lKEw#P2U-E!DsilG?XDZrw|Ac!e+EsxH0%*J8(_5n z_&s~T$rwj=O*l5%gJe#|s&=dERtk*hx!K>V+<43~m8!}*87)^CjPEI?HUEi7Tml}L z*+&84W=+U*Eo!Q279eb&0gI=NhD!|VflzfmnDqRPDZ;K|1d=^44a?Xc!%gxkB|A3I zjOQOUf~+{WDnMIF##JG5DMusTOPxjNt#%ruJ+#o7bl+Gx#hS&qHI_;8$D zeAn;LEF=<@|3q9+pM3Toyh5oS!Vf) z4VgPkf7PoHk{<`&6zjL2*!PogmFY_ibI0GRn%m5y1le<}-Y=?PZAIo; z0wG9nYfpdmGh*Bj~l8Om;ES z$5x^GJ70lCi-l3U9hmE2)!!H+D#tj`P0&>#W@mC2V<8?ai1K${WD1bADn4fUjT4OK zKvb`43DGOLt_i%>;U+;tI;(s-SUP#3>7Xw7S~Hw`t#SF8WmhOAw&}**2mQe}7;V5I zuHRqzaX*qRTaLFX2{3fT;A+FB?hs|a|H%OwH{?C+q_%?J55QE|vygTzd7xLv03%7OP#vW6?HD|v=WGe4C zeih8?)GlrxwE@Q$a`G!$A)HrO*nb&25wwzL@Ep$Yk24`LpM#LKtIfKohRwoFfL-+# zDX{dS<)LZ|x_BR2a=%*`UIrLM+0%aXOEv;I{E|iAb5316Xqi3AM=8u)L>W-%&;7y6 z1a>;q<_eYvCX8*Oi$Nt?6)trVb&J(1hG#TW%L`fW$?!t%5V&bY<0kMy#6bMxw@|5_tmwj;^dd$NQoR% zg6ZOjJ!-$B4WJ6CKEr^o$cXSv)&EArsAU4IlGbzWQKYPDN@?tfq;?tLD>(KGR}JQ5 zpHo!8(kYhr%Iou<7=^=W$Onx92WpXZGP$(gaI#qec5le$7r@-UU?q6zB%Tai`cx2c zjPpaEz&&bF`Gu8ZIZxQ)tq3LtJ8%XMfGs-2ZA`*-F>twnA~~F_fKv#i$N)Fx{8%gP z7UjO-6qfVWnQb9)4-YcrBUCp(5SxHd;Aq?b;q4&7A2xq?@`#}p>gwAi|8Yzj-431p zkz_kCR%ROFyVG_50KEEm0@w3*zs!8DbG!)60VGp6P8&}~+rERK%`lN4_;A8ArwGt2 zHz5=J9tF=uQO1S923p%s9vela*QYqy`a-P%p@1T$JE+!L2+pWRxKwz z$BGw$9WwCVsCt&H{84Was93rnWxdU2U3b8{0JL-;Yk>jV6p-q`I5GkBQ)+-kOTHd0 zrfq!ZDXj$M->NzvUQbb@I11bwgDjep7U%OSoEunhct|w}s!X z_CDO~_tXx32Ns(I=Z7}|$=(sWe3vJjXg?`K(&I+KPOKu+b?Y*4A){I)kvm@+Y!%ti zci%GNgJtr%rDvP%+}$;kxx$GU&1V2IcrR23kn=;QpN~PwhXSlz%V{>_=xPjIp;E19 zw=TnBZe0zLRM9d?v6TQnRJVy;vjfn`eat*rkH9~GDORa?z!bNrHq&3i`4DcYjO*B5 z(f+ncU@fZp$#)mm1+TUn`-n^d_g~5ZvtG#Y{1&nAOsl-as{RVF0}hLhAxGIst}Rkh zOAv4ixGG@hF@w~3-D^j{T(WSAahcCc4q6boD z38;g{urR_US}5b@rh|olQgVJV0dw2!%y(5gFc!<-*- zg!ccW*Q3D{uys{HG7FMaBP>iF^JZ-ooDR2D>wrW$TSwIV{%qJdJ?($td-A*GrajO) zSmL-^F(8L!y&be)<-vm*Ej#4$RW(uBFU}4_DA`cG zI}6<(rTGZE#;uu=R=A5Z{sbY8MP(?H@Lg&8)Wf?#MH@oNG1n1O1JG1RDh_0%KuLAc zb4p9#{FT1K^(B%ydvS*xPm;_@hw27bYxMx)_`jG6+*WEZ;=NsU3#_>c&1NfI&xsax zUiNrBCsfoCp&I}_jNRrWh9yWllu*Jh&AA@d3M9V81oo?7XonO67^*)&>iuBsGk9@tgu zJooMw&;eo?WqNJ2fDRCAl4Tof8yV5L;FHYxz%88Mhg+r~tl~9SknKA9e<~7!xc&B_ zt0FDOZZTA{XT+nh#qQUK+;vdNwpY?|pquzOO^Jynvxsh~rEHJxZ?%kzh%W1fKZMWD z!dR8O_Lhysr(fp+il7rj#uVTRl3l*r7{W5lUiGk8G_Q6+{9>5T5vvGM%~d1m1?GIa zmBIY%3f`RSfQ}4leoY-a(P^~!Ai+FdqH#!mYQZj9VVUM`>VXkQu11-Tp>Gvn#vY3% zg8^Z8F0~#PuGg^@Lf>7BXtdC_gQG#ijl<12NX#-k8Mr4=%fzyX7yD=dcpY`5zY-NK!Vd(T<8tMVe?WjsOW05WA zeUB>lm&h)l~r*f|H+Mc~8e(xprf8<;Q0+d1%f{r|4!KCShgC^$8#d+(C4} zv3KF=;P$dE9*vNj-x*M3ChzgF+Q}st{wW}JKYP{VnNu$wtzyT9hhMg^L&-RH0PR+7 z+(JYk_ydyo4VlzFl34&%BP9TI^@}^Kcpm7W=}n9Vwl%0pH;%{~=m}#|hm+K+e1$D9 zS^;(<)c<%>k-~1aIM3uYo8-vFHVMxivrmm|>IVb{Z9q-!eym!ox7EvZ(=W*hjf*=7 zoy>^#!EsATaa>L7<3Y-5VE@UE?OT$$@T}XYp7;zBaX6vVp}79`p_d2V9^F@Gb!liw zeo2p}CpFpAAyiwazzj%9|6GC@GK0RV<{dKQj!W?dL8M54GduUV)&JCg?^V*d5Y+T| zr06A2AY6L*bvYDOP}g(LnAaf@O8_Niuo2uK^GIts%X~)%mUzI z!vroxxW!iVyo=9F!1dBWl+|QKxBR?IQAE2m40?pMHC&klCA$54GQT51LflUZxOTHT z%>m05$@Yt`hX9s|V;_C5W5CcMnu)0+0lRQ_PKxhCA2|`VFc6ez8P3%*Bt`RjHpi=Y zzJ9c_aQLvLc;gL*O-o{CUlIQrATW{W`DOu|K=c>j!!PmOur(yDO3v$y<0ce^(D@d| zMoff0uCxw~r0g2{j3aINL&b0w2^hpo--9uV0k*h8`V`DtGK(8uCfa-e6fT3d$8w4u zoW7^(ri*jm7#{%78d|;R>$4$j%c_ZWm)vF%sWIM@5H*N80G9ONe{P z)%^t$BKhe7YbTJ3>z=Gnds(O?DTI=^Q~@7fx zbsqf1FJfPq2~ZOY^U*&M8U(3>iuMGyI)QW$cn`jx;Y)+>3Bi(KO=to{?Z-t#c8$*o zfP@A1H_sI(t8Xn$54lq&-ZwH?L+lLFWv-PQ9K>D2mJ$mf`c+!>-LAoNrnH zgvJb-8SOf&Ro3%NA@gqi#G;oapm4Fccy=&)1a^Sc)#96(_^?CW(IEd3y5JYYB}lzQdWnN#`-ljx7*)OZe#k! z$i*iqR{01E%tAuK6LJR*m=n}{A)elw8D@nY>5n|i)w86h#2n1_xxocO3t8}tvE2)3 zXK3p2XE#Qtu*MKUHuY4IG5`pI1ljNguIjH1z?W1E-3LzyK*0^35CbS~;r)>7pk?9k zE&o1X?6(8o4bfyK)L;f$aTedC;Kva9P9u)LRq|J;9!~E^M^x%M`;CL*e>mwH-cSLjrG z7EF@0O#9Tqas*($t`-%`s;m<_sEzSz@{WIAH=KkgtQyS&&%+t4G@IE3IXfsNBEG&Z zQwQhOEvd~3q#82ty%cv-5ABfZ$oikDYg9`gfpO6tq|lI0=2_Cd&6EECtkBtaiSo>N zb@T+H2R?g>OB3%ic>OD=|I`vx)NK0qouC7+xTO&NrLkg6bReiH@7yI>^;Bw|>A;En zv*8SSV**d$;3V6$KY!|a305tTQ(9MV$Q|j7c$NJQF;$kkzdRr}rnO`Y9E907;*}Qj zl;iDyyvGvWWknsE0la)%AK{9KA;b;WSO!%&X7=0ZX;`Sm%c;eJa>Kq%C zQ@1C2%8Sc3xwh>E_!P-HBrjsTD1pZkd@aeg4&jL@R^BEmBne@~-Yzu=9Q02jPs>RM-vo>I7aMvkQKUzq>mK*k~71Ws{y?=at0$|N;2{#dy(q8_^S_fYT5b+JZ>0~UR9EDiS zDU3OA@BJoy@4g$K&K=q-F)Py}V{H^>h-ShL)1)$D1Bli*jU#_6ky%D zRg$44Ru&|XB*5*I=c^`<18^MBly{v%GzH=fzIXsKQfH9|n*!~_tmCt_XH9LVg^GwP z@JbS$EJB5sZT$<27lsf>_k$=$AJ#~<;%C|KyyViau9Od%5*&D-`!im{SCG(*y(6=r zc}&8~Xd;+s3Xgyf8QJhJk*yy&>v51*C)<7iWsVW}UKZg01d&}G;HW% z7dU?V-b+VxyfQ>LyvKVI7aE$@w8Oqf|5l;@m?RdpH|(FK@YK_}5<7XBx< z;z2tg@O)Dfp%#ckZ_Lbi? zAd@hz+ixqKrBZ?{fCRcHOuAol!F_J=%Ci3AH?+kw1MXOK$MFO`Bl~BNbDOvSiT%L# zvc>M?gHTt=&))ie+}p{@~Yq?06~K{%iYu*{>-yYOdMB@_O{lhxFT9*Lu>}- zyQ^&=jP^O+nRZHMq|D3?%w2zCZoRVP{t$G}v*3W^?;hwl&7Y+P($An1;p+4TE~eob zdPWWwZ=7w0N-O^`W~~62gZguL)M=4%!I5D}i>7Ve&tZ4H`fBP9ntpNVD(*${22tWJ z>=eG-NR`D()jBU%4irVHg@)~<$Ze1);iN(f_q_bn?Mb_>-(NuyDWZ>j^ZwE-@86HB zv5HMy!9>X-o$#HP7W?IA*^{wKR_c+ehJTKnm-^n{V|p><$B{~r9PN4r7rURc zce1NRZ?+KLTvj=|u(92ktMa7Y`Y+s0SYy6`0_Z-m^^MH#=>->iNp=G*)Y*$|-Za_b z-{R#ujDWG^5-ONn0aiMNe?t$>_Mam#PY3RA0`7_K*E2SkuuZCkUsKG#m}&EeG>B1y z-SFl^%liVCvbX&*?sDN<NOj|%$o;CLB8M24YJEq+jH1+gc>o3AFzG=bV26s0d} zGpGNCkFHQ9wa(E>`LP}zGTky*qS$M>iHHm^nX;l-LDa9oAooPpZHd{gajU+3RhkrIDR z6;c}6KIY4@9e(D1 zy1#*c9zH|<+;mT-hFb{DUB`-aC%T9jRL-lPnzJo$n$+I51D#_)z9T+%yN$YJgs?B~ zn9Mmh_4n?F7M_b*Ni-Hc?39M!ZqFLNO=xr|=qo*|V!tN!_X7Qb?1C@r1B{>w$#zaB z^R4ye=XAU6y{X&K;*D3^5%g)uQuQZFS~N@!?<&7(j%_-0Ae&}ra4*4dpi5`gkZ0gv!Q>?#5v(NST)P#?p`u^)cJG1Ai zXTRB4@Bi_$_%=S=7kdmZMbH~4cAToKyV8;${bqWhygT>yRg;$|OKb%8B7S%2XG-+4 zT{&)ciIp+NPWhnW<6=p5=>xS_-)EFv7kgKpirNkBYheq_tI$?4_!H6}Gj3LVm{uIR zV?g*d6LB9uer*v+aw_F2zp^_)!@t%$82SB&8^<@ztv_G=6kRNC5JHWtOG*WeI%ZOP zQkU)r**%5^6ECs0({pWbX`s96aI+)zg4~E(!bQ{DcMK~3p5q@pgEA{`iU2Oj=@b;* z+|6;;*B^u5-rM=|8jaO#ceEBI3lcrP~OD}Gbyq{llovJ9Rf;(!~ zl~s3zUv`BlLUATm7x3_t^uNp;d)weJoP6eFg2GW#0yV=qBs&!8~LC{n3$A+q(iqN1swNr;)?D!D=A;zn|s&=F_n> z>5?PikC~T`5Jex;kBt^w{dPgEdXHkEd`h@7q$PT|+FU;93;FoBzV9K5n{nDAMHz~X z8esvg2a$5+pQ`#djW(AR%8ZJhSX{I5Ctk7eq>znGa1Mwf1Nl;+)nQBTQcqWd=LP&z z`i1c~yF13kiLV<$iw<6G4FPKcU#!FwLs8k9Vg|G!!IGw`Oko}&)+fHW7j>8Ygv;V`~>Co3&3FHGCLa|n1cf;dvd*t>|$kbVz zz{*Bpo6Xm1j+_cuUZsHkwL7OLxDH~h!+_UsDg`pwbFv)&}& zgSch5r4!axN%YDtznp8jdzX$ktkbzoRKLs}R(UmmDIw508_TvbIVKabpDP!RxKD}U z(;p6MjpILqjbpem^x%4XaL2rn{h16?1~RtR9^)*KL;d?;tikTFde<_^!*O?8K&oNU)bM;BcCgAE?SyebNxO!e803PnX%kkKEo5 z`IXlw{E#&DS)3YA{Xr}B_kp7P@kf)`Rb&$t9K0Hp(0q z-#2_JA(JL_R8(R0e78@me~HHjj(l|wJxCql9N^@pJ+{U+c8*c{$UsEE#2c3z3^?X% zIo1dAl^PxgJKJcc`}$e18IL^{&>H2<4Ia+<-6FNx7`i39JAm&UdmgV=4K->6F*tl_ z@!TVADr}zLPCZq#!es2%N@6Z4{a)*4F=5^|#zJMbX_Qf1Vu@MmFSpzNXW7pO9vZjC zT6M3f6C;n5Jrb*PzIQj-?LNWP!J{!3ZX9$9HhaI(;||bcnhrtfK>m=nxjT}emMyhF zawMhsmqfpp-4uj^xe^Y_@%N>#s*zjfp=KY0(_@;8tJT3l&OQ%H1U7f=GnSv6JUPYb zvTiWz-9Ov0H9T>90^h54yYZlzcXepQvNEASYm8!6*<_8+@VR5hUvU3`Ro{(?KOOCq z!Fpb9nf$M`j!Q(Qe16ia+LC+2AOIB-dWP6PQf6(LX^Afi7g7ER4Z1Ig-ZF`F;`yvZ zOX366izb(QCePEqP=^m&^ajt~pQig>Ghg$8!@08O z^&}E0p*qFM>^iIAryfQC``zQnFAu`jUo!9+MJ3FB#vFyaT`y1QWX{gi_lJkFW&MdB zkmF1P`s3I5=j0`II_}OWT#o6^zwJ(-E zQK{2T=AK=i%@^KCRQV?I=-s<_=pfdD4oCl5tz%I@&q}vB*TlP&@g-lDdr6r@Um$>f zifC_A_oiuvfeZ!Jrv)|DfYh>=V%oyPMRDIV1CyrxXBSNx|5oky_J%kj+$13S2x!Ow zE$0~3>B^d+?h(C_Oi%vMTh*)2Hj@XiEBm8GlqE?_+@HpvW36ci5rfhRTyMOB$?_k< zr}e&|iR#V4Sr-}HIl)!iUwzwzrc4jM7auy23rB-}lVZ7SDvHPCUiggLtTKDwsj0+ROdRfl7F&uUR z7yqi*aV1Dw~$$PPPf@lAX%J;-~H>HtA z6>KAos)hT@ThC6VO0zzlzB4q$BC2TJqEW!xZ;wg$SjiWbP31bc!z(fo$!w-T0Mw5& z;&*7hVUN6K57GrCQ{u`8t@;g=M`W8^J~d;TkciJ3X(8w1xpHL}zpQ%k_mAd}54N&_qU2LtG#tj2=IC}ZA)scQ zfh3T4)jqMdv+=3uX;<+mOO%iFK;n4kK5DHQBW+VAf==JX#z>N#m&Kl1yndKpw>m`3 z#4&S8_Y0b^{h6$bGEKy2GUJgJQFKQ=wvd;DBG;^$>%)?<^KtNaQu@k`0PR?4QMg8$ zUIZf}-vw5DhgZTr1B>ZO{Fr%{k2E?{L(XMyqX*D)uR=Dsb~kT_A}T{px7F*jlkc8J z2x!cculKDw###kwKiIF#>^ktOU(Hy2#j)T;NuKS-5$k-CroP0Ja)grIUO#NI?>FA! zV^g*<#*rE-@(B`DN%}UO=FqPwh$)~26s1;8&A?k%usONa6Q=sH7hdY_(8Zgj(s3!g z;etvvM!*H>yd}?FNT3~6e%7bauV@t6V=E~Al(L(pPYB*RDjr z%K@Drx9I|>06Hy3umt{RbT|Ds4x1ahC{y6wX=aH;%xe%-oaeCUiLmug^c}Rqx73SQRq@IvI-k_L0~Rez#KVw4U)`*eG)^B(&lg zNN3R2m(u((VZ8b24)+YtCLUTi-`8~kWz>w9-VxNvoO%<0f8KXybG7|*8YE5WB~s}g$+aQ6pki1?^00A}nw1w_gxh=7 zhrW=g#l`beG^99i{c4-%Qy;(gx?RkJANx6{0NuOSOS(}6BZmPXqH_K#siGe|Un^X* z=$yI&o)G~!BYel8Fe$xRVzkViz>H3j_;HsxR5!OMYzjJ8-(Xv+Y|FjdWErq&Y*Fh| z@@-u6oyiG92EV%b-OX?>0SyVOt+sNaFN$;fdFM{$nXO!Ett5A*gu0KK)g>!BBW#eL zCG`{|R4_QkZm%Ii`9a97Z}~L|WC<2c4Gl}={>Mv4&Ei90B*ICM(b?YI}2YBXx9`Ss&Jx;*lGDm-u+GC?Hge{QxU zmwr5rR7N({@|9(Z2&*h@IpO-dc57CFNe0X{Gh}IePF|67{`el%xaYkx@GO3Fbxc-n zld;1-UTVvEO&|<9XO0y&RDvMQv(+0~?G&=Dy8D&)z*!b(i!Q3~q#h|9$*j`&Qe2m? zm%Wne&^byVmi)b!%4-r7M{{KxJ8!c#xM`~73*Nko#4a2imPAjr0rn93l8WUmOXw!E z3al2Qyg_K55}Nwv&BFO-@RgNXS|>Q_rfU7a^YEuGvu9#QMNd&}P;|XmSL3u~<;E`H z-q}a#rz>=S;=MR&8TyruOD*J{GyR9%aeWrj3EvL)Cd!47^Ml3>-vU3&54{qPIWx9s zD?oV3E_qCfmMTkL8|8F8s?qS1reI~=ih{{ClVB5+;$LVjUqz>~cSD*vJm}RqNc$5Q z#aF9E56)0W;1XtxKuO5G-_%E`Z;Tz zb2rDHmr4k<3SUdNRUKl>GbJtR{CK0og*sVRl9eKh3&mU@;^%CexNr#b=|--FC#i)B za(Uoftn6>N6nPA=qYxNyTq!YNY&o=ft+4XKx5nKA2@8eQtS%lF`UY7K^SAW!o!sMZ zVaKhDSX49n2YPrq!OQ3WKS7-9PD9_jNBG#4)iFiUI71=>-Ix?BXc@b$iWC)p1MYL2 zlp`n$BKCK-NvZi}*5=}wf-Z$zzLhYwBn@qhfO#X3_YmZ)q*Xb;#yXopmb3VL4_(P? zpF-B~XDv$u!&9LR{&fv^8wMML)}(`Gs4I)#JYYn`r;$Yje{{~Q#_2R|9`)QEwte-{ z$o3Z0KUgd3i0hr3klqgWMy-)LtLv0PtZKi+VyHHlrXODs|4{@nmF`Sb6xh8@L4kc4+8DAG-W&Sqf}i5z`uV)o5<8lpoQLT`6B zD(UzZ*xEKeN1CFphMwx}ZNRMiGq%hgyc(6k+#@rx&YZVAj1@2VjE81jZ$R)YJI$Gk z%^QmsdmOn#i=%12Qs0YEZhqIcV@SVKRdcI5<5s!}A*)1uxu7*HpoL$=^2iFy)$?bRwBBktP7-9s`<${Jnj>x7(O#FuB-jsAF4HJxe4BXt_HxKZ zT^X1b`|>q^_Z-t{xAx8!@Ya79Wq3k^M>=t^+w06}j`~(pEyt%VG%9m#QJ1vj6MG`P7va&XIF$2^47}cJ(~PH)%zz^=I{jXQkVor7DQycl5Hjpa>_YCJw$F!7^i{ z?s$03@vr`o17m;>p&oiq|25IM#Z%w}Q{6ynEvX(_b>0Q0mQ%(5LJz_3+mOiwI9WJ6 zA4*QyEBqVreWbCvU+s_Ka#G6?wqREu^u5RX+g%&&v^<+5?3yuWwGvl&sFGIc;?}di z_T>WI^IQNrlWhHGGkt^l2&N#f-CDtOaPfPLNah(0%oY2=1BrN+ecz&+ZsK58^l=a_GPqg^%Mx*W%(A{aJ<r5>V~NMAP*BS2az&Q!M#m$EBEo?JUV zn9No%u&DyM67F$^*Y;C=&cdWX1$V_rG{o(ukhd5UXf2`l#hR?j1 zt3uuwNrNYi!eSjLMKi9tePu3J4F%1gdGyry4ugyN0StZDmLEj;aVkS<9!nT)jw{`O=;TM|Kl5~RRR6jNQRc~+^hGw8x+@RRWmi83m zh&Fh!DwZDirddAwJ4gCqiN#kFji15$H=y$8aANtR507kfObh@KTke8LM(6CQ>D^7I{am_>&Upy0kfxwy`d&Z@BJl8gizM^2y zzp;aNC`L#YedS4u%2yuKn%f&Ag+!((d&1+t`Fq0opQ#eA8d;|9e0Ql!0SQRo4Pzd1wltv5&_74or91Fz2Vvooqhu})kHGCW&zsN$p5BF(l5OnOP36l|F0 zr%w2MOtlZ2`+J`uIqUnM51TJS=S_$Q>uOhKcYN8p)3t9qCY@zdJrSKx-gygQONi`M zLc@NdE%%=7Z5aH3+}ahq2hSmwb#yAHnvpkJCNj41G>Y$}x)V^CEK!{(@A7z89}f#? z>j%$_$ZLr%soYYsN7I~8RblU(1K%KBh&PMl1`=Q7^X}-0Q*obD_#mY2WGHE^^YkS| zg1!o`&s8{l1J3*2&W0yX=yEUbcH08DIq>_xSxp8bfii&|Mdz2wimt0OAHC(H@ou-) z(_h|yP7M0GC#jMg9oP+ucG%8vP!6k$Nf-wSDt#PuDi9y}cdgX5%5}IJSBH)(1fl^L z%a-rAUl{Fb#(I;4jEaxeB!+vPr3iA*@h9#y03HvI%1;3giLLq4_+0M7wlHv_D)Lm% z`TCH?%QTsJZuto6Z~NfByRPsja%|9ZxjcAt0Di==nHIv80T~$?4Kgs=&d%ly7`xSq zn`}!hGLKeXjsGZ#*v0eyF`q>Z&V_ripg5B6zW+Y`FPF9v&Z#aBI~zZEL#$Q;D6D8X zZ(o1h((-iYkPfcj;Tarjz`wYh_F4R71ns=0HKTs&Xfk-FB=otvgq%NJ;gpy#4ESrEtCjQQhE zgW3qI+nbVS!xi8hvk_+4c;I|R z%9{)IilQ%QD|`gPt`O3^6&Q@Yg8POWbhPx@(`foPk7w$&Ntvk)XmC{!*%_N|7R)8k z0L|}E{-Th4YGJF4PnPo~l%^XxblnImj=jnx8c(Kyi(kDdO&6aV9*3VMvL-KAaovuC|I|=0Tr&e{JFsU{t zFXX3Vh~JE_2LX6qegtcWtM#GQ4<3}hrSXK7i*AMuEG`-{Hgi`k+ECz6)Q|%^;~B;- z=e6%|mIkhLmgT1{T&3DL|JvDdkv|aAdyciARDJCM895`S?ljXO(8?!bUC){L{s{{x zyjg<2w*E#Jv5jN4Y}^EERF0f+3-y@!hGb%wt-T~}Fe&{n3}eto8;8hUZoN-dvZ>Cn&Dee!!r{mPqw zT(rRHx?0hNs)P)mqE9Rfe99w+!=@ac7M8!gn11o4Qy!fPzPoBk(@PBnO7M;Do$)O{ zb$QnN9i%9+1>l$%CgB&X(Ev*C{5blb^;`XfwZq+_6&WCW=$jBPOU?uS*8?g}sPuoG zL#b0P3D6Yzp%(AENmQG#xaa8;U5;{SgVqoAmA z;291LO&WJ3i+{YF5{M*Y$H3U`{#6V6DDp{A`*FiA8x*Z0@v^IXuVp>_98#xzQ$a%j zj4ZM;`93(=6pfNKn|W2b=51d{P~pMiYICvpHBWWC$~NQYjmZPCGt811;;WJ zJY2yGdkTm6Szi3V=Xv+qsBAgE)E&C=4&rs*9oW^WI>ofEosETwNfLg@SRtIYxS7%w z1*Ct25k?c@rC5NK1Q1vi?!5m8yoH&`ubvS0-~ab@G;Gd&w-uhhWJ1FhA)88RK`hRo zSCX*?8FHeOR%T^Sbo$iQ-e>wm7a~iE9qH(X?GW!Tzw+yLyM$No1QR?>FZXL!$CfshCK1fiNwzWw2t;pgQW@`_l1Z6@ z0Y+dbdbmT;^d7e6@sTcftadA3c`a`8+_c=5{YrnSi4+$It=j*+E*ce)R5Nb7ruNb2 zj8n>mVx*_{x>)FWFS;Wc9yp^PlhPof_>@c$inKJkO=@p3Wm0MLmN2mv>_FP;Q?-6o zDU#-<;B7Se4mh&>ty$VzJxkaipq`6jb60*JR!n8x$+x%B#3-5>IY1K6ckZNy#L~I0 zQKp!AXpS|NV+BPW>f0LbQ(XT_Hg%k$4MknNu(a(icARzJb026>V4Tyft!`Li|`?vu_MS3fQ# z5F*s%v7{yl!Zb-UH@a7~#R#?}(4hl1+nnC5m$o zy&=Pv(xM@X2`{o(1*q4V+BUKOEYyNrGWy;nNzWor844zORw$C7Ei-^8-~BlHcq|Rp zdj*6up_}728$a!V%AR~*NZ)IkmO z`1tQ-#C-}v+|a{m<{2X!r+0srWV;2Bj4Xf1$0b#{9pw$9$e8Bn%8b%@w##fgm9Lw+uLQRhTWy(-9kQ!V!>!l<4$tf?ZJ4G-EkLM;6F!>NsaQrq*1 z?20OC;7Ss!m_z82E7#YxTz^im@XfJTG$yj95JW}bs&M)&3 z`H}_F;o?NOF=XV&IpL~wjL14wQirT8whMb4=aZk;Yg6FXste-kl~0QiW#s3+ z<5(VPcp4c=aNK>*Ftj8kgx}z`rStOg>hhB7bZ2;zq)IyvjA2QUv~Yy|sXdC67NwXL zBfzm>zTBDo`y|e`4*cJoyO2RxFdedt_962Z=fPX@-=VkgF!>y}117m>`Wl-F(fuJh z-yUL3HmLdGmmRz*X{KQTgH>ZK&P=VD{mKe#|GK#YSp?9Ao_Sk|3q?9Ek&m=_SG9+| zMUm2M{rsQj0CW3D!DI2TVRBvCvTTV4%u4Z{7S#6p{S-Y>$cG zfSy&F&(rR3y5)ht!2owOSv;pJIS+A;Z|#heIx?6ta$$O}+z8ghJ2W`-8n~d{+n@09 zfe@_g8_TjZKj0beWci=pKa1^FvAvpft$k$aOK}rxg?Ts^Js<)KaG6hoeX|Kl+m~s> z?{D~xoEc#E)acHYukV(I29%PB-t zGqQtQfrsx(#Vi~D{`HlCeyKQLrn?VdG>UuS3#)iv9IMykWY^nlB^4U7_&l?-+z#o4 zj!`C!=G@aFi3>NGoX{M&=yL3r@mbq`il|9{34&}(fgAQ4Xn{lEg-_;CRVp2JnI9rR z>-QHOj-(R1_9UKR5_IJIcJNOLU$lS!|TTBJ%G~L0jgU=Zq zEp1V-xxg+cYp5MbN%(Ai3-)%A=wGni_1wWZYG6fAMJZo zGWO+sTrNZ5CUgW>&y{nLJLB2wv9?XK$eL!(hxoUI(p(+=KR@y+Q1rf?i`M47oL>;6wt1p|F$>asrYA1Jx2b>tR zg|~5Q;HFu|f#3rTb_x!~xjRdWwB+#<;^?3c&hJ z2_xGlWixu57ry=bfwowgH6{r_&{UO=3DT+TFWC)uGlWzUSt1MSqGVya+YfcOfeH!X%Igx~Y-txh;2gY^**@SoA z)+j!`+rEk{xEZE5H$+S)Vk50>g)y;3cz1{-HM#l5v3T9*1n)fy%-f1g3=d%r-K-+Z zDW=u!2cTj+PIugAkral!@;+|Rc3z!5{Dd$SG6)3$S%HF7cY3mNJpE2z)_2etmUR9c zW0r;erP~?}sOi)F_6{gb>=&x{5|nXInUz|xM+LBZ%XD8TvaMdIxiIT9alE51J2`n)E_V z=Lm#)ddC}JxX{ldap}d11M)19?X6BCd#TE9m0 z;mYglg${c2J&L=qIGwQSouhGYNvt&rwcZZ^I5!5>CX1t$t%Cfv(FeMd>m@DrAK#i^ zgEzZ_%=#Inn9_wEm~uAo>-$F=IF>A^l@pG(TfS93bBB>v`xp%?vR7WoSS`6RmhS(g ziYh5viB|Y4#yf9|$$428KywIQa5<7;J*;|WbIQ8k6Y4hj=$b@*PqAmUS|sx1?5ku8 z{t9YW>Ek5lKS?y#2^eOi=*Sxb^^*R&p8%G2+5E_kNm?Gr2-Gkrp zTSJd|bhueGZGSmeTJ3kbbFJStJd<@XSmn)tWx(PS$@6#K|D7SEo5w3Fx(89)7RSKCl3D9hE~3k_dA2} zv*>;CcmLg1hTCc__#G$q%8iqROZ;c9l+1Vkk05Ckdclth|F<)FYvS$a>U9{CC}#DM zr>p;m*X1Q#bs3$Q)hEwyqkTk=0b$>p%u$Zrlv;nqQmnG?C9GKCoijhaPag*?w;MoK zy9}~kzmv%QEcl24BM=j!6g>V%&coH}jLe5XlTt@Is9L=n?y$K$+SH2Yar}#C({!TL z`YKRH4(vqqE5>LR-zQ=_cWWEG3OLsxm4<=sjYKh!*4+pQAGfdBo|y%ovb zE`T5A|N3hF8WxO%%Rp__6hws-oZIN@_BKaej;~GGyyWXYx)LjrgRa|M8$4vl49nSp zh7I**Avg3B;9Gf&FiG$JKFe)!Ao7x&y>GU#JR8pOJPSW!rC5Bdc1JXecoTJNK5He1 zz=6f;>xuSNUKJGJhtH~6q=C{-#Nw?-rA@=71LsMliMxwW zxOKSM_ZU`GBN43xxIAy!Vx|I@0)nkbQDe@1b=idV(unz{hxI^W`hf^rI z?taZn%ELKre_*nxt09smk2MgI71C}g-9Cn4CB+v(Kg7Mh3n@tNIH~c^{x6@BnWZ0} zaD?RKO8`wzBSb71NabyDbJ|CNgihnajma^}ioSg#xr^h1Vl0J^)?JmZ@nH7=b-gH^>z*jD+Tn}IP~$q&hb#?|oa@%bur z{NT=>YqECKl{Q)p6)61Fw;og51-e%F2_2*9RB{$qYl08H%GdY~T%&$mC@dd_1Q?Rc z=8MKiIvP1$hi#uIJ;Jv1y@s`pY+qDVtj15g`TRN=wp@fsRS8^wbC4vMJY=>>DWvCZ zg?uIo%t9@H-(JQeV2{Ve{DaoQB+@Cf*)-kO#5aC@yt>WtnrEyf7|f2w2&T*UzVMi; z5TexG41@rhVA%N)Wa<^L&UVqVJhNgxQm8vSDn#oiHaDQ@wN z!^8QJvanHsfeeZ%U2cr9Qr;9w;eK_^%w(i^HPvZ5W#8qS(7e+1d8Siq2}f?<_>Mq# zF#LJ*3#WIt!EBRfx7ssR*ZkkCP12!~ipNt}qHnB0QK##<rJ!K zO_iki+?@36O(B%xSo?Uc|1xIkBRZi5wPi31&71;9lX)csapM~u#;W4)m+e-w@T#EEyxvYzGLe6TW<4ehIpHTlbIk-{!_S_(p93OutbYGg+ZH~ zM5NNqn*G-;n@hL0lc}Y!8UBj`pQU~q4a^P243nJ|Ehl;r)+|Oty^Q@2Raz>3ArU>G zeh_I(%Fka5bhWH3*8i3Pl}Pd5a~hb-t`dE^3Vy}S0QqP%Jv4Y7h=k| zRd?&m<~nqw>N^iwF;d zlChYhP8wIu^3!y2yErcaKdPjs@4{)=#(~Jg#9d!lm*p$u2&H?2(is{WMu-iUVW z{%-)B)@SN+?w^wfiq_Fp-u6=RRcmAlh#799qtRu34u8`wFx++@N9dK#>f@c zVY>x~Ts3~d0Mt2S?ID2|i8uMf#vl~&MA5P~W_&j?ar*s(Bh$OpcRQF6=j`(b20xw8 zf%U1#=nr*_*VV;xjZSQY;%q1zz{Dq0w@`D5>kCvNBclv%vBN7 zm`8YN-8mOj3)>Qfb^jCXXVmXJdyh5nGTar?IAaq&)iKm%9Cn2ISeu5(m;;J~Qh7F7 z-CQEuu3%jdQ~1;>Mmh~SzTm3TWgX4ruu|=z5DcTy>jQn$l!Nx}p1Hb-)Fr3o_RQv1 z(gPsyc`G!=0?){IpT#f8M3Ie3wxryzA#^sEZyEhnCbZxKov=%w#+AE5whT>e+*;NMp+X|Zs~=IGu?(wwvo*GGQeq3=U>P6nt=&3#67 zFXth4kcWk(dSRz#nEx)slAr1^QB~Q4t38SbnE-~k%XA~cd^xtkHXMpk@p926c!>Vv z+zxENRU8vmUJuLiJKoV^s`_B>=U3$`L>lY0961b9msk4{Nv|+CntfAgCao)e=!>z4 z-J*>RM$X)2v~Fsg=1yt*WpuJ^@wHQ5F^i*FvjLUJCm$(J{53j6ocfz_E;<4mr9{@r z{L{5Yj3Y)93)Lf0GHE&qzNV8z-!Kw-nyNC9i-O8lwdjRc8&1TM0(JWwZm>}mir#SV zn`y}-ryvra>7sDmSod5Y+on~=w*#pPj$4x#pr}o9N3)PAZ3b40GP{Xz&TV6C*>wA@ z-G*MUWc-oyoKz}odqIjnN39($#2pO3JOt6TklSMR#h3ez$lLt5?zqKMx!rWj+BcHh zSLd4HDjuCFH`a=Bm3H}^^x=``8RqVg=Va`(*b<|K$Xbli~C@VMu%CXH}2Ni15h8P<@YL2CpMwNaGaLm%O1Rcv5IV3HIrT7J3XIXD z3hQv}ft~&#sgM+}m4rMm{qxy{xTc4GA)U@A85K<*3@kp2D$Og67LWS!T%pE!>xx`b zEhX_^4O-#(#P&HT2p*2U{~-1lJgbQ2PQD?psr?_l&IZ)?oI;c^#@}k%}60zbh17HN4Ag6Iw`GjhELP)KCq(%!r$_KHLw1%L@^xE@wA+xN?tylhrz&q0v2`{SrC5-S>75d zHV#)`NC5eKhDzMK-@b%gHZAsDhyUKGC1DFAyowAUT3~_&^e^b9pqUJ$LWBAwiRIy! zZot5+fInJs+zCUOC!DJOYuE{>he2C{a`~e3R%NTPQAq&eF1=!4tP zEwQDAe?(E4HvakECZRZvJh`g#hWz0s>Q{^BrwsY1oMscG92~2B2F6b>bPCM$UgiP4 zo?if6ELhlHY)Qj-HUEU85uI?>oxVk<2Jr#;KKL3E-l-_i#TDGO3(5A(7&uL@d~<;Q zM^gbXXg*8H9Mz7+HHOr4-`qw(FC6#7R|6H(X1kwfmPLw}eVi!f5wA^DD#_;ukBn{U&#h8 z$p^w|Pt>V8zuM|rnd}S^jmy^I2EP(L;Wi|wuuFF7)Ay@iVK^?Mtwk&Bn0QR;E5=!+ zX|HSG8ON~ZP{*U5y&s*HT>CC)4-axQta`%xYKB}eYg>TE)qA?=^7yMv?osIorE!ikWy?Go! z8zJ@TXai>{I?;X;B-n{YH{^4LZNlGn#LnrYo|MzTlI?BbMNCvG&-u<*dMRUX^-h9t zX35jd7+2Q7pPNOsyCd~nM>$GadQSAh{Wxho02(W?Y z7b?xds|g)=_*EnIm}nhKjPk~=6}vUUTyJ*0+K&EJktop$Mx|Hpo-#S0(^9>q6-nb`P>>hb>*P%yKEJmGh7^{2-CMFE;=wN`XH@x-u#rw2a&dGK0;EV z`hv%3g=0g;YZ9H&J8SC~3Nt0_blb(W{k1Ne(+LxB{kG6?=csKHW}!ufwuFh@(wiv} ztvE(IHw**ddq36dT!m$4n9pGJ9@}Xht<>CEUsM`idj2@mNdxyH!p$+CcyUY}SY!b;W!^97aHsPNDg z=aZk}c3ggrY*GR0M+Zi9A~W>(W=@E2KhJc(0#+!d-dkDh8|ZXH-De9viGE?2S{|wm zG|i_+r!%5{aN1%4R3P7@8{l>cC0Gl8{6A!!Wn7e9)b17OkZuqe29PdEK?JEGq@;)L zlOjsg_P}LjQ%(*p!S-@Q4!hv&}C&`Ap=4DX7qz4ED|7O3VIlqr%0AYg# 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 LHb+ZMTqFJiWGw*r literal 3945 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 BT9g0) literal 3651 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 PF9^yC>hiTfNa+6nt0W)Q literal 14445 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

^wFxFT{}9BsdrjVVGi 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 diff --git a/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png b/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png index de73af81700872b7babfcd99189a66ea47db7eed..b06a6508fe0806351719d8c30b82305f3304bd0f 100644 GIT binary patch literal 7508 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 Xm^Kjk6(g|#015yANkvXXu0mjfLev!U literal 11529 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 a*1@`ZA?>c!7F5m*BPXpaRViT_^#1{dpFcbR diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png index 110b44a4c089772b042fc3cac91ddc8b9a519be8..86d5e7ccefe1e4b604bbc7ee2d8f9827425955a4 100644 GIT binary patch literal 39511 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�F*&X};U8Lbf zhb>J)Q^IN{zR2YihOUqIoD6#R)?UPjbLmqHPyd@{6EJtWdzSF`r}&>E2DDplUhtY` zb|$U;5GdFSn6HDw_sc~TUHm6>=FLQl5#k1dP|f*&1}bo%7K7W6vTs;Q#7wh-f-hAh zSP&KDQc|kEeR@Hhd7s-^8@-2F6722=hB}l3I9)o(@EZ}RZ2dnY7|xF}K$)H93~0hO zixj1Ik19#&x#&EM%fxi1ZbcvzEO^U*FY@ok6F)8X3~$;@l2TuLsklFMG$D+iVU5xA z6sdGh&SRqt`=H`G5tw$xL@ecXoCvxF_Xw{E#C`ee*_I2l z{Ud0KwP-%D9O1;Q7gd~%LfTOHKlm+Y;oCI-|Nf(uS=`!7B{8dTUWjNM`H7gY)XlW( Hnos{fLbS%d literal 117975 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 diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Grip_144_Dpi.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Grip_144_Dpi.expected.png index 1900ade5e258af8cf1d0206d405afc63e8e6e4ef..28370f3bce09fd2ed02d75466c2bca1cbd739580 100644 GIT binary patch delta 142 zcmV;90CE410>=T6L4R>cL_t(YOYN1r4Zt7_1s&1hA=re$?1m<6Op_vx_$6e35DK4! z;9YAy11TlxM*!p?y0iNE-Y|23fzx{s=URGDU-{Z^c{1&-EP&Z#EDgyM8?lJxRzKGp wCJH(HQBU=i(d)`ujMt|=yPh5O6^jTL=%w-XP=}Co00000Ne4wvM6N<$g6UI0X#fBK delta 214 zcmV;{04e{+0gnQZL4OHwNLh0L02UCyOkSZTS$eVOS;Jv522%z6E{AYD} zx8pcYxZ^#Jt^?I|gc$V@0XNsr#1UrSL0Jamd6W?K5DB-RWl!M?IodWXq$xkX`<}bH ztS85HHf729jCzQ)oA0_3RTZv!CfPPNby>H=JWnVJ9$wCIr=|%D>cZ}D0ye~xy_sEw Q+yDRo07*qoM6N<$f@V!w=Kufz diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png index 2d7ccac2f7c06179da05d9674068c128d2364338..c1898766aa729e00d12db184e344aa5b8b864673 100644 GIT binary patch literal 8882 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 HGY|WJ9yk$X literal 14390 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 literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Aliased.expected.png b/tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Aliased.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..0075bfcd3af3613bdf8358ee8bfd682b24180af1 GIT binary patch literal 1066 zcmV+_1l9YAP)VCzX`>B{wbsfOFvh@AM!mq#U^i>K7HkUOqFe81+J zqWAdd^RoWn>^NCeLVxxBUmyRzl{xrI)6ZM<7PZ&N2|N3GkD`MAQ)s;#l~GiGGTmvv zm3iW$-Kwi&iO`$n5B|y99W&uznRaa>23%87yQNq?(9_cxLid~eDrJn;|I8>as#Uu3;w_N#}_*63Vy^hCP!+hgcG1c)`^dM zoB$2jz zd2D;WSv~O;1FcxoDuj6uTb=w||8`Ur1Rr-wUrkm9UwNV^*S5mRAHyEP#6L^QknTY6 zaimqj&oD_c)Ceb@@8k2Kw0v6c6{NdQz*YxGS`mDeNqf>~cQDCo;-|U{;){|u$k^)O zNVCCDb(a5;vF0q&^wwkIdv0^sQteUhW6*4MYEXKJYzi~MPjP17$Xt7rQd58T#E+OT zr%g50kg3*XW^8q`^ZtwDWq#*(H2AUy)FJyZMAbhMez{)nocNJjj>_AeksvAb!#n(s zug7zB@)!-yj?j-jv3looKfCG~3BKHAYr>9C6;|rcliA0$&zuC)J>E6(6)vqjM}Pl1 ztm?7*I`OVfU0%aSVaRps4SvN5TJe~?!y8r+H07*qoM6N<$f|{NVK>z>% literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Shapes/Ellipse/Should_Render_Circle_Aliased.expected.png b/tests/TestFiles/Skia/Shapes/Ellipse/Should_Render_Circle_Aliased.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b579f821a0efdb3d366153049a1e11ce15df99 GIT binary patch literal 1655 zcmY*a2~?BE7RH~n1QiGZRw&D_DFh7xgF;hkf2HMr4G!VAk&wnijc@~{Sxh_cr5@_syh@0@qfnYrKGbMKvRX70K3 z-N7)L*+#pKMn*mL=Fd<8shDC;F1v;Z(6tz@w=k+QMF9Zk8wdn3 zX!JU~*P?McYE#xLd}OFhh-=64N|FQ8m+oQ(w@?|BMv$AcTtz)CfXtQK6pk&|j_iJG z`ma(vz3mZ9^VPmF#Jfq0D{Tz==S8ZUg1vikGZf8yu6q-E@iG)*-ypxs<$O`da6=`QPnDdtPL1^X5f+D4#Rs z?w>hInR4`=)l9Pha)y}~rI1)*+dRJ8DygU^eqi%(5)3Jb%@43aXBDr%lKerOY7Zq- z0%8yDXJ@~Zg_pN+;A3Gz|8h?Zt3T~}AY=0UP1^(&di>J?l`8-r#qP1z zxIaSa`$CA6zovcTTXHLo-ZI%??rn?J*##E82X<=M*N=dX)33uiX!qg(OA~%5f3F4A zewOcCUdw^cV?C)47hU4)^M~1Gdp9Yxv4b1s)UNcv{!v&3MFiFh&r^9I&os@`h8U5;A2~(M}Mn97?ErcEc`_NWn(C&*G*R6j&qQL={~%1 z{_zrC&x`o3jF6+}pr;J*)L38bvjtbtYZR+L(Yw-^=&x+}RU`S@BC%xs#fA>}9BRmt z)o+1mcNWf!3y_l>Bw!8|#wYteDu~QF2N#abeJ`{|Xhc{jtbe*B7t?mSpbJl#Dy)A$ zMX06iG{eDxb)pD+(c^7!cH8CqO;!qe>7$siGKQVKljvcZG4ByGUOww zOhFIsWn=iS!fHvuy8H`s^BzwYG}y_6?B$ip1A1JfKGWj5HJ`VK%LrZ_eQTUABSckv zJLRZ8yRG&zD9ShA{uap4h*N5G#Zy|`uy_?aabfe!htqcADsX5YAeeAvT`b?rV^BRC z`BSdWEKmd|c?)~!!4KKI&#{mD=hez_k42O^r`xNUuXR1ngMuyl;D9pWMG7~ng&DO{ zHIP|Qgyagn(8Vl4tT^QjwY##8dE5LK6Grg9Ph3{=>Id#D9YV>f7R6DKc**i%&P7i{ zc-!X47_AOaOEN8wM6(Wv&5~|R`8Vk%F5Fj-r~e5BtCv@@Imbzg>a`9k_~8d@pQbEy zihx`u_OITU{Ek$x=Jwr!YiU)HYZ@BCN%>5fvP=+1ik2Kh;hg8aj%&3;GE{RezR?h^n2 literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Shapes/Ellipse/Should_Render_Circle_Antialiased.expected.png b/tests/TestFiles/Skia/Shapes/Ellipse/Should_Render_Circle_Antialiased.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..30df84a1944c8043744cdb938a30e4de8fd49eb3 GIT binary patch literal 7173 zcmZWuby!rn8YBj!yBnlS98wgO4ke`D z;rHI}ugCWdcfN1#J?GrB_u6}{bs}`Mlu3vfh#(LMiK>c%9=HzPdS@} zCa-Eh2>yHst->J?##U7YIRmc`J4@a=R5n*K`=SDT0fN}~b6CRy11+6eI~5Gl))`QP z$TGToe&?p=5$6NWt$CA4lWC6iFJcrNVh&^ z4}xWns4mX@G|8nUtwB@}Z^S{mKOciN6hwd*!|f?mRg*DL*n>ZvXpQ;!Nh ze$1<`*4s=F7qXpT?d|QAE!2}M)O&TfKB<>#^91!d(2A|f>W{QTjOk%9U7`N^d_X-4S2I)}NqgoMDE8G{#1u6RdBN6@R- zpdcIrF6w2Uzna`;wS<@FCk=Xa^(Y+dZv!m;y~}NH-+b>IrFz9{{MPd_?#ET9vj)^7o+U$ z>~d>t#;0aV^l!-)JqeMQ8%}*v^!N98qEdc*vty#Lu<&G)+wb+GxtHuA@{>QWrP$a) z$FgO#d3bpAQhCy)Y2$v6XHRzp5pYUMwobphmpW|M6^Q5lXHC`K);6x$D$4tKn?6(Q zP2jKbY;D)3*6AaD`xy>#*EK>Z|Em|93FV*0aSN)e6QnQppZz&F*l=gn$d=BGWs*<= zIir{AfS8?~O-f5s0sH7$v^6j{mnwa>{s4J)STgg|Ota#S3Jmt(@^svvtxylMs^sb6 z@iFR0z5J!JvNG~~r(pvi4XnVZ?LI4%$%dFoJPG6wCnBOv zOHYsD^z;!D{4$0YXRKyEFc zp~A!0sabr!B4m&ERRx51q#m2^7-<(D3rP}bd+){CK6Lear*L>|ihry(K z>@D*kyfu{7)o)+^eBytPot?eyM>k6PZ19t`YHd_NQgZSn$m+u@u8`nh9S@KCnV(f! zR@T#vIRE z$KSew-tIgi@$Ev%T&XNCFXuUJZf>g4^1g^`uGPX=$;PtCXbGfi?0Mza)*5V1rA2_6 zpnUJ%JtV;%2x@9`Eh*-O?D5WmGASu(9<|t;?+T@5Wl3OKHn40Vk8P7l5f2xaoFIZb zYS8!08AO9%p+}^@;3H|1=#JSrV^ET(qv-_?>rd*P77BPZd*RsCh%KYG+K{&YD6Lw@Y)gQxH$Qxxk1g=N*9px{29(l`ZWr`Oz zxE^m~9w1CdK7(t%D5+MqG!Mdb3V-d-&tc@sTfghelS1wYRomed9%L#xwB5&a>ixsp zgXPZ~4z;j9nboP4x~9dLwEHwI5A{B8a8@-!J;dVVV+Wc|Sit0FThHurT3a3y;p89-N_}p}YZsg2KYpL~ZFRdnTiW zJ~eG^Wep8tGcz+tt+e`&v!gAq)ezdUNvRrr3@I`^)FG-77vmqZHEb!=v`3Hx8^EfBWe6JTho>Utm9cy zJ%M<)gIyq_;J)SGBQ@#PUi8lWY`F(YifeWXf?yQl0WM~tE9n> zgnZP_=4E)k*LITCcUCjVYa}O!1$s1(WbD`3S!zW^MLJ2Z%BB`eUmb7nr}EF99c*I+ zA>~EHpjnd9(b*oib5}>zdF+@?)-*RbE%dKizy+-a$sCtkO>G^77+U|1NziNzZwsn` zeq?EB8GH=bLVRi}0f4-lN6(p9j8f44z6%vK^(`5&xV~Du>5+MqsZHFkU+^;XHnYQ; zp0GP^VriJCPoJ&=T;^q$o3}BHj*h~22FkEbFaD0lXJkCCrR6q(B&%7E@zPO(4#HH? zepWg$Haglz`_kvt7wM7uC__WTkhnN9u<~`|mI*uT$vP zK>H&kC8hb)NDNqmpP%%aYts;(z?V$W8ezTRES_re-|L2fQqdwYBL&jFCjfOdpxunDTai#}2S zNdfBW{`%wtNPu2RFW4MFz2H->nptwBOyUolMf`W>>+X`m5o2RxCN=Pw2_y8Z81k@q zXjs?|-_FiX&eoR0@9NYBQeNV_{|zfit#BxWAI?!{Mgm|gBqRi}l~RT3=s*Yv2=Y_y zrifk74(;yUh3ucNTxa!kJRj34*zLc{pFHGNyu&)wbF`FS%)=QgJ1U{rL4?&by&w_h3;Cmq*# z6XHf_G&;sCR#$LvW4b8B1wy827mW$D9!|Nn=U{IiEo~yo#j2{R+Wi)!9JfhjXYm+) zO;X5h+HMTS)OIV@^cmgVxX@61U4|duzvt+1L~nlJSJ&lAP7}0=osjlDt99|~CBr9J z8%Y<;i#30{BOD}QJ;LBV0Dtxjr~T^8At?2gi>!MQ7cDLAB&`u$&7(JO-nbwT)bst@ zaC$1TIy0WL+ReF+D`A=X01UUWvGK*GaR36YALTI9YtTjFZ6u{nRSV1Jp@mon2l^e{==c5hC=I-E;g79a0d`{z;Wt^pUn--TDM({aGe z?Cfe$wjafO>)XEVnBBC|&!0CB-l(9k6A}{cBOygiugONz3hQJ@CoijC8Y8LV7)71K z=PB7V_;Q5$3yNBz@YYcqV}~59czAf-Z$spvC|Ow2NV+_lQlbgvZbqE)p;S*@+DyB|c#j%gutLxisG&AGg=+eI(kHN`1xAyGc&IEjHzkTOvD0IW)a4YNS z-cST}zhn9?-R_X#y(N4FPqosD3ejrre#amTPPZW8mZldz7*{fg?+ad*9NiZ7IFN8% zd4ej6iXrjV{BTBQX&;VOQFYl+V*2~775^)A;tToN%GtHEZZsRn>YcHhSN9C$;N}*} z13N!=C9y8m6k^zbWp}OUNlI8_yffgey*mNhC!U&?nBs>!%%hej^OZf%C6@4e2L_bg z*$K1c(%Pn&T7vLN1jgmWEf%FT>1%|WVGTtM6Fa)H?zH`aV3=muTp5;~|MUug5Qv$E z8K|QJ`O2tZ5AD~v3;6-jjG|gz+6seXV74dkAj%*G^gn8l*O7Rualq@=-Dn9GpL!=!(dBK=(v%V5#XDEiNX;%F8>Jv*O8mUto>)qgH0* z;h{Sups0wQi;L?Ucu=P(+B8ThzpL{dPRL$v$HkxFe^=*wBxa#qqRY^F$MpSn&{tOc z&dYP7EJnD-vZNk2tM+VFbU5z|5R(ojJW^K>h5TCLhNImFJ|-qorf{2D-uw~{W&mX4 zLGAd5r#;3e0vYEtIj~uf;IlL}uB>S3UTv zZANHCdHF!jDAiROx^K<;y-*OOyv69| zAs)kv%S&B7y>1i=Zd5pHPfkS@TwN^y3CPZ70aW&0;*f^fr=ffkw!~MX?}g>h!3+Ew zkhyxbX-O|Q7(vN?!@k}NJ7|y+ScKB!+Ah`oIXa@|eR_+8MA6xq_vO#wGWq;TR!Pab zfK@@vP$4XmUXVgPJ3tAlSqeaB9k>sw;@1|>il;QACJi?t3GhrHO|4Q~An^Bc0bia= zkTQx81EC5rd!}z2Wn@@fn-;l;MHk|0U+~gq z66m65kv0qTf(^iIxFIy-(&r789&T_2Vzr9U+_(Zl+q<;=~QA)S+x{AOn{%EH^g}~6*_yHfE4&6&;X6ApVzq5hE^9s;S*XD)kY08C$*R=D1 z)tS`UCqHVo^ql}pR!mLW{#w;@e-#3W3lS0(od%MFFkoNYBz_eKz$?H>F-wpbVBy9Nf;)TYlPj>uQ|TfLv6#$L z%+sy|T=Uc`n0`A(bh#7o|KMXFiWM8OtLdV4S~qNMZFAxuC`TSMQBqQtPYQ40wg3Bm zd-7{Ucz6z|sOUqdNf;Rv>}nd{EA030-$QDdQH!nKH3Q>lxUW9QDmINY*2UbV`5*oE zEA|Y6aN?V^x#9f$Z;u@fjEv0CxNsY0DP*u|4LpMRWn5gG#ga^^QF@X4NT!6b5Hyxi zG}hk1p&W`|^9GnMROICM7#_R*8mU6wh$Q=b@M7M7tk%}n2xV?`cl-6#TQLcV=QULD ze6SqgJ1J;?WCGI)2ndWEOQEu=&u9md)gJMhw{jqtUm=m=KrW4-++nuP&i#3cQ3|U! zj$vOEZ8HsowP|Xu+ zYHDml9G996KPRLGFTdTBnlu3tG8f22Rfhy2Rs{u{u@B_sRFI^&IMy4H3;dbG{w`o& z74WK`fiak*eN0~ebi`CEZdRuyx1R5|AQ!G*`=4jbSd+)c;0A}UU!JVYJy(6*e#&Mi z#89FRqsg1Kx5HFhBNu$nk9YJ^*(%e)I8H0=(AUzSIWQnG7NIsNdvJeveT2g)8biU%fM zY;t>;I;{AZPg3%OnwnYxZ%le|ZEcdgyu8AK5pU|W=!(w+gdJ1$5SYHOs3=jdgsOb- z-m}n&ObJhLGd(9edl>#5X72fqz@JTukH3eo%dEzLo0nR>6K_a@SuRmXpwotY-ER*(x% zxVfX%)YS`lE1rw6kloMQ+_Y~)2Vm*AxbOk`r3z)2!6P8pa%un;(ZVQ;XbYiA zM#t4r1+Ybcr&QGGeEn@J#4ulD zgIcDZhuHQ-QX9N{`2-Q61Z=HZRSk`YqN1X0BoxfdTAZAmz!$Q4(drei6it`gz_hry zxP3*b+(JsIyLF=0-Q9gCqP5WV4WPAvw`z`yo4cT~v5|DnS3x1TVC4rNZOa|7fE({| zL)-s;hZM6Jcx7;bZKd%$M#n_U^yYT=DNDx8I_sHQBza@#}wpZ zb@KbSN`M3=h4_av0I@cZ!WR*#Sf4+Cw!J(%LZ)8Twt;Fe;V`ZYyh^e<3_nB2C z4|n$hV9QSd^;^h03twz}6ZHMZkE3>viDOq_wURK3=s=;FGlga^fD@aMkU(M9;0!Hl zxdpL3JKO-a?N@e`zP-KuI_S1kjEoB#XY_m)5U0h)_}!I`Cx|AaX&dY*rE(*Ed3kIw zR@wBsZ`<1%Ks_A-UDsxOom^H?Q3RBHByh)yJU!``=74puQ8O;Rm6(lt+!Ro2=j{B^ z|LSk{;gtFlggD>4mPg;fz%!P%ESWnD7FYEkE$~fR~;j#wsqvK+=AB{2Z9Ps{qf%X!O>fm6oQad*b2@RaI5t zF)@k;22@r8={K%FAc6nq`X?n(Sy@@RpDO_O{as_D7`JIPF5qsViHV8HrFFh{}hID-H*W;ja@$?L9X^{Zb zJGdTnJbV%cT;R-rV<3>t`5!;xBM^w26BSL(ms@tg(x1 z^geKgZjLYjyc*p%C_cUHAT2j~j4-_q&=34H1xH72@EDtR7BN6#$#AvAT{6K5TcN@6 z@qwilPsNJs%RPS@|G<>gR9XN*G8&ptP$Y@=fY9q2pn!K`RaF9gL--C1-!)yN9kTQY zXzOjY*_oMdLy7GFJ))BRdc?qI5ir3l=E4dL`I}L~!wDN(TGTIOwwG?sz`8cI(=11_ mTx5Z=A_%VH{r_JsSnlWfkU3ls{{ZKD5LHDjg-`Mpf&T-$v*D!x literal 0 HcmV?d00001 From 8df3b340322c9e185e723cf1f930aefef963af86 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Wed, 19 Apr 2023 16:59:09 +0200 Subject: [PATCH 02/40] Add TextEndOfLine runs to TextBounds.TextRunBounds --- .../Media/TextFormatting/TextLineImpl.cs | 20 +++++++++++--- .../Media/TextFormatting/TextLineTests.cs | 27 +++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs index 3264d5e88a..935347ed85 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs @@ -698,7 +698,7 @@ namespace Avalonia.Media.TextFormatting i = lastRunIndex; //Possible overlap at runs of different direction - if (directionalWidth == 0) + if (directionalWidth == 0 && i < _textRuns.Length - 1) { //In case a run only contains a linebreak we don't want to skip it. if (currentRun is ShapedTextRun shaped) @@ -844,7 +844,7 @@ namespace Avalonia.Media.TextFormatting i = firstRunIndex; //Possible overlap at runs of different direction - if (directionalWidth == 0) + if (directionalWidth == 0 && i > 0) { //In case a run only contains a linebreak we don't want to skip it. if (currentRun is ShapedTextRun shaped) @@ -860,8 +860,8 @@ namespace Avalonia.Media.TextFormatting } } - TextBounds? textBounds = null; int coveredLength; + TextBounds? textBounds; switch (currentDirection) { @@ -942,6 +942,13 @@ namespace Avalonia.Media.TextFormatting new TextRunBounds( new Rect(startX, 0, drawableTextRun.Size.Width, Height), currentPosition, currentRun.Length, currentRun)); } + else + { + //Add potential TextEndOfParagraph + textRunBounds.Add( + new TextRunBounds( + new Rect(endX, 0, 0, Height), currentPosition, currentRun.Length, currentRun)); + } currentPosition += currentRun.Length; @@ -1007,6 +1014,13 @@ namespace Avalonia.Media.TextFormatting endX += drawableTextRun.Size.Width; } + else + { + //Add potential TextEndOfParagraph + textRunBounds.Add( + new TextRunBounds( + new Rect(endX, 0, 0, Height), currentPosition, currentRun.Length, currentRun)); + } currentPosition += currentRun.Length; diff --git a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs index d605ecbfda..1a39dd5223 100644 --- a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs +++ b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs @@ -1021,6 +1021,33 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting } } + [Fact] + public void Should_GetTextBounds_With_EndOfParagraph() + { + var text = "abc"; + + using (Start()) + { + var defaultProperties = new GenericTextRunProperties(Typeface.Default); + var textSource = new SingleBufferTextSource(text, defaultProperties, true); + + var formatter = new TextFormatterImpl(); + + var textLine = + formatter.FormatLine(textSource, 0, double.PositiveInfinity, + new GenericTextParagraphProperties(FlowDirection.LeftToRight, TextAlignment.Left, + true, true, defaultProperties, TextWrapping.NoWrap, 0, 0, 0)); + + var textBounds = textLine.GetTextBounds(3, 1); + + Assert.Equal(1, textBounds.Count); + + var firstBounds = textBounds.First(); + + Assert.True(firstBounds.TextRunBounds.Count > 0); + } + } + private class FixedRunsTextSource : ITextSource { private readonly IReadOnlyList _textRuns; From 1ff87d8dd59819dc937ab9d601f9e67de43f496c Mon Sep 17 00:00:00 2001 From: Sergey Mikolaitis Date: Sat, 22 Apr 2023 02:04:59 +0300 Subject: [PATCH 03/40] [Input] [MacOS] fix timestamp overflow on objC side --- native/Avalonia.Native/src/OSX/AvnView.mm | 2 +- native/Avalonia.Native/src/OSX/AvnWindow.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 6d1ff7cf12..9a43d9ddcf 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -275,7 +275,7 @@ delta.Y = [event deltaY]; } - uint32 timestamp = static_cast([event timestamp] * 1000); + uint64 timestamp = static_cast([event timestamp] * 1000); auto modifiers = [self getModifiers:[event modifierFlags]]; if(type != Move || diff --git a/native/Avalonia.Native/src/OSX/AvnWindow.mm b/native/Avalonia.Native/src/OSX/AvnWindow.mm index 16e1486acc..ef50cdab84 100644 --- a/native/Avalonia.Native/src/OSX/AvnWindow.mm +++ b/native/Avalonia.Native/src/OSX/AvnWindow.mm @@ -460,7 +460,7 @@ auto point = [self translateLocalPoint:avnPoint]; AvnVector delta = { 0, 0 }; - _parent->BaseEvents->RawMouseEvent(NonClientLeftButtonDown, static_cast([event timestamp] * 1000), AvnInputModifiersNone, point, delta); + _parent->BaseEvents->RawMouseEvent(NonClientLeftButtonDown, static_cast([event timestamp] * 1000), AvnInputModifiersNone, point, delta); } if(!_isTransitioningToFullScreen) From 6017011b2cb3ed2b3a25ea7f8b3a09f1617325b8 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Mon, 24 Apr 2023 17:27:51 +0200 Subject: [PATCH 04/40] Use try finally block for ImmediateRenderer RenderOptions restore --- .../Rendering/ImmediateRenderer.cs | 134 +++++++++--------- 1 file changed, 69 insertions(+), 65 deletions(-) diff --git a/src/Avalonia.Base/Rendering/ImmediateRenderer.cs b/src/Avalonia.Base/Rendering/ImmediateRenderer.cs index 4e264f6951..3462b1008a 100644 --- a/src/Avalonia.Base/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Base/Rendering/ImmediateRenderer.cs @@ -44,95 +44,99 @@ namespace Avalonia.Rendering public static void Render(DrawingContext context, Visual visual, Rect clipRect) { - var opacity = visual.Opacity; - var clipToBounds = visual.ClipToBounds; - var bounds = new Rect(visual.Bounds.Size); + var currentRenderOptions = default(RenderOptions); + var platformContext = context as PlatformDrawingContext; - if (visual.IsVisible && opacity > 0) + try { - var m = Matrix.CreateTranslation(visual.Bounds.Position); - - var renderTransform = Matrix.Identity; - - // this should be calculated BEFORE renderTransform - if (visual.HasMirrorTransform) + if (platformContext != null) { - var mirrorMatrix = new Matrix(-1.0, 0.0, 0.0, 1.0, visual.Bounds.Width, 0); - renderTransform *= mirrorMatrix; - } + currentRenderOptions = platformContext.RenderOptions; - if (visual.RenderTransform != null) - { - var origin = visual.RenderTransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height)); - var offset = Matrix.CreateTranslation(origin); - var finalTransform = (-offset) * visual.RenderTransform.Value * (offset); - renderTransform *= finalTransform; + platformContext.RenderOptions = visual.RenderOptions.MergeWith(platformContext.RenderOptions); } - m = renderTransform * m; + var opacity = visual.Opacity; + var clipToBounds = visual.ClipToBounds; + var bounds = new Rect(visual.Bounds.Size); - if (clipToBounds) + if (visual.IsVisible && opacity > 0) { + var m = Matrix.CreateTranslation(visual.Bounds.Position); + + var renderTransform = Matrix.Identity; + + // this should be calculated BEFORE renderTransform + if (visual.HasMirrorTransform) + { + var mirrorMatrix = new Matrix(-1.0, 0.0, 0.0, 1.0, visual.Bounds.Width, 0); + renderTransform *= mirrorMatrix; + } + if (visual.RenderTransform != null) { - clipRect = new Rect(visual.Bounds.Size); + var origin = visual.RenderTransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height)); + var offset = Matrix.CreateTranslation(origin); + var finalTransform = (-offset) * visual.RenderTransform.Value * (offset); + renderTransform *= finalTransform; } - else + + m = renderTransform * m; + + if (clipToBounds) { - clipRect = clipRect.Intersect(new Rect(visual.Bounds.Size)); + if (visual.RenderTransform != null) + { + clipRect = new Rect(visual.Bounds.Size); + } + else + { + clipRect = clipRect.Intersect(new Rect(visual.Bounds.Size)); + } } - } - using (context.PushTransform(m)) - using (context.PushOpacity(opacity, bounds)) - using (clipToBounds + using (context.PushTransform(m)) + using (context.PushOpacity(opacity, bounds)) + using (clipToBounds #pragma warning disable CS0618 // Type or member is obsolete - ? visual is IVisualWithRoundRectClip roundClipVisual - ? context.PushClip(new RoundedRect(bounds, roundClipVisual.ClipToBoundsRadius)) - : context.PushClip(bounds) - : default) + ? visual is IVisualWithRoundRectClip roundClipVisual + ? context.PushClip(new RoundedRect(bounds, roundClipVisual.ClipToBoundsRadius)) + : context.PushClip(bounds) + : default) #pragma warning restore CS0618 // Type or member is obsolete - using (visual.Clip != null ? context.PushGeometryClip(visual.Clip) : default) - using (visual.OpacityMask != null ? context.PushOpacityMask(visual.OpacityMask, bounds) : default) - using (context.PushTransform(Matrix.Identity)) - { - var currentRenderOptions = default(RenderOptions); - - var platformContext = context as PlatformDrawingContext; - - if(platformContext != null) + using (visual.Clip != null ? context.PushGeometryClip(visual.Clip) : default) + using (visual.OpacityMask != null ? context.PushOpacityMask(visual.OpacityMask, bounds) : default) + using (context.PushTransform(Matrix.Identity)) { - currentRenderOptions = platformContext.RenderOptions; + visual.Render(context); - platformContext.RenderOptions = visual.RenderOptions.MergeWith(platformContext.RenderOptions); - } - - visual.Render(context); - - var childrenEnumerable = visual.HasNonUniformZIndexChildren - ? visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance) - : (IEnumerable)visual.VisualChildren; - - foreach (var child in childrenEnumerable) - { - var childBounds = GetTransformedBounds(child); + var childrenEnumerable = visual.HasNonUniformZIndexChildren + ? visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance) + : (IEnumerable)visual.VisualChildren; - if (!child.ClipToBounds || clipRect.Intersects(childBounds)) + foreach (var child in childrenEnumerable) { - var childClipRect = child.RenderTransform == null - ? clipRect.Translate(-childBounds.Position) - : clipRect; - Render(context, child, childClipRect); - } - } - - if(platformContext != null) - { - platformContext.RenderOptions = currentRenderOptions; + var childBounds = GetTransformedBounds(child); + + if (!child.ClipToBounds || clipRect.Intersects(childBounds)) + { + var childClipRect = child.RenderTransform == null + ? clipRect.Translate(-childBounds.Position) + : clipRect; + Render(context, child, childClipRect); + } + } } } } + finally + { + if (platformContext != null) + { + platformContext.RenderOptions = currentRenderOptions; + } + } } } } From 4ddd83b561dd78036416cbd6c4e11beb74da59f8 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 25 Apr 2023 17:46:31 +0200 Subject: [PATCH 05/40] Fix TextBlock Measure/Arrange --- .../Media/TextFormatting/TextLineImpl.cs | 13 ++-------- src/Avalonia.Controls/TextBlock.cs | 26 +++++++++++-------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs index 935347ed85..1234067844 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs @@ -83,7 +83,7 @@ namespace Avalonia.Media.TextFormatting /// public override void Draw(DrawingContext drawingContext, Point lineOrigin) { - var (currentX, currentY) = lineOrigin; + var (currentX, currentY) = lineOrigin + new Point(Start, 0); foreach (var textRun in _textRuns) { @@ -1423,8 +1423,6 @@ namespace Avalonia.Media.TextFormatting var fontMetrics = _paragraphProperties.DefaultTextRunProperties.CachedGlyphTypeface.Metrics; var fontRenderingEmSize = _paragraphProperties.DefaultTextRunProperties.FontRenderingEmSize; var scale = fontRenderingEmSize / fontMetrics.DesignEmHeight; - - var width = 0d; var widthIncludingWhitespace = 0d; var trailingWhitespaceLength = 0; var newLineLength = 0; @@ -1436,13 +1434,6 @@ namespace Avalonia.Media.TextFormatting var lineHeight = _paragraphProperties.LineHeight; - var lastRunIndex = _textRuns.Length - 1; - - if (lastRunIndex > 0 && _textRuns[lastRunIndex] is TextEndOfLine) - { - lastRunIndex--; - } - for (var index = 0; index < _textRuns.Length; index++) { switch (_textRuns[index]) @@ -1500,7 +1491,7 @@ namespace Avalonia.Media.TextFormatting } } - width = widthIncludingWhitespace; + var width = widthIncludingWhitespace; for (var i = _textRuns.Length - 1; i >= 0; i--) { diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index 19eaaaa0d9..155d7d5f56 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -7,7 +7,6 @@ using Avalonia.Layout; using Avalonia.Media; using Avalonia.Media.TextFormatting; using Avalonia.Metadata; -using Avalonia.Utilities; namespace Avalonia.Controls { @@ -565,7 +564,8 @@ namespace Avalonia.Controls context.FillRectangle(background, new Rect(Bounds.Size)); } - var padding = Padding; + var scale = LayoutHelper.GetLayoutScale(this); + var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale); var top = padding.Top; var textHeight = TextLayout.Bounds.Height; @@ -659,7 +659,6 @@ namespace Avalonia.Controls protected override Size MeasureOverride(Size availableSize) { var scale = LayoutHelper.GetLayoutScale(this); - var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale); _constraint = availableSize.Deflate(padding); @@ -703,19 +702,24 @@ namespace Avalonia.Controls } } - var measuredSize = TextLayout.Bounds.Size.Inflate(padding); - - return measuredSize; + return TextLayout.Bounds.Size.Inflate(padding); } protected override Size ArrangeOverride(Size finalSize) { - if (HasComplexContent) - { - var scale = LayoutHelper.GetLayoutScale(this); + var scale = LayoutHelper.GetLayoutScale(this); + var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale); - var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale); + //Fixes: #11019 + if (finalSize.Width < _constraint.Width) + { + _textLayout?.Dispose(); + _textLayout = null; + _constraint = finalSize.Deflate(padding); + } + if (HasComplexContent) + { var currentY = padding.Top; foreach (var textLine in TextLayout.TextLines) @@ -730,7 +734,7 @@ namespace Avalonia.Controls && controlRun.Control is Control control) { control.Arrange( - new Rect(new Point(currentX, currentY), + new Rect(new Point(currentX, currentY), new Size(control.DesiredSize.Width, textLine.Height))); } From ec74cb2dc685e02b2934d12617dbbb32f78da81e Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 25 Apr 2023 18:30:39 +0200 Subject: [PATCH 06/40] Fix font fallback for control characters --- src/Avalonia.Base/Media/TextFormatting/TextCharacters.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Media/TextFormatting/TextCharacters.cs b/src/Avalonia.Base/Media/TextFormatting/TextCharacters.cs index 253c7075fa..7d4fac337d 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextCharacters.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextCharacters.cs @@ -185,7 +185,9 @@ namespace Avalonia.Media.TextFormatting } //Stop at the first missing glyph - if (!currentCodepoint.IsBreakChar && !glyphTypeface.TryGetGlyph(currentCodepoint, out _)) + if (!currentCodepoint.IsBreakChar && + currentCodepoint.GeneralCategory != GeneralCategory.Control && + !glyphTypeface.TryGetGlyph(currentCodepoint, out _)) { break; } From d5b280453caefc4ad6fc0338014fdb34b85a31d1 Mon Sep 17 00:00:00 2001 From: Sergey Mikolaitis Date: Tue, 25 Apr 2023 23:53:52 +0300 Subject: [PATCH 07/40] [MacOS] [Input] use uint64 timestamp in other places, including avn.idl --- native/Avalonia.Native/src/OSX/AvnView.mm | 6 +++--- src/Avalonia.Native/avn.idl | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 9a43d9ddcf..86bacfb819 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -275,7 +275,7 @@ delta.Y = [event deltaY]; } - uint64 timestamp = static_cast([event timestamp] * 1000); + uint64_t timestamp = static_cast([event timestamp] * 1000); auto modifiers = [self getModifiers:[event modifierFlags]]; if(type != Move || @@ -444,7 +444,7 @@ auto key = s_KeyMap[[event keyCode]]; - uint32_t timestamp = static_cast([event timestamp] * 1000); + uint64_t timestamp = static_cast([event timestamp] * 1000); auto modifiers = [self getModifiers:[event modifierFlags]]; if(_parent != nullptr) @@ -657,7 +657,7 @@ [self unmarkText]; - uint32_t timestamp = static_cast([NSDate timeIntervalSinceReferenceDate] * 1000); + uint64_t timestamp = static_cast([NSDate timeIntervalSinceReferenceDate] * 1000); _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(timestamp, [text UTF8String]); diff --git a/src/Avalonia.Native/avn.idl b/src/Avalonia.Native/avn.idl index 09e9168d8f..a58a00d59d 100644 --- a/src/Avalonia.Native/avn.idl +++ b/src/Avalonia.Native/avn.idl @@ -1,6 +1,7 @@ @clr-namespace Avalonia.Native.Interop @clr-access internal @clr-map bool int +@clr-map u_int64_t ulong @cpp-preamble @@ #pragma once #include "com.h" @@ -583,12 +584,12 @@ interface IAvnWindowBaseEvents : IUnknown void Resized([const] AvnSize& size, AvnPlatformResizeReason reason); void PositionChanged(AvnPoint position); void RawMouseEvent(AvnRawMouseEventType type, - uint timeStamp, + u_int64_t timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta); - bool RawKeyEvent(AvnRawKeyEventType type, uint timeStamp, AvnInputModifiers modifiers, uint key); - bool RawTextInputEvent(uint timeStamp, [const] char* text); + bool RawKeyEvent(AvnRawKeyEventType type, u_int64_t timeStamp, AvnInputModifiers modifiers, uint key); + bool RawTextInputEvent(u_int64_t timeStamp, [const] char* text); void ScalingChanged(double scaling); void RunRenderPriorityJobs(); void LostFocus(); From 1bdb067ab9e422ba89aea86871c0cf4304ff8931 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 27 Apr 2023 16:42:59 +0600 Subject: [PATCH 08/40] external consumers --- build/ExternalConsumers.props | 32 ++++++++++++++++++++++++++++++++ src/Directory.Build.props | 1 + 2 files changed, 33 insertions(+) create mode 100644 build/ExternalConsumers.props diff --git a/build/ExternalConsumers.props b/build/ExternalConsumers.props new file mode 100644 index 0000000000..d79e951330 --- /dev/null +++ b/build/ExternalConsumers.props @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 55a1014188..45cd4a932b 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -3,6 +3,7 @@ + Shared\_ModuleInitializer.cs From 271cb55b85c09903c49727c43596bcc4d643dd0e Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 27 Apr 2023 17:48:19 +0600 Subject: [PATCH 09/40] Remove ModuleInitializer duplicates --- src/Avalonia.Base/Avalonia.Base.csproj | 1 + src/Directory.Build.props | 6 ------ src/Windows/Avalonia.Win32/Avalonia.Win32.csproj | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Avalonia.Base/Avalonia.Base.csproj b/src/Avalonia.Base/Avalonia.Base.csproj index 639c27bf03..eafff3b780 100644 --- a/src/Avalonia.Base/Avalonia.Base.csproj +++ b/src/Avalonia.Base/Avalonia.Base.csproj @@ -22,6 +22,7 @@ + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 45cd4a932b..51f6cc92e9 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -4,10 +4,4 @@ - - - Shared\_ModuleInitializer.cs - false - - diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj index 2c5f3e2ed1..61f5996a94 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj @@ -20,7 +20,6 @@ - From 92b5a46b27bed1db89bc13f23aaa45ef015c1d70 Mon Sep 17 00:00:00 2001 From: Sergey Mikolaitis Date: Fri, 28 Apr 2023 01:45:22 +0300 Subject: [PATCH 10/40] [Input] fix also timestamp on C# side --- src/Avalonia.Native/WindowImplBase.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 26c3da9d50..b802b1db71 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -220,17 +220,17 @@ namespace Avalonia.Native _parent.PositionChanged?.Invoke(position.ToAvaloniaPixelPoint()); } - void IAvnWindowBaseEvents.RawMouseEvent(AvnRawMouseEventType type, uint timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) + void IAvnWindowBaseEvents.RawMouseEvent(AvnRawMouseEventType type, ulong timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) { _parent.RawMouseEvent(type, timeStamp, modifiers, point, delta); } - int IAvnWindowBaseEvents.RawKeyEvent(AvnRawKeyEventType type, uint timeStamp, AvnInputModifiers modifiers, uint key) + int IAvnWindowBaseEvents.RawKeyEvent(AvnRawKeyEventType type, ulong timeStamp, AvnInputModifiers modifiers, uint key) { return _parent.RawKeyEvent(type, timeStamp, modifiers, key).AsComBool(); } - int IAvnWindowBaseEvents.RawTextInputEvent(uint timeStamp, string text) + int IAvnWindowBaseEvents.RawTextInputEvent(ulong timeStamp, string text) { return _parent.RawTextInputEvent(timeStamp, text).AsComBool(); } @@ -286,7 +286,7 @@ namespace Avalonia.Native _native?.Activate(); } - public bool RawTextInputEvent(uint timeStamp, string text) + public bool RawTextInputEvent(ulong timeStamp, string text) { if (_inputRoot is null) return false; @@ -300,7 +300,7 @@ namespace Avalonia.Native return args.Handled; } - public bool RawKeyEvent(AvnRawKeyEventType type, uint timeStamp, AvnInputModifiers modifiers, uint key) + public bool RawKeyEvent(AvnRawKeyEventType type, ulong timeStamp, AvnInputModifiers modifiers, uint key) { if (_inputRoot is null) return false; @@ -319,7 +319,7 @@ namespace Avalonia.Native return false; } - public void RawMouseEvent(AvnRawMouseEventType type, uint timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) + public void RawMouseEvent(AvnRawMouseEventType type, ulong timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) { if (_inputRoot is null) return; From be14072ab212a81ade4832c8afe21d6521e6cfac Mon Sep 17 00:00:00 2001 From: Steven He Date: Tue, 2 May 2023 14:17:40 +0900 Subject: [PATCH 11/40] Prevent all obsolete members from listing in auto-completions --- src/Avalonia.Base/Data/BindingPriority.cs | 3 ++- src/Avalonia.Base/Data/InstancedBinding.cs | 3 ++- src/Avalonia.Base/Input/DataFormats.cs | 3 ++- .../Input/DataObjectExtensions.cs | 3 ++- src/Avalonia.Base/Media/Color.cs | 3 ++- src/Avalonia.Base/Media/DrawingContext.cs | 7 ++++--- .../Threading/DispatcherPriority.cs | 3 ++- .../VisualTree/IVisualWithRoundRectClip.cs | 5 +++-- src/Avalonia.Controls/ContextMenu.cs | 4 ++-- .../Generators/ItemContainerGenerator.cs | 5 +++-- .../Generators/TreeItemContainerGenerator.cs | 7 ++++--- src/Avalonia.Controls/ItemsControl.cs | 3 ++- .../Platform/Dialogs/ISystemDialogImpl.cs | 3 ++- .../Platform/Dialogs/SystemDialogImpl.cs | 3 ++- src/Avalonia.Controls/Platform/Screen.cs | 5 +++-- src/Avalonia.Controls/Primitives/Popup.cs | 4 ++-- .../Primitives/ToggleButton.cs | 19 ++++++++++--------- src/Avalonia.Controls/Screens.cs | 3 ++- src/Avalonia.Controls/SystemDialog.cs | 15 ++++++++------- src/Avalonia.Controls/TreeView.cs | 3 ++- .../ManagedFileDialogExtensions.cs | 5 +++-- .../Controls/OpenGlControlBase.cs | 4 +++- 22 files changed, 67 insertions(+), 46 deletions(-) diff --git a/src/Avalonia.Base/Data/BindingPriority.cs b/src/Avalonia.Base/Data/BindingPriority.cs index 5fd5aae43b..cb7f559e0a 100644 --- a/src/Avalonia.Base/Data/BindingPriority.cs +++ b/src/Avalonia.Base/Data/BindingPriority.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; namespace Avalonia.Data { @@ -47,7 +48,7 @@ namespace Avalonia.Data ///

Unset = int.MaxValue, - [Obsolete("Use Template priority")] + [Obsolete("Use Template priority"), EditorBrowsable(EditorBrowsableState.Never)] TemplatedParent = Template, } } diff --git a/src/Avalonia.Base/Data/InstancedBinding.cs b/src/Avalonia.Base/Data/InstancedBinding.cs index c09c31632e..f93813c0b2 100644 --- a/src/Avalonia.Base/Data/InstancedBinding.cs +++ b/src/Avalonia.Base/Data/InstancedBinding.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using Avalonia.Reactive; using ObservableEx = Avalonia.Reactive.Observable; @@ -49,7 +50,7 @@ namespace Avalonia.Data /// public IObservable Source { get; } - [Obsolete("Use Source property")] + [Obsolete("Use Source property"), EditorBrowsable(EditorBrowsableState.Never)] public IObservable Observable => Source; /// diff --git a/src/Avalonia.Base/Input/DataFormats.cs b/src/Avalonia.Base/Input/DataFormats.cs index 35d50e669a..f593ed205f 100644 --- a/src/Avalonia.Base/Input/DataFormats.cs +++ b/src/Avalonia.Base/Input/DataFormats.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; namespace Avalonia.Input { @@ -17,7 +18,7 @@ namespace Avalonia.Input /// /// Dataformat for one or more filenames /// - [Obsolete("Use DataFormats.Files, this format is supported only on desktop platforms.")] + [Obsolete("Use DataFormats.Files, this format is supported only on desktop platforms."), EditorBrowsable(EditorBrowsableState.Never)] public static readonly string FileNames = nameof(FileNames); } } diff --git a/src/Avalonia.Base/Input/DataObjectExtensions.cs b/src/Avalonia.Base/Input/DataObjectExtensions.cs index 6af531b0d8..d2e525cd68 100644 --- a/src/Avalonia.Base/Input/DataObjectExtensions.cs +++ b/src/Avalonia.Base/Input/DataObjectExtensions.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using Avalonia.Platform.Storage; @@ -25,7 +26,7 @@ namespace Avalonia.Input /// /// Collection of file names. If format isn't available, returns null. /// - [System.Obsolete("Use GetFiles, this method is supported only on desktop platforms.")] + [System.Obsolete("Use GetFiles, this method is supported only on desktop platforms."), EditorBrowsable(EditorBrowsableState.Never)] public static IEnumerable? GetFileNames(this IDataObject dataObject) { return (dataObject.Get(DataFormats.FileNames) as IEnumerable) diff --git a/src/Avalonia.Base/Media/Color.cs b/src/Avalonia.Base/Media/Color.cs index 56a3b0d7a5..50c2faacc0 100644 --- a/src/Avalonia.Base/Media/Color.cs +++ b/src/Avalonia.Base/Media/Color.cs @@ -6,6 +6,7 @@ // Licensed to The Avalonia Project under MIT License, courtesy of The .NET Foundation. using System; +using System.ComponentModel; using System.Globalization; #if !BUILDTASK using Avalonia.Animation.Animators; @@ -465,7 +466,7 @@ namespace Avalonia.Media } /// - [Obsolete("Use Color.ToUInt32() instead.")] + [Obsolete("Use Color.ToUInt32() instead."), EditorBrowsable(EditorBrowsableState.Never)] public uint ToUint32() { return ToUInt32(); diff --git a/src/Avalonia.Base/Media/DrawingContext.cs b/src/Avalonia.Base/Media/DrawingContext.cs index 18d6968168..3ab946a1db 100644 --- a/src/Avalonia.Base/Media/DrawingContext.cs +++ b/src/Avalonia.Base/Media/DrawingContext.cs @@ -5,6 +5,7 @@ using Avalonia.Rendering.SceneGraph; using Avalonia.Threading; using Avalonia.Utilities; using Avalonia.Media.Imaging; +using System.ComponentModel; namespace Avalonia.Media { @@ -417,11 +418,11 @@ namespace Avalonia.Media return new PushedState(this); } - [Obsolete("Use PushTransform")] + [Obsolete("Use PushTransform"), EditorBrowsable(EditorBrowsableState.Never)] public PushedState PushPreTransform(Matrix matrix) => PushTransform(matrix); - [Obsolete("Use PushTransform")] + [Obsolete("Use PushTransform"), EditorBrowsable(EditorBrowsableState.Never)] public PushedState PushPostTransform(Matrix matrix) => PushTransform(matrix); - [Obsolete("Use PushTransform")] + [Obsolete("Use PushTransform"), EditorBrowsable(EditorBrowsableState.Never)] public PushedState PushTransformContainer() => PushTransform(Matrix.Identity); diff --git a/src/Avalonia.Base/Threading/DispatcherPriority.cs b/src/Avalonia.Base/Threading/DispatcherPriority.cs index 3017b45dc7..a43dd8e4a2 100644 --- a/src/Avalonia.Base/Threading/DispatcherPriority.cs +++ b/src/Avalonia.Base/Threading/DispatcherPriority.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; namespace Avalonia.Threading { @@ -100,7 +101,7 @@ namespace Avalonia.Threading /// /// The job will be processed with the same priority as data binding. /// - [Obsolete("WPF compatibility")] public static readonly DispatcherPriority DataBind = new(Layout); + [Obsolete("WPF compatibility"), EditorBrowsable(EditorBrowsableState.Never)] public static readonly DispatcherPriority DataBind = new(Layout); /// /// The job will be processed with normal priority. diff --git a/src/Avalonia.Base/VisualTree/IVisualWithRoundRectClip.cs b/src/Avalonia.Base/VisualTree/IVisualWithRoundRectClip.cs index 9ace215d03..0079515a63 100644 --- a/src/Avalonia.Base/VisualTree/IVisualWithRoundRectClip.cs +++ b/src/Avalonia.Base/VisualTree/IVisualWithRoundRectClip.cs @@ -1,14 +1,15 @@ using System; +using System.ComponentModel; namespace Avalonia.VisualTree { - [Obsolete("Internal API, will be removed in future versions, you've been warned")] + [Obsolete("Internal API, will be removed in future versions, you've been warned"), EditorBrowsable(EditorBrowsableState.Never)] public interface IVisualWithRoundRectClip { /// /// Gets a value indicating the corner radius of control's clip bounds /// - [Obsolete("Internal API, will be removed in future versions, you've been warned")] + [Obsolete("Internal API, will be removed in future versions, you've been warned"), EditorBrowsable(EditorBrowsableState.Never)] CornerRadius ClipToBoundsRadius { get; } } diff --git a/src/Avalonia.Controls/ContextMenu.cs b/src/Avalonia.Controls/ContextMenu.cs index 63e28ea14d..97a8c6fe97 100644 --- a/src/Avalonia.Controls/ContextMenu.cs +++ b/src/Avalonia.Controls/ContextMenu.cs @@ -64,7 +64,7 @@ namespace Avalonia.Controls /// /// Defines the property. /// - [Obsolete("Use the Placement property instead.")] + [Obsolete("Use the Placement property instead."), EditorBrowsable(EditorBrowsableState.Never)] public static readonly StyledProperty PlacementModeProperty = PlacementProperty; /// @@ -157,7 +157,7 @@ namespace Avalonia.Controls } /// - [Obsolete("Use the Placement property instead.")] + [Obsolete("Use the Placement property instead."), EditorBrowsable(EditorBrowsableState.Never)] public PlacementMode PlacementMode { get => GetValue(PlacementProperty); diff --git a/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs index b2c138599e..d27479af18 100644 --- a/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs +++ b/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; namespace Avalonia.Controls.Generators { @@ -131,10 +132,10 @@ namespace Avalonia.Controls.Generators /// public void ClearItemContainer(Control container) => _owner.ClearItemContainer(container); - [Obsolete("Use ItemsControl.ContainerFromIndex")] + [Obsolete("Use ItemsControl.ContainerFromIndex"), EditorBrowsable(EditorBrowsableState.Never)] public Control? ContainerFromIndex(int index) => _owner.ContainerFromIndex(index); - [Obsolete("Use ItemsControl.IndexFromContainer")] + [Obsolete("Use ItemsControl.IndexFromContainer"), EditorBrowsable(EditorBrowsableState.Never)] public int IndexFromContainer(Control container) => _owner.IndexFromContainer(container); } } diff --git a/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs index c1cae862a9..717dadb6ea 100644 --- a/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs +++ b/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; namespace Avalonia.Controls.Generators { @@ -20,13 +21,13 @@ namespace Avalonia.Controls.Generators internal TreeContainerIndex(TreeView owner) => _owner = owner; - [Obsolete("Use TreeView.GetRealizedTreeContainers")] + [Obsolete("Use TreeView.GetRealizedTreeContainers"), EditorBrowsable(EditorBrowsableState.Never)] public IEnumerable Containers => _owner.GetRealizedTreeContainers(); - [Obsolete("Use TreeView.TreeContainerFromItem")] + [Obsolete("Use TreeView.TreeContainerFromItem"), EditorBrowsable(EditorBrowsableState.Never)] public Control? ContainerFromItem(object item) => _owner.TreeContainerFromItem(item); - [Obsolete("Use TreeView.TreeItemFromContainer")] + [Obsolete("Use TreeView.TreeItemFromContainer"), EditorBrowsable(EditorBrowsableState.Never)] public object? ItemFromContainer(Control container) => _owner.TreeItemFromContainer(container); } } diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index 1c62de9bed..4a0b3c367e 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; using Avalonia.Automation.Peers; using Avalonia.Controls.Generators; using Avalonia.Controls.Metadata; @@ -626,7 +627,7 @@ namespace Avalonia.Controls /// TreeView to be able to create a . Can be /// removed in 12.0. /// - [Obsolete] + [Obsolete, EditorBrowsable(EditorBrowsableState.Never)] private protected virtual ItemContainerGenerator CreateItemContainerGenerator() { return new ItemContainerGenerator(this); diff --git a/src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs b/src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs index 996fff6775..a593caecaf 100644 --- a/src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs +++ b/src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Threading.Tasks; using Avalonia.Metadata; @@ -7,7 +8,7 @@ namespace Avalonia.Controls.Platform /// /// Defines a platform-specific system dialog implementation. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] [Unstable] public interface ISystemDialogImpl { diff --git a/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs b/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs index 20bfb440e3..37e6272abd 100644 --- a/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs +++ b/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using Avalonia.Platform.Storage; @@ -10,7 +11,7 @@ namespace Avalonia.Controls.Platform /// /// Defines a platform-specific system dialog implementation. /// - [Obsolete] + [Obsolete, EditorBrowsable(EditorBrowsableState.Never)] internal class SystemDialogImpl : ISystemDialogImpl { public async Task ShowFileDialogAsync(FileDialog dialog, Window parent) diff --git a/src/Avalonia.Controls/Platform/Screen.cs b/src/Avalonia.Controls/Platform/Screen.cs index 4898c5f912..fde90dc589 100644 --- a/src/Avalonia.Controls/Platform/Screen.cs +++ b/src/Avalonia.Controls/Platform/Screen.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; namespace Avalonia.Platform { @@ -17,7 +18,7 @@ namespace Avalonia.Platform public double Scaling { get; } /// - [Obsolete("Use the Scaling property instead.")] + [Obsolete("Use the Scaling property instead."), EditorBrowsable(EditorBrowsableState.Never)] public double PixelDensity => Scaling; /// @@ -43,7 +44,7 @@ namespace Avalonia.Platform public bool IsPrimary { get; } /// - [Obsolete("Use the IsPrimary property instead.")] + [Obsolete("Use the IsPrimary property instead."), EditorBrowsable(EditorBrowsableState.Never)] public bool Primary => IsPrimary; /// diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index eda794f33a..80b7841fc7 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -74,7 +74,7 @@ namespace Avalonia.Controls.Primitives /// /// Defines the property. /// - [Obsolete("Use the Placement property instead.")] + [Obsolete("Use the Placement property instead."), EditorBrowsable(EditorBrowsableState.Never)] public static readonly StyledProperty PlacementModeProperty = PlacementProperty; /// @@ -241,7 +241,7 @@ namespace Avalonia.Controls.Primitives } /// - [Obsolete("Use the Placement property instead.")] + [Obsolete("Use the Placement property instead."), EditorBrowsable(EditorBrowsableState.Never)] public PlacementMode PlacementMode { get => GetValue(PlacementProperty); diff --git a/src/Avalonia.Controls/Primitives/ToggleButton.cs b/src/Avalonia.Controls/Primitives/ToggleButton.cs index dfaf7bbc45..fa1bc76de4 100644 --- a/src/Avalonia.Controls/Primitives/ToggleButton.cs +++ b/src/Avalonia.Controls/Primitives/ToggleButton.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using Avalonia.Automation.Peers; using Avalonia.Controls.Metadata; using Avalonia.Data; @@ -28,7 +29,7 @@ namespace Avalonia.Controls.Primitives /// /// Defines the event. /// - [Obsolete("Use IsCheckedChangedEvent instead.")] + [Obsolete("Use IsCheckedChangedEvent instead."), EditorBrowsable(EditorBrowsableState.Never)] public static readonly RoutedEvent CheckedEvent = RoutedEvent.Register( nameof(Checked), @@ -37,7 +38,7 @@ namespace Avalonia.Controls.Primitives /// /// Defines the event. /// - [Obsolete("Use IsCheckedChangedEvent instead.")] + [Obsolete("Use IsCheckedChangedEvent instead."), EditorBrowsable(EditorBrowsableState.Never)] public static readonly RoutedEvent UncheckedEvent = RoutedEvent.Register( nameof(Unchecked), @@ -46,7 +47,7 @@ namespace Avalonia.Controls.Primitives /// /// Defines the event. /// - [Obsolete("Use IsCheckedChangedEvent instead.")] + [Obsolete("Use IsCheckedChangedEvent instead."), EditorBrowsable(EditorBrowsableState.Never)] public static readonly RoutedEvent IndeterminateEvent = RoutedEvent.Register( nameof(Indeterminate), @@ -72,7 +73,7 @@ namespace Avalonia.Controls.Primitives /// /// Raised when a is checked. /// - [Obsolete("Use IsCheckedChanged instead.")] + [Obsolete("Use IsCheckedChanged instead."), EditorBrowsable(EditorBrowsableState.Never)] public event EventHandler? Checked { add => AddHandler(CheckedEvent, value); @@ -82,7 +83,7 @@ namespace Avalonia.Controls.Primitives /// /// Raised when a is unchecked. /// - [Obsolete("Use IsCheckedChanged instead.")] + [Obsolete("Use IsCheckedChanged instead."), EditorBrowsable(EditorBrowsableState.Never)] public event EventHandler? Unchecked { add => AddHandler(UncheckedEvent, value); @@ -92,7 +93,7 @@ namespace Avalonia.Controls.Primitives /// /// Raised when a is neither checked nor unchecked. /// - [Obsolete("Use IsCheckedChanged instead.")] + [Obsolete("Use IsCheckedChanged instead."), EditorBrowsable(EditorBrowsableState.Never)] public event EventHandler? Indeterminate { add => AddHandler(IndeterminateEvent, value); @@ -168,7 +169,7 @@ namespace Avalonia.Controls.Primitives /// Called when becomes true. /// /// Event arguments for the routed event that is raised by the default implementation of this method. - [Obsolete("Use OnIsCheckedChanged instead.")] + [Obsolete("Use OnIsCheckedChanged instead."), EditorBrowsable(EditorBrowsableState.Never)] protected virtual void OnChecked(RoutedEventArgs e) { RaiseEvent(e); @@ -178,7 +179,7 @@ namespace Avalonia.Controls.Primitives /// Called when becomes false. /// /// Event arguments for the routed event that is raised by the default implementation of this method. - [Obsolete("Use OnIsCheckedChanged instead.")] + [Obsolete("Use OnIsCheckedChanged instead."), EditorBrowsable(EditorBrowsableState.Never)] protected virtual void OnUnchecked(RoutedEventArgs e) { RaiseEvent(e); @@ -188,7 +189,7 @@ namespace Avalonia.Controls.Primitives /// Called when becomes null. /// /// Event arguments for the routed event that is raised by the default implementation of this method. - [Obsolete("Use OnIsCheckedChanged instead.")] + [Obsolete("Use OnIsCheckedChanged instead."), EditorBrowsable(EditorBrowsableState.Never)] protected virtual void OnIndeterminate(RoutedEventArgs e) { RaiseEvent(e); diff --git a/src/Avalonia.Controls/Screens.cs b/src/Avalonia.Controls/Screens.cs index 60d5358c49..c65aaafa4b 100644 --- a/src/Avalonia.Controls/Screens.cs +++ b/src/Avalonia.Controls/Screens.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using Avalonia.Platform; @@ -68,7 +69,7 @@ namespace Avalonia.Controls /// /// The window impl for which to retrieve the Screen. /// The . - [Obsolete("Use ScreenFromWindow(WindowBase) overload.")] + [Obsolete("Use ScreenFromWindow(WindowBase) overload."), EditorBrowsable(EditorBrowsableState.Never)] public Screen? ScreenFromWindow(IWindowBaseImpl window) { return _iScreenImpl.ScreenFromWindow(window); diff --git a/src/Avalonia.Controls/SystemDialog.cs b/src/Avalonia.Controls/SystemDialog.cs index d2b893df37..8d4dab11d7 100644 --- a/src/Avalonia.Controls/SystemDialog.cs +++ b/src/Avalonia.Controls/SystemDialog.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using Avalonia.Controls.Platform; @@ -11,7 +12,7 @@ namespace Avalonia.Controls /// /// Base class for system file dialogs. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public abstract class FileDialog : FileSystemDialog { /// @@ -29,7 +30,7 @@ namespace Avalonia.Controls /// /// Base class for system file and directory dialogs. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public abstract class FileSystemDialog : SystemDialog { /// @@ -42,7 +43,7 @@ namespace Avalonia.Controls /// /// Represents a system dialog that prompts the user to select a location for saving a file. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public class SaveFileDialog : FileDialog { /// @@ -91,7 +92,7 @@ namespace Avalonia.Controls /// /// Represents a system dialog that allows the user to select one or more files to open. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public class OpenFileDialog : FileDialog { /// @@ -132,7 +133,7 @@ namespace Avalonia.Controls /// /// Represents a system dialog that allows the user to select a directory. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public class OpenFolderDialog : FileSystemDialog { /// @@ -167,7 +168,7 @@ namespace Avalonia.Controls /// /// Base class for system dialogs. /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public abstract class SystemDialog { static SystemDialog() @@ -188,7 +189,7 @@ namespace Avalonia.Controls /// /// Represents a filter in an or an . /// - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public class FileDialogFilter { /// diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index e3a9a05951..5122b4aebd 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -3,6 +3,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Linq; using Avalonia.Collections; @@ -715,7 +716,7 @@ namespace Avalonia.Controls } } - [Obsolete] + [Obsolete, EditorBrowsable(EditorBrowsableState.Never)] private protected override ItemContainerGenerator CreateItemContainerGenerator() { return new TreeItemContainerGenerator(this); diff --git a/src/Avalonia.Dialogs/ManagedFileDialogExtensions.cs b/src/Avalonia.Dialogs/ManagedFileDialogExtensions.cs index e9a75ab46a..86c0bfc588 100644 --- a/src/Avalonia.Dialogs/ManagedFileDialogExtensions.cs +++ b/src/Avalonia.Dialogs/ManagedFileDialogExtensions.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using Avalonia.Controls; @@ -39,11 +40,11 @@ namespace Avalonia.Dialogs return builder; } - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public static Task ShowManagedAsync(this OpenFileDialog dialog, Window parent, ManagedFileDialogOptions? options = null) => ShowManagedAsync(dialog, parent, options); - [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API"), EditorBrowsable(EditorBrowsableState.Never)] public static async Task ShowManagedAsync(this OpenFileDialog dialog, Window parent, ManagedFileDialogOptions? options = null) where TWindow : Window, new() { diff --git a/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs b/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs index 7e73397743..83bf795b03 100644 --- a/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs +++ b/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs @@ -8,6 +8,8 @@ using Avalonia.Rendering; using Avalonia.Rendering.Composition; using Avalonia.VisualTree; using Avalonia.Platform; +using System.ComponentModel; + namespace Avalonia.OpenGL.Controls { public abstract class OpenGlControlBase : Control @@ -217,7 +219,7 @@ namespace Avalonia.OpenGL.Controls return true; } - [Obsolete("Use RequestNextFrameRendering()")] + [Obsolete("Use RequestNextFrameRendering()"), EditorBrowsable(EditorBrowsableState.Never)] // ReSharper disable once MemberCanBeProtected.Global public new void InvalidateVisual() => RequestNextFrameRendering(); From 0259779d2d9043898b78cb249274e48daac4f762 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 2 May 2023 11:58:13 +0200 Subject: [PATCH 12/40] Make StandardAssetLoader public/unstable. And related interfaces. --- src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs | 4 +++- .../Platform/Internal/AssemblyDescriptorResolver.cs | 4 +++- src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs | 4 +++- src/Avalonia.Base/Platform/StandardAssetLoader.cs | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs index 6a577c204c..e5caafa128 100644 --- a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs +++ b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs @@ -3,11 +3,13 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using Avalonia.Metadata; using Avalonia.Utilities; namespace Avalonia.Platform.Internal; -internal interface IAssemblyDescriptor +[Unstable] +public interface IAssemblyDescriptor { Assembly Assembly { get; } Dictionary? Resources { get; } diff --git a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs index b12130b1f7..58f274e6c0 100644 --- a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs +++ b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs @@ -3,10 +3,12 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; +using Avalonia.Metadata; namespace Avalonia.Platform.Internal; -internal interface IAssemblyDescriptorResolver +[Unstable] +public interface IAssemblyDescriptorResolver { IAssemblyDescriptor GetAssembly(string name); } diff --git a/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs b/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs index 52f8f5e68d..be754f7b40 100644 --- a/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs +++ b/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs @@ -1,10 +1,12 @@ using System; using System.IO; using System.Reflection; +using Avalonia.Metadata; namespace Avalonia.Platform.Internal; -internal interface IAssetDescriptor +[Unstable] +public interface IAssetDescriptor { Stream GetStream(); Assembly Assembly { get; } diff --git a/src/Avalonia.Base/Platform/StandardAssetLoader.cs b/src/Avalonia.Base/Platform/StandardAssetLoader.cs index 118e57c7af..8b5844e354 100644 --- a/src/Avalonia.Base/Platform/StandardAssetLoader.cs +++ b/src/Avalonia.Base/Platform/StandardAssetLoader.cs @@ -4,6 +4,7 @@ using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Reflection; +using Avalonia.Metadata; using Avalonia.Platform.Internal; using Avalonia.Utilities; @@ -12,7 +13,8 @@ namespace Avalonia.Platform; /// /// Loads assets compiled into the application binary. /// -internal class StandardAssetLoader : IAssetLoader +[Unstable("StandardAssetLoader is considered unstable. Please use AssetLoader static class instead.")] +public class StandardAssetLoader : IAssetLoader { private readonly IAssemblyDescriptorResolver _assemblyDescriptorResolver; private AssemblyDescriptor? _defaultResmAssembly; From 356a78953ae3327541dbc0fa2c7464def78e4895 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 2 May 2023 13:14:18 +0200 Subject: [PATCH 13/40] Added public RegisterResUriParsers. Which is forwarded to internal `AssetLoader` implementation. --- src/Avalonia.Base/Platform/StandardAssetLoader.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Avalonia.Base/Platform/StandardAssetLoader.cs b/src/Avalonia.Base/Platform/StandardAssetLoader.cs index 8b5844e354..df7c729a28 100644 --- a/src/Avalonia.Base/Platform/StandardAssetLoader.cs +++ b/src/Avalonia.Base/Platform/StandardAssetLoader.cs @@ -155,6 +155,8 @@ public class StandardAssetLoader : IAssetLoader return Enumerable.Empty(); } + public static void RegisterResUriParsers() => AssetLoader.RegisterResUriParsers(); + private bool TryGetAsset(Uri uri, Uri? baseUri, [NotNullWhen(true)] out IAssetDescriptor? assetDescriptor) { assetDescriptor = null; From f0ea1f11161a6c390b7c5173069701b78af02302 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 3 May 2023 14:23:34 +0600 Subject: [PATCH 14/40] Fixed some potential threading issues --- .../Threading/DispatcherFrame.cs | 57 ++++++++++++------- .../Platform/ManagedDispatcherImpl.cs | 6 ++ 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/Avalonia.Base/Threading/DispatcherFrame.cs b/src/Avalonia.Base/Threading/DispatcherFrame.cs index 1f8974dfa3..e826432475 100644 --- a/src/Avalonia.Base/Threading/DispatcherFrame.cs +++ b/src/Avalonia.Base/Threading/DispatcherFrame.cs @@ -91,31 +91,44 @@ public class DispatcherFrame internal void Run(IControlledDispatcherImpl impl) { - // Since the actual platform run loop is controlled by a Cancellation token, we are restarting - // it if frame still needs to run - while (Continue) - RunCore(impl); - } - - private void RunCore(IControlledDispatcherImpl impl) - { - if (_isRunning) - throw new InvalidOperationException("This frame is already running"); - _isRunning = true; - try - { - _cancellationTokenSource = new CancellationTokenSource(); - // Wake up the dispatcher in case it has pending jobs - Dispatcher.RequestProcessing(); - impl.RunLoop(_cancellationTokenSource.Token); - } - finally + Dispatcher.VerifyAccess(); + + // Since the actual platform run loop is controlled by a Cancellation token, we have an + // outer loop that restarts the platform one in case Continue was set to true after being set to false + while (true) { - _isRunning = false; - _cancellationTokenSource?.Cancel(); - _cancellationTokenSource = null; + // Take the instance lock since `Continue` is changed from one too + lock (Dispatcher.InstanceLock) + { + if (!Continue) + return; + + if (_isRunning) + throw new InvalidOperationException("This frame is already running"); + + _cancellationTokenSource = new CancellationTokenSource(); + _isRunning = true; + } + + try + { + // Wake up the dispatcher in case it has pending jobs + Dispatcher.RequestProcessing(); + impl.RunLoop(_cancellationTokenSource.Token); + } + finally + { + lock (Dispatcher.InstanceLock) + { + _isRunning = false; + _cancellationTokenSource?.Cancel(); + _cancellationTokenSource?.Dispose(); + _cancellationTokenSource = null; + } + } } } + internal void MaybeExitOnDispatcherRequest() { diff --git a/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs b/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs index 20aa91c83e..fdc098777a 100644 --- a/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs +++ b/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs @@ -58,6 +58,10 @@ public class ManagedDispatcherImpl : IControlledDispatcherImpl public void RunLoop(CancellationToken token) { + CancellationTokenRegistration registration = default; + if (token.CanBeCanceled) + registration = token.Register(() => _wakeup.Set()); + while (!token.IsCancellationRequested) { bool signaled; @@ -105,5 +109,7 @@ public class ManagedDispatcherImpl : IControlledDispatcherImpl else _wakeup.WaitOne(); } + + registration.Dispose(); } } \ No newline at end of file From 2f7c518f1e12ac8bc28c261144db50683dbf187d Mon Sep 17 00:00:00 2001 From: Mike James Date: Wed, 3 May 2023 10:25:35 +0200 Subject: [PATCH 15/40] Update readme.md Refreshing the readme to match our current branding. --- readme.md | 65 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/readme.md b/readme.md index c8135080fe..339cce9ee1 100644 --- a/readme.md +++ b/readme.md @@ -1,26 +1,44 @@ -[![GH_Banner](https://user-images.githubusercontent.com/552074/218457976-92e76834-9e22-4e35-acfa-aa50281bc0f9.png)](https://avaloniaui.net/xpf) +![StarBanner3](https://user-images.githubusercontent.com/552074/235864283-691ac648-5113-4b5c-87e8-bed9ba192927.png) + +![Header](https://user-images.githubusercontent.com/552074/235865745-2a8e7274-4f66-4f77-8f05-feeb76e7d478.png) [![Telegram](https://raw.githubusercontent.com/Patrolavia/telegram-badge/master/chat.svg)](https://t.me/Avalonia) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/AvaloniaUI/Avalonia?utm_campaign=pr-badge&utm_content=badge&utm_medium=badge&utm_source=badge) [![Discord](https://img.shields.io/badge/discord-join%20chat-46BC99)]( https://aka.ms/dotnet-discord) [![Build Status](https://dev.azure.com/AvaloniaUI/AvaloniaUI/_apis/build/status/AvaloniaUI.Avalonia)](https://dev.azure.com/AvaloniaUI/AvaloniaUI/_build/latest?definitionId=4) [![Backers on Open Collective](https://opencollective.com/Avalonia/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/Avalonia/sponsors/badge.svg)](#sponsors) ![License](https://img.shields.io/github/license/avaloniaui/avalonia.svg)
[![NuGet](https://img.shields.io/nuget/v/Avalonia.svg)](https://www.nuget.org/packages/Avalonia) [![downloads](https://img.shields.io/nuget/dt/avalonia)](https://www.nuget.org/packages/Avalonia) ![Size](https://img.shields.io/github/repo-size/avaloniaui/avalonia.svg) -# ⚠️ **v11 Update - Pausing community contributions** - -for more information see [this](https://github.com/AvaloniaUI/Avalonia/discussions/10599) discussion. +⚠️ **v11 Update - [Pausing community contributions](https://github.com/AvaloniaUI/Avalonia/discussions/10599)** ## 📖 About -Avalonia is a cross-platform UI framework for dotnet, providing a flexible styling system and supporting a wide range of Operating Systems such as Windows, Linux, macOS. Avalonia is mature and production ready. We also have in beta release support for iOS, Android and in early stages support for browser via WASM. +[Avalonia](https://avaloniaui.net) is a cross-platform UI framework for dotnet, providing a flexible styling system and supporting a wide range of platforms such as Windows, macOS, Linux, iOS, Android and WebAssembly. Avalonia is mature and production ready and is used by companies, including [Schneider Electric](https://avaloniaui.net/showcase#se), [Unity](https://avaloniaui.net/showcase#unity), [JetBrains](https://avaloniaui.net/showcase#rider) and [Github](https://avaloniaui.net/showcase#github). + +Considered by many to be the spiritual successor to WPF, Avalonia UI provides a familiar, modern development experience for XAML developers creating cross-platform applications. While Avalonia UI is [similar to WPF](https://docs.avaloniaui.net/misc/wpf), it isn't a 1:1 copy, and you'll find plenty of improvements. + +For those seeking a cross-platform WPF, we have created [Avalonia XPF](https://avaloniaui.net/xpf), enabling WPF applications to run on macOS and Linux with little to no code changes. Avalonia XPF is a commercial product and is licensed per-app, per-platform. + +#### Roadmap +To see the status of some of our features, please see our [Roadmap](https://github.com/AvaloniaUI/Avalonia/issues/2239). -![image](https://user-images.githubusercontent.com/4672627/152126443-932966cf-57e7-4e77-9be6-62463a66b9f8.png) +#### Breaking Changes +You can also see what [breaking changes](https://github.com/AvaloniaUI/Avalonia/issues/3538) we have planned and what our [past breaking changes](https://github.com/AvaloniaUI/Avalonia/wiki/Breaking-Changes) have been. -To see the status of some of our features, please see our [Roadmap](https://github.com/AvaloniaUI/Avalonia/issues/2239). You can also see what [breaking changes](https://github.com/AvaloniaUI/Avalonia/issues/3538) we have planned and what our [past breaking changes](https://github.com/AvaloniaUI/Avalonia/wiki/Breaking-Changes) have been. [Awesome Avalonia](https://github.com/AvaloniaCommunity/awesome-avalonia) is community-curated list of awesome Avalonia UI tools, libraries, projects and resources. Go and see what people are building with Avalonia! +#### Awesome Avalonia +[Awesome Avalonia](https://github.com/AvaloniaCommunity/awesome-avalonia) is community-curated list of awesome Avalonia UI tools, libraries, projects and resources. Go and see what people are building with Avalonia! ## 🚀 Getting Started +See our [Get Started](https://avaloniaui.net/GettingStarted) guide to begin developing apps with Avalonia UI. + +### Visual Studio The Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started, or you can use the .NET Core CLI. For a starter guide see our [documentation](https://docs.avaloniaui.net/docs/getting-started). +### JetBrains Rider +[JetBrains Rider](https://www.jetbrains.com/rider/whatsnew/?mkt_tok=eyJpIjoiTURBNU1HSmhNV0kwTUdFMiIsInQiOiJtNnU2VEc1TlNLa1ZRVkROYmdZYVpYREJsaU1qdUhmS3dxSzRHczdYWHl0RVlTNDMwSFwvNUs3VENTNVM0bVcyNFdaRmVYZzVWTTF1N3VrQWNGTkJreEhlam1hMlB4UVVWcHBGM1dNOUxoXC95YnRQdGgyUXl1YmZCM3h3d3BVWWdBIn0%3D#avalonia-support) now has official support for Avalonia. + +Code completion, inspections and refactorings are supported out of the box, for XAML previewer add `https://plugins.jetbrains.com/plugins/dev/14839` to plugin repositories and install [AvaloniaRider](https://github.com/ForNeVeR/AvaloniaRider) plugin. + +### Avalonia Packages Avalonia is delivered via NuGet package manager. You can find the packages here: https://www.nuget.org/packages/Avalonia/ Use these commands in the Package Manager console to install Avalonia manually: @@ -30,31 +48,25 @@ Install-Package Avalonia.Desktop ``` ## Showcase +[![Showcase_Banner](https://user-images.githubusercontent.com/552074/235865504-f9acaf42-ea2d-456a-ab52-547c45614bd5.png)](https://avaloniaui.net/showcase) -Examples of UIs built with Avalonia - -([Lunacy](https://icons8.com/lunacy)) - -![image](https://user-images.githubusercontent.com/4672627/152325740-261c27a3-e6f0-4662-bff7-4796d4940e04.png) -([PlasticSCM](https://www.plasticscm.com/)) -![image](https://user-images.githubusercontent.com/4672627/152326453-14944c4d-33da-4d50-a268-b87f80927adb.png) -([WasabiWallet](https://www.wasabiwallet.io/)) - - -## JetBrains Rider - -[JetBrains Rider](https://www.jetbrains.com/rider/whatsnew/?mkt_tok=eyJpIjoiTURBNU1HSmhNV0kwTUdFMiIsInQiOiJtNnU2VEc1TlNLa1ZRVkROYmdZYVpYREJsaU1qdUhmS3dxSzRHczdYWHl0RVlTNDMwSFwvNUs3VENTNVM0bVcyNFdaRmVYZzVWTTF1N3VrQWNGTkJreEhlam1hMlB4UVVWcHBGM1dNOUxoXC95YnRQdGgyUXl1YmZCM3h3d3BVWWdBIn0%3D#avalonia-support) now has official support for Avalonia. - -Code completion, inspections and refactorings are supported out of the box, for XAML previewer add `https://plugins.jetbrains.com/plugins/dev/14839` to plugin repositories and install [AvaloniaRider](https://github.com/ForNeVeR/AvaloniaRider) plugin. +See what others have built with Avalonia UI on our [Showcase](https://avaloniaui.net/Showcase). We welcome submissions! ## Bleeding Edge Builds We also have a [nightly build](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed) which tracks the current state of master. Although these packages are less stable than the release on NuGet.org, you'll get all the latest features and bugfixes right away and many of our users actually prefer this feed! -## Documentation +## Learning -Documentation can be found at https://docs.avaloniaui.net. We also have a [tutorial](https://docs.avaloniaui.net/docs/getting-started/programming-with-avalonia) over there for newcomers. +### Documentation +Documentation can be found at https://docs.avaloniaui.net. + +### Tutorials +We also have a [tutorial](https://docs.avaloniaui.net/docs/getting-started/programming-with-avalonia) over there for newcomers. + +### Samples +We have a [range of samples](https://github.com/AvaloniaUI/Avalonia.Samples) to help you get started. ## Building and Using @@ -116,3 +128,8 @@ We have a range of [support plans available](https://avaloniaui.net/support) for ## .NET Foundation This project is supported by the [.NET Foundation](https://dotnetfoundation.org). + +## Avalonia XPF +Unleash the full potential of your existing WPF apps with our cross-platform UI framework, enabling WPF apps to run on macOS and Linux without requiring expensive and risky rewrites. + +[![GH_Banner](https://user-images.githubusercontent.com/552074/218457976-92e76834-9e22-4e35-acfa-aa50281bc0f9.png)](https://avaloniaui.net/xpf) From 015768c5bd29932372a5007a087e2d4f11eaa238 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 3 May 2023 14:26:02 +0600 Subject: [PATCH 16/40] Make sure that Dispatcher.InvokeAsync unwraps tasks and that correct overload is being chosen --- .../Threading/Dispatcher.Invoke.cs | 42 +++++++++++++++--- .../DispatcherTests.cs | 44 +++++++++++++++++++ 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs b/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs index 699186868a..bb1663eac0 100644 --- a/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs +++ b/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs @@ -248,11 +248,11 @@ public partial class Dispatcher /// An operation representing the queued delegate to be invoked. /// /// - /// Note that the default priority is DispatcherPriority.Normal. + /// Note that the default priority is DispatcherPriority.Default. /// public DispatcherOperation InvokeAsync(Action callback) { - return InvokeAsync(callback, DispatcherPriority.Normal, CancellationToken.None); + return InvokeAsync(callback, default, CancellationToken.None); } /// @@ -326,11 +326,11 @@ public partial class Dispatcher /// An operation representing the queued delegate to be invoked. /// /// - /// Note that the default priority is DispatcherPriority.Normal. + /// Note that the default priority is DispatcherPriority.Default. /// public DispatcherOperation InvokeAsync(Func callback) { - return InvokeAsync(callback, DispatcherPriority.Normal, CancellationToken.None); + return InvokeAsync(callback, DispatcherPriority.Default, CancellationToken.None); } /// @@ -541,6 +541,18 @@ public partial class Dispatcher InvokeAsyncImpl(new DispatcherOperation(this, priority, action, true), CancellationToken.None); } + /// + /// Executes the specified Func<Task> asynchronously on the + /// thread that the Dispatcher was created on + /// + /// + /// A Func<Task> delegate to invoke through the dispatcher. + /// + /// + /// An task that completes after the task returned from callback finishes. + /// + public Task InvokeAsync(Func callback) => InvokeAsync(callback, DispatcherPriority.Default); + /// /// Executes the specified Func<Task> asynchronously on the /// thread that the Dispatcher was created on @@ -556,11 +568,29 @@ public partial class Dispatcher /// /// An task that completes after the task returned from callback finishes /// - public Task InvokeAsync(Func callback, DispatcherPriority priority = default) + public Task InvokeAsync(Func callback, DispatcherPriority priority) { _ = callback ?? throw new ArgumentNullException(nameof(callback)); return InvokeAsync(callback, priority).GetTask().Unwrap(); } + + /// + /// Executes the specified Func<Task<TResult>> asynchronously on the + /// thread that the Dispatcher was created on + /// + /// + /// A Func<Task<TResult>> delegate to invoke through the dispatcher. + /// + /// + /// The priority that determines in what order the specified + /// callback is invoked relative to the other pending operations + /// in the Dispatcher. + /// + /// + /// An task that completes after the task returned from callback finishes + /// + public Task InvokeAsync(Func> action) => + InvokeAsync(action, DispatcherPriority.Default); /// /// Executes the specified Func<Task<TResult>> asynchronously on the @@ -577,7 +607,7 @@ public partial class Dispatcher /// /// An task that completes after the task returned from callback finishes /// - public Task InvokeAsync(Func> action, DispatcherPriority priority = default) + public Task InvokeAsync(Func> action, DispatcherPriority priority) { _ = action ?? throw new ArgumentNullException(nameof(action)); return InvokeAsync>(action, priority).GetTask().Unwrap(); diff --git a/tests/Avalonia.Base.UnitTests/DispatcherTests.cs b/tests/Avalonia.Base.UnitTests/DispatcherTests.cs index 9ba3f3980d..7b401918ce 100644 --- a/tests/Avalonia.Base.UnitTests/DispatcherTests.cs +++ b/tests/Avalonia.Base.UnitTests/DispatcherTests.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; +using System.Threading.Tasks; +using Avalonia.Controls.Platform; using Avalonia.Threading; using Avalonia.Utilities; using Xunit; @@ -458,4 +460,46 @@ public class DispatcherTests } } + [Fact] + public void DispatcherInvokeAsyncUnwrapsTasks() + { + int asyncMethodStage = 0; + + async Task AsyncMethod() + { + asyncMethodStage = 1; + await Task.Delay(200); + asyncMethodStage = 2; + } + + async Task AsyncMethodWithResult() + { + await Task.Delay(100); + return 1; + } + + async Task Test() + { + await Dispatcher.UIThread.InvokeAsync(AsyncMethod); + Assert.Equal(2, asyncMethodStage); + Assert.Equal(1, await Dispatcher.UIThread.InvokeAsync(AsyncMethodWithResult)); + asyncMethodStage = 0; + + await Dispatcher.UIThread.InvokeAsync(AsyncMethod, DispatcherPriority.Default); + Assert.Equal(2, asyncMethodStage); + Assert.Equal(1, await Dispatcher.UIThread.InvokeAsync(AsyncMethodWithResult, DispatcherPriority.Default)); + + Dispatcher.UIThread.ExitAllFrames(); + } + + using (new DispatcherServices(new ManagedDispatcherImpl(null))) + { + var t = Test(); + var cts = new CancellationTokenSource(); + Task.Delay(3000).ContinueWith(_ => cts.Cancel()); + Dispatcher.UIThread.MainLoop(cts.Token); + Assert.True(t.IsCompletedSuccessfully); + t.GetAwaiter().GetResult(); + } + } } \ No newline at end of file From 1604dd701c7769791a3e7dc9931b7c8bdf6d817f Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 3 May 2023 13:19:17 +0200 Subject: [PATCH 17/40] The default cursor is called "default" and not "pointer" --- src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts b/src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts index bbc59aba1c..77166e6f21 100644 --- a/src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts +++ b/src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts @@ -266,7 +266,7 @@ export class InputHelper { } public static setCursor(inputElement: HTMLInputElement, kind: string) { - if (kind === "pointer") { + if (kind === "default") { inputElement.style.removeProperty("cursor"); } else { inputElement.style.cursor = kind; From f956aa10e7005ee3c5dd9b9a52ce8221b672cc0b Mon Sep 17 00:00:00 2001 From: Mike James Date: Wed, 3 May 2023 16:28:01 +0200 Subject: [PATCH 18/40] Update readme.md Tweaked images to look slightly better in dark mode. --- readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 339cce9ee1..6dd556bd0d 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,4 @@ -![StarBanner3](https://user-images.githubusercontent.com/552074/235864283-691ac648-5113-4b5c-87e8-bed9ba192927.png) - +![Star our repo to show support](https://user-images.githubusercontent.com/552074/235945895-1b896994-a0b6-4e7c-a522-c5688c4ec1b9.png) ![Header](https://user-images.githubusercontent.com/552074/235865745-2a8e7274-4f66-4f77-8f05-feeb76e7d478.png) [![Telegram](https://raw.githubusercontent.com/Patrolavia/telegram-badge/master/chat.svg)](https://t.me/Avalonia) @@ -48,7 +47,8 @@ Install-Package Avalonia.Desktop ``` ## Showcase -[![Showcase_Banner](https://user-images.githubusercontent.com/552074/235865504-f9acaf42-ea2d-456a-ab52-547c45614bd5.png)](https://avaloniaui.net/showcase) +[![Showcase_Banner](https://user-images.githubusercontent.com/552074/235946124-bf6fda52-0c9f-4730-868b-0de957e5b97b.png)](https://avaloniaui.net/showcase) + See what others have built with Avalonia UI on our [Showcase](https://avaloniaui.net/Showcase). We welcome submissions! From 4ecf8c56e874a608de0243da0025ff2fb98ad4f0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 3 May 2023 16:02:40 +0100 Subject: [PATCH 19/40] dont expand/collapse TreeViewItem on space key. --- src/Avalonia.Controls/TreeViewItem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TreeViewItem.cs b/src/Avalonia.Controls/TreeViewItem.cs index 70ffd218b1..a61d9f75cd 100644 --- a/src/Avalonia.Controls/TreeViewItem.cs +++ b/src/Avalonia.Controls/TreeViewItem.cs @@ -165,7 +165,7 @@ namespace Avalonia.Controls { Key.Left => ApplyToItemOrRecursivelyIfCtrl(FocusAwareCollapseItem, e.KeyModifiers), Key.Right => ApplyToItemOrRecursivelyIfCtrl(ExpandItem, e.KeyModifiers), - Key.Enter or Key.Space => ApplyToItemOrRecursivelyIfCtrl(IsExpanded ? CollapseItem : ExpandItem, e.KeyModifiers), + Key.Enter => ApplyToItemOrRecursivelyIfCtrl(IsExpanded ? CollapseItem : ExpandItem, e.KeyModifiers), // do not handle CTRL with numpad keys Key.Subtract => FocusAwareCollapseItem, From a9eec8d48482aa7cb5562893c4a19d3025739020 Mon Sep 17 00:00:00 2001 From: affederaffe <68356204+affederaffe@users.noreply.github.com> Date: Thu, 4 May 2023 10:19:13 +0200 Subject: [PATCH 20/40] Bump Tmds.DBus.SourceGenerator --- src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj index 4805c3a034..3401da2d4a 100644 --- a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj +++ b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj @@ -13,7 +13,7 @@ - + From fb202aa060fc5ae1b392e7618ab51fd45853d229 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 4 May 2023 17:08:47 +0800 Subject: [PATCH 21/40] feat: respect DisplayMemberPath in SelectionBoxItem. --- src/Avalonia.Controls/ComboBox.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index 1234b66383..dadda4e0ec 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -443,7 +443,22 @@ namespace Avalonia.Controls } else { - SelectionBoxItem = item; + if(ItemTemplate is null && DisplayMemberBinding is { } binding) + { + var template = new FuncDataTemplate((_, _) => + new TextBlock + { + [TextBlock.DataContextProperty] = item, + [!TextBlock.TextProperty] = binding, + }); + var text = template.Build(item); + SelectionBoxItem = text; + } + else + { + SelectionBoxItem = item; + } + } } From 6b56d440229609cf88cb7742691d5a017af7dbec Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 4 May 2023 17:11:47 +0800 Subject: [PATCH 22/40] feat: add combobox samples. --- samples/ControlCatalog/Pages/ComboBoxPage.xaml | 15 +++++++++++++++ .../ViewModels/ComboBoxPageViewModel.cs | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/samples/ControlCatalog/Pages/ComboBoxPage.xaml b/samples/ControlCatalog/Pages/ComboBoxPage.xaml index 748a46c447..f3f6cfe0af 100644 --- a/samples/ControlCatalog/Pages/ComboBoxPage.xaml +++ b/samples/ControlCatalog/Pages/ComboBoxPage.xaml @@ -98,6 +98,21 @@ Inline Item 3 Inline Item 4 + + + + + + + + + + + + + + + WrapSelection diff --git a/samples/ControlCatalog/ViewModels/ComboBoxPageViewModel.cs b/samples/ControlCatalog/ViewModels/ComboBoxPageViewModel.cs index d3e4ea7c31..6ab7bb02e3 100644 --- a/samples/ControlCatalog/ViewModels/ComboBoxPageViewModel.cs +++ b/samples/ControlCatalog/ViewModels/ComboBoxPageViewModel.cs @@ -16,5 +16,20 @@ namespace ControlCatalog.ViewModels get => _wrapSelection; set => this.RaiseAndSetIfChanged(ref _wrapSelection, value); } + + public ObservableCollection Values { get; set; } = new ObservableCollection + { + new IdAndName(){ Id = "Id 1", Name = "Name 1" }, + new IdAndName(){ Id = "Id 2", Name = "Name 2" }, + new IdAndName(){ Id = "Id 3", Name = "Name 3" }, + new IdAndName(){ Id = "Id 4", Name = "Name 4" }, + new IdAndName(){ Id = "Id 5", Name = "Name 5" }, + }; + } + + public class IdAndName + { + public string Id { get; set; } + public string Name { get; set; } } } From bfdc2b387e35c094b4f38eee6f4de4ba1e3b210c Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Thu, 4 May 2023 11:51:38 +0200 Subject: [PATCH 23/40] Fix Skia FontMetrics --- src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs | 30 ++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs index 43e10e3e96..8b13cae802 100644 --- a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs @@ -27,24 +27,24 @@ namespace Avalonia.Skia const double defaultFontRenderingEmSize = 12.0; + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.HorizontalAscender, out var ascent); + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.HorizontalDescender, out var descent); + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.HorizontalLineGap, out var lineGap); + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.StrikeoutOffset, out var strikethroughOffset); + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.StrikeoutSize, out var strikethroughSize); + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.UnderlineOffset, out var underlineOffset); + Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.UnderlineSize, out var underlineSize); + Metrics = new FontMetrics { DesignEmHeight = (short)Typeface.UnitsPerEm, - Ascent = (int)(metrics.Ascent / defaultFontRenderingEmSize * Typeface.UnitsPerEm), - Descent = (int)(metrics.Descent / defaultFontRenderingEmSize * Typeface.UnitsPerEm), - LineGap = (int)(metrics.Leading / defaultFontRenderingEmSize * Typeface.UnitsPerEm), - UnderlinePosition = metrics.UnderlinePosition != null ? - (int)(metrics.UnderlinePosition / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : - 0, - UnderlineThickness = metrics.UnderlineThickness != null ? - (int)(metrics.UnderlineThickness / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : - 0, - StrikethroughPosition = metrics.StrikeoutPosition != null ? - (int)(metrics.StrikeoutPosition / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : - 0, - StrikethroughThickness = metrics.StrikeoutThickness != null ? - (int)(metrics.StrikeoutThickness / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : - 0, + Ascent = -ascent, + Descent = -descent, + LineGap = lineGap, + UnderlinePosition = -underlineOffset, + UnderlineThickness = underlineSize, + StrikethroughPosition = -strikethroughOffset, + StrikethroughThickness = strikethroughSize, IsFixedPitch = Typeface.IsFixedPitch }; From 1609b7af78c24c5be2cc602493be6a404c8dce3b Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Thu, 4 May 2023 12:45:08 +0200 Subject: [PATCH 24/40] fix(DevTools): Avoid reset filter on navigation --- .../Diagnostics/ViewModels/ControlDetailsViewModel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs index b9b4ccb0b4..d9db115792 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs @@ -522,7 +522,6 @@ namespace Avalonia.Diagnostics.ViewModels .GroupBy(x => x.Key) .ToDictionary(x => x.Key, x => x.ToArray()); - TreePage.PropertiesFilter.FilterString = string.Empty; var view = new DataGridCollectionView(properties); view.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(AvaloniaPropertyViewModel.Group))); From 24613c81795dbb637c44ba291f7670a3a5220f55 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 4 May 2023 19:30:34 +0800 Subject: [PATCH 25/40] fix: fix double click selection issue. --- src/Avalonia.Controls/Utils/StringUtils.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Avalonia.Controls/Utils/StringUtils.cs b/src/Avalonia.Controls/Utils/StringUtils.cs index 6c459d7985..2ea47b442a 100644 --- a/src/Avalonia.Controls/Utils/StringUtils.cs +++ b/src/Avalonia.Controls/Utils/StringUtils.cs @@ -1,3 +1,4 @@ +using System; using System.Globalization; using Avalonia.Media.TextFormatting.Unicode; @@ -122,6 +123,8 @@ namespace Avalonia.Controls.Utils { return 0; } + + cursor = Math.Min(cursor, text.Length); int begin; int i; From 3a250c86f3a0551a7d6dd122f9593d080c0eb914 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 4 May 2023 14:23:12 +0200 Subject: [PATCH 26/40] Added failing test for #7706. --- .../Layout/LayoutManagerTests.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs index 45a6efdd4a..cadf23c754 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs @@ -547,5 +547,38 @@ namespace Avalonia.Base.UnitTests.Layout Assert.True(root.IsMeasureValid); Assert.True(root.IsArrangeValid); } + + [Fact] + public void GreatGrandparent_Can_Invalidate_Grandparent_Measure_During_Arrange() + { + // Issue #7706 (second part: scrollbar gets stuck) + var child = new LayoutTestControl(); + var parent = new LayoutTestControl { Child = child }; + var grandparent = new LayoutTestControl { Child = parent }; + var greatGrandparent = new LayoutTestControl { Child = grandparent }; + var root = new LayoutTestRoot { Child = greatGrandparent }; + + root.LayoutManager.ExecuteInitialLayoutPass(); + + greatGrandparent.DoArrangeOverride = (_, s) => + { + grandparent.InvalidateMeasure(); + return s; + }; + + child.InvalidateArrange(); + greatGrandparent.InvalidateArrange(); + + root.LayoutManager.ExecuteLayoutPass(); + + Assert.True(child.IsMeasureValid); + Assert.True(child.IsArrangeValid); + Assert.True(parent.IsMeasureValid); + Assert.True(parent.IsArrangeValid); + Assert.True(greatGrandparent.IsMeasureValid); + Assert.True(greatGrandparent.IsArrangeValid); + Assert.True(root.IsMeasureValid); + Assert.True(root.IsArrangeValid); + } } } From 7fe8d67374ebef17ce7c15a2dbb26f77b98440b9 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 4 May 2023 14:50:20 +0200 Subject: [PATCH 27/40] Queue controls for another arrange after measure. If an ancestor control results in a control not being arranged, then we need to queue that control for another arrange pass after the next measure pass. Fixes #7706. --- src/Avalonia.Base/Layout/LayoutManager.cs | 27 +++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Base/Layout/LayoutManager.cs b/src/Avalonia.Base/Layout/LayoutManager.cs index f47738f2e4..7873f83edb 100644 --- a/src/Avalonia.Base/Layout/LayoutManager.cs +++ b/src/Avalonia.Base/Layout/LayoutManager.cs @@ -21,6 +21,7 @@ namespace Avalonia.Layout private readonly Layoutable _owner; private readonly LayoutQueue _toMeasure = new LayoutQueue(v => !v.IsMeasureValid); private readonly LayoutQueue _toArrange = new LayoutQueue(v => !v.IsArrangeValid); + private readonly List _toArrangeAfterMeasure = new(); private readonly Action _executeLayoutPass; private List? _effectiveViewportChangedListeners; private bool _disposed; @@ -266,9 +267,14 @@ namespace Avalonia.Layout if (!control.IsArrangeValid) { - Arrange(control); + if (Arrange(control) == ArrangeResult.AncestorMeasureInvalid) + _toArrangeAfterMeasure.Add(control); } } + + foreach (var i in _toArrangeAfterMeasure) + InvalidateArrange(i); + _toArrangeAfterMeasure.Clear(); } private bool Measure(Layoutable control) @@ -304,19 +310,19 @@ namespace Avalonia.Layout return true; } - private bool Arrange(Layoutable control) + private ArrangeResult Arrange(Layoutable control) { if (!control.IsVisible || !control.IsAttachedToVisualTree) - return false; + return ArrangeResult.NotVisible; if (control.VisualParent is Layoutable parent) { - if (!Arrange(parent)) - return false; + if (Arrange(parent) is var parentResult && parentResult != ArrangeResult.Arranged) + return parentResult; } if (!control.IsMeasureValid) - return false; + return ArrangeResult.AncestorMeasureInvalid; if (!control.IsArrangeValid) { @@ -332,7 +338,7 @@ namespace Avalonia.Layout } } - return true; + return ArrangeResult.Arranged; } private void QueueLayoutPass() @@ -435,5 +441,12 @@ namespace Avalonia.Layout public Layoutable Listener { get; } public Rect Viewport { get; set; } } + + private enum ArrangeResult + { + Arranged, + NotVisible, + AncestorMeasureInvalid, + } } } From e3dd353da3dc95d3d934872c1541fce010be9548 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 4 May 2023 20:29:38 +0600 Subject: [PATCH 28/40] Use SKBitmap-backed bitmap for RenderTargetBitmap --- .../Avalonia.Skia/PlatformRenderInterface.cs | 11 +------ .../Avalonia.Skia/RenderTargetBitmapImpl.cs | 31 +++++++++++++++++++ src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index a9a79ff0c5..767be3149d 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -191,16 +191,7 @@ namespace Avalonia.Skia throw new ArgumentException("Height can't be less than 1", nameof(size)); } - var createInfo = new SurfaceRenderTarget.CreateInfo - { - Width = size.Width, - Height = size.Height, - Dpi = dpi, - DisableTextLcdRendering = false, - DisableManualFbo = true, - }; - - return new SurfaceRenderTarget(createInfo); + return new RenderTargetBitmapImpl(size, dpi); } /// diff --git a/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs b/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs new file mode 100644 index 0000000000..e20755b4e2 --- /dev/null +++ b/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs @@ -0,0 +1,31 @@ +using System.IO; +using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using SkiaSharp; + +namespace Avalonia.Skia; + +internal class RenderTargetBitmapImpl : WriteableBitmapImpl, + IRenderTargetBitmapImpl, + IFramebufferPlatformSurface +{ + private readonly FramebufferRenderTarget _renderTarget; + + public RenderTargetBitmapImpl(PixelSize size, Vector dpi) : base(size, dpi, + SKImageInfo.PlatformColorType == SKColorType.Rgba8888 ? PixelFormats.Rgba8888 : PixelFormat.Bgra8888, + AlphaFormat.Premul) + { + _renderTarget = new FramebufferRenderTarget(this); + } + + public IDrawingContextImpl CreateDrawingContext() => _renderTarget.CreateDrawingContext(); + + public bool IsCorrupted => false; + + public override void Dispose() + { + _renderTarget.Dispose(); + base.Dispose(); + } +} \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs b/src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs index 8ea7434c23..38df7b2933 100644 --- a/src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs +++ b/src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs @@ -131,7 +131,7 @@ namespace Avalonia.Skia } /// - public void Dispose() + public virtual void Dispose() { _bitmap.Dispose(); } From 9ab08885ed620b82bcea67e1fef095b3a83c5338 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 4 May 2023 20:29:53 +0600 Subject: [PATCH 29/40] Fixed RTB Dispose --- src/Avalonia.Base/Media/Imaging/RenderTargetBitmap.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Media/Imaging/RenderTargetBitmap.cs b/src/Avalonia.Base/Media/Imaging/RenderTargetBitmap.cs index e77dd9d1ab..4921e9b756 100644 --- a/src/Avalonia.Base/Media/Imaging/RenderTargetBitmap.cs +++ b/src/Avalonia.Base/Media/Imaging/RenderTargetBitmap.cs @@ -9,7 +9,7 @@ namespace Avalonia.Media.Imaging /// /// A bitmap that holds the rendering of a . /// - public class RenderTargetBitmap : Bitmap, IDisposable + public class RenderTargetBitmap : Bitmap { /// /// Initializes a new instance of the class. @@ -68,5 +68,11 @@ namespace Avalonia.Media.Imaging platform.Clear(Colors.Transparent); return new PlatformDrawingContext(platform); } + + public override void Dispose() + { + PlatformImpl.Dispose(); + base.Dispose(); + } } } From ac24e82d89b71151d8e562ebec8e726a4ce98eeb Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 5 May 2023 02:51:18 +0600 Subject: [PATCH 30/40] Add GetAwaiter for DispatcherOperation --- src/Avalonia.Base/Threading/DispatcherOperation.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Avalonia.Base/Threading/DispatcherOperation.cs b/src/Avalonia.Base/Threading/DispatcherOperation.cs index 809c41ff02..8bd6d3bc01 100644 --- a/src/Avalonia.Base/Threading/DispatcherOperation.cs +++ b/src/Avalonia.Base/Threading/DispatcherOperation.cs @@ -331,6 +331,8 @@ public class DispatcherOperation : DispatcherOperation private TaskCompletionSource TaskCompletionSource => (TaskCompletionSource)TaskSource!; + public new TaskAwaiter GetAwaiter() => GetTask().GetAwaiter(); + public new Task GetTask() => TaskCompletionSource!.Task; protected override Task GetTaskCore() => GetTask(); From 4b539f77b1c22a2975451355558ef4d10fa6ccb9 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 5 May 2023 11:29:02 +0200 Subject: [PATCH 31/40] fix: removing unnecessary statements. --- src/Avalonia.Native/AvaloniaNativeDragSource.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/Avalonia.Native/AvaloniaNativeDragSource.cs b/src/Avalonia.Native/AvaloniaNativeDragSource.cs index 7f4c462ee0..5063c7a0a0 100644 --- a/src/Avalonia.Native/AvaloniaNativeDragSource.cs +++ b/src/Avalonia.Native/AvaloniaNativeDragSource.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Input.Platform; -using Avalonia.Interactivity; using Avalonia.Native.Interop; namespace Avalonia.Native @@ -18,16 +17,6 @@ namespace Avalonia.Native _factory = factory; } - private static TopLevel FindRoot(object? element) - { - while (element is Interactive interactive && element is not Visual) - element = interactive.GetInteractiveParent(); - if (element == null) - return null; - var visual = (Visual)element; - return TopLevel.GetTopLevel(visual); - } - class DndCallback : NativeCallbackBase, IAvnDndResultCallback { private TaskCompletionSource _tcs; @@ -46,7 +35,7 @@ namespace Avalonia.Native public Task DoDragDrop(PointerEventArgs triggerEvent, IDataObject data, DragDropEffects allowedEffects) { // Sanity check - var tl = FindRoot(triggerEvent.Source); + var tl = TopLevel.GetTopLevel(triggerEvent.Source as Visual); var view = tl?.PlatformImpl as WindowBaseImpl; if (view == null) throw new ArgumentException(); From 6dd9b7404416ee5c6a7213f46bae7d2619869842 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 5 May 2023 12:05:45 +0200 Subject: [PATCH 32/40] Make DataValidationPlugins public again --- .../Data/Core/Plugins/DataAnnotationsValidationPlugin.cs | 2 +- .../Data/Core/Plugins/ExceptionValidationPlugin.cs | 2 +- src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs index ba5f59ea23..bc300386b9 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs @@ -10,7 +10,7 @@ namespace Avalonia.Data.Core.Plugins /// /// Validates properties on that have s. /// - internal class DataAnnotationsValidationPlugin : IDataValidationPlugin + public class DataAnnotationsValidationPlugin : IDataValidationPlugin { /// [RequiresUnreferencedCode(TrimmingMessages.DataValidationPluginRequiresUnreferencedCodeMessage)] diff --git a/src/Avalonia.Base/Data/Core/Plugins/ExceptionValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/ExceptionValidationPlugin.cs index e60a341309..2bb8da2c74 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/ExceptionValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/ExceptionValidationPlugin.cs @@ -7,7 +7,7 @@ namespace Avalonia.Data.Core.Plugins /// /// Validates properties that report errors by throwing exceptions. /// - internal class ExceptionValidationPlugin : IDataValidationPlugin + public class ExceptionValidationPlugin : IDataValidationPlugin { /// [RequiresUnreferencedCode(TrimmingMessages.DataValidationPluginRequiresUnreferencedCodeMessage)] diff --git a/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs index 3384a99333..87a2f67ee8 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs @@ -10,7 +10,7 @@ namespace Avalonia.Data.Core.Plugins /// /// Validates properties on objects that implement . /// - internal class IndeiValidationPlugin : IDataValidationPlugin + public class IndeiValidationPlugin : IDataValidationPlugin { private static readonly WeakEvent ErrorsChangedWeakEvent = WeakEvent.Register( From ff16f8accd56c43e2a54ac3740c10f30888747a8 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 5 May 2023 11:47:49 +0100 Subject: [PATCH 33/40] if DefaultExtension is null, then pass empty string to win32 otherwise the extension appending logic gets borked. --- src/Windows/Avalonia.Win32/Win32StorageProvider.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Win32StorageProvider.cs b/src/Windows/Avalonia.Win32/Win32StorageProvider.cs index 86574f2fa3..c987732768 100644 --- a/src/Windows/Avalonia.Win32/Win32StorageProvider.cs +++ b/src/Windows/Avalonia.Win32/Win32StorageProvider.cs @@ -99,12 +99,14 @@ namespace Avalonia.Win32 } frm.SetOptions(options); - if (defaultExtension is not null) + if (defaultExtension is null) { - fixed (char* pExt = defaultExtension) - { - frm.SetDefaultExtension(pExt); - } + defaultExtension = String.Empty; + } + + fixed (char* pExt = defaultExtension) + { + frm.SetDefaultExtension(pExt); } suggestedFileName ??= ""; From 4333cc33bae2b4bb307144e69d5ed814a4efad4a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 May 2023 13:48:11 +0200 Subject: [PATCH 34/40] Revert thumb to using relative coordinates for drag. Undoes the changes in #10892 and #11087. --- src/Avalonia.Controls/Primitives/Thumb.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Thumb.cs b/src/Avalonia.Controls/Primitives/Thumb.cs index 9854bdbea6..13f4fdd534 100644 --- a/src/Avalonia.Controls/Primitives/Thumb.cs +++ b/src/Avalonia.Controls/Primitives/Thumb.cs @@ -4,7 +4,6 @@ using Avalonia.Controls.Automation.Peers; using Avalonia.Controls.Metadata; using Avalonia.Input; using Avalonia.Interactivity; -using Avalonia.VisualTree; namespace Avalonia.Controls.Primitives { @@ -85,22 +84,20 @@ namespace Avalonia.Controls.Primitives { if (_lastPoint.HasValue) { - var point = e.GetPosition(null); var ev = new VectorEventArgs { RoutedEvent = DragDeltaEvent, - Vector = point - _lastPoint.Value, + Vector = e.GetPosition(this) - _lastPoint.Value, }; RaiseEvent(ev); - _lastPoint = point; } } protected override void OnPointerPressed(PointerPressedEventArgs e) { e.Handled = true; - _lastPoint = e.GetPosition(null); + _lastPoint = e.GetPosition(this); var ev = new VectorEventArgs { @@ -123,7 +120,7 @@ namespace Avalonia.Controls.Primitives var ev = new VectorEventArgs { RoutedEvent = DragCompletedEvent, - Vector = (Vector)e.GetPosition(null), + Vector = (Vector)e.GetPosition(this), }; RaiseEvent(ev); From 42bd366bc1eba56fe9f2a1e46b2eab4fe6b3ccc6 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 May 2023 13:50:23 +0200 Subject: [PATCH 35/40] Added failing test for ScrollViewer jumpiness. --- .../ScrollViewerTests.cs | 122 ++++++++++++++++++ tests/Avalonia.UnitTests/MouseTestHelper.cs | 10 +- 2 files changed, 129 insertions(+), 3 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs b/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs index a7bde551e9..fdd7a3e288 100644 --- a/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; +using System.Linq; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Layout; +using Avalonia.Media; using Avalonia.UnitTests; +using Avalonia.VisualTree; using Moq; using Xunit; @@ -12,6 +15,8 @@ namespace Avalonia.Controls.UnitTests { public class ScrollViewerTests { + private readonly MouseTestHelper _mouse = new(); + [Fact] public void Content_Is_Created() { @@ -249,6 +254,73 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new Vector(20, 20), target.Offset); } + [Fact] + public void Scroll_Does_Not_Jump_When_Viewport_Becomes_Smaller_While_Dragging_ScrollBar_Thumb() + { + var content = new TestContent + { + MeasureSize = new Size(1000, 10000), + }; + + var target = new ScrollViewer + { + Template = new FuncControlTemplate(CreateTemplate), + Content = content, + }; + var root = new TestRoot(target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + Assert.Equal(new Size(1000, 10000), target.Extent); + Assert.Equal(new Size(1000, 1000), target.Viewport); + + // We're working in absolute coordinates (i.e. relative to the root) and clicking on + // the center of the vertical thumb. + var thumb = GetVerticalThumb(target); + var p = GetRootPoint(thumb, thumb.Bounds.Center); + + // Press the mouse button in the center of the thumb. + _mouse.Down(thumb, position: p); + root.LayoutManager.ExecuteLayoutPass(); + + // Drag the thumb down 300 pixels. + _mouse.Move(thumb, p += new Vector(0, 300)); + root.LayoutManager.ExecuteLayoutPass(); + + Assert.Equal(new Vector(0, 3000), target.Offset); + Assert.Equal(300, thumb.Bounds.Top); + + // Now the extent changes from 10,000 to 5000. + content.MeasureSize /= 2; + content.InvalidateMeasure(); + root.LayoutManager.ExecuteLayoutPass(); + + // Due to the extent change, the thumb moves down but the value remains the same. + Assert.Equal(600, thumb.Bounds.Top); + Assert.Equal(new Vector(0, 3000), target.Offset); + + // Drag the thumb down another 100 pixels. + _mouse.Move(thumb, p += new Vector(0, 100)); + root.LayoutManager.ExecuteLayoutPass(); + + // The drag should not cause the offset/thumb to jump *up* to the current absolute + // mouse position, i.e. it should move down in the direction of the drag even if the + // absolute mouse position is now above the thumb. + Assert.Equal(700, thumb.Bounds.Top); + Assert.Equal(new Vector(0, 3500), target.Offset); + } + + private Point GetRootPoint(Visual control, Point p) + { + if (control.GetVisualRoot() is Visual root && + control.TransformToVisual(root) is Matrix m) + { + return p.Transform(m); + } + + throw new InvalidOperationException("Could not get the point in root coordinates."); + } + private Control CreateTemplate(ScrollViewer control, INameScope scope) { return new Grid @@ -273,6 +345,7 @@ namespace Avalonia.Controls.UnitTests { Name = "PART_HorizontalScrollBar", Orientation = Orientation.Horizontal, + Template = new FuncControlTemplate(CreateScrollBarTemplate), [~ScrollBar.VisibilityProperty] = control[~ScrollViewer.HorizontalScrollBarVisibilityProperty], [Grid.RowProperty] = 1, }.RegisterInNameScope(scope), @@ -280,6 +353,7 @@ namespace Avalonia.Controls.UnitTests { Name = "PART_VerticalScrollBar", Orientation = Orientation.Vertical, + Template = new FuncControlTemplate(CreateScrollBarTemplate), [~ScrollBar.VisibilityProperty] = control[~ScrollViewer.VerticalScrollBarVisibilityProperty], [Grid.ColumnProperty] = 1, }.RegisterInNameScope(scope), @@ -287,6 +361,44 @@ namespace Avalonia.Controls.UnitTests }; } + private Control CreateScrollBarTemplate(ScrollBar scrollBar, INameScope scope) + { + return new Border + { + Child = new Track + { + Name = "track", + IsDirectionReversed = true, + [!Track.MinimumProperty] = scrollBar[!RangeBase.MinimumProperty], + [!Track.MaximumProperty] = scrollBar[!RangeBase.MaximumProperty], + [!!Track.ValueProperty] = scrollBar[!!RangeBase.ValueProperty], + [!Track.ViewportSizeProperty] = scrollBar[!ScrollBar.ViewportSizeProperty], + [!Track.OrientationProperty] = scrollBar[!ScrollBar.OrientationProperty], + Thumb = new Thumb + { + Template = new FuncControlTemplate(CreateThumbTemplate), + }, + }.RegisterInNameScope(scope), + }; + } + + private static Control CreateThumbTemplate(Thumb control, INameScope scope) + { + return new Border + { + Background = Brushes.Gray, + }; + } + + private Thumb GetVerticalThumb(ScrollViewer target) + { + var scrollbar = Assert.IsType( + target.GetTemplateChildren().FirstOrDefault(x => x.Name == "PART_VerticalScrollBar")); + var track = Assert.IsType( + scrollbar.GetTemplateChildren().FirstOrDefault(x => x.Name == "track")); + return Assert.IsType(track.Thumb); + } + private static void InitializeScrollViewer(ScrollViewer target) { target.ApplyTemplate(); @@ -295,5 +407,15 @@ namespace Avalonia.Controls.UnitTests presenter.AttachToScrollViewer(); presenter.UpdateChild(); } + + private class TestContent : Control + { + public Size MeasureSize { get; set; } = new Size(1000, 2000); + + protected override Size MeasureOverride(Size availableSize) + { + return MeasureSize; + } + } } } diff --git a/tests/Avalonia.UnitTests/MouseTestHelper.cs b/tests/Avalonia.UnitTests/MouseTestHelper.cs index d63327239b..eff38388e2 100644 --- a/tests/Avalonia.UnitTests/MouseTestHelper.cs +++ b/tests/Avalonia.UnitTests/MouseTestHelper.cs @@ -59,7 +59,7 @@ namespace Avalonia.UnitTests { _pressedButton = mouseButton; _pointer.Capture((IInputElement)target); - source.RaiseEvent(new PointerPressedEventArgs(source, _pointer, (Visual)source, position, Timestamp(), props, + source.RaiseEvent(new PointerPressedEventArgs(source, _pointer, GetRoot(target), position, Timestamp(), props, modifiers, clickCount)); } } @@ -68,7 +68,7 @@ namespace Avalonia.UnitTests public void Move(Interactive target, Interactive source, in Point position, KeyModifiers modifiers = default) { - target.RaiseEvent(new PointerEventArgs(InputElement.PointerMovedEvent, source, _pointer, (Visual)target, position, + target.RaiseEvent(new PointerEventArgs(InputElement.PointerMovedEvent, source, _pointer, GetRoot(target), position, Timestamp(), new PointerPointProperties((RawInputModifiers)_pressedButtons, PointerUpdateKind.Other), modifiers)); } @@ -88,7 +88,7 @@ namespace Avalonia.UnitTests ); if (ButtonCount(props) == 0) { - target.RaiseEvent(new PointerReleasedEventArgs(source, _pointer, (Visual)target, position, + target.RaiseEvent(new PointerReleasedEventArgs(source, _pointer, GetRoot(target), position, Timestamp(), props, modifiers, _pressedButton)); _pointer.Capture(null); } @@ -131,5 +131,9 @@ namespace Avalonia.UnitTests Timestamp(), new PointerPointProperties((RawInputModifiers)_pressedButtons, PointerUpdateKind.Other), KeyModifiers.None)); } + private Visual GetRoot(Interactive source) + { + return ((source as Visual)?.GetVisualRoot() as Visual) ?? (Visual)source; + } } } From 69922b69176e12fcbeef147e596e57ec9612583c Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 May 2023 13:52:01 +0200 Subject: [PATCH 36/40] Adjust thumb drag position on track size change. Fixes `ScrollViewer` jumping around when the scroll extent changes while dragging the scrollbar thumb. --- src/Avalonia.Controls/Primitives/Thumb.cs | 6 ++++++ src/Avalonia.Controls/Primitives/Track.cs | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Thumb.cs b/src/Avalonia.Controls/Primitives/Thumb.cs index 13f4fdd534..c5d73dc00f 100644 --- a/src/Avalonia.Controls/Primitives/Thumb.cs +++ b/src/Avalonia.Controls/Primitives/Thumb.cs @@ -46,6 +46,12 @@ namespace Avalonia.Controls.Primitives remove { RemoveHandler(DragCompletedEvent, value); } } + internal void AdjustDrag(Vector v) + { + if (_lastPoint.HasValue) + _lastPoint = _lastPoint.Value + v; + } + protected override AutomationPeer OnCreateAutomationPeer() => new ThumbAutomationPeer(this); protected virtual void OnDragStarted(VectorEventArgs e) diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index fe4912a33c..913dd83c16 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -45,6 +45,8 @@ namespace Avalonia.Controls.Primitives public static readonly StyledProperty IgnoreThumbDragProperty = AvaloniaProperty.Register(nameof(IgnoreThumbDrag)); + private Vector _lastDrag; + static Track() { ThumbProperty.Changed.AddClassHandler((x, e) => x.ThumbChanged(e)); @@ -245,7 +247,10 @@ namespace Avalonia.Controls.Primitives if (Thumb != null) { - Thumb.Arrange(new Rect(offset, pieceSize)); + var bounds = new Rect(offset, pieceSize); + var adjust = CalculateThumbAdjustment(Thumb, bounds); + Thumb.Arrange(bounds); + Thumb.AdjustDrag(adjust); } ThumbCenterOffset = offset.Y + (thumbLength * 0.5); @@ -277,15 +282,25 @@ namespace Avalonia.Controls.Primitives if (Thumb != null) { - Thumb.Arrange(new Rect(offset, pieceSize)); + var bounds = new Rect(offset, pieceSize); + var adjust = CalculateThumbAdjustment(Thumb, bounds); + Thumb.Arrange(bounds); + Thumb.AdjustDrag(adjust); } ThumbCenterOffset = offset.X + (thumbLength * 0.5); } + _lastDrag = default; return arrangeSize; } + private Vector CalculateThumbAdjustment(Thumb thumb, Rect newThumbBounds) + { + var thumbDelta = newThumbBounds.Position - thumb.Bounds.Position; + return _lastDrag - thumbDelta; + } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); @@ -444,6 +459,7 @@ namespace Avalonia.Controls.Primitives Value + ValueFromDistance(e.Vector.X, e.Vector.Y), Minimum, Maximum)); + _lastDrag = e.Vector; } private void ShowChildren(bool visible) From 5e3b94f88c7bd435f44585f9119857f846d64d44 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 May 2023 14:05:07 +0200 Subject: [PATCH 37/40] Added failing test for scrollbar thumb. --- .../ScrollViewerTests.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs b/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs index fdd7a3e288..82c4b5f8f0 100644 --- a/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs @@ -310,6 +310,54 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new Vector(0, 3500), target.Offset); } + [Fact] + public void Thumb_Does_Not_Become_Detached_From_Mouse_Position_When_Scrolling_Past_The_Start() + { + var content = new TestContent(); + var target = new ScrollViewer + { + Template = new FuncControlTemplate(CreateTemplate), + Content = content, + }; + var root = new TestRoot(target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + Assert.Equal(new Size(1000, 2000), target.Extent); + Assert.Equal(new Size(1000, 1000), target.Viewport); + + // We're working in absolute coordinates (i.e. relative to the root) and clicking on + // the center of the vertical thumb. + var thumb = GetVerticalThumb(target); + var p = GetRootPoint(thumb, thumb.Bounds.Center); + + // Press the mouse button in the center of the thumb. + _mouse.Down(thumb, position: p); + root.LayoutManager.ExecuteLayoutPass(); + + // Drag the thumb down 100 pixels. + _mouse.Move(thumb, p += new Vector(0, 100)); + root.LayoutManager.ExecuteLayoutPass(); + + Assert.Equal(new Vector(0, 200), target.Offset); + Assert.Equal(100, thumb.Bounds.Top); + + // Drag the thumb up 200 pixels - 100 pixels past the top of the scrollbar. + _mouse.Move(thumb, p -= new Vector(0, 200)); + root.LayoutManager.ExecuteLayoutPass(); + + Assert.Equal(new Vector(0, 0), target.Offset); + Assert.Equal(0, thumb.Bounds.Top); + + // Drag the thumb back down 200 pixels. + _mouse.Move(thumb, p += new Vector(0, 200)); + root.LayoutManager.ExecuteLayoutPass(); + + // We should now be back in the state after we first scrolled down 100 pixels. + Assert.Equal(new Vector(0, 200), target.Offset); + Assert.Equal(100, thumb.Bounds.Top); + } + private Point GetRootPoint(Visual control, Point p) { if (control.GetVisualRoot() is Visual root && From c204156e8acc4d693b4a103b047ca0ccb64b6056 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 May 2023 14:31:18 +0200 Subject: [PATCH 38/40] Don't offset thumb from pointer when dragged past end. --- src/Avalonia.Controls/Primitives/Track.cs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index 913dd83c16..f9aa5fc7a0 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -295,12 +295,6 @@ namespace Avalonia.Controls.Primitives return arrangeSize; } - private Vector CalculateThumbAdjustment(Thumb thumb, Rect newThumbBounds) - { - var thumbDelta = newThumbBounds.Position - thumb.Bounds.Position; - return _lastDrag - thumbDelta; - } - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); @@ -311,6 +305,12 @@ namespace Avalonia.Controls.Primitives } } + private Vector CalculateThumbAdjustment(Thumb thumb, Rect newThumbBounds) + { + var thumbDelta = newThumbBounds.Position - thumb.Bounds.Position; + return _lastDrag - thumbDelta; + } + private static void CoerceLength(ref double componentLength, double trackLength) { if (componentLength < 0) @@ -455,11 +455,17 @@ namespace Avalonia.Controls.Primitives if (IgnoreThumbDrag) return; + var value = Value; + var delta = ValueFromDistance(e.Vector.X, e.Vector.Y); + var factor = e.Vector / delta; + SetCurrentValue(ValueProperty, MathUtilities.Clamp( - Value + ValueFromDistance(e.Vector.X, e.Vector.Y), + value + delta, Minimum, Maximum)); - _lastDrag = e.Vector; + + // Record the part of the drag that actually had effect as the last drag delta. + _lastDrag = (Value - value) * factor; } private void ShowChildren(bool visible) From 62da607b91251e92fd90461d91b839320b8cb22c Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sat, 6 May 2023 21:08:50 -0400 Subject: [PATCH 39/40] Make previously internal members internal again --- src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs | 3 +-- .../Platform/Internal/AssemblyDescriptorResolver.cs | 3 +-- src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs | 3 +-- src/Avalonia.Base/Platform/StandardAssetLoader.cs | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs index e5caafa128..7bfb7e3c26 100644 --- a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs +++ b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs @@ -8,8 +8,7 @@ using Avalonia.Utilities; namespace Avalonia.Platform.Internal; -[Unstable] -public interface IAssemblyDescriptor +internal interface IAssemblyDescriptor { Assembly Assembly { get; } Dictionary? Resources { get; } diff --git a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs index 58f274e6c0..f19e1735b4 100644 --- a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs +++ b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs @@ -7,8 +7,7 @@ using Avalonia.Metadata; namespace Avalonia.Platform.Internal; -[Unstable] -public interface IAssemblyDescriptorResolver +internal interface IAssemblyDescriptorResolver { IAssemblyDescriptor GetAssembly(string name); } diff --git a/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs b/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs index be754f7b40..10ca66e4ec 100644 --- a/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs +++ b/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs @@ -5,8 +5,7 @@ using Avalonia.Metadata; namespace Avalonia.Platform.Internal; -[Unstable] -public interface IAssetDescriptor +internal interface IAssetDescriptor { Stream GetStream(); Assembly Assembly { get; } diff --git a/src/Avalonia.Base/Platform/StandardAssetLoader.cs b/src/Avalonia.Base/Platform/StandardAssetLoader.cs index df7c729a28..1d9363c70d 100644 --- a/src/Avalonia.Base/Platform/StandardAssetLoader.cs +++ b/src/Avalonia.Base/Platform/StandardAssetLoader.cs @@ -19,7 +19,7 @@ public class StandardAssetLoader : IAssetLoader private readonly IAssemblyDescriptorResolver _assemblyDescriptorResolver; private AssemblyDescriptor? _defaultResmAssembly; - public StandardAssetLoader(IAssemblyDescriptorResolver resolver, Assembly? assembly = null) + internal StandardAssetLoader(IAssemblyDescriptorResolver resolver, Assembly? assembly = null) { if (assembly == null) assembly = Assembly.GetEntryAssembly(); From b6c25d5f70e36fb4cd8dcd738b46d3db72aa2280 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sat, 6 May 2023 21:17:01 -0400 Subject: [PATCH 40/40] Usings --- src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs | 1 - .../Platform/Internal/AssemblyDescriptorResolver.cs | 1 - src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs | 1 - 3 files changed, 3 deletions(-) diff --git a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs index 7bfb7e3c26..6a577c204c 100644 --- a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs +++ b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptor.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; -using Avalonia.Metadata; using Avalonia.Utilities; namespace Avalonia.Platform.Internal; diff --git a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs index f19e1735b4..b12130b1f7 100644 --- a/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs +++ b/src/Avalonia.Base/Platform/Internal/AssemblyDescriptorResolver.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; -using Avalonia.Metadata; namespace Avalonia.Platform.Internal; diff --git a/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs b/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs index 10ca66e4ec..52f8f5e68d 100644 --- a/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs +++ b/src/Avalonia.Base/Platform/Internal/AssetDescriptor.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Reflection; -using Avalonia.Metadata; namespace Avalonia.Platform.Internal;