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/
 Build/Intermediates.noindex/
 info.plist
+build-intermediate

+ 3 - 0
.gitmodules

@@ -1,3 +1,6 @@
 [submodule "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
+[submodule "nukebuild/Numerge"]
+	path = nukebuild/Numerge
+	url = https://github.com/kekekeks/Numerge.git

+ 1 - 1
Directory.Build.props

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

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

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

+ 0 - 1
build/ReferenceCoreLibraries.props

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

+ 2 - 2
build/SkiaSharp.props

@@ -1,6 +1,6 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <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>
 </Project>

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

@@ -208,9 +208,8 @@ public:
     
     virtual ~AvnGlRenderingSession()
     {
-        glFlush();
         [_context flushBuffer];
-        [_context setView:nil];
+        [NSOpenGLContext clearCurrentContext];
         CGLUnlockContext([_context CGLContextObj]);
         [_view unlockFocus];
     }
@@ -241,9 +240,8 @@ public:
         auto gl = _context;
         CGLLockContext([_context CGLContextObj]);
         [gl setView: _view];
+        [gl update];
         [gl makeCurrentContext];
-        auto frame = [_view frame];
-        
         *ret = new AvnGlRenderingSession(_window, _view, gl);
         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);
         EnsureCleanDirectories(Parameters.BuildDirs);
         EnsureCleanDirectory(Parameters.ArtifactsDir);
+        EnsureCleanDirectory(Parameters.NugetIntermediateRoot);
         EnsureCleanDirectory(Parameters.NugetRoot);
         EnsureCleanDirectory(Parameters.ZipRoot);
         EnsureCleanDirectory(Parameters.TestResultsRoot);
@@ -137,12 +138,13 @@ partial class Build : NukeBuild
         });
 
     Target RunRenderTests => _ => _
-        .OnlyWhen(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows)
+        .OnlyWhen(() => !Parameters.SkipTests)
         .DependsOn(Compile)
         .Executes(() =>
         {
             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 => _ => _
@@ -181,7 +183,7 @@ partial class Build : NukeBuild
                     GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.exe")));
         });
 
-    Target CreateNugetPackages => _ => _
+    Target CreateIntermediateNugetPackages => _ => _
         .DependsOn(Compile)
         .After(RunTests)
         .Executes(() =>
@@ -200,6 +202,17 @@ partial class Build : NukeBuild
                     c.SetConfiguration(Parameters.Configuration)
                         .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 => _ => _
         .DependsOn(RunCoreLibsTests)

+ 4 - 2
nukebuild/BuildParameters.cs

@@ -47,6 +47,7 @@ public partial class Build
         public bool PublishTestResults { get; }
         public string Version { get; }
         public AbsolutePath ArtifactsDir { get; }
+        public AbsolutePath NugetIntermediateRoot { get; }
         public AbsolutePath NugetRoot { get; }
         public AbsolutePath ZipRoot { get; }
         public AbsolutePath BinRoot { get; }
@@ -117,6 +118,7 @@ public partial class Build
             // DIRECTORIES
             ArtifactsDir = RootDirectory / "artifacts";
             NugetRoot = ArtifactsDir / "nuget";
+            NugetIntermediateRoot = RootDirectory / "build-intermediate" / "nuget";
             ZipRoot = ArtifactsDir / "zip";
             BinRoot = ArtifactsDir / "bin";
             TestResultsRoot = ArtifactsDir / "test-results";
@@ -130,9 +132,9 @@ public partial class Build
             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;
         }
     }

+ 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 Nuke.Common;
 using Nuke.Common.IO;
+using Numerge;
 
 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="..\.travis.yml" Condition="Exists('..\.travis.yml')" />
     <None Include="..\GitVersion.yml" Condition="Exists('..\GitVersion.yml')" />
+    <Compile Remove="Numerge/**/*.*" />
+    <Compile Include="Numerge/Numerge/**/*.cs" />
   </ItemGroup>
 
 </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>
       <TargetFrameworks>netstandard2.0;net461;netcoreapp2.0</TargetFrameworks>
   </PropertyGroup>
 
   <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" />
 
   </ItemGroup>
@@ -40,10 +40,6 @@
       <Pack>true</Pack>
       <PackagePath>build\</PackagePath>
     </Content>
-    <Content Include="../../src/Avalonia.Build.Tasks/bin/$(Configuration)/netstandard2.0/Avalonia.Build.Tasks.dll">
-      <Pack>true</Pack>
-      <PackagePath>tools\</PackagePath>
-    </Content>
   </ItemGroup>
   <Import Project="..\..\build\SharedVersion.props" />
   <Import Project="..\..\build\NetFX.props" />

+ 1 - 1
packages/Avalonia/Avalonia.props

@@ -2,7 +2,7 @@
   <PropertyGroup>
     <AvaloniaPreviewerNetCoreToolPath>$(MSBuildThisFileDirectory)\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll</AvaloniaPreviewerNetCoreToolPath>
     <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>
   </PropertyGroup>
   <Import Project="$(MSBuildThisFileDirectory)\AvaloniaBuildTasks.props"/>

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

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

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

@@ -4,7 +4,6 @@
     <AssemblyName>Avalonia.Base</AssemblyName>
     <RootNamespace>Avalonia</RootNamespace>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup>
     <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>
         <BuildOutputTargetFolder>tools</BuildOutputTargetFolder>
         <DefineConstants>$(DefineConstants);BUILDTASK</DefineConstants>
-        <Packable>false</Packable>
     </PropertyGroup>
 
     <ItemGroup>

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

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

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

@@ -253,10 +253,8 @@ namespace Avalonia.Controls
                 IsPressed = false;
                 e.Handled = true;
 
-                var hittest = this.GetVisualsAt(e.GetPosition(this));
-
                 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();
                 }

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -2,7 +2,6 @@
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <RootNamespace>Avalonia</RootNamespace>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup> 
     <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;
             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)
             {
                 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>
     <EnableDefaultCompileItems>False</EnableDefaultCompileItems>
     <EnableDefaultItems>false</EnableDefaultItems>
-    <IsPackable>false</IsPackable>
     <NoWarn>CS1591</NoWarn>
   </PropertyGroup>
     <ItemGroup>

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

@@ -2,7 +2,6 @@
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <RootNamespace>Avalonia</RootNamespace>
-    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup>
     <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 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);
 

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

@@ -31,24 +31,18 @@ namespace Avalonia.Skia
             var size = session.Size;
             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.ClearColor(0, 0, 0, 0);
             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
             {
                 GrContext = _grContext,
@@ -62,6 +56,7 @@ namespace Avalonia.Skia
             {
                 surface.Canvas.Flush();
                 surface.Dispose();
+                renderTarget.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 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
             {

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

@@ -281,10 +281,10 @@ namespace Avalonia.Win32
             var f = Scaling;
             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);

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

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

@@ -46,6 +46,7 @@ namespace Avalonia.Direct2D1.RenderTests
 
         public TestBase(string outputPath)
         {
+            outputPath = outputPath.Replace('\\', Path.DirectorySeparatorChar);
             var testPath = GetTestsDirectory();
             var testFiles = Path.Combine(testPath, "TestFiles");
 #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;
+        }
+    }
+}
+