From d5febb11d58256299af856f35319021fac6c974a Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 6 Sep 2017 21:42:34 +0300 Subject: [PATCH 01/44] Apply FrameworkPathOverride automatically --- Avalonia.sln.DotSettings | 1 + build/NetFX.props | 6 ++++++ build/XUnit.props | 16 +++++++++------- .../Avalonia.DotNetFrameworkRuntime.csproj | 3 ++- 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 build/NetFX.props diff --git a/Avalonia.sln.DotSettings b/Avalonia.sln.DotSettings index 1fd6f8d092..d61208c358 100644 --- a/Avalonia.sln.DotSettings +++ b/Avalonia.sln.DotSettings @@ -1,4 +1,5 @@  + True ExplicitlyExcluded ExplicitlyExcluded ExplicitlyExcluded diff --git a/build/NetFX.props b/build/NetFX.props new file mode 100644 index 0000000000..93a37262fa --- /dev/null +++ b/build/NetFX.props @@ -0,0 +1,6 @@ + + + /usr/lib/mono/4.6.1-api + /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.6.1-api + + diff --git a/build/XUnit.props b/build/XUnit.props index 9d4d401743..42fe9b6d7a 100644 --- a/build/XUnit.props +++ b/build/XUnit.props @@ -1,13 +1,14 @@  - + - - - - - - + + + + + + + @@ -24,4 +25,5 @@ true + diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index 181f5e3a1e..27bd5e630b 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -18,4 +18,5 @@ - \ No newline at end of file + + From 951353de32f487666de6c8af111ecfe87c8ad5ad Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 8 Sep 2017 10:48:31 +0300 Subject: [PATCH 02/44] Use IsOsPlatform --- build/NetFX.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/NetFX.props b/build/NetFX.props index 93a37262fa..d8b2daf13a 100644 --- a/build/NetFX.props +++ b/build/NetFX.props @@ -1,6 +1,6 @@  /usr/lib/mono/4.6.1-api - /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.6.1-api + /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.6.1-api From 6252ef249e3b21a82c376d2bdf650efd7c1b1da0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 21 Sep 2017 23:30:00 +0300 Subject: [PATCH 03/44] Updated build documentation --- docs/guidelines/build.md | 61 +++++++--------------------------------- 1 file changed, 10 insertions(+), 51 deletions(-) diff --git a/docs/guidelines/build.md b/docs/guidelines/build.md index 0cf91d913a..828a4ddab3 100644 --- a/docs/guidelines/build.md +++ b/docs/guidelines/build.md @@ -2,7 +2,7 @@ ## Windows -Avalonia requires at least Visual Studio 2017 to build on Windows. +Avalonia requires at least Visual Studio 2017 and .NET Core SDK 2.0 to build on Windows. ### Install GTK Sharp @@ -22,69 +22,28 @@ git submodule update --init Open the `Avalonia.sln` solution in Visual Studio 2015 or newer. The free Visual Studio Community edition works fine. Run the `Samples\ControlCatalog.Desktop` project to see the sample application. -## Linux +## Linux/OSX -### Install the latest version of Mono +It's *not* possible to build the *whole* project on Linux/OSX. You can only build the subset targeting .NET Standard and .NET Core (which is, however, sufficient to get UI working on Linux/OSX). If you want to something that involves changing platform-specific APIs you'll need a Windows machine. -To build Avalonia under Linux, you need to have a recent version of Mono installed. Mono is a cross- -platform, open source .Net platform. There is a very good chance that the version of Mono that came -with your Linux distribution is too old, so you want to install a more up-to-date version. The most -convenient way to to this is through your package manager. The Mono project has great [installation -instructions for many popular Linux distros](http://www.mono-project.com/docs/getting-started/install/linux). +MonoDevelop, Xamarin Studio and Visual Studio for Mac aren't capable of properly opening our solution. You can use Rider (at least 2017.2 EAP) or VSCode instead. They will fail to load most of platform specific projects, but you don't need them to run on .NET Core. -This will make the most up-to-date Mono release available through your package manager, and offer -you updates as they become available. +### Install the latest version of .NET Core -Once you have your package manager configured for the Mono repository, install the `mono-devel` -package, for example on ubuntu: - -``` -sudo apt-get install mono-devel -``` - -Once installed, check the version of mono to ensure it's at least 4.4.2: - -``` -mono --version -``` +Go to https://www.microsoft.com/net/core and follow instructions for your OS. You need SDK (not just "runtime") package. ### Clone the Avalonia repository ``` git clone https://github.com/AvaloniaUI/Avalonia.git -git submodule update --init -``` - -### Restore nuget packages - -``` -cd Avalonia -mkdir -p .nuget -wget -O .nuget/nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -mono .nuget/nuget.exe restore Avalonia.sln +git submodule update --init --recursive ``` ### Build and Run Avalonia -To build Avalonia in the `Debug` configuration: - -``` -xbuild /p:Platform=Mono /p:Configuration=Debug Avalonia.sln -``` - -You should now be able to run the ControlCatalog.Desktop sample: - ``` -mono ./samples/ControlCatalog.Desktop/bin/Debug/ControlCatalog.Desktop.exe +samples/ControlCatalog.NetCore +dotnet restore +dotnet run ``` -### Building Avalonia in MonoDevelop - -Flatpak version will *NOT* work. Version from https://github.com/cra0zy/monodevelop-run-installer/ might work if you are very lucky. Make sure that you have the latest version of Mono (from alpha update channel) and .NET Core SDK. Make sure to follow `FrameworkPathOverride` workaround from https://github.com/dotnet/sdk/issues/335 - -### Building and running Avalonia in Rider - -For Linux/OSX you'll probably need to apply workaround from https://github.com/dotnet/sdk/issues/335 - -Just add `export FrameworkPathOverride=/usr/lib/mono/4.6.1-api` (or `export FrameworkPathOverride=/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.6.1-api` for OSX) - From d4325bf0a4b59cff77539326a1deadd129105008 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 22 Sep 2017 19:26:03 +0300 Subject: [PATCH 04/44] Fixed #1152 --- src/Avalonia.Visuals/Media/LineGeometry.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Media/LineGeometry.cs b/src/Avalonia.Visuals/Media/LineGeometry.cs index 323bfa5a7e..0952d9644f 100644 --- a/src/Avalonia.Visuals/Media/LineGeometry.cs +++ b/src/Avalonia.Visuals/Media/LineGeometry.cs @@ -27,7 +27,7 @@ namespace Avalonia.Media /// public static readonly StyledProperty EndPointProperty = AvaloniaProperty.Register(nameof(EndPoint)); - private bool _isDirty; + private bool _isDirty = true; public Point EndPoint { From 846742f6211d264a83569435ec34ab07ad352118 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 22 Sep 2017 19:57:04 +0300 Subject: [PATCH 05/44] Generate geometry even for empty polylines --- src/Avalonia.Visuals/Media/PolylineGeometry.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Media/PolylineGeometry.cs b/src/Avalonia.Visuals/Media/PolylineGeometry.cs index 7c47e7d04d..b23bb88729 100644 --- a/src/Avalonia.Visuals/Media/PolylineGeometry.cs +++ b/src/Avalonia.Visuals/Media/PolylineGeometry.cs @@ -27,7 +27,7 @@ namespace Avalonia.Media AvaloniaProperty.Register(nameof(IsFilled)); private Points _points; - private bool _isDirty; + private bool _isDirty = true; private IDisposable _pointsObserver; static PolylineGeometry() From e25f949d9889b64748a7c5bf0055413bc0ef115a Mon Sep 17 00:00:00 2001 From: Jurjen Biewenga Date: Sat, 23 Sep 2017 14:22:04 +0300 Subject: [PATCH 06/44] Screen information API implementation --- samples/ControlCatalog/ControlCatalog.csproj | 3 +- samples/ControlCatalog/MainView.xaml.cs | 11 +++- samples/ControlCatalog/Pages/ScreenPage.cs | 62 ++++++++++++++++++ .../Platform/SkiaPlatform/PopupImpl.cs | 2 + src/Avalonia.Controls/Platform/IScreenImpl.cs | 9 +++ .../Platform/IWindowBaseImpl.cs | 5 ++ src/Avalonia.Controls/Platform/Screen.cs | 18 ++++++ src/Avalonia.Controls/Screens.cs | 54 ++++++++++++++++ src/Avalonia.Controls/Window.cs | 3 + src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj | 1 + src/Gtk/Avalonia.Gtk/ScreenImpl.cs | 42 ++++++++++++ src/Gtk/Avalonia.Gtk/WindowImpl.cs | 3 + src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj | 2 + src/Gtk/Avalonia.Gtk3/GtkScreen.cs | 24 +++++++ src/Gtk/Avalonia.Gtk3/Interop/GObject.cs | 25 +++++++- src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 32 +++++++++- src/Gtk/Avalonia.Gtk3/ScreenImpl.cs | 57 +++++++++++++++++ src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 2 + src/Gtk/Avalonia.Gtk3/WindowImpl.cs | 1 + src/OSX/Avalonia.MonoMac/Helpers.cs | 11 ++++ src/OSX/Avalonia.MonoMac/MacScreen.cs | 25 ++++++++ src/OSX/Avalonia.MonoMac/ScreenImpl.cs | 51 +++++++++++++++ src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs | 2 + .../Avalonia.Win32.Shared.projitems | 2 + .../Interop/UnmanagedMethods.cs | 17 +++++ src/Windows/Avalonia.Win32/ScreenImpl.cs | 64 +++++++++++++++++++ src/Windows/Avalonia.Win32/WinScreen.cs | 25 ++++++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 5 ++ 28 files changed, 554 insertions(+), 4 deletions(-) create mode 100644 samples/ControlCatalog/Pages/ScreenPage.cs create mode 100644 src/Avalonia.Controls/Platform/IScreenImpl.cs create mode 100644 src/Avalonia.Controls/Platform/Screen.cs create mode 100644 src/Avalonia.Controls/Screens.cs create mode 100644 src/Gtk/Avalonia.Gtk/ScreenImpl.cs create mode 100644 src/Gtk/Avalonia.Gtk3/GtkScreen.cs create mode 100644 src/Gtk/Avalonia.Gtk3/ScreenImpl.cs create mode 100644 src/OSX/Avalonia.MonoMac/MacScreen.cs create mode 100644 src/OSX/Avalonia.MonoMac/ScreenImpl.cs create mode 100644 src/Windows/Avalonia.Win32/ScreenImpl.cs create mode 100644 src/Windows/Avalonia.Win32/WinScreen.cs diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 76114c385b..340905a7f7 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -136,7 +136,7 @@ SliderPage.xaml - + TreeViewPage.xaml @@ -146,6 +146,7 @@ ToolTipPage.xaml + diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs index a3b8708c29..0be5d25a09 100644 --- a/samples/ControlCatalog/MainView.xaml.cs +++ b/samples/ControlCatalog/MainView.xaml.cs @@ -13,11 +13,20 @@ namespace ControlCatalog { this.InitializeComponent(); if (AvaloniaLocator.Current.GetService().GetRuntimeInfo().IsDesktop) - ((IList) this.FindControl("Sidebar").Items).Add(new TabItem() + { + IList tabItems = ((IList)this.FindControl("Sidebar").Items); + tabItems.Add(new TabItem() { Header = "Dialogs", Content = new DialogsPage() }); + tabItems.Add(new TabItem() + { + Header = "Screens", + Content = new ScreenPage() + }); + + } } private void InitializeComponent() diff --git a/samples/ControlCatalog/Pages/ScreenPage.cs b/samples/ControlCatalog/Pages/ScreenPage.cs new file mode 100644 index 0000000000..34aa85b8aa --- /dev/null +++ b/samples/ControlCatalog/Pages/ScreenPage.cs @@ -0,0 +1,62 @@ +using System; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Avalonia.Media; +using Avalonia.Platform; + +namespace ControlCatalog.Pages +{ + public class ScreenPage : UserControl + { + private double _leftMost; + + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + Window w = (Window)VisualRoot; + w.PositionChanged += (sender, args) => InvalidateVisual(); + } + + public override void Render(DrawingContext context) + { + base.Render(context); + Window w = (Window)VisualRoot; + Screen[] screens = w.Screens.All; + + Pen p = new Pen(Brushes.Black); + if (screens != null) + foreach (Screen screen in screens) + { + if (screen.Bounds.X / 10f < _leftMost) + { + _leftMost = screen.Bounds.X / 10f; + InvalidateVisual(); + return; + } + + Rect boundsRect = new Rect(screen.Bounds.X / 10f + Math.Abs(_leftMost), screen.Bounds.Y / 10f, screen.Bounds.Width / 10f, + screen.Bounds.Height / 10f); + Rect workingAreaRect = new Rect(screen.WorkingArea.X / 10f + Math.Abs(_leftMost), screen.WorkingArea.Y / 10f, screen.WorkingArea.Width / 10f, + screen.WorkingArea.Height / 10f); + context.DrawRectangle(p, boundsRect); + context.DrawRectangle(p, workingAreaRect); + + FormattedText text = new FormattedText(); + text.Text = $"Bounds: {screen.Bounds.Width}:{screen.Bounds.Height}"; + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height), text); + + text.Text = $"WorkArea: {screen.WorkingArea.Width}:{screen.WorkingArea.Height}"; + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 20), text); + + text.Text = $"Primary: {screen.Primary}"; + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 40), text); + + text.Text = $"Current: {screen.Equals(w.Screens.ScreenFromBounds(new Rect(w.Position, w.Bounds.Size)))}"; + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 60), text); + } + + context.DrawRectangle(p, new Rect(w.Position.X / 10f + Math.Abs(_leftMost), w.Position.Y / 10, w.Bounds.Width / 10, w.Bounds.Height / 10)); + } + } +} \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs index efbc71b808..0b683239fb 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs @@ -36,6 +36,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform _clientSize = value; UpdateParams(); } + + public IScreenImpl Screen { get; } public Point Position { diff --git a/src/Avalonia.Controls/Platform/IScreenImpl.cs b/src/Avalonia.Controls/Platform/IScreenImpl.cs new file mode 100644 index 0000000000..dafa1de473 --- /dev/null +++ b/src/Avalonia.Controls/Platform/IScreenImpl.cs @@ -0,0 +1,9 @@ +namespace Avalonia.Platform +{ + public interface IScreenImpl + { + int ScreenCount { get; } + + Screen[] AllScreens { get; } + } +} \ No newline at end of file diff --git a/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs b/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs index a5c7c60843..0a01cf3df4 100644 --- a/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs +++ b/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs @@ -65,5 +65,10 @@ namespace Avalonia.Platform /// Sets the client size of the toplevel. /// void Resize(Size clientSize); + + /// + /// Gets platform specific display information + /// + IScreenImpl Screen { get; } } } \ No newline at end of file diff --git a/src/Avalonia.Controls/Platform/Screen.cs b/src/Avalonia.Controls/Platform/Screen.cs new file mode 100644 index 0000000000..5aa8c2c392 --- /dev/null +++ b/src/Avalonia.Controls/Platform/Screen.cs @@ -0,0 +1,18 @@ +namespace Avalonia.Platform +{ + public class Screen + { + public Rect Bounds { get; } + + public Rect WorkingArea { get; } + + public bool Primary { get; } + + public Screen(Rect bounds, Rect workingArea, bool primary) + { + this.Bounds = bounds; + this.WorkingArea = workingArea; + this.Primary = primary; + } + } +} \ No newline at end of file diff --git a/src/Avalonia.Controls/Screens.cs b/src/Avalonia.Controls/Screens.cs new file mode 100644 index 0000000000..b8ddce3aea --- /dev/null +++ b/src/Avalonia.Controls/Screens.cs @@ -0,0 +1,54 @@ +using System.Linq; +using Avalonia.Platform; +using Avalonia.Utilities; +using Avalonia.VisualTree; + +namespace Avalonia.Controls +{ + public class Screens + { + private readonly IScreenImpl _iScreenImpl; + + public int ScreenCount => _iScreenImpl.ScreenCount; + public Screen[] All => _iScreenImpl?.AllScreens; + public Screen Primary => All.FirstOrDefault(x => x.Primary); + + public Screens(IScreenImpl iScreenImpl) + { + _iScreenImpl = iScreenImpl; + } + + public Screen ScreenFromBounds(Rect bounds){ + + Screen currMaxScreen = null; + double maxAreaSize = 0; + foreach (Screen screen in All) + { + double left = MathUtilities.Clamp(bounds.X, screen.Bounds.X, screen.Bounds.X + screen.Bounds.Width); + double top = MathUtilities.Clamp(bounds.Y, screen.Bounds.Y, screen.Bounds.Y + screen.Bounds.Height); + double right = MathUtilities.Clamp(bounds.X + bounds.Width, screen.Bounds.X, screen.Bounds.X + screen.Bounds.Width); + double bottom = MathUtilities.Clamp(bounds.Y + bounds.Height, screen.Bounds.Y, screen.Bounds.Y + screen.Bounds.Height); + double area = (right - left) * (bottom - top); + if (area > maxAreaSize) + { + maxAreaSize = area; + currMaxScreen = screen; + } + } + + return currMaxScreen; + } + + public Screen SceenFromPoint(Point point) + { + return All.FirstOrDefault(x=>x.Bounds.Contains(point)); + } + + public Screen ScreenFromVisual(IVisual visual) + { + Point tl = visual.PointToScreen(visual.Bounds.TopLeft); + Point br = visual.PointToScreen(visual.Bounds.BottomRight); + return ScreenFromBounds(new Rect(tl,br)); + } + } +} \ No newline at end of file diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 9c0245a714..64912f20df 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -119,6 +119,7 @@ namespace Avalonia.Controls : base(impl) { _maxPlatformClientSize = PlatformImpl?.MaxClientSize ?? default(Size); + Screens = new Screens(PlatformImpl?.Screen); } /// @@ -135,6 +136,8 @@ namespace Avalonia.Controls remove { _nameScope.Unregistered -= value; } } + public Screens Screens { get; private set; } + /// /// Gets the platform-specific window implementation. /// diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index 6049869424..1142b32dbf 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -48,6 +48,7 @@ + diff --git a/src/Gtk/Avalonia.Gtk/ScreenImpl.cs b/src/Gtk/Avalonia.Gtk/ScreenImpl.cs new file mode 100644 index 0000000000..a5082ca59a --- /dev/null +++ b/src/Gtk/Avalonia.Gtk/ScreenImpl.cs @@ -0,0 +1,42 @@ +using System; +using Avalonia.Controls; +using Avalonia.Platform; +using Avalonia.Utilities; +using Gdk; +using Screen = Avalonia.Platform.Screen; +using Window = Gtk.Window; + +namespace Avalonia.Gtk +{ + internal class ScreenImpl : IScreenImpl + { + private Window window; + + public int ScreenCount + { + get => window.Display.DefaultScreen.NMonitors; + } + public Screen[] AllScreens { + get + { + Screen[] screens = new Screen[ScreenCount]; + var screen = window.Display.DefaultScreen; + + for (short i = 0; i < screens.Length; i++) + { + Rectangle geometry = screen.GetMonitorGeometry(i); + Rect geometryRect = new Rect(geometry.X, geometry.Y, geometry.Width, geometry.Height); + Screen s = new Screen(geometryRect, geometryRect, false); + screens[i] = s; + } + + return screens; + } + } + + public ScreenImpl(Window window) + { + this.window = window; + } + } +} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/WindowImpl.cs b/src/Gtk/Avalonia.Gtk/WindowImpl.cs index 2c1826c509..ef8f5f95cb 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk/WindowImpl.cs @@ -1,5 +1,6 @@ using System; using System.Reactive.Disposables; +using Avalonia.Controls; using Avalonia.Platform; using Gdk; @@ -66,6 +67,8 @@ namespace Avalonia.Gtk } } + public IScreenImpl Screen => new ScreenImpl(Window); + public void Resize(Size value) { Window.Resize((int)value.Width, (int)value.Height); diff --git a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj index b58a83b3d2..59bd58916b 100644 --- a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj +++ b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj @@ -53,6 +53,8 @@ + + diff --git a/src/Gtk/Avalonia.Gtk3/GtkScreen.cs b/src/Gtk/Avalonia.Gtk3/GtkScreen.cs new file mode 100644 index 0000000000..7c28dd47b9 --- /dev/null +++ b/src/Gtk/Avalonia.Gtk3/GtkScreen.cs @@ -0,0 +1,24 @@ +using Avalonia.Platform; + +namespace Avalonia.Gtk3 +{ + public class GtkScreen : Screen + { + private readonly int _screenId; + + public GtkScreen(Rect bounds, Rect workingArea, bool primary, int screenId) : base(bounds, workingArea, primary) + { + this._screenId = screenId; + } + + public override int GetHashCode() + { + return _screenId; + } + + public override bool Equals(object obj) + { + return (obj is GtkScreen screen) ? this._screenId == screen._screenId : base.Equals(obj); + } + } +} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GObject.cs b/src/Gtk/Avalonia.Gtk3/Interop/GObject.cs index 9766e8ca36..8d14515d28 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/GObject.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/GObject.cs @@ -46,7 +46,30 @@ namespace Avalonia.Gtk3.Interop class GtkImContext : GObject { - + } + + class GdkScreen : GObject + { + public GdkScreen() : base(IntPtr.Zero, false) + { + } + + public GdkScreen(IntPtr handle, bool owned = true) : base(handle, owned) + { + this.handle = handle; + } + } + + class UnownedGdkScreen : GdkScreen + { + public UnownedGdkScreen() : base(IntPtr.Zero, false) + { + } + + public UnownedGdkScreen(IntPtr handle, bool owned = true) : base(IntPtr.Zero, false) + { + this.handle = handle; + } } class GtkDialog : GtkWindow diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index ffc1d380a3..35aef7b4e5 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -20,6 +20,27 @@ namespace Avalonia.Gtk3.Interop { public static class D { + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate gint16 gdk_display_get_n_screens(IntPtr display); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate UnownedGdkScreen gdk_display_get_screen(IntPtr display, gint16 num); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate UnownedGdkScreen gdk_display_get_default_screen (IntPtr display); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate gint16 gdk_screen_get_n_monitors(GdkScreen screen); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate gint16 gdk_screen_get_primary_monitor(GdkScreen screen); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_screen_get_monitor_geometry(GdkScreen screen, gint16 num, ref GdkRectangle rect); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_screen_get_monitor_workarea(GdkScreen screen, gint16 num, ref GdkRectangle rect); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] public delegate IntPtr gtk_application_new(Utf8Buffer appId, int flags); @@ -288,6 +309,9 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate bool signal_onevent(IntPtr gtkWidget, IntPtr ev, IntPtr userData); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void monitors_changed(IntPtr screen, IntPtr userData); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate bool signal_commit(IntPtr gtkWidget, IntPtr utf8string, IntPtr userData); @@ -298,7 +322,13 @@ namespace Avalonia.Gtk3.Interop public delegate void GtkClipboardTextReceivedFunc(IntPtr clipboard, IntPtr utf8string, IntPtr userdata); } - + public static D.gdk_display_get_n_screens GdkDisplayGetNScreens; + public static D.gdk_display_get_screen GdkDisplayGetScreen; + public static D.gdk_display_get_default_screen GdkDisplayGetDefaultScreen; + public static D.gdk_screen_get_n_monitors GdkScreenGetNMonitors; + public static D.gdk_screen_get_primary_monitor GdkScreenGetPrimaryMonitor; + public static D.gdk_screen_get_monitor_geometry GdkScreenGetMonitorGeometry; + public static D.gdk_screen_get_monitor_workarea GdkScreenGetMonitorWorkarea; public static D.gtk_window_set_decorated GtkWindowSetDecorated; public static D.gtk_window_set_skip_taskbar_hint GtkWindowSetSkipTaskbarHint; public static D.gtk_window_get_skip_taskbar_hint GtkWindowGetSkipTaskbarHint; diff --git a/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs b/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs new file mode 100644 index 0000000000..0f4fbd54bd --- /dev/null +++ b/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs @@ -0,0 +1,57 @@ +using System; +using Avalonia.Controls; +using Avalonia.Gtk3.Interop; +using Avalonia.Platform; +using Avalonia.Utilities; + +namespace Avalonia.Gtk3 +{ + internal class ScreenImpl : IScreenImpl + { + public int ScreenCount + { + get => _allScreens.Length; + } + + private Screen[] _allScreens; + public Screen[] AllScreens + { + get + { + if (_allScreens == null) + { + IntPtr display = Native.GdkGetDefaultDisplay(); + GdkScreen screen = Native.GdkDisplayGetDefaultScreen(display); + short primary = Native.GdkScreenGetPrimaryMonitor(screen); + Screen[] screens = new Screen[ScreenCount]; + for (short i = 0; i < screens.Length; i++) + { + GdkRectangle workArea = new GdkRectangle(), geometry = new GdkRectangle(); + Native.GdkScreenGetMonitorGeometry(screen, i, ref geometry); + Native.GdkScreenGetMonitorWorkarea(screen, i, ref workArea); + Rect workAreaRect = new Rect(workArea.X, workArea.Y, workArea.Width, workArea.Height); + Rect geometryRect = new Rect(geometry.X, geometry.Y, geometry.Width, geometry.Height); + GtkScreen s = new GtkScreen(geometryRect, workAreaRect, i == primary, i); + screens[i] = s; + } + + _allScreens = screens; + } + + return _allScreens; + } + } + + public ScreenImpl() + { + IntPtr display = Native.GdkGetDefaultDisplay(); + GdkScreen screen = Native.GdkDisplayGetDefaultScreen(display); + Signal.Connect(screen, "monitors-changed", MonitorsChanged); + } + + private unsafe void MonitorsChanged(IntPtr screen, IntPtr userData) + { + _allScreens = null; + } + } +} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 4464059efb..5725ee2596 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -341,6 +341,8 @@ namespace Avalonia.Gtk3 return; Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height); } + + public IScreenImpl Screen { get; } = new ScreenImpl(); public Point Position { diff --git a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs index e6935c4f20..a4bc45c0a1 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs @@ -1,4 +1,5 @@ using System; +using System.Linq.Expressions; using Avalonia.Controls; using Avalonia.Gtk3.Interop; using Avalonia.Platform; diff --git a/src/OSX/Avalonia.MonoMac/Helpers.cs b/src/OSX/Avalonia.MonoMac/Helpers.cs index b4e3f7e0b7..454b775cc0 100644 --- a/src/OSX/Avalonia.MonoMac/Helpers.cs +++ b/src/OSX/Avalonia.MonoMac/Helpers.cs @@ -1,6 +1,8 @@ using System; + using System.ComponentModel; using MonoMac.AppKit; using MonoMac.CoreGraphics; + using MonoMac.OpenGL; namespace Avalonia.MonoMac { @@ -27,5 +29,14 @@ namespace Avalonia.MonoMac return new CGPoint(pt.X, t - pt.Y); } + public static Rect ConvertRectY(this Rect rect) + { + return new Rect(rect.Position.WithY(rect.Y + rect.Height).ConvertPointY(), rect.Size); + } + + public static CGRect ConvertRectY(this CGRect rect) + { + return new CGRect(new CGPoint(rect.X, rect.Y + rect.Height).ConvertPointY(), rect.Size); + } } } diff --git a/src/OSX/Avalonia.MonoMac/MacScreen.cs b/src/OSX/Avalonia.MonoMac/MacScreen.cs new file mode 100644 index 0000000000..3d5ab0769f --- /dev/null +++ b/src/OSX/Avalonia.MonoMac/MacScreen.cs @@ -0,0 +1,25 @@ +using System; +using Avalonia.Platform; + +namespace Avalonia.MonoMac +{ + public class MacScreen : Screen + { + private readonly IntPtr handle; + + public MacScreen(Rect bounds, Rect workingArea, bool primary, IntPtr handle) : base(bounds, workingArea, primary) + { + this.handle = handle; + } + + public override int GetHashCode() + { + return (int)handle; + } + + public override bool Equals(object obj) + { + return (obj is MacScreen screen) ? this.handle == screen.handle : base.Equals(obj); + } + } +} \ No newline at end of file diff --git a/src/OSX/Avalonia.MonoMac/ScreenImpl.cs b/src/OSX/Avalonia.MonoMac/ScreenImpl.cs new file mode 100644 index 0000000000..bf8545a300 --- /dev/null +++ b/src/OSX/Avalonia.MonoMac/ScreenImpl.cs @@ -0,0 +1,51 @@ +using Avalonia.Controls; +using Avalonia.Platform; +using Avalonia.Utilities; +using MonoMac.AppKit; +using MonoMac.Foundation; + +namespace Avalonia.MonoMac +{ + public class ScreenImpl : IScreenImpl + { + private const string NSApplicationDidChangeScreenParametersNotification = "NSApplicationDidChangeScreenParametersNotification"; + + public int ScreenCount + { + get => NSScreen.Screens.Length; + } + + private Screen[] _allScreens; + public Screen[] AllScreens + { + get + { + if (_allScreens == null) + { + NSScreen[] screens = NSScreen.Screens; + Screen[] s = new Screen[screens.Length]; + NSScreen primary = NSScreen.MainScreen; + for (int i = 0; i < screens.Length; i++) + { + Rect bounds = screens[i].Frame.ToAvaloniaRect().ConvertRectY(); + Rect workArea = screens[i].VisibleFrame.ToAvaloniaRect().ConvertRectY(); + s[i] = new MacScreen(bounds, workArea, i == 0, screens[i].Handle); + } + + _allScreens = s; + } + return _allScreens; + } + } + + public ScreenImpl() + { + NSNotificationCenter.DefaultCenter.AddObserver(NSApplicationDidChangeScreenParametersNotification, MonitorsChanged); + } + + private void MonitorsChanged(NSNotification notification) + { + _allScreens = null; + } + } +} \ No newline at end of file diff --git a/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs b/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs index fdb2434698..71f008e074 100644 --- a/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs +++ b/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs @@ -153,6 +153,8 @@ namespace Avalonia.MonoMac Position = pos; } + public IScreenImpl Screen { get; } = new ScreenImpl(); + public override Point PointToClient(Point point) { var cocoaScreenPoint = point.ToMonoMacPoint().ConvertPointY(); diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.Shared.projitems b/src/Windows/Avalonia.Win32/Avalonia.Win32.Shared.projitems index 4599a0741e..6f13747cb6 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.Shared.projitems +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.Shared.projitems @@ -20,10 +20,12 @@ + + Properties\SharedAssemblyInfo.cs diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 4fed7a34f4..fb4aefbf36 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -616,6 +616,12 @@ namespace Avalonia.Win32.Interop public const int SizeOf_BITMAPINFOHEADER = 40; + [DllImport("user32.dll")] + public static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, + MonitorEnumDelegate lpfnEnum, IntPtr dwData); + + public delegate bool MonitorEnumDelegate(IntPtr hMonitor, IntPtr hdcMonitor, ref Rect lprcMonitor, IntPtr dwData); + [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr GetDC(IntPtr hWnd); @@ -903,6 +909,9 @@ namespace Avalonia.Win32.Interop [DllImport("user32.dll")] public static extern IntPtr MonitorFromPoint(POINT pt, MONITOR dwFlags); + [DllImport("user32.dll")] + public static extern IntPtr MonitorFromRect(RECT rect, MONITOR dwFlags); + [DllImport("user32.dll")] public static extern IntPtr MonitorFromWindow(IntPtr hwnd, MONITOR dwFlags); @@ -1021,6 +1030,14 @@ namespace Avalonia.Win32.Interop public int top; public int right; public int bottom; + + public RECT(Rect rect) + { + left = (int)rect.X; + top = (int)rect.Y; + right = (int)(rect.X + rect.Width); + bottom = (int)(rect.Y + rect.Height); + } } public struct TRACKMOUSEEVENT diff --git a/src/Windows/Avalonia.Win32/ScreenImpl.cs b/src/Windows/Avalonia.Win32/ScreenImpl.cs new file mode 100644 index 0000000000..4f4331e461 --- /dev/null +++ b/src/Windows/Avalonia.Win32/ScreenImpl.cs @@ -0,0 +1,64 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Linq; +using Avalonia.Controls; +using Avalonia.Platform; +using Avalonia.Utilities; +using static Avalonia.Win32.Interop.UnmanagedMethods; + +#if NETSTANDARD +using Win32Exception = Avalonia.Win32.NetStandard.AvaloniaWin32Exception; +#endif + +namespace Avalonia.Win32 +{ + public class ScreenImpl : IScreenImpl + { + public int ScreenCount + { + get => GetSystemMetrics(SystemMetric.SM_CMONITORS); + } + + private Screen[] _allScreens; + public Screen[] AllScreens + { + get + { + if (_allScreens == null) + { + int index = 0; + Screen[] screens = new Screen[ScreenCount]; + EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, + (IntPtr monitor, IntPtr hdcMonitor, ref Rect lprcMonitor, IntPtr data) => + { + MONITORINFO monitorInfo = new MONITORINFO(); + if (GetMonitorInfo(monitor, monitorInfo)) + { + RECT bounds = monitorInfo.rcMonitor; + RECT workingArea = monitorInfo.rcWork; + Rect avaloniaBounds = new Rect(bounds.left, bounds.top, bounds.right - bounds.left, + bounds.bottom - bounds.top); + Rect avaloniaWorkArea = + new Rect(workingArea.left, workingArea.top, workingArea.right - bounds.left, + workingArea.bottom - bounds.top); + screens[index] = + new WinScreen(avaloniaBounds, avaloniaWorkArea, monitorInfo.dwFlags == 1, + monitor); + index++; + } + return true; + }, IntPtr.Zero); + _allScreens = screens; + } + return _allScreens; + } + } + + public void InvalidateScreensCache() + { + _allScreens = null; + } + } +} diff --git a/src/Windows/Avalonia.Win32/WinScreen.cs b/src/Windows/Avalonia.Win32/WinScreen.cs new file mode 100644 index 0000000000..2f8dcb0f3e --- /dev/null +++ b/src/Windows/Avalonia.Win32/WinScreen.cs @@ -0,0 +1,25 @@ +using System; +using Avalonia.Platform; + +namespace Avalonia.Win32 +{ + public class WinScreen : Screen + { + private readonly IntPtr _hMonitor; + + public WinScreen(Rect bounds, Rect workingArea, bool primary, IntPtr hMonitor) : base(bounds, workingArea, primary) + { + this._hMonitor = hMonitor; + } + + public override int GetHashCode() + { + return (int)_hMonitor; + } + + public override bool Equals(object obj) + { + return (obj is WinScreen screen) ? this._hMonitor == screen._hMonitor : base.Equals(obj); + } + } +} \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 9c13a6d9b8..dab7f0ba04 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -103,6 +103,7 @@ namespace Avalonia.Win32 } } + public IScreenImpl Screen => new ScreenImpl(); public IRenderer CreateRenderer(IRenderRoot root) { @@ -598,6 +599,10 @@ namespace Avalonia.Win32 case UnmanagedMethods.WindowsMessage.WM_MOVE: PositionChanged?.Invoke(new Point((short)(ToInt32(lParam) & 0xffff), (short)(ToInt32(lParam) >> 16))); return IntPtr.Zero; + + case UnmanagedMethods.WindowsMessage.WM_DISPLAYCHANGE: + (Screen as ScreenImpl)?.InvalidateScreensCache(); + return IntPtr.Zero; } #if USE_MANAGED_DRAG From f0aedf81e08400fbe8b28c1331295279d06865af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:48:48 +0200 Subject: [PATCH 07/44] Remove duplicate tool --- build.cake | 1 - 1 file changed, 1 deletion(-) diff --git a/build.cake b/build.cake index b7b349b12b..0d4886c87d 100644 --- a/build.cake +++ b/build.cake @@ -4,7 +4,6 @@ #addin "nuget:?package=Polly&version=4.2.0" #addin "nuget:?package=NuGet.Core&version=2.12.0" -#tool "nuget:?package=xunit.runner.console&version=2.2.0" #tool "nuget:https://dotnet.myget.org/F/nuget-build/?package=NuGet.CommandLine&version=4.3.0-preview1-3980&prerelease" #tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2017.1.20170613.162720" /////////////////////////////////////////////////////////////////////////////// From 30abcff6c29066b07568e894d1039942eb11db96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:49:30 +0200 Subject: [PATCH 08/44] Use same version of XUnit as build props --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 0d4886c87d..5b617b43bb 100644 --- a/build.cake +++ b/build.cake @@ -10,7 +10,7 @@ // TOOLS /////////////////////////////////////////////////////////////////////////////// -#tool "nuget:?package=xunit.runner.console&version=2.2.0" +#tool "nuget:?package=xunit.runner.console&version=2.3.0-beta5-build3769" /////////////////////////////////////////////////////////////////////////////// // USINGS From 8291f5d69132d08b240e842dd5a01438cc570851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:50:06 +0200 Subject: [PATCH 09/44] Use latest stable version of NuGet command-line --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 5b617b43bb..ce436f68bf 100644 --- a/build.cake +++ b/build.cake @@ -4,7 +4,7 @@ #addin "nuget:?package=Polly&version=4.2.0" #addin "nuget:?package=NuGet.Core&version=2.12.0" -#tool "nuget:https://dotnet.myget.org/F/nuget-build/?package=NuGet.CommandLine&version=4.3.0-preview1-3980&prerelease" +#tool "nuget:?package=NuGet.CommandLine&version=4.3.0" #tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2017.1.20170613.162720" /////////////////////////////////////////////////////////////////////////////// // TOOLS From e685b4ac8d9c65f8c2b0937036a2c028751d9484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:50:57 +0200 Subject: [PATCH 10/44] Update cake addins --- build.cake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cake b/build.cake index ce436f68bf..2818879021 100644 --- a/build.cake +++ b/build.cake @@ -2,8 +2,8 @@ // ADDINS /////////////////////////////////////////////////////////////////////////////// -#addin "nuget:?package=Polly&version=4.2.0" -#addin "nuget:?package=NuGet.Core&version=2.12.0" +#addin "nuget:?package=Polly&version=5.3.1" +#addin "nuget:?package=NuGet.Core&version=2.14.0" #tool "nuget:?package=NuGet.CommandLine&version=4.3.0" #tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2017.1.20170613.162720" /////////////////////////////////////////////////////////////////////////////// From a63be30b5e735810e9c092e4d5ed2a8e9b86439b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:51:49 +0200 Subject: [PATCH 11/44] Cache correct version --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ca548b6b0a..cef8c4a2cc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -37,4 +37,4 @@ artifacts: - path: artifacts\inspectcode.xml cache: - gtk-sharp-2.12.26.msi - - dotnet-1.0.1.exe + - dotnet-2.0.0.exe From da696737b1992f20d1ad152047f4d98055604989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:54:22 +0200 Subject: [PATCH 12/44] Resolve xunit.console tool path --- build.cake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cake b/build.cake index 2818879021..4839947a94 100644 --- a/build.cake +++ b/build.cake @@ -212,8 +212,8 @@ Task("Run-Unit-Tests") .ToList(); var toolPath = (parameters.IsPlatformAnyCPU || parameters.IsPlatformX86) ? - "./tools/xunit.runner.console/tools/xunit.console.x86.exe" : - "./tools/xunit.runner.console/tools/xunit.console.exe"; + Context.Tools.Resolve("xunit.console.x86.exe") : + Context.Tools.Resolve("xunit.console.exe"); var xUnitSettings = new XUnit2Settings { From 76643b5a6123cf43bfdc663528bb4c933d1d31f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 15:56:29 +0200 Subject: [PATCH 13/44] Use resolve for xunit tool path --- build.cake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 4839947a94..64047f8a25 100644 --- a/build.cake +++ b/build.cake @@ -352,10 +352,12 @@ Task("Run-Leak-Tests") var report = "tests\\Avalonia.LeakTests\\bin\\Release\\report.xml"; if(System.IO.File.Exists(report)) System.IO.File.Delete(report); + + var tool = Context.Tools.Resolve("xunit.console.x86.exe").FullPath; var proc = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName="tests\\Avalonia.LeakTests\\toolproject\\bin\\dotMemoryUnit.exe", - Arguments="-targetExecutable=\"tools\\xunit.runner.console\\tools\\xunit.console.x86.exe\" -returnTargetExitCode -- tests\\Avalonia.LeakTests\\bin\\Release\\Avalonia.LeakTests.dll -xml tests\\Avalonia.LeakTests\\bin\\Release\\report.xml ", + Arguments="-targetExecutable=\"" + tool + "\" -returnTargetExitCode -- tests\\Avalonia.LeakTests\\bin\\Release\\Avalonia.LeakTests.dll -xml tests\\Avalonia.LeakTests\\bin\\Release\\report.xml ", UseShellExecute = false, }); var st = System.Diagnostics.Stopwatch.StartNew(); From 137768c9e0d14a5c3445c7758f50ae612a1ab8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 16:01:27 +0200 Subject: [PATCH 14/44] Use resolve for inspectcode tool path --- build.cake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.cake b/build.cake index 64047f8a25..fde6d695f9 100644 --- a/build.cake +++ b/build.cake @@ -393,8 +393,7 @@ Task("Inspect") "src\\markup\\avalonia.markup.xaml\\portablexaml\\portable.xaml.github"}; Information("Running code inspections"); - - StartProcess("tools\\JetBrains.ReSharper.CommandLineTools\\tools\\inspectcode.exe", + StartProcess(Context.Tools.Resolve("inspectcode.exe"), new ProcessSettings{ Arguments = "--output=artifacts\\inspectcode.xml --profile=Avalonia.sln.DotSettings Avalonia.sln" }); Information("Analyzing report"); var doc = XDocument.Parse(System.IO.File.ReadAllText("artifacts\\inspectcode.xml")); From c9a5247d3f19cd4e0a3627b24a62eda614efccaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 16:01:37 +0200 Subject: [PATCH 15/44] Rename local variable --- build.cake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cake b/build.cake index fde6d695f9..eb5918832e 100644 --- a/build.cake +++ b/build.cake @@ -353,11 +353,11 @@ Task("Run-Leak-Tests") if(System.IO.File.Exists(report)) System.IO.File.Delete(report); - var tool = Context.Tools.Resolve("xunit.console.x86.exe").FullPath; + var toolXunitConsoleX86 = Context.Tools.Resolve("xunit.console.x86.exe").FullPath; var proc = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName="tests\\Avalonia.LeakTests\\toolproject\\bin\\dotMemoryUnit.exe", - Arguments="-targetExecutable=\"" + tool + "\" -returnTargetExitCode -- tests\\Avalonia.LeakTests\\bin\\Release\\Avalonia.LeakTests.dll -xml tests\\Avalonia.LeakTests\\bin\\Release\\report.xml ", + Arguments="-targetExecutable=\"" + toolXunitConsoleX86 + "\" -returnTargetExitCode -- tests\\Avalonia.LeakTests\\bin\\Release\\Avalonia.LeakTests.dll -xml tests\\Avalonia.LeakTests\\bin\\Release\\report.xml ", UseShellExecute = false, }); var st = System.Diagnostics.Stopwatch.StartNew(); From daaf2fdd79e25a3aeafe95eed88f2a9b7157a85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 25 Sep 2017 16:27:59 +0200 Subject: [PATCH 16/44] Use latest cake version --- tools/packages.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/packages.config b/tools/packages.config index 5657d953fc..e0dd39bd2b 100644 --- a/tools/packages.config +++ b/tools/packages.config @@ -1,4 +1,4 @@ - + From b44fde96137edf352e96239dcad1955ba8b889eb Mon Sep 17 00:00:00 2001 From: Jurjen Biewenga Date: Mon, 25 Sep 2017 21:10:34 +0200 Subject: [PATCH 17/44] Fixed bug that created new instance of ScreenImpl every time it was accessed through WindowBaseImpl --- src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 5 ++++- src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs | 5 ++++- src/Windows/Avalonia.Win32/WindowImpl.cs | 6 +++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 5725ee2596..225aa2a795 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -342,7 +342,10 @@ namespace Avalonia.Gtk3 Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height); } - public IScreenImpl Screen { get; } = new ScreenImpl(); + public IScreenImpl Screen + { + get; + } = new ScreenImpl(); public Point Position { diff --git a/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs b/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs index 71f008e074..9ce1756aae 100644 --- a/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs +++ b/src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs @@ -153,7 +153,10 @@ namespace Avalonia.MonoMac Position = pos; } - public IScreenImpl Screen { get; } = new ScreenImpl(); + public IScreenImpl Screen + { + get; + } = new ScreenImpl(); public override Point PointToClient(Point point) { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index dab7f0ba04..4c28d44b93 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -103,7 +103,11 @@ namespace Avalonia.Win32 } } - public IScreenImpl Screen => new ScreenImpl(); + public IScreenImpl Screen + { + get; + } = new ScreenImpl(); + public IRenderer CreateRenderer(IRenderRoot root) { From ead7b3bea35dee7a5d9f79d40265f6dc5285bf3b Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 26 Sep 2017 21:05:47 +0300 Subject: [PATCH 18/44] [SKIA] Fixed text opacity issue with layers in deferred rendeing mode --- src/Skia/Avalonia.Skia/BitmapImpl.cs | 2 +- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 4 ++-- src/Skia/Avalonia.Skia/FormattedTextImpl.cs | 13 ++++++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Skia/Avalonia.Skia/BitmapImpl.cs b/src/Skia/Avalonia.Skia/BitmapImpl.cs index 9f807b8c1d..ce3efded11 100644 --- a/src/Skia/Avalonia.Skia/BitmapImpl.cs +++ b/src/Skia/Avalonia.Skia/BitmapImpl.cs @@ -48,7 +48,7 @@ namespace Avalonia.Skia public BitmapDrawingContext(SKBitmap bitmap, Vector dpi, IVisualBrushRenderer visualBrushRenderer) : this(CreateSurface(bitmap), dpi, visualBrushRenderer) { - + CanUseLcdRendering = false; } private static SKSurface CreateSurface(SKBitmap bitmap) diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 7a83835b10..4feb910deb 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -16,7 +16,7 @@ namespace Avalonia.Skia private readonly IDisposable[] _disposables; private readonly IVisualBrushRenderer _visualBrushRenderer; private Stack maskStack = new Stack(); - + protected bool CanUseLcdRendering = true; public SKCanvas Canvas { get; private set; } public DrawingContextImpl( @@ -345,7 +345,7 @@ namespace Avalonia.Skia using (var paint = CreatePaint(foreground, text.Size)) { var textImpl = (FormattedTextImpl)text; - textImpl.Draw(this, Canvas, origin.ToSKPoint(), paint); + textImpl.Draw(this, Canvas, origin.ToSKPoint(), paint, CanUseLcdRendering); } } diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs index c73e1dbcbe..5da1469ab8 100644 --- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs +++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs @@ -171,8 +171,10 @@ namespace Avalonia.Skia } internal void Draw(DrawingContextImpl context, - SKCanvas canvas, SKPoint origin, - DrawingContextImpl.PaintWrapper foreground) + SKCanvas canvas, + SKPoint origin, + DrawingContextImpl.PaintWrapper foreground, + bool canUseLcdRendering) { /* TODO: This originated from Native code, it might be useful for debugging character positions as * we improve the FormattedText support. Will need to port this to C# obviously. Rmove when @@ -206,7 +208,7 @@ namespace Avalonia.Skia SKPaint currentPaint = null; try { - ApplyWrapperTo(ref currentPaint, foreground, ref currd, paint); + ApplyWrapperTo(ref currentPaint, foreground, ref currd, paint, canUseLcdRendering); bool hasCusomFGBrushes = _foregroundBrushes.Any(); for (int c = 0; c < _skiaLines.Count; c++) @@ -243,7 +245,7 @@ namespace Avalonia.Skia subStr = Text.Substring(i, len); - ApplyWrapperTo(ref currentPaint, currentWrapper, ref currd, paint); + ApplyWrapperTo(ref currentPaint, currentWrapper, ref currd, paint, canUseLcdRendering); canvas.DrawText(subStr, currX, origin.Y + line.Top + _lineOffset, paint); @@ -277,12 +279,13 @@ namespace Avalonia.Skia private List _skiaLines; private static void ApplyWrapperTo(ref SKPaint current, DrawingContextImpl.PaintWrapper wrapper, - ref IDisposable curr, SKPaint paint) + ref IDisposable curr, SKPaint paint, bool canUseLcdRendering) { if (current == wrapper.Paint) return; curr?.Dispose(); curr = wrapper.ApplyTo(paint); + paint.LcdRenderText = canUseLcdRendering && paint.Color.Alpha == 255; } private static bool IsBreakChar(char c) From c3e36e93393375fec26a80aed047d701f6cc721f Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 26 Sep 2017 21:23:31 +0300 Subject: [PATCH 19/44] [SKIA] There is no need to disable LcdRenderText for regular opacity, it's needed only for RTB and layers --- src/Skia/Avalonia.Skia/FormattedTextImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs index 5da1469ab8..f727d033cc 100644 --- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs +++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs @@ -285,7 +285,7 @@ namespace Avalonia.Skia return; curr?.Dispose(); curr = wrapper.ApplyTo(paint); - paint.LcdRenderText = canUseLcdRendering && paint.Color.Alpha == 255; + paint.LcdRenderText = canUseLcdRendering; } private static bool IsBreakChar(char c) From 8659bddce80321bcb7b2e1059de406b0d0f7e205 Mon Sep 17 00:00:00 2001 From: Jurjen Biewenga Date: Tue, 26 Sep 2017 22:54:07 +0200 Subject: [PATCH 20/44] Implemented path markup for Q S and T --- .../Media/PathMarkupParser.cs | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Media/PathMarkupParser.cs b/src/Avalonia.Visuals/Media/PathMarkupParser.cs index 145013d76b..9aedf314ce 100644 --- a/src/Avalonia.Visuals/Media/PathMarkupParser.cs +++ b/src/Avalonia.Visuals/Media/PathMarkupParser.cs @@ -21,7 +21,10 @@ namespace Avalonia.Media { 'L', Command.Line }, { 'H', Command.HorizontalLine }, { 'V', Command.VerticalLine }, + { 'Q', Command.QuadraticBezierCurve }, + { 'T', Command.SmoothQuadraticBezierCurve }, { 'C', Command.CubicBezierCurve }, + { 'S', Command.SmoothCubicBezierCurve }, { 'A', Command.Arc }, { 'Z', Command.Close }, }; @@ -55,6 +58,9 @@ namespace Avalonia.Media HorizontalLine, VerticalLine, CubicBezierCurve, + QuadraticBezierCurve, + SmoothCubicBezierCurve, + SmoothQuadraticBezierCurve, Arc, Close, } @@ -71,7 +77,8 @@ namespace Avalonia.Media { Command command = Command.None; Point point = new Point(); - bool relative = false; + bool relative = false; + Point? previousControlPoint = null; while (ReadCommand(reader, ref command, ref relative)) { @@ -79,6 +86,7 @@ namespace Avalonia.Media { case Command.FillRule: _context.SetFillRule(ReadFillRule(reader)); + previousControlPoint = null; break; case Command.Move: @@ -90,11 +98,13 @@ namespace Avalonia.Media point = ReadPoint(reader, point, relative); _context.BeginFigure(point, true); openFigure = true; + previousControlPoint = null; break; case Command.Line: point = ReadPoint(reader, point, relative); _context.LineTo(point); + previousControlPoint = null; break; case Command.HorizontalLine: @@ -108,6 +118,7 @@ namespace Avalonia.Media } _context.LineTo(point); + previousControlPoint = null; break; case Command.VerticalLine: @@ -121,18 +132,57 @@ namespace Avalonia.Media } _context.LineTo(point); + previousControlPoint = null; break; + case Command.QuadraticBezierCurve: + { + Point handle = ReadPoint(reader, point, relative); + previousControlPoint = handle; + ReadSeparator(reader); + point = ReadPoint(reader, point, relative); + _context.QuadraticBezierTo(handle, point); + break; + } + + case Command.SmoothQuadraticBezierCurve: + { + Point end = ReadPoint(reader, point, relative); + + if(previousControlPoint != null) + previousControlPoint = MirrorControlPoint((Point)previousControlPoint, point); + + _context.QuadraticBezierTo(previousControlPoint ?? point, end); + point = end; + break; + } + case Command.CubicBezierCurve: { Point point1 = ReadPoint(reader, point, relative); ReadSeparator(reader); Point point2 = ReadPoint(reader, point, relative); + previousControlPoint = point2; ReadSeparator(reader); point = ReadPoint(reader, point, relative); _context.CubicBezierTo(point1, point2, point); break; } + + case Command.SmoothCubicBezierCurve: + { + Point point2 = ReadPoint(reader, point, relative); + ReadSeparator(reader); + Point end = ReadPoint(reader, point, relative); + + if(previousControlPoint != null) + previousControlPoint = MirrorControlPoint((Point)previousControlPoint, point); + + _context.CubicBezierTo(previousControlPoint ?? point, point2, end); + previousControlPoint = point2; + point = end; + break; + } case Command.Arc: { @@ -147,12 +197,14 @@ namespace Avalonia.Media point = ReadPoint(reader, point, relative); _context.ArcTo(point, size, rotationAngle, isLargeArc, sweepDirection); + previousControlPoint = null; break; } case Command.Close: _context.EndFigure(true); openFigure = false; + previousControlPoint = null; break; default: @@ -167,6 +219,14 @@ namespace Avalonia.Media } } + private Point MirrorControlPoint(Point controlPoint, Point center) + { + Point dir = (controlPoint - center); + double xOffset = center.X - controlPoint.X, yOffset = center.Y - controlPoint.Y; +// return new Point(center.X - xOffset, center.Y - yOffset); + return center + -dir; + } + private static bool ReadCommand( StringReader reader, ref Command command, @@ -243,6 +303,9 @@ namespace Avalonia.Media (c == 'E' && !readExponent) || char.IsDigit(c)) { + if (b.Length != 0 && !readExponent && c == '-') + break; + b.Append(c); reader.Read(); From e74a1be8e4dac2b00ad5ee8226951ce2eb93455e Mon Sep 17 00:00:00 2001 From: Jurjen Biewenga Date: Wed, 27 Sep 2017 11:23:47 +0200 Subject: [PATCH 21/44] Added SVGPath test --- .../Avalonia.RenderTests.projitems | 1 + tests/Avalonia.RenderTests/SVGPathTests.cs | 53 ++++++++++++++++++ .../Skia/SVGPath/SVGPath.expected.png | Bin 0 -> 1041 bytes 3 files changed, 54 insertions(+) create mode 100644 tests/Avalonia.RenderTests/SVGPathTests.cs create mode 100644 tests/TestFiles/Skia/SVGPath/SVGPath.expected.png diff --git a/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems b/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems index a3ca0c7493..ff729a6b48 100644 --- a/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems +++ b/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems @@ -14,6 +14,7 @@ + diff --git a/tests/Avalonia.RenderTests/SVGPathTests.cs b/tests/Avalonia.RenderTests/SVGPathTests.cs new file mode 100644 index 0000000000..d1ed0ae1cf --- /dev/null +++ b/tests/Avalonia.RenderTests/SVGPathTests.cs @@ -0,0 +1,53 @@ +using Avalonia.Controls; +using Avalonia.Controls.Shapes; +using Avalonia.Media; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using System.Threading.Tasks; + +#if AVALONIA_CAIRO +namespace Avalonia.Cairo.RenderTests +#elif AVALONIA_SKIA +namespace Avalonia.Skia.RenderTests +#else +namespace Avalonia.Direct2D1.RenderTests +#endif +{ + public class SVGPathTests : TestBase + { + public SVGPathTests() + :base("SVGPath") + { + } + + [Fact] + public async Task SVGPath() + { + var target = new Canvas + { + Background = Brushes.Yellow, + Width = 76, + Height = 76, + Children = new Avalonia.Controls.Controls + { + new Path + { + Width = 32, + Height = 40, + [Canvas.LeftProperty] = 23, + [Canvas.TopProperty] = 18, + Stretch = Stretch.Fill, + Fill = Brushes.Black, + //Coffee Maker by Becris from the Noun Project + Data = StreamGeometry.Parse("M5,51v4c0,1.654,1.346,3,3,3h7v3c0,0.552,0.447,1,1,1h8c0.553,0,1-0.448,1-1v-3h18v3c0,0.552,0.447,1,1,1h8 c0.553,0,1-0.448,1-1v-3c2.757,0,5-2.243,5-5V13V7c0-2.757-2.243-5-5-5H11C8.243,2,6,4.243,6,7v2c0,2.757,2.243,5,5,5h1.743 l-2.717,11.775c-0.068,0.297,0.002,0.609,0.192,0.848C10.407,26.861,10.695,27,11,27h4c0.431,0,0.812-0.275,0.948-0.684L18.721,18 h1.499l1.811,7.243C22.142,25.688,22.541,26,23,26h12c0.459,0,0.858-0.312,0.97-0.757L37.78,18h6.658l-3.235,29.11 C41.147,47.618,40.72,48,40.21,48h-4.167c0.873-1.159,1.203-2.622,0.897-4.047L35,34.895v-2.481l2.707-2.707 c0.286-0.286,0.372-0.716,0.217-1.09C37.77,28.244,37.404,28,37,28H22c-0.553,0-1,0.448-1,1v0.719l-2.758-0.689 c-0.443-0.111-0.906,0.094-1.123,0.496l-7,13l1.762,0.948l6.631-12.315L21,31.781v3.115l-1.94,9.057 c-0.306,1.426,0.025,2.889,0.897,4.048H8C6.346,48,5,49.346,5,51z M23,60h-6v-2h6V60z M51,60h-6v-2h6V60z M8,9V7 c0-1.654,1.346-3,3-3h42c1.654,0,3,1.346,3,3v5H46H14h-3C9.346,12,8,10.654,8,9z M34.219,24H23.781l-1.5-6h13.438L34.219,24z M44.66,16H37H21h-3c-0.431,0-0.812,0.275-0.948,0.684L14.279,25h-2.022l2.539-11h30.087l-0.185,1.662L44.66,16z M43.191,47.331 L46.896,14H56v39c0,1.654-1.346,3-3,3h-1h-8H24h-8H8c-0.552,0-1-0.449-1-1v-4c0-0.551,0.448-1,1-1h15.948h8.104h8.158 C41.741,50,43.022,48.853,43.191,47.331z M23,30h11.586l-1.293,1.293C33.105,31.48,33,31.735,33,32v2H23V30z M21.614,46.886 c-0.571-0.708-0.79-1.624-0.6-2.514L22.809,36h10.383l1.794,8.372c0.19,0.89-0.028,1.806-0.6,2.514 C33.813,47.594,32.963,48,32.052,48h-8.104C23.037,48,22.187,47.594,21.614,46.886z") + } + } + }; + + await RenderToFile(target); + CompareImages(); + } + } +} diff --git a/tests/TestFiles/Skia/SVGPath/SVGPath.expected.png b/tests/TestFiles/Skia/SVGPath/SVGPath.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..98300488100e4bb5bba799d456efa2cb4ba367e2 GIT binary patch literal 1041 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yEX7WqAsj$Z!;#X#z`%UM)5S5Q zV$R!H4+|d|2(-$Zf0ws95Yhm|4l5X}8cGDT6l57hTS6LEDlB7~!u2NP!S9WW4;pSu zR9_>r<8PYDM#fD% zGed5_oxpfvl1pCCrfpG*#%{~;9AOrdZ7j3C%d@(lOx`!h*6^T$8Ex@KvZ+Kl&qSSw;C z={>Y&oHy^qF2fLwe6y!NHTqtDPnA12ef{ajz8elV-m3HW*8IOAF`|Bx!OS`F-HSf2 z_}plI&~0(BT(Re!jdy>|I(q)2+Kt!QKTESuCdI5W?_F4|cl`PDX7`AR4?mw-=Qa#B0Ohp$D&_Wm+nqJerq!4 zx8Ca<+TD8DC(}aSE;=?r_T>AHUe%h4z71c0RhKYsk$LSWGbh1yR>98(_k(Meep;Rp z^?1j>hq0DZ)w}*NAB>CBc>iSjw9~$&Y*+Sr{M4;Dop|&Flg2JR*^3s2pOg73F)=>y%0 z6YI+_P5Cs3;}iboFyt=akR{0Fs#U_y7O^ literal 0 HcmV?d00001 From 6fc85456f1466a79cc53a8ff79e6d6ccf5b596f0 Mon Sep 17 00:00:00 2001 From: Jurjen Biewenga Date: Wed, 27 Sep 2017 11:45:56 +0200 Subject: [PATCH 22/44] Added expected test results for Cairo and Direct2D --- .../TestFiles/Cairo/SVGPath/SVGPath.expected.png | Bin 0 -> 1041 bytes .../Direct2D1/SVGPath/SVGPath.expected.png | Bin 0 -> 1041 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/TestFiles/Cairo/SVGPath/SVGPath.expected.png create mode 100644 tests/TestFiles/Direct2D1/SVGPath/SVGPath.expected.png diff --git a/tests/TestFiles/Cairo/SVGPath/SVGPath.expected.png b/tests/TestFiles/Cairo/SVGPath/SVGPath.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..98300488100e4bb5bba799d456efa2cb4ba367e2 GIT binary patch literal 1041 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yEX7WqAsj$Z!;#X#z`%UM)5S5Q zV$R!H4+|d|2(-$Zf0ws95Yhm|4l5X}8cGDT6l57hTS6LEDlB7~!u2NP!S9WW4;pSu zR9_>r<8PYDM#fD% zGed5_oxpfvl1pCCrfpG*#%{~;9AOrdZ7j3C%d@(lOx`!h*6^T$8Ex@KvZ+Kl&qSSw;C z={>Y&oHy^qF2fLwe6y!NHTqtDPnA12ef{ajz8elV-m3HW*8IOAF`|Bx!OS`F-HSf2 z_}plI&~0(BT(Re!jdy>|I(q)2+Kt!QKTESuCdI5W?_F4|cl`PDX7`AR4?mw-=Qa#B0Ohp$D&_Wm+nqJerq!4 zx8Ca<+TD8DC(}aSE;=?r_T>AHUe%h4z71c0RhKYsk$LSWGbh1yR>98(_k(Meep;Rp z^?1j>hq0DZ)w}*NAB>CBc>iSjw9~$&Y*+Sr{M4;Dop|&Flg2JR*^3s2pOg73F)=>y%0 z6YI+_P5Cs3;}iboFyt=akR{0Fs#U_y7O^ literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Direct2D1/SVGPath/SVGPath.expected.png b/tests/TestFiles/Direct2D1/SVGPath/SVGPath.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..98300488100e4bb5bba799d456efa2cb4ba367e2 GIT binary patch literal 1041 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yEX7WqAsj$Z!;#X#z`%UM)5S5Q zV$R!H4+|d|2(-$Zf0ws95Yhm|4l5X}8cGDT6l57hTS6LEDlB7~!u2NP!S9WW4;pSu zR9_>r<8PYDM#fD% zGed5_oxpfvl1pCCrfpG*#%{~;9AOrdZ7j3C%d@(lOx`!h*6^T$8Ex@KvZ+Kl&qSSw;C z={>Y&oHy^qF2fLwe6y!NHTqtDPnA12ef{ajz8elV-m3HW*8IOAF`|Bx!OS`F-HSf2 z_}plI&~0(BT(Re!jdy>|I(q)2+Kt!QKTESuCdI5W?_F4|cl`PDX7`AR4?mw-=Qa#B0Ohp$D&_Wm+nqJerq!4 zx8Ca<+TD8DC(}aSE;=?r_T>AHUe%h4z71c0RhKYsk$LSWGbh1yR>98(_k(Meep;Rp z^?1j>hq0DZ)w}*NAB>CBc>iSjw9~$&Y*+Sr{M4;Dop|&Flg2JR*^3s2pOg73F)=>y%0 z6YI+_P5Cs3;}iboFyt=akR{0Fs#U_y7O^ literal 0 HcmV?d00001 From d4af3512510d5dca24f517c9d353374b75491243 Mon Sep 17 00:00:00 2001 From: Jurjen Biewenga Date: Wed, 27 Sep 2017 18:47:25 +0200 Subject: [PATCH 23/44] Removed unused code --- src/Avalonia.Visuals/Media/PathMarkupParser.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Avalonia.Visuals/Media/PathMarkupParser.cs b/src/Avalonia.Visuals/Media/PathMarkupParser.cs index 9aedf314ce..fbc189546c 100644 --- a/src/Avalonia.Visuals/Media/PathMarkupParser.cs +++ b/src/Avalonia.Visuals/Media/PathMarkupParser.cs @@ -222,8 +222,6 @@ namespace Avalonia.Media private Point MirrorControlPoint(Point controlPoint, Point center) { Point dir = (controlPoint - center); - double xOffset = center.X - controlPoint.X, yOffset = center.Y - controlPoint.Y; -// return new Point(center.X - xOffset, center.Y - yOffset); return center + -dir; } From 79535609b69cb71d02ef2c7e79b509d6fe932337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Fri, 29 Sep 2017 17:34:28 +0200 Subject: [PATCH 24/44] Use DynamicResource instead of StyleResource Fixes #1165 --- samples/ControlCatalog/Pages/ToolTipPage.xaml | 4 ++-- src/Avalonia.Themes.Default/RepeatButton.xaml | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/samples/ControlCatalog/Pages/ToolTipPage.xaml b/samples/ControlCatalog/Pages/ToolTipPage.xaml index 5cf7fee4d1..aa7d60bd11 100644 --- a/samples/ControlCatalog/Pages/ToolTipPage.xaml +++ b/samples/ControlCatalog/Pages/ToolTipPage.xaml @@ -10,7 +10,7 @@ HorizontalAlignment="Center"> @@ -24,7 +24,7 @@ diff --git a/src/Avalonia.Themes.Default/RepeatButton.xaml b/src/Avalonia.Themes.Default/RepeatButton.xaml index 557e2d3b03..1caaa266de 100644 --- a/src/Avalonia.Themes.Default/RepeatButton.xaml +++ b/src/Avalonia.Themes.Default/RepeatButton.xaml @@ -1,13 +1,13 @@ \ No newline at end of file From db63b74aaa176e12b7efa0dbcf1eac6eda551573 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 29 Sep 2017 20:49:37 +0300 Subject: [PATCH 25/44] Fix for 1118 --- src/Avalonia.Visuals/Media/GradientBrush.cs | 6 +++--- src/Avalonia.Visuals/Media/IGradientBrush.cs | 2 +- .../Media/Immutable/ImmutableGradientBrush.cs | 4 ++-- .../Media/Immutable/ImmutableLinearGradientBrush.cs | 2 +- .../Media/Immutable/ImmutableRadialGradientBrush.cs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Visuals/Media/GradientBrush.cs b/src/Avalonia.Visuals/Media/GradientBrush.cs index 52edf12e7f..8c2c9a2c01 100644 --- a/src/Avalonia.Visuals/Media/GradientBrush.cs +++ b/src/Avalonia.Visuals/Media/GradientBrush.cs @@ -21,8 +21,8 @@ namespace Avalonia.Media /// /// Defines the property. /// - public static readonly StyledProperty> GradientStopsProperty = - AvaloniaProperty.Register>(nameof(Opacity)); + public static readonly StyledProperty> GradientStopsProperty = + AvaloniaProperty.Register>(nameof(Opacity)); /// /// Initializes a new instance of the class. @@ -46,7 +46,7 @@ namespace Avalonia.Media /// Gets or sets the brush's gradient stops. /// [Content] - public IReadOnlyList GradientStops + public IList GradientStops { get { return GetValue(GradientStopsProperty); } set { SetValue(GradientStopsProperty, value); } diff --git a/src/Avalonia.Visuals/Media/IGradientBrush.cs b/src/Avalonia.Visuals/Media/IGradientBrush.cs index ce064c4a1f..390ce6ee5b 100644 --- a/src/Avalonia.Visuals/Media/IGradientBrush.cs +++ b/src/Avalonia.Visuals/Media/IGradientBrush.cs @@ -10,7 +10,7 @@ namespace Avalonia.Media /// /// Gets the brush's gradient stops. /// - IReadOnlyList GradientStops { get; } + IList GradientStops { get; } /// /// Gets the brush's spread method that defines how to draw a gradient that doesn't fill diff --git a/src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs b/src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs index e8507f8fc3..ca67789c7f 100644 --- a/src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs +++ b/src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs @@ -16,7 +16,7 @@ namespace Avalonia.Media.Immutable /// The opacity of the brush. /// The spread method. protected ImmutableGradientBrush( - IReadOnlyList gradientStops, + IList gradientStops, double opacity, GradientSpreadMethod spreadMethod) { @@ -36,7 +36,7 @@ namespace Avalonia.Media.Immutable } /// - public IReadOnlyList GradientStops { get; } + public IList GradientStops { get; } /// public double Opacity { get; } diff --git a/src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs b/src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs index b46ee951f7..39ddc305fb 100644 --- a/src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs +++ b/src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs @@ -20,7 +20,7 @@ namespace Avalonia.Media.Immutable /// The start point for the gradient. /// The end point for the gradient. public ImmutableLinearGradientBrush( - IReadOnlyList gradientStops, + IList gradientStops, double opacity = 1, GradientSpreadMethod spreadMethod = GradientSpreadMethod.Pad, RelativePoint? startPoint = null, diff --git a/src/Avalonia.Visuals/Media/Immutable/ImmutableRadialGradientBrush.cs b/src/Avalonia.Visuals/Media/Immutable/ImmutableRadialGradientBrush.cs index cc2c7b3697..672a45ebc4 100644 --- a/src/Avalonia.Visuals/Media/Immutable/ImmutableRadialGradientBrush.cs +++ b/src/Avalonia.Visuals/Media/Immutable/ImmutableRadialGradientBrush.cs @@ -22,7 +22,7 @@ namespace Avalonia.Media.Immutable /// The horizontal and vertical radius of the outermost circle of the radial gradient. /// public ImmutableRadialGradientBrush( - IReadOnlyList gradientStops, + IList gradientStops, double opacity = 1, GradientSpreadMethod spreadMethod = GradientSpreadMethod.Pad, RelativePoint? center = null, From b963d68668d7902f9e6a45bd173a4deb850f60bf Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 30 Sep 2017 17:20:40 +0300 Subject: [PATCH 26/44] Try to respect DispatcherPriority when possible --- .../AndroidThreadingInterface.cs | 7 ++- .../Platform/IPlatformThreadingInterface.cs | 5 +- .../AvaloniaSynchronizationContext.cs | 4 +- src/Avalonia.Base/Threading/Dispatcher.cs | 4 +- .../Threading/DispatcherPriority.cs | 7 +-- src/Avalonia.Base/Threading/JobRunner.cs | 47 ++++++++++----- .../Threading/SingleThreadDispatcher.cs | 60 ------------------- src/Avalonia.Controls/Primitives/Track.cs | 2 +- src/Gtk/Avalonia.Gtk/GtkPlatform.cs | 7 ++- src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj | 28 --------- src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs | 18 +++--- src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs | 46 ++++++++++++++ src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs | 4 +- src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 10 +++- src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs | 12 ++-- src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 16 +++++ .../PlatformThreadingInterface.cs | 7 ++- .../PlatformThreadingInterface.cs | 7 ++- src/Windows/Avalonia.Win32/Win32Platform.cs | 7 ++- src/Windows/Avalonia.Win32/WindowImpl.cs | 1 + .../PlatformThreadingInterface.cs | 7 ++- .../AvaloniaObjectTests_Threading.cs | 5 +- tests/Avalonia.RenderTests/TestBase.cs | 6 +- 23 files changed, 161 insertions(+), 156 deletions(-) delete mode 100644 src/Avalonia.Base/Threading/SingleThreadDispatcher.cs create mode 100644 src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs diff --git a/src/Android/Avalonia.Android/AndroidThreadingInterface.cs b/src/Android/Avalonia.Android/AndroidThreadingInterface.cs index 6327be12a5..2e5b2902f4 100644 --- a/src/Android/Avalonia.Android/AndroidThreadingInterface.cs +++ b/src/Android/Avalonia.Android/AndroidThreadingInterface.cs @@ -12,6 +12,7 @@ using Android.Runtime; using Android.Views; using Android.Widget; using Avalonia.Platform; +using Avalonia.Threading; namespace Avalonia.Android { @@ -78,13 +79,13 @@ namespace Avalonia.Android private void EnsureInvokeOnMainThread(Action action) => _handler.Post(action); - public void Signal() + public void Signal(DispatcherPriority prio) { - EnsureInvokeOnMainThread(() => Signaled?.Invoke()); + EnsureInvokeOnMainThread(() => Signaled?.Invoke(null)); } public bool CurrentThreadIsLoopThread => Looper.MainLooper.Thread.Equals(Java.Lang.Thread.CurrentThread()); - public event Action Signaled; + public event Action Signaled; } } \ No newline at end of file diff --git a/src/Avalonia.Base/Platform/IPlatformThreadingInterface.cs b/src/Avalonia.Base/Platform/IPlatformThreadingInterface.cs index 8101e4b550..68f9e2c631 100644 --- a/src/Avalonia.Base/Platform/IPlatformThreadingInterface.cs +++ b/src/Avalonia.Base/Platform/IPlatformThreadingInterface.cs @@ -3,6 +3,7 @@ using System; using System.Threading; +using Avalonia.Threading; namespace Avalonia.Platform { @@ -21,10 +22,10 @@ namespace Avalonia.Platform /// An used to stop the timer. IDisposable StartTimer(TimeSpan interval, Action tick); - void Signal(); + void Signal(DispatcherPriority priority); bool CurrentThreadIsLoopThread { get; } - event Action Signaled; + event Action Signaled; } } diff --git a/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs b/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs index c32aeed0b4..7a0249f876 100644 --- a/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs +++ b/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs @@ -36,7 +36,7 @@ namespace Avalonia.Threading /// public override void Post(SendOrPostCallback d, object state) { - Dispatcher.UIThread.InvokeAsync(() => d(state)); + Dispatcher.UIThread.InvokeAsync(() => d(state), DispatcherPriority.Send); } /// @@ -45,7 +45,7 @@ namespace Avalonia.Threading if (Dispatcher.UIThread.CheckAccess()) d(state); else - Dispatcher.UIThread.InvokeTaskAsync(() => d(state)).Wait(); + Dispatcher.UIThread.InvokeTaskAsync(() => d(state), DispatcherPriority.Send).Wait(); } } } \ No newline at end of file diff --git a/src/Avalonia.Base/Threading/Dispatcher.cs b/src/Avalonia.Base/Threading/Dispatcher.cs index d46b7142f4..a60b663bed 100644 --- a/src/Avalonia.Base/Threading/Dispatcher.cs +++ b/src/Avalonia.Base/Threading/Dispatcher.cs @@ -60,7 +60,7 @@ namespace Avalonia.Threading public void MainLoop(CancellationToken cancellationToken) { var platform = AvaloniaLocator.Current.GetService(); - cancellationToken.Register(platform.Signal); + cancellationToken.Register(() => platform.Signal(DispatcherPriority.Send)); platform.RunLoop(cancellationToken); } @@ -69,7 +69,7 @@ namespace Avalonia.Threading /// public void RunJobs() { - _jobRunner?.RunJobs(); + _jobRunner?.RunJobs(null); } /// diff --git a/src/Avalonia.Base/Threading/DispatcherPriority.cs b/src/Avalonia.Base/Threading/DispatcherPriority.cs index 8d6be6eeec..38c1f4e859 100644 --- a/src/Avalonia.Base/Threading/DispatcherPriority.cs +++ b/src/Avalonia.Base/Threading/DispatcherPriority.cs @@ -9,11 +9,7 @@ namespace Avalonia.Threading // TODO: These are copied from WPF - many won't apply to Avalonia. public enum DispatcherPriority { - /// - /// The job will not be processed. - /// - Inactive = 0, - + MinValue = 1, /// /// The job will be processed when the system is idle. /// @@ -63,5 +59,6 @@ namespace Avalonia.Threading /// The job will be processed before other asynchronous operations. /// Send = 10, + MaxValue = 10 } } diff --git a/src/Avalonia.Base/Threading/JobRunner.cs b/src/Avalonia.Base/Threading/JobRunner.cs index e212cd9a2e..c2040a0982 100644 --- a/src/Avalonia.Base/Threading/JobRunner.cs +++ b/src/Avalonia.Base/Threading/JobRunner.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Avalonia.Platform; @@ -13,29 +14,45 @@ namespace Avalonia.Threading /// internal class JobRunner { - private readonly Queue _queue = new Queue(); + + private IPlatformThreadingInterface _platform; + private Queue[] _queues = Enumerable.Range(0, (int) DispatcherPriority.MaxValue + 1) + .Select(_ => new Queue()).ToArray(); + public JobRunner(IPlatformThreadingInterface platform) { _platform = platform; } + Job GetNextJob(DispatcherPriority minimumPriority) + { + for (int c = (int) DispatcherPriority.MaxValue; c >= (int) minimumPriority; c--) + { + var q = _queues[c]; + lock (q) + { + if (q.Count > 0) + return q.Dequeue(); + } + } + return null; + } + /// /// Runs continuations pushed on the loop. /// - public void RunJobs() + /// Priority to execute jobs for. Pass null if platform doesn't have internal priority system + public void RunJobs(DispatcherPriority? priority) { + var minimumPriority = priority ?? DispatcherPriority.MinValue; while (true) { - Job job; - - lock (_queue) - { - if (_queue.Count == 0) - return; - job = _queue.Dequeue(); - } + var job = GetNextJob(minimumPriority); + if (job == null) + return; + if (job.TaskCompletionSource == null) { @@ -77,7 +94,6 @@ namespace Avalonia.Threading /// The priority with which to invoke the method. internal void Post(Action action, DispatcherPriority priority) { - // TODO: Respect priority. AddJob(new Job(action, priority, true)); } @@ -92,13 +108,14 @@ namespace Avalonia.Threading private void AddJob(Job job) { var needWake = false; - lock (_queue) + var queue = _queues[(int) job.Priority]; + lock (queue) { - needWake = _queue.Count == 0; - _queue.Enqueue(job); + needWake = queue.Count == 0; + queue.Enqueue(job); } if (needWake) - _platform?.Signal(); + _platform?.Signal(job.Priority); } /// diff --git a/src/Avalonia.Base/Threading/SingleThreadDispatcher.cs b/src/Avalonia.Base/Threading/SingleThreadDispatcher.cs deleted file mode 100644 index 76d47b30b0..0000000000 --- a/src/Avalonia.Base/Threading/SingleThreadDispatcher.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Platform; - -namespace Avalonia.Threading -{ - public class SingleThreadDispatcher : Dispatcher - { - class ThreadingInterface : IPlatformThreadingInterface - { - private readonly AutoResetEvent _evnt = new AutoResetEvent(false); - private readonly JobRunner _timerJobRunner; - - public ThreadingInterface() - { - _timerJobRunner = new JobRunner(this); - } - - public void RunLoop(CancellationToken cancellationToken) - { - while (!cancellationToken.IsCancellationRequested) - { - _evnt.WaitOne(); - if (cancellationToken.IsCancellationRequested) - return; - Signaled?.Invoke(); - _timerJobRunner.RunJobs(); - } - } - - public IDisposable StartTimer(TimeSpan interval, Action tick) - => AvaloniaLocator.Current.GetService().StartSystemTimer(interval, - () => _timerJobRunner.Post(tick, DispatcherPriority.Normal)); - - public void Signal() => _evnt.Set(); - //TODO: Actually perform a check - public bool CurrentThreadIsLoopThread => true; - - public event Action Signaled; - } - - public SingleThreadDispatcher() : base(new ThreadingInterface()) - { - } - - public static Dispatcher StartNew(CancellationToken token) - { - var dispatcher = new SingleThreadDispatcher(); - AvaloniaLocator.Current.GetService().PostThreadPoolItem(() => - { - dispatcher.MainLoop(token); - }); - return dispatcher; - } - } -} diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index a9b6afc172..663b7a22d5 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -165,7 +165,7 @@ namespace Avalonia.Controls.Primitives if (increaseButton != null) { - increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, remaining - firstHeight)); + increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, Math.Max(remaining - firstHeight, 0))); } } diff --git a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs index f449229c53..c167e1ee38 100644 --- a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs +++ b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs @@ -9,6 +9,7 @@ using Avalonia.Input.Platform; using Avalonia.Input; using Avalonia.Platform; using Avalonia.Controls; +using Avalonia.Threading; namespace Avalonia { @@ -91,14 +92,14 @@ namespace Avalonia.Gtk - public void Signal() + public void Signal(DispatcherPriority prio) { - Gtk.Application.Invoke(delegate { Signaled?.Invoke(); }); + Gtk.Application.Invoke(delegate { Signaled?.Invoke(null); }); } public bool CurrentThreadIsLoopThread => Thread.CurrentThread == _uiThread; - public event Action Signaled; + public event Action Signaled; public IWindowImpl CreateWindow() { return new WindowImpl(); diff --git a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj index 59bd58916b..f1894ce1c5 100644 --- a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj +++ b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj @@ -1,7 +1,6 @@  netstandard2.0 - False false @@ -28,33 +27,6 @@ KeyTransform.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs index 4ea1a5af56..7e2e25c4be 100644 --- a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs +++ b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs @@ -12,6 +12,7 @@ using Avalonia.Input.Platform; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Gtk3; +using Avalonia.Threading; namespace Avalonia.Gtk3 { @@ -68,27 +69,28 @@ namespace Avalonia.Gtk3 return GlibTimeout.StarTimer((uint) interval.TotalMilliseconds, tick); } - private bool _signaled = false; + private bool[] _signaled = new bool[(int) DispatcherPriority.MaxValue + 1]; object _lock = new object(); - public void Signal() + public void Signal(DispatcherPriority prio) { + var idx = (int) prio; lock(_lock) - if (!_signaled) + if (!_signaled[idx]) { - _signaled = true; - GlibTimeout.Add(0, () => + _signaled[idx] = true; + GlibTimeout.Add(GlibPriority.FromDispatcherPriority(prio), 0, () => { lock (_lock) { - _signaled = false; + _signaled[idx] = false; } - Signaled?.Invoke(); + Signaled?.Invoke(prio); return false; }); } } - public event Action Signaled; + public event Action Signaled; [ThreadStatic] diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs b/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs new file mode 100644 index 0000000000..1d057f525b --- /dev/null +++ b/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Avalonia.Threading; + +namespace Avalonia.Gtk3.Interop +{ + static class GlibPriority + { + public static int High = -100; + public static int Default = 0; + public static int HighIdle = 100; + public static int GtkResize = HighIdle + 10; + public static int GtkPaint = HighIdle + 20; + public static int DefaultIdle = 200; + public static int Low = 300; + public static int GdkEvents = Default; + public static int GdkRedraw = HighIdle + 20; + + public static int FromDispatcherPriority(DispatcherPriority prio) + { + if (prio == DispatcherPriority.Send) + return High; + if (prio == DispatcherPriority.Normal) + return Default - 4; + if (prio == DispatcherPriority.DataBind) + return Default - 3; + if (prio == DispatcherPriority.Render) + return Default -2; + if (prio == DispatcherPriority.Loaded) + return Default - 1; + if (prio == DispatcherPriority.Input) + return Default; + if (prio == DispatcherPriority.Background) + return DefaultIdle; + if (prio == DispatcherPriority.ContextIdle) + return DefaultIdle + 100; + if (prio == DispatcherPriority.ApplicationIdle) + return DefaultIdle + 200; + if (prio == DispatcherPriority.SystemIdle) + return DefaultIdle + 200; + throw new ArgumentException("Unknown priority"); + + } + } +} diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs index 9971d8881d..79b1cca92d 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs @@ -30,7 +30,7 @@ namespace Avalonia.Gtk3.Interop } - public static void Add(uint interval, Func callback) + public static void Add(int priority, uint interval, Func callback) { var handle = GCHandle.Alloc(callback); Native.GTimeoutAdd(interval, PinnedHandler, GCHandle.ToIntPtr(handle)); @@ -49,7 +49,7 @@ namespace Avalonia.Gtk3.Interop public static IDisposable StarTimer(uint interval, Action tick) { var timer = new Timer (); - GlibTimeout.Add(interval, + GlibTimeout.Add(101, interval, () => { if (timer.Stopped) diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index 35aef7b4e5..bc0b32bdfb 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -236,6 +236,9 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate void gdk_window_begin_resize_drag(IntPtr window, WindowEdge edge, gint button, gint root_x, gint root_y, guint32 timestamp); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_process_updates(IntPtr window, bool updateChildren); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate void gdk_event_request_motions(IntPtr ev); @@ -287,7 +290,10 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public delegate ulong g_timeout_add(uint interval, timeout_callback callback, IntPtr data); - + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] + public delegate ulong g_timeout_add_full(int prio, uint interval, timeout_callback callback, IntPtr data, IntPtr destroy); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public delegate ulong g_free(IntPtr data); @@ -366,6 +372,7 @@ namespace Avalonia.Gtk3.Interop public static D.g_signal_connect_object GSignalConnectObject; public static D.g_signal_handler_disconnect GSignalHandlerDisconnect; public static D.g_timeout_add GTimeoutAdd; + public static D.g_timeout_add_full GTimeoutAddFull; public static D.g_free GFree; public static D.g_slist_free GSlistFree; public static D.g_memory_input_stream_new_from_data GMemoryInputStreamNewFromData; @@ -398,6 +405,7 @@ namespace Avalonia.Gtk3.Interop public static D.gdk_window_begin_move_drag GdkWindowBeginMoveDrag; public static D.gdk_window_begin_resize_drag GdkWindowBeginResizeDrag; public static D.gdk_event_request_motions GdkEventRequestMotions; + public static D.gdk_window_process_updates GdkWindowProcessUpdates; public static D.gdk_pixbuf_new_from_file GdkPixbufNewFromFile; public static D.gtk_icon_theme_get_default GtkIconThemeGetDefault; diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs b/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs index 764cbfd6b6..31625e3f27 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs @@ -140,13 +140,11 @@ namespace Avalonia.Gtk3.Interop var nativeHandleNames = new[] { "gdk_win32_window_get_handle", "gdk_x11_window_get_xid", "gdk_quartz_window_get_nswindow" }; foreach (var name in nativeHandleNames) { - try - { - Native.GetNativeGdkWindowHandle = (Native.D.gdk_get_native_handle)Marshal - .GetDelegateForFunctionPointer(loader.GetProcAddress(dlls[GtkDll.Gdk], name, false), typeof(Native.D.gdk_get_native_handle)); - break; - } - catch { } + var ptr = loader.GetProcAddress(dlls[GtkDll.Gdk], name, true); + if (ptr == IntPtr.Zero) + continue; + Native.GetNativeGdkWindowHandle = (Native.D.gdk_get_native_handle) Marshal + .GetDelegateForFunctionPointer(ptr, typeof(Native.D.gdk_get_native_handle)); } if (Native.GetNativeGdkWindowHandle == null) throw new Exception($"Unable to locate any of [{string.Join(", ", nativeHandleNames)}] in libgdk"); diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 5725ee2596..32bd9f9157 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -10,6 +10,7 @@ using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Platform; using Avalonia.Rendering; +using Avalonia.Threading; namespace Avalonia.Gtk3 { @@ -25,6 +26,7 @@ namespace Avalonia.Gtk3 private double _lastScaling; private uint _lastKbdEvent; private uint _lastSmoothScrollEvent; + private bool _hasDirtyRects; public WindowBaseImpl(GtkWindow gtkWidget) { @@ -222,6 +224,7 @@ namespace Avalonia.Gtk3 private bool OnDraw(IntPtr gtkwidget, IntPtr cairocontext, IntPtr userdata) { + _hasDirtyRects = false; CurrentCairoContext = cairocontext; Paint?.Invoke(new Rect(ClientSize)); CurrentCairoContext = IntPtr.Zero; @@ -271,6 +274,19 @@ namespace Avalonia.Gtk3 if(GtkWidget.IsClosed) return; Native.GtkWidgetQueueDrawArea(GtkWidget, (int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height); + if (!_hasDirtyRects) + { + _hasDirtyRects = true; + Dispatcher.UIThread.InvokeAsync(() => + { + if (GtkWidget.IsClosed) + return; + var window = Native.GtkWidgetGetWindow(GtkWidget); + if (window == IntPtr.Zero) + return; + Native.GdkWindowProcessUpdates(window, false); + }, DispatcherPriority.Render); + } } public void SetInputRoot(IInputRoot inputRoot) => _inputRoot = inputRoot; diff --git a/src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs b/src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs index 9231649754..3aef6944af 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs @@ -6,6 +6,7 @@ using System.Threading; using System.Threading.Tasks; using Avalonia.Platform; using Avalonia.Rendering; +using Avalonia.Threading; namespace Avalonia.LinuxFramebuffer { @@ -30,7 +31,7 @@ namespace Avalonia.LinuxFramebuffer while (true) { if (0 == WaitHandle.WaitAny(handles)) - Signaled?.Invoke(); + Signaled?.Invoke(null); else { while (true) @@ -97,7 +98,7 @@ namespace Avalonia.LinuxFramebuffer } - public void Signal() + public void Signal(DispatcherPriority prio) { _signaled.Set(); } @@ -105,7 +106,7 @@ namespace Avalonia.LinuxFramebuffer [ThreadStatic] private static bool TlsCurrentThreadIsLoopThread; public bool CurrentThreadIsLoopThread => TlsCurrentThreadIsLoopThread; - public event Action Signaled; + public event Action Signaled; public event EventHandler Tick; } diff --git a/src/OSX/Avalonia.MonoMac/PlatformThreadingInterface.cs b/src/OSX/Avalonia.MonoMac/PlatformThreadingInterface.cs index 5da38bf0de..80c854f5a5 100644 --- a/src/OSX/Avalonia.MonoMac/PlatformThreadingInterface.cs +++ b/src/OSX/Avalonia.MonoMac/PlatformThreadingInterface.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using Avalonia.Platform; +using Avalonia.Threading; using MonoMac.AppKit; using MonoMac.CoreGraphics; using MonoMac.Foundation; @@ -13,12 +14,12 @@ namespace Avalonia.MonoMac public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface(); public bool CurrentThreadIsLoopThread => NSThread.Current.IsMainThread; - public event Action Signaled; + public event Action Signaled; public IDisposable StartTimer(TimeSpan interval, Action tick) => NSTimer.CreateRepeatingScheduledTimer(interval, () => tick()); - public void Signal() + public void Signal(DispatcherPriority prio) { lock (this) { @@ -34,7 +35,7 @@ namespace Avalonia.MonoMac return; _signaled = false; } - Signaled?.Invoke(); + Signaled?.Invoke(null); }); } diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index d8e9256156..a260efd9b9 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -15,6 +15,7 @@ using Avalonia.Win32.Input; using Avalonia.Win32.Interop; using Avalonia.Controls; using Avalonia.Rendering; +using Avalonia.Threading; #if NETSTANDARD using Win32Exception = Avalonia.Win32.NetStandard.AvaloniaWin32Exception; #else @@ -137,7 +138,7 @@ namespace Avalonia.Win32 private static readonly int SignalW = unchecked((int) 0xdeadbeaf); private static readonly int SignalL = unchecked((int)0x12345678); - public void Signal() + public void Signal(DispatcherPriority prio) { UnmanagedMethods.PostMessage( _hwnd, @@ -148,14 +149,14 @@ namespace Avalonia.Win32 public bool CurrentThreadIsLoopThread => _uiThread == UnmanagedMethods.GetCurrentThreadId(); - public event Action Signaled; + public event Action Signaled; [SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Using Win32 naming for consistency.")] private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { if (msg == (int) UnmanagedMethods.WindowsMessage.WM_DISPATCH_WORK_ITEM && wParam.ToInt64() == SignalW && lParam.ToInt64() == SignalL) { - Signaled?.Invoke(); + Signaled?.Invoke(null); } return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index dab7f0ba04..4a94a09dc5 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -16,6 +16,7 @@ using Avalonia.Win32.Input; using Avalonia.Win32.Interop; using static Avalonia.Win32.Interop.UnmanagedMethods; using Avalonia.Rendering; +using Avalonia.Threading; #if NETSTANDARD using Win32Exception = Avalonia.Win32.NetStandard.AvaloniaWin32Exception; #endif diff --git a/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs b/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs index e2e72f4c3c..6d6a5e22ca 100644 --- a/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs +++ b/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs @@ -9,6 +9,7 @@ using CoreAnimation; using Foundation; using Avalonia.Platform; using Avalonia.Shared.PlatformSupport; +using Avalonia.Threading; namespace Avalonia.iOS { @@ -18,7 +19,7 @@ namespace Avalonia.iOS public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface(); public bool CurrentThreadIsLoopThread => NSThread.Current.IsMainThread; - public event Action Signaled; + public event Action Signaled; public void RunLoop(CancellationToken cancellationToken) { //Mobile platforms are using external main loop @@ -53,7 +54,7 @@ namespace Avalonia.iOS public IDisposable StartTimer(TimeSpan interval, Action tick) => NSTimer.CreateRepeatingScheduledTimer(interval, _ => tick()); - public void Signal() + public void Signal(DispatcherPriority prio) { lock (this) { @@ -65,7 +66,7 @@ namespace Avalonia.iOS { lock (this) _signaled = false; - Signaled?.Invoke(); + Signaled?.Invoke(null); }); } } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs index c4c5414e7f..229a34643d 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs @@ -6,6 +6,7 @@ using System.Reactive.Subjects; using System.Threading; using System.Threading.Tasks; using Avalonia.Platform; +using Avalonia.Threading; using Avalonia.UnitTests; using Xunit; @@ -147,14 +148,14 @@ namespace Avalonia.Base.UnitTests public bool CurrentThreadIsLoopThread { get; set; } - public event Action Signaled; + public event Action Signaled; public void RunLoop(CancellationToken cancellationToken) { throw new NotImplementedException(); } - public void Signal() + public void Signal(DispatcherPriority prio) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.RenderTests/TestBase.cs b/tests/Avalonia.RenderTests/TestBase.cs index 80168c1237..ca00ed1595 100644 --- a/tests/Avalonia.RenderTests/TestBase.cs +++ b/tests/Avalonia.RenderTests/TestBase.cs @@ -13,7 +13,7 @@ using Avalonia.Platform; using System.Threading.Tasks; using System; using System.Threading; - +using Avalonia.Threading; #if AVALONIA_CAIRO using Avalonia.Cairo; #elif AVALONIA_SKIA @@ -155,14 +155,14 @@ namespace Avalonia.Direct2D1.RenderTests public Thread MainThread { get; set; } - public event Action Signaled; + public event Action Signaled; public void RunLoop(CancellationToken cancellationToken) { throw new NotImplementedException(); } - public void Signal() + public void Signal(DispatcherPriority prio) { throw new NotImplementedException(); } From 2abd980713d9490d73ac52ec85475b6150922660 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 1 Oct 2017 02:35:11 +0300 Subject: [PATCH 27/44] Don't try to start WeakTimer right away --- src/Avalonia.Base/Utilities/WeakTimer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Avalonia.Base/Utilities/WeakTimer.cs b/src/Avalonia.Base/Utilities/WeakTimer.cs index a68ed9072f..5c44a6d122 100644 --- a/src/Avalonia.Base/Utilities/WeakTimer.cs +++ b/src/Avalonia.Base/Utilities/WeakTimer.cs @@ -23,7 +23,6 @@ namespace Avalonia.Utilities _timer = new DispatcherTimer(); _timer.Tick += delegate { OnTick(); }; - _timer.Start(); } private void OnTick() From 70c24908a93c819888ee5c87ad940d14996558da Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 1 Oct 2017 02:37:49 +0300 Subject: [PATCH 28/44] Various fixes for GTK and DeferredRenderer support --- samples/ControlCatalog/MainWindow.xaml.cs | 1 + .../Threading/DispatcherPriority.cs | 15 ++- src/Avalonia.Layout/LayoutManager.cs | 2 +- .../Rendering/DefaultRenderLoop.cs | 8 +- src/Gtk/Avalonia.Gtk3/FramebufferManager.cs | 10 +- src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs | 14 ++- .../Avalonia.Gtk3/IDeferredRenderOperation.cs | 9 ++ .../Avalonia.Gtk3/ImageSurfaceFramebuffer.cs | 109 +++++++++++++++--- src/Gtk/Avalonia.Gtk3/Interop/CairoSurface.cs | 1 + src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs | 20 ++-- src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs | 8 +- src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 52 ++++++++- src/Gtk/Avalonia.Gtk3/ScreenImpl.cs | 4 +- src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 104 ++++++++++++----- 14 files changed, 278 insertions(+), 79 deletions(-) create mode 100644 src/Gtk/Avalonia.Gtk3/IDeferredRenderOperation.cs diff --git a/samples/ControlCatalog/MainWindow.xaml.cs b/samples/ControlCatalog/MainWindow.xaml.cs index ed0bffdf10..e620a77e52 100644 --- a/samples/ControlCatalog/MainWindow.xaml.cs +++ b/samples/ControlCatalog/MainWindow.xaml.cs @@ -11,6 +11,7 @@ namespace ControlCatalog { this.InitializeComponent(); this.AttachDevTools(); + //Renderer.DrawFps = true; //Renderer.DrawDirtyRects = Renderer.DrawFps = true; } diff --git a/src/Avalonia.Base/Threading/DispatcherPriority.cs b/src/Avalonia.Base/Threading/DispatcherPriority.cs index 38c1f4e859..78589984cb 100644 --- a/src/Avalonia.Base/Threading/DispatcherPriority.cs +++ b/src/Avalonia.Base/Threading/DispatcherPriority.cs @@ -44,21 +44,26 @@ namespace Avalonia.Threading /// The job will be processed with the same priority as render. /// Render = 7, - + + /// + /// The job will be processed with the same priority as render. + /// + Layout = 8, + /// /// The job will be processed with the same priority as data binding. /// - DataBind = 8, + DataBind = 9, /// /// The job will be processed with normal priority. /// - Normal = 9, + Normal = 10, /// /// The job will be processed before other asynchronous operations. /// - Send = 10, - MaxValue = 10 + Send = 11, + MaxValue = 11 } } diff --git a/src/Avalonia.Layout/LayoutManager.cs b/src/Avalonia.Layout/LayoutManager.cs index 3244f5e7dc..f8911dc036 100644 --- a/src/Avalonia.Layout/LayoutManager.cs +++ b/src/Avalonia.Layout/LayoutManager.cs @@ -203,7 +203,7 @@ namespace Avalonia.Layout { if (!_queued && !_running) { - Dispatcher.UIThread.InvokeAsync(ExecuteLayoutPass, DispatcherPriority.Render); + Dispatcher.UIThread.InvokeAsync(ExecuteLayoutPass, DispatcherPriority.Layout); _queued = true; } } diff --git a/src/Avalonia.Visuals/Rendering/DefaultRenderLoop.cs b/src/Avalonia.Visuals/Rendering/DefaultRenderLoop.cs index a4e8e6f0c2..5dff3715b3 100644 --- a/src/Avalonia.Visuals/Rendering/DefaultRenderLoop.cs +++ b/src/Avalonia.Visuals/Rendering/DefaultRenderLoop.cs @@ -15,7 +15,7 @@ namespace Avalonia.Rendering /// public class DefaultRenderLoop : IRenderLoop { - private IPlatformThreadingInterface _threading; + private IRuntimePlatform _runtime; private int _subscriberCount; private EventHandler _tick; private IDisposable _subscription; @@ -78,12 +78,12 @@ namespace Avalonia.Rendering /// protected virtual IDisposable StartCore(Action tick) { - if (_threading == null) + if (_runtime == null) { - _threading = AvaloniaLocator.Current.GetService(); + _runtime = AvaloniaLocator.Current.GetService(); } - return _threading.StartTimer(TimeSpan.FromSeconds(1.0 / FramesPerSecond), tick); + return _runtime.StartSystemTimer(TimeSpan.FromSeconds(1.0 / FramesPerSecond), tick); } /// diff --git a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs index 41e174bce4..00d1ec05f3 100644 --- a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs @@ -23,11 +23,11 @@ namespace Avalonia.Gtk3 public ILockedFramebuffer Lock() { - if(_window.CurrentCairoContext == IntPtr.Zero) - throw new InvalidOperationException("Window is not in drawing state"); - var width = (int) _window.ClientSize.Width; - var height = (int) _window.ClientSize.Height; - return new ImageSurfaceFramebuffer(_window.CurrentCairoContext, _window.GtkWidget, width, height); + // This method may be called from non-UI thread, don't touch anything that calls back to GTK/GDK + var s = _window.ClientSize; + var width = (int) s.Width; + var height = (int) s.Height; + return new ImageSurfaceFramebuffer(_window, width, height); } } } diff --git a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs index 7e2e25c4be..b36a1cda91 100644 --- a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs +++ b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs @@ -22,6 +22,7 @@ namespace Avalonia.Gtk3 internal static readonly MouseDevice Mouse = new MouseDevice(); internal static readonly KeyboardDevice Keyboard = new KeyboardDevice(); internal static IntPtr App { get; set; } + public static bool UseDeferredRendering = true; public static void Initialize() { Resolver.Resolve(); @@ -66,12 +67,17 @@ namespace Avalonia.Gtk3 public IDisposable StartTimer(TimeSpan interval, Action tick) { - return GlibTimeout.StarTimer((uint) interval.TotalMilliseconds, tick); + var msec = interval.TotalMilliseconds; + if (msec <= 0) + throw new ArgumentException("Don't know how to create a timer with zero or negative interval"); + var imsec = (uint) msec; + if (imsec == 0) + imsec = 1; + return GlibTimeout.StarTimer(imsec, tick); } private bool[] _signaled = new bool[(int) DispatcherPriority.MaxValue + 1]; object _lock = new object(); - public void Signal(DispatcherPriority prio) { var idx = (int) prio; @@ -97,7 +103,6 @@ namespace Avalonia.Gtk3 private static bool s_tlsMarker; public bool CurrentThreadIsLoopThread => s_tlsMarker; - } } @@ -105,10 +110,11 @@ namespace Avalonia { public static class Gtk3AppBuilderExtensions { - public static T UseGtk3(this AppBuilderBase builder, ICustomGtk3NativeLibraryResolver resolver = null) + public static T UseGtk3(this AppBuilderBase builder, bool deferredRendering = true, ICustomGtk3NativeLibraryResolver resolver = null) where T : AppBuilderBase, new() { Resolver.Custom = resolver; + Gtk3Platform.UseDeferredRendering = deferredRendering; return builder.UseWindowingSubsystem(Gtk3Platform.Initialize, "GTK3"); } } diff --git a/src/Gtk/Avalonia.Gtk3/IDeferredRenderOperation.cs b/src/Gtk/Avalonia.Gtk3/IDeferredRenderOperation.cs new file mode 100644 index 0000000000..8c1456726c --- /dev/null +++ b/src/Gtk/Avalonia.Gtk3/IDeferredRenderOperation.cs @@ -0,0 +1,9 @@ +using System; + +namespace Avalonia.Gtk3 +{ + public interface IDeferredRenderOperation : IDisposable + { + void RenderNow(); + } +} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs b/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs index 61b1e69aa2..34a95df47e 100644 --- a/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs +++ b/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs @@ -1,26 +1,28 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using Avalonia.Controls.Platform.Surfaces; using Avalonia.Gtk3.Interop; using Avalonia.Platform; +using Avalonia.Threading; namespace Avalonia.Gtk3 { class ImageSurfaceFramebuffer : ILockedFramebuffer { - private IntPtr _context; + private readonly WindowBaseImpl _impl; private readonly GtkWidget _widget; private CairoSurface _surface; private int _factor; - - public ImageSurfaceFramebuffer(IntPtr context, GtkWidget widget, int width, int height) + private object _lock = new object(); + public ImageSurfaceFramebuffer(WindowBaseImpl impl, int width, int height) { - _context = context; - _widget = widget; + _impl = impl; + _widget = impl.GtkWidget; _factor = (int)(Native.GtkWidgetGetScaleFactor?.Invoke(_widget) ?? 1u); width *= _factor; height *= _factor; @@ -32,18 +34,97 @@ namespace Avalonia.Gtk3 RowBytes = Native.CairoImageSurfaceGetStride(_surface); Native.CairoSurfaceFlush(_surface); } + + static void Draw(IntPtr context, CairoSurface surface, double factor) + { + + Native.CairoSurfaceMarkDirty(surface); + Native.CairoScale(context, 1d / factor, 1d / factor); + Native.CairoSetSourceSurface(context, surface, 0, 0); + Native.CairoPaint(context); + + } + /* + static Stopwatch St =Stopwatch.StartNew(); + private static int _frames; + private static int _fps;*/ + static void DrawToWidget(GtkWidget widget, CairoSurface surface, int width, int height, double factor) + { + if(surface == null || widget.IsClosed) + return; + var window = Native.GtkWidgetGetWindow(widget); + if(window == IntPtr.Zero) + return; + var rc = new GdkRectangle {Width = width, Height = height}; + Native.GdkWindowBeginPaintRect(window, ref rc); + var context = Native.GdkCairoCreate(window); + Draw(context, surface, factor); + /* + _frames++; + var el = St.Elapsed; + if (el.TotalSeconds > 1) + { + _fps = (int) (_frames / el.TotalSeconds); + _frames = 0; + St = Stopwatch.StartNew(); + } + + Native.CairoSetSourceRgba(context, 1, 0, 0, 1); + Native.CairoMoveTo(context, 20, 20); + Native.CairoSetFontSize(context, 30); + using (var txt = new Utf8Buffer("FPS: " + _fps)) + Native.CairoShowText(context, txt); + */ + + Native.CairoDestroy(context); + Native.GdkWindowEndPaint(window); + } + + class RenderOp : IDeferredRenderOperation + { + private readonly GtkWidget _widget; + private CairoSurface _surface; + private readonly double _factor; + private readonly int _width; + private readonly int _height; + + public RenderOp(GtkWidget widget, CairoSurface _surface, double factor, int width, int height) + { + _widget = widget; + this._surface = _surface; + _factor = factor; + _width = width; + _height = height; + } + + public void Dispose() + { + _surface?.Dispose(); + _surface = null; + } + + public void RenderNow() + { + DrawToWidget(_widget, _surface, _width, _height, _factor); + } + } public void Dispose() { - if(_context == IntPtr.Zero || _surface == null) - return; - Native.CairoSurfaceMarkDirty(_surface); - Native.CairoScale(_context, 1d / _factor, 1d / _factor); - Native.CairoSetSourceSurface(_context, _surface, 0, 0); - Native.CairoPaint(_context); - _context = IntPtr.Zero; - _surface.Dispose(); - _surface = null; + lock (_lock) + { + if (Dispatcher.UIThread.CheckAccess()) + { + if (_impl.CurrentCairoContext != IntPtr.Zero) + Draw(_impl.CurrentCairoContext, _surface, _factor); + else + DrawToWidget(_widget, _surface, Width, Height, _factor); + _surface.Dispose(); + } + else + _impl.SetNextRenderOperation(new RenderOp(_widget, _surface, _factor, Width, Height)); + _surface = null; + } } public IntPtr Address { get; } diff --git a/src/Gtk/Avalonia.Gtk3/Interop/CairoSurface.cs b/src/Gtk/Avalonia.Gtk3/Interop/CairoSurface.cs index 7838be9305..87a70c4d35 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/CairoSurface.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/CairoSurface.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Runtime.InteropServices; namespace Avalonia.Gtk3.Interop diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs b/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs index 1d057f525b..add4ba3c02 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/GlibPriority.cs @@ -22,23 +22,25 @@ namespace Avalonia.Gtk3.Interop if (prio == DispatcherPriority.Send) return High; if (prio == DispatcherPriority.Normal) - return Default - 4; + return Default; if (prio == DispatcherPriority.DataBind) - return Default - 3; + return Default + 1; + if (prio == DispatcherPriority.Layout) + return Default + 2; if (prio == DispatcherPriority.Render) - return Default -2; + return Default + 3; if (prio == DispatcherPriority.Loaded) - return Default - 1; + return GtkPaint + 20; if (prio == DispatcherPriority.Input) - return Default; + return GtkPaint + 21; if (prio == DispatcherPriority.Background) - return DefaultIdle; + return DefaultIdle + 1; if (prio == DispatcherPriority.ContextIdle) - return DefaultIdle + 100; + return DefaultIdle + 2; if (prio == DispatcherPriority.ApplicationIdle) - return DefaultIdle + 200; + return DefaultIdle + 3; if (prio == DispatcherPriority.SystemIdle) - return DefaultIdle + 200; + return DefaultIdle + 4; throw new ArgumentException("Unknown priority"); } diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs index 79b1cca92d..be886ea1c7 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using Avalonia.Threading; namespace Avalonia.Gtk3.Interop { @@ -33,7 +34,8 @@ namespace Avalonia.Gtk3.Interop public static void Add(int priority, uint interval, Func callback) { var handle = GCHandle.Alloc(callback); - Native.GTimeoutAdd(interval, PinnedHandler, GCHandle.ToIntPtr(handle)); + //Native.GTimeoutAdd(interval, PinnedHandler, GCHandle.ToIntPtr(handle)); + Native.GTimeoutAddFull(priority, interval, PinnedHandler, GCHandle.ToIntPtr(handle), IntPtr.Zero); } class Timer : IDisposable @@ -48,8 +50,10 @@ namespace Avalonia.Gtk3.Interop public static IDisposable StarTimer(uint interval, Action tick) { + if (interval == 0) + throw new ArgumentException("Don't know how to create a timer with zero or negative interval"); var timer = new Timer (); - GlibTimeout.Add(101, interval, + GlibTimeout.Add(GlibPriority.FromDispatcherPriority(DispatcherPriority.Background), interval, () => { if (timer.Stopped) diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index bc0b32bdfb..a6a08c3614 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -169,6 +169,9 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_surface_mark_dirty(CairoSurface surface); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_surface_write_to_png(CairoSurface surface, Utf8Buffer path); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_surface_flush(CairoSurface surface); @@ -178,15 +181,36 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_set_source_surface(IntPtr cr, CairoSurface surface, double x, double y); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_set_source_rgba(IntPtr cr, double r, double g, double b, double a); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_scale(IntPtr context, double sx, double sy); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_paint(IntPtr context); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_show_text(IntPtr context, Utf8Buffer text); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_set_font_size(IntPtr context, double size); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_select_font_face(IntPtr context, Utf8Buffer face, int slant, int weight); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_move_to(IntPtr context, double x, double y); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_destroy(IntPtr context); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] public delegate void gtk_widget_queue_draw_area(GtkWidget widget, int x, int y, int width, int height); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] + public delegate void gtk_widget_add_tick_callback(GtkWidget widget, TickCallback callback, IntPtr userData, IntPtr destroy); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] public delegate GtkImContext gtk_im_multicontext_new(); @@ -238,6 +262,12 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate void gdk_window_process_updates(IntPtr window, bool updateChildren); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_begin_paint_rect(IntPtr window, ref GdkRectangle rect); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_end_paint(IntPtr window); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate void gdk_event_request_motions(IntPtr ev); @@ -276,6 +306,9 @@ namespace Avalonia.Gtk3.Interop public delegate bool gdk_pixbuf_save_to_bufferv(Pixbuf pixbuf, out IntPtr buffer, out IntPtr buffer_size, Utf8Buffer type, IntPtr option_keys, IntPtr option_values, out IntPtr error); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate IntPtr gdk_cairo_create(IntPtr window); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gobject)] public delegate void g_object_unref(IntPtr instance); @@ -326,6 +359,11 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void GtkClipboardTextReceivedFunc(IntPtr clipboard, IntPtr utf8string, IntPtr userdata); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate bool TickCallback(IntPtr widget, IntPtr clock, IntPtr userdata); + + } public static D.gdk_display_get_n_screens GdkDisplayGetNScreens; @@ -380,6 +418,7 @@ namespace Avalonia.Gtk3.Interop public static D.gtk_widget_set_events GtkWidgetSetEvents; public static D.gdk_window_invalidate_rect GdkWindowInvalidateRect; public static D.gtk_widget_queue_draw_area GtkWidgetQueueDrawArea; + public static D.gtk_widget_add_tick_callback GtkWidgetAddTickCallback; public static D.gtk_widget_activate GtkWidgetActivate; public static D.gtk_clipboard_get_for_display GtkClipboardGetForDisplay; public static D.gtk_clipboard_request_text GtkClipboardRequestText; @@ -406,6 +445,9 @@ namespace Avalonia.Gtk3.Interop public static D.gdk_window_begin_resize_drag GdkWindowBeginResizeDrag; public static D.gdk_event_request_motions GdkEventRequestMotions; public static D.gdk_window_process_updates GdkWindowProcessUpdates; + public static D.gdk_window_begin_paint_rect GdkWindowBeginPaintRect; + public static D.gdk_window_end_paint GdkWindowEndPaint; + public static D.gdk_pixbuf_new_from_file GdkPixbufNewFromFile; public static D.gtk_icon_theme_get_default GtkIconThemeGetDefault; @@ -414,16 +456,24 @@ namespace Avalonia.Gtk3.Interop public static D.gdk_window_set_cursor GdkWindowSetCursor; public static D.gdk_pixbuf_new_from_stream GdkPixbufNewFromStream; public static D.gdk_pixbuf_save_to_bufferv GdkPixbufSaveToBufferv; - + public static D.gdk_cairo_create GdkCairoCreate; + public static D.cairo_image_surface_create CairoImageSurfaceCreate; public static D.cairo_image_surface_get_data CairoImageSurfaceGetData; public static D.cairo_image_surface_get_stride CairoImageSurfaceGetStride; public static D.cairo_surface_mark_dirty CairoSurfaceMarkDirty; + public static D.cairo_surface_write_to_png CairoSurfaceWriteToPng; public static D.cairo_surface_flush CairoSurfaceFlush; public static D.cairo_surface_destroy CairoSurfaceDestroy; public static D.cairo_set_source_surface CairoSetSourceSurface; + public static D.cairo_set_source_rgba CairoSetSourceRgba; public static D.cairo_scale CairoScale; public static D.cairo_paint CairoPaint; + public static D.cairo_show_text CairoShowText; + public static D.cairo_select_font_face CairoSelectFontFace; + public static D.cairo_set_font_size CairoSetFontSize; + public static D.cairo_move_to CairoMoveTo; + public static D.cairo_destroy CairoDestroy; } public enum GtkWindowType diff --git a/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs b/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs index 0f4fbd54bd..786c9a2cf0 100644 --- a/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/ScreenImpl.cs @@ -10,7 +10,7 @@ namespace Avalonia.Gtk3 { public int ScreenCount { - get => _allScreens.Length; + get => AllScreens.Length; } private Screen[] _allScreens; @@ -23,7 +23,7 @@ namespace Avalonia.Gtk3 IntPtr display = Native.GdkGetDefaultDisplay(); GdkScreen screen = Native.GdkDisplayGetDefaultScreen(display); short primary = Native.GdkScreenGetPrimaryMonitor(screen); - Screen[] screens = new Screen[ScreenCount]; + Screen[] screens = new Screen[Native.GdkScreenGetNMonitors(screen)]; for (short i = 0; i < screens.Length; i++) { GdkRectangle workArea = new GdkRectangle(), geometry = new GdkRectangle(); diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 32bd9f9157..ad96ee1f17 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -26,7 +26,9 @@ namespace Avalonia.Gtk3 private double _lastScaling; private uint _lastKbdEvent; private uint _lastSmoothScrollEvent; - private bool _hasDirtyRects; + private GCHandle _gcHandle; + private object _lock = new object(); + private IDeferredRenderOperation _nextRenderOperation; public WindowBaseImpl(GtkWindow gtkWidget) { @@ -52,11 +54,25 @@ namespace Avalonia.Gtk3 Connect("destroy", OnDestroy); Native.GtkWidgetRealize(gtkWidget); _lastSize = ClientSize; + GlibTimeout.Add(0, 16, () => + { + Invalidate(default(Rect)); + return true; + }); + if (Gtk3Platform.UseDeferredRendering) + { + Native.GtkWidgetSetDoubleBuffered(gtkWidget, false); + _gcHandle = GCHandle.Alloc(this); + Native.GtkWidgetAddTickCallback(GtkWidget, PinnedStaticCallback, GCHandle.ToIntPtr(_gcHandle), IntPtr.Zero); + + } } private bool OnConfigured(IntPtr gtkwidget, IntPtr ev, IntPtr userdata) { - var size = ClientSize; + int w, h; + Native.GtkWindowGetSize(GtkWidget, out w, out h); + var size = ClientSize = new Size(w, h); if (_lastSize != size) { Resized?.Invoke(size); @@ -224,13 +240,52 @@ namespace Avalonia.Gtk3 private bool OnDraw(IntPtr gtkwidget, IntPtr cairocontext, IntPtr userdata) { - _hasDirtyRects = false; - CurrentCairoContext = cairocontext; - Paint?.Invoke(new Rect(ClientSize)); - CurrentCairoContext = IntPtr.Zero; + if (!Gtk3Platform.UseDeferredRendering) + { + CurrentCairoContext = cairocontext; + Paint?.Invoke(new Rect(ClientSize)); + CurrentCairoContext = IntPtr.Zero; + } + return true; + } + + private static Native.D.TickCallback PinnedStaticCallback = StaticTickCallback; + + static bool StaticTickCallback(IntPtr widget, IntPtr clock, IntPtr userData) + { + var impl = (WindowBaseImpl) GCHandle.FromIntPtr(userData).Target; + impl.OnRenderTick(); return true; } + public void SetNextRenderOperation(IDeferredRenderOperation op) + { + lock (_lock) + { + _nextRenderOperation?.Dispose(); + _nextRenderOperation = op; + } + } + + private void OnRenderTick() + { + IDeferredRenderOperation op = null; + lock (_lock) + { + if (_nextRenderOperation != null) + { + op = _nextRenderOperation; + _nextRenderOperation = null; + } + } + if (op != null) + { + op?.RenderNow(); + op?.Dispose(); + } + } + + public void Dispose() { //We are calling it here, since signal handler will be detached @@ -239,6 +294,10 @@ namespace Avalonia.Gtk3 foreach(var d in Disposables.AsEnumerable().Reverse()) d.Dispose(); Disposables.Clear(); + if (_gcHandle.IsAllocated) + { + _gcHandle.Free(); + } } public Size MaxClientSize @@ -273,20 +332,8 @@ namespace Avalonia.Gtk3 { if(GtkWidget.IsClosed) return; - Native.GtkWidgetQueueDrawArea(GtkWidget, (int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height); - if (!_hasDirtyRects) - { - _hasDirtyRects = true; - Dispatcher.UIThread.InvokeAsync(() => - { - if (GtkWidget.IsClosed) - return; - var window = Native.GtkWidgetGetWindow(GtkWidget); - if (window == IntPtr.Zero) - return; - Native.GdkWindowProcessUpdates(window, false); - }, DispatcherPriority.Render); - } + var s = ClientSize; + Native.GtkWidgetQueueDrawArea(GtkWidget, 0, 0, (int) s.Width, (int) s.Height); } public void SetInputRoot(IInputRoot inputRoot) => _inputRoot = inputRoot; @@ -339,17 +386,7 @@ namespace Avalonia.Gtk3 } - public Size ClientSize - { - get - { - if (GtkWidget.IsClosed) - return new Size(); - int w, h; - Native.GtkWindowGetSize(GtkWidget, out w, out h); - return new Size(w, h); - } - } + public Size ClientSize { get; private set; } public void Resize(Size value) { @@ -376,7 +413,10 @@ namespace Avalonia.Gtk3 public IRenderer CreateRenderer(IRenderRoot root) { - return new ImmediateRenderer(root); + var loop = AvaloniaLocator.Current.GetService(); + return Gtk3Platform.UseDeferredRendering + ? (IRenderer) new DeferredRenderer(root, loop) + : new ImmediateRenderer(root); } } } From 3d3d4528f6be10d48eee09bff667ed6d0f549bdf Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 1 Oct 2017 15:09:03 +0300 Subject: [PATCH 29/44] Burn, baby, BURN! --- Avalonia.sln | 168 ------- packages.cake | 52 +-- samples/BindingTest/BindingTest.csproj | 8 - .../ControlCatalog.Desktop.csproj | 8 - samples/ControlCatalog/Program.cs | 126 ------ samples/RenderTest/RenderTest.csproj | 8 - .../VirtualizationTest.csproj | 8 - samples/interop/GtkInteropDemo/App.config | 6 - .../GtkInteropDemo/GtkInteropDemo.csproj | 154 ------- samples/interop/GtkInteropDemo/MainWindow.cs | 30 -- samples/interop/GtkInteropDemo/Program.cs | 24 - .../GtkInteropDemo/Properties/AssemblyInfo.cs | 36 -- .../Properties/Resources.Designer.cs | 71 --- .../GtkInteropDemo/Properties/Resources.resx | 117 ----- .../Properties/Settings.Designer.cs | 30 -- .../Properties/Settings.settings | 7 - .../Properties/AssemblyInfo.cs | 1 - src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj | 109 ----- src/Gtk/Avalonia.Cairo/CairoExtensions.cs | 64 --- src/Gtk/Avalonia.Cairo/CairoPlatform.cs | 112 ----- src/Gtk/Avalonia.Cairo/Media/BrushImpl.cs | 17 - .../Avalonia.Cairo/Media/DrawingContext.cs | 415 ------------------ .../Avalonia.Cairo/Media/FormattedTextImpl.cs | 146 ------ .../Avalonia.Cairo/Media/ImageBrushImpl.cs | 56 --- .../Media/Imaging/BitmapImpl.cs | 35 -- .../Media/Imaging/RenderTargetBitmapImpl.cs | 58 --- .../Media/LinearGradientBrushImpl.cs | 23 - .../Media/RadialGradientBrushImpl.cs | 27 -- .../Media/SolidColorBrushImpl.cs | 22 - .../Media/StreamGeometryContextImpl.cs | 124 ------ .../Media/StreamGeometryImpl.cs | 86 ---- .../Avalonia.Cairo/Properties/AssemblyInfo.cs | 25 -- src/Gtk/Avalonia.Cairo/RenderTarget.cs | 58 --- src/Gtk/Avalonia.Cairo/app.config | 11 - src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj | 105 ----- src/Gtk/Avalonia.Gtk/ClipboardImpl.cs | 42 -- src/Gtk/Avalonia.Gtk/CursorFactory.cs | 85 ---- src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs | 42 -- .../Embedding/GtkAvaloniaControlHost.cs | 77 ---- src/Gtk/Avalonia.Gtk/FramebufferManager.cs | 40 -- src/Gtk/Avalonia.Gtk/GtkExtensions.cs | 15 - src/Gtk/Avalonia.Gtk/GtkPlatform.cs | 140 ------ src/Gtk/Avalonia.Gtk/IconImpl.cs | 27 -- .../Avalonia.Gtk/Input/GtkKeyboardDevice.cs | 18 - src/Gtk/Avalonia.Gtk/Input/GtkMouseDevice.cs | 29 -- src/Gtk/Avalonia.Gtk/MyClass.cs | 12 - src/Gtk/Avalonia.Gtk/PopupImpl.cs | 16 - .../Avalonia.Gtk/Properties/AssemblyInfo.cs | 15 - src/Gtk/Avalonia.Gtk/ScreenImpl.cs | 42 -- src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs | 55 --- src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs | 88 ---- src/Gtk/Avalonia.Gtk/TopLevelImpl.cs | 320 -------------- src/Gtk/Avalonia.Gtk/WindowImpl.cs | 136 ------ src/Gtk/Avalonia.Gtk/Windows.cs | 91 ---- src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj | 4 +- .../KeyTransform.cs | 5 +- .../Avalonia.Win32.Interop.csproj | 4 - .../AppBuilderTests.cs | 4 +- .../Avalonia.Cairo.RenderTests.csproj | 105 ----- .../Avalonia.Direct2D1.RenderTests.csproj | 3 - .../Controls/BorderTests.cs | 37 +- .../Controls/CustomRenderTests.cs | 4 +- .../Controls/ImageTests.cs | 4 +- .../Controls/TextBlockTests.cs | 4 +- .../GeometryClippingTests.cs | 4 +- .../Avalonia.RenderTests/Media/BitmapTests.cs | 8 +- .../Media/FormattedTextImplTests.cs | 45 +- .../Media/ImageBrushTests.cs | 15 +- .../Media/LinearGradientBrushTests.cs | 4 +- .../Media/RadialGradientBrushTests.cs | 4 +- .../Media/VisualBrushTests.cs | 42 +- .../Avalonia.RenderTests/OpacityMaskTests.cs | 4 +- .../Shapes/EllipseTests.cs | 4 +- .../Avalonia.RenderTests/Shapes/LineTests.cs | 16 +- .../Avalonia.RenderTests/Shapes/PathTests.cs | 67 +-- .../Shapes/PolygonTests.cs | 14 +- .../Shapes/PolylineTests.cs | 14 +- .../Shapes/RectangleTests.cs | 4 +- tests/Avalonia.RenderTests/TestBase.cs | 12 +- tests/Avalonia.RenderTests/app.config | 23 - .../Border/Border_1px_Border.expected.png | Bin 609 -> 0 bytes .../Border/Border_2px_Border.expected.png | Bin 611 -> 0 bytes .../Border_Bottom_Aligns_Content.expected.png | Bin 761 -> 0 bytes .../Border_Brush_Offsets_Content.expected.png | Bin 615 -> 0 bytes ..._Centers_Content_Horizontally.expected.png | Bin 760 -> 0 bytes ...er_Centers_Content_Vertically.expected.png | Bin 771 -> 0 bytes .../Controls/Border/Border_Fill.expected.png | Bin 601 -> 0 bytes .../Border_Left_Aligns_Content.expected.png | Bin 743 -> 0 bytes ...Border_Margin_Offsets_Content.expected.png | Bin 640 -> 0 bytes .../Border/Border_Nested_Rotate.expected.png | Bin 1405 -> 0 bytes ...order_Padding_Offsets_Content.expected.png | Bin 640 -> 0 bytes .../Border_Right_Aligns_Content.expected.png | Bin 734 -> 0 bytes ...tretches_Content_Horizontally.expected.png | Bin 793 -> 0 bytes ..._Stretches_Content_Vertically.expected.png | Bin 793 -> 0 bytes .../Border_Top_Aligns_Content.expected.png | Bin 758 -> 0 bytes .../Controls/CustomRender/Clip.expected.png | Bin 807 -> 0 bytes .../CustomRender/GeometryClip.expected.png | Bin 3871 -> 0 bytes .../CustomRender/Opacity.expected.png | Bin 988 -> 0 bytes .../CustomRender/OpacityMask.expected.png | Bin 5622 -> 0 bytes .../Image/Image_Stretch_Fill.expected.png | Bin 7705 -> 0 bytes .../Image/Image_Stretch_None.expected.png | Bin 3320 -> 0 bytes .../Image/Image_Stretch_Uniform.expected.png | Bin 6939 -> 0 bytes .../Image_Stretch_UniformToFill.expected.png | Bin 7542 -> 0 bytes tests/TestFiles/Cairo/Controls/Image/test.png | Bin 17223 -> 0 bytes .../Geometry_Clip_Clips_Path.expected.png | Bin 692 -> 0 bytes .../ImageBrush_Fill_NoTile.expected.png | Bin 118742 -> 0 bytes ..._NoStretch_FlipXY_TopLeftDest.expected.png | Bin 3242 -> 0 bytes ...h_NoStretch_FlipX_TopLeftDest.expected.png | Bin 3612 -> 0 bytes ...h_NoStretch_FlipY_TopLeftDest.expected.png | Bin 2767 -> 0 bytes ..._NoTile_Alignment_BottomRight.expected.png | Bin 3085 -> 0 bytes ...retch_NoTile_Alignment_Center.expected.png | Bin 4712 -> 0 bytes ...etch_NoTile_Alignment_TopLeft.expected.png | Bin 3611 -> 0 bytes ...NoTile_BottomRightQuarterDest.expected.png | Bin 1421 -> 0 bytes ...Tile_BottomRightQuarterSource.expected.png | Bin 3528 -> 0 bytes ...Source_BottomRightQuarterDest.expected.png | Bin 930 -> 0 bytes ...arterSource_CenterQuarterDest.expected.png | Bin 1795 -> 0 bytes .../ImageBrush_Tile_Fill.expected.png | Bin 3945 -> 0 bytes .../ImageBrush_Tile_Small_Image.expected.png | Bin 1483 -> 0 bytes ...ImageBrush_Tile_UniformToFill.expected.png | Bin 2340 -> 0 bytes ...ageBrush_UniformToFill_NoTile.expected.png | Bin 14445 -> 0 bytes .../ImageBrush_Uniform_NoTile.expected.png | Bin 11325 -> 0 bytes .../Cairo/Media/ImageBrush/github_icon.png | Bin 17661 -> 0 bytes .../Media/ImageBrush/github_icon_small.png | Bin 928 -> 0 bytes ...Brush_RedBlue_Horizontal_Fill.expected.png | Bin 611 -> 0 bytes ...ntBrush_RedBlue_Vertical_Fill.expected.png | Bin 653 -> 0 bytes .../RadialGradientBrush_RedBlue.expected.png | Bin 7985 -> 0 bytes .../VisualBrush_Fill_NoTile.expected.png | Bin 116569 -> 0 bytes ..._NoStretch_FlipXY_TopLeftDest.expected.png | Bin 5039 -> 0 bytes ...h_NoStretch_FlipX_TopLeftDest.expected.png | Bin 6569 -> 0 bytes ...h_NoStretch_FlipY_TopLeftDest.expected.png | Bin 4667 -> 0 bytes ..._NoTile_Alignment_BottomRight.expected.png | Bin 3085 -> 0 bytes ...retch_NoTile_Alignment_Center.expected.png | Bin 5526 -> 0 bytes ...etch_NoTile_Alignment_TopLeft.expected.png | Bin 3611 -> 0 bytes ...NoTile_BottomRightQuarterDest.expected.png | Bin 2007 -> 0 bytes ...Tile_BottomRightQuarterSource.expected.png | Bin 3528 -> 0 bytes ...Source_BottomRightQuarterDest.expected.png | Bin 930 -> 0 bytes ...arterSource_CenterQuarterDest.expected.png | Bin 1795 -> 0 bytes ...ualBrush_UniformToFill_NoTile.expected.png | Bin 14732 -> 0 bytes .../VisualBrush_Uniform_NoTile.expected.png | Bin 11472 -> 0 bytes .../Cairo/Media/VisualBrush/github_icon.png | Bin 17661 -> 0 bytes .../Opacity_Mask_Masks_Element.expected.png | Bin 846 -> 0 bytes .../Ellipse/Circle_1px_Stroke.expected.png | Bin 3323 -> 0 bytes .../Shapes/Line/Line_1px_Stroke.expected.png | Bin 624 -> 0 bytes .../Line_1px_Stroke_Reversed.expected.png | Bin 629 -> 0 bytes .../Line_1px_Stroke_Vertical.expected.png | Bin 621 -> 0 bytes .../Shapes/Path/Arc_Absolute.expected.png | Bin 3229 -> 0 bytes .../Shapes/Path/Arc_Relative.expected.png | Bin 3229 -> 0 bytes .../Path/CubicBezier_Absolute.expected.png | Bin 4474 -> 0 bytes .../Path/CubicBezier_Relative.expected.png | Bin 4474 -> 0 bytes .../Path/HorizontalLine_Absolute.expected.png | Bin 288 -> 0 bytes .../Path/HorizontalLine_Relative.expected.png | Bin 288 -> 0 bytes .../Shapes/Path/Line_Absolute.expected.png | Bin 615 -> 0 bytes .../Path_100px_Triangle_Centered.expected.png | Bin 1213 -> 0 bytes .../Path_Expander_With_Border.expected.png | Bin 1281 -> 0 bytes .../Shapes/Path/Path_Tick_Scaled.expected.png | Bin 6192 -> 0 bytes .../Path_Tick_Scaled_Stroke_8px.expected.png | Bin 6459 -> 0 bytes .../Path/VerticalLine_Absolute.expected.png | Bin 593 -> 0 bytes .../Path/VerticalLine_Relative.expected.png | Bin 610 -> 0 bytes .../Polygon/Polygon_1px_Stroke.expected.png | Bin 5142 -> 0 bytes .../Polygon_NonUniformFill.expected.png | Bin 8742 -> 0 bytes ...yline_10px_Stroke_PenLineJoin.expected.png | Bin 3942 -> 0 bytes .../Polyline/Polyline_1px_Stroke.expected.png | Bin 1604 -> 0 bytes .../Rectangle_1px_Stroke.expected.png | Bin 609 -> 0 bytes .../Rectangle_2px_Stroke.expected.png | Bin 611 -> 0 bytes .../Rectangle_Stroke_Fill.expected.png | Bin 615 -> 0 bytes ...ngle_Stroke_Fill_ClipToBounds.expected.png | Bin 615 -> 0 bytes 166 files changed, 65 insertions(+), 4026 deletions(-) delete mode 100644 samples/ControlCatalog/Program.cs delete mode 100644 samples/interop/GtkInteropDemo/App.config delete mode 100644 samples/interop/GtkInteropDemo/GtkInteropDemo.csproj delete mode 100644 samples/interop/GtkInteropDemo/MainWindow.cs delete mode 100644 samples/interop/GtkInteropDemo/Program.cs delete mode 100644 samples/interop/GtkInteropDemo/Properties/AssemblyInfo.cs delete mode 100644 samples/interop/GtkInteropDemo/Properties/Resources.Designer.cs delete mode 100644 samples/interop/GtkInteropDemo/Properties/Resources.resx delete mode 100644 samples/interop/GtkInteropDemo/Properties/Settings.Designer.cs delete mode 100644 samples/interop/GtkInteropDemo/Properties/Settings.settings delete mode 100644 src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj delete mode 100644 src/Gtk/Avalonia.Cairo/CairoExtensions.cs delete mode 100644 src/Gtk/Avalonia.Cairo/CairoPlatform.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/BrushImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/Imaging/BitmapImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/SolidColorBrushImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/StreamGeometryContextImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Media/StreamGeometryImpl.cs delete mode 100644 src/Gtk/Avalonia.Cairo/Properties/AssemblyInfo.cs delete mode 100644 src/Gtk/Avalonia.Cairo/RenderTarget.cs delete mode 100644 src/Gtk/Avalonia.Cairo/app.config delete mode 100644 src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj delete mode 100644 src/Gtk/Avalonia.Gtk/ClipboardImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/CursorFactory.cs delete mode 100644 src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs delete mode 100644 src/Gtk/Avalonia.Gtk/FramebufferManager.cs delete mode 100644 src/Gtk/Avalonia.Gtk/GtkExtensions.cs delete mode 100644 src/Gtk/Avalonia.Gtk/GtkPlatform.cs delete mode 100644 src/Gtk/Avalonia.Gtk/IconImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/Input/GtkKeyboardDevice.cs delete mode 100644 src/Gtk/Avalonia.Gtk/Input/GtkMouseDevice.cs delete mode 100644 src/Gtk/Avalonia.Gtk/MyClass.cs delete mode 100644 src/Gtk/Avalonia.Gtk/PopupImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/Properties/AssemblyInfo.cs delete mode 100644 src/Gtk/Avalonia.Gtk/ScreenImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs delete mode 100644 src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/TopLevelImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/WindowImpl.cs delete mode 100644 src/Gtk/Avalonia.Gtk/Windows.cs rename src/Gtk/{Avalonia.Gtk => Avalonia.Gtk3}/KeyTransform.cs (99%) delete mode 100644 tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj delete mode 100644 tests/Avalonia.RenderTests/app.config delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_1px_Border.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_2px_Border.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Bottom_Aligns_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Brush_Offsets_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Horizontally.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Vertically.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Fill.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Left_Aligns_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Margin_Offsets_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Nested_Rotate.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Padding_Offsets_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Right_Aligns_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Horizontally.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Vertically.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Border/Border_Top_Aligns_Content.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/CustomRender/Clip.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/CustomRender/GeometryClip.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/CustomRender/Opacity.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/CustomRender/OpacityMask.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Image/Image_Stretch_Fill.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Image/Image_Stretch_None.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Image/Image_Stretch_Uniform.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Image/Image_Stretch_UniformToFill.expected.png delete mode 100644 tests/TestFiles/Cairo/Controls/Image/test.png delete mode 100644 tests/TestFiles/Cairo/GeometryClipping/Geometry_Clip_Clips_Path.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Fill_NoTile.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_FlipXY_TopLeftDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_FlipX_TopLeftDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_FlipY_TopLeftDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_Center.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_Fill.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_Small_Image.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_UniformToFill.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_UniformToFill_NoTile.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/github_icon.png delete mode 100644 tests/TestFiles/Cairo/Media/ImageBrush/github_icon_small.png delete mode 100644 tests/TestFiles/Cairo/Media/LinearGradientBrush/LinearGradientBrush_RedBlue_Horizontal_Fill.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/LinearGradientBrush/LinearGradientBrush_RedBlue_Vertical_Fill.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/RadialGradientBrush/RadialGradientBrush_RedBlue.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_FlipXY_TopLeftDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_FlipY_TopLeftDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_Uniform_NoTile.expected.png delete mode 100644 tests/TestFiles/Cairo/Media/VisualBrush/github_icon.png delete mode 100644 tests/TestFiles/Cairo/OpacityMask/Opacity_Mask_Masks_Element.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Ellipse/Circle_1px_Stroke.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke_Reversed.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke_Vertical.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Arc_Absolute.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Arc_Relative.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/CubicBezier_Absolute.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/CubicBezier_Relative.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/HorizontalLine_Absolute.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/HorizontalLine_Relative.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Line_Absolute.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Path_100px_Triangle_Centered.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Path_Expander_With_Border.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled_Stroke_8px.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/VerticalLine_Absolute.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Path/VerticalLine_Relative.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Polygon/Polygon_1px_Stroke.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Polygon/Polygon_NonUniformFill.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Polyline/Polyline_10px_Stroke_PenLineJoin.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Polyline/Polyline_1px_Stroke.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_1px_Stroke.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_2px_Stroke.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill.expected.png delete mode 100644 tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill_ClipToBounds.expected.png diff --git a/Avalonia.sln b/Avalonia.sln index 56f33c2a6b..d17bb2ed97 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -50,8 +50,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Input.UnitTests", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Direct2D1.UnitTests", "tests\Avalonia.Direct2D1.UnitTests\Avalonia.Direct2D1.UnitTests.csproj", "{EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Cairo.RenderTests", "tests\Avalonia.RenderTests\Avalonia.Cairo.RenderTests.csproj", "{E106CF37-4066-4615-B684-172A6D30B058}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup.Xaml.UnitTests", "tests\Avalonia.Markup.Xaml.UnitTests\Avalonia.Markup.Xaml.UnitTests.csproj", "{99135EAB-653D-47E4-A378-C96E1278CA44}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Markup", "Markup", "{8B6A8209-894F-4BA1-B880-965FD453982C}" @@ -67,10 +65,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A689DE EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gtk", "Gtk", "{B9894058-278A-46B5-B6ED-AD613FCC03B3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Gtk", "src\Gtk\Avalonia.Gtk\Avalonia.Gtk.csproj", "{54F237D5-A70A-4752-9656-0C70B1A7B047}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Cairo", "src\Gtk\Avalonia.Cairo\Avalonia.Cairo.csproj", "{FB05AC90-89BA-4F2F-A924-F37875FB547C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI", "src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj", "{6417B24E-49C2-4985-8DB2-3AB9D898EC91}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.HtmlRenderer", "src\Avalonia.HtmlRenderer\Avalonia.HtmlRenderer.csproj", "{5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}" @@ -127,8 +121,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{A0CC EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsInteropTest", "samples\interop\WindowsInteropTest\WindowsInteropTest.csproj", "{C7A69145-60B6-4882-97D6-A3921DD43978}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GtkInteropDemo", "samples\interop\GtkInteropDemo\GtkInteropDemo.csproj", "{BD7F352C-6DC1-4740-BAF2-2D34A038728C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DotNetFrameworkRuntime", "src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj", "{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RenderTest", "samples\RenderTest\RenderTest.csproj", "{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}" @@ -204,9 +196,7 @@ Global src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{811a76cf-1cf6-440f-963b-bbe31bd72a82}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{dabfd304-d6a4-4752-8123-c2ccf7ac7831}*SharedItemsImports = 4 - tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{e106cf37-4066-4615-b684-172a6d30b058}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{e4d9629c-f168-4224-3f51-a5e482ffbc42}*SharedItemsImports = 13 - src\Shared\RenderHelpers\RenderHelpers.projitems*{fb05ac90-89ba-4f2f-a924-f37875fb547c}*SharedItemsImports = 4 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1053,44 +1043,6 @@ Global {EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8}.Release|Mono.ActiveCfg = Release|Any CPU {EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8}.Release|x86.ActiveCfg = Release|Any CPU {EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8}.Release|x86.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|Any CPU.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|iPhone.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|Mono.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|x86.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.AppStore|x86.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|iPhone.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|Mono.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|Mono.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|x86.ActiveCfg = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Debug|x86.Build.0 = Debug|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|Any CPU.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|iPhone.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|iPhone.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|Mono.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|Mono.Build.0 = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|x86.ActiveCfg = Release|Any CPU - {E106CF37-4066-4615-B684-172A6D30B058}.Release|x86.Build.0 = Release|Any CPU {99135EAB-653D-47E4-A378-C96E1278CA44}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU {99135EAB-653D-47E4-A378-C96E1278CA44}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU {99135EAB-653D-47E4-A378-C96E1278CA44}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU @@ -1167,82 +1119,6 @@ Global {3E53A01A-B331-47F3-B828-4A5717E77A24}.Release|Mono.Build.0 = Release|Any CPU {3E53A01A-B331-47F3-B828-4A5717E77A24}.Release|x86.ActiveCfg = Release|Any CPU {3E53A01A-B331-47F3-B828-4A5717E77A24}.Release|x86.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|Any CPU.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|iPhone.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|Mono.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|x86.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.AppStore|x86.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|Any CPU.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|iPhone.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|Mono.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|Mono.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|x86.ActiveCfg = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Debug|x86.Build.0 = Debug|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|Any CPU.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|Any CPU.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|iPhone.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|iPhone.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|Mono.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|Mono.Build.0 = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|x86.ActiveCfg = Release|Any CPU - {54F237D5-A70A-4752-9656-0C70B1A7B047}.Release|x86.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|Any CPU.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|iPhone.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|Mono.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|x86.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.AppStore|x86.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|iPhone.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|Mono.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|Mono.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|x86.ActiveCfg = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Debug|x86.Build.0 = Debug|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|Any CPU.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|iPhone.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|iPhone.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|Mono.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|Mono.Build.0 = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|x86.ActiveCfg = Release|Any CPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C}.Release|x86.Build.0 = Release|Any CPU {6417B24E-49C2-4985-8DB2-3AB9D898EC91}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU {6417B24E-49C2-4985-8DB2-3AB9D898EC91}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU {6417B24E-49C2-4985-8DB2-3AB9D898EC91}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU @@ -1985,46 +1861,6 @@ Global {C7A69145-60B6-4882-97D6-A3921DD43978}.Release|Mono.ActiveCfg = Release|Any CPU {C7A69145-60B6-4882-97D6-A3921DD43978}.Release|x86.ActiveCfg = Release|Any CPU {C7A69145-60B6-4882-97D6-A3921DD43978}.Release|x86.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|Mono.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|Mono.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Ad-Hoc|x86.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|Any CPU.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|iPhone.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|Mono.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|Mono.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|x86.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.AppStore|x86.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|iPhone.Build.0 = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|Mono.ActiveCfg = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|Mono.Build.0 = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|x86.ActiveCfg = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Debug|x86.Build.0 = Debug|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|Any CPU.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|iPhone.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|iPhone.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|Mono.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|Mono.Build.0 = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|x86.ActiveCfg = Release|Any CPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C}.Release|x86.Build.0 = Release|Any CPU {4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU {4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU {4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU @@ -2576,11 +2412,8 @@ Global {DABFD304-D6A4-4752-8123-C2CCF7AC7831} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} {AC18926A-E784-40FE-B09D-BB0FE2B599F0} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} {EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} - {E106CF37-4066-4615-B684-172A6D30B058} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} {99135EAB-653D-47E4-A378-C96E1278CA44} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} {3E53A01A-B331-47F3-B828-4A5717E77A24} = {8B6A8209-894F-4BA1-B880-965FD453982C} - {54F237D5-A70A-4752-9656-0C70B1A7B047} = {B9894058-278A-46B5-B6ED-AD613FCC03B3} - {FB05AC90-89BA-4F2F-A924-F37875FB547C} = {B9894058-278A-46B5-B6ED-AD613FCC03B3} {E4D9629C-F168-4224-3F51-A5E482FFBC42} = {A689DEF5-D50F-4975-8B72-124C9EB54066} {6417E941-21BC-467B-A771-0DE389353CE6} = {8B6A8209-894F-4BA1-B880-965FD453982C} {8EF392D5-1416-45AA-9956-7CBBC3229E8A} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} @@ -2602,7 +2435,6 @@ Global {FBCAF3D0-2808-4934-8E96-3F607594517B} = {9B9E3891-2366-4253-A952-D08BCEB71098} {A0CC0258-D18C-4AB3-854F-7101680FC3F9} = {9B9E3891-2366-4253-A952-D08BCEB71098} {C7A69145-60B6-4882-97D6-A3921DD43978} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9} - {BD7F352C-6DC1-4740-BAF2-2D34A038728C} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9} {F1FDC5B0-4654-416F-AE69-E3E9BBD87801} = {9B9E3891-2366-4253-A952-D08BCEB71098} {29132311-1848-4FD6-AE0C-4FF841151BD3} = {9B9E3891-2366-4253-A952-D08BCEB71098} {9DEFC6B7-845B-4D8F-AFC0-D32BF0032B8C} = {B39A8919-9F95-48FE-AD7B-76E08B509888} diff --git a/packages.cake b/packages.cake index 7ada627200..a22ff65e72 100644 --- a/packages.cake +++ b/packages.cake @@ -375,23 +375,6 @@ public class Packages OutputDirectory = parameters.NugetRoot }, /////////////////////////////////////////////////////////////////////////////// - // Avalonia.Gtk - /////////////////////////////////////////////////////////////////////////////// - new NuGetPackSettings() - { - Id = "Avalonia.Gtk", - Dependencies = new [] - { - new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } - }, - Files = new [] - { - new NuSpecContent { Source = "Avalonia.Gtk.dll", Target = "lib/net45" } - }, - BasePath = context.Directory("./src/Gtk/Avalonia.Gtk/bin/" + parameters.DirSuffix), - OutputDirectory = parameters.NugetRoot - }, - /////////////////////////////////////////////////////////////////////////////// // Avalonia.Gtk3 /////////////////////////////////////////////////////////////////////////////// new NuGetPackSettings() @@ -409,23 +392,6 @@ public class Packages OutputDirectory = parameters.NugetRoot }, /////////////////////////////////////////////////////////////////////////////// - // Avalonia.Cairo - /////////////////////////////////////////////////////////////////////////////// - new NuGetPackSettings() - { - Id = "Avalonia.Cairo", - Dependencies = new [] - { - new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } - }, - Files = new [] - { - new NuSpecContent { Source = "Avalonia.Cairo.dll", Target = "lib/net45" } - }, - BasePath = context.Directory("./src/Gtk/Avalonia.Cairo/bin/" + parameters.DirSuffix), - OutputDirectory = parameters.NugetRoot - }, - /////////////////////////////////////////////////////////////////////////////// // Avalonia.Skia /////////////////////////////////////////////////////////////////////////////// new NuGetPackSettings() @@ -471,19 +437,11 @@ public class Packages Id = "Avalonia.Desktop", Dependencies = new [] { - //Full .NET - new NuSpecDependency() { Id = "Avalonia.Direct2D1", TargetFramework="net45", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Gtk", TargetFramework="net45", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Cairo", TargetFramework="net45", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Win32", TargetFramework="net45", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Skia", TargetFramework="net45", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Gtk3", TargetFramework="net45", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.MonoMac", TargetFramework="net45", Version = parameters.Version }, - //.NET Core - new NuSpecDependency() { Id = "Avalonia.Win32", TargetFramework="netcoreapp2.0", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Skia", TargetFramework="netcoreapp2.0", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.Gtk3", TargetFramework="netcoreapp2.0", Version = parameters.Version }, - new NuSpecDependency() { Id = "Avalonia.MonoMac", TargetFramework="netcoreapp2.0", Version = parameters.Version } + new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version }, + new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version }, + new NuSpecDependency() { Id = "Avalonia.Skia", Version = parameters.Version }, + new NuSpecDependency() { Id = "Avalonia.Gtk3", Version = parameters.Version }, + new NuSpecDependency() { Id = "Avalonia.MonoMac", Version = parameters.Version } }, Files = new NuSpecContent[] { diff --git a/samples/BindingTest/BindingTest.csproj b/samples/BindingTest/BindingTest.csproj index b4dd17194b..d7d349fbdf 100644 --- a/samples/BindingTest/BindingTest.csproj +++ b/samples/BindingTest/BindingTest.csproj @@ -148,14 +148,6 @@ {811a76cf-1cf6-440f-963b-bbe31bd72a82} Avalonia.Win32 - - {54F237D5-A70A-4752-9656-0C70B1A7B047} - Avalonia.Gtk - - - {FB05AC90-89BA-4F2F-A924-F37875FB547C} - Avalonia.Cairo - diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj index 91d24f9152..3f4679086e 100644 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj +++ b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj @@ -63,18 +63,10 @@ {4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0} Avalonia.DotNetFrameworkRuntime - - {FB05AC90-89BA-4F2F-A924-F37875FB547C} - Avalonia.Cairo - {bb1f7bb5-6ad4-4776-94d9-c09d0a972658} Avalonia.Gtk3 - - {54F237D5-A70A-4752-9656-0C70B1A7B047} - Avalonia.Gtk - {3E53A01A-B331-47F3-B828-4A5717E77A24} Avalonia.Markup.Xaml diff --git a/samples/ControlCatalog/Program.cs b/samples/ControlCatalog/Program.cs deleted file mode 100644 index f975b91834..0000000000 --- a/samples/ControlCatalog/Program.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Avalonia.Logging.Serilog; -using Serilog; -using System; -using System.Linq; -using Avalonia; - -namespace ControlCatalog -{ - internal class Program - { - static void Main(string[] args) - { - InitializeLogging(); - - new App() - .ConfigureRenderSystem(args) - .LoadFromXaml() - .RunWithMainWindow(); - } - - // This will be made into a runtime configuration extension soon! - private static void InitializeLogging() - { -#if DEBUG - SerilogLogger.Initialize(new LoggerConfiguration() - .MinimumLevel.Warning() - .WriteTo.Trace(outputTemplate: "{Area}: {Message}") - .CreateLogger()); -#endif - } - - } - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Experimental: Would like to move this into a shared location once I figure out the best place for it - // considering all common libraries are PCL and do not have access to Environment.OSVersion.Platform - // nor do they have access to the platform specific render/subsystem extensions. - // - // Perhaps via DI we register each system with a priority/rank - // - public static class RenderSystemExtensions - { - [Flags] - enum RenderSystem - { - None = 0, - GTK = 1, - Skia = 2, - Direct2D = 4 - }; - - /// - /// Default (Optimal) render system for a particular platform - /// - /// - private static RenderSystem DefaultRenderSystem() - { - switch (Environment.OSVersion.Platform) - { - case PlatformID.MacOSX: - return RenderSystem.GTK; - - case PlatformID.Unix: - return RenderSystem.GTK; - - case PlatformID.Win32Windows: - return RenderSystem.Direct2D; - } - - return RenderSystem.None; - } - - /// - /// Returns an array of avalidable rendering systems in priority order - /// - /// - private static RenderSystem[] AvailableRenderSystems() - { - switch (Environment.OSVersion.Platform) - { - case PlatformID.MacOSX: - return new RenderSystem[] { RenderSystem.GTK, RenderSystem.Skia }; - - case PlatformID.Unix: - return new RenderSystem[] { RenderSystem.GTK, RenderSystem.Skia }; - - case PlatformID.Win32Windows: - return new RenderSystem[] { RenderSystem.Direct2D, RenderSystem.Skia, RenderSystem.GTK }; - } - - return new RenderSystem[0]; - } - - /// - /// Selects the optimal render system for desktop platforms. Supports cmd line overrides - /// - /// - /// - public static TApp ConfigureRenderSystem(this TApp app, string[] args) where TApp : Application - { - // So this all works great under Windows where it can support - // ALL configurations. But on OSX/Unix we cannot use Direct2D - // - if (args.Contains("--gtk") || DefaultRenderSystem() == RenderSystem.GTK) - { - app.UseGtk(); - app.UseCairo(); - } - else - { - app.UseWin32(); - - if (args.Contains("--skia") || DefaultRenderSystem() == RenderSystem.Skia) - { - app.UseSkia(); - } - else - { - app.UseDirect2D(); - } - } - - return app; - } - } -} diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index 974b8802ac..0141ad29c6 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -132,14 +132,6 @@ {3e10a5fa-e8da-48b1-ad44-6a5b6cb7750f} Avalonia.Themes.Default - - {fb05ac90-89ba-4f2f-a924-f37875fb547c} - Avalonia.Cairo - - - {54f237d5-a70a-4752-9656-0c70b1a7b047} - Avalonia.Gtk - {3e53a01a-b331-47f3-b828-4a5717e77a24} Avalonia.Markup.Xaml diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationTest/VirtualizationTest.csproj index 9d31a6cb86..58775926cc 100644 --- a/samples/VirtualizationTest/VirtualizationTest.csproj +++ b/samples/VirtualizationTest/VirtualizationTest.csproj @@ -134,14 +134,6 @@ {811a76cf-1cf6-440f-963b-bbe31bd72a82} Avalonia.Win32 - - {FB05AC90-89BA-4F2F-A924-F37875FB547C} - Avalonia.Cairo - - - {54F237D5-A70A-4752-9656-0C70B1A7B047} - Avalonia.Gtk - diff --git a/samples/interop/GtkInteropDemo/App.config b/samples/interop/GtkInteropDemo/App.config deleted file mode 100644 index 8324aa6ff1..0000000000 --- a/samples/interop/GtkInteropDemo/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj deleted file mode 100644 index 8382426620..0000000000 --- a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj +++ /dev/null @@ -1,154 +0,0 @@ - - - - - Debug - AnyCPU - {BD7F352C-6DC1-4740-BAF2-2D34A038728C} - WinExe - Properties - GtkInteropDemo - GtkInteropDemo - v4.6.1 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - {d211e587-d8bc-45b9-95a4-f297c8fa5200} - Avalonia.Animation - - - {b09b78d8-9b26-48b0-9149-d64a2f120f3f} - Avalonia.Base - - - {d2221c82-4a25-4583-9b43-d791e3f6820c} - Avalonia.Controls - - - {7062ae20-5dcc-4442-9645-8195bdece63e} - Avalonia.Diagnostics - - - {4a1abb09-9047-4bd5-a4ad-a055e52c5ee0} - Avalonia.DotNetFrameworkRuntime - - - {62024b2d-53eb-4638-b26b-85eeaa54866e} - Avalonia.Input - - - {6b0ed19d-a08b-461c-a9d9-a9ee40b0c06b} - Avalonia.Interactivity - - - {42472427-4774-4c81-8aff-9f27b8e31721} - Avalonia.Layout - - - {6417b24e-49c2-4985-8db2-3ab9d898ec91} - Avalonia.ReactiveUI - - - {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.Visuals - - - {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} - Avalonia.Styling - - - {3e10a5fa-e8da-48b1-ad44-6a5b6cb7750f} - Avalonia.Themes.Default - - - {fb05ac90-89ba-4f2f-a924-f37875fb547c} - Avalonia.Cairo - - - {54f237d5-a70a-4752-9656-0c70b1a7b047} - Avalonia.Gtk - - - {3e53a01a-b331-47f3-b828-4a5717e77a24} - Avalonia.Markup.Xaml - - - {6417e941-21bc-467b-a771-0de389353ce6} - Avalonia.Markup - - - {7d2d3083-71dd-4cc9-8907-39a0d86fb322} - Avalonia.Skia - - - {d0a739b9-3c68-4ba6-a328-41606954b6bd} - ControlCatalog - - - - - \ No newline at end of file diff --git a/samples/interop/GtkInteropDemo/MainWindow.cs b/samples/interop/GtkInteropDemo/MainWindow.cs deleted file mode 100644 index 2c193f24e8..0000000000 --- a/samples/interop/GtkInteropDemo/MainWindow.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Diagnostics; -using Avalonia.Gtk.Embedding; -using ControlCatalog; -using Gtk; - -namespace GtkInteropDemo -{ - class MainWindow : Window - { - public MainWindow() : base("Gtk Embedding Demo") - { - var root = new HBox(); - var left = new VBox(); - left.Add(new Button("I'm GTK button")); - left.Add(new Calendar()); - root.PackEnd(left, false, false, 0); - var host = new GtkAvaloniaControlHost() {Content = new MainView()}; - host.SetSizeRequest(600, 600); - root.PackStart(host, true, true, 0); - Add(root); - - ShowAll(); - } - } -} diff --git a/samples/interop/GtkInteropDemo/Program.cs b/samples/interop/GtkInteropDemo/Program.cs deleted file mode 100644 index 7dd39c74ca..0000000000 --- a/samples/interop/GtkInteropDemo/Program.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Controls; -using ControlCatalog; - -namespace GtkInteropDemo -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - AppBuilder.Configure().UseGtk().UseCairo().SetupWithoutStarting(); - new MainWindow().Show(); - Gtk.Application.Run(); - } - } -} diff --git a/samples/interop/GtkInteropDemo/Properties/AssemblyInfo.cs b/samples/interop/GtkInteropDemo/Properties/AssemblyInfo.cs deleted file mode 100644 index 8aaf28c2f0..0000000000 --- a/samples/interop/GtkInteropDemo/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GtkInteropDemo")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GtkInteropDemo")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("bd7f352c-6dc1-4740-baf2-2d34a038728c")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/samples/interop/GtkInteropDemo/Properties/Resources.Designer.cs b/samples/interop/GtkInteropDemo/Properties/Resources.Designer.cs deleted file mode 100644 index f79a8bf680..0000000000 --- a/samples/interop/GtkInteropDemo/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GtkInteropDemo.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GtkInteropDemo.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/samples/interop/GtkInteropDemo/Properties/Resources.resx b/samples/interop/GtkInteropDemo/Properties/Resources.resx deleted file mode 100644 index af7dbebbac..0000000000 --- a/samples/interop/GtkInteropDemo/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/samples/interop/GtkInteropDemo/Properties/Settings.Designer.cs b/samples/interop/GtkInteropDemo/Properties/Settings.Designer.cs deleted file mode 100644 index 8173ee7dfa..0000000000 --- a/samples/interop/GtkInteropDemo/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GtkInteropDemo.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/samples/interop/GtkInteropDemo/Properties/Settings.settings b/samples/interop/GtkInteropDemo/Properties/Settings.settings deleted file mode 100644 index 39645652af..0000000000 --- a/samples/interop/GtkInteropDemo/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/Avalonia.Visuals/Properties/AssemblyInfo.cs b/src/Avalonia.Visuals/Properties/AssemblyInfo.cs index ded650e2ed..87347d64b1 100644 --- a/src/Avalonia.Visuals/Properties/AssemblyInfo.cs +++ b/src/Avalonia.Visuals/Properties/AssemblyInfo.cs @@ -10,6 +10,5 @@ using Avalonia.Metadata; [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation")] [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Media")] -[assembly: InternalsVisibleTo("Avalonia.Cairo.RenderTests")] [assembly: InternalsVisibleTo("Avalonia.Direct2D1.RenderTests")] [assembly: InternalsVisibleTo("Avalonia.Skia.RenderTests")] \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj deleted file mode 100644 index 460db98895..0000000000 --- a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Debug - AnyCPU - {FB05AC90-89BA-4F2F-A924-F37875FB547C} - Library - Properties - Avalonia.Cairo - Avalonia.Cairo - v4.6.1 - 512 - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - Properties\SharedAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} - Avalonia.Animation - - - {B09B78D8-9B26-48B0-9149-D64A2F120F3F} - Avalonia.Base - - - {d2221c82-4a25-4583-9b43-d791e3f6820c} - Avalonia.Controls - - - {62024b2d-53eb-4638-b26b-85eeaa54866e} - Avalonia.Input - - - {6b0ed19d-a08b-461c-a9d9-a9ee40b0c06b} - Avalonia.Interactivity - - - {42472427-4774-4C81-8AFF-9F27B8E31721} - Avalonia.Layout - - - {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.Visuals - - - {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} - Avalonia.Styling - - - - - - - - - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/CairoExtensions.cs b/src/Gtk/Avalonia.Cairo/CairoExtensions.cs deleted file mode 100644 index daea3b0239..0000000000 --- a/src/Gtk/Avalonia.Cairo/CairoExtensions.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -namespace Avalonia.Cairo -{ - using Cairo = global::Cairo; - - public static class CairoExtensions - { - public static Cairo.Color ToCairo(this Avalonia.Media.Color color) - { - return new Cairo.Color(color.R / 255.0, color.G / 255.0, color.B / 255.0, color.A / 255.0); - } - - public static Cairo.Matrix ToCairo(this Matrix m) - { - return new Cairo.Matrix(m.M11, m.M12, m.M21, m.M22, m.M31, m.M32); - } - - public static Cairo.PointD ToCairo(this Point p) - { - return new Cairo.PointD(p.X, p.Y); - } - - public static Cairo.Rectangle ToCairo(this Rect rect) - { - return new Cairo.Rectangle(rect.X, rect.Y, rect.Width, rect.Height); - } - - public static Rect ToAvalonia(this Cairo.Rectangle rect) - { - return new Rect(rect.X, rect.Y, rect.Width, rect.Height); - } - - public static Rect ToAvalonia(this Pango.Rectangle rect) - { - return new Rect( - Pango.Units.ToDouble(rect.X), - Pango.Units.ToDouble(rect.Y), - Pango.Units.ToDouble(rect.Width), - Pango.Units.ToDouble(rect.Height)); - } - - public static Pango.Weight ToCairo(this Avalonia.Media.FontWeight weight) - { - return (Pango.Weight)weight; - } - - public static Pango.Alignment ToCairo(this Avalonia.Media.TextAlignment alignment) - { - if (alignment == Avalonia.Media.TextAlignment.Left) - { - return Pango.Alignment.Left; - } - - if (alignment == Avalonia.Media.TextAlignment.Center) - { - return Pango.Alignment.Center; - } - - return Pango.Alignment.Right; - } - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs deleted file mode 100644 index e3578874a3..0000000000 --- a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Avalonia.Cairo.Media; -using Avalonia.Cairo.Media.Imaging; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Controls; - -namespace Avalonia -{ - public static class GtkApplicationExtensions - { - public static T UseCairo(this T builder) where T : AppBuilderBase, new() - { - builder.UseRenderingSubsystem(Cairo.CairoPlatform.Initialize, "Cairo"); - return builder; - } - } -} - -namespace Avalonia.Cairo -{ - using System.IO; - using global::Cairo; - using Rendering; - - public class CairoPlatform : IPlatformRenderInterface - { - private static readonly CairoPlatform s_instance = new CairoPlatform(); - - private static readonly Pango.Context s_pangoContext = CreatePangoContext(); - - public static void Initialize() => AvaloniaLocator.CurrentMutable.Bind().ToConstant(s_instance); - - public IBitmapImpl CreateBitmap(int width, int height) - { - return new BitmapImpl(new Gdk.Pixbuf(Gdk.Colorspace.Rgb, true, 32, width, height)); - } - - public IFormattedTextImpl CreateFormattedText( - string text, - Typeface typeface, - TextAlignment textAlignment, - TextWrapping wrapping, - Size constraint, - IReadOnlyList spans) - { - return new FormattedTextImpl( - s_pangoContext, - text, - typeface, - textAlignment, - wrapping, - constraint, - spans); - } - - public IRenderTarget CreateRenderTarget(IEnumerable surfaces) - { - var accessor = surfaces?.OfType>().FirstOrDefault(); - if(accessor!=null) - return new RenderTarget(accessor); - - throw new NotSupportedException(string.Format( - "Don't know how to create a Cairo renderer from any of the provided surfaces.")); - } - - public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height, double dpiX, double dpiY) - { - return new RenderTargetBitmapImpl(new ImageSurface(Format.Argb32, width, height)); - } - - public IStreamGeometryImpl CreateStreamGeometry() - { - return new StreamGeometryImpl(); - } - - public IBitmapImpl LoadBitmap(string fileName) - { - var pixbuf = new Gdk.Pixbuf(fileName); - - return new BitmapImpl(pixbuf); - } - - public IBitmapImpl LoadBitmap(Stream stream) - { - var pixbuf = new Gdk.Pixbuf(stream); - - return new BitmapImpl(pixbuf); - } - - private static Pango.Context CreatePangoContext() - { - Gtk.Application.Init(); - return new Gtk.Invisible().CreatePangoContext(); - } - - public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride) - { - throw new NotSupportedException("No proper control over pixel format with Cairo, use Skia backend instead"); - } - - public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? fmt) - { - throw new NotSupportedException("No proper support with Cairo, use Skia backend instead"); - } - } -} diff --git a/src/Gtk/Avalonia.Cairo/Media/BrushImpl.cs b/src/Gtk/Avalonia.Cairo/Media/BrushImpl.cs deleted file mode 100644 index 7008c7a66f..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/BrushImpl.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using global::Cairo; - -namespace Avalonia.Cairo -{ - public abstract class BrushImpl : IDisposable - { - public Pattern PlatformBrush { get; protected set; } - - public void Dispose() - { - if (this.PlatformBrush != null) - this.PlatformBrush.Dispose(); - } - } -} - diff --git a/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs b/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs deleted file mode 100644 index 99b0a2ec73..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reactive.Disposables; -using Avalonia.Cairo.Media.Imaging; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Rendering; -// ReSharper disable PossibleNullReferenceException - -namespace Avalonia.Cairo.Media -{ - using Cairo = global::Cairo; - - /// - /// Draws using Cairo. - /// - public class DrawingContext : IDrawingContextImpl, IDisposable - { - private readonly Cairo.Context _context; - private readonly IVisualBrushRenderer _visualBrushRenderer; - private readonly Stack _maskStack = new Stack(); - - /// - /// Initializes a new instance of the class. - /// - /// The target surface. - public DrawingContext(Cairo.Surface surface, IVisualBrushRenderer visualBrushRenderer) - { - _context = new Cairo.Context(surface); - _visualBrushRenderer = visualBrushRenderer; - } - - /// - /// Initializes a new instance of the class. - /// - /// The GDK drawable. - public DrawingContext(Gdk.Drawable drawable, IVisualBrushRenderer visualBrushRenderer) - { - _context = Gdk.CairoHelper.Create(drawable); - _visualBrushRenderer = visualBrushRenderer; - } - - private Matrix _transform = Matrix.Identity; - /// - /// Gets the current transform of the drawing context. - /// - public Matrix Transform - { - get { return _transform; } - set - { - _transform = value; - _context.Matrix = value.ToCairo(); - - } - } - - public void Clear(Color color) - { - _context.SetSourceRGBA(color.R, color.G, color.B, color.A); - _context.Paint(); - } - - /// - /// Ends a draw operation. - /// - public void Dispose() - { - _context.Dispose(); - } - - /// - /// Draws a bitmap image. - /// - /// The bitmap image. - /// The opacity to draw with. - /// The rect in the image to draw. - /// The rect in the output to draw to. - public void DrawImage(IBitmapImpl bitmap, double opacity, Rect sourceRect, Rect destRect) - { - var pixbuf = bitmap as Gdk.Pixbuf; - var rtb = bitmap as RenderTargetBitmapImpl; - var size = new Size(pixbuf?.Width ?? rtb.PixelWidth, pixbuf?.Height ?? rtb.PixelHeight); - var scale = new Vector(destRect.Width / sourceRect.Width, destRect.Height / sourceRect.Height); - - _context.Save(); - _context.Scale(scale.X, scale.Y); - destRect /= scale; - - _context.PushGroup(); - - if (pixbuf != null) - { - Gdk.CairoHelper.SetSourcePixbuf( - _context, - pixbuf, - -sourceRect.X + destRect.X, - -sourceRect.Y + destRect.Y); - } - else - { - _context.SetSourceSurface( - rtb.Surface, - (int)(-sourceRect.X + destRect.X), - (int)(-sourceRect.Y + destRect.Y)); - } - - _context.Rectangle(destRect.ToCairo()); - _context.Fill(); - _context.PopGroupToSource(); - _context.PaintWithAlpha(opacityOverride); - _context.Restore(); - } - - public void DrawImage(IBitmapImpl source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect) - { - PushOpacityMask(opacityMask, opacityMaskRect); - DrawImage(source, 1, new Rect(0, 0, source.PixelWidth, source.PixelHeight), destRect); - PopOpacityMask(); - } - - /// - /// Draws a line. - /// - /// The stroke pen. - /// The first point of the line. - /// The second point of the line. - public void DrawLine(Pen pen, Point p1, Point p2) - { - var size = new Rect(p1, p2).Size; - - using (var p = SetPen(pen, size)) - { - _context.MoveTo(p1.ToCairo()); - _context.LineTo(p2.ToCairo()); - _context.Stroke(); - } - } - - /// - /// Draws a geometry. - /// - /// The fill brush. - /// The stroke pen. - /// The geometry. - public void DrawGeometry(IBrush brush, Pen pen, IGeometryImpl geometry) - { - var impl = geometry as StreamGeometryImpl; - - var oldMatrix = Transform; - Transform = impl.Transform * Transform; - - - if (brush != null) - { - _context.AppendPath(impl.Path); - using (var b = SetBrush(brush, geometry.Bounds.Size)) - { - _context.FillRule = impl.FillRule == FillRule.EvenOdd - ? Cairo.FillRule.EvenOdd - : Cairo.FillRule.Winding; - - if (pen != null) - _context.FillPreserve(); - else - _context.Fill(); - } - } - Transform = oldMatrix; - - if (pen != null) - { - _context.AppendPath(impl.Path); - using (var p = SetPen(pen, geometry.Bounds.Size)) - { - _context.Stroke(); - } - } - } - - /// - /// Draws the outline of a rectangle. - /// - /// The pen. - /// The rectangle bounds. - public void DrawRectangle(Pen pen, Rect rect, float cornerRadius) - { - using (var p = SetPen(pen, rect.Size)) - { - _context.Rectangle(rect.ToCairo()); - _context.Stroke(); - } - } - - /// - /// Draws text. - /// - /// The foreground brush. - /// The upper-left corner of the text. - /// The text. - public void DrawText(IBrush foreground, Point origin, IFormattedTextImpl text) - { - var layout = ((FormattedTextImpl)text).Layout; - _context.MoveTo(origin.X, origin.Y); - - using (var b = SetBrush(foreground, new Size(0, 0))) - { - Pango.CairoHelper.ShowLayout(_context, layout); - } - } - - /// - /// Draws a filled rectangle. - /// - /// The brush. - /// The rectangle bounds. - public void FillRectangle(IBrush brush, Rect rect, float cornerRadius) - { - using (var b = SetBrush(brush, rect.Size)) - { - _context.Rectangle(rect.ToCairo()); - _context.Fill(); - } - } - - /// - /// Pushes a clip rectange. - /// - /// The clip rectangle. - /// A disposable used to undo the clip rectangle. - public void PushClip(Rect clip) - { - _context.Save(); - _context.Rectangle(clip.ToCairo()); - _context.Clip(); - } - - public void PopClip() - { - _context.Restore(); - } - - readonly Stack _opacityStack = new Stack(); - - /// - /// Pushes an opacity value. - /// - /// The opacity. - /// A disposable used to undo the opacity. - public void PushOpacity(double opacity) - { - _opacityStack.Push(opacityOverride); - - if (opacity < 1.0f) - opacityOverride *= opacity; - - } - - public void PopOpacity() - { - opacityOverride = _opacityStack.Pop(); - } - - /// - /// Pushes a matrix transformation. - /// - /// The matrix - /// A disposable used to undo the transformation. - public IDisposable PushTransform(Matrix matrix) - { - _context.Save(); - _context.Transform(matrix.ToCairo()); - - return Disposable.Create(() => - { - _context.Restore(); - }); - } - - private double opacityOverride = 1.0f; - - private IDisposable SetBrush(IBrush brush, Size destinationSize) - { - _context.Save(); - - BrushImpl impl = CreateBrushImpl(brush, destinationSize); - - _context.SetSource(impl.PlatformBrush); - return Disposable.Create(() => - { - impl.Dispose(); - _context.Restore(); - }); - } - - private BrushImpl CreateBrushImpl(IBrush brush, Size destinationSize) - { - var solid = brush as ISolidColorBrush; - var linearGradientBrush = brush as ILinearGradientBrush; - var radialGradientBrush = brush as IRadialGradientBrush; - var imageBrush = brush as IImageBrush; - var visualBrush = brush as IVisualBrush; - BrushImpl impl = null; - - if (solid != null) - { - impl = new SolidColorBrushImpl(solid, opacityOverride); - } - else if (linearGradientBrush != null) - { - impl = new LinearGradientBrushImpl(linearGradientBrush, destinationSize); - } - else if (radialGradientBrush != null) - { - impl = new RadialGradientBrushImpl(radialGradientBrush, destinationSize); - } - else if (imageBrush != null) - { - impl = new ImageBrushImpl(imageBrush, (BitmapImpl)imageBrush.Source.PlatformImpl, destinationSize); - } - else if (visualBrush != null) - { - if (_visualBrushRenderer != null) - { - var intermediateSize = _visualBrushRenderer.GetRenderTargetSize(visualBrush); - - if (intermediateSize.Width >= 1 && intermediateSize.Height >= 1) - { - using (var intermediate = new Cairo.ImageSurface(Cairo.Format.ARGB32, (int)intermediateSize.Width, (int)intermediateSize.Height)) - { - using (var ctx = new RenderTarget(intermediate).CreateDrawingContext(_visualBrushRenderer)) - { - ctx.Clear(Colors.Transparent); - _visualBrushRenderer.RenderVisualBrush(ctx, visualBrush); - } - - return new ImageBrushImpl( - visualBrush, - new RenderTargetBitmapImpl(intermediate), - destinationSize); - } - } - } - else - { - throw new NotSupportedException("No IVisualBrushRenderer was supplied to DrawingContextImpl."); - } - } - else - { - impl = new SolidColorBrushImpl(null, opacityOverride); - } - - return impl; - } - - private IDisposable SetPen(Pen pen, Size destinationSize) - { - if (pen.DashStyle != null) - { - if (pen.DashStyle.Dashes != null && pen.DashStyle.Dashes.Count > 0) - { - var cray = pen.DashStyle.Dashes.ToArray(); - _context.SetDash(cray, pen.DashStyle.Offset); - } - } - - _context.LineWidth = pen.Thickness; - _context.MiterLimit = pen.MiterLimit; - - // Line caps and joins are currently broken on Cairo. I've defaulted them to sensible defaults for now. - // Cairo does not have StartLineCap, EndLineCap, and DashCap properties, whereas Direct2D does. - // TODO: Figure out a solution for this. - _context.LineJoin = Cairo.LineJoin.Miter; - _context.LineCap = Cairo.LineCap.Butt; - - if (pen.Brush == null) - return Disposable.Empty; - - return SetBrush(pen.Brush, destinationSize); - } - - public void PushGeometryClip(IGeometryImpl clip) - { - _context.Save(); - _context.AppendPath(((StreamGeometryImpl)clip).Path); - _context.Clip(); - } - - public void PopGeometryClip() - { - _context.Restore(); - } - - public void PushOpacityMask(IBrush mask, Rect bounds) - { - _context.PushGroup(); - var impl = CreateBrushImpl(mask, bounds.Size); - _maskStack.Push(impl); - } - - public void PopOpacityMask() - { - _context.PopGroupToSource(); - var brushImpl = _maskStack.Pop(); - - _context.Mask(brushImpl.PlatformBrush); - brushImpl.Dispose(); - } - } -} diff --git a/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs b/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs deleted file mode 100644 index b8e4d1efec..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Avalonia.Media; -using Avalonia.Platform; - -namespace Avalonia.Cairo.Media -{ - public class FormattedTextImpl : IFormattedTextImpl - { - private Size _constraint; - - static double CorrectScale(double input) - { - return input * 0.75; - } - - public FormattedTextImpl( - Pango.Context context, - string text, - Typeface typeface, - TextAlignment textAlignment, - TextWrapping wrapping, - Size constraint, - IReadOnlyList spans) - { - Contract.Requires(context != null); - Contract.Requires(text != null); - - Layout = new Pango.Layout(context); - Layout.SetText(text); - - Layout.FontDescription = new Pango.FontDescription - { - Family = typeface?.FontFamilyName ?? "monospace", - Size = Pango.Units.FromDouble(CorrectScale(typeface?.FontSize ?? 12)), - Style = (Pango.Style)(typeface?.Style ?? FontStyle.Normal), - Weight = (typeface?.Weight ?? FontWeight.Normal).ToCairo(), - }; - - Layout.Alignment = textAlignment.ToCairo(); - Layout.Attributes = new Pango.AttrList(); - Layout.Width = double.IsPositiveInfinity(constraint.Width) ? -1 : Pango.Units.FromDouble(constraint.Width); - - if (spans != null) - { - foreach (var span in spans) - { - if (span.ForegroundBrush is SolidColorBrush scb) - { - var color = new Pango.Color(); - color.Parse(string.Format("#{0}", scb.Color.ToString().Substring(3))); - - var brushAttr = new Pango.AttrForeground(color); - brushAttr.StartIndex = (uint)TextIndexToPangoIndex(span.StartIndex); - brushAttr.EndIndex = (uint)TextIndexToPangoIndex(span.StartIndex + span.Length); - - this.Layout.Attributes.Insert(brushAttr); - } - } - } - - Size = Measure(); - } - - public FormattedTextImpl(Pango.Layout layout) - { - Layout = layout; - Size = Measure(); - } - - public string Text => Layout.Text; - - public Size Constraint => _constraint; - - public Size Size { get; } - - public Pango.Layout Layout { get; } - - public IEnumerable GetLines() - { - return new FormattedTextLine[0]; - } - - public TextHitTestResult HitTestPoint(Point point) - { - int textPosition; - int trailing; - - var isInside = Layout.XyToIndex( - Pango.Units.FromDouble(point.X), - Pango.Units.FromDouble(point.Y), - out textPosition, - out trailing); - - textPosition = PangoIndexToTextIndex(textPosition); - - return new TextHitTestResult - { - IsInside = isInside, - TextPosition = textPosition, - IsTrailing = trailing == 0, - }; - } - - int PangoIndexToTextIndex(int pangoIndex) - { - return Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(Text), 0, Math.Min(pangoIndex, Text.Length)).Length; - } - - public Rect HitTestTextPosition(int index) - { - return Layout.IndexToPos(TextIndexToPangoIndex(index)).ToAvalonia(); - } - - int TextIndexToPangoIndex(int textIndex) - { - return Encoding.UTF8.GetByteCount(textIndex < Text.Length ? Text.Remove(textIndex) : Text); - } - - public IEnumerable HitTestTextRange(int index, int length) - { - var ranges = new List(); - - for (var i = 0; i < length; i++) - { - ranges.Add(HitTestTextPosition(index + i)); - } - - return ranges; - } - - private Size Measure() - { - int width; - int height; - Layout.GetPixelSize(out width, out height); - - return new Size(width, height); - } - } -} diff --git a/src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs b/src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs deleted file mode 100644 index 14c9dee9e2..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Rendering.Utilities; -using global::Cairo; - -namespace Avalonia.Cairo.Media -{ - public class ImageBrushImpl : BrushImpl - { - public ImageBrushImpl( - ITileBrush brush, - IBitmapImpl bitmap, - Size targetSize) - { - var calc = new TileBrushCalculator(brush, new Size(bitmap.PixelWidth, bitmap.PixelHeight), targetSize); - - using (var intermediate = new ImageSurface(Format.ARGB32, (int)calc.IntermediateSize.Width, (int)calc.IntermediateSize.Height)) - { - using (var context = new RenderTarget(intermediate).CreateDrawingContext(null)) - { - var rect = new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight); - - context.Clear(Colors.Transparent); - context.PushClip(calc.IntermediateClip); - context.Transform = calc.IntermediateTransform; - context.DrawImage(bitmap, 1, rect, rect); - context.PopClip(); - } - - var result = new SurfacePattern(intermediate); - - if ((brush.TileMode & TileMode.FlipXY) != 0) - { - // TODO: Currently always FlipXY as that's all cairo supports natively. - // Support separate FlipX and FlipY by drawing flipped images to intermediate - // surface. - result.Extend = Extend.Reflect; - } - else - { - result.Extend = Extend.Repeat; - } - - if (brush.TileMode != TileMode.None) - { - var matrix = result.Matrix; - matrix.InitTranslate(-calc.DestinationRect.X, -calc.DestinationRect.Y); - result.Matrix = matrix; - } - - PlatformBrush = result; - } - } - } -} - diff --git a/src/Gtk/Avalonia.Cairo/Media/Imaging/BitmapImpl.cs b/src/Gtk/Avalonia.Cairo/Media/Imaging/BitmapImpl.cs deleted file mode 100644 index 5c1e5e7d96..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/Imaging/BitmapImpl.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using Avalonia.Platform; - -namespace Avalonia.Cairo.Media.Imaging -{ - using System.IO; - using Cairo = global::Cairo; - - public class BitmapImpl : Gdk.Pixbuf, IBitmapImpl - { - public BitmapImpl(Gdk.Pixbuf pixbuf) - :base(pixbuf.SaveToBuffer("png")) - { - } - - public int PixelWidth => Width; - - public int PixelHeight => Height; - - public void Save(string fileName) - { - // TODO: Test - Save(fileName, "png"); - } - - public void Save(Stream stream) - { - var buffer = SaveToBuffer("png"); - stream.Write(buffer, 0, buffer.Length); - } - } -} diff --git a/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs deleted file mode 100644 index fa8a3132d5..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Rendering; - -namespace Avalonia.Cairo.Media.Imaging -{ - using System.IO; - using Cairo = global::Cairo; - - public class RenderTargetBitmapImpl : IRenderTargetBitmapImpl - { - - private readonly RenderTarget _renderTarget; - public RenderTargetBitmapImpl(Cairo.ImageSurface surface) - { - Surface = surface; - _renderTarget = new RenderTarget(Surface); - } - - public int PixelWidth => Surface.Width; - - public int PixelHeight => Surface.Height; - - public void Dispose() - { - _renderTarget.Dispose(); - } - - public Cairo.ImageSurface Surface - { - get; - } - - public void Save(string fileName) - { - Surface.WriteToPng(fileName); - } - - public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) - { - return _renderTarget.CreateDrawingContext(visualBrushRenderer); - } - - public void Save(Stream stream) - { - var tempFileName = Path.GetTempFileName(); - Surface.WriteToPng(tempFileName); - using (var tempFile = new FileStream(tempFileName, FileMode.Create)) - { - tempFile.CopyTo(stream); - } - } - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs b/src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs deleted file mode 100644 index 1e82da4059..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using Avalonia.Media; -using global::Cairo; - -namespace Avalonia.Cairo -{ - public class LinearGradientBrushImpl : BrushImpl - { - public LinearGradientBrushImpl(ILinearGradientBrush brush, Size destinationSize) - { - var start = brush.StartPoint.ToPixels(destinationSize); - var end = brush.EndPoint.ToPixels(destinationSize); - - this.PlatformBrush = new LinearGradient(start.X, start.Y, end.X, end.Y); - - foreach (var stop in brush.GradientStops) - ((LinearGradient)this.PlatformBrush).AddColorStop(stop.Offset, stop.Color.ToCairo()); - - ((LinearGradient)this.PlatformBrush).Extend = Extend.Pad; - } - } -} - diff --git a/src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs b/src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs deleted file mode 100644 index 03385f8d86..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using Avalonia.Media; -using global::Cairo; - -namespace Avalonia.Cairo -{ - public class RadialGradientBrushImpl : BrushImpl - { - public RadialGradientBrushImpl(IRadialGradientBrush brush, Size destinationSize) - { - var center = brush.Center.ToPixels(destinationSize); - var gradientOrigin = brush.GradientOrigin.ToPixels(destinationSize); - var radius = brush.Radius * Math.Min(destinationSize.Width, destinationSize.Height); - - this.PlatformBrush = new RadialGradient(center.X, center.Y, 1, gradientOrigin.X, gradientOrigin.Y, radius); - this.PlatformBrush.Matrix = Matrix.Identity.ToCairo(); - - foreach (var stop in brush.GradientStops) - { - ((RadialGradient)this.PlatformBrush).AddColorStop(stop.Offset, stop.Color.ToCairo()); - } - - ((RadialGradient)this.PlatformBrush).Extend = Extend.Pad; - } - } -} - diff --git a/src/Gtk/Avalonia.Cairo/Media/SolidColorBrushImpl.cs b/src/Gtk/Avalonia.Cairo/Media/SolidColorBrushImpl.cs deleted file mode 100644 index 86f8aa7f25..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/SolidColorBrushImpl.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using global::Cairo; - -namespace Avalonia.Cairo -{ - public class SolidColorBrushImpl : BrushImpl - { - public SolidColorBrushImpl(Avalonia.Media.ISolidColorBrush brush, double opacityOverride = 1.0f) - { - var color = brush?.Color.ToCairo() ?? new Color(); - - if (brush != null) - color.A = Math.Min(brush.Opacity, color.A); - - if (opacityOverride < 1.0f) - color.A = Math.Min(opacityOverride, color.A); - - this.PlatformBrush = new SolidPattern(color); - } - } -} - diff --git a/src/Gtk/Avalonia.Cairo/Media/StreamGeometryContextImpl.cs b/src/Gtk/Avalonia.Cairo/Media/StreamGeometryContextImpl.cs deleted file mode 100644 index ca16ab5630..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/StreamGeometryContextImpl.cs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.RenderHelpers; - -namespace Avalonia.Cairo.Media -{ - using Cairo = global::Cairo; - - public class StreamGeometryContextImpl : IStreamGeometryContextImpl - { - private readonly StreamGeometryImpl _target; - private Point _currentPoint; - public StreamGeometryContextImpl(StreamGeometryImpl target, Cairo.Path path) - { - _target = target; - - _surf = new Cairo.ImageSurface (Cairo.Format.Argb32, 0, 0); - _context = new Cairo.Context (_surf); - this.Path = path; - - if (this.Path != null) - { - _context.AppendPath(this.Path); - } - } - - public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection) - { - ArcToHelper.ArcTo(this, _currentPoint, point, size, rotationAngle, isLargeArc, sweepDirection); - _currentPoint = point; - } - - public void BeginFigure(Point startPoint, bool isFilled) - { - if (this.Path == null) - { - _context.MoveTo(startPoint.ToCairo()); - _currentPoint = startPoint; - } - } - - public void CubicBezierTo(Point point1, Point point2, Point point3) - { - if (this.Path == null) - { - _context.CurveTo(point1.ToCairo(), point2.ToCairo(), point3.ToCairo()); - _currentPoint = point3; - } - } - - public void QuadraticBezierTo(Point control, Point endPoint) - { - if (this.Path == null) - { - QuadBezierHelper.QuadraticBezierTo(this, _currentPoint, control, endPoint); - _currentPoint = endPoint; - } - } - - internal bool FillContains(Point point) - { - using (var context = new Cairo.Context(new Cairo.ImageSurface(Cairo.Format.Argb32, 0, 0))) - { - context.AppendPath(Path); - return context.InFill(point.X, point.Y); - } - } - - internal bool StrokeContains(Pen pen, Point point) - { - using (var context = new Cairo.Context(new Cairo.ImageSurface(Cairo.Format.Argb32, 0, 0))) - { - context.AppendPath(Path); - return context.InStroke(point.X, point.Y); - } - } - - public void LineTo(Point point) - { - if (this.Path == null) - { - _context.LineTo(point.ToCairo()); - _currentPoint = point; - } - } - - private readonly Cairo.Context _context; - private readonly Cairo.ImageSurface _surf; - public Cairo.Path Path { get; private set; } - public Rect Bounds { get; private set; } - - public void EndFigure(bool isClosed) - { - if (this.Path == null) - { - if (isClosed) - _context.ClosePath (); - } - } - - public void SetFillRule(FillRule fillRule) - { - _target.FillRule = fillRule; - } - - - public void Dispose() - { - if (this.Path == null) - { - Path = _context.CopyPath(); - Bounds = _context.FillExtents().ToAvalonia(); - } - - _context.Dispose (); - _surf.Dispose (); - } - } -} diff --git a/src/Gtk/Avalonia.Cairo/Media/StreamGeometryImpl.cs b/src/Gtk/Avalonia.Cairo/Media/StreamGeometryImpl.cs deleted file mode 100644 index b0a8cd4fb0..0000000000 --- a/src/Gtk/Avalonia.Cairo/Media/StreamGeometryImpl.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using Avalonia.Media; -using Avalonia.Platform; -using System.Collections.Generic; - -namespace Avalonia.Cairo.Media -{ - using Cairo = global::Cairo; - - public class StreamGeometryImpl : IStreamGeometryImpl - { - public StreamGeometryImpl() - { - _impl = new StreamGeometryContextImpl(this, null); - } - - public StreamGeometryImpl(StreamGeometryContextImpl impl) - { - _impl = impl; - } - - public Rect Bounds - { - get { return _impl.Bounds; } - } - - public Cairo.Path Path - { - get { return _impl.Path; } - } - - private readonly StreamGeometryContextImpl _impl; - - private Matrix _transform = Matrix.Identity; - - public Matrix Transform - { - get { return _transform; } - private set { _transform = value; } - } - - public FillRule FillRule { get; set; } - - public IStreamGeometryImpl Clone() - { - return new StreamGeometryImpl(_impl); - } - - public Rect GetRenderBounds(double strokeThickness) - { - // TODO: Calculate properly. - return Bounds.TransformToAABB(Transform).Inflate(strokeThickness); - } - - public IStreamGeometryContextImpl Open() - { - return _impl; - } - - public bool FillContains(Point point) - { - return _impl.FillContains(point); - } - - public IGeometryImpl Intersect(IGeometryImpl geometry) - { - throw new NotImplementedException(); - } - - public bool StrokeContains(Pen pen, Point point) - { - return _impl.StrokeContains(pen, point); - } - - /// - public IGeometryImpl WithTransform(Matrix transform) - { - var result = (StreamGeometryImpl)Clone(); - result.Transform = transform; - return result; - } - } -} diff --git a/src/Gtk/Avalonia.Cairo/Properties/AssemblyInfo.cs b/src/Gtk/Avalonia.Cairo/Properties/AssemblyInfo.cs deleted file mode 100644 index 709f1eb22a..0000000000 --- a/src/Gtk/Avalonia.Cairo/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using Avalonia.Cairo; -using Avalonia.Platform; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Avalonia.Cairo")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f999ba8b-64e7-40cc-98a4-003f1852d2a3")] - -[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 3, "Cairo", typeof(CairoPlatform), nameof(CairoPlatform.Initialize), RequiresWindowingSubsystem = "GTK")] -[assembly: ExportRenderingSubsystem(OperatingSystemType.Linux, 2, "Cairo", typeof(CairoPlatform), nameof(CairoPlatform.Initialize), RequiresWindowingSubsystem = "GTK")] -[assembly: ExportRenderingSubsystem(OperatingSystemType.OSX, 3, "Cairo", typeof(CairoPlatform), nameof(CairoPlatform.Initialize), RequiresWindowingSubsystem = "GTK")] diff --git a/src/Gtk/Avalonia.Cairo/RenderTarget.cs b/src/Gtk/Avalonia.Cairo/RenderTarget.cs deleted file mode 100644 index b18c07377b..0000000000 --- a/src/Gtk/Avalonia.Cairo/RenderTarget.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Runtime.InteropServices; -using Avalonia.Cairo.Media; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Rendering; -using Gtk; -using DrawingContext = Avalonia.Media.DrawingContext; - -namespace Avalonia.Cairo -{ - using global::Cairo; - - /// - /// A cairo render target. - /// - public class RenderTarget : IRenderTarget - { - private readonly Surface _surface; - private readonly Func _drawableAccessor; - - - /// - /// Initializes a new instance of the class. - /// - /// The window. - /// The width of the window. - /// The height of the window. - public RenderTarget(Func drawable) - { - _drawableAccessor = drawable; - } - - public RenderTarget(ImageSurface surface) - { - _surface = surface; - } - - /// - /// Creates a cairo surface that targets a platform-specific resource. - /// - /// The visual brush renderer to use. - /// A surface wrapped in an . - public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) - { - if (_drawableAccessor != null) - return new Media.DrawingContext(_drawableAccessor(), visualBrushRenderer); - if (_surface != null) - return new Media.DrawingContext(_surface, visualBrushRenderer); - throw new InvalidOperationException("Unspecified render target"); - } - - public void Dispose() => _surface?.Dispose(); - } -} diff --git a/src/Gtk/Avalonia.Cairo/app.config b/src/Gtk/Avalonia.Cairo/app.config deleted file mode 100644 index 754c958222..0000000000 --- a/src/Gtk/Avalonia.Cairo/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj deleted file mode 100644 index 1142b32dbf..0000000000 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - Debug - AnyCPU - {54F237D5-A70A-4752-9656-0C70B1A7B047} - Library - Avalonia.Gtk - Avalonia.Gtk - v4.6.1 - - - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false - - - - - - - - - - - - - Properties\SharedAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} - Avalonia.Animation - - - {B09B78D8-9B26-48B0-9149-D64A2F120F3F} - Avalonia.Base - - - {7062ae20-5dcc-4442-9645-8195bdece63e} - Avalonia.Diagnostics - - - {62024B2D-53EB-4638-B26B-85EEAA54866E} - Avalonia.Input - - - {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.Visuals - - - {42472427-4774-4C81-8AFF-9F27B8E31721} - Avalonia.Layout - - - {D2221C82-4A25-4583-9B43-D791E3F6820C} - Avalonia.Controls - - - {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} - Avalonia.Styling - - - {6B0ED19D-A08B-461C-A9D9-A9EE40B0C06B} - Avalonia.Interactivity - - - - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/ClipboardImpl.cs b/src/Gtk/Avalonia.Gtk/ClipboardImpl.cs deleted file mode 100644 index db59789bc9..0000000000 --- a/src/Gtk/Avalonia.Gtk/ClipboardImpl.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Threading.Tasks; -using Gdk; -using Avalonia.Input.Platform; - -namespace Avalonia.Gtk -{ - using Gtk = global::Gtk; - - internal class ClipboardImpl : IClipboard - { - private static Gtk.Clipboard GetClipboard() => Gtk.Clipboard.GetForDisplay(Display.Default, new Atom(IntPtr.Zero)); - - public Task GetTextAsync() - { - var clip = GetClipboard(); - var tcs = new TaskCompletionSource(); - clip.RequestText((_, text) => - { - tcs.TrySetResult(text); - }); - return tcs.Task; - } - - public Task SetTextAsync(string text) - { - using (var cl = GetClipboard()) - cl.Text = text; - return Task.FromResult(0); - } - - public Task ClearAsync() - { - using (var cl = GetClipboard()) - cl.Clear(); - return Task.FromResult(0); - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/CursorFactory.cs b/src/Gtk/Avalonia.Gtk/CursorFactory.cs deleted file mode 100644 index bd8166c59e..0000000000 --- a/src/Gtk/Avalonia.Gtk/CursorFactory.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System.Collections.Generic; -using Gdk; -using Avalonia.Input; -using Avalonia.Platform; - -namespace Avalonia.Gtk -{ - using Gtk = global::Gtk; - - internal class CursorFactory : IStandardCursorFactory - { - public static CursorFactory Instance { get; } = new CursorFactory(); - - private CursorFactory() - { - } - - private static readonly Dictionary CursorTypeMapping = new Dictionary - - { - {StandardCursorType.AppStarting, CursorType.Watch}, - {StandardCursorType.Arrow, CursorType.LeftPtr}, - {StandardCursorType.Cross, CursorType.Cross}, - {StandardCursorType.Hand, CursorType.Hand1}, - {StandardCursorType.Ibeam, CursorType.Xterm}, - {StandardCursorType.No, Gtk.Stock.Cancel}, - {StandardCursorType.SizeAll, CursorType.Sizing}, - //{ StandardCursorType.SizeNorthEastSouthWest, 32643 }, - {StandardCursorType.SizeNorthSouth, CursorType.SbVDoubleArrow}, - //{ StandardCursorType.SizeNorthWestSouthEast, 32642 }, - {StandardCursorType.SizeWestEast, CursorType.SbHDoubleArrow}, - {StandardCursorType.UpArrow, CursorType.BasedArrowUp}, - {StandardCursorType.Wait, CursorType.Watch}, - {StandardCursorType.Help, Gtk.Stock.Help}, - {StandardCursorType.TopSide, CursorType.TopSide}, - {StandardCursorType.BottomSize, CursorType.BottomSide}, - {StandardCursorType.LeftSide, CursorType.LeftSide}, - {StandardCursorType.RightSide, CursorType.RightSide}, - {StandardCursorType.TopLeftCorner, CursorType.TopLeftCorner}, - {StandardCursorType.TopRightCorner, CursorType.TopRightCorner}, - {StandardCursorType.BottomLeftCorner, CursorType.BottomLeftCorner}, - {StandardCursorType.BottomRightCorner, CursorType.BottomRightCorner} - }; - - private static readonly Dictionary Cache = - new Dictionary(); - - private Gdk.Cursor GetCursor(object desc) - { - Gdk.Cursor rv; - var name = desc as string; - if (name != null) - { - var theme = Gtk.IconTheme.Default; - var icon = theme.LoadIcon(name, 32, default(Gtk.IconLookupFlags)); - rv = icon == null ? new Gdk.Cursor(CursorType.XCursor) : new Gdk.Cursor(Display.Default, icon, 0, 0); - } - else - { - rv = new Gdk.Cursor((CursorType)desc); - } - - rv.Owned = false; - return rv; - } - - public IPlatformHandle GetCursor(StandardCursorType cursorType) - { - IPlatformHandle rv; - if (!Cache.TryGetValue(cursorType, out rv)) - { - Cache[cursorType] = - rv = - new PlatformHandle( - GetCursor(CursorTypeMapping[cursorType]).Handle, - "GTKCURSOR"); - } - - return rv; - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs deleted file mode 100644 index 4e8085a057..0000000000 --- a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reactive.Disposables; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Platform; -using Gdk; -using Gtk; -using Action = System.Action; -using WindowEdge = Avalonia.Controls.WindowEdge; - -namespace Avalonia.Gtk -{ - class EmbeddableImpl : TopLevelImpl, IEmbeddableWindowImpl - { -#pragma warning disable CS0067 // Method not used - public event Action LostFocus; -#pragma warning restore CS0067 - - public EmbeddableImpl(DrawingArea area) : base(area) - { - area.Events = EventMask.AllEventsMask; - area.SizeAllocated += Plug_SizeAllocated; - } - - public EmbeddableImpl() : this(new PlatformHandleAwareDrawingArea()) - { - } - - private void Plug_SizeAllocated(object o, SizeAllocatedArgs args) - { - Resized?.Invoke(new Size(args.Allocation.Width, args.Allocation.Height)); - } - - public override Size ClientSize - { - get { return new Size(Widget.Allocation.Width, Widget.Allocation.Height); } - } - - } -} diff --git a/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs b/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs deleted file mode 100644 index 5594a3c13f..0000000000 --- a/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Controls; -using Avalonia.Controls.Embedding; -using Avalonia.Diagnostics; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Layout; -using Avalonia.Platform; -using Avalonia.VisualTree; -using Gdk; -using Gtk; - -namespace Avalonia.Gtk.Embedding -{ - public class GtkAvaloniaControlHost : DrawingArea, IPlatformHandle - { - private EmbeddableControlRoot _root; - - public GtkAvaloniaControlHost() - { - _root = new EmbeddableControlRoot(new EmbeddableImpl(this)); - _root.Prepare(); - if (_root.IsFocused) - Unfocus(); - _root.GotFocus += RootGotFocus; - CanFocus = true; - } - - void Unfocus() - { - var focused = (IVisual)FocusManager.Instance.Current; - if (focused == null) - return; - while (focused.VisualParent != null) - focused = focused.VisualParent; - - if (focused == _root) - KeyboardDevice.Instance.SetFocusedElement(null, NavigationMethod.Unspecified, InputModifiers.None); - } - - protected override bool OnFocusOutEvent(EventFocus evnt) - { - Unfocus(); - return false; - } - - private void RootGotFocus(object sender, RoutedEventArgs e) - { - this.HasFocus = true; - GdkWindow.Focus(0); - } - - private Control _content; - - public Control Content - { - get { return _content; } - set - { - _content = value; - if (_root != null) - { - _root.Content = value; - _root.Prepare(); - } - } - } - - IntPtr IPlatformHandle.Handle => PlatformHandleAwareWindow.GetNativeWindow(GdkWindow); - - string IPlatformHandle.HandleDescriptor => "HWND"; - } -} diff --git a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs deleted file mode 100644 index 5ec49fb91f..0000000000 --- a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Avalonia.Controls.Platform.Surfaces; -using Avalonia.Platform; - -namespace Avalonia.Gtk -{ - class FramebufferManager : IFramebufferPlatformSurface, IDisposable - { - private readonly TopLevelImpl _window; - private SurfaceFramebuffer _fb; - - public FramebufferManager(TopLevelImpl window) - { - _window = window; - } - - public void Dispose() - { - _fb?.Deallocate(); - } - - public ILockedFramebuffer Lock() - { - if(_window.CurrentDrawable == null) - throw new InvalidOperationException("Window is not in drawing state"); - - var drawable = _window.CurrentDrawable; - var width = (int) _window.ClientSize.Width; - var height = (int) _window.ClientSize.Height; - if (_fb == null || _fb.Width != width || - _fb.Height != height) - { - _fb?.Deallocate(); - _fb = new SurfaceFramebuffer(width, height); - } - _fb.SetDrawable(drawable); - return _fb; - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/GtkExtensions.cs b/src/Gtk/Avalonia.Gtk/GtkExtensions.cs deleted file mode 100644 index b9bb9a778a..0000000000 --- a/src/Gtk/Avalonia.Gtk/GtkExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -namespace Avalonia.Gtk -{ - using Gtk = global::Gtk; - - public static class GtkExtensions - { - public static Rect ToAvalonia(this Gdk.Rectangle rect) - { - return new Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs deleted file mode 100644 index f449229c53..0000000000 --- a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Reactive.Disposables; -using System.Threading; -using Avalonia.Controls.Platform; -using Avalonia.Input.Platform; -using Avalonia.Input; -using Avalonia.Platform; -using Avalonia.Controls; - -namespace Avalonia -{ - public static class GtkApplicationExtensions - { - public static T UseGtk(this T builder) where T : AppBuilderBase, new() - { - builder.UseWindowingSubsystem(Gtk.GtkPlatform.Initialize, "Gtk"); - return builder; - } - } -} - -namespace Avalonia.Gtk -{ - using System.IO; - using Rendering; - using Gtk = global::Gtk; - - public class GtkPlatform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader - { - private static readonly GtkPlatform s_instance = new GtkPlatform(); - private static Thread _uiThread; - - public GtkPlatform() - { - Gtk.Application.Init(); - } - - public Size DoubleClickSize => new Size(4, 4); - - public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(Gtk.Settings.Default.DoubleClickTime); - public double RenderScalingFactor { get; } = 1; - public double LayoutScalingFactor { get; } = 1; - - public static void Initialize() - { - AvaloniaLocator.CurrentMutable - .Bind().ToConstant(s_instance) - .Bind().ToSingleton() - .Bind().ToConstant(CursorFactory.Instance) - .Bind().ToConstant(GtkKeyboardDevice.Instance) - .Bind().ToConstant(s_instance) - .Bind().ToConstant(s_instance) - .Bind().ToConstant(new DefaultRenderLoop(60)) - .Bind().ToSingleton() - .Bind().ToConstant(s_instance); - _uiThread = Thread.CurrentThread; - } - - public bool HasMessages() - { - return Gtk.Application.EventsPending(); - } - - public void ProcessMessage() - { - Gtk.Application.RunIteration(); - } - - public void RunLoop(CancellationToken cancellationToken) - { - while (!cancellationToken.IsCancellationRequested) - Gtk.Application.RunIteration(); - } - - public IDisposable StartTimer(TimeSpan interval, Action tick) - { - var result = true; - var handle = GLib.Timeout.Add( - (uint)interval.TotalMilliseconds, - () => - { - tick(); - return result; - }); - - return Disposable.Create(() => result = false); - } - - - - public void Signal() - { - Gtk.Application.Invoke(delegate { Signaled?.Invoke(); }); - } - - public bool CurrentThreadIsLoopThread => Thread.CurrentThread == _uiThread; - - public event Action Signaled; - public IWindowImpl CreateWindow() - { - return new WindowImpl(); - } - - public IEmbeddableWindowImpl CreateEmbeddableWindow() => new EmbeddableImpl(); - - public IPopupImpl CreatePopup() - { - return new PopupImpl(); - } - - public IWindowIconImpl LoadIcon(string fileName) - { - return new IconImpl(new Gdk.Pixbuf(fileName)); - } - - public IWindowIconImpl LoadIcon(Stream stream) - { - return new IconImpl(new Gdk.Pixbuf(stream)); - } - - public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) - { - if (bitmap is Gdk.Pixbuf) - { - return new IconImpl((Gdk.Pixbuf)bitmap); - } - else - { - using (var memoryStream = new MemoryStream()) - { - bitmap.Save(memoryStream); - return new IconImpl(new Gdk.Pixbuf(memoryStream)); - } - } - } - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/IconImpl.cs b/src/Gtk/Avalonia.Gtk/IconImpl.cs deleted file mode 100644 index 3203e59f21..0000000000 --- a/src/Gtk/Avalonia.Gtk/IconImpl.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Avalonia.Platform; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Gdk; -using System.IO; - -namespace Avalonia.Gtk -{ - class IconImpl : IWindowIconImpl - { - public IconImpl(Pixbuf pixbuf) - { - Pixbuf = pixbuf; - } - - public Pixbuf Pixbuf { get; } - - public void Save(Stream stream) - { - var buffer = Pixbuf.SaveToBuffer("png"); - stream.Write(buffer, 0, buffer.Length); - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/Input/GtkKeyboardDevice.cs b/src/Gtk/Avalonia.Gtk/Input/GtkKeyboardDevice.cs deleted file mode 100644 index a97a6190f1..0000000000 --- a/src/Gtk/Avalonia.Gtk/Input/GtkKeyboardDevice.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using Avalonia.Input; - - -namespace Avalonia.Gtk -{ - public class GtkKeyboardDevice : KeyboardDevice - { - public new static GtkKeyboardDevice Instance { get; } = new GtkKeyboardDevice(); - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Input/GtkMouseDevice.cs b/src/Gtk/Avalonia.Gtk/Input/GtkMouseDevice.cs deleted file mode 100644 index c5de869647..0000000000 --- a/src/Gtk/Avalonia.Gtk/Input/GtkMouseDevice.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using Avalonia.Input; -namespace Avalonia.Gtk -{ - public class GtkMouseDevice : MouseDevice - { - private static readonly GtkMouseDevice s_instance; - - private Point _clientPosition; - - static GtkMouseDevice() - { - s_instance = new GtkMouseDevice(); - } - - private GtkMouseDevice() - { - } - - public static new GtkMouseDevice Instance => s_instance; - - internal void SetClientPosition(Point p) - { - _clientPosition = p; - } - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/MyClass.cs b/src/Gtk/Avalonia.Gtk/MyClass.cs deleted file mode 100644 index 589431fcb1..0000000000 --- a/src/Gtk/Avalonia.Gtk/MyClass.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Avalonia.Gtk -{ - public class MyClass - { - public MyClass () - { - } - } -} - diff --git a/src/Gtk/Avalonia.Gtk/PopupImpl.cs b/src/Gtk/Avalonia.Gtk/PopupImpl.cs deleted file mode 100644 index 41ee4354fe..0000000000 --- a/src/Gtk/Avalonia.Gtk/PopupImpl.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using Gtk; -using Avalonia.Platform; - -namespace Avalonia.Gtk -{ - public class PopupImpl : WindowImpl, IPopupImpl - { - public PopupImpl() - : base(WindowType.Popup) - { - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/Properties/AssemblyInfo.cs b/src/Gtk/Avalonia.Gtk/Properties/AssemblyInfo.cs deleted file mode 100644 index 67e5f6dc17..0000000000 --- a/src/Gtk/Avalonia.Gtk/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using Avalonia.Gtk; -using Avalonia.Platform; -using System.Reflection; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. -[assembly: AssemblyTitle("Avalonia.Gtk")] - -[assembly: ExportWindowingSubsystem(OperatingSystemType.WinNT, 3, "GTK", typeof(GtkPlatform), nameof(GtkPlatform.Initialize))] -[assembly: ExportWindowingSubsystem(OperatingSystemType.Linux, 2, "GTK", typeof(GtkPlatform), nameof(GtkPlatform.Initialize))] -[assembly: ExportWindowingSubsystem(OperatingSystemType.OSX, 3, "GTK", typeof(GtkPlatform), nameof(GtkPlatform.Initialize))] - diff --git a/src/Gtk/Avalonia.Gtk/ScreenImpl.cs b/src/Gtk/Avalonia.Gtk/ScreenImpl.cs deleted file mode 100644 index a5082ca59a..0000000000 --- a/src/Gtk/Avalonia.Gtk/ScreenImpl.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using Avalonia.Controls; -using Avalonia.Platform; -using Avalonia.Utilities; -using Gdk; -using Screen = Avalonia.Platform.Screen; -using Window = Gtk.Window; - -namespace Avalonia.Gtk -{ - internal class ScreenImpl : IScreenImpl - { - private Window window; - - public int ScreenCount - { - get => window.Display.DefaultScreen.NMonitors; - } - public Screen[] AllScreens { - get - { - Screen[] screens = new Screen[ScreenCount]; - var screen = window.Display.DefaultScreen; - - for (short i = 0; i < screens.Length; i++) - { - Rectangle geometry = screen.GetMonitorGeometry(i); - Rect geometryRect = new Rect(geometry.X, geometry.Y, geometry.Width, geometry.Height); - Screen s = new Screen(geometryRect, geometryRect, false); - screens[i] = s; - } - - return screens; - } - } - - public ScreenImpl(Window window) - { - this.window = window; - } - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs b/src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs deleted file mode 100644 index 29f4ce1d15..0000000000 --- a/src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Controls.Platform.Surfaces; -using Avalonia.Platform; -using Cairo; -using Gdk; - -namespace Avalonia.Gtk -{ - class SurfaceFramebuffer : ILockedFramebuffer - { - private Drawable _drawable; - private ImageSurface _surface; - - public SurfaceFramebuffer(int width, int height) - { - _surface = new ImageSurface(Cairo.Format.RGB24, width, height); - } - - public void SetDrawable(Drawable drawable) - { - _drawable = drawable; - _surface.Flush(); - } - - public void Deallocate() - { - _surface.Dispose(); - _surface = null; - } - - public void Dispose() - { - using (var ctx = CairoHelper.Create(_drawable)) - { - _surface.MarkDirty(); - ctx.SetSourceSurface(_surface, 0, 0); - ctx.Paint(); - } - _drawable = null; - } - - public IntPtr Address => _surface.DataPtr; - public int Width => _surface.Width; - public int Height => _surface.Height; - public int RowBytes => _surface.Stride; - //TODO: Proper DPI detect - public Vector Dpi => new Vector(96, 96); - public PixelFormat Format => PixelFormat.Bgra8888; - } -} - diff --git a/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs b/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs deleted file mode 100644 index 05dc1bf02d..0000000000 --- a/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Controls; -using Avalonia.Controls.Platform; -using Avalonia.Platform; - -namespace Avalonia.Gtk -{ - using global::Gtk; - class SystemDialogImpl : ISystemDialogImpl - { - public Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) - { - var tcs = new TaskCompletionSource(); - var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((TopLevelImpl)parent)?.Widget.Toplevel as Window, - dialog is OpenFileDialog - ? FileChooserAction.Open - : FileChooserAction.Save, - "Cancel", ResponseType.Cancel, - "Open", ResponseType.Accept) - { - SelectMultiple = (dialog as OpenFileDialog)?.AllowMultiple ?? false, - }; - foreach (var filter in dialog.Filters) - { - var ffilter = new FileFilter() - { - Name = filter.Name + " (" + string.Join(";", filter.Extensions.Select(e => "*." + e)) + ")" - }; - foreach (var ext in filter.Extensions) - ffilter.AddPattern("*." + ext); - dlg.AddFilter(ffilter); - } - dlg.SetFilename(dialog.InitialFileName); - dlg.Modal = true; - - dlg.Response += (_, args) => - { - if (args.ResponseId == ResponseType.Accept) - tcs.TrySetResult(dlg.Filenames); - dlg.Hide(); - dlg.Dispose(); - }; - - dlg.Close += delegate - { - tcs.TrySetResult(null); - dlg.Dispose(); - }; - dlg.Show(); - return tcs.Task; - } - - public Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) - { - var tcs = new TaskCompletionSource(); - var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((TopLevelImpl)parent)?.Widget.Toplevel as Window, - FileChooserAction.SelectFolder, - "Cancel", ResponseType.Cancel, - "Select Folder", ResponseType.Accept) - { - - }; - - dlg.Modal = true; - - dlg.Response += (_, args) => - { - if (args.ResponseId == ResponseType.Accept) - tcs.TrySetResult(dlg.Filename); - - dlg.Hide(); - dlg.Dispose(); - }; - - dlg.Close += delegate - { - tcs.TrySetResult(null); - dlg.Dispose(); - }; - dlg.Show(); - return tcs.Task; - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs deleted file mode 100644 index 5c18d015d4..0000000000 --- a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; -using System.Collections.Generic; -using Avalonia.Input; -using Avalonia.Input.Raw; -using Avalonia.Platform; -using Gdk; -using Action = System.Action; -using WindowEdge = Avalonia.Controls.WindowEdge; -using GLib; -using Avalonia.Rendering; - -namespace Avalonia.Gtk -{ - using Gtk = global::Gtk; - - public abstract class TopLevelImpl : ITopLevelImpl - { - private IInputRoot _inputRoot; - private Gtk.Widget _widget; - private FramebufferManager _framebuffer; - - private Gtk.IMContext _imContext; - - private uint _lastKeyEventTimestamp; - - private static readonly Gdk.Cursor DefaultCursor = new Gdk.Cursor(CursorType.LeftPtr); - - protected TopLevelImpl(Gtk.Widget window) - { - _widget = window; - _framebuffer = new FramebufferManager(this); - Init(); - } - - void Init() - { - Handle = _widget as IPlatformHandle; - _widget.Events = EventMask.AllEventsMask; - _imContext = new Gtk.IMMulticontext(); - _imContext.Commit += ImContext_Commit; - _widget.Realized += OnRealized; - _widget.Realize(); - _widget.ButtonPressEvent += OnButtonPressEvent; - _widget.ButtonReleaseEvent += OnButtonReleaseEvent; - _widget.ScrollEvent += OnScrollEvent; - _widget.Destroyed += OnDestroyed; - _widget.KeyPressEvent += OnKeyPressEvent; - _widget.KeyReleaseEvent += OnKeyReleaseEvent; - _widget.ExposeEvent += OnExposeEvent; - _widget.MotionNotifyEvent += OnMotionNotifyEvent; - - - } - - public IPlatformHandle Handle { get; private set; } - public Gtk.Widget Widget => _widget; - public Gdk.Drawable CurrentDrawable { get; private set; } - - void OnRealized (object sender, EventArgs eventArgs) - { - _imContext.ClientWindow = _widget.GdkWindow; - } - - public abstract Size ClientSize { get; } - - public Size MaxClientSize - { - get - { - // TODO: This should take into account things such as taskbar and window border - // thickness etc. - return new Size(_widget.Screen.Width, _widget.Screen.Height); - } - } - - public IMouseDevice MouseDevice => GtkMouseDevice.Instance; - - public Avalonia.Controls.WindowState WindowState - { - get - { - switch (_widget.GdkWindow.State) - { - case Gdk.WindowState.Iconified: - return Controls.WindowState.Minimized; - case Gdk.WindowState.Maximized: - return Controls.WindowState.Maximized; - default: - return Controls.WindowState.Normal; - } - } - - set - { - switch (value) - { - case Controls.WindowState.Minimized: - _widget.GdkWindow.Iconify(); - break; - case Controls.WindowState.Maximized: - _widget.GdkWindow.Maximize(); - break; - case Controls.WindowState.Normal: - _widget.GdkWindow.Deiconify(); - _widget.GdkWindow.Unmaximize(); - break; - } - } - } - - public double Scaling => 1; - - public Action Activated { get; set; } - - public Action Closed { get; set; } - - - public Action Deactivated { get; set; } - - public Action Input { get; set; } - - public Action Paint { get; set; } - - public Action Resized { get; set; } - - public Action PositionChanged { get; set; } - - public Action ScalingChanged { get; set; } - - public IEnumerable Surfaces => new object[] - { - Handle, - new Func(() => CurrentDrawable), - _framebuffer - }; - - public IPopupImpl CreatePopup() - { - return new PopupImpl(); - } - - public IRenderer CreateRenderer(IRenderRoot root) - { - return new ImmediateRenderer(root); - } - - public void Invalidate(Rect rect) - { - if (_widget?.GdkWindow != null) - _widget.GdkWindow.InvalidateRect( - new Rectangle((int) rect.X, (int) rect.Y, (int) rect.Width, (int) rect.Height), true); - } - - public Point PointToClient(Point point) - { - int x, y; - _widget.GdkWindow.GetDeskrelativeOrigin(out x, out y); - - return new Point(point.X - x, point.Y - y); - } - - public Point PointToScreen(Point point) - { - int x, y; - _widget.GdkWindow.GetDeskrelativeOrigin(out x, out y); - return new Point(point.X + x, point.Y + y); - } - - public void SetInputRoot(IInputRoot inputRoot) - { - _inputRoot = inputRoot; - } - - - public void SetCursor(IPlatformHandle cursor) - { - _widget.GdkWindow.Cursor = cursor != null ? new Gdk.Cursor(cursor.Handle) : DefaultCursor; - } - - public void Show() => _widget.Show(); - - public void Hide() => _widget.Hide(); - - private static InputModifiers GetModifierKeys(ModifierType state) - { - var rv = InputModifiers.None; - if (state.HasFlag(ModifierType.ControlMask)) - rv |= InputModifiers.Control; - if (state.HasFlag(ModifierType.ShiftMask)) - rv |= InputModifiers.Shift; - if (state.HasFlag(ModifierType.Mod1Mask)) - rv |= InputModifiers.Control; - if(state.HasFlag(ModifierType.Button1Mask)) - rv |= InputModifiers.LeftMouseButton; - if (state.HasFlag(ModifierType.Button2Mask)) - rv |= InputModifiers.RightMouseButton; - if (state.HasFlag(ModifierType.Button3Mask)) - rv |= InputModifiers.MiddleMouseButton; - return rv; - } - - void OnButtonPressEvent(object o, Gtk.ButtonPressEventArgs args) - { - var evnt = args.Event; - var e = new RawMouseEventArgs( - GtkMouseDevice.Instance, - evnt.Time, - _inputRoot, - evnt.Button == 1 - ? RawMouseEventType.LeftButtonDown - : evnt.Button == 3 ? RawMouseEventType.RightButtonDown : RawMouseEventType.MiddleButtonDown, - new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State)); - Input(e); - } - - void OnScrollEvent(object o, Gtk.ScrollEventArgs args) - { - var evnt = args.Event; - double step = 1; - var delta = new Vector(); - if (evnt.Direction == ScrollDirection.Down) - delta = new Vector(0, -step); - else if (evnt.Direction == ScrollDirection.Up) - delta = new Vector(0, step); - else if (evnt.Direction == ScrollDirection.Right) - delta = new Vector(-step, 0); - if (evnt.Direction == ScrollDirection.Left) - delta = new Vector(step, 0); - var e = new RawMouseWheelEventArgs(GtkMouseDevice.Instance, evnt.Time, _inputRoot, new Point(evnt.X, evnt.Y), delta, GetModifierKeys(evnt.State)); - Input(e); - } - - protected void OnButtonReleaseEvent(object o, Gtk.ButtonReleaseEventArgs args) - { - var evnt = args.Event; - var e = new RawMouseEventArgs( - GtkMouseDevice.Instance, - evnt.Time, - _inputRoot, - evnt.Button == 1 - ? RawMouseEventType.LeftButtonUp - : evnt.Button == 3 ? RawMouseEventType.RightButtonUp : RawMouseEventType.MiddleButtonUp, - new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State)); - Input(e); - } - - void OnDestroyed(object sender, EventArgs eventArgs) - { - Closed(); - } - - private void ProcessKeyEvent(EventKey evnt) - { - - _lastKeyEventTimestamp = evnt.Time; - if (_imContext.FilterKeypress(evnt)) - return; - var e = new RawKeyEventArgs( - GtkKeyboardDevice.Instance, - evnt.Time, - evnt.Type == EventType.KeyPress ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp, - Common.KeyTransform.ConvertKey(evnt.Key), GetModifierKeys(evnt.State)); - Input(e); - } - - [ConnectBefore] - void OnKeyPressEvent(object o, Gtk.KeyPressEventArgs args) - { - args.RetVal = true; - ProcessKeyEvent(args.Event); - } - - void OnKeyReleaseEvent(object o, Gtk.KeyReleaseEventArgs args) - { - args.RetVal = true; - ProcessKeyEvent(args.Event); - } - - private void ImContext_Commit(object o, Gtk.CommitArgs args) - { - Input(new RawTextInputEventArgs(GtkKeyboardDevice.Instance, _lastKeyEventTimestamp, args.Str)); - } - - void OnExposeEvent(object o, Gtk.ExposeEventArgs args) - { - CurrentDrawable = args.Event.Window; - Paint(args.Event.Area.ToAvalonia()); - CurrentDrawable = null; - args.RetVal = true; - } - - void OnMotionNotifyEvent(object o, Gtk.MotionNotifyEventArgs args) - { - var evnt = args.Event; - var position = new Point(evnt.X, evnt.Y); - - GtkMouseDevice.Instance.SetClientPosition(position); - - var e = new RawMouseEventArgs( - GtkMouseDevice.Instance, - evnt.Time, - _inputRoot, - RawMouseEventType.Move, - position, GetModifierKeys(evnt.State)); - Input(e); - args.RetVal = true; - } - - public void Dispose() - { - _framebuffer.Dispose(); - _widget.Hide(); - _widget.Dispose(); - _widget = null; - } - } -} diff --git a/src/Gtk/Avalonia.Gtk/WindowImpl.cs b/src/Gtk/Avalonia.Gtk/WindowImpl.cs deleted file mode 100644 index ef8f5f95cb..0000000000 --- a/src/Gtk/Avalonia.Gtk/WindowImpl.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Reactive.Disposables; -using Avalonia.Controls; -using Avalonia.Platform; -using Gdk; - -namespace Avalonia.Gtk -{ - using Gtk = global::Gtk; - - public class WindowImpl : TopLevelImpl, IWindowImpl - { - private Gtk.Window _window; - private Gtk.Window Window => _window ?? (_window = (Gtk.Window)Widget); - - public WindowImpl(Gtk.WindowType type) : base(new PlatformHandleAwareWindow(type)) - { - Init(); - } - - public WindowImpl() - : base(new PlatformHandleAwareWindow(Gtk.WindowType.Toplevel) {DefaultSize = new Gdk.Size(900, 480)}) - { - Init(); - } - - void Init() - { - Window.FocusActivated += OnFocusActivated; - Window.ConfigureEvent += OnConfigureEvent; - _lastClientSize = ClientSize; - _lastPosition = Position; - } - - private Size _lastClientSize; - private Point _lastPosition; - - void OnConfigureEvent(object o, Gtk.ConfigureEventArgs args) - { - var evnt = args.Event; - args.RetVal = true; - var newSize = new Size(evnt.Width, evnt.Height); - - if (newSize != _lastClientSize) - { - Resized(newSize); - _lastClientSize = newSize; - } - - var newPosition = new Point(evnt.X, evnt.Y); - - if (newPosition != _lastPosition) - { - PositionChanged(newPosition); - _lastPosition = newPosition; - } - } - - public override Size ClientSize - { - get - { - int width; - int height; - Window.GetSize(out width, out height); - return new Size(width, height); - } - } - - public IScreenImpl Screen => new ScreenImpl(Window); - - public void Resize(Size value) - { - Window.Resize((int)value.Width, (int)value.Height); - } - - public void SetTitle(string title) - { - Window.Title = title; - } - - void IWindowBaseImpl.Activate() - { - _window.Activate(); - } - - void OnFocusActivated(object sender, EventArgs eventArgs) - { - Activated(); - } - - public void BeginMoveDrag() - { - int x, y; - ModifierType mod; - Window.Screen.RootWindow.GetPointer(out x, out y, out mod); - Window.BeginMoveDrag(1, x, y, 0); - } - - public void BeginResizeDrag(Controls.WindowEdge edge) - { - int x, y; - ModifierType mod; - Window.Screen.RootWindow.GetPointer(out x, out y, out mod); - Window.BeginResizeDrag((Gdk.WindowEdge)(int)edge, 1, x, y, 0); - } - - public Point Position - { - get - { - int x, y; - Window.GetPosition(out x, out y); - return new Point(x, y); - } - set { Window.Move((int)value.X, (int)value.Y); } - } - - public IDisposable ShowDialog() - { - Window.Modal = true; - Window.Show(); - - return Disposable.Empty; - } - - public void SetSystemDecorations(bool enabled) => Window.Decorated = enabled; - - public void SetIcon(IWindowIconImpl icon) - { - Window.Icon = ((IconImpl)icon).Pixbuf; - } - - public void ShowTaskbarIcon(bool value) => Window.SkipTaskbarHint = !value; - } -} \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Windows.cs b/src/Gtk/Avalonia.Gtk/Windows.cs deleted file mode 100644 index fe325f4114..0000000000 --- a/src/Gtk/Avalonia.Gtk/Windows.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Platform; -using Gdk; -using Gtk; -using Window = Gtk.Window; -using WindowType = Gtk.WindowType; - -namespace Avalonia.Gtk -{ - class PlatformHandleAwareWindow : Window, IPlatformHandle - { - public PlatformHandleAwareWindow(WindowType type) : base(type) - { - Events = EventMask.AllEventsMask; - } - - IntPtr IPlatformHandle.Handle => GetNativeWindow(); - public string HandleDescriptor => "HWND"; - - - [DllImport("libgdk-win32-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr gdk_win32_drawable_get_handle(IntPtr gdkWindow); - - [DllImport("libgtk-x11-2.0.so.0", CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr gdk_x11_drawable_get_xid(IntPtr gdkWindow); - - [DllImport("libgdk-quartz-2.0-0.dylib", CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr gdk_quartz_window_get_nswindow(IntPtr gdkWindow); - - IntPtr _nativeWindow; - - IntPtr GetNativeWindow() - { - if (_nativeWindow != IntPtr.Zero) - return _nativeWindow; - return _nativeWindow = GetNativeWindow(GdkWindow); - } - - public static IntPtr GetNativeWindow(Gdk.Window window) - { - IntPtr h = window.Handle; - - //Try whatever backend that works - try - { - return gdk_quartz_window_get_nswindow(h); - } - catch - { - } - try - { - return gdk_x11_drawable_get_xid(h); - } - catch - { - } - return gdk_win32_drawable_get_handle(h); - } - - protected override bool OnConfigureEvent(EventConfigure evnt) - { - base.OnConfigureEvent(evnt); - return false; - } - } - - class PlatformHandleAwareDrawingArea : DrawingArea, IPlatformHandle - { - - - - IntPtr IPlatformHandle.Handle => GetNativeWindow(); - public string HandleDescriptor => "HWND"; - IntPtr _nativeWindow; - - IntPtr GetNativeWindow() - { - - if (_nativeWindow != IntPtr.Zero) - return _nativeWindow; - Realize(); - return _nativeWindow = PlatformHandleAwareWindow.GetNativeWindow(GdkWindow); - } - } -} diff --git a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj index 59bd58916b..bff41a65eb 100644 --- a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj +++ b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj @@ -25,9 +25,7 @@ - - KeyTransform.cs - + diff --git a/src/Gtk/Avalonia.Gtk/KeyTransform.cs b/src/Gtk/Avalonia.Gtk3/KeyTransform.cs similarity index 99% rename from src/Gtk/Avalonia.Gtk/KeyTransform.cs rename to src/Gtk/Avalonia.Gtk3/KeyTransform.cs index 77de8d18a3..de3a4766a1 100644 --- a/src/Gtk/Avalonia.Gtk/KeyTransform.cs +++ b/src/Gtk/Avalonia.Gtk3/KeyTransform.cs @@ -4,11 +4,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Avalonia.Input; -#if GTK3_PINVOKE using Avalonia.Gtk3; -#else -using GdkKey = Gdk.Key; -#endif + namespace Avalonia.Gtk.Common { static class KeyTransform diff --git a/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj b/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj index 817b753157..368e5986b2 100644 --- a/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj +++ b/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj @@ -94,10 +94,6 @@ {eb582467-6abb-43a1-b052-e981ba910e3a} Avalonia.Visuals - - {fb05ac90-89ba-4f2f-a924-f37875fb547c} - Avalonia.Cairo - {3e53a01a-b331-47f3-b828-4a5717e77a24} Avalonia.Markup.Xaml diff --git a/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs b/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs index 9de97b41cc..867f740a3a 100644 --- a/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs +++ b/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs @@ -99,7 +99,7 @@ namespace Avalonia.Controls.UnitTests } } - [Fact] + [Fact (Skip = "We don't have rendering modules with dependencies right now")] public void LoadsRenderingModuleWithoutDependenciesWhenNoModuleMatches() { using (AvaloniaLocator.EnterScope()) @@ -107,7 +107,7 @@ namespace Avalonia.Controls.UnitTests ResetModuleLoadStates(); var builder = AppBuilder.Configure() .UseWindowingSubsystem(() => { }) - .UseRenderingSubsystem(() => { }, "Cairo"); + .UseRenderingSubsystem(() => { }, "TBD"); builder.UseAvaloniaModules().SetupWithoutStarting(); Assert.True(DefaultRenderingModule.IsLoaded); Assert.False(Direct2DModule.IsLoaded); diff --git a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj deleted file mode 100644 index 98256529bc..0000000000 --- a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - Debug - AnyCPU - {E106CF37-4066-4615-B684-172A6D30B058} - Library - Properties - Avalonia.Cairo.RenderTests - Avalonia.Cairo.RenderTests - v4.6.1 - 512 - - - - true - full - false - ..\..\artifacts\tests\ - TRACE;DEBUG;AVALONIA_CAIRO - prompt - 4 - - - pdbonly - true - ..\..\artifacts\tests\ - TRACE;AVALONIA_CAIRO - prompt - 4 - - - - - - - - - {FB05AC90-89BA-4F2F-A924-F37875FB547C} - Avalonia.Cairo - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} - Avalonia.Animation - - - {B09B78D8-9B26-48B0-9149-D64A2F120F3F} - Avalonia.Base - - - {D2221C82-4A25-4583-9B43-D791E3F6820C} - Avalonia.Controls - - - {62024B2D-53EB-4638-B26B-85EEAA54866E} - Avalonia.Input - - - {6B0ED19D-A08B-461C-A9D9-A9EE40B0C06B} - Avalonia.Interactivity - - - {42472427-4774-4C81-8AFF-9F27B8E31721} - Avalonia.Layout - - - {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.Visuals - - - {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} - Avalonia.Styling - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj index a1c323ceb0..445f8b0368 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj @@ -72,9 +72,6 @@ Avalonia.Styling - - - diff --git a/tests/Avalonia.RenderTests/Controls/BorderTests.cs b/tests/Avalonia.RenderTests/Controls/BorderTests.cs index ef33ecad8e..3bd5a6e1cb 100644 --- a/tests/Avalonia.RenderTests/Controls/BorderTests.cs +++ b/tests/Avalonia.RenderTests/Controls/BorderTests.cs @@ -7,9 +7,7 @@ using Avalonia.Layout; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Controls -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Controls @@ -149,11 +147,8 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else + [Fact] -#endif public async Task Border_Centers_Content_Horizontally() { Decorator target = new Decorator @@ -180,11 +175,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Centers_Content_Vertically() { Decorator target = new Decorator @@ -211,11 +202,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Stretches_Content_Horizontally() { Decorator target = new Decorator @@ -242,11 +229,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Stretches_Content_Vertically() { Decorator target = new Decorator @@ -273,11 +256,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Left_Aligns_Content() { Decorator target = new Decorator @@ -304,11 +283,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Right_Aligns_Content() { Decorator target = new Decorator @@ -335,11 +310,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Top_Aligns_Content() { Decorator target = new Decorator @@ -366,11 +337,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#else [Fact] -#endif public async Task Border_Bottom_Aligns_Content() { Decorator target = new Decorator diff --git a/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs b/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs index e4630d8265..8356e78cc3 100644 --- a/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs +++ b/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs @@ -8,9 +8,7 @@ using Avalonia.Layout; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Controls -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Controls diff --git a/tests/Avalonia.RenderTests/Controls/ImageTests.cs b/tests/Avalonia.RenderTests/Controls/ImageTests.cs index 9c1d3624d1..593593ba3c 100644 --- a/tests/Avalonia.RenderTests/Controls/ImageTests.cs +++ b/tests/Avalonia.RenderTests/Controls/ImageTests.cs @@ -8,9 +8,7 @@ using Avalonia.Media; using Avalonia.Media.Imaging; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Controls -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Controls diff --git a/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs b/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs index 5b1d76cd0f..a5d06a1b0e 100644 --- a/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs +++ b/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs @@ -6,9 +6,7 @@ using Avalonia.Layout; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Controls -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Controls diff --git a/tests/Avalonia.RenderTests/GeometryClippingTests.cs b/tests/Avalonia.RenderTests/GeometryClippingTests.cs index a1ce8097bd..01af638e6d 100644 --- a/tests/Avalonia.RenderTests/GeometryClippingTests.cs +++ b/tests/Avalonia.RenderTests/GeometryClippingTests.cs @@ -7,9 +7,7 @@ using System.Text; using Xunit; using System.Threading.Tasks; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests diff --git a/tests/Avalonia.RenderTests/Media/BitmapTests.cs b/tests/Avalonia.RenderTests/Media/BitmapTests.cs index 33c14fb975..f01f78ae94 100644 --- a/tests/Avalonia.RenderTests/Media/BitmapTests.cs +++ b/tests/Avalonia.RenderTests/Media/BitmapTests.cs @@ -13,9 +13,7 @@ using Avalonia.Media.Imaging; using Avalonia.Platform; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Media -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Media @@ -105,11 +103,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImagesNoRenderer(testName); } -#if AVALONIA_CAIRO - //wontfix -#else [Theory] -#endif [InlineData(PixelFormat.Bgra8888), InlineData(PixelFormat.Rgba8888)] public void WritableBitmapShouldBeUsable(PixelFormat fmt) { diff --git a/tests/Avalonia.RenderTests/Media/FormattedTextImplTests.cs b/tests/Avalonia.RenderTests/Media/FormattedTextImplTests.cs index 4f8aeb93ac..a8f9d42c1e 100644 --- a/tests/Avalonia.RenderTests/Media/FormattedTextImplTests.cs +++ b/tests/Avalonia.RenderTests/Media/FormattedTextImplTests.cs @@ -9,9 +9,7 @@ using System.Linq; using System.Text; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Media -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else @@ -86,11 +84,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media widthConstraint); } -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("", FontSize, 0, FontSizeHeight)] [InlineData("x", FontSize, 7.20, FontSizeHeight)] [InlineData(stringword, FontSize, 28.80, FontSizeHeight)] @@ -114,12 +109,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media Assert.Equal(expHeight, linesHeight, 2); } - -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("", 1, -1, TextWrapping.NoWrap)] [InlineData("x", 1, -1, TextWrapping.NoWrap)] [InlineData(stringword, 1, -1, TextWrapping.NoWrap)] @@ -142,12 +133,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media var lines = constrained.GetLines().ToArray(); Assert.Equal(linesCount, lines.Count()); } - -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("x", 0, 0, true, false, 0)] [InlineData(stringword, -1, -1, false, false, 0)] [InlineData(stringword, 25, 13, true, false, 3)] @@ -181,12 +168,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media Assert.Equal(isInside, htRes.IsInside); Assert.Equal(isTrailing, htRes.IsTrailing); } - -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("", 0, 0, 0, 0, FontSizeHeight)] [InlineData("x", 0, 0, 0, 7.20, FontSizeHeight)] [InlineData("x", -1, 7.20, 0, 0, FontSizeHeight)] @@ -207,12 +190,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media Assert.Equal(width, r.Width, 2); Assert.Equal(height, r.Height, 2); } - -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("x", 0, 200, 200 - 7.20, 0, 7.20, FontSizeHeight)] [InlineData(stringword, 0, 200, 171.20, 0, 7.20, FontSizeHeight)] [InlineData(stringword, 3, 200, 200 - 7.20, 0, 7.20, FontSizeHeight)] @@ -230,12 +209,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media Assert.Equal(width, r.Width, 2); Assert.Equal(height, r.Height, 2); } - -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("x", 0, 200, 100 - 7.20 / 2, 0, 7.20, FontSizeHeight)] [InlineData(stringword, 0, 200, 85.6, 0, 7.20, FontSizeHeight)] [InlineData(stringword, 3, 200, 100 + 7.20, 0, 7.20, FontSizeHeight)] @@ -253,12 +228,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media Assert.Equal(width, r.Width, 2); Assert.Equal(height, r.Height, 2); } - -#if AVALONIA_CAIRO - [Theory(Skip = "TODO: Font scaling currently broken on cairo")] -#else + [Theory] -#endif [InlineData("x", 0, 1, "0,0,7.20,13.59")] [InlineData(stringword, 0, 4, "0,0,28.80,13.59")] [InlineData(stringmiddlenewlines, 10, 10, "0,13.59,57.61,13.59")] diff --git a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs index b8f81696b1..6381bceadc 100644 --- a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs @@ -9,9 +9,7 @@ using Avalonia.Media; using Avalonia.Media.Imaging; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Media -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Media @@ -366,11 +364,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "TileMode.FlipX not yet supported on cairo")] -#else + [Fact] -#endif public async Task ImageBrush_NoStretch_FlipX_TopLeftDest() { Decorator target = new Decorator @@ -393,12 +388,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "TileMode.FlipY not yet supported on cairo")] -#else + [Fact] -#endif public async Task ImageBrush_NoStretch_FlipY_TopLeftDest() { Decorator target = new Decorator diff --git a/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs index e7889672b9..062c7d88f5 100644 --- a/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs @@ -10,9 +10,7 @@ using System.Text; using System.Threading.Tasks; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Media -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Media diff --git a/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs index 383c8ee0f8..b3e214f863 100644 --- a/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs @@ -10,9 +10,7 @@ using System.Text; using System.Threading.Tasks; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Media -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Media diff --git a/tests/Avalonia.RenderTests/Media/VisualBrushTests.cs b/tests/Avalonia.RenderTests/Media/VisualBrushTests.cs index 9ec901535a..60589f6a00 100644 --- a/tests/Avalonia.RenderTests/Media/VisualBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/VisualBrushTests.cs @@ -9,9 +9,7 @@ using Avalonia.Media; using Avalonia.Media.Imaging; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Media -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Media @@ -85,10 +83,8 @@ namespace Avalonia.Direct2D1.RenderTests.Media await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL + +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -142,9 +138,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -171,9 +165,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -200,9 +192,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -253,9 +243,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -337,9 +325,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "TileMode.FlipX not yet supported on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -367,9 +353,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "TileMode.FlipY not yet supported on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -397,9 +381,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] @@ -427,9 +409,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] diff --git a/tests/Avalonia.RenderTests/OpacityMaskTests.cs b/tests/Avalonia.RenderTests/OpacityMaskTests.cs index b49f04f3ee..b53d9a70b1 100644 --- a/tests/Avalonia.RenderTests/OpacityMaskTests.cs +++ b/tests/Avalonia.RenderTests/OpacityMaskTests.cs @@ -7,9 +7,7 @@ using System.Text; using Xunit; using System.Threading.Tasks; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests diff --git a/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs b/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs index 9687e817e3..257607d5b5 100644 --- a/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/EllipseTests.cs @@ -7,9 +7,7 @@ using Avalonia.Controls.Shapes; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Shapes -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Shapes diff --git a/tests/Avalonia.RenderTests/Shapes/LineTests.cs b/tests/Avalonia.RenderTests/Shapes/LineTests.cs index a5897a2948..a30882fb0d 100644 --- a/tests/Avalonia.RenderTests/Shapes/LineTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/LineTests.cs @@ -7,9 +7,7 @@ using Avalonia.Controls.Shapes; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Shapes -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Shapes @@ -21,12 +19,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes : base(@"Shapes\Line") { } - -#if !AVALONIA_CAIRO + [Fact] -#else - [Fact(Skip = "Fails on Cairo")] -#endif public async Task Line_1px_Stroke() { Decorator target = new Decorator @@ -45,12 +39,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if !AVALONIA_CAIRO + [Fact] -#else - [Fact(Skip = "Fails on Cairo")] -#endif public async Task Line_1px_Stroke_Reversed() { Decorator target = new Decorator diff --git a/tests/Avalonia.RenderTests/Shapes/PathTests.cs b/tests/Avalonia.RenderTests/Shapes/PathTests.cs index 0fc3246635..9a580794f8 100644 --- a/tests/Avalonia.RenderTests/Shapes/PathTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PathTests.cs @@ -7,9 +7,7 @@ using Avalonia.Layout; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Shapes -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Shapes @@ -25,11 +23,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes { } -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task Line_Absolute() { Decorator target = new Decorator @@ -49,12 +44,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task Line_Relative() { Decorator target = new Decorator @@ -74,12 +65,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task HorizontalLine_Absolute() { Decorator target = new Decorator @@ -99,12 +86,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task HorizontalLine_Relative() { Decorator target = new Decorator @@ -124,12 +107,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task VerticalLine_Absolute() { Decorator target = new Decorator @@ -149,12 +128,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task VerticalLine_Relative() { Decorator target = new Decorator @@ -174,12 +149,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task CubicBezier_Absolute() { Decorator target = new Decorator @@ -200,12 +171,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task CubicBezier_Relative() { Decorator target = new Decorator @@ -226,12 +193,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task Arc_Absolute() { Decorator target = new Decorator @@ -252,12 +215,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Broken in Cairo: waiting for Skia")] -#else + [Fact] -#endif public async Task Arc_Relative() { Decorator target = new Decorator @@ -375,9 +334,7 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Path with StrokeDashCap, StrokeStartLineCap, StrokeEndLineCap rendering is not implemented in Cairo yet")] -#elif AVALONIA_SKIA_SKIP_FAIL +#if AVALONIA_SKIA_SKIP_FAIL [Fact(Skip = "FIXME")] #else [Fact] diff --git a/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs b/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs index 415f0b4e85..aae5706810 100644 --- a/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs @@ -7,9 +7,7 @@ using Avalonia.Controls.Shapes; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Shapes -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Shapes @@ -21,12 +19,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes : base(@"Shapes\Polygon") { } - -#if AVALONIA_CAIRO - [Fact(Skip = "Caused by cairo bug")] -#else + [Fact] -#endif public async Task Polygon_1px_Stroke() { Decorator target = new Decorator @@ -48,11 +42,7 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes CompareImages(); } -#if AVALONIA_CAIRO - [Fact(Skip = "Caused by cairo bug")] -#else [Fact] -#endif public async Task Polygon_NonUniformFill() { Decorator target = new Decorator diff --git a/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs b/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs index 684529dd4b..3b586d55ea 100644 --- a/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs @@ -7,9 +7,7 @@ using Avalonia.Controls.Shapes; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Shapes -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Shapes @@ -22,11 +20,7 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes { } -#if AVALONIA_CAIRO - [Fact(Skip = "Caused by cairo bug")] -#else [Fact] -#endif public async Task Polyline_1px_Stroke() { var polylinePoints = new Point[] { new Point(0, 0), new Point(5, 0), new Point(6, -2), new Point(7, 3), new Point(8, -3), @@ -49,12 +43,8 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes await RenderToFile(target); CompareImages(); } - -#if AVALONIA_CAIRO - [Fact(Skip = "Caused by cairo bug")] -#else + [Fact] -#endif public async Task Polyline_10px_Stroke_PenLineJoin() { var polylinePoints = new Point[] { new Point(0, 0), new Point(5, 0), new Point(6, -2), new Point(7, 3), new Point(8, -3), diff --git a/tests/Avalonia.RenderTests/Shapes/RectangleTests.cs b/tests/Avalonia.RenderTests/Shapes/RectangleTests.cs index 5fa424103f..d48765a360 100644 --- a/tests/Avalonia.RenderTests/Shapes/RectangleTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/RectangleTests.cs @@ -7,9 +7,7 @@ using Avalonia.Controls.Shapes; using Avalonia.Media; using Xunit; -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests.Shapes -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests.Shapes diff --git a/tests/Avalonia.RenderTests/TestBase.cs b/tests/Avalonia.RenderTests/TestBase.cs index 80168c1237..e733f59059 100644 --- a/tests/Avalonia.RenderTests/TestBase.cs +++ b/tests/Avalonia.RenderTests/TestBase.cs @@ -14,17 +14,13 @@ using System.Threading.Tasks; using System; using System.Threading; -#if AVALONIA_CAIRO -using Avalonia.Cairo; -#elif AVALONIA_SKIA +#if AVALONIA_SKIA using Avalonia.Skia; #else using Avalonia.Direct2D1; #endif -#if AVALONIA_CAIRO -namespace Avalonia.Cairo.RenderTests -#elif AVALONIA_SKIA +#if AVALONIA_SKIA namespace Avalonia.Skia.RenderTests #else namespace Avalonia.Direct2D1.RenderTests @@ -37,9 +33,7 @@ namespace Avalonia.Direct2D1.RenderTests static TestBase() { -#if AVALONIA_CAIRO - CairoPlatform.Initialize(); -#elif AVALONIA_SKIA +#if AVALONIA_SKIA SkiaPlatform.Initialize(); #else Direct2D1Platform.Initialize(); diff --git a/tests/Avalonia.RenderTests/app.config b/tests/Avalonia.RenderTests/app.config deleted file mode 100644 index 24ccddee3e..0000000000 --- a/tests/Avalonia.RenderTests/app.config +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_1px_Border.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_1px_Border.expected.png deleted file mode 100644 index 24239d5799ab3308d44bf2ab283758dc0202c9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggiQCh~F{C2y?d6Sv%?<)A2iyM?yPcbPh2!_C+c#Ot_<%YX7!CwopH zT&&Nl(zxO3{rvlz4{$d+2yn2B5<@o(TC%sVM%xNb!1@J z*w6hZk(GggiPzJ`F{C2y?bVIE4Gugk2iyNuvng7}DIQ8!+sU@)6BAGi1H+9ghSBRH zZv>hZoMV!=l|Le$Xukg4E%rtQ0S=~7Vu*%8!I^2!!coe${k}9u$q-*SzP(`7@7M#h9+25ad2&&-vu`pQoqbvUKezArishE?GVM%xNb!1@J z*w6hZk(GggNzl{9F{C2y?Nvj*!v;JojyM1R-+XC9L84C6lv6&%@(-H0ftnZ?9t2#^ zxw*MuQO<*TtZ_Ae9rpbP0l+XkKY#Dbw diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Horizontally.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Horizontally.expected.png deleted file mode 100644 index 77a7601e1348985970742148a38a0d56bb43d6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyDDd^)E+vHWA)s?x=e)(d7jZ+<^{0>krzjQ@)SB$v|g>_?1oIjk)c( zF4k?Y>9*G=WtzR$xCb@PiMM+kemq9{_Q#OEq|Dg+Mds_P>)$kgs-VOnAHf`t$5H9C;@`$v(N6m?pPwgTM~gz6gPTo(lJ$U0;0t`ccCj zrQ+SZ?sogl+q~_3stV^Z$N)`8!bTi%EXc8QZq%2YgJ4 zPnnNC{yaVR-2UJB#a3>%=Q7=Ip6~C!o6U3YRN1%V)Aj6<<`&Pm-2DIZd+p?c*Lt@c zAMA~|>v+defrI7HC)t$f|NMzN*uA&2fn7OlA|Te_d&Sn!1HGG?At~=b{R`{aH#8o6 SJ6r4n67h8Pb6Mw<&;$V4vhaQY diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Fill.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Fill.expected.png deleted file mode 100644 index 8e08d02f66d15179e5fd004f39bb13cbd4fe274f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggiP_V|F{C2y?d5}<4F(J>2Q&WLuJ)K$$lYNq6T@l^)Bpr#rDy(^>}|HS vWlUjyUX$RcAi%;jN(}Wd07osue&b`j+h#Kt7)_eY2omvh^>bP0l+XkKIR;Xb diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Left_Aligns_Content.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Left_Aligns_Content.expected.png deleted file mode 100644 index 5f0166406b236459cb9bac884ad96469e7814b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyD z7*a9k?X5(=M-B`P7Y|m5oPSokr$>(M{iVN(Djr{oW1i*wz=W;Nw#-&Sz;gbcg^2h@HRKae0%l5uw~P>$g(s!DAZ_AxO?;CmZLon z#Ap8FFWMrXY?EUk_@nnul4FGGgzF#wU3;Bc#FKZ>=vc(G!>?a{tSS2UqptqPp8rX2 zvi7sxlezxUDt^lx-9JxrF3z7(9Y?#}y}z>F%(CY==6^S7 zuHK)I2TkYqt~E5=aUewDvj68Qv2N+&m`n4XweD9H;9zQ07$pX27;KomBkg95Sb^=$ h23Zzx`eOL!Tn|jO3tY^m9=-??@pScbS?83{1OOxT(y9Oe diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Margin_Offsets_Content.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Margin_Offsets_Content.expected.png deleted file mode 100644 index 1fa36969e55506aebd240a0181de8f5fa560cc73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggNz2p4F{C2y?R7`4LkOBO=WnG(qD2zKPHVGB?Rkap}xW zbKStxFP8mkyg24rnF!4Px%Te;$2=A|Fr+yr+%f!4pg+bnI=VgZX+_1b?~l1x$0|S3 ztwJI(*YoJkhC7w!@jQH9guS_kE|Oby*tE3=6;gv43HbA6wbY1&3OD)OWLJ$g{$YYX ziC-k_`t2MzHyg3TvcupsA)Alqfb#)LZ9ExtR%zcj6AR7}VYXp_P;=cgZBhBxIjeoT zCFX7#n~9f4*pC+gBH4)TA7TNKha_Xm0C59#>u!79WOkKy5)%&ypRlaH7o4d}v3IA= zgw|H6JF6a8{uJc?`fh;tD{Y6D)+nT&MacbiM?u)8w9PI)1VRe3%jJOHwk&MQt?2+8 zj`UZr1bSJmwjgf~!2XW(i_UfeY>q{fw-AK6k$wwNAn`Om4zb3#%){e#f4P1N1_RvQr!5XfZMqYtE(``(tG3k!1MK|B;s_!}PDK@+ z39Fg1SudU&WfL-avzj}TP9K;EXx z!MvM{_*0RTAx2Qo#u*@+<*Da)V_s%4zP(&b%APa+lcg3$q2e@8Bn;t|dg^P8Qldk7 zH>A~_QCd?{*>#NZb3{R3JSFD|=kwfQt%Ms=vV-YDp0Ov=YbGbzNPNKR+j9ajkXFZg6%h*nw+d;MCCl(ll^BW(u!9v*7a7ELm%u9E4V>YoIC;M?IBZqWCnl zY*VtnDiH|f-dTk~#+oFytV#@m$vbOnF9;f`epg30&yccz!e5K`M6{vpg z`=Pue#!B>kt+EyEr<}Jtk67@x^>TLSDKTC#GW@%N)3qK zl3Fc~0^);=P`(-vBPKw6PC3yI-hy*5A-fsIlhrs3GQxTCP;hV)1_yD3)=1q_P9t$; zAg`|Vag1+{<#N*&+)Eg-631jKp^~~o&ysQ$zTauhu$d>qvg;0xDNL|zd&`7-?`2^L zKTE8{zo>gsJxq@Zo9>(jN($2U(Zwy>n^WrUs2h4ZQ`IXMd?bhpxWW6KgbnJojco3}3-SSN+PwtG0Hu_sU?xbQHy<)GV&ASkNXq6#;Cp*GMls1E uVM%xNb!1@J z*w6hZk(GggNz2p4F{C2y?R7`4LkOBO=WnG(qD2z(My-{9|m+(HvNSm;aJ0i_TipO!PH zFpj(B?AfD7=68Gk|GNG7ca5x^HFK_Si}>IjCSX>c!)m#$_g7xdjiis$LlnBxyPAvp zdV8mS{xxNL<=*b2X?j2Orfsi$xSWN_Q9)po7_4DXrhRUv_Y5i_2A}*C4*9tDnm{r-UW|G>xxO diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Horizontally.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Horizontally.expected.png deleted file mode 100644 index e255633894cf752016d95467835891c05972557a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg>9D7ZV@O5Z+nbJlB90Ob7aNOr1obWa{(wuab@B_z2x;*RvC}9+TL=sqynuE}4(V^99xmeoOiM zpt||MeIX8(Mh6Sc3EhUphqs-(Znz;`eZOPg@iWZ7=bWx&E;}Q}eP}X^(e|j@Yp-uN zTpiVXJLi}RqT(|NPNC=>vtt{+=*ug&$In|$zvq{ z>3#CLV{4x6J)fL+?26PL*7Id-mD^+bSDIG%`rS*4?Z27V|7_-?8)jMm;mdKI;Vst0BgwS(EtDd diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Vertically.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Vertically.expected.png deleted file mode 100644 index e255633894cf752016d95467835891c05972557a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg>9D7ZV@O5Z+nbJlB90Ob7aNOr1obWa{(wuab@B_z2x;*RvC}9+TL=sqynuE}4(V^99xmeoOiM zpt||MeIX8(Mh6Sc3EhUphqs-(Znz;`eZOPg@iWZ7=bWx&E;}Q}eP}X^(e|j@Yp-uN zTpiVXJLi}RqT(|NPNC=>vtt{+=*ug&$In|$zvq{ z>3#CLV{4x6J)fL+?26PL*7Id-mD^+bSDIG%`rS*4?Z27V|7_-?8)jMm;mdKI;Vst0BgwS(EtDd diff --git a/tests/TestFiles/Cairo/Controls/Border/Border_Top_Aligns_Content.expected.png b/tests/TestFiles/Cairo/Controls/Border/Border_Top_Aligns_Content.expected.png deleted file mode 100644 index ca04ee9121003564bc934fe149f4116418b6c783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 758 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyD5~5}&o0Hi7Tg;?C6^d$9ITsAtdg>L=24w{U(ZOS z0ZjsecbD@L&waic&iGzk`p1W`)eX^KHdtLWJ7gPaX?6C7qXH+(A=kz?b=9@|j&&tC zPkXPR&u9F(qP6vam}QdV5B0{H+422x@#4o5UhDCt*squW_V-N9%*Xqi_>Dgo_9gzw z@5?WrKR#1qb#}HyasNZH9nB6A|MaeX&iu4<|G(Xqa*O9Z+p+k~^W*C8 zP1)Y3mVdi`UC%CQZt;xA&Hq3Do@#hwS9h7f4)N929o8HyjSdm}n%`X8ugJ4K;pMdi z_C^H(4yI9J@Pz@t_?g;$x3m%#zfl0EHHHuJzxc#fsNG++H2MZe#M9N!Wt~$(69A&y B+64dr diff --git a/tests/TestFiles/Cairo/Controls/CustomRender/Clip.expected.png b/tests/TestFiles/Cairo/Controls/CustomRender/Clip.expected.png deleted file mode 100644 index c64045d17e89beba95e3c53999ec419f1e0203a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 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 diff --git a/tests/TestFiles/Cairo/Controls/CustomRender/Opacity.expected.png b/tests/TestFiles/Cairo/Controls/CustomRender/Opacity.expected.png deleted file mode 100644 index 66d12819f43f98f17113f8b7e753f127bdb3786a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Gggxy{qXF{C2y?M=h17hdZ7L^FEVoc+GB-#kAe*VNwFh8JiF14D!D*Mz&5 z_b1nw=KDYYn)2`9^y!le_+xtt&GPl1fBmce{&;4#f_7hg>p{Dj3+J3S{aX>YJo}ZG z@uIc!x|(Z^uYbAN^Q8T2#oC{H&B`a(vmCO!CA0k*-^Z_2doEpbc-DW0|IKnq2eX37 z%3^==Ia!(<6gWV{n=iW8W*1t_>!1Ab_m8wavh3Mnc6$!*{MC2-Wra~(OkaN1?dUag zSvPe)zWKvX;?BzR$9C`Jn%}#)a9`T3Z4PB+M{d25dGui2-r1ddX8b;}?v2ibvm3eW z*w!CEY`SajT-K!T50W=pzI)%bJwkwm$x&gH7{D+n6FYIRVz*ntcE01Y!Ld_h<9D6o z-L=CXt9tYD(;MgXJb!%o*rEOw3jgPyVyBZA198TXxZhv+t&` zSMGebA-^v2d-mNY{}qmZt}@;Kil&t_dkF8@s46$wSDo{wbmzi9+$-RKjZ&r yqJLcX-PWCL=bwFjER)yE49qAD3<>qUALY-oh3n5a=>*J~3=E#GelF{r5}E+GL_jM5 diff --git a/tests/TestFiles/Cairo/Controls/CustomRender/OpacityMask.expected.png b/tests/TestFiles/Cairo/Controls/CustomRender/OpacityMask.expected.png deleted file mode 100644 index 212a4f1eaa6e207ae9446bd60b2ef3cba7858a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5622 zcmZ`-ZA@F|6?T_yUD{=oA8Z;*F;diJleaOcYT76PmnapDDqu^74F>F$jYY8qE+jJ{ z20Kcp(b6g=TM612xJs0<0JaCgILsK9B`k?)@Cb37Tw)jkj}o{heAtE&hwu8e)6-toLw)czAO+3b{%=|@KN}A2mAWwH{iRe(A*9`UO0I)=a9fW zwtE47dGUC5Zni+sV|ZojgRct&DPJ5poc)W_aum7eEMF*Xm}xtkdhWf;=MS&^%AdZs z>62aUjUE5}=Y@~HRsFTJb35|i`S{ga13Nk{C8zGy{pZCCe`~rv{j_G(==+Do@w?;b zrP08icT4lVc6-ei-wAZ*ReH>&b`6SHRooB8uZC74Z-gc$QO~ltJ{p-_3oD*=33V%o z)iR^g*z2pJ3k@Nme&e3y%gp+BriAB*htfV%8Snd(oGqd0iRppp#&|db^+#UK^oA@A zvq(pOczMC)Pr4hLG7N<02gAnn=&8(fPu7T|)aKV8+WL36swQ996rP@o7*(FEdtRX+ zYe$Z`&|}^n_6E+D*neM|bjPZCMEiJO|7pNrQ`oo1QG;4v8}_4$%His0Yjo+R!G;!@ zx+RiUiKwgD?NpXqdu6ddgs)5*)Wavk_Q`phugN@HJXPKlhCR7; zDT^(SPAsSA@NoxuipNA6XTsPC!&+zk=c0?iLX1FaOAPjXnXazjYNADlN3wK9`XfG$ ziYm@nObF1-U(G3Nf%b07`@BH3N{X!$mcq%kWFCm2dWrvm=wYz#7MC6jxCSZO7hhf- zcL7ZXU8T%aw|;U$>AP%f1$|GR8Oa+cL+c+O=ZYO8w!)ztwG?U zG1OP(#a0X}P&LC_2_JDwNZInl_9C5a)gwr_*Tsek*O=+as_5ZVOZ{)yiN&;l&J-L7 zyf%j!8spixkC>!OeKk#(pE1(H&wzf=`4s3JGj`fP;7XY!eS@)zixUWd24e0<`srqs zyr)Ip^ME&<)!9L1hP~`6BN@_beYJ9HOG%X%p^Ibh@@aS zW-d8Itg=hvOi?Y5X2DTKFP3Pv{%X=J7$uPn4vqvuWg$$OL%+Odf`c&G;FD+Ed9^R? zF9TXPznTZWa>Q?$Bw5b~PC(a^*5;on2>*bsNutkl0ciybFETAax-7%NLYgetce~at z*NhycAw~0QI7c%E5=Fux+MythNQwx`TS6e^Gb2d5fuSkVv&{Xk1xc&G!(I;*icQwm>Li> z#|9e`V_G^A-Cv|=IlZUi7!}1%;XfpboKlH2&lv#IDv2G#SIG%6X2$eVeBd)k!q_4( zFk)sQ1x$mt*)6HuWO@`m=kDOM&bH??gz3Zq!XgbqLzs@C6NXC!j?1`j(oyU}Yu#DS zIL34kC4ZDI`2a-Hs48VpYz|NV`1Z?7%O~AqsMi)>jbqH`{*I{fC`fyKXgWQ#i8TMA9 z#bs-Xb^-4oHja{3@ateN?lqih_LWw+<%IQdfPmK|lp01^5M%Rm^MOF4HB$%&9v5O6 zHZh`!m#N8}_f2-63C_zO594oFk9sy|D6*Crh^s)A4+-ffbpCdO1ac4;bH(EN~L;#g~6qE<7nhg|GVDyQTjlKjjFL!khj$0?GNQW zaFe8-jzsiu88ko}!(w9-UakY3uZ#v}=2PG%YAb@e)M9+sSJ${rYjrB4W+2^6aQaQ#Ei)X#Rlq5pD^M-pc6K7+e!x z_3G97m9Zxm#M!!y$eLAUL?TbO=bv1NzBXs`izEMw+)&g-uc$mjL3^}4VhiWP)#T0< zn_}A;X^-rz*8fy@D!O714bK?8`Vx;xrC9Xplk`>5m5!RM`nMC`kb1Jbki)Km)MQQa UPj?#|tFPPDeBD#La5>z6KFVnD#3>0a2b|BP!i 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 EZxLVt5C8xG diff --git a/tests/TestFiles/Cairo/Controls/Image/Image_Stretch_Uniform.expected.png b/tests/TestFiles/Cairo/Controls/Image/Image_Stretch_Uniform.expected.png deleted file mode 100644 index 588c6515c5a22b67f55511cafbcd6412ff826e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6939 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 diff --git a/tests/TestFiles/Cairo/Controls/Image/Image_Stretch_UniformToFill.expected.png b/tests/TestFiles/Cairo/Controls/Image/Image_Stretch_UniformToFill.expected.png deleted file mode 100644 index 98d421f98cb971998bf8fac7c8e6d842b4e45a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7542 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 C)09^L diff --git a/tests/TestFiles/Cairo/Controls/Image/test.png b/tests/TestFiles/Cairo/Controls/Image/test.png deleted file mode 100644 index ed4f82f847472e8d6f681a05a3a6a2deb401e23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17223 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%0AYg# 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≪Tsb$e!c={#?1p9oD*E7W_tg8Hkgl z&%NKA*!!@#KCj~0pEX8=gS}L{Ed#9PBpgDOE|@%fC=!!%l(9Y58L1msE0(KL*yikY zRS&MAq3tz5QM!6XSUdjfs#gL1I^Ab1n)Cbo-sU1Y?#yg(kw@Bjy{56WstSvD7W+bh z+ZT%?OM!h?YeJVw<}@uvr&gj)qT>WQDUPJ+ohgTjG0-BfX?8vluCc?I!Hsqelmv`- z?5y_f#Hmm_w(hd|?{@OMd)+#Afj;rId||9PuvjfHor|`S4qRv?1gs@ zQGsZ;Yu^3`GBQYaiI-d`3U)6y(k(~hjjDs;AEL>yL*}(}TEaJY_pEus=u82Ge`&>Sk1v&I_}w(Gow)85^K*8idI*==1=m~L13 z(T_1J_@A}uPeP=KC%YrxqtYIx6_i>}BAunTeRK+J84$44c%EG;jvv>;;NrV=i!` zd-YeTBLGj1xJn}n{~cP7(4rrUWWpj;-F-xk-JfGaSeyNidt&ttK|&{6rg}Gmgn;g) zub!{e$iguVar5snCpxH|Z0Gu9H8giK?NSz#@U^JgwD7e@PsV%}!+yr=1Wu*dq#o-G zIlG512{CU&Ynm&q$bJA)?1EIFf8Kf+^Kf64m(!@UJ)Hha z&~B%n7Vy;<`Yz-A3IA88;P?xspEM)x7FXmcKC6+{b6A?+y@yj?>G)`rL7}o9>)4*< zhnRe>Hc9*~W&WM}#=XJ@qvRCPoQ7K_z(999$O+fQ*KVziL#=+QgDm>|486Q2RkST=r<6F(wk?4`QH{r%Sx zYaUKIycl*MmuS%rNHBPIs&iP717?yk`%;>DCHOHAxJ+8wI6EY=+~&;MB$Egx#&>Yn z*3}7DhVbgoHQ~NP%ge@H+ZsL_I4wPD`8~r{TU{-!ybIN*gcum)W2d3bG5ZdVu3W9X z`@2D@O4oWY!7pCnG!({nBpdZMx8CNUhZbr2SMtRPRF?mk6a;1K^U<++oE zqbu2Y&qt2zlnEmdEk;-W7S5qm5Z>u0yzM<0Zu%<90SPdzX9I9|mtQ?A(2Nl)0L@e* zPB_U07YctAO?a4gUE1h>5u1N^jQ?-tF=ZzM8CkCf@^+7u%8inslrrQ9I(tMc?{<#X z(`&$W8m$DWhA+LT;wC;kTpHzG?Aki?O`Fxyg_^#-*crKNmod2!JVsOR4PibM-``)b zXga8zs+z>=F3!@vagik|>K&o->0zn52b@iMTPnKQ7_Iq4LNHhR&jXq28RIxL}1fNDPb$CncXf!Y@ z{AIZ!o8gONB;xDB*RCo5!;b?lNoy7vGxUDGyEV0{C+=;pMi%U3hZ|8!LU*ix!2*Zu zBy}gqj~DBIJzbomc=qR9C&F8kMjs}>TFU9tsAW2uy!`z|@zl*DB|0&V2g`V%qUCA$ zqG{Cm*+(BA^k`nDle7J0v~c;%7--UMf?CDL*Gc)cI6yzG-2Tg`@3QtYf1<)YhfI&m zZF$CunF$ZXF8kj7gD+;}#~Bq(<0sFooR*2rtPduwHodDOKJOPvR@H~M`Y@=iQk9AM zX3MoPt26jjArN0@)(7w}XqnNKGT1GjjH~@U}{5*iO~f&k{e<7{B~&|07y* zh0L2P(f~5z8*T5F;m~LGv-~3&J6qa3WKCZfvNrOfk~D$2>#7-W`GN3O@#({fxxizg z8j(fS0-|QFuOzFSTZVqIE2$pi6;{tnm}&DXxdkawkBj|hlu5ZAvd>Y==p6nNtH(b) O7Bgcjqbfs0#NPozu-#Pv diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_FlipY_TopLeftDest.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_FlipY_TopLeftDest.expected.png deleted file mode 100644 index 75c53f0c2839cf6c33b6881581ad582611da1db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2767 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 diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png deleted file mode 100644 index a13b34ba2da477314dbfe9a45d877263def58453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3085 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 Hr;`5*+IO!% diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_Center.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_Center.expected.png deleted file mode 100644 index 14704f751c71c35acf731829cf41604593f76abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4712 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 OqR`hd(XK@~$Ndk4)RJfb diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png deleted file mode 100644 index 7ebac13d30c4263181ddc99ba576ac5b4094f8d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3611 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 diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png deleted file mode 100644 index dd41cb98c3c754ad6a3a678c15797bce4d19a04f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 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 diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png deleted file mode 100644 index fea4a2a8e95b9d9c792662848adcd17100c8d10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg*~inxF{C2y?cGM-+YS2Db#J7c4Jj z4OeJA^uA+p@VQO@FYe_*Yc-ySbNanH12mI*;6ZoI>pCN$&)4mlXY=nrt^YCi$KkDS z4BvgJ{w^Hhq#(e-!qn(MJoR7^ud=cJuCotw9wxEJCu#Hh))m+^lVAYxRv}bYzkd33 z>Fr;09BxFXr>Eb&_MGKV+^!uvX577hzkGX!+uwO#4(jep-1ArR#MP^zH}Ag5UDR1~ z_)p0d);DJDllN=ymu0pwDK9VIJbCiuch^?`cu>)K^j<|pMa1jxefulfBqh%)9AxA7 zwM{OqsIaK6s(SVB+1zx2Z_&MvfBdM3l+osFIk`H0jhwvv?&!Z9EuO0j@7%dlvOOd2 zuWU*|cli6a{{H**^iSJY+t2-d^TMRO-1g9N>(-YK=YO}l1mxC&xsk#B7O!0VKKJ=V zZk*bEE!uX^vV`8tSFfkm>6u*@E!UbbQP5+9(u8&+d$HNIN9I~}A62)24_<*Gb0`B z*DwEnn9=sjg-M%|PV;~AU1oUx{Q1w9FJCUYZZC7@_KXwDE8Ul^xpB(%_1d&c9oxBe z{=EOM_@CeIthe;5($%k)R+dSyuU&awq1m4~FF*e|J3IT+cl-8#xp@_4VA_*yHB#jW z?vb*RWm>$tn%dj`DBMqRTQP5?m6erN`TN6+yI(Vclm89p%{S$J+m0UO)1Q|N67h8P Kb6Mw<&;$V4cxa*k diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png deleted file mode 100644 index afd39c2360afe675194d905b2bad7f2755a48345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 zcmbW2c~DbV7{wDnpezPw1VY<2qJq4n-Bzz3KfWKQx+pjLXcMKpn`yO zhz&agSyW_Sk|$Uc!~hax(Lh`<5Rp8arGbP%U*goM)3JZ}X5Rbe{^rfO-@S9ry_bBj zuKGG#bYL);zPsBIKdAOAUu{k3+YofC7%K1tKi9*sTSH&-p@Bw(qn9HL)|jKaa(W#M zrrF?r#PR5P{Ni+mFK7Qo%~SFEBRV*^4?Gbzaj(iWGDC;5zElHEsiWi@MVQ0?ntG6T zhrzW?zWQ5Hq_wvw!m-On3sQxiostT9Dt&@g@(91+;Jm>h<#~&qjB&mAo3uQj6Ugw^ z*4EI_P*YQb!!sxp3V2Fm#&3NzAG70*G$hV?1!r!noVo>Ppe-6fdHJ7T}B| z>RXReOAfCa(*{6>>j&EV>?6fEZQ6-5Oy*dRVdNvAmDFd=1`IF0u0J`{g_R6H z=c5A5rb`XI=B48~l?N4L+th@)Z^1TpkA`U}H-rQ)QtS!D*XOtSZy5m{SO-vm(E`BQ zewGd9gc}=VKP@Du#}>jHgJSs7*e2ay`_6g-VNE)!DrcFYjOunPkl{w~fjEyhBx3f{ zi)4g!5#GUMA|+RMv*(GYmuceQ2WjIG(N#{%!TS}fJ6I%Y?C-BGrv04ap+pvn)#FsT z)%1Sn6UUFwUJ7VP+;LL3irZDy;my9{|A$ByjI%ir7&AqRhdorJA?`1o5DtT^pX=%U1pKXB$3T|&6 z1qq`ZC)T;f!*&yH!!DVDR%P6fY{1Nfng1W#ea4NS;(35@pXYtXvtx6wU+lRNSD4Kec-4`^(sZmdFqmmo3 zSgidnqoj9Xz$OzYO2Vb3NxSk^C^Vt!d7Bn^ylSW)8N*37WSLGp*5)FU&JBx)Z5)gj z>(RpYsG4g~?^aU63?it?Wr+mZ)vD-*@tJ?9=9bQ&j@tg$x5_l1WhtANwI$n%>Z9+S zn@OropTTO~wB&0xL>>m($fnbLy3vN*tfT1wZM_)^u9$hN+y9Q(C=8`_(?%)eHNrT2 zxg}^V2I+f)oNo1;5>($RmM1jnsZv3_aRRd|Fhpi@BS2NB<7_^}$D&EwjqHyGyF%)1 z#HsCZh<=GgQbUX`ashM)!O96sUXy*;PRNwKe5tF-lpAelw~zTNeR_c}og3xQ`47H( z`|8y;@A|XK={g{|TX9Lr$>E_PVP!22vg$8SKr%s47GAOaK4? diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_Fill.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_Fill.expected.png deleted file mode 100644 index c38dcfbcfde254168cbc928634d40cd7617347c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3945 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 JHrJ@T{{zDJ###UX diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_UniformToFill.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Tile_UniformToFill.expected.png deleted file mode 100644 index 59e9aea5df705c8a2744b7ef6709fe7c0d44755f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2340 zcmeHJ`%{u>6vo^oYcaFDpkZ_&ZL<(vCsWrPNlh}*Xfw-IyfmqqTPWdW)h{(o11u?X z)3mm{bU~BSE*c*s21=!=yODWelQKzx3@?Ew``PqMGy4zhO!Llr&JSnKdCvR1&zU&| zLB#FGi>(*KU@&8XpEn8eZS&U%4%ym}x(dj_qx`pf!}Rm#GPmX|3})0z@b>y8<)WfL zkRG}RB^-a}cA@&*sTGk;^y~)kI5sr43;)P6qU3w?d*&N$C`E;4ZejUD#Bv|XYV86s zRbm>ZU2qQ1$tFF@rDLmUEfk9Wjcrm=X7ccG2UC-QUVpc}UBfuK#KrD`+V8|tywU2f zjg=h-{+&D9JtEzxJ!GyFoS}at|poRPpnBWxG z3y)OsF}oZHr#4wa(USqJ4B1B!-e_^}+f9UJlfl6oM3E8HD5UFib4-yltKsh5;EYr{ z#&7>wXKUt_=9PxgMF_RlEKjhC;5ntg zhU;e3DzIlEZ|(;ANdNN(GLfAyDgxCwK2&pQrOso&Yp>6Z6niAT&EeNSB`S$_d7dEX zKw4dQIuf}(A!L;IB9uLp(P!WQ++lT+KulDG4$YX2bxZnm2)CX_u4r=SN>r-f6%sUX zQTcuhVhM|gpDo*aW@cLD&l+q_n_Su#Pa9NJkstMo_#qKjI}FzOZP-eBq86xlqtA}; ziYp5Q-PB+gmzcr}a~rJLuP9FT2hinTwtXJ<>nn5ca~{?)&M# zAsBUt_;HC_rO6HeP)x*?yU}*4CTvwCs{ro7_;~-&Dga0vJwJG#O1L=-($uL7WfvTA zO-`k@2zU z*2WqWn8AJfd~b8Q#?F8VDC!Mxpnuxx*yDJ$;IFAE8lOKRu7APPSd1o4No%>>j7|?S zS)v{Y3)6oPScfJ!k)_8)D4Uteo zyznK=F1Kbb{ALsW{CD?pZova+W^HU5}Aubkk9Hd|^&r|DnME{Wv0<)81$4j26 zS4==1$rGGB-%;-2K8}J5cdcNW$a_wr36amXV4kHNPDn^dZ>OW`akxULSA7;pLae?f z8I|Aa@+&y>Fw1@&Pgm>r3OLZh57{Z>^Ui`U)=a77EzcRP8F=koMQ$l+aEV62eeLp! zw%sc|5u~k3t#WrIu*|R?w%4Z|+M*#DMpku%vgz``P);A~fX?usdy;I($2gg0yK?uQ z$6|&C!tVY6MHB*(SZ;6K|jT?B>9;@qrr!Vc joaUI^{(7+(a?%@YHNAut^#W{Y?ST<|h~9Phi0pp>yVkMF diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_UniformToFill_NoTile.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_UniformToFill_NoTile.expected.png deleted file mode 100644 index e173fa6cee18cee4282eceb0ac3d81421aaaa3f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14445 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

^wFxFT{}9BsdrjVVGi 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 diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png b/tests/TestFiles/Cairo/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png deleted file mode 100644 index de73af81700872b7babfcd99189a66ea47db7eed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11325 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 diff --git a/tests/TestFiles/Cairo/Media/ImageBrush/github_icon_small.png b/tests/TestFiles/Cairo/Media/ImageBrush/github_icon_small.png deleted file mode 100644 index 5799bdfdce9e4bd1a897b946186a043369d5a1e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmV;R17G}!P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00R(7L_t(oN6l8hYZO5gp2A;&Ca}eyKG0H5>*axsg`+LB{;NgnD*kH@Z*(cv$-FK^5DMu zP!E!RMh*ceZ5l$VSJs^GQOZLYMw23lU!rBh;4)gO2a1?0>7ykN+iY`MMlM>JbuDUc98u;X2)h$t+7Y-P-KNY%u;!^-n05r=tH+eN5K8q3 z(~cly@`5xMK)4ytG3^LK#t$iT5rnJw0Mm{Dt0K)sQ0Kz51Jq^mnKBkisXk%)f8YP2 zm?jsU_%0>>4?^ADVU6w_DQ462~(T)7O-gCZx93{xp`(tVu$s-VM_Y%hG4*7G9 zZr@=8S~I;OP(M&&RjIC++CYZ|P=!)$wN7FjGm9-FN;%j*9g7k>+YV3Ly3+-n%lMlu zOtrcW#*s%)lY%?jLxX9D|EysP_zrxb~s<_1ia!#WzA|^2@!_# zd?sFi!dhyKd6<;z^buArm-muE+sJi~FavdFTcueO8$w0OQ&bn+427Fa;Ix~=WV3k) z8p$Hmz%!_U6*$LLl7U(V&r|M2i_k3(V)#x5V}Ai{Q!>aK4CsRZ0000zopr0GL;M=Kufz diff --git a/tests/TestFiles/Cairo/Media/LinearGradientBrush/LinearGradientBrush_RedBlue_Vertical_Fill.expected.png b/tests/TestFiles/Cairo/Media/LinearGradientBrush/LinearGradientBrush_RedBlue_Vertical_Fill.expected.png deleted file mode 100644 index d09c0c30b4c47e6c2c734bac6b5c4abce8db89b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 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 V(|qmP*cv#8iID}q!oZF4{{SsbnGpa0 diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png deleted file mode 100644 index 842e541de9f6cfba94ece612ba99584ba285bfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116569 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ⅆn8LbArSGd*+?_ifPwpD6{`7T9Xiu?l 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 dkKdM6#v7p-SEF1jvWY)(%60~J@RSx8i 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 diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png deleted file mode 100644 index a13b34ba2da477314dbfe9a45d877263def58453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3085 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 Hr;`5*+IO!% diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png deleted file mode 100644 index 9150e62edf989935d1bc337b9dce795799062ba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5526 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 Ui}~^%&}ao|s_LN2Rjjc815h1S)Bpeg diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png deleted file mode 100644 index 7ebac13d30c4263181ddc99ba576ac5b4094f8d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3611 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 diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png deleted file mode 100644 index c8ac46f84c0a8cf7a4895f5420b1f9dab67b0966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2007 zcmcgtX*3&H8;(7wr397b64Vk)s@B+I1WC1)p|#Xf`!bf; z+RzZ~RH;@F)oKw`TNFWRYsB)U=R2MA{rUcW_dWN%=iKwW_kHej&w1{x%l1}cBC;X? z06+|GZGqtC7vCpPkh?ayHkWdfptr4+1>op=l=al+0sumH;1*_%F~v-VLx8*!V1PBN zDGjSGuOOd^BjPq3^mGWODUar=?K$B_S(p{yy_|E>>Aol&N43Bogwt=UBb`ywjX< zRuSYj%*COI0!A1ATdK!y7))HPqcD+>_8pu?m}>YHq8pa^Y$7;9CGimOVzsqfG|3=0 zV%ZQqM!gUEN96*%zF(||0oKkySKUq_&wlnUWO|t5NK5svynX}XCcc(?7-PuBF0h&_ zg~Eo0FxY&ge~N##G9H_+bQ(tV3DvZGB}!(jUC0?C*^oRky`V6N-5u+RtjDvtqj=;% zNw>6s_03)x?#mhI%8HrWXXrJHj_A$I%T8{^Y=#st9kQU!a?>(LvSCw$%M-m7pW7Wm zXQO>@a3Y6h-*ECHac)f{ef~b>nh*V5i8|D@G+lm6TCJ(j|TJDp8~us_Iy3vVzWayR)Uow)??Z-LF91Xb7)5< zHSLt{P%Cvo4CmcvObB$+*p57plH+#sNuakSex+`eY3DMarCE8k7(Kzce#Cgdz+RRA zj*5_PBZ*C)Y7v-gTAkf?{#~%XXV07X`M7qg9XjSJ_s+V-dxF>d4{M%A+O%Vz?4#pg zj@waHJIl90eabHD!O*c~=)psc_x($>2&JS);GEO*9ww9QHkTEP1Ui@e-^?XiQ}jW= zro)Y~0KNL2E!*+-0_B^OJW%lZ07po6qR63h^3AQi3L(}|Mm3YwUZ^j3QhAKg+x`Hl zlRIhKYw@hfYEb^EAuRZIoPv9Tirv^3Gb6v5{W%Yv*1RgH*ANx<+SR0xOxktwNKgSQ zmev_#WfmzWvg;I1bVvM$`u@m3yd$i<*|;nJ-h0pcDEIpZg9xuMAW@ae0b27Q6WR=Y zR=LcgTo8t8A*P<-3_!DT1PXv87da;jw%tlNe1XfdX zM)5Iy#dGO$dBxPzxUVbsUS(uS3_tgp5A*rO0Pnf}P=g*d6h3raiFt17k_PS2x1JOm zZ=Mu%HW!ByQP3Iu?GjJnamgpi|FIWj&YC>6DB7RJ=r;8$R*SepJ|G;Jt~OR7UgQ6l z|NN-^VNFCI_LfoaXuD|K(39we3>3fqXlBGTkftgY~$^#5%2%VVPonL zS4dTK8_SW@@^n<4x$wvbAJ2gll+RIbOK08o&8y^vg)@Oc7j{2p~@$&1 Z+t1dEs5O$+s{i*rxTU>C^F?IxzXAWFj7R_g diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png deleted file mode 100644 index ab9f2b76e3e3bb53012602636fc3297418fcd4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3528 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 diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png deleted file mode 100644 index fea4a2a8e95b9d9c792662848adcd17100c8d10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg*~inxF{C2y?cGM-+YS2Db#J7c4Jj z4OeJA^uA+p@VQO@FYe_*Yc-ySbNanH12mI*;6ZoI>pCN$&)4mlXY=nrt^YCi$KkDS z4BvgJ{w^Hhq#(e-!qn(MJoR7^ud=cJuCotw9wxEJCu#Hh))m+^lVAYxRv}bYzkd33 z>Fr;09BxFXr>Eb&_MGKV+^!uvX577hzkGX!+uwO#4(jep-1ArR#MP^zH}Ag5UDR1~ z_)p0d);DJDllN=ymu0pwDK9VIJbCiuch^?`cu>)K^j<|pMa1jxefulfBqh%)9AxA7 zwM{OqsIaK6s(SVB+1zx2Z_&MvfBdM3l+osFIk`H0jhwvv?&!Z9EuO0j@7%dlvOOd2 zuWU*|cli6a{{H**^iSJY+t2-d^TMRO-1g9N>(-YK=YO}l1mxC&xsk#B7O!0VKKJ=V zZk*bEE!uX^vV`8tSFfkm>6u*@E!UbbQP5+9(u8&+d$HNIN9I~}A62)24_<*Gb0`B z*DwEnn9=sjg-M%|PV;~AU1oUx{Q1w9FJCUYZZC7@_KXwDE8Ul^xpB(%_1d&c9oxBe z{=EOM_@CeIthe;5($%k)R+dSyuU&awq1m4~FF*e|J3IT+cl-8#xp@_4VA_*yHB#jW z?vb*RWm>$tn%dj`DBMqRTQP5?m6erN`TN6+yI(Vclm89p%{S$J+m0UO)1Q|N67h8P Kb6Mw<&;$V4cxa*k diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png deleted file mode 100644 index afd39c2360afe675194d905b2bad7f2755a48345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 zcmbW2c~DbV7{wDnpezPw1VY<2qJq4n-Bzz3KfWKQx+pjLXcMKpn`yO zhz&agSyW_Sk|$Uc!~hax(Lh`<5Rp8arGbP%U*goM)3JZ}X5Rbe{^rfO-@S9ry_bBj zuKGG#bYL);zPsBIKdAOAUu{k3+YofC7%K1tKi9*sTSH&-p@Bw(qn9HL)|jKaa(W#M zrrF?r#PR5P{Ni+mFK7Qo%~SFEBRV*^4?Gbzaj(iWGDC;5zElHEsiWi@MVQ0?ntG6T zhrzW?zWQ5Hq_wvw!m-On3sQxiostT9Dt&@g@(91+;Jm>h<#~&qjB&mAo3uQj6Ugw^ z*4EI_P*YQb!!sxp3V2Fm#&3NzAG70*G$hV?1!r!noVo>Ppe-6fdHJ7T}B| z>RXReOAfCa(*{6>>j&EV>?6fEZQ6-5Oy*dRVdNvAmDFd=1`IF0u0J`{g_R6H z=c5A5rb`XI=B48~l?N4L+th@)Z^1TpkA`U}H-rQ)QtS!D*XOtSZy5m{SO-vm(E`BQ zewGd9gc}=VKP@Du#}>jHgJSs7*e2ay`_6g-VNE)!DrcFYjOunPkl{w~fjEyhBx3f{ zi)4g!5#GUMA|+RMv*(GYmuceQ2WjIG(N#{%!TS}fJ6I%Y?C-BGrv04ap+pvn)#FsT z)%1Sn6UUFwUJ7VP+;LL3irZDy;my9{|A$ByjI%ir7&AqRhdorJA?`1o5DtT^pX=%U1pKXB$3T|&6 z1qq`ZC)T;f!*&yH!!DVDR%P6fY{1Nfng1W#ea4NS;(35@pXYtXvtx6wU+lRNSD4Kec-4`^(sZmdFqmmo3 zSgidnqoj9Xz$OzYO2Vb3NxSk^C^Vt!d7Bn^ylSW)8N*37WSLGp*5)FU&JBx)Z5)gj z>(RpYsG4g~?^aU63?it?Wr+mZ)vD-*@tJ?9=9bQ&j@tg$x5_l1WhtANwI$n%>Z9+S zn@OropTTO~wB&0xL>>m($fnbLy3vN*tfT1wZM_)^u9$hN+y9Q(C=8`_(?%)eHNrT2 zxg}^V2I+f)oNo1;5>($RmM1jnsZv3_aRRd|Fhpi@BS2NB<7_^}$D&EwjqHyGyF%)1 z#HsCZh<=GgQbUX`ashM)!O96sUXy*;PRNwKe5tF-lpAelw~zTNeR_c}og3xQ`47H( z`|8y;@A|XK={g{|TX9Lr$>E_PVP!22vg$8SKr%s47GAOaK4? diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png b/tests/TestFiles/Cairo/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png deleted file mode 100644 index f56ff5f5f6f4bc2b63ecafb40648fba9c3dec4a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14732 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 P%3!jRN)okV#-aZY7BfL) diff --git a/tests/TestFiles/Cairo/Media/VisualBrush/github_icon.png b/tests/TestFiles/Cairo/Media/VisualBrush/github_icon.png deleted file mode 100644 index cd053c5fe1e742b21cffefd60111d8498a79dcee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17661 zcmeHvXH=6-6KLp7ItWS^r6@&Slny~aP&$GF(gYMldWX=ZDot#F)POXV-Xutosfh1@5o=evLJ|H~eZhi7MJXJ%)2XQ%kWP+yCl_986^1fsutN8=s{M1m#$ zQj-B+PN*fn0{@UZ-qO1T0#zo{o!C-7^1mB5z+kW%1%&|!WJFGG0|MESle>dJo@8W! zWMp9=keY^ufq{XMv9XPfjjg@Co4dQGmsfB|NLW}{1Q}T}2=t1KEC&S2B_%BffhtHz z>qtpkK%iC<5;zD1Cn1>vflwgOCJ00Tfg+wiPfkvL_4;*APEIZqT3%jWQCZp2($d=6 z+TPIt2YwI;6biMuxw*T$i^Jgv1Ypqr|M~wC_G8+aTdj~7dK`ZQzC)0Y%!q+hs;4C6km6%CTD*=K4W_L{L$w9 zr}I{2Gm`$Rzn-0aGiE=+ISL1yFZV3*$#rc1Glu~hm1Fscqx>?Lzjs6R#veK_V^Q!2 z3fmoBTXOIvI(}My+RPXPqs>%GdaRM{xPZZ4hmSK6Su|TjB&+0nXouwJNE&-5qtq`wV~HdE%ym@a@>}|zw*ksV zAS8@JBjP?iz9#FZw@cG02P_94TeSamW^pKf}yx;xNuj&Z+ zr)nRUOaSBE*i#RuYIiORf4=4r6s!&zo7n4t-93&Mu7B^>wA@CgB22|494_Kf1#RKk z*dLNftyAk=V!c}7$*$IGqu%`+hvpAVey31K}g zzONZoNocsC@{A!n(=Tf-fM1f z{AXx>6`-B-Gi!?WJcTj%02OsWCoijof%PpKPQEBN-F5|(uOkMB(>h|oiz=)F>cky} zUhtW93&!wVERg_q40VvCmV7%-!H10l*bMuK?x#zU9b|8TKU6cNv@yso{U-p`_6#9W z4%s?NtyI8b@cVHJ;{5E3z5p`aj%oIgZaKM>5fE-bRJQeMoX1@GP3QFy;@%oSaJVjU zWMlc}CZ5BI-F;iOgY4giyYz1nk)Ff1+jW1pu-P>>d!?cdY;39C)3we*Ubn5t!c5g2 zwj@bxbQduG9m5*yyyG2U=JykgEr#9(_I}T3H1y`bs@XiH#b`FAXbll1!~gzQSksR| zF@1#5U4GY$HmT@SzX+MxM)UAQR$%TgRX_SKax|A4qjzz$>kA4Mp2Q7D8PC0#!()Ix zDF@{&I=W+e2UB?=l1Y-{Z8C8}TDxG$#ZSAkGtU!QvTXrMBBqGN%Li@P{l3O|bW(|`>b~j<0A7hbwQW{E zesXi?-8tnB71YUkbWh&`lZ^hO258HY#Z${u2zLZG-0@qs$$CsLQp)_dwX&Oab? z)z}NHf4HP2Us<%IY7}Pk0JOvQ1r+Y9(DEvKNR1}qs}r!V<46;0!Q=Eir>sHKH(o48 ztBmix`l@DB^<6#yMO=wi=}ypHPH}$wug_&7XJN9+IXmWvw3o&T z9J@D$H`e-djDw`4x)+}q2xqU7_ELw~VA|+0ThP};5fYV`9B*C5)oXUQA_}qBmvgT9 zLcu>$iq?C(RTX`;=@R&ksA{|a`}$K*Rh)R55|#S=&hy#cF+^e;X@0B(yw1`6S3%le zly+Q!dKEWW4Xh$6)lH@0H+Mm!|4=p-CnE1;eIgZ%E!#Jt^eFzMPoE^k~B*{j)taY+pljg@rIGh$wOBLk)Bl;Cyah+WF-AIYZbqDmrrBVCy z?0>{Z!Q>t1*tRp1m)#l%bxubWOB{dv_>Zpl%C0K;X$p(vU36Bx(`ok$3;*?yl!8sQ zv+PLoqa~iWmF*T3|LdS}^$ig4eMXbO4tpDjN6e_+|0jS;lL9I^3I*hvv{pUSo-1)x z|EOmF`18PJm5qf{*yqabkuI6x*;NHBMP~NFDO3ITwKwBr43% zr`IUktkUR5{!QmI@26UCsr>lcO`KyN53IiE!hZw~SgTFgYC;?n#S%R-2;)TjqWWsO zq^OxCuQd}IHft|#w?t6mcq-<$%rs#ne`FEEbMX&^KA0KSXA%PxXab_fk#}w^;s2YEF$(y38ku|V-EqGp$ zxZ&*H=i5+Cjl+fOia1h%4No|A5Pld8&PL!eg|WZXLzpR4LSStSN@1t-8(IE-J7)q@ zKMnrnV9#oBxEUWD<+Wr}9z(nzys<{C}w^SOTJc0-j#A=yPSw`sXTP3ZbM5c(w zBuJ`?@GL;c-BTQYO(WvB-d1Vu2TREIr5H?5vr`!T<*FS2br@*|RXc@$8j-&UeAbX> zh}vq80Ii1W%iSYih4xDV=WP?&8U?+>zl%M{!7GsvVL!rlHF5ykx;GY|N`NHE@k z9*6o1P6rq(dkGy?+5_g=WjO2M;Vz*wEMA1E_I&f+-Jv5daUUCZuK+$eScbBnWmf+{ z1J8YsQEp{$3f1|81cv5!aYJAAXpp$=bPCS{x0wo*SXn(}rx>8@7Gyz=`ijZ`{(^FF zyDvf9{vNt{SjR0wkz#teTpO06mp^XffUxQ>6 z)6|XoC%;FMuD()=Xz%$N{3EhKMetbJa^dkDXp<4?>j5Xs6wf}%K`uqwE4f7{H#RnI z4%IgP`2JS1h4g`r{8ap_fjKbGc%)O5>9ARL$ zo&~|_ADDqK?fTpw`@8ObEE<#9Wmye|Vh2STw2?u6kY|4yAOVbxvf z$5hlGt*&?Y1`f+pZPJA#=iTo~^(~o?&MNd;{7!p?cY?+ynuq_D-z~~X&2R7*J z2)hEVTkOKkcPB<2eiwYCe%4g+UGj_cmptI*b$iof9iJ#`=S~J>ZuK9G& zb?{y`>;(pXPIwi^472~b^wrNmN_dS0Qhg^0V1NG>1)OAtv+e>^QDQ+sV*Xy=PnhmN zLXeYh%mT<=DYSw2Xns%7#JfsjxT2RfWc$4tBQiVHvw!bi|4&%dj99QEAm$Lm&cTK< zIKo8T|Ax=_eV!h9^HiPB{rg-kXPByyzJD#^O|M6z2}fp1`nNA z-yt?)Fjm$EwLP-pWHR!l^_YF%c|L`92Bx^6*6){Gt2kj+BhnnHxgRrX z(aqiNZ9vBdsvzsK36Xec2EA1PMn-%RQSSd&cM#E1@b3izJDeiQg^AfZf@ zE7MJm{fg2Npeuular~pA;c)*$?C*J=cSN?yEGLY&3Rpb^e1dwGr74sQM;MPcOuQ>s zepZr^4>5RbzZU6X8)%J2^v7VDuF0qwft{s<{awR;LZ_S`(CI1j!9sp-4fJXhuXYF9 z{VtiEsZy79d`i1K8;o|~yY&q1gVA@WsoK;xAoo+M`d+%q zwO&cTaL{pU>|sx`j>*Pr`jCN#w?)>j>^_J!?pgX>%NsgDrN88y^$X!{%Qkosc5pkp zs(UP=P`c>5zK5L*T)fBcN3>frkG2bXl4GT%YS~9RFg>1Y|2ao>i2>@(*d>l5*3%H? zN~n&_Z}?;;g7r<2b)cQ$_jA6!( z?$i_UqDSg`*61<*Ci9mOqN>{pYtx8m(SZG!aC@k+d+`h%{sQ5X#_seb-3XJ$frqj_ zP%=1%iTd@;XN@_}4A9YT^g|ho@6t$1{Id4k&~Hqgrz#Z5pFd8Vl)1M-gG99KCTn*D z30wZ}JkGYe6gAM{W$S(K^v>U@x{f#8bxkH8#kY-=VQ6MJSiF^z>Y~=&NtEVH1+h ziJJ!lyv%p9JyGh8p@lrKo6_wYENP@aKYLInVP;MhgEaU9$Mo)Q9H#rB#|E>4_@yXb zo7y5Ds5@-$p?(RH{;ZB!-B<`x#B!a4MEqRazfQpvpBd2{q`q5W#_IP1l;=6Rc$M%4 z$`13r@9U+dPzbV1sm)2h+Yy^!UZF$IRN6RdVf?%lQCa|hqc|-^9R0!==6#xFbt(KQ z56VIZY5@h$yVL2~6uuM_vr`m~H9&((&2XVb2PhX=-LKD8z?3>)7F@;6 zc`LxrDh$Y(`WKE}5HfT~&WiqQp=bc@e0T_e7vicJUGhH6Wmo%K9mm)oHgKrw)Gv$FgJ=1uC<#g3Mzh8w~RlU__5TwsZ#?>b8Vc{hXw z=BXXl0d{T$WOp5R9X}sA_RQ<0{K1Xv)EiC-n6Yg87tdV|Ghq#PDl$(gt?Or{Zk z$GL;q*^EJzt(mwA{CHDXxE;}cOlgmlpKP@6(+ni(ptKM9{rjT|kytpT%Qcpxrc(v4 zmw<|>Wcl=dyVY67RQZy|~X8E~qxTse2wL{%*J=KJ_)8iq5H{N(TPhG;=) zO#r}kRx^_9ySLCM-K5pmTMS+c_ualIB(pM22dNtRUBLny(R0H+ zuOG4kV67+$a}_t!>^V$zX#@_=q~BG z`NVE1pM`aT%2+mwvkw1xkC@X$JBmNZy7z9bf~P4z(eSq!s9j?^{w?KW-+5b1S#az< zFfScms#e=jm-t3+Rj#X{jJ^u|;YkW*kGqy@m$%nFQsW-t99M9KiSDZ!>Pt3)?2Hew zip_ux#XqoWA@{w5O-#-;HP7Y|zHOO31bDuNm3(_u?QDrzl6aK>Kpl{$TF4U(OVZIO zH{FSS8&Vb>fX)fW*pcF-u}goD&Y^paib-q9nS?o6UHh4_H<7?fCE!7hOH{YYy z_QK6N+*Sd#5+&)N(KIMCpPP(wo4zoZgVC>LXVR%qzv^OqHXb;^(j0w{!)p(4a+m5z z`?Iw5(0kqQuzUharvp`rs$db5h=;@t@#KqXIA3pay^8R-l3X!O(@Y@WHxB-H4^+i$ zn=cU*e4hby1Cr^}lKI+E8D(w5HRyxNK&;VyrgZ#9P2F!@)#v3;#q8W^4O+I&##Ub(bZUX!!g4nJ8N0~kaJkN}(E=y&Ofae4nayv>e6Z1#+DWbBqL5M4 zM5Qu!En|99Y?1$j{Tn)N9keD6?|%--S!o2JtOZU~&i?ifzMB%O*rFuNY_VeR&EQ64 z!jU0T#UK&D$IR8`A~1XuSBeWh00EvA9W!IEz5F1;)Au2I!3@Dv_}+K#ScC8;PYh%e zm?3!c8QZ?|YURljF~_flfP*nX#l5LFNbca}%&r23ON_T=dyu%$h-nnJ0eTM;#91AU zSo3e9Pk!?DysB86gs35ynSq1e<*nd~D#@F^_&dE?Z;tLFS5qj91;gd?RgOw0O5#ThqDGfe)@nxv8pMkqz2+jNhtwN?lGZc%a_a&~$Avv93(n$L#M<~oj3Apf z9sl_f#u3ri!pEQY_ZEvErGzYaxKo(NPx^cIwIu;!j0WQAPv{D70 z)SRan8;(A8n)s87`T*LJ{tgA9-(A#5&gz>`uKIcgi!(Y*g21E7?+iY+tP3(;5!<;& zAK&tMlJP+PinF06$TPFKGKS$)CP?kE^+q@QSST!M^KC`$_mi>47+Qs9rG!5%0((qo}@d+Dml8y4dy)m_Z%O#0||sm18fdA-Kzch^^a5uf3?uoLt{_j50)a41^I6H?n=Uau_ z1?e+8QoWS{U{yd|GA{NJEz7@4aEnpayfyceUq)Np(8`PvR|>c$t(+xd(5~>nkX%GC zd?F@MY-^ZW*}v&!8)@7NJhoL<=l!t%a-yzIz_ODyUesQ2_zB zv0XKLtQgPL8DF22F@m>rvc9qX%)cH|lD6UEtqbM5c^8bFnR)EJYw0o>6l~k2ziTyX zFJ=*}WL!)3cFmFlUT+0#qDDjW<~-vM4wEN)&O2*a-yUAt7UY@Fzzw*hqAYx`)DTP$ zy9`EUbQthk%Tnh_l!Qp^~%D%%0&Ti_53~lm#EUy+Quv$X#EtVG>aogdp7XB=5qy!eSe##pP|VG zQ4-H53ewYqh7*uOnU=2eT?%>Jdb}4Z?$dvys!B$^Vc15lrZvcA1S==~_@LtUA^e)m zMc^W-GcQ4?Bg*Z1CZ{t))Rc}+x8~YYXXL+-e@bnKOY*7&TO?X$Cex8+byHE-CHm#(}!=ntk5dQa~E}`3_(m~s@Tl}&(Kkumw<=RQ^AT-n$ zH{Z+|_N{r_YVJ}Za%7w6cJE~?%(n_jENt|4_jo=P3VC!p8MP#*jzS?1%kdda0mm}~ zjaH(s+7#tB3X>!Oi^=RamBm#4PEv_LSaK*{E?}ndLnZ#iA}}|3V(F_I<3{5}@qsl!ZhY&*pea)lF=OQ zjFY%?8p6>MTZ%8)RnG&)r?eLjAulYy-laoM0>=)kF)vr-QqVao_NuWvo~;>lEm zO#{xs%T<;!FSUDQ!;X8_lPJDjwk6Ilf+l>Q-W}{NZevey2RiHHf^|}E_cJ81Sx&R# zyx*#iMdPfKb{6WKO?o4*5p7Ok6d5}srfk#mU}NR-fkOn1UB;8Bf#LINv(4pE=p}>Z zL6cY&q7ygHoVNYu_AKU<7uwl}5&}E<0?6`m)WBb5Zbym|u`OIDD2_rf^dq}l z3x|7awoI`T4wZ<;@?L|eyyMARbVj)zwVz%qoJ9p<+Agd}<$)+Dn5IT-(p;jmt$$2L z1BWnaf%DtN5oRJs(n?Q`Vbe-#Y`M80JFd2CTc?@6)l*EgKvbEnT$jW6%%9Kw8XoNZ zk*tJ{Jgr ztL~^Q8MmZ0{*EEeG%1K@8PoQE^VMPa0|i0j)X_V&_lX?v%dE4%Pt0yXrjKh9gC0@f z!?opQSqt2Z01yP=ue)CMBx7Fj-FhGgE4vze@Nknk?H}DnJclfLTA`3JM|X}i-r6( zNNDLaHoAw^aN<6bRL;j|#5k_AT17N5!IZ9OIT2ryGRLFKGFFOPGh*Oq7-<+|i?W1J z=qY6BcIz26(qCvAgs|(z4TZr)*mHo<2&5AHYBY7)h}eka>+0v{DPDcD*&jJ?r2H!W zBx--uBCofaS>4ppQAC`$sE#duuaaHdz_^)HEximpA#7(N_R>`Jc!=>WKn$KSH)V&T zti#v_S+(K0HGr!RQvztAL>lBq>x`glPr7&se#|M8D0j60`Jvj%Hi5@Or}6i%0#Eiy0mU4mRfP zSRw4t8Z!%rh;k%gieEUrVZhcu{U+Y*5kYTGt?#u+Y$!euZ_-9dofdCJ#v}wJ;B{GKoBc?V$n(ZN>si^Mtvu zc1o30UTC)rQ8D#Pk|#b0FUvs3sa7K~L03z|Cj^6xe>hyk^TU3H+zgQ0PJ_xSH^kTb zUrmk_Xd8(f{pK3<*5ASfeuk^1` z&(v$2ueVL?_!W^HBeUkErTHyUYQTCWZoAA! zJ~J6q`LfVdYh}h9;|sJA&a^d5Nsr^t8U_Up)=UD51Oa?x5I z*ZLC?@1Ti#z~3AqB=j)sC!|G~gNXPicD{ePYY%Gjcu>VMV_(6!hp1n){LcrI<2EE(DWY5<%UtGk~4eSrHD0OjJfbEWB^ zO&{UoSA-hoZl&b~Iw|wLWIW3oQ;j-GWLSy*DT+O!GY|6i0$e0tQtn!<^%)6UI7vAe zJSV!lh&(}6_)@LYGS%QM8h+Y17Io}prqAc5ipJ9O`@RZeJFw&3#8fe$2_-BufAlvm z*mpaJZruDhUro-mw&ejkKO6*BHoRi&U|Z5k#Wh&S7BX1IgLsd7T~ty11^2t0Mui z@>ky!4meU@HXvpg8Es}2yg9s#Jp%G}Y!$D(pp83!+)fd9N;ff5EMb|&^+6#=;FS^u zaG1q;UWl$`jtb2oJj~rae{}gO|A+OeWXAyOfp;SJIVr4j(^S+20%?IQo3cs%VAlM| zG|IY#wJ_+OK^|#dzsK#yM(I>qG3S!U55J`Xki?w3IOc`71Io{$+^|^1^2=v%r&~(` zgx)1CJ|~}{2OaQNaUaNm82!iQY0v-mg?#LF!^%Pur2r}!{_`(XFiwWd1xCidu@2(} z|HW#N6)g5#YIy*I!{aVbW{D>Oyh0>00C$#fDR zW6L?cEByaYc;Sp;(xrM_kZxE$#Al2Cn*D08+9vk!;Y^Ve;NI12Q zF&V6Sl3n>TH)R5Q*)W|W;PQO~vGh!71#&D>R$8fql96JpBTY|crp9Vs*F@7gO|b#m zMAk)HykghwgzmcAbn|IDn<~~Q;5ynnzcOqxsN$P6B=p{y1~7 z#+H`|1n(A-dJ8ECV0{+uiz`lWDJzv$qLu*#SJ&0IJm;a(`BW3T9! zFb#g*_dacX#->q#sL6W=SU5e~9j;>FVt6`Ja>HU&i4K_-nq%bzP~vlMGs)Er41UTh z^hQpObNZ{?W&ep(b;)o01N_7kO292n%f-4GVUF&?9@P(mMtcn} zC<3~WAvNBxu?k&we|1^V>KSRfe9$t@1g;mh;msj6&uvVDDW=qF%ME;{JKf;K4-P%-9QYaR}8H}Sh+ zNZ<5-L0aR#-+I#te*uJ7-pMSTVZJ`re|J0ESQ#sLig4&umt8_C)))G!)hBIkzwfp` zy0kDI!x_H<5Egv!EY@v0U|JsLuU;>-IFx6m8&Q0h+$mugqErAlEtb+nKJ&mT&($55 z#Q+|Q-AK4=M+Pqtl5%~~b#YE+*P&JB0UB;9j}^4<*TtF7AQ6f0*qlNx7pi^{XRhru zHt@dyXND9WH#hY_xvpIbVvJvnapOTP*greN@mo9-0ufxhK;3j&Tzr}l0E1d|2A;{Xn)%TACFIvHk6OM#nGn*4lb~E+NXzcj1U}2NUb2l=7)z^|`33 zD@jL3eFGmlSW`{5toGc@FoF>YYldL(+p)ZMIlCjFGHS9IPc&HM87FK{_ocVL!6mH6 zE6J9zy64Ogw- z^lGU3m{pt<1z?xS&5oxoM_RCzxw`}J`>Nw@)-X3uAtE3LC5{pZZWh_eeq$t0zXil9 zShU1~+_Szs*H922P(vS&1-Ks6P1~Z!43&4YpU_?ut1L1n*DWz&C-25~3 zec(zYvN)!UmA7zQD_cB2w!wmo?fhT}Btbr{b7sE*Q=`Sgq&}9aaB2gdbZF1)^s^99etyg-qDcQRw+n!m5{-D5g|A>)NlVqev<*|_O>&|nkFRW zlX5Zez&Vp&7gTacs28f(195yR^7o?=10JG`?aMDVz2@U>T{w368gxnz|Jr*(lbAb9 zTs$wdr%)3&B$OBY;LV**HYWO{zQFX!pY<%T{1U}j*AXCeM9s2NV>X4@n0vS}Z9#{0 zTP+aH;XUgZ+InB_OOMRHUbw1e-b^QlgcrRf0{=#M zyW3iCBb2H9y|YKoA+19k`Sgn~19JX2lwc`^)vfu=3tO0VD>tuIC+L@6>>|n5{;L&> zh+(?=1NDqi2BfD4824WL$vT2Z`oYanchg zJ=D>9SPPv#PGUWsJbL+_6h#O3{*mc&Et3Jd%w}T!{**f4MHYD#GH3w7QieSp=Eg;0 zW59LPMVJ`>lgj=`Grddf#;Sd`%A|GQeMg7cVMUUrie-kkL4)v6jMHmb`_gGEy?#%y zS^BRFYVf`7fw1^JHXwqR_TBsaUa9+5G-jpuehe+(jQ6PyOSDw@_{s|^+l}v9NEVmq zg5;*VlVre~pb<75f_gEf5~U&jInCcJD~&uK)2R zHcN2NM2EyPd^rkZRgFG}l$JDADK%CH4gTzQS@Kyp4V_CCpNB)Gr17<~m5-ZCa!?-& zIRGtS*vdpS;gW;Yak>=jk_-2M5#1TnhqBFg#9yzBf!$7n@*R$xS8A>2&?)7gvc^lU zgimx=R(!9m5tye(jwXui@rVk9qiw-cmxqhRcG3ulOF|qQx>av(8I+On1$wLfJkF#%52T8b1-J<|CDt-tA!p)YW7t@B*RTGmJK50^4_V@nmTz9B^r4rHW>tJg z&eV9a571VhO$|L}*g9k^d=ARfn?r=2ibkt3#u0`t;h$io;TN?fpSp^CY+eC(7~cU^ zMt=U@z=+XCHue_$ z!gniLBrd4ecS(dl{AtQcu&hfxV{3c9qVhMBOVVI(Prt86X$@OL*A)Xtpb3D>%2aqD z%p+9|$204lB_B+p5jpKube(sNJ0vzAyGE{=LO6hn3-KJZp6Z{TqzE1Bo<&JUU$8P@ z9uf&#S{S5YqW7Y2;tF)5=zLtPmokl5=Ls9H@R#IjbZ^zC2f|{_g+koZorq*5Y4UUl zB^W60`&PnfO-|=lf{HTI`1f$PZ83-9oA~4M7{Mq#)OHpv;5D-3@n4yhh&jc{<`_9v zP)q-E-wl{jfc@pGlyyz2-K+xw$bbo3oE{Hw9UNJfD{f`bvOJB%sll z50PMh%ro~?0XqK4_2#J;-;UlnL$o5Tr^R;193M{}DW87opDDLNF)%QM*4VH-2^S5g zZnpot6Hren<%2>)TOhQ=Eb+?roQF#r@Ch#7mZ_pW8o+8Mjhi*+TWrczP^U-wRu+Lh z+S!Tk18JqY`k2ioIOi9rQ{q(NpU0hL^qeKQDQ*;ew)M0&o3IH>Vg08acDKy8qsG7MM+dVLYGYyvI5D5_lt>zOK0o&9ei$##BFt)M4#Kl77C*7`44eM4rY6EwvO~F zwHP<-x+O=9+sGd$5u56b?c~T9StcX3N85;kk*2Hw?LR&iTKM zG2HL|v9QJ+C}~grAN(lyWh*E28kMl4e-hEPeb(+rNm%Za-@OoFq?URQwUs$hLiF_$ zo7uu=kIX*5m&JnD^#PRGtcp+mVZ26Nw5z6-rba3lT~-h}`t9)Lr+@fvGvJ50BTl4V z-y^jLI-6~gp|_3x^3}nDdZ!-b)T$#MF{n0vuU?|ji0J$yw#sk<@yM|0|gZy~_GuglF>0g_ttl>H(zW4Zj|uSCH8D<%S?0UBTyXQ)n_+ zeTa1zx#9QeU!R{*MxaA;6a9UPE(R-oWz>WyF$ag(CNy1_9xQ!kg8AWd1;!_Ud+hIb zHP@wm_N%l&br7uTIW30aqT>H5hq&(=Z_w`#scF-R31H>#@nKDfHqcptx@%`g(qF`c;ZL_1<`f?)=*6O9k;rLFFajM0s=a1(K@SkuWW`Cag?rYDq zNAaEwrl2?MQR16W^zyI1+0A~QjG!}#T{Z^Fqn<>UeObw>y1CJ9tnpX++netA9~f(? z0WE4VacoP=BF1u7qR8*rAGeede_$+xPuOS9GM5bg7RP$lr6pR9JJq-Uv#o;5Z9F4#L+CFV#CtH3AiJIt(GrtU&0UW+}fvqq@JP@U`bZe9s5_I#3_Y_IH3S=12eN z92rpSW>1aZgzj1~sY|qMHSJ2Y5(_5*7aBNIcE?+`?^u-*n9lp#KqQZ0vB@nVw4Saa!xu^@v*-6Jixplo89O%r1!N zJx&5+Jue2$4&nV+&uXpg+To6ZAumq*Scyle{v|9$_qwQ2SZ-)9Y8!1V z_m=D^ZSOk#b$s;rZMEF*O$EmVA`&rdih_@{1Q@dYW=Lg1j&GB1CjHpUDZ6c#bAnjl z`i3rK#Qr3T%Rq&IwSMlnAhwTc`KE|_9)77oFer++z;Ztkgj2lA%wc8cqJ?C$!bN2+ z(>eTFtc76xW=Fx!4kuB+W*@6F;t!+@Hh3haAv^OyrN62@F94`Q0{nZAk95)#ZF52> z&kAOTpvj@n_&g5B@;RW31a2&L;;U%Trh0E^fTO%?1YCRF@3-Ss zY&BD(@Q(EPBUm>k{-iIud7v^#5F80DcV0jJ0e_4Z*k9mkDz1m))Kob3Zq+${IsBQ-B&I0vs|K7WgcACly@O8?+sCM*|3*JbI_jnAx+G zeK9bqT!47URm?+UmqI58F!jxKWplfL$qp#U0~KuR%!$FSoSQ@o+PZF;>+EC$ip$CP zFgefLPof=%+mFa)&VmH9Z=-kv8YhczbOz1U8?F<6#Oozum=!X+foE49unBz+)B?wx zU5lBYhzR&lJwn2=FK<&me|2MLcNL-2)nF=}$FR za#bSxiMAx0Tmh77-x{U-UHW8E*hbkOURio}(-p~LW8TorTnHeWI=iPlVCwD@K|uu0 z<#jjZV+{Sbe--?AsFun%?mdZlG1JXZ3IAcbza{_9ERd4~luZuuVNYI0V(D>thSo&E z|Nf@{eW+FvP@C=PT$5od>8c!j7z#UzPX22FnKdHj{C}Jdo@|8Luj$`uB!p`}`)dV! zaYnN;gq;R&&;Kg5C@UDXu&}`KsRR>FFY|Gp2_FOXKe#YgIQrA-v%qi49uwg0ab}Zb c804HvnrZbQa>Zocf`Fg9xAis3)E+(mKi!q}$p8QV diff --git a/tests/TestFiles/Cairo/OpacityMask/Opacity_Mask_Masks_Element.expected.png b/tests/TestFiles/Cairo/OpacityMask/Opacity_Mask_Masks_Element.expected.png deleted file mode 100644 index f57c675b7a013cb3fe4f94241527f96150ca10b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmV-U1F`&xP)i%%vIn$gk44mb`ymP*L z=Du_93`J2CMNt$*Q4~c{6h%=K#WW0AH)?F)Rm}RIX8Xi@U3+cdMpo{-xh?Tt&pNoQ zw$HVv6Z2jmMOfn;9&&J5`*qpb#se9-FO$__S4<~sj4vnUzCgIJ#>0AdO(|=JGmW#+ z`7e{vVOLBqYmA>v$bW%QVe{_V5F=}b(~UEcH7pa|Vb6$@HO5Z_*RVjeu=jBle~OVc z!>Pvo!FAjsWpHgA!$mxfQ>K$O#y1Au$*3i5(jRG@#$(vTQLD=u<97$PqVrD|HZt$J zO{$Pw=(XWi^~^oQTeQZNeIN;01kRUscu^Uy9CqEy5ai z;YB=RI#~@TTK{;5kuI!p4_?+c&r`}8<3}U&PZc)*@4te3#mH(n9=VpK32QuvmvFZ@ zSz~-5s*bGluuXl210MM?T#i4Ds3)Vt3|w#gj^}Zwcv(LUY)90R_LLm>7O&%1v9f0P zEUJ#wIc(r2-oTIIWc?h~U94f!ANUP#;ycsJYWO@d|F!HT=O-0!;|tTu3R}BI)_J`1 z*T4t*5ziE|X1E@mcgj=p-)Q~b8&*F&9OLcz8W~Euu=$qdye{jAX=J5z7fHfepS{lM zqEn;)}W(0?j$)U*ry?)UmKvX0$Eci2<@xkgPbYiD35xQ<&yKP5jB zE34_FNgAQT2ENySDHtVdJF~mUnZvG%ku}3t3HdLOalEsozowRTbKsZg{Flj^^glMO zteO4=a5^c%27b_AhZXc+vUb+dUF7a1uQ^<2?RD*&#Jr25D2k#eilQirq9}@@D2fpN Y20PuSvP48Ip#T5?07*qoM6N<$g0Li&%m4rY diff --git a/tests/TestFiles/Cairo/Shapes/Ellipse/Circle_1px_Stroke.expected.png b/tests/TestFiles/Cairo/Shapes/Ellipse/Circle_1px_Stroke.expected.png deleted file mode 100644 index e63700654599316d8ba1c237658161c19ed2ef6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3323 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 FV1fjw84dsd diff --git a/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke.expected.png b/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke.expected.png deleted file mode 100644 index f0a6a9b10984cd1276deb34e741a0a9ba815a51b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 624 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggNy^j3F{C2y?PW(!215asgB;!U+8YaJmp{1WAj;Fz829+hH`@cRk0}cM oP!!@&YE&2{Mno70AGeZsk`ufzBV)xvV5(v8boFyt=akR{0E2FQp#T5? diff --git a/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke_Reversed.expected.png b/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke_Reversed.expected.png deleted file mode 100644 index 9ed7e713a9921d6d4d3632cc5d6bedc526fd34e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 629 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggN#4`NF{C2y?d6M{4Gui42Sw8Uuf5UM#qqr`o7Gt0lhh5yZGFGbl{2l@ u?|aV7UFaad&N51jgfKY3UwGi!8CEAb!3zP#lN^9ahr!d;&t;ucLK6V^2zq(| diff --git a/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke_Vertical.expected.png b/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke_Vertical.expected.png deleted file mode 100644 index 845961351cca646869f1d7ba644262407a61ac98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggN!-)LF{C2y?d6TU42lBG2Zg8Bzf@`YbBx7!(o?Roic{ssl&@7ja8eLp jVR9TLMo1X!Pcw@yXX;<`K5s2B$uM}j`njxgN@xNAErwO? diff --git a/tests/TestFiles/Cairo/Shapes/Path/Arc_Absolute.expected.png b/tests/TestFiles/Cairo/Shapes/Path/Arc_Absolute.expected.png deleted file mode 100644 index 113cc908e6aa8887dc7b84046c5f5c345a16ae7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3229 zcmcguhc_FJ6E}*|5~ZzCBaIToXj7x8*cE#;RtSn3N!1sn60>cT4x>iZsv0dpXjM{T z#HvxVh}5pyRH#jjpYMCW-@ov?_wGLL?!CLu-FtWM-7`ybLvAi%E+!@>ZX>w9^$E8B ztEbsdEYZH~?FldkS{v#zmGy`$o;atxbj);^m_8+(Ik>~d#B|osNM8pL;=D4BeVMW) z+V;mQ-s`QGr&rnvMea=LM^Kv^uYG(mXZz&}Z89a6J>lJ8KRTKG%nY|6K7<@V+z$QG z(xT*Dx1^)p7wc-EN_UStz}`a-lbLnisKB60fVBG0ME*{mGuqE9$t05qBdibQ&fZ@eKCC){BPKlWV3 zCmBiby%3@qCJ2*IsMdxa^TPUk2`l=r5SIt^ep5xTQIQHV{X(WezwV}w?k%$VZt;}+y880c zW{q)XF;w=dMDS{S+(_Lhcx70Opa3~2t1%u@Dpqc`0|Jj@@Of5J-{mVJs*FbR7XG@o zv5&UJbFX6VDLGM1WdO;RSv;L@wu8OKda{jt&P+qM?XM;~C?w~isNBNL->;k}-zw1l^908Mm`C!B9liz7A?=V}* zr^uoG096c-PY!hSgE?_T!wo+VF;KYmdmLjrLD_0)N7bTco78!18A2p)r*! z77vn6z(}5^zBB}}s&;2NR0ob#ML5V;@AhFl_ZG%O_Te*nluIW=r8E4 z%|F=6jH;@rhezuIL`0ONDgHyH#;%h=xnqXDAo-jc~$uQ)4_RK)9VDnP!oLHNHGg|f04 z&gmMeBNGKZN80s8Ll_1n2n;dLMyCxe$MhG}=eo#3?h5caxc~4OI4~PoJ!b6hZAfUe zCV0hJ0nu^Lh&G=5+4pH~I`qT9tEv0drbYOOYPl2}?EAbJ(iue8e8-n;KOI)W}KepLUkF?3aE68ZT< zY4NjpR?yU&1-veVM@i`{ww@@T*OO)NrwH9oM%&!mZ4-Z(s;B(to;HF8=U{nQ{iq?q z1^E$J8~#iGkjuESWo0yO4?}M~Oz+ZbG@T1Bx8=8B*SCqo`@lxkLe>&f?OaegG-)%N zwuDP|u${4vr-y$5nTwkw=TfP+XW%CTTb(SoU-N8Qrl0eJb2WuGwX?}kzZImRY=>qA zY>yvQ9A+2|N0@s=PP9!;anJYckaq}M| znT{y<>>G)xkf}YgiX*E0(K>B#qKrrGZDmr2Bvi(NGVG6}P(xa+N@%b*y~rwm zntYfgwiIZ<2?w30Z2V)^ooDmnVzgTLDHpG;rs%17ohP2zTrsP3z3}2*ufpja#n%@2 zoTH$QBrfxtEyG2CzCypMT+l_HNj?BOwLIppX%4$Su0x8hBpwmAXwA6sxRe0sH}tEo zZsLw+q^b=T(rtGfvE0Fu21Q>A|TgAUK*0%__!aL%Zn%>?H8Bi5nR_~(lKl`-DZs}dH1D=j5HHW zw5}D=HuUyw1d=$plv@jdYY%RTE}1V^+Da>pqsJ|aY)gR5MkCv+Dm`y~2avgaC*-;q zjJ@vqJF#yiwH*5LU9;DGms4bLr=&}F+TzY+m6nQJ*(fsu%$iNG{`#>Up6S{3vA;1d zyD1^UJKUs`i2%Y(p2?~$uuw zMx80)>oZ(+oGB>}!KQ+Vl`EIFJk0}mV$tQgix1AIX5S*9{m{^Z#m&u$N{2cEa6_FP zVD8U)Bc(X3(m{=5=0PZJ%!#1-D5=tS-6JT%w&#mnw+!&uryRk_YMf4yqpwnuJ$mLg zH6^NT6R{k^!cHTQ6!oC6`}BqH1gFu`ES3PMFp3=Bf2E(L&da~?7bngSkC{Ex7!f}l1r6OEH*}28>+Ek$C){Gz#IaLo~VI?f$nO4AB?2`K6U}h9J zXpmkKczQ#eSH_|{W@$;Tjx(gcaUTcq$q-oV{`{@}@oreM{k!I6k960nM-9?-SX&1U z{fQ7BdSt`$plHZJS>_fve2Dqa`vDp_Uqk}`g%E{L>Uf0PD6Qa$O*OXR;|#v59UYZ(aP~GyQ)>uFk7R+;^iGIcs`?&HpkR8JO#r>AF7t4>rvW5dZ)H diff --git a/tests/TestFiles/Cairo/Shapes/Path/Arc_Relative.expected.png b/tests/TestFiles/Cairo/Shapes/Path/Arc_Relative.expected.png deleted file mode 100644 index 113cc908e6aa8887dc7b84046c5f5c345a16ae7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3229 zcmcguhc_FJ6E}*|5~ZzCBaIToXj7x8*cE#;RtSn3N!1sn60>cT4x>iZsv0dpXjM{T z#HvxVh}5pyRH#jjpYMCW-@ov?_wGLL?!CLu-FtWM-7`ybLvAi%E+!@>ZX>w9^$E8B ztEbsdEYZH~?FldkS{v#zmGy`$o;atxbj);^m_8+(Ik>~d#B|osNM8pL;=D4BeVMW) z+V;mQ-s`QGr&rnvMea=LM^Kv^uYG(mXZz&}Z89a6J>lJ8KRTKG%nY|6K7<@V+z$QG z(xT*Dx1^)p7wc-EN_UStz}`a-lbLnisKB60fVBG0ME*{mGuqE9$t05qBdibQ&fZ@eKCC){BPKlWV3 zCmBiby%3@qCJ2*IsMdxa^TPUk2`l=r5SIt^ep5xTQIQHV{X(WezwV}w?k%$VZt;}+y880c zW{q)XF;w=dMDS{S+(_Lhcx70Opa3~2t1%u@Dpqc`0|Jj@@Of5J-{mVJs*FbR7XG@o zv5&UJbFX6VDLGM1WdO;RSv;L@wu8OKda{jt&P+qM?XM;~C?w~isNBNL->;k}-zw1l^908Mm`C!B9liz7A?=V}* zr^uoG096c-PY!hSgE?_T!wo+VF;KYmdmLjrLD_0)N7bTco78!18A2p)r*! z77vn6z(}5^zBB}}s&;2NR0ob#ML5V;@AhFl_ZG%O_Te*nluIW=r8E4 z%|F=6jH;@rhezuIL`0ONDgHyH#;%h=xnqXDAo-jc~$uQ)4_RK)9VDnP!oLHNHGg|f04 z&gmMeBNGKZN80s8Ll_1n2n;dLMyCxe$MhG}=eo#3?h5caxc~4OI4~PoJ!b6hZAfUe zCV0hJ0nu^Lh&G=5+4pH~I`qT9tEv0drbYOOYPl2}?EAbJ(iue8e8-n;KOI)W}KepLUkF?3aE68ZT< zY4NjpR?yU&1-veVM@i`{ww@@T*OO)NrwH9oM%&!mZ4-Z(s;B(to;HF8=U{nQ{iq?q z1^E$J8~#iGkjuESWo0yO4?}M~Oz+ZbG@T1Bx8=8B*SCqo`@lxkLe>&f?OaegG-)%N zwuDP|u${4vr-y$5nTwkw=TfP+XW%CTTb(SoU-N8Qrl0eJb2WuGwX?}kzZImRY=>qA zY>yvQ9A+2|N0@s=PP9!;anJYckaq}M| znT{y<>>G)xkf}YgiX*E0(K>B#qKrrGZDmr2Bvi(NGVG6}P(xa+N@%b*y~rwm zntYfgwiIZ<2?w30Z2V)^ooDmnVzgTLDHpG;rs%17ohP2zTrsP3z3}2*ufpja#n%@2 zoTH$QBrfxtEyG2CzCypMT+l_HNj?BOwLIppX%4$Su0x8hBpwmAXwA6sxRe0sH}tEo zZsLw+q^b=T(rtGfvE0Fu21Q>A|TgAUK*0%__!aL%Zn%>?H8Bi5nR_~(lKl`-DZs}dH1D=j5HHW zw5}D=HuUyw1d=$plv@jdYY%RTE}1V^+Da>pqsJ|aY)gR5MkCv+Dm`y~2avgaC*-;q zjJ@vqJF#yiwH*5LU9;DGms4bLr=&}F+TzY+m6nQJ*(fsu%$iNG{`#>Up6S{3vA;1d zyD1^UJKUs`i2%Y(p2?~$uuw zMx80)>oZ(+oGB>}!KQ+Vl`EIFJk0}mV$tQgix1AIX5S*9{m{^Z#m&u$N{2cEa6_FP zVD8U)Bc(X3(m{=5=0PZJ%!#1-D5=tS-6JT%w&#mnw+!&uryRk_YMf4yqpwnuJ$mLg zH6^NT6R{k^!cHTQ6!oC6`}BqH1gFu`ES3PMFp3=Bf2E(L&da~?7bngSkC{Ex7!f}l1r6OEH*}28>+Ek$C){Gz#IaLo~VI?f$nO4AB?2`K6U}h9J zXpmkKczQ#eSH_|{W@$;Tjx(gcaUTcq$q-oV{`{@}@oreM{k!I6k960nM-9?-SX&1U z{fQ7BdSt`$plHZJS>_fve2Dqa`vDp_Uqk}`g%E{L>Uf0PD6Qa$O*OXR;|#v59UYZ(aP~GyQ)>uFk7R+;^iGIcs`?&HpkR8JO#r>AF7t4>rvW5dZ)H diff --git a/tests/TestFiles/Cairo/Shapes/Path/CubicBezier_Absolute.expected.png b/tests/TestFiles/Cairo/Shapes/Path/CubicBezier_Absolute.expected.png deleted file mode 100644 index 8c8f5350ee01583fdb1e8a3bb61ec1dc1b54efde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4474 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 diff --git a/tests/TestFiles/Cairo/Shapes/Path/CubicBezier_Relative.expected.png b/tests/TestFiles/Cairo/Shapes/Path/CubicBezier_Relative.expected.png deleted file mode 100644 index 8c8f5350ee01583fdb1e8a3bb61ec1dc1b54efde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4474 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 diff --git a/tests/TestFiles/Cairo/Shapes/Path/HorizontalLine_Absolute.expected.png b/tests/TestFiles/Cairo/Shapes/Path/HorizontalLine_Absolute.expected.png deleted file mode 100644 index 546ffec3bbaa052fa9730aabb59075ceaa59b303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{4<>}%WQW5v|(nekeMFD0<=cgs-gk$(PJ@n72yk?RCs-PNpuq^EEtdlD^ n_iyj3|MENzWINSB!}dx1{hUlJd){4*02%7(>gTe~DWM4f?g1-i diff --git a/tests/TestFiles/Cairo/Shapes/Path/HorizontalLine_Relative.expected.png b/tests/TestFiles/Cairo/Shapes/Path/HorizontalLine_Relative.expected.png deleted file mode 100644 index 546ffec3bbaa052fa9730aabb59075ceaa59b303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{4<>}%WQW5v|(nekeMFD0<=cgs-gk$(PJ@n72yk?RCs-PNpuq^EEtdlD^ n_iyj3|MENzWINSB!}dx1{hUlJd){4*02%7(>gTe~DWM4f?g1-i diff --git a/tests/TestFiles/Cairo/Shapes/Path/Line_Absolute.expected.png b/tests/TestFiles/Cairo/Shapes/Path/Line_Absolute.expected.png deleted file mode 100644 index 4661a6a8c4e74ae0b9487789573081df1a5c8390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggNzl{9F{C2y?d6TU%>g1T2gBJ|ckukmKN@?3?Ik-$W-P<3PQU5zff_;J zz~kEVZKjQ@mHYl0e-`7s6Z7cCb=EmY7#(E_!9iC>0_RWs!m Wvw&f=pvSfqU`*#KfosKxu-ej^S$?% z+>_bTOn<)+KN^kZFBWCUpxW?vJp+EP?=!bU@lne%(`e>D!k$3mTP*xkNTYQ(yt{hn z9o&jDg!0M*^OJ(|(9hX*cTaZ6zMr5XOY-`X@+{7Ed6g0O<#%2P`{gAvey+%1Oya8} zYbfO&=jznOwko?%tSDfTb>jU%A^`BWeu&^>)~}P>|B`Hf_-NU-y*icqu)90#7wf-| zE9JhozG44%#oG6Ad)Cm%?R}>Ulix(>^tYo569x~hR#j9iEqQP13AQB2yS!qpw_GeQ zmn+j(^?M%-J*%5}wPrTgJ-B}>yyp1A;pN9KN%oC1&!&%mr(ha8yIJ)Mn(8+m%Q0)~ z$jHp%qc4_cU%#qc>(x7pcol-Hnc0o=@zgHqc$CTZEn6h`&=VwAhBA${YVZ2ZJ^l>Y z&?M;_eAQ0)os%_mM0zYTeC00&*vw zVyY$p;V_yqCjc3?6Yp)o$O=b9B0%_Ybg@YZh`Wea5{!{*CciNRkfsK$F$W{h<0;=# zjBpuEJI4VL+lkNarNNG|nCJPb6Gr|_q=J8z16#terJTdhbCjvPv=uLi)B6ON{dVH;y>wu@ig^q3n3+hRIE$F^ux+Up%*-;CodRHNDn{aTEIwQg zy{*6wOwVcU?p_ZtZFb_oU3@pA#k?D3nE5+_+NQwU8m4>TGCZU*g{~2vf~CX@+JUZN zyfjEikMzOpy3Na2+|Y8*yLc zvAjFd(bI}#mbdbPe#&!`HX^ed`BTNMCeH4SRo=eLGR2(1}^ljT%>?>r6UI!Al*HdgA}pQ zJ0-{v2E9vy6kB!V21hzFgzCtav2>(>{0&YL86dyKMIr^{%N;6YfPCke3Mn98?kq(H z$alI*kpl9+Bu)hIEKyz-k*&W^fc~XGFRLY&aZ^GsqNleEY|K-n{Sr{&;V` zpIvcDoj>0?(Q2_+@`C{`g4cfY0Xdk*>W?45%cz$ley`>DMJA0mom5FV%mw4&A2vPi)ISjQ5KUKiorKU33>z=KZ~Og0du} zp*Q!Oj|*!LWk)dC9Lz@#nf!sx#S9%X`ExmmxvbaZH|6G}uh-;2xjDJK*JQ9OYdUxC z$eq|2c4$_tK@|3rnYRNi)y1<#VLX}X2;BDnm{-0 zK`*hq1|~tYLV>LODyItQvOP!;12yn06`ik;CGtG3D1mO-f{5s;g=c|QsgSI^H4Z`S zjvtN!(N%1^8{KoO5|x_3rV~hVss&W4o=vwS38x^%uxSBZ#3@KMu+81*qFZgHw0yQX zfd(CF4yDaxo7>T#Q*8xWh;0_opi9jG+IqI43k|weJEaw}6(SmOsCJ;uW-B_;h*Qm? zv@lx{Mizn9tJbA{lm9?^wt6Y2>+Q z8cmKnX!6-1lM|;Kn2~0aMLi}P(k7Yd=G(-_{1~Ef@hy)vwlO?nvdwbYEoyU;Y9-;L-#5KEOv6p^fD9s|(Le-Gs?`pF$=ldaE7B&(TH0CV{dpnP9H8AGe> zeKmww%ZvrEgkQ?aE&5XmT5a>MA;fBCJ{`z2uHdrV(qu~8U|hkqxFpadfN5Uq_Zdu5Rl@pW6HziREF20@2AlbjUY!C5}35{&J!Vhg5V54_$Jz5m;P&U01r% zANE}0bTzY}sDFiVZEEaGSg?}r-)>yX$6w*D{UlpZ6D{PJ_V1Xur!z5^=F4ioMf%xw z1B5NNEo$YM867T~Kk;NM4%c4FvgPjQ3OHunI6S$;rz5>;?j=0A%x6vgQ)aw#baVKN vmwubIZ+H0oe_Iy*xMOH__Nf*7E==uvqik_1Giee2jah=eI_|jl`JMj*ZcOVB diff --git a/tests/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled.expected.png b/tests/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled.expected.png deleted file mode 100644 index cb4466a21f9200f05c912322df2e749d27c501e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6192 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 diff --git a/tests/TestFiles/Cairo/Shapes/Polyline/Polyline_10px_Stroke_PenLineJoin.expected.png b/tests/TestFiles/Cairo/Shapes/Polyline/Polyline_10px_Stroke_PenLineJoin.expected.png deleted file mode 100644 index d908a572cbf8b6e42961456aa871beefe1024c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3942 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 F`3HG3#Bu-t diff --git a/tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_1px_Stroke.expected.png b/tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_1px_Stroke.expected.png deleted file mode 100644 index 24239d5799ab3308d44bf2ab283758dc0202c9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggiQCh~F{C2y?d6Sv%?<)A2iyM?yPcbPh2!_C+c#Ot_<%YX7!CwopH zT&&Nl(zxO3{rvlz4{$d+2yn2B5<@o(TC%sVM%xNb!1@J z*w6hZk(GggiPzJ`F{C2y?bVIE4Gugk2iyNuvng7}DIQ8!+sU@)6BAGi1H+9ghSBRH zZv>hZoMV!=l|Le$Xukg4E%rtQ0S=~7Vu*%8!I^2VM%xNb!1@J z*w6hZk(GggNzl{9F{C2y?Nvj*!v;JojyM1R-+XC9L84C6lv6&%@(-H0ftnZ?9t2#^ zxw*MuQO<*TtZ_Ae9rpbP0l+XkKY#Dbw diff --git a/tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill_ClipToBounds.expected.png b/tests/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill_ClipToBounds.expected.png deleted file mode 100644 index d1c13a9e57f842dc1c881f387fe80db1d00510c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggNzl{9F{C2y?Nvj*!v;JojyM1R-+XC9L84C6lv6&%@(-H0ftnZ?9t2#^ zxw*MuQO<*TtZ_Ae9rpbP0l+XkKY#Dbw From 7cb4485dfb98973ccd77e7ec74c585526313afdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Sun, 1 Oct 2017 13:27:44 +0100 Subject: [PATCH 30/44] Added Orientation and IsIndeterminate properties to ProgressBar. Moved the Orientation enum to a separate file. --- samples/ControlCatalog/ControlCatalog.csproj | 6 + samples/ControlCatalog/MainView.xaml | 1 + .../ControlCatalog/Pages/ProgressBarPage.xaml | 24 ++++ .../Pages/ProgressBarPage.xaml.cs | 18 +++ src/Avalonia.Controls/Orientation.cs | 21 ++++ src/Avalonia.Controls/Primitives/ScrollBar.cs | 2 +- src/Avalonia.Controls/ProgressBar.cs | 104 +++++++++++++++++- src/Avalonia.Controls/StackPanel.cs | 18 +-- src/Avalonia.Themes.Default/ProgressBar.xaml | 5 +- 9 files changed, 174 insertions(+), 25 deletions(-) create mode 100644 samples/ControlCatalog/Pages/ProgressBarPage.xaml create mode 100644 samples/ControlCatalog/Pages/ProgressBarPage.xaml.cs create mode 100644 src/Avalonia.Controls/Orientation.cs diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 340905a7f7..11ff531514 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -69,6 +69,9 @@ Designer + + Designer + Designer @@ -131,6 +134,9 @@ MenuPage.xaml + + ProgressBarPage.xaml + RadioButtonPage.xaml diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index 6c432a90ac..0940316ce9 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -16,6 +16,7 @@ + diff --git a/samples/ControlCatalog/Pages/ProgressBarPage.xaml b/samples/ControlCatalog/Pages/ProgressBarPage.xaml new file mode 100644 index 0000000000..bf40e68630 --- /dev/null +++ b/samples/ControlCatalog/Pages/ProgressBarPage.xaml @@ -0,0 +1,24 @@ + + + ProgressBar + A progress bar control + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/ControlCatalog/Pages/ProgressBarPage.xaml.cs b/samples/ControlCatalog/Pages/ProgressBarPage.xaml.cs new file mode 100644 index 0000000000..56792b3908 --- /dev/null +++ b/samples/ControlCatalog/Pages/ProgressBarPage.xaml.cs @@ -0,0 +1,18 @@ +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace ControlCatalog.Pages +{ + public class ProgressBarPage : UserControl + { + public ProgressBarPage() + { + this.InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + } +} diff --git a/src/Avalonia.Controls/Orientation.cs b/src/Avalonia.Controls/Orientation.cs new file mode 100644 index 0000000000..fe998c024a --- /dev/null +++ b/src/Avalonia.Controls/Orientation.cs @@ -0,0 +1,21 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +namespace Avalonia.Controls +{ + /// + /// Defines vertical or horizontal orientation. + /// + public enum Orientation + { + /// + /// Horizontal orientation. + /// + Horizontal, + + /// + /// Vertical orientation. + /// + Vertical, + } +} diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index 0f69e4e5bc..009e1d0ab8 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -30,7 +30,7 @@ namespace Avalonia.Controls.Primitives /// Defines the property. /// public static readonly StyledProperty OrientationProperty = - AvaloniaProperty.Register(nameof(Orientation)); + AvaloniaProperty.Register(nameof(Orientation), Orientation.Vertical); private Button _lineUpButton; private Button _lineDownButton; diff --git a/src/Avalonia.Controls/ProgressBar.cs b/src/Avalonia.Controls/ProgressBar.cs index a31a27ddfe..015b0a6e96 100644 --- a/src/Avalonia.Controls/ProgressBar.cs +++ b/src/Avalonia.Controls/ProgressBar.cs @@ -1,8 +1,12 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System; +using System.Reactive.Linq; + +using Avalonia.Animation; using Avalonia.Controls.Primitives; -using Avalonia.Controls.Templates; +using Avalonia.Layout; namespace Avalonia.Controls { @@ -11,11 +15,41 @@ namespace Avalonia.Controls /// public class ProgressBar : RangeBase { + public static readonly StyledProperty IsIndeterminateProperty = + AvaloniaProperty.Register(nameof(IsIndeterminate)); + + public static readonly StyledProperty OrientationProperty = + AvaloniaProperty.Register(nameof(Orientation), Orientation.Horizontal); + private Border _indicator; + private IDisposable _indeterminateBindSubscription; static ProgressBar() { ValueProperty.Changed.AddClassHandler(x => x.ValueChanged); + + HorizontalAlignmentProperty.OverrideDefaultValue(HorizontalAlignment.Left); + VerticalAlignmentProperty.OverrideDefaultValue(VerticalAlignment.Top); + } + + public bool IsIndeterminate + { + get => GetValue(IsIndeterminateProperty); + set + { + SetValue(IsIndeterminateProperty, value); + UpdateIsIndeterminate(value); + } + } + + public Orientation Orientation + { + get => GetValue(OrientationProperty); + set + { + SetValue(OrientationProperty, value); + UpdateOrientation(value); + } } /// @@ -29,16 +63,80 @@ namespace Avalonia.Controls protected override void OnTemplateApplied(TemplateAppliedEventArgs e) { _indicator = e.NameScope.Get("PART_Indicator"); + UpdateIndicator(Bounds.Size); + UpdateOrientation(Orientation); + UpdateIsIndeterminate(IsIndeterminate); } private void UpdateIndicator(Size bounds) { if (_indicator != null) { - double percent = Maximum == Minimum ? 1.0 : (Value - Minimum) / (Maximum - Minimum); - _indicator.Width = bounds.Width * percent; + if (IsIndeterminate) + { + if (Orientation == Orientation.Horizontal) + _indicator.Width = bounds.Width / 5.0; + else + _indicator.Height = bounds.Height / 5.0; + } + else + { + double percent = Maximum == Minimum ? 1.0 : (Value - Minimum) / (Maximum - Minimum); + + if (Orientation == Orientation.Horizontal) + _indicator.Width = bounds.Width * percent; + else + _indicator.Height = bounds.Height * percent; + } + } + } + + private void UpdateOrientation(Orientation orientation) + { + if (orientation == Orientation.Horizontal) + { + MinHeight = 14; + MinWidth = 200; + + _indicator.HorizontalAlignment = HorizontalAlignment.Left; + _indicator.VerticalAlignment = VerticalAlignment.Stretch; + } + else + { + MinHeight = 200; + MinWidth = 14; + + _indicator.HorizontalAlignment = HorizontalAlignment.Stretch; + _indicator.VerticalAlignment = VerticalAlignment.Bottom; + } + } + + private void UpdateIsIndeterminate(bool isIndeterminate) + { + if (isIndeterminate) + { + var start = Animate.Stopwatch.Elapsed; + + if (Orientation == Orientation.Horizontal) + { + _indeterminateBindSubscription = Animate.Timer.TakeWhile(x => (x - start).TotalSeconds <= 4.0) + .Select(x => new Rect(-_indicator.Width - 5 + (x - start).TotalSeconds / 4.0 * (Bounds.Width + _indicator.Width + 10), 0, _indicator.Bounds.Width, _indicator.Bounds.Height)) + .Finally(() => start = Animate.Stopwatch.Elapsed) + .Repeat() + .Subscribe(x => _indicator.Arrange(x)); + } + else + { + _indeterminateBindSubscription = Animate.Timer.TakeWhile(x => (x - start).TotalSeconds <= 4.0) + .Select(x => new Rect(0, Bounds.Height + 5 - (x - start).TotalSeconds / 4.0 * (Bounds.Height + _indicator.Height + 10), _indicator.Bounds.Width, _indicator.Bounds.Height)) + .Finally(() => start = Animate.Stopwatch.Elapsed) + .Repeat() + .Subscribe(x => _indicator.Arrange(x)); + } } + else + _indeterminateBindSubscription?.Dispose(); } private void ValueChanged(AvaloniaPropertyChangedEventArgs e) diff --git a/src/Avalonia.Controls/StackPanel.cs b/src/Avalonia.Controls/StackPanel.cs index 26a755e5f1..0e12fb3283 100644 --- a/src/Avalonia.Controls/StackPanel.cs +++ b/src/Avalonia.Controls/StackPanel.cs @@ -6,22 +6,6 @@ using Avalonia.Input; namespace Avalonia.Controls { - /// - /// Defines vertical or horizontal orientation. - /// - public enum Orientation - { - /// - /// Vertical orientation. - /// - Vertical, - - /// - /// Horizontal orientation. - /// - Horizontal, - } - /// /// A panel which lays out its children horizontally or vertically. /// @@ -37,7 +21,7 @@ namespace Avalonia.Controls /// Defines the property. /// public static readonly StyledProperty OrientationProperty = - AvaloniaProperty.Register(nameof(Orientation)); + AvaloniaProperty.Register(nameof(Orientation), Orientation.Vertical); /// /// Initializes static members of the class. diff --git a/src/Avalonia.Themes.Default/ProgressBar.xaml b/src/Avalonia.Themes.Default/ProgressBar.xaml index 4acff26537..82f385e16b 100644 --- a/src/Avalonia.Themes.Default/ProgressBar.xaml +++ b/src/Avalonia.Themes.Default/ProgressBar.xaml @@ -1,8 +1,6 @@