diff --git a/Cairo/Perspex.Cairo/CairoPlatform.cs b/Cairo/Perspex.Cairo/CairoPlatform.cs index 902a621cf4..f1841fe31a 100644 --- a/Cairo/Perspex.Cairo/CairoPlatform.cs +++ b/Cairo/Perspex.Cairo/CairoPlatform.cs @@ -27,8 +27,7 @@ namespace Perspex.Cairo public IBitmapImpl CreateBitmap(int width, int height) { - throw new NotImplementedException(); - ////return new BitmapImpl(imagingFactory, width, height); + return new BitmapImpl(new ImageSurface(Format.Argb32, width, height)); } public IFormattedTextImpl CreateFormattedText( @@ -49,7 +48,7 @@ namespace Perspex.Cairo public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height) { - throw new NotImplementedException(); + return new RenderTargetBitmapImpl(new ImageSurface(Format.Argb32, width, height)); } public IStreamGeometryImpl CreateStreamGeometry() diff --git a/Cairo/Perspex.Cairo/Media/DrawingContext.cs b/Cairo/Perspex.Cairo/Media/DrawingContext.cs index 5b79613e21..1d6d2a146a 100644 --- a/Cairo/Perspex.Cairo/Media/DrawingContext.cs +++ b/Cairo/Perspex.Cairo/Media/DrawingContext.cs @@ -70,7 +70,7 @@ namespace Perspex.Cairo.Media { this.context.Dispose(); - if (this.surface != null) + if (this.surface is Cairo.Win32Surface) { this.surface.Dispose(); } diff --git a/Cairo/Perspex.Cairo/Media/Imaging/BitmapImpl.cs b/Cairo/Perspex.Cairo/Media/Imaging/BitmapImpl.cs index 457e7fc179..34961e7795 100644 --- a/Cairo/Perspex.Cairo/Media/Imaging/BitmapImpl.cs +++ b/Cairo/Perspex.Cairo/Media/Imaging/BitmapImpl.cs @@ -35,7 +35,7 @@ namespace Perspex.Cairo.Media.Imaging public void Save(string fileName) { - throw new NotImplementedException(); + this.Surface.WriteToPng(fileName); } } } diff --git a/Cairo/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs b/Cairo/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs new file mode 100644 index 0000000000..c0ccc372ab --- /dev/null +++ b/Cairo/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs @@ -0,0 +1,33 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Cairo.Media.Imaging +{ + using System; + using Perspex.Platform; + using Cairo = global::Cairo; + + public class RenderTargetBitmapImpl : BitmapImpl, IRenderTargetBitmapImpl + { + + public RenderTargetBitmapImpl( + Cairo.ImageSurface surface) + : base(surface) + { + } + + public void Dispose() + { + this.Surface.Dispose(); + } + + public void Render(IVisual visual) + { + Renderer renderer = new Renderer(this.Surface); + renderer.Render(visual, new PlatformHandle(IntPtr.Zero, "RTB")); + } + } +} \ No newline at end of file diff --git a/Cairo/Perspex.Cairo/Perspex.Cairo.csproj b/Cairo/Perspex.Cairo/Perspex.Cairo.csproj index 9a6ae92dee..eaad49e49d 100644 --- a/Cairo/Perspex.Cairo/Perspex.Cairo.csproj +++ b/Cairo/Perspex.Cairo/Perspex.Cairo.csproj @@ -70,6 +70,7 @@ + diff --git a/Cairo/Perspex.Cairo/Renderer.cs b/Cairo/Perspex.Cairo/Renderer.cs index dfce3c8c11..ad4b7aeee6 100644 --- a/Cairo/Perspex.Cairo/Renderer.cs +++ b/Cairo/Perspex.Cairo/Renderer.cs @@ -30,6 +30,12 @@ namespace Perspex.Cairo { } + private ImageSurface surface; + public Renderer(ImageSurface surface) + { + this.surface = surface; + } + /// /// Resizes the renderer. /// @@ -51,6 +57,8 @@ namespace Perspex.Cairo { case "HWND": return new DrawingContext(new Win32Surface(GetDC(handle.Handle))); + case "RTB": + return new DrawingContext(this.surface); case "HDC": return new DrawingContext(new Win32Surface(handle.Handle)); case "GdkWindow": diff --git a/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs b/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs index 3f436941da..15d8252b3b 100644 --- a/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs +++ b/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs @@ -8,8 +8,9 @@ namespace Perspex.Media.Imaging { using Perspex.Platform; using Splat; + using System; - public class RenderTargetBitmap : Bitmap + public class RenderTargetBitmap : Bitmap, IDisposable { public RenderTargetBitmap(int width, int height) : base(CreateImpl(width, height)) @@ -31,5 +32,10 @@ namespace Perspex.Media.Imaging IPlatformRenderInterface factory = Locator.Current.GetService(); return factory.CreateRenderTargetBitmap(width, height); } + + public void Dispose() + { + this.PlatformImpl.Dispose(); + } } } diff --git a/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs b/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs index dc20a78304..c61bd549af 100644 --- a/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs +++ b/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs @@ -4,9 +4,11 @@ // // ----------------------------------------------------------------------- +using System; + namespace Perspex.Platform { - public interface IRenderTargetBitmapImpl : IBitmapImpl + public interface IRenderTargetBitmapImpl : IBitmapImpl, IDisposable { void Render(IVisual visual); } diff --git a/TestFiles/Cairo/Controls/Border/Border_1px_Border.expected.png b/TestFiles/Cairo/Controls/Border/Border_1px_Border.expected.png new file mode 100644 index 0000000000..24239d5799 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_1px_Border.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_2px_Border.expected.png b/TestFiles/Cairo/Controls/Border/Border_2px_Border.expected.png new file mode 100644 index 0000000000..cebe42f3df Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_2px_Border.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Bottom_Aligns_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Bottom_Aligns_Content.expected.png new file mode 100644 index 0000000000..163e53293f Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Bottom_Aligns_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Brush_Offsets_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Brush_Offsets_Content.expected.png new file mode 100644 index 0000000000..d1c13a9e57 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Brush_Offsets_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Horizontally.expected.png b/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Horizontally.expected.png new file mode 100644 index 0000000000..18ecd01c7a Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Horizontally.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Vertically.expected.png b/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Vertically.expected.png new file mode 100644 index 0000000000..40d0de862e Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Centers_Content_Vertically.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Fill.expected.png b/TestFiles/Cairo/Controls/Border/Border_Fill.expected.png new file mode 100644 index 0000000000..8e08d02f66 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Fill.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Left_Aligns_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Left_Aligns_Content.expected.png new file mode 100644 index 0000000000..73be4dcdc6 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Left_Aligns_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Margin_Offsets_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Margin_Offsets_Content.expected.png new file mode 100644 index 0000000000..1fa36969e5 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Margin_Offsets_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Nested_Rotate.expected.png b/TestFiles/Cairo/Controls/Border/Border_Nested_Rotate.expected.png new file mode 100644 index 0000000000..54d3bb9cec Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Nested_Rotate.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Padding_Offsets_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Padding_Offsets_Content.expected.png new file mode 100644 index 0000000000..1fa36969e5 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Padding_Offsets_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Right_Aligns_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Right_Aligns_Content.expected.png new file mode 100644 index 0000000000..3db06328cc Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Right_Aligns_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Horizontally.expected.png b/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Horizontally.expected.png new file mode 100644 index 0000000000..e255633894 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Horizontally.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Vertically.expected.png b/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Vertically.expected.png new file mode 100644 index 0000000000..e255633894 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Stretches_Content_Vertically.expected.png differ diff --git a/TestFiles/Cairo/Controls/Border/Border_Top_Aligns_Content.expected.png b/TestFiles/Cairo/Controls/Border/Border_Top_Aligns_Content.expected.png new file mode 100644 index 0000000000..1c48ec82c6 Binary files /dev/null and b/TestFiles/Cairo/Controls/Border/Border_Top_Aligns_Content.expected.png differ diff --git a/TestFiles/Cairo/Controls/Image/Image_Stretch_Fill.expected.png b/TestFiles/Cairo/Controls/Image/Image_Stretch_Fill.expected.png new file mode 100644 index 0000000000..2980a94b70 Binary files /dev/null and b/TestFiles/Cairo/Controls/Image/Image_Stretch_Fill.expected.png differ diff --git a/TestFiles/Cairo/Controls/Image/Image_Stretch_None.expected.png b/TestFiles/Cairo/Controls/Image/Image_Stretch_None.expected.png new file mode 100644 index 0000000000..58eebe2251 Binary files /dev/null and b/TestFiles/Cairo/Controls/Image/Image_Stretch_None.expected.png differ diff --git a/TestFiles/Cairo/Controls/Image/Image_Stretch_Uniform.expected.png b/TestFiles/Cairo/Controls/Image/Image_Stretch_Uniform.expected.png new file mode 100644 index 0000000000..588c6515c5 Binary files /dev/null and b/TestFiles/Cairo/Controls/Image/Image_Stretch_Uniform.expected.png differ diff --git a/TestFiles/Cairo/Controls/Image/Image_Stretch_UniformToFill.expected.png b/TestFiles/Cairo/Controls/Image/Image_Stretch_UniformToFill.expected.png new file mode 100644 index 0000000000..98d421f98c Binary files /dev/null and b/TestFiles/Cairo/Controls/Image/Image_Stretch_UniformToFill.expected.png differ diff --git a/TestFiles/Cairo/Controls/Image/test.png b/TestFiles/Cairo/Controls/Image/test.png new file mode 100644 index 0000000000..ed4f82f847 Binary files /dev/null and b/TestFiles/Cairo/Controls/Image/test.png differ diff --git a/TestFiles/Cairo/Shapes/Ellipse/Circle_1px_Stroke.expected.png b/TestFiles/Cairo/Shapes/Ellipse/Circle_1px_Stroke.expected.png new file mode 100644 index 0000000000..e637006545 Binary files /dev/null and b/TestFiles/Cairo/Shapes/Ellipse/Circle_1px_Stroke.expected.png differ diff --git a/TestFiles/Cairo/Shapes/Path/Path_100px_Triangle_Centered.expected.png b/TestFiles/Cairo/Shapes/Path/Path_100px_Triangle_Centered.expected.png new file mode 100644 index 0000000000..dab965f988 Binary files /dev/null and b/TestFiles/Cairo/Shapes/Path/Path_100px_Triangle_Centered.expected.png differ diff --git a/TestFiles/Cairo/Shapes/Path/Path_Expander_With_Border.expected.png b/TestFiles/Cairo/Shapes/Path/Path_Expander_With_Border.expected.png new file mode 100644 index 0000000000..9c72e69ea9 Binary files /dev/null and b/TestFiles/Cairo/Shapes/Path/Path_Expander_With_Border.expected.png differ diff --git a/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled.expected.png b/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled.expected.png new file mode 100644 index 0000000000..cb4466a21f Binary files /dev/null and b/TestFiles/Cairo/Shapes/Path/Path_Tick_Scaled.expected.png differ diff --git a/TestFiles/Cairo/Shapes/Rectangle/Rectangle_1px_Stroke.expected.png b/TestFiles/Cairo/Shapes/Rectangle/Rectangle_1px_Stroke.expected.png new file mode 100644 index 0000000000..6aa013a894 Binary files /dev/null and b/TestFiles/Cairo/Shapes/Rectangle/Rectangle_1px_Stroke.expected.png differ diff --git a/TestFiles/Cairo/Shapes/Rectangle/Rectangle_2px_Stroke.expected.png b/TestFiles/Cairo/Shapes/Rectangle/Rectangle_2px_Stroke.expected.png new file mode 100644 index 0000000000..c3ee9548b0 Binary files /dev/null and b/TestFiles/Cairo/Shapes/Rectangle/Rectangle_2px_Stroke.expected.png differ diff --git a/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill.expected.png b/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill.expected.png new file mode 100644 index 0000000000..2eb5c946ce Binary files /dev/null and b/TestFiles/Cairo/Shapes/Rectangle/Rectangle_Stroke_Fill.expected.png differ diff --git a/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs b/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs index 45c7c9ef86..16476a213c 100644 --- a/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs @@ -11,7 +11,7 @@ namespace Perspex.Direct2D1.Media using SharpDX.Direct2D1; using SharpDX.WIC; - public class RenderTargetBitmapImpl : BitmapImpl, IRenderTargetBitmapImpl + public class RenderTargetBitmapImpl : BitmapImpl, IRenderTargetBitmapImpl, IDisposable { private WicRenderTarget target; @@ -32,6 +32,11 @@ namespace Perspex.Direct2D1.Media }); } + public void Dispose() + { + // TODO: + } + public void Render(IVisual visual) { Renderer renderer = new Renderer(this.target);