Browse Source

Unify window and bitmap rendering

pull/228/head
Nikita Tsukanov 11 years ago
parent
commit
9107a6e9a8
  1. 21
      src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs
  2. 2
      src/Gtk/Perspex.Cairo/Media/TileBrushes.cs
  3. 15
      src/Gtk/Perspex.Cairo/RenderTarget.cs
  4. 4
      src/Gtk/Perspex.Gtk/WindowImpl.cs
  5. 2
      src/Perspex.Controls/Platform/ITopLevelImpl.cs
  6. 4
      src/Perspex.Controls/Platform/ITopLevelRenderer.cs
  7. 1
      src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs
  8. 4
      src/Perspex.SceneGraph/Platform/IRenderTarget.cs
  9. 10
      src/Perspex.SceneGraph/Platform/IRenderTargetBitmapImpl.cs
  10. 15
      src/Perspex.SceneGraph/Rendering/RendererBase.cs
  11. 8
      src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs
  12. 2
      src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs
  13. 3
      src/Windows/Perspex.Direct2D1/RenderTarget.cs
  14. 4
      src/Windows/Perspex.Win32/WindowImpl.cs

21
src/Gtk/Perspex.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using Perspex.Media;
using Perspex.Platform;
using Perspex.Rendering;
@ -11,10 +12,12 @@ namespace Perspex.Cairo.Media.Imaging
public class RenderTargetBitmapImpl : IRenderTargetBitmapImpl
{
private readonly RenderTarget _renderTarget;
public RenderTargetBitmapImpl(Cairo.ImageSurface surface)
{
Surface = surface;
renderTarget = new RenderTarget(Surface);
_renderTarget = new RenderTarget(Surface);
}
public int PixelWidth => Surface.Width;
@ -23,7 +26,7 @@ namespace Perspex.Cairo.Media.Imaging
public void Dispose()
{
renderTarget.Dispose();
_renderTarget.Dispose();
}
public Cairo.ImageSurface Surface
@ -31,15 +34,19 @@ namespace Perspex.Cairo.Media.Imaging
get;
}
private RenderTarget renderTarget;
public void Render(IVisual visual)
public void Save(string fileName)
{
renderTarget.Render(visual, new PlatformHandle(IntPtr.Zero, "RTB"));
Surface.WriteToPng(fileName);
}
public void Save(string fileName)
public IDrawingContext CreateDrawingContext()
{
Surface.WriteToPng(fileName);
return _renderTarget.CreateDrawingContext();
}
void IRenderTarget.Resize(int width, int height)
{
throw new NotSupportedException();
}
}
}

2
src/Gtk/Perspex.Cairo/Media/TileBrushes.cs

@ -116,7 +116,7 @@ namespace Perspex.Cairo.Media
context.Rectangle(drawRect.ToCairo());
context.Clip();
context.Transform(transform.ToCairo());
renderer.Render(visual, new PlatformHandle(IntPtr.Zero, "RTB"), transform, drawRect);
renderer.Render(visual, transform, drawRect);
var result = new SurfacePattern(intermediate);

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

@ -17,6 +17,7 @@ namespace Perspex.Cairo
/// </summary>
public class RenderTarget : IRenderTarget
{
private readonly IPlatformHandle _handle;
private readonly Surface _surface;
private Gdk.Window _window;
@ -28,6 +29,7 @@ namespace Perspex.Cairo
/// <param name="height">The height of the window.</param>
public RenderTarget(IPlatformHandle handle, double width, double height)
{
_handle = handle;
}
public RenderTarget(ImageSurface surface)
@ -51,21 +53,22 @@ namespace Perspex.Cairo
/// </summary>
/// <param name="handle">The platform-specific handle.</param>
/// <returns>A surface wrapped in an <see cref="IDrawingContext"/>.</returns>
public IDrawingContext CreateDrawingContext(IPlatformHandle handle)
public IDrawingContext CreateDrawingContext()
{
switch (handle.HandleDescriptor)
if(_surface != null)
return new DrawingContext(_surface);
switch (_handle.HandleDescriptor)
{
case "RTB":
return new DrawingContext(_surface);
case "GdkWindow":
if (_window == null)
_window = new Gdk.Window(handle.Handle);
_window = new Gdk.Window(_handle.Handle);
return new DrawingContext(_window);
default:
throw new NotSupportedException(string.Format(
"Don't know how to create a Cairo renderer from a '{0}' handle",
handle.HandleDescriptor));
_handle.HandleDescriptor));
}
}

4
src/Gtk/Perspex.Gtk/WindowImpl.cs

@ -83,7 +83,7 @@ namespace Perspex.Gtk
public Action<RawInputEventArgs> Input { get; set; }
public Action<Rect, IPlatformHandle> Paint { get; set; }
public Action<Rect> Paint { get; set; }
public Action<Size> Resized { get; set; }
@ -223,7 +223,7 @@ namespace Perspex.Gtk
protected override bool OnExposeEvent(EventExpose evnt)
{
Paint(evnt.Area.ToPerspex(), GetHandle(evnt.Window));
Paint(evnt.Area.ToPerspex());
return true;
}

2
src/Perspex.Controls/Platform/ITopLevelImpl.cs

@ -22,7 +22,7 @@ namespace Perspex.Platform
Action<RawInputEventArgs> Input { get; set; }
Action<Rect, IPlatformHandle> Paint { get; set; }
Action<Rect> Paint { get; set; }
Action<Size> Resized { get; set; }

4
src/Perspex.Controls/Platform/ITopLevelRenderer.cs

@ -44,9 +44,9 @@ namespace Perspex.Controls.Platform
resources.Add(queueManager.RenderNeeded.Subscribe(_
=> topLevel.PlatformImpl.Invalidate(new Rect(topLevel.ClientSize))));
topLevel.PlatformImpl.Paint = (rect, handle) =>
topLevel.PlatformImpl.Paint = rect =>
{
viewport.Render(topLevel, handle);
viewport.Render(topLevel);
queueManager.RenderFinished();
};

1
src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs

@ -3,6 +3,7 @@
using System;
using Perspex.Platform;
using Perspex.Rendering;
namespace Perspex.Media.Imaging
{

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

@ -20,9 +20,7 @@ namespace Perspex.Platform
/// <summary>
/// Creates an <see cref="IDrawingContext"/> for a rendering session.
/// </summary>
/// <param name="handle">The handle to use to create the context.</param>
/// <returns>An <see cref="IDrawingContext"/>.</returns>
IDrawingContext CreateDrawingContext(IPlatformHandle target);
IDrawingContext CreateDrawingContext();
/// <summary>
/// Resizes the rendered viewport.

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

@ -9,15 +9,7 @@ namespace Perspex.Platform
/// Defines the platform-specific interface for a
/// <see cref="Perspex.Media.Imaging.RenderTargetBitmap"/>.
/// </summary>
public interface IRenderTargetBitmapImpl : IBitmapImpl, IDisposable
public interface IRenderTargetBitmapImpl : IBitmapImpl, IRenderTarget
{
/// <summary>
/// Renders an <see cref="IVisual"/> into the bitmap.
/// </summary>
/// <param name="visual">The visual to render.</param>
/// <remarks>
/// Before calling this method, ensure that <paramref name="visual"/> has been measured.
/// </remarks>
void Render(IVisual visual);
}
}

15
src/Perspex.SceneGraph/Rendering/RendererBase.cs

@ -21,10 +21,9 @@ namespace Perspex.Rendering
/// </summary>
/// <param name="renderTarget">IRenderer instance</param>
/// <param name="visual">The visual to render.</param>
/// <param name="target">An optional platform-specific handle.</param>
public static void Render(this IRenderTarget renderTarget, IVisual visual, IPlatformHandle target)
public static void Render(this IRenderTarget renderTarget, IVisual visual)
{
using (var ctx = renderTarget.CreateDrawingContext(target))
using (var ctx = renderTarget.CreateDrawingContext())
ctx.Render(visual);
}
@ -32,13 +31,12 @@ namespace Perspex.Rendering
/// Renders the specified visual.
/// </summary>
/// <param name="renderTarget">IRenderer instance</param>
/// <param name="target">An optional platform-specific handle.</param>
/// <param name="visual">The visual to render.</param>
/// <param name="translation">The current translation.</param>
/// <param name="transform">The current transform.</param>
public static void Render(this IRenderTarget renderTarget, IVisual visual, IPlatformHandle target, Matrix translation, Matrix transform)
public static void Render(this IRenderTarget renderTarget, IVisual visual, Matrix translation, Matrix transform)
{
using (var ctx = renderTarget.CreateDrawingContext(target))
using (var ctx = renderTarget.CreateDrawingContext())
ctx.Render(visual, translation, transform);
}
@ -46,13 +44,12 @@ namespace Perspex.Rendering
/// Renders the specified visual with the specified transform and clip.
/// </summary>
/// <param name="renderTarget">IRenderer instance</param>
/// <param name="target">An optional platform-specific handle.</param>
/// <param name="visual">The visual to render.</param>
/// <param name="transform">The transform.</param>
/// <param name="clip">An optional clip rectangle.</param>
public static void Render(this IRenderTarget renderTarget, IVisual visual, IPlatformHandle target, Matrix transform, Rect? clip = null)
public static void Render(this IRenderTarget renderTarget, IVisual visual, Matrix transform, Rect? clip = null)
{
using (var context = renderTarget.CreateDrawingContext(target))
using (var context = renderTarget.CreateDrawingContext())
context.Render(visual, transform, clip);
}

8
src/Windows/Perspex.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using Perspex.Media;
using Perspex.Platform;
using Perspex.Rendering;
using SharpDX.Direct2D1;
@ -37,10 +38,11 @@ namespace Perspex.Direct2D1.Media
// TODO:
}
public void Render(IVisual visual)
public IDrawingContext CreateDrawingContext() => new RenderTarget(_target).CreateDrawingContext();
void IRenderTarget.Resize(int width, int height)
{
RenderTarget renderTarget = new RenderTarget(_target);
renderTarget.Render(visual, null);
throw new NotSupportedException();
}
}
}

2
src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs

@ -53,7 +53,7 @@ namespace Perspex.Direct2D1.Media
out drawRect);
var renderer = new RenderTarget(intermediate);
renderer.Render(visual, null, transform, drawRect);
renderer.Render(visual, transform, drawRect);
this.PlatformBrush = new BitmapBrush(
target,

3
src/Windows/Perspex.Direct2D1/RenderTarget.cs

@ -94,9 +94,8 @@ namespace Perspex.Direct2D1
/// <summary>
/// Creates a drawing context for a rendering session.
/// </summary>
/// <param name="handle">The platform handle. Unused.</param>
/// <returns>An <see cref="IDrawingContext"/>.</returns>
public IDrawingContext CreateDrawingContext(IPlatformHandle handle)
public IDrawingContext CreateDrawingContext()
{
return new DrawingContext(_renderTarget, DirectWriteFactory);
}

4
src/Windows/Perspex.Win32/WindowImpl.cs

@ -51,7 +51,7 @@ namespace Perspex.Win32
public Action<RawInputEventArgs> Input { get; set; }
public Action<Rect, IPlatformHandle> Paint { get; set; }
public Action<Rect> Paint { get; set; }
public Action<Size> Resized { get; set; }
@ -405,7 +405,7 @@ namespace Perspex.Win32
{
UnmanagedMethods.RECT r;
UnmanagedMethods.GetUpdateRect(_hwnd, out r, false);
Paint(new Rect(r.left, r.top, r.right - r.left, r.bottom - r.top), Handle);
Paint(new Rect(r.left, r.top, r.right - r.left, r.bottom - r.top));
UnmanagedMethods.EndPaint(_hwnd, ref ps);
}
}

Loading…
Cancel
Save