4 changed files with 61 additions and 62 deletions
@ -1,58 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Linq; |
|
||||
using System.Text; |
|
||||
using System.Threading.Tasks; |
|
||||
using Avalonia.Controls.Platform.Surfaces; |
|
||||
using Avalonia.Platform; |
|
||||
using Gdk; |
|
||||
|
|
||||
namespace Avalonia.Gtk |
|
||||
{ |
|
||||
class PixbufFramebuffer : ILockedFramebuffer |
|
||||
{ |
|
||||
private Pixbuf _pixbuf; |
|
||||
private Drawable _drawable; |
|
||||
|
|
||||
public PixbufFramebuffer(int width, int height) |
|
||||
{ |
|
||||
_pixbuf = new Pixbuf(Gdk.Colorspace.Rgb, false, 8, width, height); |
|
||||
} |
|
||||
|
|
||||
public void SetDrawable(Drawable drawable) |
|
||||
{ |
|
||||
_drawable = drawable; |
|
||||
} |
|
||||
|
|
||||
public void Deallocate() |
|
||||
{ |
|
||||
_pixbuf.Dispose(); |
|
||||
_pixbuf = null; |
|
||||
} |
|
||||
|
|
||||
public void Dispose() |
|
||||
{ |
|
||||
using (var gc = new Gdk.GC(_drawable)) |
|
||||
_drawable.DrawPixbuf(gc, _pixbuf, 0, 0, 0, 0, Width, Height, RgbDither.None, 0, 0); |
|
||||
_drawable = null; |
|
||||
} |
|
||||
|
|
||||
public IntPtr Address => _pixbuf.Pixels; |
|
||||
public int Width => _pixbuf.Width; |
|
||||
public int Height => _pixbuf.Height; |
|
||||
public int RowBytes => _pixbuf.Rowstride; |
|
||||
//TODO: Proper DPI detect
|
|
||||
public Size Dpi => new Size(96, 96); |
|
||||
public PixelFormat Format |
|
||||
{ |
|
||||
get |
|
||||
{ |
|
||||
if (AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetRuntimeInfo().OperatingSystem == |
|
||||
OperatingSystemType.WinNT) |
|
||||
return PixelFormat.Bgra8888; |
|
||||
return PixelFormat.Rgba8888; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@ -0,0 +1,55 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
using Avalonia.Platform; |
||||
|
using Cairo; |
||||
|
using Gdk; |
||||
|
|
||||
|
namespace Avalonia.Gtk |
||||
|
{ |
||||
|
class SurfaceFramebuffer : ILockedFramebuffer |
||||
|
{ |
||||
|
private Drawable _drawable; |
||||
|
private ImageSurface _surface; |
||||
|
|
||||
|
public SurfaceFramebuffer(int width, int height) |
||||
|
{ |
||||
|
_surface = new ImageSurface(Cairo.Format.RGB24, width, height); |
||||
|
} |
||||
|
|
||||
|
public void SetDrawable(Drawable drawable) |
||||
|
{ |
||||
|
_drawable = drawable; |
||||
|
_surface.Flush(); |
||||
|
} |
||||
|
|
||||
|
public void Deallocate() |
||||
|
{ |
||||
|
_surface.Dispose(); |
||||
|
_surface = null; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
using (var ctx = CairoHelper.Create(_drawable)) |
||||
|
{ |
||||
|
_surface.MarkDirty(); |
||||
|
ctx.SetSourceSurface(_surface, 0, 0); |
||||
|
ctx.Paint(); |
||||
|
} |
||||
|
_drawable = null; |
||||
|
} |
||||
|
|
||||
|
public IntPtr Address => _surface.DataPtr; |
||||
|
public int Width => _surface.Width; |
||||
|
public int Height => _surface.Height; |
||||
|
public int RowBytes => _surface.Stride; |
||||
|
//TODO: Proper DPI detect
|
||||
|
public Size Dpi => new Size(96, 96); |
||||
|
public PixelFormat Format => PixelFormat.Bgra8888; |
||||
|
} |
||||
|
} |
||||
|
|
||||
Loading…
Reference in new issue