Browse Source

Make render tests pass again.

scenegraph-after-breakage
Steven Kirk 10 years ago
parent
commit
560ed78e24
  1. 39
      src/Avalonia.Visuals/Rendering/Renderer.cs
  2. 57
      src/Avalonia.Visuals/Rendering/RendererMixin.cs
  3. 2
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
  4. 2
      src/Windows/Avalonia.Direct2D1/Media/FormattedTextImpl.cs
  5. 3
      tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.v2.ncrunchproject
  6. 3
      tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.v2.ncrunchproject

39
src/Avalonia.Visuals/Rendering/Renderer.cs

@ -5,6 +5,7 @@ using System;
using Avalonia.Platform;
using Avalonia.VisualTree;
using System.Collections.Generic;
using Avalonia.Threading;
namespace Avalonia.Rendering
{
@ -14,6 +15,7 @@ namespace Avalonia.Rendering
private readonly IRenderRoot _root;
private IRenderTarget _renderTarget;
private bool _dirty;
private bool _renderQueued;
public Renderer(IRenderRoot root, IRenderLoop renderLoop)
{
@ -39,7 +41,7 @@ namespace Avalonia.Rendering
public IEnumerable<IVisual> HitTest(Point p, Func<IVisual, bool> filter)
{
throw new NotImplementedException();
return HitTest(_root, p, filter);
}
public void Render(Rect rect)
@ -63,14 +65,45 @@ namespace Avalonia.Rendering
finally
{
_dirty = false;
_renderQueued = false;
}
}
static IEnumerable<IVisual> HitTest(
IVisual visual,
Point p,
Func<IVisual, bool> filter)
{
Contract.Requires<ArgumentNullException>(visual != null);
if (filter?.Invoke(visual) != false)
{
bool containsPoint = BoundsTracker.GetTransformedBounds((Visual)visual)?.Contains(p) == true;
if ((containsPoint || !visual.ClipToBounds) && visual.VisualChildren.Count > 0)
{
foreach (var child in visual.VisualChildren.SortByZIndex())
{
foreach (var result in HitTest(child, p, filter))
{
yield return result;
}
}
}
if (containsPoint)
{
yield return visual;
}
}
}
private void OnRenderLoopTick(object sender, EventArgs e)
{
if (_dirty)
if (_dirty && !_renderQueued)
{
_root.Invalidate(new Rect(_root.ClientSize));
_renderQueued = true;
Dispatcher.UIThread.InvokeAsync(() => Render(new Rect(_root.ClientSize)));
}
}
}

57
src/Avalonia.Visuals/Rendering/RendererMixin.cs

@ -42,34 +42,35 @@ namespace Avalonia.Rendering
/// <param name="visual">The visual to render.</param>
public static void Render(this IRenderTarget renderTarget, IVisual visual)
{
////using (var ctx = renderTarget.CreateDrawingContext())
////{
//// ctx.Render(visual);
//// s_frameNum++;
//// if (DrawFpsCounter)
//// {
//// s_currentFrames++;
//// var now = s_stopwatch.Elapsed;
//// var elapsed = now - s_lastMeasure;
//// if (elapsed.TotalSeconds > 1)
//// {
//// s_fps = (int) (s_currentFrames/elapsed.TotalSeconds);
//// s_currentFrames = 0;
//// s_lastMeasure = now;
//// }
//// var pt = new Point(40, 40);
//// using (
//// var txt = new FormattedText("Frame #" + s_frameNum + " FPS: " + s_fps, "Arial", 18,
//// FontStyle.Normal,
//// TextAlignment.Left,
//// FontWeight.Normal,
//// TextWrapping.NoWrap))
//// {
//// ctx.FillRectangle(Brushes.White, new Rect(pt, txt.Measure()));
//// ctx.DrawText(Brushes.Black, pt, txt);
//// }
//// }
////}
using (var ctx = new DrawingContext(renderTarget.CreateDrawingContext()))
{
ctx.Render(visual);
s_frameNum++;
if (DrawFpsCounter)
{
s_currentFrames++;
var now = s_stopwatch.Elapsed;
var elapsed = now - s_lastMeasure;
if (elapsed.TotalSeconds > 1)
{
s_fps = (int)(s_currentFrames / elapsed.TotalSeconds);
s_currentFrames = 0;
s_lastMeasure = now;
}
var pt = new Point(40, 40);
var txt = new FormattedText(
"Frame #" + s_frameNum + " FPS: " + s_fps,
"Arial",
18,
Size.Infinity,
FontStyle.Normal,
TextAlignment.Left,
FontWeight.Normal,
TextWrapping.NoWrap);
ctx.FillRectangle(Brushes.White, new Rect(pt, txt.Measure()));
ctx.DrawText(Brushes.Black, pt, txt);
}
}
}
/// <summary>

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

@ -76,7 +76,7 @@ namespace Avalonia.Direct2D1
public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop)
{
return new DeferredRenderer(root, renderLoop);
return new Renderer(root, renderLoop);
}
public IRenderTarget CreateRenderTarget(IPlatformHandle handle)

2
src/Windows/Avalonia.Direct2D1/Media/FormattedTextImpl.cs

@ -28,7 +28,7 @@ namespace Avalonia.Direct2D1.Media
fontFamily,
fontSize,
(DWrite.FontStyle)fontStyle,
(DWrite.TextAlignment)textAlignment,
textAlignment.ToDirect2D(),
(DWrite.FontWeight)fontWeight,
wrapping == TextWrapping.Wrap ? DWrite.WordWrapping.Wrap : DWrite.WordWrapping.NoWrap,
(float)constraint.Width,

3
tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.v2.ncrunchproject

@ -23,8 +23,5 @@
<UseCPUArchitecture>AutoDetect</UseCPUArchitecture>
<MSTestThreadApartmentState>STA</MSTestThreadApartmentState>
<BuildProcessArchitecture>x86</BuildProcessArchitecture>
<IgnoredTests>
<AllTestsSelector />
</IgnoredTests>
<HiddenWarnings>AbnormalReferenceResolution</HiddenWarnings>
</ProjectConfiguration>

3
tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.v2.ncrunchproject

@ -23,7 +23,4 @@
<UseCPUArchitecture>AutoDetect</UseCPUArchitecture>
<MSTestThreadApartmentState>STA</MSTestThreadApartmentState>
<BuildProcessArchitecture>x86</BuildProcessArchitecture>
<IgnoredTests>
<AllTestsSelector />
</IgnoredTests>
</ProjectConfiguration>
Loading…
Cancel
Save