Browse Source

calculate mirrorTransform before renderTransform

pull/8174/head
daniel mayost 4 years ago
parent
commit
62078d2cc3
  1. 16
      src/Avalonia.Base/Rendering/ImmediateRenderer.cs
  2. 16
      src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs
  3. 13
      src/Avalonia.Base/VisualExtensions.cs
  4. 3
      src/Avalonia.Controls/Viewbox.cs

16
src/Avalonia.Base/Rendering/ImmediateRenderer.cs

@ -277,18 +277,20 @@ namespace Avalonia.Rendering
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)
{
var origin = visual.RenderTransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height));
var offset = Matrix.CreateTranslation(origin);
renderTransform = (-offset) * visual.RenderTransform.Value * (offset);
}
if (visual.HasMirrorTransform)
{
var mirrorMatrix = new Matrix(-1.0, 0.0, 0.0, 1.0, visual.Bounds.Width, 0);
renderTransform *= mirrorMatrix;
var finalTransform = (-offset) * visual.RenderTransform.Value * (offset);
renderTransform *= finalTransform;
}
m = renderTransform * m;

16
src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs

@ -188,19 +188,21 @@ namespace Avalonia.Rendering.SceneGraph
var renderTransform = Matrix.Identity;
if (visual.RenderTransform != null)
{
var origin = visual.RenderTransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height));
var offset = Matrix.CreateTranslation(origin);
renderTransform = (-offset) * visual.RenderTransform.Value * (offset);
}
// 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)
{
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;
}
m = renderTransform * m;
using (contextImpl.BeginUpdate(node))

13
src/Avalonia.Base/VisualExtensions.cs

@ -101,6 +101,13 @@ namespace Avalonia
while (v != ancestor)
{
// this should be calculated BEFORE renderTransform
if (v.HasMirrorTransform)
{
var mirrorMatrix = new Matrix(-1.0, 0.0, 0.0, 1.0, v.Bounds.Width, 0);
result *= mirrorMatrix;
}
if (v.RenderTransform?.Value != null)
{
var origin = v.RenderTransformOrigin.ToPixels(v.Bounds.Size);
@ -110,12 +117,6 @@ namespace Avalonia
result *= renderTransform;
}
if (v.HasMirrorTransform)
{
var mirrorMatrix = new Matrix(-1.0, 0.0, 0.0, 1.0, v.Bounds.Width, 0);
result *= mirrorMatrix;
}
var topLeft = v.Bounds.TopLeft;
if (topLeft != default)

3
src/Avalonia.Controls/Viewbox.cs

@ -1,7 +1,6 @@
using Avalonia.Media;
using Avalonia.Media.Immutable;
using Avalonia.Metadata;
using Avalonia.Layout;
namespace Avalonia.Controls
{
@ -151,7 +150,7 @@ namespace Avalonia.Controls
/// <summary>
/// A simple container control which hosts its child as a visual but not logical child.
/// </summary>
private class ViewboxContainer : Layoutable
private class ViewboxContainer : Control
{
private IControl? _child;

Loading…
Cancel
Save