From 713eee8245b19446082da3bbbfa1a6997465cad3 Mon Sep 17 00:00:00 2001 From: Nelson Carrillo Date: Mon, 23 Jul 2018 15:45:46 -0400 Subject: [PATCH] WIP --- .../Primitives/AdornerLayer.cs | 1 + .../Rendering/ImmediateRenderer.cs | 6 ++--- src/Avalonia.Windowing/Bindings/EventsLoop.cs | 14 +++++++++- src/Avalonia.Windowing/WIndowingPlatform.cs | 12 +++++++++ src/Avalonia.Windowing/WindowImpl.cs | 27 +++++++++++++------ src/Skia/Avalonia.Skia/GlRenderTarget.cs | 25 +++++++++-------- 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/AdornerLayer.cs b/src/Avalonia.Controls/Primitives/AdornerLayer.cs index 676cdc456a..51c22c88e7 100644 --- a/src/Avalonia.Controls/Primitives/AdornerLayer.cs +++ b/src/Avalonia.Controls/Primitives/AdornerLayer.cs @@ -21,6 +21,7 @@ namespace Avalonia.Controls.Primitives static AdornerLayer() { AdornedElementProperty.Changed.Subscribe(AdornedElementChanged); + IsHitTestVisibleProperty.OverrideDefaultValue(typeof(AdornerLayer), false); } public AdornerLayer() diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 2118b66de2..1527a2c6ba 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -59,7 +59,7 @@ namespace Avalonia.Rendering Render(context, _root, _root.Bounds); } - if (DrawDirtyRects) + if (false) { var color = (uint)new Random().Next(0xffffff) | 0x44000000; context.FillRectangle( @@ -67,7 +67,7 @@ namespace Avalonia.Rendering rect); } - if (DrawFps) + if (true) { RenderFps(context.PlatformImpl, _root.Bounds, null); } @@ -223,7 +223,7 @@ namespace Avalonia.Rendering var opacity = visual.Opacity; var clipToBounds = visual.ClipToBounds; var bounds = new Rect(visual.Bounds.Size); - + if (visual.IsVisible && opacity > 0) { var m = Matrix.CreateTranslation(visual.Bounds.Position); diff --git a/src/Avalonia.Windowing/Bindings/EventsLoop.cs b/src/Avalonia.Windowing/Bindings/EventsLoop.cs index 5ef8d97d3d..47141535f3 100644 --- a/src/Avalonia.Windowing/Bindings/EventsLoop.cs +++ b/src/Avalonia.Windowing/Bindings/EventsLoop.cs @@ -15,6 +15,12 @@ namespace Avalonia.Windowing.Bindings public LogicalPosition Position { get; set; } } + [StructLayout(LayoutKind.Sequential)] + public struct ResizeEvent + { + public LogicalSize Size { get; set; } + } + [StructLayout(LayoutKind.Sequential)] public struct LogicalPosition { @@ -30,6 +36,7 @@ namespace Avalonia.Windowing.Bindings } public delegate void MouseEventCallback(IntPtr windowId, MouseEvent mouseEvent); + public delegate void ResizeEventCallback(IntPtr windowId, ResizeEvent mouseEvent); public delegate void AwakenedEventCallback(); public class EventsLoop : IDisposable @@ -45,7 +52,8 @@ namespace Avalonia.Windowing.Bindings ( IntPtr handle, MouseEventCallback callback, - AwakenedEventCallback awakenedEventCallback + AwakenedEventCallback awakenedEventCallback, + ResizeEventCallback resizeEventCallback ); public IntPtr Handle { get; private set; } @@ -53,6 +61,7 @@ namespace Avalonia.Windowing.Bindings public event MouseEventCallback MouseEvent; public event AwakenedEventCallback Awakened; + public event ResizeEventCallback Resized; public EventsLoop() { @@ -72,6 +81,9 @@ namespace Avalonia.Windowing.Bindings () => { Awakened?.Invoke(); + }, + (windowId, ResizeEvent) => { + Resized?.Invoke(windowId, ResizeEvent); } ); } diff --git a/src/Avalonia.Windowing/WIndowingPlatform.cs b/src/Avalonia.Windowing/WIndowingPlatform.cs index f78414a1d4..fce6b148ea 100644 --- a/src/Avalonia.Windowing/WIndowingPlatform.cs +++ b/src/Avalonia.Windowing/WIndowingPlatform.cs @@ -47,9 +47,20 @@ namespace Avalonia.Windowing _eventsLoop = new EventsLoop(); _eventsLoop.MouseEvent += _eventsLoop_MouseEvent; _eventsLoop.Awakened += _eventsLoop_Awakened; + _eventsLoop.Resized += _eventsLoop_Resized; _windows = new Dictionary(); } + void _eventsLoop_Resized(IntPtr windowId, ResizeEvent resizeEvent) + { + Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); + if (_windows.ContainsKey(windowId)) + { + _windows[windowId].OnResizeEvent(resizeEvent); + } + } + + private void _eventsLoop_MouseEvent(IntPtr windowId, MouseEvent mouseEvent) { if (_windows.ContainsKey(windowId)) @@ -61,6 +72,7 @@ namespace Avalonia.Windowing private void _eventsLoop_Awakened() { Signaled?.Invoke(DispatcherPriority.Normal); + // Dispatcher.UIThread.RunJobs(); } diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index 2fa5ce979a..8af95fb7da 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -5,6 +5,7 @@ using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Platform; using Avalonia.Rendering; +using Avalonia.Threading; using Avalonia.Windowing.Bindings; namespace Avalonia.Windowing @@ -101,22 +102,26 @@ namespace Avalonia.Windowing public Point PointToClient(Point point) { - // point = point.WithY(ClientSize.Height - point.Y); - var (x, y) = _windowWrapper.GetPosition(); - return new Point(point.X + x, point.Y + y); + point = point.WithY(ClientSize.Height - point.Y); + var position = Position; + return new Point(point.X + position.X, point.Y + position.Y); } public Point PointToScreen(Point point) { - // point = point.WithY(ClientSize.Height - point.Y); - var (x, y) = _windowWrapper.GetPosition(); - return new Point(point.X - x, point.Y - y);; + point = point.WithY(ClientSize.Height - point.Y); + var position = Position; + return new Point(point.X - position.X, point.Y - position.Y);; } public void Resize(Size clientSize) { + if (clientSize == ClientSize) + return; + // This is where we size the window accordingly.. _windowWrapper.SetSize(clientSize.Width, clientSize.Height); + //Resized(clientSize); } public void SetCursor(IPlatformHandle cursor) @@ -163,8 +168,14 @@ namespace Avalonia.Windowing public void OnMouseEvent(MouseEvent evt) { - Input(new RawMouseEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, RawMouseEventType.Move, new Point(evt.Position.X, evt.Position.Y), InputModifiers.None)); - Paint?.Invoke(Rect.Empty); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Input); + Input(new RawMouseEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, RawMouseEventType.Move, new Point(evt.Position.X, evt.Position.Y), InputModifiers.None)); + } + + public void OnResizeEvent(ResizeEvent evt) + { + Resized?.Invoke(ClientSize); + Paint?.Invoke(new Rect(ClientSize)); } } } diff --git a/src/Skia/Avalonia.Skia/GlRenderTarget.cs b/src/Skia/Avalonia.Skia/GlRenderTarget.cs index 67015e9367..8a564ebedd 100644 --- a/src/Skia/Avalonia.Skia/GlRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/GlRenderTarget.cs @@ -26,16 +26,15 @@ namespace Avalonia.Skia SKSurface _surface; SKCanvas _canvas; + GRBackendRenderTargetDesc _desc; public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - // TODO: These are hard coded for now. Don't do that. - // TODO: Recreate the surface when the size changes. - // if (_surface == null) - { - var (width, height) = _context.GetFramebufferSize(); + var (width, height) = _context.GetFramebufferSize(); - _surface = SKSurface.Create(_grContext, new GRBackendRenderTargetDesc + if (_surface == null || (_desc.Width != (int)width * 2 || _desc.Height != (int)height * 2)) + { + _desc = new GRBackendRenderTargetDesc { Height = (int)height * 2, Width = (int)width * 2, @@ -44,15 +43,18 @@ namespace Avalonia.Skia Config = GRPixelConfig.Bgra8888, Origin = GRSurfaceOrigin.BottomLeft, RenderTargetHandle = IntPtr.Zero - }); + }; + _surface?.Dispose(); + _surface = SKSurface.Create(_grContext, _desc); _canvas = _surface.Canvas; } - // _canvas.RestoreToCount(-1); - // _canvas.ResetMatrix(); - _canvas.Scale(2); + _canvas.Clear(SKColors.Orange); + _canvas.RestoreToCount(-1); + _canvas.ResetMatrix(); + var createInfo = new DrawingContextImpl.CreateInfo { Canvas = _canvas, @@ -63,7 +65,6 @@ namespace Avalonia.Skia return new DrawingContextImpl(createInfo, Disposable.Create(() => { - _canvas.Flush(); _grContext.Flush(); _context.Present(); // Swap Buffers })); @@ -71,6 +72,8 @@ namespace Avalonia.Skia public void Dispose() { + _canvas.Dispose(); + _surface.Dispose(); _grContext.Dispose(); } }