Browse Source

Fir TransformToVisual and use it in ImmediateRenderer

pull/2002/head
Andrey Kunchev 8 years ago
parent
commit
85c786e4e9
  1. 35
      src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
  2. 23
      src/Avalonia.Visuals/Visual.cs

35
src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs

@ -118,45 +118,12 @@ namespace Avalonia.Rendering
}
}
private static Matrix? TransformToVisual(IVisual visual, IVisual root)
{
var result = Matrix.Identity;
while (visual != root)
{
if (visual.RenderTransform?.Value != null)
{
var origin = visual.RenderTransformOrigin.ToPixels(visual.Bounds.Size);
var offset = Matrix.CreateTranslation(origin);
var renderTransform = (-offset) * visual.RenderTransform.Value * (offset);
result *= renderTransform;
}
var topLeft = visual.Bounds.TopLeft;
if (topLeft != default)
{
result *= Matrix.CreateTranslation(topLeft);
}
visual = visual.VisualParent;
if (visual == null)
{
return null;
}
}
return result;
}
/// <inheritdoc/>
public void AddDirty(IVisual visual)
{
if (visual.Bounds != Rect.Empty)
{
var m = TransformToVisual(visual, _root);
var m = visual.TransformToVisual(_root);
if (m.HasValue)
{

23
src/Avalonia.Visuals/Visual.cs

@ -304,7 +304,7 @@ namespace Avalonia
{
var thisOffset = GetOffsetFrom(common, this);
var thatOffset = GetOffsetFrom(common, visual);
return Matrix.CreateTranslation(-thatOffset) * Matrix.CreateTranslation(thisOffset);
return -thatOffset * thisOffset;
}
return null;
@ -454,13 +454,28 @@ namespace Avalonia
/// <param name="ancestor">The ancestor visual.</param>
/// <param name="visual">The visual.</param>
/// <returns>The visual offset.</returns>
private static Vector GetOffsetFrom(IVisual ancestor, IVisual visual)
private static Matrix GetOffsetFrom(IVisual ancestor, IVisual visual)
{
var result = new Vector();
var result = Matrix.Identity;
while (visual != ancestor)
{
result = new Vector(result.X + visual.Bounds.X, result.Y + visual.Bounds.Y);
if (visual.RenderTransform?.Value != null)
{
var origin = visual.RenderTransformOrigin.ToPixels(visual.Bounds.Size);
var offset = Matrix.CreateTranslation(origin);
var renderTransform = (-offset) * visual.RenderTransform.Value * (offset);
result *= renderTransform;
}
var topLeft = visual.Bounds.TopLeft;
if (topLeft != default)
{
result *= Matrix.CreateTranslation(topLeft);
}
visual = visual.VisualParent;
if (visual == null)

Loading…
Cancel
Save