Browse Source

Merge branch 'master' into feature/SkiaTypefaceFallback

danwalmsley 6 years ago
parent
commit
cd91d22b11
42 changed files with 128 additions and 68 deletions
  1. 1 0
      .gitignore
  2. 3 0
      .gitmodules
  3. 1 1
      Directory.Build.props
  4. 1 1
      build/Magick.NET-Q16-AnyCPU.props
  5. 0 1
      build/ReferenceCoreLibraries.props
  6. 2 2
      build/SkiaSharp.props
  7. 2 4
      native/Avalonia.Native/src/OSX/gl.mm
  8. 8 0
      nukebuild/.editorconfig
  9. 16 3
      nukebuild/Build.cs
  10. 4 2
      nukebuild/BuildParameters.cs
  11. 1 0
      nukebuild/Numerge
  12. 14 0
      nukebuild/Shims.cs
  13. 2 0
      nukebuild/_build.csproj
  14. 23 0
      nukebuild/numerge.config
  15. 2 6
      packages/Avalonia/Avalonia.csproj
  16. 1 1
      packages/Avalonia/Avalonia.props
  17. 0 1
      src/Avalonia.Animation/Avalonia.Animation.csproj
  18. 0 1
      src/Avalonia.Base/Avalonia.Base.csproj
  19. 0 1
      src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
  20. 0 1
      src/Avalonia.Controls/Avalonia.Controls.csproj
  21. 1 3
      src/Avalonia.Controls/Button.cs
  22. 0 1
      src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj
  23. 0 1
      src/Avalonia.DesktopRuntime/Avalonia.DesktopRuntime.csproj
  24. 0 1
      src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj
  25. 0 1
      src/Avalonia.Input/Avalonia.Input.csproj
  26. 0 1
      src/Avalonia.Interactivity/Avalonia.Interactivity.csproj
  27. 0 1
      src/Avalonia.Layout/Avalonia.Layout.csproj
  28. 0 1
      src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj
  29. 0 1
      src/Avalonia.Styling/Avalonia.Styling.csproj
  30. 0 1
      src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
  31. 0 1
      src/Avalonia.Visuals/Avalonia.Visuals.csproj
  32. 1 1
      src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs
  33. 0 1
      src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
  34. 0 1
      src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
  35. 2 1
      src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs
  36. 9 14
      src/Skia/Avalonia.Skia/GlRenderTarget.cs
  37. 1 1
      src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs
  38. 4 4
      src/Windows/Avalonia.Win32/WindowImpl.cs
  39. 6 6
      tests/Avalonia.RenderTests/Controls/BorderTests.cs
  40. 1 1
      tests/Avalonia.RenderTests/Controls/TextBlockTests.cs
  41. 1 0
      tests/Avalonia.RenderTests/TestBase.cs
  42. 21 0
      tests/Avalonia.RenderTests/TestSkip.cs

+ 1 - 0
.gitignore

@@ -195,3 +195,4 @@ Logs/
 ModuleCache.noindex/
 ModuleCache.noindex/
 Build/Intermediates.noindex/
 Build/Intermediates.noindex/
 info.plist
 info.plist
+build-intermediate

+ 3 - 0
.gitmodules

@@ -1,3 +1,6 @@
 [submodule "src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github"]
 [submodule "src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github"]
 	path = src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github
 	path = src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github
 	url = https://github.com/AvaloniaUI/Portable.Xaml.git
 	url = https://github.com/AvaloniaUI/Portable.Xaml.git
+[submodule "nukebuild/Numerge"]
+	path = nukebuild/Numerge
+	url = https://github.com/kekekeks/Numerge.git

+ 1 - 1
Directory.Build.props

@@ -1,5 +1,5 @@
 <Project>
 <Project>
   <PropertyGroup>
   <PropertyGroup>
-      <PackageOutputPath Condition="'$(PackageOutputPath)' == ''">$(MSBuildThisFileDirectory)artifacts/nuget</PackageOutputPath>
+      <PackageOutputPath Condition="'$(PackageOutputPath)' == ''">$(MSBuildThisFileDirectory)build-intermediate/nuget</PackageOutputPath>
   </PropertyGroup>
   </PropertyGroup>
 </Project>
 </Project>

+ 1 - 1
build/Magick.NET-Q16-AnyCPU.props

@@ -1,5 +1,5 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="7.0.6.102" />
+    <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="7.9.0.2" />
   </ItemGroup>
   </ItemGroup>
 </Project>
 </Project>

+ 0 - 1
build/ReferenceCoreLibraries.props

@@ -1,5 +1,4 @@
 <Project>
 <Project>
-  <Import Condition="'$(TargetFramework)' == 'netcoreapp2.0'" Project="CoreLibraries.props" />
   <ItemGroup>
   <ItemGroup>
       <ProjectReference Include="$(MSBuildThisFileDirectory)../packages/Avalonia/Avalonia.csproj" />
       <ProjectReference Include="$(MSBuildThisFileDirectory)../packages/Avalonia/Avalonia.csproj" />
   </ItemGroup>
   </ItemGroup>

+ 2 - 2
build/SkiaSharp.props

@@ -1,6 +1,6 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="SkiaSharp" Version="1.60.0" />
-    <PackageReference Condition="'$(IncludeLinuxSkia)' == 'true'" Include="Avalonia.Skia.Linux.Natives" Version="1.60.0.1" />
+    <PackageReference Include="SkiaSharp" Version="1.68.0" />
+    <PackageReference Condition="'$(IncludeLinuxSkia)' == 'true'" Include="SkiaSharp.NativeAssets.Linux" Version="1.68.0" />
   </ItemGroup>
   </ItemGroup>
 </Project>
 </Project>

+ 2 - 4
native/Avalonia.Native/src/OSX/gl.mm

@@ -208,9 +208,8 @@ public:
     
     
     virtual ~AvnGlRenderingSession()
     virtual ~AvnGlRenderingSession()
     {
     {
-        glFlush();
         [_context flushBuffer];
         [_context flushBuffer];
-        [_context setView:nil];
+        [NSOpenGLContext clearCurrentContext];
         CGLUnlockContext([_context CGLContextObj]);
         CGLUnlockContext([_context CGLContextObj]);
         [_view unlockFocus];
         [_view unlockFocus];
     }
     }
@@ -241,9 +240,8 @@ public:
         auto gl = _context;
         auto gl = _context;
         CGLLockContext([_context CGLContextObj]);
         CGLLockContext([_context CGLContextObj]);
         [gl setView: _view];
         [gl setView: _view];
+        [gl update];
         [gl makeCurrentContext];
         [gl makeCurrentContext];
-        auto frame = [_view frame];
-        
         *ret = new AvnGlRenderingSession(_window, _view, gl);
         *ret = new AvnGlRenderingSession(_window, _view, gl);
         return S_OK;
         return S_OK;
     }
     }

+ 8 - 0
nukebuild/.editorconfig

@@ -0,0 +1,8 @@
+# editorconfig.org
+
+# top-most EditorConfig file
+root = false
+
+# C# files
+[*.cs]
+dotnet_style_require_accessibility_modifiers = never

+ 16 - 3
nukebuild/Build.cs

@@ -63,6 +63,7 @@ partial class Build : NukeBuild
         DeleteDirectories(Parameters.BuildDirs);
         DeleteDirectories(Parameters.BuildDirs);
         EnsureCleanDirectories(Parameters.BuildDirs);
         EnsureCleanDirectories(Parameters.BuildDirs);
         EnsureCleanDirectory(Parameters.ArtifactsDir);
         EnsureCleanDirectory(Parameters.ArtifactsDir);
+        EnsureCleanDirectory(Parameters.NugetIntermediateRoot);
         EnsureCleanDirectory(Parameters.NugetRoot);
         EnsureCleanDirectory(Parameters.NugetRoot);
         EnsureCleanDirectory(Parameters.ZipRoot);
         EnsureCleanDirectory(Parameters.ZipRoot);
         EnsureCleanDirectory(Parameters.TestResultsRoot);
         EnsureCleanDirectory(Parameters.TestResultsRoot);
@@ -137,12 +138,13 @@ partial class Build : NukeBuild
         });
         });
 
 
     Target RunRenderTests => _ => _
     Target RunRenderTests => _ => _
-        .OnlyWhen(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows)
+        .OnlyWhen(() => !Parameters.SkipTests)
         .DependsOn(Compile)
         .DependsOn(Compile)
         .Executes(() =>
         .Executes(() =>
         {
         {
             RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", true);
             RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", true);
-            RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", true);
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", true);
         });
         });
     
     
     Target RunDesignerTests => _ => _
     Target RunDesignerTests => _ => _
@@ -181,7 +183,7 @@ partial class Build : NukeBuild
                     GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.exe")));
                     GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.exe")));
         });
         });
 
 
-    Target CreateNugetPackages => _ => _
+    Target CreateIntermediateNugetPackages => _ => _
         .DependsOn(Compile)
         .DependsOn(Compile)
         .After(RunTests)
         .After(RunTests)
         .Executes(() =>
         .Executes(() =>
@@ -200,6 +202,17 @@ partial class Build : NukeBuild
                     c.SetConfiguration(Parameters.Configuration)
                     c.SetConfiguration(Parameters.Configuration)
                         .AddProperty("PackageVersion", Parameters.Version));
                         .AddProperty("PackageVersion", Parameters.Version));
         });
         });
+
+    Target CreateNugetPackages => _ => _
+        .DependsOn(CreateIntermediateNugetPackages)
+        .Executes(() =>
+        {
+            var config = Numerge.MergeConfiguration.LoadFile(RootDirectory / "nukebuild" / "numerge.config");
+            EnsureCleanDirectory(Parameters.NugetRoot);
+            if(!Numerge.NugetPackageMerger.Merge(Parameters.NugetIntermediateRoot, Parameters.NugetRoot, config,
+                new NumergeNukeLogger()))
+                throw new Exception("Package merge failed");
+        });
     
     
     Target RunTests => _ => _
     Target RunTests => _ => _
         .DependsOn(RunCoreLibsTests)
         .DependsOn(RunCoreLibsTests)

+ 4 - 2
nukebuild/BuildParameters.cs

@@ -47,6 +47,7 @@ public partial class Build
         public bool PublishTestResults { get; }
         public bool PublishTestResults { get; }
         public string Version { get; }
         public string Version { get; }
         public AbsolutePath ArtifactsDir { get; }
         public AbsolutePath ArtifactsDir { get; }
+        public AbsolutePath NugetIntermediateRoot { get; }
         public AbsolutePath NugetRoot { get; }
         public AbsolutePath NugetRoot { get; }
         public AbsolutePath ZipRoot { get; }
         public AbsolutePath ZipRoot { get; }
         public AbsolutePath BinRoot { get; }
         public AbsolutePath BinRoot { get; }
@@ -117,6 +118,7 @@ public partial class Build
             // DIRECTORIES
             // DIRECTORIES
             ArtifactsDir = RootDirectory / "artifacts";
             ArtifactsDir = RootDirectory / "artifacts";
             NugetRoot = ArtifactsDir / "nuget";
             NugetRoot = ArtifactsDir / "nuget";
+            NugetIntermediateRoot = RootDirectory / "build-intermediate" / "nuget";
             ZipRoot = ArtifactsDir / "zip";
             ZipRoot = ArtifactsDir / "zip";
             BinRoot = ArtifactsDir / "bin";
             BinRoot = ArtifactsDir / "bin";
             TestResultsRoot = ArtifactsDir / "test-results";
             TestResultsRoot = ArtifactsDir / "test-results";
@@ -130,9 +132,9 @@ public partial class Build
             ZipTargetControlCatalogDesktopDir = ZipRoot / ("ControlCatalog.Desktop-" + FileZipSuffix);
             ZipTargetControlCatalogDesktopDir = ZipRoot / ("ControlCatalog.Desktop-" + FileZipSuffix);
         }
         }
 
 
-        private static string GetVersion()
+        string GetVersion()
         {
         {
-            var xdoc = XDocument.Load("./build/SharedVersion.props");
+            var xdoc = XDocument.Load(RootDirectory / "build/SharedVersion.props");
             return xdoc.Descendants().First(x => x.Name.LocalName == "Version").Value;
             return xdoc.Descendants().First(x => x.Name.LocalName == "Version").Value;
         }
         }
     }
     }

+ 1 - 0
nukebuild/Numerge

@@ -0,0 +1 @@
+Subproject commit 4464343aef5c8ab7a42fcb20a483a6058199f8b8

+ 14 - 0
nukebuild/Shims.cs

@@ -5,6 +5,7 @@ using System.IO.Compression;
 using System.Linq;
 using System.Linq;
 using Nuke.Common;
 using Nuke.Common;
 using Nuke.Common.IO;
 using Nuke.Common.IO;
+using Numerge;
 
 
 public partial class Build
 public partial class Build
 {
 {
@@ -76,4 +77,17 @@ public partial class Build
             }
             }
         }
         }
     }
     }
+
+    class NumergeNukeLogger : INumergeLogger
+    {
+        public void Log(NumergeLogLevel level, string message)
+        {
+            if(level == NumergeLogLevel.Error)
+                Logger.Error(message);
+            else if (level == NumergeLogLevel.Warning)
+                Logger.Warn(message);
+            else
+                Logger.Info(message);
+        }
+    }
 }
 }

+ 2 - 0
nukebuild/_build.csproj

@@ -30,6 +30,8 @@
     <None Include="..\appveyor.yml" Condition="Exists('..\appveyor.yml')" />
     <None Include="..\appveyor.yml" Condition="Exists('..\appveyor.yml')" />
     <None Include="..\.travis.yml" Condition="Exists('..\.travis.yml')" />
     <None Include="..\.travis.yml" Condition="Exists('..\.travis.yml')" />
     <None Include="..\GitVersion.yml" Condition="Exists('..\GitVersion.yml')" />
     <None Include="..\GitVersion.yml" Condition="Exists('..\GitVersion.yml')" />
+    <Compile Remove="Numerge/**/*.*" />
+    <Compile Include="Numerge/Numerge/**/*.cs" />
   </ItemGroup>
   </ItemGroup>
 
 
 </Project>
 </Project>

+ 23 - 0
nukebuild/numerge.config

@@ -0,0 +1,23 @@
+{
+  "Packages":
+  [
+    {
+      "Id": "Avalonia",
+      "MergeAll": true,
+      "Exclude": ["Avalonia.Remote.Protocol"],
+      "IncomingIncludeAssetsOverride": "",
+      "Merge": [
+        {
+          "Id": "Avalonia.Build.Tasks",
+          "IgnoreMissingFrameworkBinaries": true,
+          "DoNotMergeDependencies": true
+        },
+        {
+          "Id": "Avalonia.DesktopRuntime",
+          "IgnoreMissingFrameworkBinaries": true,
+          "IgnoreMissingFrameworkDependencies": true
+        }
+      ]
+    }
+  ]
+}

+ 2 - 6
packages/Avalonia/Avalonia.csproj

@@ -1,10 +1,10 @@
-<Project Sdk="AggregatePackage.NuGet.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
       <TargetFrameworks>netstandard2.0;net461;netcoreapp2.0</TargetFrameworks>
       <TargetFrameworks>netstandard2.0;net461;netcoreapp2.0</TargetFrameworks>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-      <ProjectReference Include="../../src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj" EmbedReference="false" />
+      <ProjectReference Include="../../src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj"/>
       <ProjectReference Include="../../src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj" />
       <ProjectReference Include="../../src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj" />
 
 
   </ItemGroup>
   </ItemGroup>
@@ -40,10 +40,6 @@
       <Pack>true</Pack>
       <Pack>true</Pack>
       <PackagePath>build\</PackagePath>
       <PackagePath>build\</PackagePath>
     </Content>
     </Content>
-    <Content Include="../../src/Avalonia.Build.Tasks/bin/$(Configuration)/netstandard2.0/Avalonia.Build.Tasks.dll">
-      <Pack>true</Pack>
-      <PackagePath>tools\</PackagePath>
-    </Content>
   </ItemGroup>
   </ItemGroup>
   <Import Project="..\..\build\SharedVersion.props" />
   <Import Project="..\..\build\SharedVersion.props" />
   <Import Project="..\..\build\NetFX.props" />
   <Import Project="..\..\build\NetFX.props" />

+ 1 - 1
packages/Avalonia/Avalonia.props

@@ -2,7 +2,7 @@
   <PropertyGroup>
   <PropertyGroup>
     <AvaloniaPreviewerNetCoreToolPath>$(MSBuildThisFileDirectory)\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll</AvaloniaPreviewerNetCoreToolPath>
     <AvaloniaPreviewerNetCoreToolPath>$(MSBuildThisFileDirectory)\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll</AvaloniaPreviewerNetCoreToolPath>
     <AvaloniaPreviewerNetFullToolPath>$(MSBuildThisFileDirectory)\..\tools\net461\designer\Avalonia.Designer.HostApp.exe</AvaloniaPreviewerNetFullToolPath>
     <AvaloniaPreviewerNetFullToolPath>$(MSBuildThisFileDirectory)\..\tools\net461\designer\Avalonia.Designer.HostApp.exe</AvaloniaPreviewerNetFullToolPath>
-    <AvaloniaBuildTasksLocation>$(MSBuildThisFileDirectory)\..\tools\Avalonia.Build.Tasks.dll</AvaloniaBuildTasksLocation>
+    <AvaloniaBuildTasksLocation>$(MSBuildThisFileDirectory)\..\tools\netstandard2.0\Avalonia.Build.Tasks.dll</AvaloniaBuildTasksLocation>
     <AvaloniaUseExternalMSBuild>false</AvaloniaUseExternalMSBuild>
     <AvaloniaUseExternalMSBuild>false</AvaloniaUseExternalMSBuild>
   </PropertyGroup>
   </PropertyGroup>
   <Import Project="$(MSBuildThisFileDirectory)\AvaloniaBuildTasks.props"/>
   <Import Project="$(MSBuildThisFileDirectory)\AvaloniaBuildTasks.props"/>

+ 0 - 1
src/Avalonia.Animation/Avalonia.Animation.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Base\Avalonia.Base.csproj" />
     <ProjectReference Include="..\Avalonia.Base\Avalonia.Base.csproj" />

+ 0 - 1
src/Avalonia.Base/Avalonia.Base.csproj

@@ -4,7 +4,6 @@
     <AssemblyName>Avalonia.Base</AssemblyName>
     <AssemblyName>Avalonia.Base</AssemblyName>
     <RootNamespace>Avalonia</RootNamespace>
     <RootNamespace>Avalonia</RootNamespace>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Build.Tasks\Avalonia.Build.Tasks.csproj"/>
     <ProjectReference Include="..\Avalonia.Build.Tasks\Avalonia.Build.Tasks.csproj"/>

+ 0 - 1
src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj

@@ -4,7 +4,6 @@
         <TargetFramework>netstandard2.0</TargetFramework>
         <TargetFramework>netstandard2.0</TargetFramework>
         <BuildOutputTargetFolder>tools</BuildOutputTargetFolder>
         <BuildOutputTargetFolder>tools</BuildOutputTargetFolder>
         <DefineConstants>$(DefineConstants);BUILDTASK</DefineConstants>
         <DefineConstants>$(DefineConstants);BUILDTASK</DefineConstants>
-        <Packable>false</Packable>
     </PropertyGroup>
     </PropertyGroup>
 
 
     <ItemGroup>
     <ItemGroup>

+ 0 - 1
src/Avalonia.Controls/Avalonia.Controls.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />

+ 1 - 3
src/Avalonia.Controls/Button.cs

@@ -253,10 +253,8 @@ namespace Avalonia.Controls
                 IsPressed = false;
                 IsPressed = false;
                 e.Handled = true;
                 e.Handled = true;
 
 
-                var hittest = this.GetVisualsAt(e.GetPosition(this));
-
                 if (ClickMode == ClickMode.Release &&
                 if (ClickMode == ClickMode.Release &&
-                    hittest.Any(c => c == this || (c as IStyledElement)?.TemplatedParent == this))
+                    this.GetVisualsAt(e.GetPosition(this)).Any(c => this == c || this.IsVisualAncestorOf(c)))
                 {
                 {
                     OnClick();
                     OnClick();
                 }
                 }

+ 0 - 1
src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
     <!-- WARNING! The designer support version number needs to be frozen 
     <!-- WARNING! The designer support version number needs to be frozen 
          To allow projects that implement designer functionality to still
          To allow projects that implement designer functionality to still
          work with newer versions of Avalonia. This version number only
          work with newer versions of Avalonia. This version number only

+ 0 - 1
src/Avalonia.DesktopRuntime/Avalonia.DesktopRuntime.csproj

@@ -2,7 +2,6 @@
 
 
   <PropertyGroup>
   <PropertyGroup>
     <TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
     <TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>

+ 0 - 1
src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
     <ProjectReference Include="..\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />

+ 0 - 1
src/Avalonia.Input/Avalonia.Input.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />

+ 0 - 1
src/Avalonia.Interactivity/Avalonia.Interactivity.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />

+ 0 - 1
src/Avalonia.Layout/Avalonia.Layout.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />

+ 0 - 1
src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Base\Avalonia.Base.csproj" />
     <ProjectReference Include="..\Avalonia.Base\Avalonia.Base.csproj" />

+ 0 - 1
src/Avalonia.Styling/Avalonia.Styling.csproj

@@ -3,7 +3,6 @@
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
     <AssemblyName>Avalonia.Styling</AssemblyName>
     <AssemblyName>Avalonia.Styling</AssemblyName>
     <RootNamespace>Avalonia</RootNamespace>
     <RootNamespace>Avalonia</RootNamespace>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />

+ 0 - 1
src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj

@@ -1,7 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
     <ProjectReference Include="..\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />

+ 0 - 1
src/Avalonia.Visuals/Avalonia.Visuals.csproj

@@ -2,7 +2,6 @@
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
     <RootNamespace>Avalonia</RootNamespace>
     <RootNamespace>Avalonia</RootNamespace>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup> 
   <ItemGroup> 
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />

+ 1 - 1
src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs

@@ -50,7 +50,7 @@ namespace Avalonia.Gtk3
         {
         {
             Resolver.Custom = options.CustomResolver;
             Resolver.Custom = options.CustomResolver;
             UseDeferredRendering = EnvOption("USE_DEFERRED_RENDERING", true, options.UseDeferredRendering);
             UseDeferredRendering = EnvOption("USE_DEFERRED_RENDERING", true, options.UseDeferredRendering);
-            var useGpu = EnvOption("USE_GPU", false, options.UseGpuAcceleration);
+            var useGpu = EnvOption("USE_GPU", true, options.UseGpuAcceleration);
             if (!s_gtkInitialized)
             if (!s_gtkInitialized)
             {
             {
                 try
                 try

+ 0 - 1
src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj

@@ -4,7 +4,6 @@
     <DefineConstants>PCL;NETSTANDARD;NETSTANDARD2_0;HAS_TYPE_CONVERTER;HAS_CUSTOM_ATTRIBUTE_PROVIDER</DefineConstants>
     <DefineConstants>PCL;NETSTANDARD;NETSTANDARD2_0;HAS_TYPE_CONVERTER;HAS_CUSTOM_ATTRIBUTE_PROVIDER</DefineConstants>
     <EnableDefaultCompileItems>False</EnableDefaultCompileItems>
     <EnableDefaultCompileItems>False</EnableDefaultCompileItems>
     <EnableDefaultItems>false</EnableDefaultItems>
     <EnableDefaultItems>false</EnableDefaultItems>
-    <IsPackable>false</IsPackable>
     <NoWarn>CS1591</NoWarn>
     <NoWarn>CS1591</NoWarn>
   </PropertyGroup>
   </PropertyGroup>
     <ItemGroup>
     <ItemGroup>

+ 0 - 1
src/Markup/Avalonia.Markup/Avalonia.Markup.csproj

@@ -2,7 +2,6 @@
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
     <RootNamespace>Avalonia</RootNamespace>
     <RootNamespace>Avalonia</RootNamespace>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\Avalonia.Base\Avalonia.Base.csproj" />
     <ProjectReference Include="..\..\Avalonia.Base\Avalonia.Base.csproj" />

+ 2 - 1
src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs

@@ -42,7 +42,8 @@ namespace Avalonia.Skia
         {
         {
             var framebuffer = _platformSurface.Lock();
             var framebuffer = _platformSurface.Lock();
             var framebufferImageInfo = new SKImageInfo(framebuffer.Size.Width, framebuffer.Size.Height,
             var framebufferImageInfo = new SKImageInfo(framebuffer.Size.Width, framebuffer.Size.Height,
-                framebuffer.Format.ToSkColorType(), SKAlphaType.Premul);
+                framebuffer.Format.ToSkColorType(),
+                framebuffer.Format == PixelFormat.Rgb565 ? SKAlphaType.Opaque : SKAlphaType.Premul);
 
 
             CreateSurface(framebufferImageInfo, framebuffer);
             CreateSurface(framebufferImageInfo, framebuffer);
 
 

+ 9 - 14
src/Skia/Avalonia.Skia/GlRenderTarget.cs

@@ -31,24 +31,18 @@ namespace Avalonia.Skia
             var size = session.Size;
             var size = session.Size;
             var scaling = session.Scaling;
             var scaling = session.Scaling;
 
 
-            GRBackendRenderTargetDesc desc = new GRBackendRenderTargetDesc
-            {
-                Width = size.Width,
-                Height = size.Height,
-                SampleCount = disp.SampleCount,
-                StencilBits = disp.StencilSize,
-                Config = GRPixelConfig.Rgba8888,
-                Origin=GRSurfaceOrigin.BottomLeft,
-                RenderTargetHandle = new IntPtr(fb)
-            };
-
-            gl.Viewport(0, 0, desc.Width, desc.Height);
+            gl.Viewport(0, 0, size.Width, size.Height);
             gl.ClearStencil(0);
             gl.ClearStencil(0);
             gl.ClearColor(0, 0, 0, 0);
             gl.ClearColor(0, 0, 0, 0);
             gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
             gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 
-            var surface = SKSurface.Create(_grContext, desc);
-
+            GRBackendRenderTarget renderTarget =
+                new GRBackendRenderTarget(size.Width, size.Height, disp.SampleCount, disp.StencilSize,
+                    new GRGlFramebufferInfo((uint)fb, GRPixelConfig.Rgba8888.ToGlSizedFormat()));
+            var surface = SKSurface.Create(_grContext, renderTarget,
+                GRSurfaceOrigin.BottomLeft,
+                GRPixelConfig.Rgba8888.ToColorType());
+            
             var nfo = new DrawingContextImpl.CreateInfo
             var nfo = new DrawingContextImpl.CreateInfo
             {
             {
                 GrContext = _grContext,
                 GrContext = _grContext,
@@ -62,6 +56,7 @@ namespace Avalonia.Skia
             {
             {
                 surface.Canvas.Flush();
                 surface.Canvas.Flush();
                 surface.Dispose();
                 surface.Dispose();
+                renderTarget.Dispose();
                 session.Dispose();
                 session.Dispose();
             }));
             }));
         }
         }

+ 1 - 1
src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs

@@ -41,7 +41,7 @@ namespace Avalonia.Skia
                 var nfo = new SKImageInfo(size.Width, size.Height, colorType, SKAlphaType.Premul);
                 var nfo = new SKImageInfo(size.Width, size.Height, colorType, SKAlphaType.Premul);
                 var blob = runtimePlatform.AllocBlob(nfo.BytesSize);
                 var blob = runtimePlatform.AllocBlob(nfo.BytesSize);
 
 
-                _bitmap.InstallPixels(nfo, blob.Address, nfo.RowBytes, null, s_releaseDelegate, blob);
+                _bitmap.InstallPixels(nfo, blob.Address, nfo.RowBytes, s_releaseDelegate, blob);
             }
             }
             else
             else
             {
             {

+ 4 - 4
src/Windows/Avalonia.Win32/WindowImpl.cs

@@ -281,10 +281,10 @@ namespace Avalonia.Win32
             var f = Scaling;
             var f = Scaling;
             var r = new UnmanagedMethods.RECT
             var r = new UnmanagedMethods.RECT
             {
             {
-                left = (int)(rect.X * f),
-                top = (int)(rect.Y * f),
-                right = (int)(rect.Right * f),
-                bottom = (int)(rect.Bottom * f),
+                left = (int)Math.Floor(rect.X * f),
+                top = (int)Math.Floor(rect.Y * f),
+                right = (int)Math.Ceiling(rect.Right * f),
+                bottom = (int)Math.Ceiling(rect.Bottom * f),
             };
             };
 
 
             UnmanagedMethods.InvalidateRect(_hwnd, ref r, false);
             UnmanagedMethods.InvalidateRect(_hwnd, ref r, false);

+ 6 - 6
tests/Avalonia.RenderTests/Controls/BorderTests.cs

@@ -188,7 +188,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
         }
         }
 
 
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Border_Centers_Content_Horizontally()
         public async Task Border_Centers_Content_Horizontally()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator
@@ -215,7 +215,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
             CompareImages();
             CompareImages();
         }
         }
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Border_Centers_Content_Vertically()
         public async Task Border_Centers_Content_Vertically()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator
@@ -296,7 +296,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
             CompareImages();
             CompareImages();
         }
         }
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Border_Left_Aligns_Content()
         public async Task Border_Left_Aligns_Content()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator
@@ -323,7 +323,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
             CompareImages();
             CompareImages();
         }
         }
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Border_Right_Aligns_Content()
         public async Task Border_Right_Aligns_Content()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator
@@ -350,7 +350,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
             CompareImages();
             CompareImages();
         }
         }
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Border_Top_Aligns_Content()
         public async Task Border_Top_Aligns_Content()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator
@@ -377,7 +377,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
             CompareImages();
             CompareImages();
         }
         }
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Border_Bottom_Aligns_Content()
         public async Task Border_Bottom_Aligns_Content()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator

+ 1 - 1
tests/Avalonia.RenderTests/Controls/TextBlockTests.cs

@@ -20,7 +20,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls
         {
         {
         }
         }
 
 
-        [Fact]
+        [Win32Fact("Has text")]
         public async Task Wrapping_NoWrap()
         public async Task Wrapping_NoWrap()
         {
         {
             Decorator target = new Decorator
             Decorator target = new Decorator

+ 1 - 0
tests/Avalonia.RenderTests/TestBase.cs

@@ -46,6 +46,7 @@ namespace Avalonia.Direct2D1.RenderTests
 
 
         public TestBase(string outputPath)
         public TestBase(string outputPath)
         {
         {
+            outputPath = outputPath.Replace('\\', Path.DirectorySeparatorChar);
             var testPath = GetTestsDirectory();
             var testPath = GetTestsDirectory();
             var testFiles = Path.Combine(testPath, "TestFiles");
             var testFiles = Path.Combine(testPath, "TestFiles");
 #if AVALONIA_SKIA
 #if AVALONIA_SKIA

+ 21 - 0
tests/Avalonia.RenderTests/TestSkip.cs

@@ -0,0 +1,21 @@
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using Xunit;
+
+#if AVALONIA_SKIA
+namespace Avalonia.Skia.RenderTests
+#else
+namespace Avalonia.Direct2D1.RenderTests
+#endif
+{   
+    public class Win32Fact : FactAttribute
+    {
+        public Win32Fact(string message)
+        {
+            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                Skip = message;
+        }
+    }
+}
+