1 changed files with 0 additions and 170 deletions
@ -1,170 +0,0 @@ |
|||
using System; |
|||
using Avalonia.Media; |
|||
using Avalonia.Platform; |
|||
using SkiaSharp; |
|||
using Avalonia.Rendering; |
|||
#if WIN32
|
|||
using Avalonia.Win32.Interop; |
|||
#endif
|
|||
|
|||
namespace Avalonia.Skia |
|||
{ |
|||
internal partial class RenderTarget : IRenderTarget |
|||
{ |
|||
public SKSurface Surface { get; protected set; } |
|||
|
|||
public virtual IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) |
|||
{ |
|||
return 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
|
|||
} |
|||
|
|||
private Size GetWindowDpiWin32() |
|||
{ |
|||
if (UnmanagedMethods.ShCoreAvailable) |
|||
{ |
|||
uint dpix, dpiy; |
|||
|
|||
var monitor = UnmanagedMethods.MonitorFromWindow( |
|||
_hwnd.Handle, |
|||
UnmanagedMethods.MONITOR.MONITOR_DEFAULTTONEAREST); |
|||
|
|||
if (UnmanagedMethods.GetDpiForMonitor( |
|||
monitor, |
|||
UnmanagedMethods.MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, |
|||
out dpix, |
|||
out dpiy) == 0) |
|||
{ |
|||
return new Size(dpix, dpiy); |
|||
} |
|||
} |
|||
|
|||
return new Size(96, 96); |
|||
} |
|||
|
|||
public override IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) |
|||
{ |
|||
FixSize(); |
|||
|
|||
var canvas = Surface.Canvas; |
|||
canvas.RestoreToCount(0); |
|||
canvas.Save(); |
|||
canvas.Clear(SKColors.Red); |
|||
canvas.ResetMatrix(); |
|||
|
|||
double scale = 1.0; |
|||
|
|||
var runtimeService = AvaloniaLocator.Current.GetService<IRuntimePlatform>(); |
|||
|
|||
if (runtimeService != null) |
|||
{ |
|||
switch (runtimeService.GetRuntimeInfo().OperatingSystem) |
|||
{ |
|||
case OperatingSystemType.WinNT: |
|||
var dpi = GetWindowDpiWin32(); |
|||
scale = dpi.Width / 96.0; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
// TODO: Broken DPI scaling on skia here. Fix this.
|
|||
var result = new WindowDrawingContextImpl(this); |
|||
|
|||
return result; |
|||
} |
|||
|
|||
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(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue