aboutsummaryrefslogtreecommitdiffstatsci
path: root/Backends/CairoBackend/src/rsvg
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2021-12-23 06:22:00 +0100
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2021-12-23 06:22:00 +0100
commit11215d2ae24b6de448e3f7abdda3afc9124b9dfb (patch)
treedec71fd3d5030393009f343e48916a45e71be49f /Backends/CairoBackend/src/rsvg
parent1aa0f18efa7f4f9c198e2e4a037a78673365b9b7 (diff)
update Drawing2d package version, crow version v1.0.1v1.0.1-beta
Diffstat (limited to 'Backends/CairoBackend/src/rsvg')
-rw-r--r--Backends/CairoBackend/src/rsvg/SvgHandle.cs99
1 files changed, 99 insertions, 0 deletions
diff --git a/Backends/CairoBackend/src/rsvg/SvgHandle.cs b/Backends/CairoBackend/src/rsvg/SvgHandle.cs
new file mode 100644
index 00000000..e767ce3a
--- /dev/null
+++ b/Backends/CairoBackend/src/rsvg/SvgHandle.cs
@@ -0,0 +1,99 @@
+//Copyright GPL2
+using System;
+using System.Runtime.InteropServices;
+using Drawing2D;
+
+namespace Crow.CairoBackend {
+
+
+ public sealed class SvgHandle : ISvgHandle {
+ const string lib = "rsvg-2.40";
+
+ public IntPtr Raw;
+
+ [DllImport (lib)]
+ static extern IntPtr rsvg_handle_new();
+ [DllImport (lib)]
+ static extern IntPtr rsvg_handle_new_from_data (byte[] data, UIntPtr n_data, out IntPtr error);
+ [DllImport (lib)]
+ static extern IntPtr rsvg_handle_new_from_file (string file_name, out IntPtr error);
+ [DllImport (lib)]
+ static extern IntPtr rsvg_handle_get_base_uri (IntPtr raw);
+ [DllImport (lib)]
+ static extern void rsvg_handle_set_dpi (IntPtr raw, double dpi);
+ [DllImport (lib)]
+ static extern void rsvg_handle_set_dpi_x_y (IntPtr raw, double dpi_x, double dpi_y);
+
+ [DllImport (lib)]
+ static extern void rsvg_handle_render_cairo (IntPtr raw, IntPtr cr);
+ [DllImport (lib)]
+ static extern void rsvg_handle_render_cairo_sub (IntPtr raw, IntPtr cr, string id);
+
+ [DllImport (lib)]
+ static extern void rsvg_handle_get_dimensions (IntPtr raw, IntPtr dimension_data);
+ [DllImport (lib)]
+ static extern bool rsvg_handle_close (IntPtr raw, out IntPtr error);
+ [DllImport (lib)]
+ static extern IntPtr rsvg_handle_get_title (IntPtr raw);
+ [DllImport (lib)]
+ static extern IntPtr rsvg_handle_get_metadata (IntPtr raw);
+
+ public SvgHandle ()
+ {
+ Raw = rsvg_handle_new();
+ }
+ public SvgHandle (byte[] data)
+ {
+ Raw = rsvg_handle_new_from_data(data, new UIntPtr ((ulong) (data == null ? 0 : data.Length)), out IntPtr error);
+ if (error != IntPtr.Zero) throw new Exception (error.ToString());
+ }
+ public SvgHandle (string file_name)
+ {
+ Raw = rsvg_handle_new_from_file(file_name, out IntPtr error);
+ if (error != IntPtr.Zero) throw new Exception (error.ToString());
+ }
+
+
+ public double Dpi { set => rsvg_handle_set_dpi (Raw, value); }
+ public void SetDpiXY (double dpi_x, double dpi_y) => rsvg_handle_set_dpi_x_y (Raw, dpi_x, dpi_y);
+
+
+ public void Render(IContext cr) =>
+ rsvg_handle_render_cairo (Raw, cr == null ? IntPtr.Zero : (cr as Context).handle);
+
+ public void Render (IContext cr, string id) =>
+ rsvg_handle_render_cairo_sub (Raw, cr == null ? IntPtr.Zero : (cr as Context).handle, id);
+
+ [StructLayout(LayoutKind.Sequential)]
+ struct DimensionData {
+
+ public int Width;
+ public int Height;
+ public double Em;
+ public double Ex;
+
+ public static DimensionData Zero = new DimensionData ();
+
+ public static DimensionData New(IntPtr raw) {
+ if (raw == IntPtr.Zero)
+ return DimensionData.Zero;
+ return (DimensionData) Marshal.PtrToStructure (raw, typeof (DimensionData));
+ }
+ }
+ public Size Dimensions {
+ get {
+ DimensionData dimension_data;
+ IntPtr native_dimension_data = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (DimensionData)));
+ rsvg_handle_get_dimensions(Raw, native_dimension_data);
+ dimension_data = DimensionData.New (native_dimension_data);
+ Marshal.FreeHGlobal (native_dimension_data);
+ return new Size (dimension_data.Width, dimension_data.Height);
+ }
+ }
+
+ public void Dispose() {
+ bool raw_ret = rsvg_handle_close(Raw, out IntPtr error);
+ if (error != IntPtr.Zero) throw new Exception (error.ToString());
+ }
+ }
+}