Browse Source

Removed RenderTarget implementation from shared project

pull/770/head
Wiesław Šoltés 9 years ago
parent
commit
0221b8543c
  1. 1
      src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj
  2. 108
      src/Skia/Avalonia.Skia.Android/RenderTarget.cs
  3. 1
      src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj
  4. 132
      src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs
  5. 1
      src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj
  6. 82
      src/Skia/Avalonia.Skia.iOS/RenderTarget.cs
  7. 3
      src/Skia/Avalonia.Skia/Avalonia.Skia.projitems

1
src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj

@ -88,6 +88,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AndroidRenderTarget.cs" />
<Compile Include="RenderTarget.cs" />
<Compile Include="SkiaRenderView.cs" />
<Compile Include="SkiaView.cs" />
</ItemGroup>

108
src/Skia/Avalonia.Skia.Android/RenderTarget.cs

@ -0,0 +1,108 @@
using System;
using Avalonia.Media;
using Avalonia.Platform;
using SkiaSharp;
using Android.Graphics;
using Android.Views;
namespace Avalonia.Skia
{
internal partial class RenderTarget : IRenderTarget
{
public SKSurface Surface { get; protected set; }
public virtual DrawingContext CreateDrawingContext()
{
return
new DrawingContext(
new DrawingContextImpl(Surface.Canvas));
}
public void Dispose()
{
// Nothing to do here.
}
}
internal class WindowRenderTarget : RenderTarget
{
private readonly IPlatformHandle _hwnd;
Bitmap _bitmap;
int Width { get; set; }
int Height { get; set; }
public WindowRenderTarget(IPlatformHandle hwnd)
{
_hwnd = hwnd;
FixSize();
}
private void FixSize()
{
int width, height;
GetPlatformWindowSize(out width, out height);
if (Width == width && Height == height)
return;
Width = width;
Height = height;
if (Surface != null)
{
Surface.Dispose();
}
if (_bitmap != null)
{
_bitmap.Dispose();
}
_bitmap = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);
Surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, _bitmap.LockPixels(), width * 4);
}
private void GetPlatformWindowSize(out int w, out int h)
{
var surfaceView = _hwnd as SurfaceView;
w = surfaceView.Width;
h = surfaceView.Height;
}
public override DrawingContext CreateDrawingContext()
{
FixSize();
var canvas = Surface.Canvas;
canvas.RestoreToCount(0);
canvas.Save();
canvas.Clear(SKColors.Red);
canvas.ResetMatrix();
return
new DrawingContext(
new WindowDrawingContextImpl(this));
}
public void Present()
{
var surfaceView = _hwnd as SurfaceView;
Canvas canvas = null;
try
{
canvas = surfaceView.Holder.LockCanvas(null);
_bitmap.UnlockPixels();
canvas.DrawBitmap(_bitmap, 0, 0, null);
}
catch (Exception)
{
}
finally
{
if (canvas != null)
surfaceView.Holder.UnlockCanvasAndPost(canvas);
}
_bitmap.UnlockPixels();
}
}
}

1
src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj

@ -76,6 +76,7 @@
<Compile Include="..\..\Windows\Avalonia.Win32\Interop\UnmanagedMethods.cs">
<Link>UnmanagedMethods.cs</Link>
</Compile>
<Compile Include="RenderTarget.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Avalonia.Animation\Avalonia.Animation.csproj">

132
src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs

@ -0,0 +1,132 @@
using System;
using Avalonia.Media;
using Avalonia.Platform;
using SkiaSharp;
#if WIN32
using Avalonia.Win32.Interop;
#endif
namespace Avalonia.Skia
{
internal partial class RenderTarget : IRenderTarget
{
public SKSurface Surface { get; protected set; }
public virtual DrawingContext CreateDrawingContext()
{
return
new DrawingContext(
new DrawingContextImpl(Surface.Canvas));
}
public void Dispose()
{
// Nothing to do here.
}
}
internal class WindowRenderTarget : RenderTarget
{
private readonly IPlatformHandle _hwnd;
SKBitmap _bitmap;
int Width { get; set; }
int Height { get; set; }
public WindowRenderTarget(IPlatformHandle hwnd)
{
_hwnd = hwnd;
FixSize();
}
private void FixSize()
{
int width, height;
GetPlatformWindowSize(out width, out height);
if (Width == width && Height == height)
return;
Width = width;
Height = height;
if (Surface != null)
{
Surface.Dispose();
}
if (_bitmap != null)
{
_bitmap.Dispose();
}
_bitmap = new SKBitmap(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul);
IntPtr length;
var pixels = _bitmap.GetPixels(out length);
// Wrap the bitmap in a Surface and keep it cached
Surface = SKSurface.Create(_bitmap.Info, pixels, _bitmap.RowBytes);
}
private void GetPlatformWindowSize(out int w, out int h)
{
#if WIN32
UnmanagedMethods.RECT rc;
UnmanagedMethods.GetClientRect(_hwnd.Handle, out rc);
w = rc.right - rc.left;
h = rc.bottom - rc.top;
#else
throw new NotImplementedException();
#endif
}
public override DrawingContext CreateDrawingContext()
{
FixSize();
var canvas = Surface.Canvas;
canvas.RestoreToCount(0);
canvas.Save();
canvas.Clear(SKColors.Red);
canvas.ResetMatrix();
return
new DrawingContext(
new WindowDrawingContextImpl(this));
}
public void Present()
{
_bitmap.LockPixels();
IntPtr length;
var pixels = _bitmap.GetPixels(out length);
#if WIN32
UnmanagedMethods.BITMAPINFO bmi = new UnmanagedMethods.BITMAPINFO();
bmi.biSize = UnmanagedMethods.SizeOf_BITMAPINFOHEADER;
bmi.biWidth = _bitmap.Width;
bmi.biHeight = -_bitmap.Height; // top-down image
bmi.biPlanes = 1;
bmi.biBitCount = 32;
bmi.biCompression = (uint)UnmanagedMethods.BitmapCompressionMode.BI_RGB;
bmi.biSizeImage = 0;
IntPtr hdc = UnmanagedMethods.GetDC(_hwnd.Handle);
int ret = UnmanagedMethods.SetDIBitsToDevice(hdc,
0, 0,
(uint)_bitmap.Width, (uint)_bitmap.Height,
0, 0,
0, (uint)_bitmap.Height,
pixels,
ref bmi,
(uint)UnmanagedMethods.DIBColorTable.DIB_RGB_COLORS);
UnmanagedMethods.ReleaseDC(_hwnd.Handle, hdc);
#else
throw new NotImplementedException();
#endif
_bitmap.UnlockPixels();
}
}
}

1
src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj

@ -37,6 +37,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Compile Include="RenderTarget.cs" />
<Compile Include="SkiaView.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

82
src/Skia/Avalonia.Skia/RenderTarget.cs → src/Skia/Avalonia.Skia.iOS/RenderTarget.cs

@ -2,18 +2,8 @@ using System;
using Avalonia.Media;
using Avalonia.Platform;
using SkiaSharp;
// TODO: I'm not sure the best way to bring in the platform specific rendering
#if __IOS__
using CoreGraphics;
using UIKit;
#elif WIN32
using Avalonia.Win32.Interop;
#elif __ANDROID__
using Android.Graphics;
using Android.Views;
#endif
namespace Avalonia.Skia
{
@ -37,11 +27,7 @@ namespace Avalonia.Skia
internal class WindowRenderTarget : RenderTarget
{
private readonly IPlatformHandle _hwnd;
#if __ANDROID__
Bitmap _bitmap;
#else
SKBitmap _bitmap;
#endif
int Width { get; set; }
int Height { get; set; }
@ -51,7 +37,6 @@ namespace Avalonia.Skia
FixSize();
}
#if __IOS__
private CGRect GetApplicationFrame()
{
// if we are excluding Status Bar then we use ApplicationFrame
@ -68,7 +53,6 @@ namespace Avalonia.Skia
return UIScreen.MainScreen.Bounds;
}
}
#endif
private void FixSize()
{
@ -90,10 +74,6 @@ namespace Avalonia.Skia
_bitmap.Dispose();
}
#if __ANDROID__
_bitmap = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);
Surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, _bitmap.LockPixels(), width * 4);
#else
_bitmap = new SKBitmap(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul);
IntPtr length;
@ -101,28 +81,13 @@ namespace Avalonia.Skia
// Wrap the bitmap in a Surface and keep it cached
Surface = SKSurface.Create(_bitmap.Info, pixels, _bitmap.RowBytes);
#endif
}
private void GetPlatformWindowSize(out int w, out int h)
{
#if __IOS__
var bounds = GetApplicationFrame();
w = (int)bounds.Width;
h = (int)bounds.Height;
#elif WIN32
UnmanagedMethods.RECT rc;
UnmanagedMethods.GetClientRect(_hwnd.Handle, out rc);
w = rc.right - rc.left;
h = rc.bottom - rc.top;
#elif __ANDROID__
var surfaceView = _hwnd as SurfaceView;
w = surfaceView.Width;
h = surfaceView.Height;
#else
throw new NotImplementedException();
#endif
}
public override DrawingContext CreateDrawingContext()
@ -133,10 +98,8 @@ namespace Avalonia.Skia
canvas.RestoreToCount(0);
canvas.Save();
#if __IOS__
var screenScale = UIScreen.MainScreen.Scale;
canvas.Scale((float)screenScale, (float)screenScale);
#endif
canvas.Clear(SKColors.Red);
canvas.ResetMatrix();
@ -148,13 +111,10 @@ namespace Avalonia.Skia
public void Present()
{
#if !__ANDROID__
_bitmap.LockPixels();
IntPtr length;
var pixels = _bitmap.GetPixels(out length);
#endif
#if __IOS__
const int bitmapInfo = ((int)CGBitmapFlags.ByteOrder32Big) | ((int)CGImageAlphaInfo.PremultipliedLast);
var bounds = GetApplicationFrame();
var statusBarOffset = UIScreen.MainScreen.Bounds.Height - bounds.Height;
@ -170,49 +130,7 @@ namespace Avalonia.Skia
context.DrawImage(bounds, image);
}
#elif WIN32
UnmanagedMethods.BITMAPINFO bmi = new UnmanagedMethods.BITMAPINFO();
bmi.biSize = UnmanagedMethods.SizeOf_BITMAPINFOHEADER;
bmi.biWidth = _bitmap.Width;
bmi.biHeight = -_bitmap.Height; // top-down image
bmi.biPlanes = 1;
bmi.biBitCount = 32;
bmi.biCompression = (uint)UnmanagedMethods.BitmapCompressionMode.BI_RGB;
bmi.biSizeImage = 0;
IntPtr hdc = UnmanagedMethods.GetDC(_hwnd.Handle);
int ret = UnmanagedMethods.SetDIBitsToDevice(hdc,
0, 0,
(uint)_bitmap.Width, (uint)_bitmap.Height,
0, 0,
0, (uint)_bitmap.Height,
pixels,
ref bmi,
(uint)UnmanagedMethods.DIBColorTable.DIB_RGB_COLORS);
UnmanagedMethods.ReleaseDC(_hwnd.Handle, hdc);
#elif __ANDROID__
var surfaceView = _hwnd as SurfaceView;
Canvas canvas = null;
try
{
canvas = surfaceView.Holder.LockCanvas(null);
_bitmap.UnlockPixels();
canvas.DrawBitmap(_bitmap, 0, 0, null);
}
catch (Exception)
{
}
finally
{
if (canvas != null)
surfaceView.Holder.UnlockCanvasAndPost(canvas);
}
#endif
_bitmap.UnlockPixels();
}
}
}

3
src/Skia/Avalonia.Skia/Avalonia.Skia.projitems

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
@ -13,7 +13,6 @@
<Compile Include="$(MSBuildThisFileDirectory)DrawingContextImpl.cs" />
<Compile Include="$(MSBuildThisFileDirectory)FormattedTextImpl.cs" />
<Compile Include="$(MSBuildThisFileDirectory)PlatformRenderInterface.cs" />
<Compile Include="$(MSBuildThisFileDirectory)RenderTarget.cs" />
<Compile Include="$(MSBuildThisFileDirectory)SkiaPlatform.cs" />
<Compile Include="$(MSBuildThisFileDirectory)SkiaSharpExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StreamGeometryImpl.cs" />

Loading…
Cancel
Save