diff --git a/Source/Libs/CairoSharp/Path.cs b/Source/Libs/CairoSharp/Path.cs index 22cbb138d..925fef0f9 100644 --- a/Source/Libs/CairoSharp/Path.cs +++ b/Source/Libs/CairoSharp/Path.cs @@ -36,7 +36,17 @@ namespace Cairo { public class Path : IDisposable { + [StructLayout(LayoutKind.Sequential)] + struct PathStruct + { + public Status Status; + public IntPtr Data; + public int NumData; + } + IntPtr handle = IntPtr.Zero; + Status status; + PathData[] data; internal Path (IntPtr handle) { @@ -72,5 +82,57 @@ namespace Cairo { NativeMethods.cairo_path_destroy (handle); handle = IntPtr.Zero; } + + void CheckDisposed () + { + if (handle == IntPtr.Zero) + throw new ObjectDisposedException ("Object has already been disposed"); + } + + void MarshalData () + { + if (data == null) + { + var rawStruct = Marshal.PtrToStructure(handle); + status = rawStruct.Status; + data = new PathData[rawStruct.NumData]; + int oneDataSize = Marshal.SizeOf(); + for (int i = 0; i < rawStruct.NumData; i++) + { + IntPtr iPtr = new IntPtr(rawStruct.Data.ToInt64() + i * oneDataSize); + data[i] = Marshal.PtrToStructure(iPtr); + } + } + } + + public Status Status + { + get + { + CheckDisposed (); + MarshalData (); + return status; + } + } + + public int NumData + { + get + { + CheckDisposed (); + MarshalData (); + return data.Length; + } + } + + public PathData[] Data + { + get + { + CheckDisposed (); + MarshalData (); + return data; + } + } } } diff --git a/Source/Libs/CairoSharp/PathData.cs b/Source/Libs/CairoSharp/PathData.cs new file mode 100644 index 000000000..bf567ec2a --- /dev/null +++ b/Source/Libs/CairoSharp/PathData.cs @@ -0,0 +1,28 @@ +using System; +using System.Runtime.InteropServices; + +namespace Cairo +{ + [StructLayout(LayoutKind.Explicit)] + public struct PathData + { + [FieldOffset(0)] + public PathDataHeader Header; + [FieldOffset(0)] + public PathDataPoint Point; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PathDataHeader + { + public PathDataType Type; + public int Length; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PathDataPoint + { + public double X; + public double Y; + } +} diff --git a/Source/Libs/CairoSharp/PathDataType.cs b/Source/Libs/CairoSharp/PathDataType.cs new file mode 100644 index 000000000..9a4a58168 --- /dev/null +++ b/Source/Libs/CairoSharp/PathDataType.cs @@ -0,0 +1,13 @@ +using System; + +namespace Cairo +{ + [Serializable] + public enum PathDataType + { + MoveTo, + LineTo, + CurveTo, + ClosePath + } +}