Browse Source

Don't use AvaloniaObject in IPlatformRenderInterface

pull/10842/head
Nikita Tsukanov 3 years ago
parent
commit
312f1250e2
  1. 14
      src/Avalonia.Base/CombinedGeometry.cs
  2. 5
      src/Avalonia.Base/Media/GeometryGroup.cs
  3. 4
      src/Avalonia.Base/Platform/IPlatformRenderInterface.cs
  4. 4
      src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs
  5. 7
      src/Skia/Avalonia.Skia/CombinedGeometryImpl.cs
  6. 7
      src/Skia/Avalonia.Skia/GeometryGroupImpl.cs
  7. 4
      src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
  8. 4
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
  9. 13
      src/Windows/Avalonia.Direct2D1/Media/CombinedGeometryImpl.cs
  10. 7
      src/Windows/Avalonia.Direct2D1/Media/GeometryGroupImpl.cs
  11. 4
      tests/Avalonia.Base.UnitTests/VisualTree/MockRenderInterface.cs
  12. 4
      tests/Avalonia.Benchmarks/NullRenderingPlatform.cs
  13. 4
      tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs

14
src/Avalonia.Base/CombinedGeometry.cs

@ -152,19 +152,15 @@ namespace Avalonia.Media
var g1 = Geometry1;
var g2 = Geometry2;
if (g1 is object && g2 is object)
if (g1?.PlatformImpl != null && g2?.PlatformImpl != null)
{
var factory = AvaloniaLocator.Current.GetRequiredService<IPlatformRenderInterface>();
return factory.CreateCombinedGeometry(GeometryCombineMode, g1, g2);
return factory.CreateCombinedGeometry(GeometryCombineMode, g1.PlatformImpl, g2.PlatformImpl);
}
else if (GeometryCombineMode == GeometryCombineMode.Intersect)
return null;
else if (g1 is object)
return g1.PlatformImpl;
else if (g2 is object)
return g2.PlatformImpl;
else
if (GeometryCombineMode == GeometryCombineMode.Intersect)
return null;
return g1?.PlatformImpl ?? g2?.PlatformImpl;
}
}
}

5
src/Avalonia.Base/Media/GeometryGroup.cs

@ -78,7 +78,10 @@ namespace Avalonia.Media
{
var factory = AvaloniaLocator.Current.GetRequiredService<IPlatformRenderInterface>();
return factory.CreateGeometryGroup(FillRule, _children);
var children = new IGeometryImpl?[_children.Count];
for (var c = 0; c < _children.Count; c++)
children[c] = _children[c].PlatformImpl;
return factory.CreateGeometryGroup(FillRule, children!);
}
return null;

4
src/Avalonia.Base/Platform/IPlatformRenderInterface.cs

@ -48,7 +48,7 @@ namespace Avalonia.Platform
/// <param name="fillRule">The fill rule.</param>
/// <param name="children">The geometries to group.</param>
/// <returns>A combined geometry.</returns>
IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children);
IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> children);
/// <summary>
/// Creates a geometry group implementation.
@ -57,7 +57,7 @@ namespace Avalonia.Platform
/// <param name="g1">The first geometry.</param>
/// <param name="g2">The second geometry.</param>
/// <returns>A combined geometry.</returns>
IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2);
IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2);
/// <summary>
/// Created a geometry implementation for the glyph run.

4
src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs

@ -47,8 +47,8 @@ namespace Avalonia.Headless
}
public IStreamGeometryImpl CreateStreamGeometry() => new HeadlessStreamingGeometryStub();
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children) => throw new NotImplementedException();
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2) => throw new NotImplementedException();
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> children) => throw new NotImplementedException();
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2) => throw new NotImplementedException();
public IRenderTarget CreateRenderTarget(IEnumerable<object> surfaces) => new HeadlessRenderTarget();
public bool IsLost => false;

7
src/Skia/Avalonia.Skia/CombinedGeometryImpl.cs

@ -1,4 +1,5 @@
using Avalonia.Media;
using Avalonia.Platform;
using SkiaSharp;
namespace Avalonia.Skia
@ -15,10 +16,10 @@ namespace Avalonia.Skia
Bounds = (stroke ?? fill)?.TightBounds.ToAvaloniaRect() ?? default;
}
public static CombinedGeometryImpl ForceCreate(GeometryCombineMode combineMode, Geometry g1, Geometry g2)
public static CombinedGeometryImpl ForceCreate(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2)
{
if (g1.PlatformImpl is GeometryImpl i1
&& g2.PlatformImpl is GeometryImpl i2
if (g1 is GeometryImpl i1
&& g2 is GeometryImpl i2
&& TryCreate(combineMode, i1, i2) is { } result)
return result;

7
src/Skia/Avalonia.Skia/GeometryGroupImpl.cs

@ -1,5 +1,6 @@
using System.Collections.Generic;
using Avalonia.Media;
using Avalonia.Platform;
using SkiaSharp;
namespace Avalonia.Skia
@ -9,7 +10,7 @@ namespace Avalonia.Skia
/// </summary>
internal class GeometryGroupImpl : GeometryImpl
{
public GeometryGroupImpl(FillRule fillRule, IReadOnlyList<Geometry> children)
public GeometryGroupImpl(FillRule fillRule, IReadOnlyList<IGeometryImpl> children)
{
var fillType = fillRule == FillRule.NonZero ? SKPathFillType.Winding : SKPathFillType.EvenOdd;
var count = children.Count;
@ -22,7 +23,7 @@ namespace Avalonia.Skia
bool requiresFillPass = false;
for (var i = 0; i < count; ++i)
{
if (children[i].PlatformImpl is GeometryImpl geo)
if (children[i] is GeometryImpl geo)
{
if (geo.StrokePath != null)
stroke.AddPath(geo.StrokePath);
@ -42,7 +43,7 @@ namespace Avalonia.Skia
for (var i = 0; i < count; ++i)
{
if (children[i].PlatformImpl is GeometryImpl { FillPath: { } fillPath })
if (children[i] is GeometryImpl { FillPath: { } fillPath })
fill.AddPath(fillPath);
}

4
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@ -58,12 +58,12 @@ namespace Avalonia.Skia
return new StreamGeometryImpl();
}
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children)
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> children)
{
return new GeometryGroupImpl(fillRule, children);
}
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2)
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2)
{
return CombinedGeometryImpl.ForceCreate(combineMode, g1, g2);
}

4
src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

@ -158,8 +158,8 @@ namespace Avalonia.Direct2D1
public IGeometryImpl CreateLineGeometry(Point p1, Point p2) => new LineGeometryImpl(p1, p2);
public IGeometryImpl CreateRectangleGeometry(Rect rect) => new RectangleGeometryImpl(rect);
public IStreamGeometryImpl CreateStreamGeometry() => new StreamGeometryImpl();
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children) => new GeometryGroupImpl(fillRule, children);
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2) => new CombinedGeometryImpl(combineMode, g1, g2);
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> 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<GlyphInfo> glyphInfos, Point baselineOrigin)

13
src/Windows/Avalonia.Direct2D1/Media/CombinedGeometryImpl.cs

@ -1,3 +1,4 @@
using Avalonia.Platform;
using SharpDX.Direct2D1;
using AM = Avalonia.Media;
@ -13,19 +14,19 @@ namespace Avalonia.Direct2D1.Media
/// </summary>
public CombinedGeometryImpl(
AM.GeometryCombineMode combineMode,
AM.Geometry geometry1,
AM.Geometry geometry2)
IGeometryImpl geometry1,
IGeometryImpl geometry2)
: base(CreateGeometry(combineMode, geometry1, geometry2))
{
}
private static Geometry CreateGeometry(
AM.GeometryCombineMode combineMode,
AM.Geometry geometry1,
AM.Geometry geometry2)
IGeometryImpl geometry1,
IGeometryImpl geometry2)
{
var g1 = ((GeometryImpl)geometry1.PlatformImpl).Geometry;
var g2 = ((GeometryImpl)geometry2.PlatformImpl).Geometry;
var g1 = ((GeometryImpl)geometry1).Geometry;
var g2 = ((GeometryImpl)geometry2).Geometry;
var dest = new PathGeometry(Direct2D1Platform.Direct2D1Factory);
using var sink = dest.Open();
g1.Combine(g2, (CombineMode)combineMode, sink);

7
src/Windows/Avalonia.Direct2D1/Media/GeometryGroupImpl.cs

@ -1,4 +1,5 @@
using System.Collections.Generic;
using Avalonia.Platform;
using SharpDX.Direct2D1;
using AM = Avalonia.Media;
@ -12,19 +13,19 @@ namespace Avalonia.Direct2D1.Media
/// <summary>
/// Initializes a new instance of the <see cref="StreamGeometryImpl"/> class.
/// </summary>
public GeometryGroupImpl(AM.FillRule fillRule, IReadOnlyList<AM.Geometry> geometry)
public GeometryGroupImpl(AM.FillRule fillRule, IReadOnlyList<IGeometryImpl> geometry)
: base(CreateGeometry(fillRule, geometry))
{
}
private static Geometry CreateGeometry(AM.FillRule fillRule, IReadOnlyList<AM.Geometry> children)
private static Geometry CreateGeometry(AM.FillRule fillRule, IReadOnlyList<IGeometryImpl> children)
{
var count = children.Count;
var c = new Geometry[count];
for (var i = 0; i < count; ++i)
{
c[i] = ((GeometryImpl)children[i].PlatformImpl).Geometry;
c[i] = ((GeometryImpl)children[i]).Geometry;
}
return new GeometryGroup(Direct2D1Platform.Direct2D1Factory, (FillMode)fillRule, c);

4
tests/Avalonia.Base.UnitTests/VisualTree/MockRenderInterface.cs

@ -30,12 +30,12 @@ namespace Avalonia.Base.UnitTests.VisualTree
return new MockStreamGeometry();
}
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children)
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> children)
{
throw new NotImplementedException();
}
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2)
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2)
{
throw new NotImplementedException();
}

4
tests/Avalonia.Benchmarks/NullRenderingPlatform.cs

@ -32,12 +32,12 @@ namespace Avalonia.Benchmarks
return new MockStreamGeometryImpl();
}
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children)
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> children)
{
throw new NotImplementedException();
}
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2)
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2)
{
throw new NotImplementedException();
}

4
tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs

@ -72,12 +72,12 @@ namespace Avalonia.UnitTests
return new MockStreamGeometryImpl();
}
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<Geometry> children)
public IGeometryImpl CreateGeometryGroup(FillRule fillRule, IReadOnlyList<IGeometryImpl> children)
{
return Mock.Of<IGeometryImpl>();
}
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2)
public IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, IGeometryImpl g1, IGeometryImpl g2)
{
return Mock.Of<IGeometryImpl>();
}

Loading…
Cancel
Save