Parcourir la source

Make render tests pass again.

Steven Kirk il y a 9 ans
Parent
commit
560ed78e24

+ 36 - 3
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)));
             }
         }
     }

+ 29 - 28
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>

+ 1 - 1
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)

+ 1 - 1
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,

+ 0 - 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>

+ 0 - 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>