Browse Source

Now render targets don't ask for window size

pull/315/head
Nikita Tsukanov 11 years ago
parent
commit
6108b4de18
  1. 4
      src/Gtk/Perspex.Cairo/CairoPlatform.cs
  2. 5
      src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs
  3. 12
      src/Gtk/Perspex.Cairo/RenderTarget.cs
  4. 8
      src/Perspex.Controls/Platform/ITopLevelRenderer.cs
  5. 11
      src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs
  6. 5
      src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs
  7. 10
      src/Perspex.SceneGraph/Platform/IPlatformRenderInterface.cs
  8. 7
      src/Perspex.SceneGraph/Platform/IRenderTarget.cs
  9. 3
      src/Skia/Perspex.Skia.Android/SkiaView.cs
  10. 5
      src/Skia/Perspex.Skia/BitmapImpl.cs
  11. 18
      src/Skia/Perspex.Skia/MethodTable.cs
  12. 8
      src/Skia/Perspex.Skia/PlatformRenderInterface.cs
  13. 5
      src/Skia/Perspex.Skia/RenderTarget.cs
  14. 2
      src/Skia/native.url
  15. 4
      src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs
  16. 6
      src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs
  17. 3
      src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj
  18. 45
      src/Windows/Perspex.Direct2D1/RenderTarget.cs
  19. 1
      src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs

4
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)

5
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();
}
}
}

12
src/Gtk/Perspex.Cairo/RenderTarget.cs

@ -27,7 +27,7 @@ namespace Perspex.Cairo
/// <param name="window">The window.</param>
/// <param name="width">The width of the window.</param>
/// <param name="height">The height of the window.</param>
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;
}
/// <summary>
/// Resizes the renderer.
/// </summary>
/// <param name="width">The new width.</param>
/// <param name="height">The new height.</param>
public void Resize(int width, int height)
{
// Don't need to do anything here.
}
/// <summary>
/// Creates a cairo surface that targets a platform-specific resource.

8
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)))));

11
src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs

@ -31,17 +31,6 @@ namespace Perspex.Media.Imaging
PlatformImpl = factory.LoadBitmap(stream);
}
/// <summary>
/// Initializes a new instance of the <see cref="Bitmap"/> class.
/// </summary>
/// <param name="width">The width of the bitmap, in pixels.</param>
/// <param name="height">The height of the bitmap, in pixels.</param>
public Bitmap(int width, int height)
{
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = factory.CreateBitmap(width, height);
}
/// <summary>
/// Initializes a new instance of the <see cref="Bitmap"/> class.
/// </summary>

5
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();
}
}
}

10
src/Perspex.SceneGraph/Platform/IPlatformRenderInterface.cs

@ -11,14 +11,6 @@ namespace Perspex.Platform
/// </summary>
public interface IPlatformRenderInterface
{
/// <summary>
/// Creates a bitmap implementation.
/// </summary>
/// <param name="width">The width of the bitmap.</param>
/// <param name="height">The height of the bitmap.</param>
/// <returns>An <see cref="IBitmapImpl"/>.</returns>
IBitmapImpl CreateBitmap(int width, int height);
/// <summary>
/// Creates a formatted text implementation.
/// </summary>
@ -50,7 +42,7 @@ namespace Perspex.Platform
/// <param name="width">The initial width of the render.</param>
/// <param name="height">The initial height of the render.</param>
/// <returns>An <see cref="IRenderTarget"/>.</returns>
IRenderTarget CreateRenderer(IPlatformHandle handle, double width, double height);
IRenderTarget CreateRenderer(IPlatformHandle handle);
/// <summary>
/// Creates a render target bitmap implementation.

7
src/Perspex.SceneGraph/Platform/IRenderTarget.cs

@ -18,12 +18,5 @@ namespace Perspex.Platform
/// Creates an <see cref="DrawingContext"/> for a rendering session.
/// </summary>
DrawingContext CreateDrawingContext();
/// <summary>
/// Resizes the rendered viewport.
/// </summary>
/// <param name="width">The new width.</param>
/// <param name="height">The new height.</param>
void Resize(int width, int height);
}
}

3
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<IPlatformRenderInterface>()
.CreateRenderer(new PlatformHandle(holder.Surface.Handle, "Surface"), Width, Height);
.CreateRenderer(new PlatformHandle(holder.Surface.Handle, "Surface"));
Draw();
}

5
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;

18
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),

8
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));
}
}

5
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));
}
}
}

2
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

4
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
{

6
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();
}
}
}

3
src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj

@ -69,6 +69,9 @@
<Compile Include="..\..\Shared\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="..\Perspex.Win32\Interop\UnmanagedMethods.cs">
<Link>UnmanagedMethods.cs</Link>
</Compile>
<Compile Include="Direct2D1Platform.cs" />
<Compile Include="Disposable.cs" />
<Compile Include="Media\BrushImpl.cs" />

45
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;
/// <summary>
/// The render target.
/// </summary>
private readonly SharpDX.Direct2D1.RenderTarget _renderTarget;
/// <summary>
/// Initializes a new instance of the <see cref="RenderTarget"/> class.
/// </summary>
/// <param name="hwnd">The window handle.</param>
/// <param name="width">The width of the window.</param>
/// <param name="height">The height of the window.</param>
public RenderTarget(IntPtr hwnd, double width, double height)
public RenderTarget(IntPtr hwnd)
{
_hwnd = hwnd;
Direct2DFactory = PerspexLocator.Current.GetService<Factory>();
DirectWriteFactory = PerspexLocator.Current.GetService<DwFactory>();
@ -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);
}
/// <summary>
/// Initializes a new instance of the <see cref="RenderTarget"/> class.
/// </summary>
@ -74,31 +88,22 @@ namespace Perspex.Direct2D1
get; }
/// <summary>
/// Resizes the renderer.
/// Creates a drawing context for a rendering session.
/// </summary>
/// <param name="width">The new width.</param>
/// <param name="height">The new height.</param>
public void Resize(int width, int height)
/// <returns>An <see cref="Perspex.Media.DrawingContext"/>.</returns>
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));
}
/// <summary>
/// Creates a drawing context for a rendering session.
/// </summary>
/// <returns>An <see cref="Perspex.Media.DrawingContext"/>.</returns>
public DrawingContext CreateDrawingContext()
=> new DrawingContext(new Media.DrawingContext(_renderTarget, DirectWriteFactory));
public void Dispose()
{
_renderTarget.Dispose();

1
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

Loading…
Cancel
Save