| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- using System;
- using System.IO;
- using System.Runtime.InteropServices;
- using Avalonia.Platform;
- using Avalonia.Platform.Interop;
- namespace Avalonia.Gtk3.Interop
- {
- internal class Pixbuf : GObject, IWindowIconImpl
- {
- Pixbuf(IntPtr handle) : base(handle)
- {
-
- }
- public static Pixbuf NewFromFile(string filename)
- {
- using (var ub = new Utf8Buffer(filename))
- {
- IntPtr err;
- var rv = Native.GdkPixbufNewFromFile(ub, out err);
- if(rv != IntPtr.Zero)
- return new Pixbuf(rv);
- throw new GException(err);
- }
- }
- public static unsafe Pixbuf NewFromBytes(byte[] data)
- {
- fixed (void* bytes = data)
- {
- using (var stream = Native.GMemoryInputStreamNewFromData(new IntPtr(bytes), new IntPtr(data.Length), IntPtr.Zero))
- {
- IntPtr err;
- var rv = Native.GdkPixbufNewFromStream(stream, IntPtr.Zero, out err);
- if (rv != IntPtr.Zero)
- return new Pixbuf(rv);
- throw new GException(err);
- }
- }
- }
- public static Pixbuf NewFromStream(Stream s)
- {
- if (s is MemoryStream)
- return NewFromBytes(((MemoryStream) s).ToArray());
- var ms = new MemoryStream();
- s.CopyTo(ms);
- return NewFromBytes(ms.ToArray());
- }
- public void Save(Stream outputStream)
- {
- IntPtr buffer, bufferLen, error;
- using (var png = new Utf8Buffer("png"))
- if (!Native.GdkPixbufSaveToBufferv(this, out buffer, out bufferLen, png,
- IntPtr.Zero, IntPtr.Zero, out error))
- throw new GException(error);
- var data = new byte[bufferLen.ToInt32()];
- Marshal.Copy(buffer, data, 0, bufferLen.ToInt32());
- Native.GFree(buffer);
- outputStream.Write(data, 0, data.Length);
- }
- }
- }
|