diff --git a/packages/Avalonia/AvaloniaBuildTasks.targets b/packages/Avalonia/AvaloniaBuildTasks.targets
index 3ddd60e2af..10f971cc4c 100644
--- a/packages/Avalonia/AvaloniaBuildTasks.targets
+++ b/packages/Avalonia/AvaloniaBuildTasks.targets
@@ -36,4 +36,8 @@
Command="dotnet msbuild /nodereuse:false $(MSBuildProjectFile) /t:GenerateAvaloniaResources /p:_AvaloniaForceInternalMSBuild=true /p:Configuration=$(Configuration)"/>
+
+
+
+
diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
index 08f3803e9b..03ac004fd5 100644
--- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
+++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
@@ -266,7 +266,14 @@ namespace Avalonia.Rendering
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.PushPostTransform(m))
diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs
index 82294246b1..73e4a14539 100644
--- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs
+++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs
@@ -1,8 +1,11 @@
using System.Collections.Generic;
using Avalonia.Collections;
+using Avalonia.Controls;
+using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Rendering;
+using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Moq;
using Xunit;
@@ -94,5 +97,86 @@ namespace Avalonia.Visuals.UnitTests.Rendering
//then new position
Assert.Equal(new Rect(100, 100, 100, 100), invalidationCalls[2]);
}
+
+ [Fact]
+ public void Should_Render_Child_In_Parent_With_RenderTransform()
+ {
+ var targetMock = new Mock() { CallBase = true };
+ var target = targetMock.Object;
+ target.Width = 100;
+ target.Height = 50;
+ var child = new Panel()
+ {
+ RenderTransform = new RotateTransform() { Angle = 90 },
+ Children =
+ {
+ new Panel()
+ {
+ Children =
+ {
+ target
+ }
+ }
+ }
+ };
+
+ var visualTarget = targetMock.As();
+ int rendered = 0;
+ visualTarget.Setup(v => v.Render(It.IsAny())).Callback(() => rendered++);
+
+ var root = new TestRoot(child);
+ root.Renderer = new ImmediateRenderer(root);
+
+ root.LayoutManager.ExecuteInitialLayoutPass(root);
+
+ root.Measure(new Size(50, 100));
+ root.Arrange(new Rect(new Size(50, 100)));
+
+ root.Renderer.Paint(root.Bounds);
+
+ Assert.Equal(1, rendered);
+ }
+
+ [Fact]
+ public void Should_Render_Child_In_Parent_With_RenderTransform2()
+ {
+ var targetMock = new Mock() { CallBase = true };
+ var target = targetMock.Object;
+
+ target.Width = 100;
+ target.Height = 50;
+ target.HorizontalAlignment = HorizontalAlignment.Center;
+ target.VerticalAlignment = VerticalAlignment.Center;
+
+ var child = new Panel()
+ {
+ RenderTransform = new RotateTransform() { Angle = 90 },
+ Children =
+ {
+ new Panel()
+ {
+ Children =
+ {
+ target
+ }
+ }
+ }
+ };
+
+ var visualTarget = targetMock.As();
+ int rendered = 0;
+ visualTarget.Setup(v => v.Render(It.IsAny())).Callback(() => rendered++);
+
+ var root = new TestRoot(child);
+ root.Renderer = new ImmediateRenderer(root);
+
+ root.LayoutManager.ExecuteInitialLayoutPass(root);
+
+ root.Measure(new Size(300, 100));
+ root.Arrange(new Rect(new Size(300, 100)));
+ root.Renderer.Paint(root.Bounds);
+
+ Assert.Equal(1, rendered);
+ }
}
}