|
|
|
@ -18,8 +18,7 @@ namespace Avalonia.Win32 |
|
|
|
{ |
|
|
|
private readonly IntPtr _handle; |
|
|
|
private IntPtr _pBitmap; |
|
|
|
UnmanagedMethods.BITMAPINFOHEADER _bmpInfo; |
|
|
|
|
|
|
|
private UnmanagedMethods.BITMAPINFOHEADER _bmpInfo; |
|
|
|
|
|
|
|
public WindowFramebuffer(IntPtr handle, int width, int height) |
|
|
|
{ |
|
|
|
@ -38,7 +37,38 @@ namespace Avalonia.Win32 |
|
|
|
_pBitmap = Marshal.AllocHGlobal(width * height * 4); |
|
|
|
} |
|
|
|
|
|
|
|
~WindowFramebuffer() |
|
|
|
{ |
|
|
|
Deallocate(); |
|
|
|
} |
|
|
|
|
|
|
|
public IntPtr Address => _pBitmap; |
|
|
|
public int RowBytes => Width * 4; |
|
|
|
public PixelFormat Format => PixelFormat.Bgra8888; |
|
|
|
|
|
|
|
public Size Dpi |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
if (UnmanagedMethods.ShCoreAvailable) |
|
|
|
{ |
|
|
|
uint dpix, dpiy; |
|
|
|
|
|
|
|
var monitor = UnmanagedMethods.MonitorFromWindow(_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 int Width => _bmpInfo.biWidth; |
|
|
|
|
|
|
|
@ -73,11 +103,9 @@ namespace Avalonia.Win32 |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
//It's not an *actual* dispose. This call meand "We are done drawing"
|
|
|
|
//It's not an *actual* dispose. This call means "We are done drawing"
|
|
|
|
DrawToWindow(_handle); |
|
|
|
} |
|
|
|
|
|
|
|
@ -89,38 +117,5 @@ namespace Avalonia.Win32 |
|
|
|
_pBitmap = IntPtr.Zero; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
~WindowFramebuffer() |
|
|
|
{ |
|
|
|
Deallocate(); |
|
|
|
} |
|
|
|
|
|
|
|
public IntPtr Address => _pBitmap; |
|
|
|
public int RowBytes => Width * 4; |
|
|
|
public PixelFormat Format => PixelFormat.Bgra8888; |
|
|
|
|
|
|
|
public Size Dpi |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
if (UnmanagedMethods.ShCoreAvailable) |
|
|
|
{ |
|
|
|
uint dpix, dpiy; |
|
|
|
|
|
|
|
var monitor = UnmanagedMethods.MonitorFromWindow(_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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |