diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index 2c10b1188b..540e70cee0 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -30,6 +30,8 @@ false + + @@ -50,7 +52,7 @@ - + diff --git a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs index 72c977b2b4..00a4727769 100644 --- a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs @@ -6,7 +6,7 @@ namespace Avalonia.Gtk class FramebufferManager : IFramebufferPlatformSurface, IDisposable { private readonly WindowImplBase _window; - private PixbufFramebuffer _fb; + private SurfaceFramebuffer _fb; public FramebufferManager(WindowImplBase window) { @@ -29,8 +29,8 @@ namespace Avalonia.Gtk if (_fb == null || _fb.Width != width || _fb.Height != height) { - _fb?.Dispose(); - _fb = new PixbufFramebuffer(width, height); + _fb?.Deallocate(); + _fb = new SurfaceFramebuffer(width, height); } _fb.SetDrawable(drawable); return _fb; diff --git a/src/Gtk/Avalonia.Gtk/PixbufFramebuffer.cs b/src/Gtk/Avalonia.Gtk/PixbufFramebuffer.cs deleted file mode 100644 index 76e9e8a307..0000000000 --- a/src/Gtk/Avalonia.Gtk/PixbufFramebuffer.cs +++ /dev/null @@ -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().GetRuntimeInfo().OperatingSystem == - OperatingSystemType.WinNT) - return PixelFormat.Bgra8888; - return PixelFormat.Rgba8888; - } - } - } -} - diff --git a/src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs b/src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs new file mode 100644 index 0000000000..7e6da0e76a --- /dev/null +++ b/src/Gtk/Avalonia.Gtk/SurfaceFramebuffer.cs @@ -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; + } +} +