CPF/CPF.Mac/Mac/CoreGraphics/CGShading.cs
2023-11-21 23:05:03 +08:00

105 lines
3.1 KiB
C#

using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.CoreGraphics
{
public class CGShading : INativeObject, IDisposable
{
internal IntPtr handle;
public IntPtr Handle => handle;
public CGShading(IntPtr handle)
{
this.handle = handle;
CGShadingRetain(handle);
}
[Preserve(Conditional = true)]
internal CGShading(IntPtr handle, bool owns)
{
this.handle = handle;
if (!owns)
{
CGShadingRetain(handle);
}
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/CoreGraphics")]
private static extern IntPtr CGShadingCreateAxial(IntPtr space, CGPoint start, CGPoint end, IntPtr functionHandle, bool extendStart, bool extendEnd);
public static CGShading CreateAxial(CGColorSpace colorspace, CGPoint start, CGPoint end, CGFunction function, bool extendStart, bool extendEnd)
{
if (colorspace == null)
{
throw new ArgumentNullException("colorspace");
}
if (colorspace.Handle == IntPtr.Zero)
{
throw new ObjectDisposedException("colorspace");
}
if (function == null)
{
throw new ArgumentNullException("function");
}
if (function.Handle == IntPtr.Zero)
{
throw new ObjectDisposedException("function");
}
return new CGShading(CGShadingCreateAxial(colorspace.Handle, start, end, function.Handle, extendStart, extendEnd), owns: true);
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/CoreGraphics")]
private static extern IntPtr CGShadingCreateRadial(IntPtr space, CGPoint start, double startRadius, CGPoint end, double endRadius, IntPtr function, bool extendStart, bool extendEnd);
public static CGShading CreateRadial(CGColorSpace colorspace, CGPoint start, double startRadius, CGPoint end, double endRadius, CGFunction function, bool extendStart, bool extendEnd)
{
if (colorspace == null)
{
throw new ArgumentNullException("colorspace");
}
if (colorspace.Handle == IntPtr.Zero)
{
throw new ObjectDisposedException("colorspace");
}
if (function == null)
{
throw new ArgumentNullException("function");
}
if (function.Handle == IntPtr.Zero)
{
throw new ObjectDisposedException("function");
}
return new CGShading(CGShadingCreateRadial(colorspace.Handle, start, startRadius, end, endRadius, function.Handle, extendStart, extendEnd), owns: true);
}
~CGShading()
{
Dispose(disposing: false);
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/CoreGraphics")]
private static extern void CGShadingRelease(IntPtr handle);
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/CoreGraphics")]
private static extern void CGShadingRetain(IntPtr handle);
protected virtual void Dispose(bool disposing)
{
if (handle != IntPtr.Zero)
{
CGShadingRelease(handle);
handle = IntPtr.Zero;
}
}
}
}