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;
+ }
+}
+