diff options
Diffstat (limited to 'Backends/CairoBackend/src/Region.cs')
| -rw-r--r-- | Backends/CairoBackend/src/Region.cs | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/Backends/CairoBackend/src/Region.cs b/Backends/CairoBackend/src/Region.cs new file mode 100644 index 00000000..139ebc8e --- /dev/null +++ b/Backends/CairoBackend/src/Region.cs @@ -0,0 +1,174 @@ +// Copyright (C) 2011 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; +using Drawing2D; + +namespace Crow.CairoBackend +{ + [StructLayout(LayoutKind.Sequential)] + struct RectangleList { + public Status Status; + public IntPtr Rectangles; + public int NumRectangles; + } + + + public class Region : IRegion { + + IntPtr handle; + + #region CTOR + public Region (IntPtr handle, bool owned) + { + this.handle = handle; + if (!owned) + NativeMethods.cairo_region_reference (handle); + if (CairoDebug.Enabled) + CairoDebug.OnAllocated (handle); + } + public Region () : this (NativeMethods.cairo_region_create () , true) + {} + public Region (Rectangle rect) { + handle = NativeMethods.cairo_region_create_rectangle (ref rect); + } + #endregion + + public Region Copy () => new Region (NativeMethods.cairo_region_copy (handle), true); + + + public Status Status { + get { return NativeMethods.cairo_region_status (handle); } + } + + public Rectangle Extents { + get { + Rectangle result; + NativeMethods.cairo_region_get_extents (handle, out result); + return result; + } + } + + public bool Contains (int x, int y) + { + return NativeMethods.cairo_region_contains_point (handle, x, y); + } + + public void Translate (int dx, int dy) + { + NativeMethods.cairo_region_translate (handle, dx, dy); + } + + public Status Subtract (Region other) + { + return NativeMethods.cairo_region_subtract (handle, other.handle); + } + + public Status SubtractRectangle (Rectangle rectangle) + { + return NativeMethods.cairo_region_subtract_rectangle (handle, ref rectangle); + } + + public Status Intersect (Region other) + { + return NativeMethods.cairo_region_intersect (handle, other.handle); + } + + public Status IntersectRectangle (Rectangle rectangle) + { + return NativeMethods.cairo_region_intersect_rectangle (handle, ref rectangle); + } + + public Status Union (Region other) + { + return NativeMethods.cairo_region_union (handle, other.handle); + } + + + public Status Xor (Region other) + { + return NativeMethods.cairo_region_xor (handle, other.handle); + } + + public Status XorRectangle (Rectangle rectangle) + { + return NativeMethods.cairo_region_xor_rectangle (handle, ref rectangle); + } + + #region IRegion implementation + public bool IsEmpty => NativeMethods.cairo_region_is_empty (handle); + public int NumRectangles => NativeMethods.cairo_region_num_rectangles (handle); + public Rectangle GetRectangle (int nth) + { + Rectangle val; + NativeMethods.cairo_region_get_rectangle (handle, nth, out val); + return val; + } + public void UnionRectangle (Rectangle rectangle) + => NativeMethods.cairo_region_union_rectangle (handle, ref rectangle); + public bool OverlapOut (Rectangle rectangle) => Contains (rectangle) == RegionOverlap.Out; + public RegionOverlap Contains (Rectangle rectangle) + => NativeMethods.cairo_region_contains_rectangle (handle, ref rectangle); + public void Reset () { + if (IsEmpty) + return; + NativeMethods.cairo_region_destroy (handle); + handle = NativeMethods.cairo_region_create (); + } + + public bool Equals(IRegion other) + => other is Region r ? NativeMethods.cairo_region_equal (handle, r.handle) : false; + #endregion + + public override bool Equals (object obj) + => obj is Region r ? NativeMethods.cairo_region_equal (handle, r.handle) : false; + + public override int GetHashCode () => handle.GetHashCode (); + + #region IDisposable + ~Region () + { + Dispose (false); + } + + public void Dispose () + { + Dispose (true); + GC.SuppressFinalize (this); + } + + protected virtual void Dispose (bool disposing) + { + if (!disposing || CairoDebug.Enabled) + CairoDebug.OnDisposed<Region> (handle, disposing); + + if (!disposing|| handle == IntPtr.Zero) + return; + + NativeMethods.cairo_region_destroy (handle); + handle = IntPtr.Zero; + } + #endregion + } +} |