diff --git a/src/Gtk/Perspex.Cairo/CairoPlatform.cs b/src/Gtk/Perspex.Cairo/CairoPlatform.cs index 75f1c45668..5d9a003a93 100644 --- a/src/Gtk/Perspex.Cairo/CairoPlatform.cs +++ b/src/Gtk/Perspex.Cairo/CairoPlatform.cs @@ -36,7 +36,7 @@ namespace Perspex.Cairo return new FormattedTextImpl(s_pangoContext, text, fontFamily, fontSize, fontStyle, textAlignment, fontWeight); } - public IRenderTarget CreateRenderer(IPlatformHandle handle, double width, double height) + public IRenderTarget CreateRenderer(IPlatformHandle handle) { var window = handle as Gtk.Window; if (window == null) @@ -45,7 +45,7 @@ namespace Perspex.Cairo handle.HandleDescriptor)); window.DoubleBuffered = true; - return new RenderTarget(window, width, height); + return new RenderTarget(window); } public IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height) diff --git a/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs index 4d8f05848a..bb12d1887e 100644 --- a/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs @@ -43,10 +43,5 @@ namespace Perspex.Cairo.Media.Imaging { return _renderTarget.CreateDrawingContext(); } - - void IRenderTarget.Resize(int width, int height) - { - throw new NotSupportedException(); - } } } \ No newline at end of file diff --git a/src/Gtk/Perspex.Cairo/RenderTarget.cs b/src/Gtk/Perspex.Cairo/RenderTarget.cs index 2daab33fbe..ee02a279bd 100644 --- a/src/Gtk/Perspex.Cairo/RenderTarget.cs +++ b/src/Gtk/Perspex.Cairo/RenderTarget.cs @@ -27,7 +27,7 @@ namespace Perspex.Cairo /// The window. /// The width of the window. /// The height of the window. - public RenderTarget(Gtk.Window window, double width, double height) + public RenderTarget(Gtk.Window window) { _window = window; } @@ -37,16 +37,6 @@ namespace Perspex.Cairo _surface = surface; } - /// - /// Resizes the renderer. - /// - /// The new width. - /// The new height. - public void Resize(int width, int height) - { - // Don't need to do anything here. - } - /// /// Creates a cairo surface that targets a platform-specific resource. diff --git a/src/Perspex.Controls/Platform/ITopLevelRenderer.cs b/src/Perspex.Controls/Platform/ITopLevelRenderer.cs index 0f58dac76e..16456378b7 100644 --- a/src/Perspex.Controls/Platform/ITopLevelRenderer.cs +++ b/src/Perspex.Controls/Platform/ITopLevelRenderer.cs @@ -34,14 +34,8 @@ namespace Perspex.Controls.Platform return; var viewport = platformRender - .CreateRenderer(topLevel.PlatformImpl.Handle, initialClientSize.Width, initialClientSize.Height); + .CreateRenderer(topLevel.PlatformImpl.Handle); resources.Add(viewport); - - - resources.Add(topLevel.GetObservable(TopLevel.ClientSizeProperty).Subscribe(clientSize => - { - viewport.Resize((int) clientSize.Width, (int) clientSize.Height); - })); resources.Add(queueManager.RenderNeeded.Subscribe(_ => Dispatcher.UIThread.InvokeAsync(() => topLevel.PlatformImpl.Invalidate(new Rect(topLevel.ClientSize))))); diff --git a/src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs b/src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs index 55b25738ad..e5f918a849 100644 --- a/src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs +++ b/src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs @@ -31,17 +31,6 @@ namespace Perspex.Media.Imaging PlatformImpl = factory.LoadBitmap(stream); } - /// - /// Initializes a new instance of the class. - /// - /// The width of the bitmap, in pixels. - /// The height of the bitmap, in pixels. - public Bitmap(int width, int height) - { - IPlatformRenderInterface factory = PerspexLocator.Current.GetService(); - PlatformImpl = factory.CreateBitmap(width, height); - } - /// /// Initializes a new instance of the class. /// diff --git a/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs b/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs index 20fc55ebd8..289cde69b5 100644 --- a/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs +++ b/src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs @@ -48,10 +48,5 @@ namespace Perspex.Media.Imaging } public DrawingContext CreateDrawingContext() => PlatformImpl.CreateDrawingContext(); - - void IRenderTarget.Resize(int width, int height) - { - throw new NotSupportedException(); - } } } diff --git a/src/Perspex.SceneGraph/Platform/IPlatformRenderInterface.cs b/src/Perspex.SceneGraph/Platform/IPlatformRenderInterface.cs index e79da32923..ccf55104a8 100644 --- a/src/Perspex.SceneGraph/Platform/IPlatformRenderInterface.cs +++ b/src/Perspex.SceneGraph/Platform/IPlatformRenderInterface.cs @@ -11,14 +11,6 @@ namespace Perspex.Platform /// public interface IPlatformRenderInterface { - /// - /// Creates a bitmap implementation. - /// - /// The width of the bitmap. - /// The height of the bitmap. - /// An . - IBitmapImpl CreateBitmap(int width, int height); - /// /// Creates a formatted text implementation. /// @@ -50,7 +42,7 @@ namespace Perspex.Platform /// The initial width of the render. /// The initial height of the render. /// An . - IRenderTarget CreateRenderer(IPlatformHandle handle, double width, double height); + IRenderTarget CreateRenderer(IPlatformHandle handle); /// /// Creates a render target bitmap implementation. diff --git a/src/Perspex.SceneGraph/Platform/IRenderTarget.cs b/src/Perspex.SceneGraph/Platform/IRenderTarget.cs index a5c8f71d79..e6a167c1ae 100644 --- a/src/Perspex.SceneGraph/Platform/IRenderTarget.cs +++ b/src/Perspex.SceneGraph/Platform/IRenderTarget.cs @@ -18,12 +18,5 @@ namespace Perspex.Platform /// Creates an for a rendering session. /// DrawingContext CreateDrawingContext(); - - /// - /// Resizes the rendered viewport. - /// - /// The new width. - /// The new height. - void Resize(int width, int height); } } diff --git a/src/Skia/Perspex.Skia.Android/SkiaView.cs b/src/Skia/Perspex.Skia.Android/SkiaView.cs index 934d282e2b..c261f1d3fe 100644 --- a/src/Skia/Perspex.Skia.Android/SkiaView.cs +++ b/src/Skia/Perspex.Skia.Android/SkiaView.cs @@ -59,7 +59,6 @@ namespace Perspex.Skia.Android public void SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) { Log.Info("PERSPEX", "Surface Changed"); - _renderTarget.Resize(width, height); Draw(); } @@ -68,7 +67,7 @@ namespace Perspex.Skia.Android Log.Info("PERSPEX", "Surface Created"); _renderTarget = PerspexLocator.Current.GetService() - .CreateRenderer(new PlatformHandle(holder.Surface.Handle, "Surface"), Width, Height); + .CreateRenderer(new PlatformHandle(holder.Surface.Handle, "Surface")); Draw(); } diff --git a/src/Skia/Perspex.Skia/BitmapImpl.cs b/src/Skia/Perspex.Skia/BitmapImpl.cs index 19c6b2c67f..75c2ae5213 100644 --- a/src/Skia/Perspex.Skia/BitmapImpl.cs +++ b/src/Skia/Perspex.Skia/BitmapImpl.cs @@ -43,11 +43,6 @@ namespace Perspex.Skia new DrawingContextImpl(MethodTable.Instance.RenderTargetCreateRenderingContext(Handle))); } - public void Resize(int width, int height) - { - MethodTable.Instance.ResizeBitmap(Handle, PixelWidth = Math.Max(1, width), PixelHeight = Math.Max(1, height)); - } - public BitmapImpl(IntPtr handle, int width, int height) : base(handle) { PixelHeight = height; diff --git a/src/Skia/Perspex.Skia/MethodTable.cs b/src/Skia/Perspex.Skia/MethodTable.cs index cabe262569..ee17de4f3a 100644 --- a/src/Skia/Perspex.Skia/MethodTable.cs +++ b/src/Skia/Perspex.Skia/MethodTable.cs @@ -10,20 +10,15 @@ namespace Perspex.Skia internal unsafe abstract class MethodTable { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate IntPtr _CreateRenderTarget(IntPtr nativeHandle, int width, int height); + public delegate IntPtr _CreateWindowRenderTarget(IntPtr nativeHandle); - public _CreateRenderTarget CreateRenderTarget; + public _CreateWindowRenderTarget CreateWindowWindowRenderTarget; [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate IntPtr _RenderTargetCreateRenderingContext(IntPtr target); public _RenderTargetCreateRenderingContext RenderTargetCreateRenderingContext; - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void _RenderTargetResize(IntPtr target, int width, int height); - - public _RenderTargetResize RenderTargetResize; - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void _DisposeRenderTarget(IntPtr target); @@ -106,11 +101,6 @@ namespace Perspex.Skia public _CreateRenderTargetBitmap CreateRenderTargetBitmap; - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void _ResizeBitmap(IntPtr image, int width, int height); - - public _ResizeBitmap ResizeBitmap; - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void _DisposeImage(IntPtr image); @@ -169,9 +159,8 @@ namespace Perspex.Skia private static readonly Type[] TableOrder = new Type[] { - typeof (_CreateRenderTarget), + typeof (_CreateWindowRenderTarget), typeof (_DisposeRenderTarget), - typeof (_RenderTargetResize), typeof (_RenderTargetCreateRenderingContext), typeof (_DisposeRenderingContext), typeof (_DrawRectangle), @@ -189,7 +178,6 @@ namespace Perspex.Skia typeof (_SaveImage), typeof (_DrawImage), typeof (_CreateRenderTargetBitmap), - typeof (_ResizeBitmap), typeof (_DisposeImage), typeof (_GetDrawingContextSettingsPtr), typeof (_CreateTypeface), diff --git a/src/Skia/Perspex.Skia/PlatformRenderInterface.cs b/src/Skia/Perspex.Skia/PlatformRenderInterface.cs index 6e79c1e35c..3b67247081 100644 --- a/src/Skia/Perspex.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Perspex.Skia/PlatformRenderInterface.cs @@ -59,11 +59,7 @@ namespace Perspex.Skia return new BitmapImpl(width, height); } - public IRenderTarget CreateRenderer(IPlatformHandle handle, double width, double height) - { - width = Math.Min(1, width); - height = Math.Min(1, height); - return new RenderTarget(MethodTable.Instance.CreateRenderTarget(handle.Handle, (int) width, (int) height)); - } + public IRenderTarget CreateRenderer(IPlatformHandle handle) + => new RenderTarget(MethodTable.Instance.CreateWindowWindowRenderTarget(handle.Handle)); } } diff --git a/src/Skia/Perspex.Skia/RenderTarget.cs b/src/Skia/Perspex.Skia/RenderTarget.cs index 6d47bf0405..d727146e92 100644 --- a/src/Skia/Perspex.Skia/RenderTarget.cs +++ b/src/Skia/Perspex.Skia/RenderTarget.cs @@ -21,10 +21,5 @@ namespace Perspex.Skia new DrawingContext( new DrawingContextImpl(MethodTable.Instance.RenderTargetCreateRenderingContext(Handle))); } - - public void Resize(int width, int height) - { - MethodTable.Instance.RenderTargetResize(Handle,Math.Max(width, 1), Math.Max(height, 1)); - } } } diff --git a/src/Skia/native.url b/src/Skia/native.url index 61e18108ae..697513ae7a 100644 --- a/src/Skia/native.url +++ b/src/Skia/native.url @@ -1 +1 @@ -https://dl.dropboxusercontent.com/u/18301199/Perspex.Skia/abi-0001.zip +https://dl.dropboxusercontent.com/u/18301199/Perspex.Skia/abi-0002.zip diff --git a/src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs b/src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs index fef168bd27..93c820b26d 100644 --- a/src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs @@ -41,11 +41,11 @@ namespace Perspex.Direct2D1 return new FormattedTextImpl(text, fontFamily, fontSize, fontStyle, textAlignment, fontWeight); } - public IRenderTarget CreateRenderer(IPlatformHandle handle, double width, double height) + public IRenderTarget CreateRenderer(IPlatformHandle handle) { if (handle.HandleDescriptor == "HWND") { - return new RenderTarget(handle.Handle, width, height); + return new RenderTarget(handle.Handle); } else { diff --git a/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs index cf785aa444..38445c0d5b 100644 --- a/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs @@ -39,10 +39,6 @@ namespace Perspex.Direct2D1.Media } public Perspex.Media.DrawingContext CreateDrawingContext() => new RenderTarget(_target).CreateDrawingContext(); - - void IRenderTarget.Resize(int width, int height) - { - throw new NotSupportedException(); - } + } } diff --git a/src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj b/src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj index f8f91ea467..38e9b9ed8e 100644 --- a/src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj +++ b/src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj @@ -69,6 +69,9 @@ Properties\SharedAssemblyInfo.cs + + UnmanagedMethods.cs + diff --git a/src/Windows/Perspex.Direct2D1/RenderTarget.cs b/src/Windows/Perspex.Direct2D1/RenderTarget.cs index 66ffe80448..53a04683d2 100644 --- a/src/Windows/Perspex.Direct2D1/RenderTarget.cs +++ b/src/Windows/Perspex.Direct2D1/RenderTarget.cs @@ -6,6 +6,7 @@ using Perspex.Direct2D1.Media; using Perspex.Media; using Perspex.Platform; using Perspex.Rendering; +using Perspex.Win32.Interop; using SharpDX; using SharpDX.Direct2D1; using DrawingContext = Perspex.Media.DrawingContext; @@ -15,19 +16,25 @@ namespace Perspex.Direct2D1 { public class RenderTarget : IRenderTarget { + private readonly IntPtr _hwnd; + private Size2 _savedSize; + /// /// The render target. /// private readonly SharpDX.Direct2D1.RenderTarget _renderTarget; + + /// /// Initializes a new instance of the class. /// /// The window handle. /// The width of the window. /// The height of the window. - public RenderTarget(IntPtr hwnd, double width, double height) + public RenderTarget(IntPtr hwnd) { + _hwnd = hwnd; Direct2DFactory = PerspexLocator.Current.GetService(); DirectWriteFactory = PerspexLocator.Current.GetService(); @@ -38,7 +45,7 @@ namespace Perspex.Direct2D1 HwndRenderTargetProperties hwndProperties = new HwndRenderTargetProperties { Hwnd = hwnd, - PixelSize = new Size2((int)width, (int)height), + PixelSize = _savedSize = GetWindowSize(), PresentOptions = PresentOptions.Immediately, }; @@ -48,6 +55,13 @@ namespace Perspex.Direct2D1 hwndProperties); } + Size2 GetWindowSize() + { + UnmanagedMethods.RECT rc; + UnmanagedMethods.GetClientRect(_hwnd, out rc); + return new Size2(rc.right - rc.left, rc.bottom - rc.top); + } + /// /// Initializes a new instance of the class. /// @@ -74,31 +88,22 @@ namespace Perspex.Direct2D1 get; } /// - /// Resizes the renderer. + /// Creates a drawing context for a rendering session. /// - /// The new width. - /// The new height. - public void Resize(int width, int height) + /// An . + public DrawingContext CreateDrawingContext() { - WindowRenderTarget window = _renderTarget as WindowRenderTarget; - - if (window == null) + var window = _renderTarget as WindowRenderTarget; + if (window != null) { - throw new InvalidOperationException(string.Format( - "A renderer with a target of type '{0}' cannot be resized.", - _renderTarget.GetType().Name)); + var size = GetWindowSize(); + if (size != _savedSize) + window.Resize(_savedSize = size); } - window.Resize(new Size2(width, height)); + return new DrawingContext(new Media.DrawingContext(_renderTarget, DirectWriteFactory)); } - /// - /// Creates a drawing context for a rendering session. - /// - /// An . - public DrawingContext CreateDrawingContext() - => new DrawingContext(new Media.DrawingContext(_renderTarget, DirectWriteFactory)); - public void Dispose() { _renderTarget.Dispose(); diff --git a/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs index aa7681a27a..80dd0cd672 100644 --- a/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs @@ -5,7 +5,6 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; -using Perspex.Input; // ReSharper disable InconsistentNaming #pragma warning disable 169