Browse Source

Merge branch 'master' into controlcatalog_pcl

pull/518/head
Jason Jarvis 11 years ago
parent
commit
33dc98b882
  1. 36
      Perspex.sln
  2. 2
      src/Perspex.SceneGraph/Size.cs
  3. 5
      src/Skia/Perspex.Skia.Desktop/Perspex.Skia.Desktop.csproj
  4. 59
      src/Skia/Perspex.Skia/BitmapImpl.cs
  5. 127
      src/Skia/Perspex.Skia/DrawingContextImpl.cs
  6. 4
      src/Skia/Perspex.Skia/StreamGeometryImpl.cs
  7. BIN
      tests/Perspex.RenderTests/Controls/BorderTests.cs
  8. 10
      tests/Perspex.RenderTests/Media/ImageBrushTests.cs
  9. 4
      tests/Perspex.RenderTests/Media/LinearGradientBrushTests.cs
  10. 22
      tests/Perspex.RenderTests/Media/VisualBrushTests.cs
  11. 2
      tests/Perspex.RenderTests/Perspex.Skia.RenderTests.csproj
  12. 11
      tests/Perspex.RenderTests/Shapes/PathTests.cs
  13. 4
      tests/Perspex.RenderTests/Shapes/PolygonTests.cs
  14. 4
      tests/Perspex.RenderTests/Shapes/PolylineTests.cs

36
Perspex.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14 # Visual Studio 14
VisualStudioVersion = 14.0.25123.0 VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perspex.Base", "src\Perspex.Base\Perspex.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perspex.Base", "src\Perspex.Base\Perspex.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}"
EndProject EndProject
@ -153,6 +153,7 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.Desktop", "samples\ControlCatalog.Desktop\ControlCatalog.Desktop.csproj", "{2B888490-D14A-4BCA-AB4B-48676FA93C9B}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.Desktop", "samples\ControlCatalog.Desktop\ControlCatalog.Desktop.csproj", "{2B888490-D14A-4BCA-AB4B-48676FA93C9B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.iOS", "samples\ControlCatalog.iOS\ControlCatalog.iOS.csproj", "{57E0455D-D565-44BB-B069-EE1AA20F8337}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.iOS", "samples\ControlCatalog.iOS\ControlCatalog.iOS.csproj", "{57E0455D-D565-44BB-B069-EE1AA20F8337}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perspex.Skia.RenderTests", "tests\Perspex.RenderTests\Perspex.Skia.RenderTests.csproj", "{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}"
EndProject EndProject
Global Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution GlobalSection(SharedMSBuildProjectFiles) = preSolution
@ -1805,6 +1806,38 @@ Global
{57E0455D-D565-44BB-B069-EE1AA20F8337}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator {57E0455D-D565-44BB-B069-EE1AA20F8337}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{57E0455D-D565-44BB-B069-EE1AA20F8337}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator {57E0455D-D565-44BB-B069-EE1AA20F8337}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{57E0455D-D565-44BB-B069-EE1AA20F8337}.Release|x86.ActiveCfg = Release|iPhone {57E0455D-D565-44BB-B069-EE1AA20F8337}.Release|x86.ActiveCfg = Release|iPhone
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|Any CPU.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|iPhone.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|x86.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.AppStore|x86.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|iPhone.Build.0 = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|x86.ActiveCfg = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Debug|x86.Build.0 = Debug|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|Any CPU.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|iPhone.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|iPhone.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|x86.ActiveCfg = Release|Any CPU
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -1852,5 +1885,6 @@ Global
{D0A739B9-3C68-4BA6-A328-41606954B6BD} = {9B9E3891-2366-4253-A952-D08BCEB71098} {D0A739B9-3C68-4BA6-A328-41606954B6BD} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{2B888490-D14A-4BCA-AB4B-48676FA93C9B} = {9B9E3891-2366-4253-A952-D08BCEB71098} {2B888490-D14A-4BCA-AB4B-48676FA93C9B} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{57E0455D-D565-44BB-B069-EE1AA20F8337} = {9B9E3891-2366-4253-A952-D08BCEB71098} {57E0455D-D565-44BB-B069-EE1AA20F8337} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{D35A9F3D-8BB0-496E-BF72-444038A7DEBB} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

2
src/Perspex.SceneGraph/Size.cs

@ -125,7 +125,7 @@ namespace Perspex
public static Size operator -(Size size, Size toSubstract) public static Size operator -(Size size, Size toSubstract)
{ {
return new Size(size._width + toSubstract._width, size._height + toSubstract._height); return new Size(size._width - toSubstract._width, size._height - toSubstract._height);
} }
/// <summary> /// <summary>

5
src/Skia/Perspex.Skia.Desktop/Perspex.Skia.Desktop.csproj

@ -38,7 +38,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath> <OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;WIN32</DefineConstants> <DefineConstants>TRACE;DEBUG;WIN32;DESKTOP</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
@ -47,7 +47,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath> <OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;WIN32</DefineConstants> <DefineConstants>TRACE;WIN32;DESKTOP</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@ -62,6 +62,7 @@
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />

59
src/Skia/Perspex.Skia/BitmapImpl.cs

@ -22,39 +22,62 @@ namespace Perspex.Skia
public BitmapImpl(int width, int height) public BitmapImpl(int width, int height)
{ {
throw new NotImplementedException(); PixelHeight = height;
PixelWidth = width;
Bitmap = new SKBitmap(width, height, SKColorType.N_32, SKAlphaType.Premul);
} }
public void Dispose() public void Dispose()
{ {
Bitmap.Dispose();
} }
public void Save(string fileName) public void Save(string fileName)
{ {
// TODO: Implement this for SkiaSharp #if DESKTOP
throw new NotImplementedException(); IntPtr length;
using (var sdb = new System.Drawing.Bitmap(PixelWidth, PixelHeight, Bitmap.RowBytes,
//var ext = Path.GetExtension(fileName)?.ToLower(); System.Drawing.Imaging.PixelFormat.Format32bppArgb, Bitmap.GetPixels(out length)))
//var type = MethodTable.SkiaImageType.Png; sdb.Save(fileName);
//if(ext=="gif") #else
// type = MethodTable.SkiaImageType.Gif; //SkiaSharp doesn't expose image encoders yet
//if(ext=="jpeg" || ext =="jpg") #endif
// type = MethodTable.SkiaImageType.Jpeg;
//var skdata = MethodTable.Instance.SaveImage(Handle, type, 100);
//var size = MethodTable.Instance.GetSkDataSize(skdata);
//var buffer = new byte[size];
//MethodTable.Instance.ReadSkData(skdata, buffer, size);
//File.WriteAllBytes(fileName, buffer);
} }
public int PixelWidth { get; private set; } public int PixelWidth { get; private set; }
public int PixelHeight { get; private set; } public int PixelHeight { get; private set; }
class BitmapDrawingContext : DrawingContextImpl
{
private readonly SKSurface _surface;
public BitmapDrawingContext(SKBitmap bitmap) : this(CreateSurface(bitmap))
{
}
private static SKSurface CreateSurface(SKBitmap bitmap)
{
IntPtr length;
return SKSurface.Create(bitmap.Info, bitmap.GetPixels(out length), bitmap.RowBytes);
}
public BitmapDrawingContext(SKSurface surface) : base(surface.Canvas)
{
_surface = surface;
}
public override void Dispose()
{
base.Dispose();
_surface.Dispose();
}
}
public DrawingContext CreateDrawingContext() public DrawingContext CreateDrawingContext()
{ {
return
new DrawingContext( return new DrawingContext(new BitmapDrawingContext(Bitmap));
new DrawingContextImpl(null)); // MethodTable.Instance.RenderTargetCreateRenderingContext(Handle)));
} }
} }

127
src/Skia/Perspex.Skia/DrawingContextImpl.cs

@ -4,6 +4,7 @@ using Perspex.Media;
using Perspex.Media.Imaging; using Perspex.Media.Imaging;
using SkiaSharp; using SkiaSharp;
using System.Linq; using System.Linq;
using Perspex.RenderHelpers;
namespace Perspex.Skia namespace Perspex.Skia
{ {
@ -14,6 +15,7 @@ namespace Perspex.Skia
public DrawingContextImpl(SKCanvas canvas) public DrawingContextImpl(SKCanvas canvas)
{ {
Canvas = canvas; Canvas = canvas;
Canvas.Clear();
} }
public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect) public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect)
@ -28,7 +30,7 @@ namespace Perspex.Skia
{ {
using (var paint = CreatePaint(pen, new Size(Math.Abs(p2.X - p1.X), Math.Abs(p2.Y - p1.Y)))) using (var paint = CreatePaint(pen, new Size(Math.Abs(p2.X - p1.X), Math.Abs(p2.Y - p1.Y))))
{ {
Canvas.DrawLine((float)p1.X, (float)p1.Y, (float)p2.X, (float)p2.Y, paint); Canvas.DrawLine((float)p1.X, (float)p1.Y, (float)p2.X, (float)p2.Y, paint.Paint);
} }
} }
@ -37,37 +39,70 @@ namespace Perspex.Skia
var impl = ((StreamGeometryImpl)geometry.PlatformImpl); var impl = ((StreamGeometryImpl)geometry.PlatformImpl);
var size = geometry.Bounds.Size; var size = geometry.Bounds.Size;
using (var fill = brush != null ? CreatePaint(brush, size) : null) using (var fill = brush != null ? CreatePaint(brush, size) : default(PaintWrapper))
using (var stroke = pen?.Brush != null ? CreatePaint(pen, size) : null) using (var stroke = pen?.Brush != null ? CreatePaint(pen, size) : default(PaintWrapper))
{ {
if (fill != null) if (fill.Paint != null)
{ {
Canvas.DrawPath(impl.EffectivePath, fill); Canvas.DrawPath(impl.EffectivePath, fill.Paint);
} }
if (stroke != null) if (stroke.Paint != null)
{ {
Canvas.DrawPath(impl.EffectivePath, stroke); Canvas.DrawPath(impl.EffectivePath, stroke.Paint);
} }
} }
} }
private SKPaint CreatePaint(IBrush brush, Size targetSize) struct PaintWrapper : IDisposable
{ {
SKPaint paint = new SKPaint(); //We are saving memory allocations there
//TODO: add more disposable fields if needed
public readonly SKPaint Paint;
private IDisposable _disposable1;
public void AddDisposable(IDisposable disposable)
{
if (_disposable1 == null)
_disposable1 = disposable;
else
throw new InvalidOperationException();
}
public PaintWrapper(SKPaint paint)
{
Paint = paint;
_disposable1 = null;
}
public void Dispose()
{
Paint?.Dispose();
_disposable1?.Dispose();
}
}
private PaintWrapper CreatePaint(IBrush brush, Size targetSize)
{
SKPaint paint = new SKPaint();
var rv = new PaintWrapper(paint);
paint.IsStroke = false; paint.IsStroke = false;
// TODO: SkiaSharp does not contain alpha yet! // TODO: SkiaSharp does not contain alpha yet!
//double opacity = brush.Opacity * _currentOpacity; double opacity = brush.Opacity * _currentOpacity;
//paint.SetAlpha(paint.GetAlpha() * opacity); //paint.SetAlpha(paint.GetAlpha() * opacity);
paint.IsAntialias = true; paint.IsAntialias = true;
SKColor color = new SKColor(255, 255, 255, 255);
var solid = brush as SolidColorBrush; var solid = brush as SolidColorBrush;
if (solid != null) if (solid != null)
{ color = solid.Color.ToSKColor();
paint.Color = solid.Color.ToSKColor();
return paint; paint.Color = (new SKColor(color.Red, color.Green, color.Blue, (byte) (color.Alpha*opacity)));
} if (solid != null)
return rv;
var gradient = brush as GradientBrush; var gradient = brush as GradientBrush;
if (gradient != null) if (gradient != null)
@ -85,6 +120,7 @@ namespace Perspex.Skia
// would be nice to cache these shaders possibly? // would be nice to cache these shaders possibly?
var shader = SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode); var shader = SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode);
paint.Shader = shader; paint.Shader = shader;
shader.Dispose();
} }
else else
{ {
@ -100,45 +136,46 @@ namespace Perspex.Skia
// would be nice to cache these shaders possibly? // would be nice to cache these shaders possibly?
var shader = SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode); var shader = SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode);
paint.Shader = shader; paint.Shader = shader;
shader.Dispose();
} }
} }
return paint; return rv;
} }
var tileBrush = brush as TileBrush; var tileBrush = brush as TileBrush;
if (tileBrush != null) if (tileBrush != null)
{ {
// TODO: Get Tile Brushes working!!! var helper = new TileBrushImplHelper(tileBrush, targetSize);
// var bitmap = new BitmapImpl((int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height);
//throw new NotImplementedException(); rv.AddDisposable(bitmap);
using (var ctx = bitmap.CreateDrawingContext())
// rv.Brush->Type = NativeBrushType.Image; helper.DrawIntermediate(ctx);
// var helper = new TileBrushImplHelper(tileBrush, targetSize); SKMatrix translation = SKMatrix.MakeTranslation(-(float)helper.DestinationRect.X, -(float)helper.DestinationRect.Y);
// var bitmap = new BitmapImpl((int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height); SKShaderTileMode tileX =
// rv.AddDisposable(bitmap); tileBrush.TileMode == TileMode.None
// using (var ctx = bitmap.CreateDrawingContext()) ? SKShaderTileMode.Clamp
// helper.DrawIntermediate(ctx); : tileBrush.TileMode == TileMode.FlipX || tileBrush.TileMode == TileMode.FlipXY
// rv.Brush->Bitmap = bitmap.Handle; ? SKShaderTileMode.Mirror
// rv.Brush->BitmapTileMode = tileBrush.TileMode; : SKShaderTileMode.Repeat;
// rv.Brush->BitmapTranslation = new SkiaPoint(-helper.DestinationRect.X, -helper.DestinationRect.Y);
SKShaderTileMode tileY =
// SkMatrix matrix; tileBrush.TileMode == TileMode.None
// matrix.setTranslate(brush->BitmapTranslation); ? SKShaderTileMode.Clamp
// SkShader::TileMode tileX = brush->BitmapTileMode == ptmNone ? SkShader::kClamp_TileMode : tileBrush.TileMode == TileMode.FlipY || tileBrush.TileMode == TileMode.FlipXY
// : (brush->BitmapTileMode == ptmFlipX || brush->BitmapTileMode == ptmFlipXY) ? SkShader::kMirror_TileMode : SkShader::kRepeat_TileMode; ? SKShaderTileMode.Mirror
// SkShader::TileMode tileY = brush->BitmapTileMode == ptmNone ? SkShader::kClamp_TileMode : SKShaderTileMode.Repeat;
// : (brush->BitmapTileMode == ptmFlipY || brush->BitmapTileMode == ptmFlipXY) ? SkShader::kMirror_TileMode : SkShader::kRepeat_TileMode; paint.Shader = SKShader.CreateBitmap(bitmap.Bitmap, tileX, tileY, translation);
paint.Shader.Dispose();
// paint.setShader(SkShader::CreateBitmapShader(brush->Bitmap->Bitmap, tileX, tileY, &matrix))->unref();
} }
return paint; return rv;
} }
private SKPaint CreatePaint(Pen pen, Size targetSize) private PaintWrapper CreatePaint(Pen pen, Size targetSize)
{ {
var paint = CreatePaint(pen.Brush, targetSize); var rv = CreatePaint(pen.Brush, targetSize);
var paint = rv.Paint;
paint.IsStroke = true; paint.IsStroke = true;
paint.StrokeWidth = (float)pen.Thickness; paint.StrokeWidth = (float)pen.Thickness;
@ -178,7 +215,7 @@ namespace Perspex.Skia
// paint.setPathEffect(SkDashPathEffect::Create(brush->StrokeDashes, brush->StrokeDashCount, brush->StrokeDashOffset))->unref(); // paint.setPathEffect(SkDashPathEffect::Create(brush->StrokeDashes, brush->StrokeDashCount, brush->StrokeDashOffset))->unref();
//} //}
return paint; return rv;
} }
public void DrawRectangle(Pen pen, Rect rect, float cornerRadius = 0) public void DrawRectangle(Pen pen, Rect rect, float cornerRadius = 0)
@ -188,13 +225,13 @@ namespace Perspex.Skia
var rc = rect.ToSKRect(); var rc = rect.ToSKRect();
if (cornerRadius == 0) if (cornerRadius == 0)
{ {
Canvas.DrawRect(rc, paint); Canvas.DrawRect(rc, paint.Paint);
} }
else else
{ {
// TODO: DrawRRect (ore DrawRoundedRect) is not accesible in SkiaSharp yet. We should add that // TODO: DrawRRect (ore DrawRoundedRect) is not accesible in SkiaSharp yet. We should add that
// to SkiaSharp and initiate a PR.... // to SkiaSharp and initiate a PR....
Canvas.DrawRect(rc, paint); Canvas.DrawRect(rc, paint.Paint);
//Canvas.DrawRoundedRect(rc, cornerRadius, cornerRadius, paint); //Canvas.DrawRoundedRect(rc, cornerRadius, cornerRadius, paint);
} }
} }
@ -207,14 +244,14 @@ namespace Perspex.Skia
var rc = rect.ToSKRect(); var rc = rect.ToSKRect();
if (cornerRadius == 0) if (cornerRadius == 0)
{ {
Canvas.DrawRect(rc, paint); Canvas.DrawRect(rc, paint.Paint);
} }
else else
{ {
// TODO: this does not exist in SkiaSharp yet // TODO: this does not exist in SkiaSharp yet
//throw new NotImplementedException(); //throw new NotImplementedException();
//Canvas.DrawRoundedRect(rc, cornerRadius, cornerRadius, paint); //Canvas.DrawRoundedRect(rc, cornerRadius, cornerRadius, paint);
Canvas.DrawRect(rc, paint); Canvas.DrawRect(rc, paint.Paint);
} }
} }
} }

4
src/Skia/Perspex.Skia/StreamGeometryImpl.cs

@ -50,7 +50,7 @@ namespace Perspex.Skia
_transformedPath.Dispose(); _transformedPath.Dispose();
_transformedPath = null; _transformedPath = null;
} }
// TODO: SkiaSharp does not expose Transform yet!!! // TODO: SkiaSharp does not expose Transform yet!!!
//if (!Transform.IsIdentity) //if (!Transform.IsIdentity)
//{ //{
@ -111,7 +111,7 @@ namespace Perspex.Skia
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection) public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection)
{ {
throw new NotImplementedException(); ArcToHelper.ArcTo(this, _currentPoint, point, size, rotationAngle, isLargeArc, sweepDirection);
} }
public void BeginFigure(Point startPoint, bool isFilled) public void BeginFigure(Point startPoint, bool isFilled)

BIN
tests/Perspex.RenderTests/Controls/BorderTests.cs

Binary file not shown.

10
tests/Perspex.RenderTests/Media/ImageBrushTests.cs

@ -102,7 +102,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
RenderToFile(target); RenderToFile(target);
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -129,7 +129,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -156,7 +156,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -207,7 +207,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -235,7 +235,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]

4
tests/Perspex.RenderTests/Media/LinearGradientBrushTests.cs

@ -24,7 +24,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
{ {
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -55,7 +55,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]

22
tests/Perspex.RenderTests/Media/VisualBrushTests.cs

@ -87,7 +87,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Font scaling currently broken on cairo")] [Fact(Skip = "Font scaling currently broken on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -143,7 +143,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Font scaling currently broken on cairo")] [Fact(Skip = "Font scaling currently broken on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -172,7 +172,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Font scaling currently broken on cairo")] [Fact(Skip = "Font scaling currently broken on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -201,7 +201,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Font scaling currently broken on cairo")] [Fact(Skip = "Font scaling currently broken on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -254,7 +254,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Font scaling currently broken on cairo")] [Fact(Skip = "Font scaling currently broken on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -282,7 +282,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA #if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -311,11 +311,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA
[Fact(Skip = "FIXME")]
#else
[Fact] [Fact]
#endif
public void VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest() public void VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest()
{ {
Decorator target = new Decorator Decorator target = new Decorator
@ -342,7 +338,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "TileMode.FlipX not yet supported on cairo")] [Fact(Skip = "TileMode.FlipX not yet supported on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -372,7 +368,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "TileMode.FlipY not yet supported on cairo")] [Fact(Skip = "TileMode.FlipY not yet supported on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]
@ -402,7 +398,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Font scaling currently broken on cairo")] [Fact(Skip = "Font scaling currently broken on cairo")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]

2
tests/Perspex.RenderTests/Perspex.Skia.RenderTests.csproj

@ -20,7 +20,7 @@
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;PERSPEX_SKIA</DefineConstants> <DefineConstants>TRACE;DEBUG;PERSPEX_SKIA;PERSPEX_SKIA_SKIP_FAIL</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>

11
tests/Perspex.RenderTests/Shapes/PathTests.cs

@ -45,8 +45,11 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
RenderToFile(target); RenderToFile(target);
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")]
#else
[Fact] [Fact]
#endif
public void Path_Tick_Scaled() public void Path_Tick_Scaled()
{ {
Decorator target = new Decorator Decorator target = new Decorator
@ -69,7 +72,11 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
CompareImages(); CompareImages();
} }
#if PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")]
#else
[Fact] [Fact]
#endif
public void Path_Tick_Scaled_Stroke_8px() public void Path_Tick_Scaled_Stroke_8px()
{ {
Decorator target = new Decorator Decorator target = new Decorator
@ -122,7 +129,7 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Path with StrokeDashCap, StrokeStartLineCap, StrokeEndLineCap rendering is not implemented in Cairo yet")] [Fact(Skip = "Path with StrokeDashCap, StrokeStartLineCap, StrokeEndLineCap rendering is not implemented in Cairo yet")]
#elif PERSPEX_SKIA #elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "FIXME")] [Fact(Skip = "FIXME")]
#else #else
[Fact] [Fact]

4
tests/Perspex.RenderTests/Shapes/PolygonTests.cs

@ -23,6 +23,8 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Caused by cairo bug")] [Fact(Skip = "Caused by cairo bug")]
#elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")]
#else #else
[Fact] [Fact]
#endif #endif
@ -49,6 +51,8 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Caused by cairo bug")] [Fact(Skip = "Caused by cairo bug")]
#elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")]
#else #else
[Fact] [Fact]
#endif #endif

4
tests/Perspex.RenderTests/Shapes/PolylineTests.cs

@ -23,6 +23,8 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Caused by cairo bug")] [Fact(Skip = "Caused by cairo bug")]
#elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")]
#else #else
[Fact] [Fact]
#endif #endif
@ -51,6 +53,8 @@ namespace Perspex.Direct2D1.RenderTests.Shapes
#if PERSPEX_CAIRO #if PERSPEX_CAIRO
[Fact(Skip = "Caused by cairo bug")] [Fact(Skip = "Caused by cairo bug")]
#elif PERSPEX_SKIA_SKIP_FAIL
[Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")]
#else #else
[Fact] [Fact]
#endif #endif

Loading…
Cancel
Save