From 2afd6cb224f1b71f260c46eff4212c43c430065c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Mon, 15 May 2017 17:40:37 +0200 Subject: [PATCH 01/22] Remove NuGet workaround --- build.cake | 12 ++-- build/UnitTests.NetCore.targets | 1 - samples/BindingTest/BindingTest.csproj | 1 - .../ControlCatalog.Android.csproj | 1 - .../ControlCatalog.Desktop.csproj | 1 - .../ControlCatalog.iOS.csproj | 1 - samples/RenderTest/RenderTest.csproj | 1 - .../VirtualizationTest.csproj | 1 - .../Direct3DInteropSample.csproj | 1 - .../GtkInteropDemo/GtkInteropDemo.csproj | 1 - .../WindowsInteropTest.csproj | 1 - .../Avalonia.Android/Avalonia.Android.csproj | 1 - .../Avalonia.AndroidTestApplication.csproj | 1 - .../Avalonia.DotNetFrameworkRuntime.csproj | 1 - src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj | 1 - src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj | 1 - .../Microsoft.NuGet.Build.Tasks.Patched.dll | Bin 35328 -> 0 bytes src/Shared/nuget.workaround.targets | 67 ------------------ .../Avalonia.Skia.Android.csproj | 1 - .../Avalonia.Skia.Desktop.csproj | 1 - .../Avalonia.Skia.iOS.csproj | 1 - .../Avalonia.Designer.csproj | 1 - .../Avalonia.Direct2D1.csproj | 1 - .../Avalonia.Win32/Avalonia.Win32.csproj | 1 - src/iOS/Avalonia.iOS/Avalonia.iOS.csproj | 1 - .../Avalonia.iOSTestApplication.csproj | 1 - .../Avalonia.Benchmarks.csproj | 1 - .../Avalonia.DesignerSupport.TestApp.csproj | 1 - .../Avalonia.DesignerSupport.Tests.csproj | 1 - .../Avalonia.Direct2D1.UnitTests.csproj | 1 - .../Avalonia.LeakTests.csproj | 1 - .../Avalonia.Cairo.RenderTests.csproj | 1 - .../Avalonia.Direct2D1.RenderTests.csproj | 1 - .../Avalonia.Skia.RenderTests.csproj | 1 - .../Avalonia.UnitTests.csproj | 1 - 35 files changed, 5 insertions(+), 106 deletions(-) delete mode 100644 src/Shared/Microsoft.NuGet.Build.Tasks.Patched.dll delete mode 100644 src/Shared/nuget.workaround.targets diff --git a/build.cake b/build.cake index 2f6bf5b0c1..2d62ae2d54 100644 --- a/build.cake +++ b/build.cake @@ -2,16 +2,16 @@ // ADDINS /////////////////////////////////////////////////////////////////////////////// -#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" +#addin "nuget:?package=Polly&version=5.1.0" +#addin "nuget:?package=NuGet.Core&version=2.14.0" #tool "nuget:?package=JetBrains.dotMemoryUnit&version=2.1.20150828.125449" + /////////////////////////////////////////////////////////////////////////////// // TOOLS /////////////////////////////////////////////////////////////////////////////// -#tool "nuget:?package=xunit.runner.console&version=2.1.0" -#tool "nuget:?package=OpenCover" +#tool "nuget:?package=xunit.runner.console&version=2.2.0" +#tool "nuget:?package=OpenCover&version=4.6.519" /////////////////////////////////////////////////////////////////////////////// // USINGS @@ -119,7 +119,6 @@ Task("Restore-NuGet-Packages") }}) .Execute(()=> { NuGetRestore(parameters.MSBuildSolution, new NuGetRestoreSettings { - ToolPath = "./tools/NuGet.CommandLine/tools/NuGet.exe", ToolTimeout = TimeSpan.FromMinutes(toolTimeout) }); }); @@ -144,7 +143,6 @@ Task("Build") MSBuild(parameters.MSBuildSolution, settings => { settings.SetConfiguration(parameters.Configuration); settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); - settings.WithProperty("UseRoslynPathHack", "true"); settings.SetVerbosity(Verbosity.Minimal); settings.WithProperty("Windows", "True"); settings.UseToolVersion(MSBuildToolVersion.VS2017); diff --git a/build/UnitTests.NetCore.targets b/build/UnitTests.NetCore.targets index a8886fe028..13bb4ed230 100644 --- a/build/UnitTests.NetCore.targets +++ b/build/UnitTests.NetCore.targets @@ -25,5 +25,4 @@ - \ No newline at end of file diff --git a/samples/BindingTest/BindingTest.csproj b/samples/BindingTest/BindingTest.csproj index 1c4e4f8169..b62f9a54b6 100644 --- a/samples/BindingTest/BindingTest.csproj +++ b/samples/BindingTest/BindingTest.csproj @@ -162,5 +162,4 @@ - \ No newline at end of file diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj index 4db67a8b60..71e3c4169c 100644 --- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj +++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj @@ -158,5 +158,4 @@ - \ No newline at end of file diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj index e215105149..59c8c53137 100644 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj +++ b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj @@ -144,5 +144,4 @@ - \ No newline at end of file diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj index 01d287ea83..d0c73b2553 100644 --- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj +++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj @@ -181,5 +181,4 @@ - \ No newline at end of file diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index cf32316086..ed6194e0e1 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -183,5 +183,4 @@ - \ No newline at end of file diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationTest/VirtualizationTest.csproj index 9b9d8a94c6..89115016bf 100644 --- a/samples/VirtualizationTest/VirtualizationTest.csproj +++ b/samples/VirtualizationTest/VirtualizationTest.csproj @@ -158,5 +158,4 @@ - \ No newline at end of file diff --git a/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj b/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj index 54a816b0a9..627b879c23 100644 --- a/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj +++ b/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj @@ -30,5 +30,4 @@ - \ No newline at end of file diff --git a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj index 044b96c865..13dfd0055f 100644 --- a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj +++ b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj @@ -150,5 +150,4 @@ - \ No newline at end of file diff --git a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj index c787ab76ee..028892ea94 100644 --- a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj +++ b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj @@ -180,5 +180,4 @@ - \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 4babdc8bff..1ed416f385 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -133,7 +133,6 @@ - $(MSBuildToolsPath)\Roslyn diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj index 826f1f0132..87d1f67986 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj +++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj @@ -157,5 +157,4 @@ - \ No newline at end of file diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index b475c4b3ff..932afbe0e6 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -69,5 +69,4 @@ - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj index cc6684f622..9a59f9e054 100644 --- a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj +++ b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj @@ -103,5 +103,4 @@ - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index 837b83bdd7..8aa57293f3 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -98,5 +98,4 @@ - \ No newline at end of file diff --git a/src/Shared/Microsoft.NuGet.Build.Tasks.Patched.dll b/src/Shared/Microsoft.NuGet.Build.Tasks.Patched.dll deleted file mode 100644 index 33ab0a4af72449d52371baa77daaaf60586fba1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35328 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 - - - - - - - - - - - - - - - - - - - - - - <_ReferencesFromNuGetPackages Remove="%(ReferencePath.FileName)" Condition="'%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandTargetFramework'" /> - - - - <_ResolvedProjectReferencePaths Include="@(_ReferencesFromNuGetPackages)" Condition="'%(_ReferencesFromNuGetPackages.NuGetSourceType)' == 'Project'" /> - - - - - - - - - true - - - - - - - - - $(MSBuildToolsPath)\..\Roslyn - - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index aab791cd8f..4cd1f21022 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -86,5 +86,4 @@ - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj index b8dd79eca9..e2d4522d7e 100644 --- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj +++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj @@ -106,5 +106,4 @@ - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index 220fb37b81..b2d92b0304 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -88,5 +88,4 @@ - \ No newline at end of file diff --git a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj index 71fb024d89..4fdd06c9ce 100644 --- a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj +++ b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj @@ -123,5 +123,4 @@ - \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index ab62f5ac75..bd2e77d022 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -115,5 +115,4 @@ - \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj index b134f4666e..41728ee486 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj @@ -102,5 +102,4 @@ - \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index d915b67cd0..fd150052da 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -105,5 +105,4 @@ - \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj index 050d61376a..92fcf226de 100644 --- a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj +++ b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj @@ -187,5 +187,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index 1f5ebac203..be6480618b 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -102,5 +102,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj index 2bf962bfa5..7945915e8c 100644 --- a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj +++ b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj @@ -147,5 +147,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj index efca582573..477d44b99d 100644 --- a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj +++ b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj @@ -58,5 +58,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj index 035d5b6c3e..4b33d14243 100644 --- a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj +++ b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj @@ -92,5 +92,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 83893b9bcd..46bd4ee324 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -122,5 +122,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj index b6c573c3c9..98256529bc 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj @@ -102,5 +102,4 @@ - \ 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 14fb35202e..370bc04395 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj @@ -101,5 +101,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj index 9b228a89ee..92111585a7 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj @@ -102,5 +102,4 @@ - \ No newline at end of file diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj index 628ccb2a1f..5b679fe360 100644 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj +++ b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj @@ -54,5 +54,4 @@ - \ No newline at end of file From 742d2f0a6d7ebb7905b441fb9b625592ba26645e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Wed, 17 May 2017 08:51:11 +0200 Subject: [PATCH 02/22] Remove Xamarin.Common.targets fix --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 4bf7f7f157..7f2b1bb395 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,8 +13,6 @@ environment: MYGET_API_KEY: secure: OtVfyN3ErqQrDTnWH2HDfJDlCiu/i4/X4wFmK3ZXXP7HmCiXYPSbTjMPwwdOxRaK MYGET_API_URL: https://www.myget.org/F/avalonia-ci/api/v2/package -init: -- ps: (New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/appveyor/ci/master/scripts/xamarin-vs2017-151-fixed.targets', "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Microsoft.Common.Targets\ImportAfter\Xamarin.Common.targets") install: - if not exist gtk-sharp-2.12.26.msi appveyor DownloadFile http://download.xamarin.com/GTKforWindows/Windows/gtk-sharp-2.12.26.msi - if not exist dotnet-1.0.1.exe appveyor DownloadFile https://go.microsoft.com/fwlink/?linkid=843448 -FileName "dotnet-1.0.1.exe" From 4d2d68057b5f8782aef7df33b690b0d8265cee8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Wed, 17 May 2017 19:49:21 +0200 Subject: [PATCH 03/22] Restore UseRoslynPathHack --- build.cake | 1 + src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj | 3 +++ src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj | 3 +++ src/iOS/Avalonia.iOS/Avalonia.iOS.csproj | 3 +++ 4 files changed, 10 insertions(+) diff --git a/build.cake b/build.cake index 2d62ae2d54..2bd88e3c50 100644 --- a/build.cake +++ b/build.cake @@ -143,6 +143,7 @@ Task("Build") MSBuild(parameters.MSBuildSolution, settings => { settings.SetConfiguration(parameters.Configuration); settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); + settings.WithProperty("UseRoslynPathHack", "true"); settings.SetVerbosity(Verbosity.Minimal); settings.WithProperty("Windows", "True"); settings.UseToolVersion(MSBuildToolVersion.VS2017); diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index 4cd1f21022..55cefda6e4 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -86,4 +86,7 @@ + + $(MSBuildToolsPath)\Roslyn + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index b2d92b0304..a3a08ec060 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -88,4 +88,7 @@ + + $(MSBuildToolsPath)\Roslyn + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index fd150052da..333be18735 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -105,4 +105,7 @@ + + $(MSBuildToolsPath)\Roslyn + \ No newline at end of file From 3b086f6055e32dc74295c872fcbfe48692e68b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 3 Jun 2017 22:06:50 +0200 Subject: [PATCH 04/22] Fix iOS projects build --- src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj | 4 ++-- src/iOS/Avalonia.iOS/Avalonia.iOS.csproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index a3a08ec060..9ea89704f7 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -88,7 +88,7 @@ - - $(MSBuildToolsPath)\Roslyn + + $(MSBuildToolsPath)\..\Roslyn \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index 333be18735..a959c0cf72 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -105,7 +105,7 @@ - - $(MSBuildToolsPath)\Roslyn + + $(MSBuildToolsPath)\..\Roslyn \ No newline at end of file From 0d4e5063000b611bb2d187ee869088e4c3d417d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 3 Jun 2017 22:07:32 +0200 Subject: [PATCH 05/22] Remove UseRoslynPathHack for Android projects --- src/Android/Avalonia.Android/Avalonia.Android.csproj | 3 --- src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 1ed416f385..091fdcc4b5 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -133,7 +133,4 @@ - - $(MSBuildToolsPath)\Roslyn - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index 55cefda6e4..4cd1f21022 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -86,7 +86,4 @@ - - $(MSBuildToolsPath)\Roslyn - \ No newline at end of file From eaab3d6465c3ee8a60024b0fdbb49690feccf239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 3 Jun 2017 22:11:08 +0200 Subject: [PATCH 06/22] Added missing tool --- build.cake | 1 + 1 file changed, 1 insertion(+) diff --git a/build.cake b/build.cake index 2bd88e3c50..5420d24755 100644 --- a/build.cake +++ b/build.cake @@ -5,6 +5,7 @@ #addin "nuget:?package=Polly&version=5.1.0" #addin "nuget:?package=NuGet.Core&version=2.14.0" #tool "nuget:?package=JetBrains.dotMemoryUnit&version=2.1.20150828.125449" +#tool "JetBrains.ReSharper.CommandLineTools" /////////////////////////////////////////////////////////////////////////////// // TOOLS From afff2d8ae56dbc2a311b4b75041ba21dcfcca285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 3 Jun 2017 22:12:24 +0200 Subject: [PATCH 07/22] Update tool JetBrains.dotMemoryUnit version --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 5420d24755..b86cb395b8 100644 --- a/build.cake +++ b/build.cake @@ -4,7 +4,7 @@ #addin "nuget:?package=Polly&version=5.1.0" #addin "nuget:?package=NuGet.Core&version=2.14.0" -#tool "nuget:?package=JetBrains.dotMemoryUnit&version=2.1.20150828.125449" +#tool "nuget:?package=JetBrains.dotMemoryUnit&version=2.3.20160517.113140" #tool "JetBrains.ReSharper.CommandLineTools" /////////////////////////////////////////////////////////////////////////////// From 50786609c6194a528316953d2152e5289b062c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 3 Jun 2017 22:13:49 +0200 Subject: [PATCH 08/22] Fix build.cake --- build.cake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cake b/build.cake index b86cb395b8..b091dba1a2 100644 --- a/build.cake +++ b/build.cake @@ -2,17 +2,17 @@ // ADDINS /////////////////////////////////////////////////////////////////////////////// -#addin "nuget:?package=Polly&version=5.1.0" -#addin "nuget:?package=NuGet.Core&version=2.14.0" +#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=JetBrains.dotMemoryUnit&version=2.3.20160517.113140" #tool "JetBrains.ReSharper.CommandLineTools" - /////////////////////////////////////////////////////////////////////////////// // TOOLS /////////////////////////////////////////////////////////////////////////////// -#tool "nuget:?package=xunit.runner.console&version=2.2.0" -#tool "nuget:?package=OpenCover&version=4.6.519" +#tool "nuget:?package=xunit.runner.console&version=2.1.0" +#tool "nuget:?package=OpenCover" /////////////////////////////////////////////////////////////////////////////// // USINGS From 6c96f690618cd9a25ac42c8b7f9d8015a784110e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 14 Jul 2017 10:02:26 +0200 Subject: [PATCH 09/22] Only show tooltip when pointer still over control. Make sure the pointer is still over the control when the timer fires to show a tooltip. --- src/Avalonia.Controls/ToolTip.cs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Avalonia.Controls/ToolTip.cs b/src/Avalonia.Controls/ToolTip.cs index 22bc589a36..e1b69637af 100644 --- a/src/Avalonia.Controls/ToolTip.cs +++ b/src/Avalonia.Controls/ToolTip.cs @@ -106,24 +106,28 @@ namespace Avalonia.Controls if (control != null && control.IsVisible && control.GetVisualRoot() != null) { var cp = (control.GetVisualRoot() as IInputRoot)?.MouseDevice?.GetPosition(control); - var position = control.PointToScreen(cp ?? new Point(0, 0)) + new Vector(0, 22); - if (s_popup == null) + if (cp.HasValue && control.IsVisible && new Rect(control.Bounds.Size).Contains(cp.Value)) { - s_popup = new PopupRoot(); - s_popup.Content = new ToolTip(); - } - else - { - ((ISetLogicalParent)s_popup).SetParent(null); - } + var position = control.PointToScreen(cp.Value) + new Vector(0, 22); + + if (s_popup == null) + { + s_popup = new PopupRoot(); + s_popup.Content = new ToolTip(); + } + else + { + ((ISetLogicalParent)s_popup).SetParent(null); + } ((ISetLogicalParent)s_popup).SetParent(control); - ((ToolTip)s_popup.Content).Content = GetTip(control); - s_popup.Position = position; - s_popup.Show(); + ((ToolTip)s_popup.Content).Content = GetTip(control); + s_popup.Position = position; + s_popup.Show(); - s_current = control; + s_current = control; + } } } From 76c90df2da048f46327d26ead6f5d0db1a76c53f Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 15 Jul 2017 04:12:40 +0300 Subject: [PATCH 10/22] Initial implementation for Direct2D rendering for WPF integration --- build/SharpDX.props | 1 + samples/interop/WindowsInteropTest/Program.cs | 2 +- .../ExternalRenderTarget.cs | 11 +- .../IExternalDirect2DRenderTargetSurface.cs | 3 +- .../Avalonia.Win32.Interop.csproj | 9 + .../Wpf/Direct2DImageSurface.cs | 206 ++++++++++++++++++ .../Wpf/WpfTopLevelImpl.cs | 11 +- .../Wpf/WritableBitmapSurface.cs | 10 +- 8 files changed, 233 insertions(+), 20 deletions(-) create mode 100644 src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs diff --git a/build/SharpDX.props b/build/SharpDX.props index e381bc03e6..0eb910e71e 100644 --- a/build/SharpDX.props +++ b/build/SharpDX.props @@ -3,6 +3,7 @@ + diff --git a/samples/interop/WindowsInteropTest/Program.cs b/samples/interop/WindowsInteropTest/Program.cs index 4770688ecf..fac06d74b0 100644 --- a/samples/interop/WindowsInteropTest/Program.cs +++ b/samples/interop/WindowsInteropTest/Program.cs @@ -15,7 +15,7 @@ namespace WindowsInteropTest { System.Windows.Forms.Application.EnableVisualStyles(); System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); - AppBuilder.Configure().UseWin32().UseSkia().SetupWithoutStarting(); + AppBuilder.Configure().UseWin32().UseDirect2D1().SetupWithoutStarting(); System.Windows.Forms.Application.Run(new SelectorForm()); } } diff --git a/src/Windows/Avalonia.Direct2D1/ExternalRenderTarget.cs b/src/Windows/Avalonia.Direct2D1/ExternalRenderTarget.cs index b1c0e7e30a..307048f7b4 100644 --- a/src/Windows/Avalonia.Direct2D1/ExternalRenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/ExternalRenderTarget.cs @@ -15,7 +15,6 @@ namespace Avalonia.Direct2D1 { private readonly IExternalDirect2DRenderTargetSurface _externalRenderTargetProvider; private readonly DirectWriteFactory _dwFactory; - private SharpDX.Direct2D1.RenderTarget _target; public ExternalRenderTarget(IExternalDirect2DRenderTargetSurface externalRenderTargetProvider, DirectWriteFactory dwFactory) { @@ -25,15 +24,14 @@ namespace Avalonia.Direct2D1 public void Dispose() { - _target?.Dispose(); - _target = null; + _externalRenderTargetProvider.DestroyRenderTarget(); } public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - _target = _target ?? _externalRenderTargetProvider.CreateRenderTarget(); + var target = _externalRenderTargetProvider.GetOrCreateRenderTarget(); _externalRenderTargetProvider.BeforeDrawing(); - return new DrawingContextImpl(visualBrushRenderer, _target, _dwFactory, null, () => + return new DrawingContextImpl(visualBrushRenderer, target, _dwFactory, null, () => { try { @@ -41,8 +39,7 @@ namespace Avalonia.Direct2D1 } catch (SharpDXException ex) when ((uint) ex.HResult == 0x8899000C) // D2DERR_RECREATE_TARGET { - _target?.Dispose(); - _target = null; + _externalRenderTargetProvider.DestroyRenderTarget(); } }); } diff --git a/src/Windows/Avalonia.Direct2D1/IExternalDirect2DRenderTargetSurface.cs b/src/Windows/Avalonia.Direct2D1/IExternalDirect2DRenderTargetSurface.cs index 0774c25937..aad51f46d5 100644 --- a/src/Windows/Avalonia.Direct2D1/IExternalDirect2DRenderTargetSurface.cs +++ b/src/Windows/Avalonia.Direct2D1/IExternalDirect2DRenderTargetSurface.cs @@ -8,7 +8,8 @@ namespace Avalonia.Direct2D1 { public interface IExternalDirect2DRenderTargetSurface { - SharpDX.Direct2D1.RenderTarget CreateRenderTarget(); + SharpDX.Direct2D1.RenderTarget GetOrCreateRenderTarget(); + void DestroyRenderTarget(); void BeforeDrawing(); void AfterDrawing(); } diff --git a/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj b/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj index c5cd2ab64d..099a7f4074 100644 --- a/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj +++ b/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj @@ -49,6 +49,7 @@ + @@ -104,10 +105,18 @@ {6417e941-21bc-467b-a771-0de389353ce6} Avalonia.Markup + + {3e908f67-5543-4879-a1dc-08eace79b3cd} + Avalonia.Direct2D1 + {811a76cf-1cf6-440f-963b-bbe31bd72a82} Avalonia.Win32 + + true + + \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs new file mode 100644 index 0000000000..303e0850aa --- /dev/null +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Interop; +using Avalonia.Direct2D1; +using SharpDX; +using SharpDX.Direct2D1; +using SharpDX.Direct3D11; +using SharpDX.Direct3D9; +using SharpDX.DXGI; +using AlphaMode = SharpDX.Direct2D1.AlphaMode; +using Device = SharpDX.Direct3D11.Device; +using Format = SharpDX.DXGI.Format; +using MapFlags = SharpDX.Direct3D11.MapFlags; +using PresentParameters = SharpDX.DXGI.PresentParameters; +using RenderTarget = SharpDX.Direct2D1.RenderTarget; +using Surface = SharpDX.DXGI.Surface; +using SwapEffect = SharpDX.DXGI.SwapEffect; +using Usage = SharpDX.Direct3D9.Usage; + +namespace Avalonia.Win32.Interop.Wpf +{ + class Direct2DImageSurface : IExternalDirect2DRenderTargetSurface + { + class Pair: IDisposable + { + public SharpDX.Direct3D9.Surface Texture { get; } + public SharpDX.Direct3D11.Resource D3D11Resource { get; } + public SharpDX.Direct3D11.Resource StagingResource { get; } + public RenderTarget Target { get;} + public Size Size { get; } + + public Pair(Size size, Vector dpi) + { + int width = (int) size.Width; + int height = (int) size.Height; + using (var texture = new Texture2D(s_dxDevice, new Texture2DDescription + { + Width = width, + Height = height, + ArraySize = 1, + MipLevels = 1, + Format = Format.B8G8R8A8_UNorm, + Usage = ResourceUsage.Default, + SampleDescription = new SampleDescription(1, 0), + BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, + OptionFlags = ResourceOptionFlags.Shared + })) + using (var surface = texture.QueryInterface()) + using (var resource = texture.QueryInterface()) + { + D3D11Resource = texture.QueryInterface(); + var handle = resource.SharedHandle; + using (var texture9 = new Texture(s_d3DDevice, texture.Description.Width, + texture.Description.Height, 1, + Usage.RenderTarget, SharpDX.Direct3D9.Format.A8R8G8B8, Pool.Default, ref handle)) + Texture = texture9.GetSurfaceLevel(0); + Target = new RenderTarget(AvaloniaLocator.Current.GetService(), surface, + new RenderTargetProperties + { + DpiX = (float) dpi.X, + DpiY = (float) dpi.Y, + MinLevel = FeatureLevel.Level_10, + PixelFormat = new PixelFormat(Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied), + + }); + } + using (var texture = new Texture2D(s_dxDevice, new Texture2DDescription + { + Width = Math.Min(width, 16), + Height = Math.Min(height, 16), + ArraySize = 1, + MipLevels = 1, + Format = Format.B8G8R8A8_UNorm, + Usage = ResourceUsage.Staging, + SampleDescription = new SampleDescription(1, 0), + CpuAccessFlags = CpuAccessFlags.Read + })) + StagingResource = texture.QueryInterface(); + Size = size; + } + + public void Dispose() + { + Texture?.Dispose(); + Target?.Dispose(); + D3D11Resource?.Dispose(); + StagingResource?.Dispose(); + } + + public void Flush() + { + + s_dxDevice.ImmediateContext.CopySubresourceRegion(D3D11Resource, 0, + new ResourceRegion(0, 0, 0, 1, 1, 1), StagingResource, 0, 0, 0, 0); + s_dxDevice.ImmediateContext.MapSubresource(StagingResource, 0, MapMode.Read, MapFlags.None); + s_dxDevice.ImmediateContext.UnmapSubresource(StagingResource, 0); + + } + } + + private D3DImage _image; + private Pair _backBuffer; + private Pair _frontBuffer; + private readonly WpfTopLevelImpl _impl; + private static Device s_dxDevice; + private static Direct3DEx s_d3DContext; + private static DeviceEx s_d3DDevice; + + + [DllImport("user32.dll", SetLastError = false)] + private static extern IntPtr GetDesktopWindow(); + void EnsureDirectX() + { + if(s_d3DDevice != null) + return; + s_d3DContext = new Direct3DEx(); + + SharpDX.Direct3D9.PresentParameters presentparams = new SharpDX.Direct3D9.PresentParameters + { + Windowed = true, + SwapEffect = SharpDX.Direct3D9.SwapEffect.Discard, + DeviceWindowHandle = GetDesktopWindow(), + PresentationInterval = PresentInterval.Default + }; + s_dxDevice = s_dxDevice ?? AvaloniaLocator.Current.GetService() + .QueryInterface(); + s_d3DDevice = new DeviceEx(s_d3DContext, 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing | CreateFlags.Multithreaded | CreateFlags.FpuPreserve, presentparams); + + } + + public Direct2DImageSurface(WpfTopLevelImpl impl) + { + _impl = impl; + } + + public RenderTarget GetOrCreateRenderTarget() + { + EnsureDirectX(); + var scale = _impl.GetScaling(); + var size = new Size(_impl.ActualWidth * scale.X, _impl.ActualHeight * scale.Y); + var dpi = scale * 96; + + if (_backBuffer!=null && _backBuffer.Size == size) + return _backBuffer.Target; + + if (_image == null) + _image = new DX11Image(); + _impl.ImageSource = _image; + + + + RemoveAndDispose(ref _backBuffer); + if (size == default(Size)) + { + RemoveAndDispose(ref _frontBuffer); + _image.Lock(); + _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero); + _image.Unlock(); + return null; + } + _backBuffer = new Pair(size, dpi); + + return _backBuffer.Target; + } + + void RemoveAndDispose(ref T d) where T : IDisposable + { + d?.Dispose(); + d = default(T); + } + + void DoSwap() + { + + } + + void Swap() + { + var oldFront = _frontBuffer; + _frontBuffer = _backBuffer; + _backBuffer = oldFront; + _frontBuffer.Flush(); + _image.Lock(); + _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, _frontBuffer?.Texture?.NativePointer ?? IntPtr.Zero, true); + _image.AddDirtyRect(new Int32Rect(0, 0, _image.PixelWidth, _image.PixelHeight)); + _image.Unlock(); + } + + public void DestroyRenderTarget() + { + //? + } + + public void BeforeDrawing() + { + + } + + public void AfterDrawing() => Swap(); + } +} diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs index 0620c6cc57..b5715d43d5 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs @@ -60,7 +60,7 @@ namespace Avalonia.Win32.Interop.Wpf PresentationSource.AddSourceChangedHandler(this, OnSourceChanged); _hook = WndProc; _ttl = this; - _surfaces = new object[] {new WritableBitmapSurface(this)}; + _surfaces = new object[] {new WritableBitmapSurface(this), new Direct2DImageSurface(this)}; _mouse = new WpfMouseDevice(this); _keyboard = AvaloniaLocator.Current.GetService(); @@ -224,6 +224,13 @@ namespace Avalonia.Win32.Interop.Wpf Action ITopLevelImpl.ScalingChanged { get; set; } Action ITopLevelImpl.Closed { get; set; } public new event Action LostFocus; - + + internal Vector GetScaling() + { + var src = PresentationSource.FromVisual(this)?.CompositionTarget; + if (src == null) + return new Vector(1, 1); + return new Vector(src.TransformToDevice.M11, src.TransformToDevice.M22); + } } } diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WritableBitmapSurface.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WritableBitmapSurface.cs index 1dd1cb983a..0f8752fb8d 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WritableBitmapSurface.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WritableBitmapSurface.cs @@ -24,7 +24,7 @@ namespace Avalonia.Win32.Interop.Wpf public ILockedFramebuffer Lock() { - var scale = GetScaling(); + var scale = _impl.GetScaling(); var size = new Size(_impl.ActualWidth * scale.X, _impl.ActualHeight * scale.Y); var dpi = scale * 96; if (_bitmap == null || _bitmap.PixelWidth != (int) size.Width || _bitmap.PixelHeight != (int) size.Height) @@ -69,13 +69,5 @@ namespace Avalonia.Win32.Interop.Wpf public Vector Dpi { get; } public PixelFormat Format => PixelFormat.Bgra8888; } - - Vector GetScaling() - { - var src = PresentationSource.FromVisual(_impl)?.CompositionTarget; - if (src == null) - return new Vector(1, 1); - return new Vector(src.TransformToDevice.M11, src.TransformToDevice.M22); - } } } From 1cc13484c020190c5c03ede643b1c8defc6dade6 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 15 Jul 2017 04:32:01 +0300 Subject: [PATCH 11/22] Cleanup --- .../Wpf/Direct2DImageSurface.cs | 51 +++++++++---------- .../Wpf/WpfAvaloniaHost.cs | 20 +++++++- .../Wpf/WpfTopLevelImpl.cs | 7 ++- 3 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs index 303e0850aa..57efe700dd 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs @@ -24,17 +24,18 @@ using Usage = SharpDX.Direct3D9.Usage; namespace Avalonia.Win32.Interop.Wpf { - class Direct2DImageSurface : IExternalDirect2DRenderTargetSurface + class Direct2DImageSurface : IExternalDirect2DRenderTargetSurface, IDisposable { - class Pair: IDisposable + class SwapBuffer: IDisposable { + + private readonly SharpDX.Direct3D11.Resource _resource; + private readonly SharpDX.Direct3D11.Resource _stagingResource; public SharpDX.Direct3D9.Surface Texture { get; } - public SharpDX.Direct3D11.Resource D3D11Resource { get; } - public SharpDX.Direct3D11.Resource StagingResource { get; } public RenderTarget Target { get;} public Size Size { get; } - public Pair(Size size, Vector dpi) + public SwapBuffer(Size size, Vector dpi) { int width = (int) size.Width; int height = (int) size.Height; @@ -53,7 +54,7 @@ namespace Avalonia.Win32.Interop.Wpf using (var surface = texture.QueryInterface()) using (var resource = texture.QueryInterface()) { - D3D11Resource = texture.QueryInterface(); + _resource = texture.QueryInterface(); var handle = resource.SharedHandle; using (var texture9 = new Texture(s_d3DDevice, texture.Description.Width, texture.Description.Height, 1, @@ -80,7 +81,7 @@ namespace Avalonia.Win32.Interop.Wpf SampleDescription = new SampleDescription(1, 0), CpuAccessFlags = CpuAccessFlags.Read })) - StagingResource = texture.QueryInterface(); + _stagingResource = texture.QueryInterface(); Size = size; } @@ -88,24 +89,22 @@ namespace Avalonia.Win32.Interop.Wpf { Texture?.Dispose(); Target?.Dispose(); - D3D11Resource?.Dispose(); - StagingResource?.Dispose(); + _resource?.Dispose(); + _stagingResource?.Dispose(); } public void Flush() { - - s_dxDevice.ImmediateContext.CopySubresourceRegion(D3D11Resource, 0, - new ResourceRegion(0, 0, 0, 1, 1, 1), StagingResource, 0, 0, 0, 0); - s_dxDevice.ImmediateContext.MapSubresource(StagingResource, 0, MapMode.Read, MapFlags.None); - s_dxDevice.ImmediateContext.UnmapSubresource(StagingResource, 0); - + s_dxDevice.ImmediateContext.CopySubresourceRegion(_resource, 0, + new ResourceRegion(0, 0, 0, 1, 1, 1), _stagingResource, 0, 0, 0, 0); + s_dxDevice.ImmediateContext.MapSubresource(_stagingResource, 0, MapMode.Read, MapFlags.None); + s_dxDevice.ImmediateContext.UnmapSubresource(_stagingResource, 0); } } private D3DImage _image; - private Pair _backBuffer; - private Pair _frontBuffer; + private SwapBuffer _backBuffer; + private SwapBuffer _frontBuffer; private readonly WpfTopLevelImpl _impl; private static Device s_dxDevice; private static Direct3DEx s_d3DContext; @@ -149,11 +148,9 @@ namespace Avalonia.Win32.Interop.Wpf return _backBuffer.Target; if (_image == null) - _image = new DX11Image(); + _image = new D3DImage(); _impl.ImageSource = _image; - - RemoveAndDispose(ref _backBuffer); if (size == default(Size)) { @@ -163,7 +160,7 @@ namespace Avalonia.Win32.Interop.Wpf _image.Unlock(); return null; } - _backBuffer = new Pair(size, dpi); + _backBuffer = new SwapBuffer(size, dpi); return _backBuffer.Target; } @@ -174,11 +171,6 @@ namespace Avalonia.Win32.Interop.Wpf d = default(T); } - void DoSwap() - { - - } - void Swap() { var oldFront = _frontBuffer; @@ -193,6 +185,8 @@ namespace Avalonia.Win32.Interop.Wpf public void DestroyRenderTarget() { + RemoveAndDispose(ref _backBuffer); + RemoveAndDispose(ref _frontBuffer); //? } @@ -202,5 +196,10 @@ namespace Avalonia.Win32.Interop.Wpf } public void AfterDrawing() => Swap(); + public void Dispose() + { + RemoveAndDispose(ref _frontBuffer); + RemoveAndDispose(ref _backBuffer); + } } } diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs index e36b53199a..0a15bc26d2 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs @@ -21,15 +21,31 @@ namespace Avalonia.Win32.Interop.Wpf { private WpfTopLevelImpl _impl; private readonly SynchronizationContext _sync; + private bool _hasChildren; public WpfAvaloniaHost() { _sync = SynchronizationContext.Current; _impl = new WpfTopLevelImpl(); _impl.ControlRoot.Prepare(); _impl.Visibility = Visibility.Visible; - AddLogicalChild(_impl); - AddVisualChild(_impl); SnapsToDevicePixels = true; + PresentationSource.AddSourceChangedHandler(this, OnSourceChanged); + } + + private void OnSourceChanged(object sender, SourceChangedEventArgs e) + { + if (e.NewSource != null && !_hasChildren) + { + AddLogicalChild(_impl); + AddVisualChild(_impl); + _hasChildren = true; + } + else + { + RemoveVisualChild(_impl); + RemoveLogicalChild(_impl); + _hasChildren = false; + } } public object Content diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs index b5715d43d5..fbed2f621c 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs @@ -88,7 +88,12 @@ namespace Avalonia.Win32.Interop.Wpf _ttl.ScalingChanged?.Invoke(_ttl.Scaling); } - public void Dispose() => _ttl.Closed?.Invoke(); + public void Dispose() + { + _ttl.Closed?.Invoke(); + foreach(var d in _surfaces.OfType()) + d.Dispose(); + } Size ITopLevelImpl.ClientSize => _finalSize; IMouseDevice ITopLevelImpl.MouseDevice => _mouse; From e0f481ae9fcb91aa3d03ef796a87bac4c73e905b Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 15 Jul 2017 06:02:23 +0300 Subject: [PATCH 12/22] Move data between two Texture2D instances manually --- .../Wpf/Direct2DImageSurface.cs | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs index 57efe700dd..9bb9c014b7 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs @@ -17,6 +17,8 @@ using Device = SharpDX.Direct3D11.Device; using Format = SharpDX.DXGI.Format; using MapFlags = SharpDX.Direct3D11.MapFlags; using PresentParameters = SharpDX.DXGI.PresentParameters; +using Query = SharpDX.Direct3D11.Query; +using QueryType = SharpDX.Direct3D11.QueryType; using RenderTarget = SharpDX.Direct2D1.RenderTarget; using Surface = SharpDX.DXGI.Surface; using SwapEffect = SharpDX.DXGI.SwapEffect; @@ -28,9 +30,9 @@ namespace Avalonia.Win32.Interop.Wpf { class SwapBuffer: IDisposable { - + private Query _event; private readonly SharpDX.Direct3D11.Resource _resource; - private readonly SharpDX.Direct3D11.Resource _stagingResource; + private readonly SharpDX.Direct3D11.Resource _sharedResource; public SharpDX.Direct3D9.Surface Texture { get; } public RenderTarget Target { get;} public Size Size { get; } @@ -39,6 +41,7 @@ namespace Avalonia.Win32.Interop.Wpf { int width = (int) size.Width; int height = (int) size.Height; + _event = new Query(s_dxDevice, new QueryDescription {Type = QueryType.Event}); using (var texture = new Texture2D(s_dxDevice, new Texture2DDescription { Width = width, @@ -47,19 +50,14 @@ namespace Avalonia.Win32.Interop.Wpf MipLevels = 1, Format = Format.B8G8R8A8_UNorm, Usage = ResourceUsage.Default, - SampleDescription = new SampleDescription(1, 0), - BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, - OptionFlags = ResourceOptionFlags.Shared + SampleDescription = new SampleDescription(2, 0), + BindFlags = BindFlags.RenderTarget, })) using (var surface = texture.QueryInterface()) - using (var resource = texture.QueryInterface()) + { _resource = texture.QueryInterface(); - var handle = resource.SharedHandle; - using (var texture9 = new Texture(s_d3DDevice, texture.Description.Width, - texture.Description.Height, 1, - Usage.RenderTarget, SharpDX.Direct3D9.Format.A8R8G8B8, Pool.Default, ref handle)) - Texture = texture9.GetSurfaceLevel(0); + Target = new RenderTarget(AvaloniaLocator.Current.GetService(), surface, new RenderTargetProperties { @@ -72,16 +70,25 @@ namespace Avalonia.Win32.Interop.Wpf } using (var texture = new Texture2D(s_dxDevice, new Texture2DDescription { - Width = Math.Min(width, 16), - Height = Math.Min(height, 16), + Width = width, + Height = height, ArraySize = 1, MipLevels = 1, Format = Format.B8G8R8A8_UNorm, - Usage = ResourceUsage.Staging, + Usage = ResourceUsage.Default, SampleDescription = new SampleDescription(1, 0), - CpuAccessFlags = CpuAccessFlags.Read + BindFlags = BindFlags.RenderTarget|BindFlags.ShaderResource, + OptionFlags = ResourceOptionFlags.Shared, })) - _stagingResource = texture.QueryInterface(); + using (var resource = texture.QueryInterface()) + { + _sharedResource = texture.QueryInterface(); + var handle = resource.SharedHandle; + using (var texture9 = new Texture(s_d3DDevice, texture.Description.Width, + texture.Description.Height, 1, + Usage.RenderTarget, SharpDX.Direct3D9.Format.A8R8G8B8, Pool.Default, ref handle)) + Texture = texture9.GetSurfaceLevel(0); + } Size = size; } @@ -90,21 +97,20 @@ namespace Avalonia.Win32.Interop.Wpf Texture?.Dispose(); Target?.Dispose(); _resource?.Dispose(); - _stagingResource?.Dispose(); + _sharedResource?.Dispose(); } public void Flush() { - s_dxDevice.ImmediateContext.CopySubresourceRegion(_resource, 0, - new ResourceRegion(0, 0, 0, 1, 1, 1), _stagingResource, 0, 0, 0, 0); - s_dxDevice.ImmediateContext.MapSubresource(_stagingResource, 0, MapMode.Read, MapFlags.None); - s_dxDevice.ImmediateContext.UnmapSubresource(_stagingResource, 0); + s_dxDevice.ImmediateContext.ResolveSubresource(_resource, 0, _sharedResource, 0, Format.B8G8R8A8_UNorm); + s_dxDevice.ImmediateContext.Flush(); + s_dxDevice.ImmediateContext.End(_event); + s_dxDevice.ImmediateContext.GetData(_event).Dispose(); } } private D3DImage _image; private SwapBuffer _backBuffer; - private SwapBuffer _frontBuffer; private readonly WpfTopLevelImpl _impl; private static Device s_dxDevice; private static Direct3DEx s_d3DContext; @@ -154,7 +160,6 @@ namespace Avalonia.Win32.Interop.Wpf RemoveAndDispose(ref _backBuffer); if (size == default(Size)) { - RemoveAndDispose(ref _frontBuffer); _image.Lock(); _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero); _image.Unlock(); @@ -173,12 +178,9 @@ namespace Avalonia.Win32.Interop.Wpf void Swap() { - var oldFront = _frontBuffer; - _frontBuffer = _backBuffer; - _backBuffer = oldFront; - _frontBuffer.Flush(); + _backBuffer.Flush(); _image.Lock(); - _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, _frontBuffer?.Texture?.NativePointer ?? IntPtr.Zero, true); + _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, _backBuffer?.Texture?.NativePointer ?? IntPtr.Zero, true); _image.AddDirtyRect(new Int32Rect(0, 0, _image.PixelWidth, _image.PixelHeight)); _image.Unlock(); } @@ -186,8 +188,6 @@ namespace Avalonia.Win32.Interop.Wpf public void DestroyRenderTarget() { RemoveAndDispose(ref _backBuffer); - RemoveAndDispose(ref _frontBuffer); - //? } public void BeforeDrawing() @@ -198,7 +198,6 @@ namespace Avalonia.Win32.Interop.Wpf public void AfterDrawing() => Swap(); public void Dispose() { - RemoveAndDispose(ref _frontBuffer); RemoveAndDispose(ref _backBuffer); } } From 714869033c8bcd96932ea32308894a33901a0ec4 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 15 Jul 2017 12:06:04 +0300 Subject: [PATCH 13/22] Reference SharpDX.Direct3D9 package --- packages.cake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages.cake b/packages.cake index bc1aeef416..46fa26ee4b 100644 --- a/packages.cake +++ b/packages.cake @@ -80,6 +80,7 @@ public class Packages var SharpDXVersion = packageVersions["SharpDX"].FirstOrDefault().Item1; var SharpDXDirect2D1Version = packageVersions["SharpDX.Direct2D1"].FirstOrDefault().Item1; var SharpDXDirect3D11Version = packageVersions["SharpDX.Direct3D11"].FirstOrDefault().Item1; + var SharpDXDirect3D9Version = packageVersions["SharpDX.Direct3D9"].FirstOrDefault().Item1; var SharpDXDXGIVersion = packageVersions["SharpDX.DXGI"].FirstOrDefault().Item1; context.Information("Package: Serilog, version: {0}", SerilogVersion); @@ -91,6 +92,7 @@ public class Packages context.Information("Package: SharpDX, version: {0}", SharpDXVersion); context.Information("Package: SharpDX.Direct2D1, version: {0}", SharpDXDirect2D1Version); context.Information("Package: SharpDX.Direct3D11, version: {0}", SharpDXDirect3D11Version); + context.Information("Package: SharpDX.Direct3D9, version: {0}", SharpDXDirect3D9Version); context.Information("Package: SharpDX.DXGI, version: {0}", SharpDXDXGIVersion); var nugetPackagesDir = System.Environment.GetEnvironmentVariable("NUGET_HOME") @@ -472,6 +474,7 @@ public class Packages { new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version }, new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version }, + new NuSpecDependency() { Id = "SharpDX.Direct3D9", Version = SharpDXDirect3D9Version }, }, Files = new [] { From 099a7ae752a1f48e292785a0af4459103e67c735 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 15 Jul 2017 12:23:00 +0300 Subject: [PATCH 14/22] Dispose event --- src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs index 9bb9c014b7..8891a76676 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs @@ -30,7 +30,7 @@ namespace Avalonia.Win32.Interop.Wpf { class SwapBuffer: IDisposable { - private Query _event; + private readonly Query _event; private readonly SharpDX.Direct3D11.Resource _resource; private readonly SharpDX.Direct3D11.Resource _sharedResource; public SharpDX.Direct3D9.Surface Texture { get; } @@ -98,6 +98,7 @@ namespace Avalonia.Win32.Interop.Wpf Target?.Dispose(); _resource?.Dispose(); _sharedResource?.Dispose(); + _event?.Dispose(); } public void Flush() From d5806d1af2bd05130691b4705a38235955e7b09d Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 15 Jul 2017 14:18:31 +0300 Subject: [PATCH 15/22] Fixed DPI support --- .../Avalonia.Win32.Interop.csproj | 1 + .../Wpf/Direct2DImageSurface.cs | 17 +++--- .../Avalonia.Win32.Interop/Wpf/IntSize.cs | 59 +++++++++++++++++++ .../Wpf/WpfAvaloniaHost.cs | 1 + 4 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 src/Windows/Avalonia.Win32.Interop/Wpf/IntSize.cs diff --git a/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj b/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj index 099a7f4074..5f1a065028 100644 --- a/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj +++ b/src/Windows/Avalonia.Win32.Interop/Avalonia.Win32.Interop.csproj @@ -50,6 +50,7 @@ + diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs index 8891a76676..8fe7275a0f 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/Direct2DImageSurface.cs @@ -35,9 +35,9 @@ namespace Avalonia.Win32.Interop.Wpf private readonly SharpDX.Direct3D11.Resource _sharedResource; public SharpDX.Direct3D9.Surface Texture { get; } public RenderTarget Target { get;} - public Size Size { get; } + public IntSize Size { get; } - public SwapBuffer(Size size, Vector dpi) + public SwapBuffer(IntSize size, Vector dpi) { int width = (int) size.Width; int height = (int) size.Height; @@ -116,6 +116,7 @@ namespace Avalonia.Win32.Interop.Wpf private static Device s_dxDevice; private static Direct3DEx s_d3DContext; private static DeviceEx s_d3DDevice; + private Vector _oldDpi; [DllImport("user32.dll", SetLastError = false)] @@ -148,18 +149,20 @@ namespace Avalonia.Win32.Interop.Wpf { EnsureDirectX(); var scale = _impl.GetScaling(); - var size = new Size(_impl.ActualWidth * scale.X, _impl.ActualHeight * scale.Y); + var size = new IntSize(_impl.ActualWidth * scale.X, _impl.ActualHeight * scale.Y); var dpi = scale * 96; if (_backBuffer!=null && _backBuffer.Size == size) return _backBuffer.Target; - - if (_image == null) - _image = new D3DImage(); + + if (_image == null || _oldDpi.X != dpi.X || _oldDpi.Y != dpi.Y) + { + _image = new D3DImage(dpi.X, dpi.Y); + } _impl.ImageSource = _image; RemoveAndDispose(ref _backBuffer); - if (size == default(Size)) + if (size == default(IntSize)) { _image.Lock(); _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero); diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/IntSize.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/IntSize.cs new file mode 100644 index 0000000000..3fdbdedfd9 --- /dev/null +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/IntSize.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Win32.Interop.Wpf +{ + struct IntSize : IEquatable + { + public bool Equals(IntSize other) + { + return Width == other.Width && Height == other.Height; + } + + public IntSize(int width, int height) + { + Width = width; + Height = height; + } + + public IntSize(double width, double height) : this((int) width, (int) height) + { + + } + + public static implicit operator IntSize(System.Windows.Size size) + { + return new IntSize {Width = (int) size.Width, Height = (int) size.Height}; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + return obj is IntSize && Equals((IntSize) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (Width * 397) ^ Height; + } + } + + public static bool operator ==(IntSize left, IntSize right) + { + return left.Equals(right); + } + + public static bool operator !=(IntSize left, IntSize right) + { + return !left.Equals(right); + } + + public int Width { get; set; } + public int Height { get; set; } + } +} diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs index 0a15bc26d2..6dc9ba9e09 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfAvaloniaHost.cs @@ -29,6 +29,7 @@ namespace Avalonia.Win32.Interop.Wpf _impl.ControlRoot.Prepare(); _impl.Visibility = Visibility.Visible; SnapsToDevicePixels = true; + UseLayoutRounding = true; PresentationSource.AddSourceChangedHandler(this, OnSourceChanged); } From 2638f02cd6d7d73cf067fa3c3b6ed8bdf5e23aea Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 18 Jul 2017 09:55:10 +0100 Subject: [PATCH 16/22] fix null reference when focusing textbox in attached to visual tree, but before ontemplate applied. --- src/Avalonia.Controls/TextBox.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index d2e8085d8c..6fc79e5d2c 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -236,6 +236,11 @@ namespace Avalonia.Controls { _presenter = e.NameScope.Get("PART_TextPresenter"); _presenter.Cursor = new Cursor(StandardCursorType.Ibeam); + + if(IsFocused) + { + _presenter.ShowCaret(); + } } protected override void OnGotFocus(GotFocusEventArgs e) @@ -254,7 +259,7 @@ namespace Avalonia.Controls } else { - _presenter.ShowCaret(); + _presenter?.ShowCaret(); } } From c37dd6cda923f65da21aa4a9b6a0a35c30bd431a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 18 Jul 2017 10:02:15 +0100 Subject: [PATCH 17/22] null check on hide caret. --- src/Avalonia.Controls/TextBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 6fc79e5d2c..92ab12f82e 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -268,7 +268,7 @@ namespace Avalonia.Controls base.OnLostFocus(e); SelectionStart = 0; SelectionEnd = 0; - _presenter.HideCaret(); + _presenter?.HideCaret(); } protected override void OnTextInput(TextInputEventArgs e) From df61044d50beeabe836d063ee2fae22978bf6f06 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 18 Jul 2017 21:20:14 +0300 Subject: [PATCH 18/22] Fixed text opacity for Skia backend --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 12 +-- src/Skia/Avalonia.Skia/FormattedTextImpl.cs | 101 +++++++++---------- 2 files changed, 53 insertions(+), 60 deletions(-) diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 4a9f2c6572..3ed0509c0a 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -141,23 +141,17 @@ namespace Avalonia.Skia var rv = new PaintWrapper(paint); paint.IsStroke = false; - // TODO: SkiaSharp does not contain alpha yet! + double opacity = brush.Opacity * _currentOpacity; - //paint.SetAlpha(paint.GetAlpha() * opacity); paint.IsAntialias = true; - SKColor color = new SKColor(255, 255, 255, 255); - var solid = brush as ISolidColorBrush; - if (solid != null) - color = solid.Color.ToSKColor(); - - paint.Color = (new SKColor(color.Red, color.Green, color.Blue, (byte)(color.Alpha * opacity))); - if (solid != null) { + paint.Color = new SKColor(solid.Color.R, solid.Color.G, solid.Color.B, (byte) (solid.Color.A * opacity)); return rv; } + paint.Color = (new SKColor(255, 255, 255, (byte)(255 * opacity))); var gradient = brush as IGradientBrush; if (gradient != null) diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs index 8568c80c04..1d224f97d7 100644 --- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs +++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs @@ -42,7 +42,6 @@ namespace Avalonia.Skia _paint.Typeface = skiaTypeface; _paint.TextSize = (float)(typeface?.FontSize ?? 12); _paint.TextAlign = textAlignment.ToSKTextAlign(); - _paint.BlendMode = SKBlendMode.Src; _wrapping = wrapping; _constraint = constraint; @@ -200,66 +199,65 @@ namespace Avalonia.Skia } ctx->Canvas->restore(); */ - SKPaint paint = _paint; - IDisposable currd = null; - var currentWrapper = foreground; - - try + using (var paint = _paint.Clone()) { - SKPaint currFGPaint = ApplyWrapperTo(ref foreground, ref currd, paint); - bool hasCusomFGBrushes = _foregroundBrushes.Any(); - - for (int c = 0; c < _skiaLines.Count; c++) + IDisposable currd = null; + var currentWrapper = foreground; + SKPaint currentPaint = null; + try { - AvaloniaFormattedTextLine line = _skiaLines[c]; - - float x = TransformX(origin.X, 0, paint.TextAlign); + ApplyWrapperTo(ref currentPaint, foreground, ref currd, paint); + bool hasCusomFGBrushes = _foregroundBrushes.Any(); - if (!hasCusomFGBrushes) - { - var subString = Text.Substring(line.Start, line.Length); - canvas.DrawText(subString, x, origin.Y + line.Top + _lineOffset, paint); - } - else + for (int c = 0; c < _skiaLines.Count; c++) { - float currX = x; - string subStr; - int len; + AvaloniaFormattedTextLine line = _skiaLines[c]; - for (int i = line.Start; i < line.Start + line.Length;) - { - var fb = GetNextForegroundBrush(ref line, i, out len); - - if (fb != null) - { - //TODO: figure out how to get the brush size - currentWrapper = context.CreatePaint(fb, new Size()); - } - else - { - if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose(); - currentWrapper = foreground; - } + float x = TransformX(origin.X, 0, paint.TextAlign); - subStr = Text.Substring(i, len); + if (!hasCusomFGBrushes) + { + var subString = Text.Substring(line.Start, line.Length); + canvas.DrawText(subString, x, origin.Y + line.Top + _lineOffset, paint); + } + else + { + float currX = x; + string subStr; + int len; - if (currFGPaint != currentWrapper.Paint) + for (int i = line.Start; i < line.Start + line.Length;) { - currFGPaint = ApplyWrapperTo(ref currentWrapper, ref currd, paint); + var fb = GetNextForegroundBrush(ref line, i, out len); + + if (fb != null) + { + //TODO: figure out how to get the brush size + currentWrapper = context.CreatePaint(fb, new Size()); + } + else + { + if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose(); + currentWrapper = foreground; + } + + subStr = Text.Substring(i, len); + + ApplyWrapperTo(ref currentPaint, currentWrapper, ref currd, paint); + + canvas.DrawText(subStr, currX, origin.Y + line.Top + _lineOffset, paint); + + i += len; + currX += paint.MeasureText(subStr); } - - canvas.DrawText(subStr, currX, origin.Y + line.Top + _lineOffset, paint); - - i += len; - currX += paint.MeasureText(subStr); } } } - } - finally - { - if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose(); - currd?.Dispose(); + finally + { + if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose(); + currd?.Dispose(); + } } } @@ -278,12 +276,13 @@ namespace Avalonia.Skia private Size _size; private List _skiaLines; - private static SKPaint ApplyWrapperTo(ref DrawingContextImpl.PaintWrapper wrapper, + private static void ApplyWrapperTo(ref SKPaint current, DrawingContextImpl.PaintWrapper wrapper, ref IDisposable curr, SKPaint paint) { + if (current == wrapper.Paint) + return; curr?.Dispose(); curr = wrapper.ApplyTo(paint); - return wrapper.Paint; } private static bool IsBreakChar(char c) From 9e35232242f815a68e64d807d92d68d9a3cc2aa8 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 19 Jul 2017 12:23:05 +0300 Subject: [PATCH 19/22] Pick nuget api address from environment --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 6b63176a89..529cbbb65f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,6 +15,7 @@ environment: MYGET_API_URL: https://www.myget.org/F/avalonia-ci/api/v2/package init: - ps: (New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/appveyor/ci/master/scripts/xamarin-vs2017-151-fixed.targets', "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Microsoft.Common.Targets\ImportAfter\Xamarin.Common.targets") +- ps: if (Test-Path env:nuget_address) {[System.IO.File]::AppendAllText("C:\Windows\System32\drivers\etc\hosts", "`n$($env:nuget_address)`tapi.nuget.org")} install: - if not exist gtk-sharp-2.12.26.msi appveyor DownloadFile http://download.xamarin.com/GTKforWindows/Windows/gtk-sharp-2.12.26.msi - if not exist dotnet-1.0.1.exe appveyor DownloadFile https://go.microsoft.com/fwlink/?linkid=843448 -FileName "dotnet-1.0.1.exe" From c4aae602e83947f50a6b692033aadf33b2c018b6 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 21 Jul 2017 18:07:12 +0300 Subject: [PATCH 20/22] Updated dotmemory --- appveyor.yml | 2 +- build.cake | 48 +++++++++++++++---- .../toolproject/tool.csproj | 9 ++++ 3 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 tests/Avalonia.LeakTests/toolproject/tool.csproj diff --git a/appveyor.yml b/appveyor.yml index 529cbbb65f..038028f839 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,7 +27,7 @@ before_build: build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: -- tools\JetBrains.dotMemoryUnit\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" +- tests\Avalonia.LeakTests\bin\Release\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - pip install codecov - codecov -f "./artifacts/coverage.xml" diff --git a/build.cake b/build.cake index b3822271d4..81390436fd 100644 --- a/build.cake +++ b/build.cake @@ -4,8 +4,8 @@ #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.dotMemoryUnit&version=2.3.20160517.113140" #tool "JetBrains.ReSharper.CommandLineTools" /////////////////////////////////////////////////////////////////////////////// // TOOLS @@ -194,6 +194,7 @@ Task("Run-Net-Core-Unit-Tests") Task("Run-Unit-Tests") .IsDependentOn("Run-Net-Core-Unit-Tests") .IsDependentOn("Build") + .IsDependentOn("Run-Leak-Tests") .WithCriteria(() => !parameters.SkipTests) .Does(() => { @@ -206,13 +207,6 @@ Task("Run-Unit-Tests") .Select(name => MakeAbsolute(File("./tests/" + name + "/bin/" + parameters.DirSuffix + "/" + name + ".dll"))) .ToList(); - if (parameters.IsRunningOnWindows) - { - var leakTests = GetFiles("./tests/Avalonia.LeakTests/bin/" + parameters.DirSuffix + "/*.LeakTests.dll"); - - unitTests.AddRange(leakTests); - } - var toolPath = (parameters.IsPlatformAnyCPU || parameters.IsPlatformX86) ? "./tools/xunit.runner.console/tools/xunit.console.x86.exe" : "./tools/xunit.runner.console/tools/xunit.console.exe"; @@ -365,6 +359,44 @@ Task("Publish-NuGet") Information("Publish-NuGet Task failed, but continuing with next Task..."); }); +Task("Run-Leak-Tests") + .WithCriteria(parameters.IsRunningOnWindows) + .IsDependentOn("Build") + .Does(() => + { + DotNetCoreRestore("tests\\Avalonia.LeakTests\\toolproject\\tool.csproj"); + DotNetBuild("tests\\Avalonia.LeakTests\\toolproject\\tool.csproj", settings => settings.SetConfiguration("Release")); + var report = "tests\\Avalonia.LeakTests\\bin\\Release\\report.xml"; + if(System.IO.File.Exists(report)) + System.IO.File.Delete(report); + var proc = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + FileName="tests\\Avalonia.LeakTests\\toolproject\\bin\\Release\\net461\\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 ", + UseShellExecute = false, + }); + var st = System.Diagnostics.Stopwatch.StartNew(); + while(!proc.HasExited && !System.IO.File.Exists(report)) + { + if(st.Elapsed.TotalSeconds>60) + { + Error("Timed out, probably a bug in dotMemoryUnit"); + proc.Kill(); + throw new Exception("dotMemory issue"); + } + proc.WaitForExit(100); + } + try{ + proc.Kill(); + }catch{} + var doc = System.Xml.Linq.XDocument.Load(report); + if(doc.Root.Descendants("assembly").Any(x=>x.Attribute("failed").Value.ToString() != "0")) + { + throw new Exception("Tests failed"); + } + + }); + Task("Inspect") .WithCriteria(parameters.IsRunningOnWindows) .IsDependentOn("Restore-NuGet-Packages") diff --git a/tests/Avalonia.LeakTests/toolproject/tool.csproj b/tests/Avalonia.LeakTests/toolproject/tool.csproj new file mode 100644 index 0000000000..c9f584be72 --- /dev/null +++ b/tests/Avalonia.LeakTests/toolproject/tool.csproj @@ -0,0 +1,9 @@ + + + net461 + Library + + + + + \ No newline at end of file From 1da031881c1cd6eb65e0e6d7590fe15de60f643c Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 21 Jul 2017 18:39:04 +0300 Subject: [PATCH 21/22] I'm starting to *really* hate the new SDK --- build.cake | 2 +- tests/Avalonia.LeakTests/toolproject/tool.csproj | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 81390436fd..12a9d85d05 100644 --- a/build.cake +++ b/build.cake @@ -371,7 +371,7 @@ Task("Run-Leak-Tests") System.IO.File.Delete(report); var proc = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { - FileName="tests\\Avalonia.LeakTests\\toolproject\\bin\\Release\\net461\\dotMemoryUnit.exe", + 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 ", UseShellExecute = false, }); diff --git a/tests/Avalonia.LeakTests/toolproject/tool.csproj b/tests/Avalonia.LeakTests/toolproject/tool.csproj index c9f584be72..54dbe6f17e 100644 --- a/tests/Avalonia.LeakTests/toolproject/tool.csproj +++ b/tests/Avalonia.LeakTests/toolproject/tool.csproj @@ -1,5 +1,7 @@  + $(MSBuildThisFileDirectory)\bin + $(OutputPath) net461 Library From 36310f1b6a0a777fa97521386799c5929d0cd6c4 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 21 Jul 2017 19:04:12 +0300 Subject: [PATCH 22/22] dotMemory tests are now run with cake --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 038028f839..cc0063dac5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,7 +27,6 @@ before_build: build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: -- tests\Avalonia.LeakTests\bin\Release\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - pip install codecov - codecov -f "./artifacts/coverage.xml"