A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

205 lines
6.4 KiB

using System;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Layout;
using Avalonia.Media;
using Xunit;
#if AVALONIA_SKIA
namespace Avalonia.Skia.RenderTests
#else
namespace Avalonia.Direct2D1.RenderTests.Controls
#endif
{
public class CustomRenderTests : TestBase
{
public CustomRenderTests()
: base(@"Controls\CustomRender")
{
}
[Fact]
public async Task Clip()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new CustomRenderer((control, context) =>
{
context.FillRectangle(
Brushes.Red,
new Rect(control.Bounds.Size),
4);
using (context.PushClip(new Rect(control.Bounds.Size).Deflate(10)))
{
context.FillRectangle(
Brushes.Blue,
new Rect(control.Bounds.Size),
4);
}
}),
};
await RenderToFile(target);
CompareImages();
}
[Fact]
public async Task GeometryClip()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new CustomRenderer((control, context) =>
{
var clip = new EllipseGeometry(new Rect(control.Bounds.Size));
context.FillRectangle(
Brushes.Red,
new Rect(control.Bounds.Size),
4);
using (context.PushGeometryClip(clip))
{
context.FillRectangle(
Brushes.Blue,
new Rect(control.Bounds.Size),
4);
}
}),
};
await RenderToFile(target);
CompareImages();
}
[Fact]
public async Task GeometryClip_With_Transform()
{
var target = new Border
{
Background = Brushes.White,
Width = 200,
Height = 200,
Child = new CustomRenderer((control, context) =>
{
using (var transform = context.PushPreTransform(Matrix.CreateTranslation(100, 100)))
using (var clip = context.PushClip(new Rect(0, 0, 100, 100)))
{
context.FillRectangle(Brushes.Blue, new Rect(0, 0, 200, 200));
}
context.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
}),
};
await RenderToFile(target);
CompareImages();
}
[Fact]
public async Task Clip_With_Transform()
{
var target = new Border
{
Background = Brushes.White,
Width = 200,
Height = 200,
Child = new CustomRenderer((control, context) =>
{
using (var transform = context.PushPreTransform(Matrix.CreateTranslation(100, 100)))
using (var clip = context.PushClip(new Rect(0, 0, 100, 100)))
{
context.FillRectangle(Brushes.Blue, new Rect(0, 0, 200, 200));
}
context.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
}),
};
await RenderToFile(target);
CompareImages();
}
[Fact]
public async Task Opacity()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new CustomRenderer((control, context) =>
{
context.FillRectangle(
Brushes.Red,
new Rect(control.Bounds.Size),
4);
using (context.PushOpacity(0.5))
{
context.FillRectangle(
Brushes.Blue,
new Rect(control.Bounds.Size).Deflate(10),
4);
}
}),
};
await RenderToFile(target);
CompareImages();
}
[Fact]
public async Task OpacityMask()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new CustomRenderer((control, context) =>
{
var mask = new LinearGradientBrush
{
StartPoint = new RelativePoint(0, 0, RelativeUnit.Relative),
EndPoint = new RelativePoint(1, 1, RelativeUnit.Relative),
GradientStops =
{
new GradientStop(Color.FromUInt32(0xffffffff), 0),
new GradientStop(Color.FromUInt32(0x00ffffff), 1)
},
};
context.FillRectangle(
Brushes.Red,
new Rect(control.Bounds.Size),
4);
using (context.PushOpacityMask(mask, new Rect(control.Bounds.Size)))
{
context.FillRectangle(
Brushes.Blue,
new Rect(control.Bounds.Size).Deflate(10),
4);
}
}),
};
await RenderToFile(target);
CompareImages();
}
class CustomRenderer : Control
{
private Action<CustomRenderer, DrawingContext> _render;
public CustomRenderer(Action<CustomRenderer, DrawingContext> render) => _render = render;
public override void Render(DrawingContext context) => _render(this, context);
}
}
}