Browse Source

Skia.Android refactorng

pull/321/head
Nikita Tsukanov 11 years ago
parent
commit
346cfbb563
  1. 2
      src/Skia/Perspex.Skia.Android.TestApp/MainActivity.cs
  2. 64
      src/Skia/Perspex.Skia.Android/AndroidRenderTarget.cs
  3. 2
      src/Skia/Perspex.Skia.Android/Perspex.Skia.Android.csproj
  4. 39
      src/Skia/Perspex.Skia.Android/SkiaRenderView.cs
  5. 19
      src/Skia/Perspex.Skia.Android/SkiaView.cs
  6. 2
      src/Skia/Perspex.Skia/MethodTable.cs
  7. 2
      src/Skia/Perspex.Skia/PlatformRenderInterface.cs
  8. 4
      src/Skia/Perspex.Skia/RenderTarget.cs

2
src/Skia/Perspex.Skia.Android.TestApp/MainActivity.cs

@ -23,7 +23,7 @@ namespace Perspex.Skia.Android.TestApp
SetContentView(new MainView(this));
}
class MainView : SkiaView
class MainView : SkiaRenderView
{
float _radians = 0;
public MainView(Activity context) : base(context)

64
src/Skia/Perspex.Skia.Android/AndroidRenderTarget.cs

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Perspex.Media;
using Perspex.Platform;
namespace Perspex.Skia
{
class RenderTarget : IRenderTarget
{
private IntPtr _currentRenderTarget = IntPtr.Zero;
private Surface _currentSurface = null;
private SurfaceView _view = null;
public RenderTarget(IPlatformHandle handle)
{
_view = (SurfaceView) handle;
}
public void Dispose()
{
if (_currentRenderTarget != IntPtr.Zero)
{
MethodTable.Instance.DisposeRenderTarget(_currentRenderTarget);
_currentRenderTarget = IntPtr.Zero;
GC.SuppressFinalize(this);
}
}
~RenderTarget()
{
Dispose();
}
public DrawingContext CreateDrawingContext()
{
var surface = _view.Holder.Surface;
if (surface == null)
throw new InvalidOperationException("Surface isn't available");
if (_currentSurface != surface)
{
_currentSurface = null;
if (_currentRenderTarget != IntPtr.Zero)
{
MethodTable.Instance.DisposeRenderTarget(_currentRenderTarget);
_currentRenderTarget = IntPtr.Zero;
}
_currentRenderTarget = MethodTable.Instance.CreateWindowRenderTarget(surface.Handle);
_currentSurface = surface;
}
return new DrawingContext(
new DrawingContextImpl(MethodTable.Instance.RenderTargetCreateRenderingContext(_currentRenderTarget)));
}
}
}

2
src/Skia/Perspex.Skia.Android/Perspex.Skia.Android.csproj

@ -82,7 +82,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="AndroidRenderTarget.cs" />
<Compile Include="MethodTable.cs" />
<Compile Include="SkiaRenderView.cs" />
<Compile Include="SkiaView.cs" />
</ItemGroup>
<ItemGroup>

39
src/Skia/Perspex.Skia.Android/SkiaRenderView.cs

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Perspex.Media;
using Perspex.Platform;
namespace Perspex.Skia.Android
{
public abstract class SkiaRenderView : SkiaView
{
private IRenderTarget _renderTarget;
public SkiaRenderView(Activity context) : base(context)
{
_renderTarget =
PerspexLocator.Current.GetService<IPlatformRenderInterface>()
.CreateRenderer(this);
}
protected override void Draw()
{
if (_renderTarget == null)
return;
using (var ctx = _renderTarget.CreateDrawingContext())
OnRender(ctx);
}
protected abstract void OnRender(DrawingContext ctx);
}
}

19
src/Skia/Perspex.Skia.Android/SkiaView.cs

@ -16,7 +16,7 @@ using Perspex.Platform;
namespace Perspex.Skia.Android
{
public abstract class SkiaView : SurfaceView, ISurfaceHolderCallback
public abstract class SkiaView : SurfaceView, ISurfaceHolderCallback, IPlatformHandle
{
private readonly Activity _context;
bool _invalidateQueued;
@ -27,7 +27,6 @@ namespace Perspex.Skia.Android
SkiaPlatform.Initialize();
Holder.AddCallback(this);
}
private IRenderTarget _renderTarget;
public override void Invalidate()
{
@ -65,27 +64,15 @@ namespace Perspex.Skia.Android
public void SurfaceCreated(ISurfaceHolder holder)
{
Log.Info("PERSPEX", "Surface Created");
_renderTarget =
PerspexLocator.Current.GetService<IPlatformRenderInterface>()
.CreateRenderer(new PlatformHandle(holder.Surface.Handle, "Surface"));
Draw();
}
public void SurfaceDestroyed(ISurfaceHolder holder)
{
Log.Info("PERSPEX", "Surface Destroyed");
_renderTarget.Dispose();
_renderTarget = null;
}
void Draw()
{
if(_renderTarget == null)
return;
using (var ctx = _renderTarget.CreateDrawingContext())
OnRender(ctx);
}
protected abstract void OnRender(DrawingContext ctx);
protected abstract void Draw();
public string HandleDescriptor => "SurfaceView";
}
}

2
src/Skia/Perspex.Skia/MethodTable.cs

@ -12,7 +12,7 @@ namespace Perspex.Skia
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate IntPtr _CreateWindowRenderTarget(IntPtr nativeHandle);
public _CreateWindowRenderTarget CreateWindowWindowRenderTarget;
public _CreateWindowRenderTarget CreateWindowRenderTarget;
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate IntPtr _RenderTargetCreateRenderingContext(IntPtr target);

2
src/Skia/Perspex.Skia/PlatformRenderInterface.cs

@ -60,6 +60,6 @@ namespace Perspex.Skia
}
public IRenderTarget CreateRenderer(IPlatformHandle handle)
=> new RenderTarget(MethodTable.Instance.CreateWindowWindowRenderTarget(handle.Handle));
=> new RenderTarget(handle);
}
}

4
src/Skia/Perspex.Skia/RenderTarget.cs

@ -7,9 +7,10 @@ using Perspex.Platform;
namespace Perspex.Skia
{
#if !__ANDROID__
class RenderTarget : PerspexHandleHolder, IRenderTarget
{
public RenderTarget(IntPtr handle) : base(handle)
public RenderTarget(IPlatformHandle handle) : base(MethodTable.Instance.CreateWindowRenderTarget(handle.Handle))
{
}
@ -22,4 +23,5 @@ namespace Perspex.Skia
new DrawingContextImpl(MethodTable.Instance.RenderTargetCreateRenderingContext(Handle)));
}
}
#endif
}

Loading…
Cancel
Save