324 lines
11 KiB
C#
324 lines
11 KiB
C#
using CPF.Mac.CoreGraphics;
|
|
using CPF.Mac.Foundation;
|
|
using CPF.Mac.ObjCRuntime;
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace CPF.Mac.AppKit
|
|
{
|
|
[Register("NSGradient", true)]
|
|
public class NSGradient : NSObject
|
|
{
|
|
private static IntPtr selInitWithColorsAtLocationsColorSpace = Selector.GetHandle("initWithColors:atLocations:colorSpace:");
|
|
|
|
private static readonly IntPtr selColorSpaceHandle = Selector.GetHandle("colorSpace");
|
|
|
|
private static readonly IntPtr selNumberOfColorStopsHandle = Selector.GetHandle("numberOfColorStops");
|
|
|
|
private static readonly IntPtr selInitWithStartingColorEndingColor_Handle = Selector.GetHandle("initWithStartingColor:endingColor:");
|
|
|
|
private static readonly IntPtr selInitWithColors_Handle = Selector.GetHandle("initWithColors:");
|
|
|
|
private static readonly IntPtr selDrawFromPointToPointOptions_Handle = Selector.GetHandle("drawFromPoint:toPoint:options:");
|
|
|
|
private static readonly IntPtr selDrawInRectAngle_Handle = Selector.GetHandle("drawInRect:angle:");
|
|
|
|
private static readonly IntPtr selDrawInBezierPathAngle_Handle = Selector.GetHandle("drawInBezierPath:angle:");
|
|
|
|
private static readonly IntPtr selDrawFromCenterRadiusToCenterRadiusOptions_Handle = Selector.GetHandle("drawFromCenter:radius:toCenter:radius:options:");
|
|
|
|
private static readonly IntPtr selDrawInRectRelativeCenterPosition_Handle = Selector.GetHandle("drawInRect:relativeCenterPosition:");
|
|
|
|
private static readonly IntPtr selDrawInBezierPathRelativeCenterPosition_Handle = Selector.GetHandle("drawInBezierPath:relativeCenterPosition:");
|
|
|
|
private static readonly IntPtr selGetColorLocationAtIndex_Handle = Selector.GetHandle("getColor:location:atIndex:");
|
|
|
|
private static readonly IntPtr selInterpolatedColorAtLocation_Handle = Selector.GetHandle("interpolatedColorAtLocation:");
|
|
|
|
private static readonly IntPtr class_ptr = Class.GetHandle("NSGradient");
|
|
|
|
private object __mt_ColorSpace_var;
|
|
|
|
public override IntPtr ClassHandle => class_ptr;
|
|
|
|
public virtual NSColorSpace ColorSpace
|
|
{
|
|
[Export("colorSpace")]
|
|
get
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
return (NSColorSpace)(__mt_ColorSpace_var = ((!IsDirectBinding) ? ((NSColorSpace)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selColorSpaceHandle))) : ((NSColorSpace)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selColorSpaceHandle)))));
|
|
}
|
|
}
|
|
|
|
public virtual long ColorStopsCount
|
|
{
|
|
[Export("numberOfColorStops")]
|
|
get
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (IsDirectBinding)
|
|
{
|
|
return Messaging.Int64_objc_msgSend(base.Handle, selNumberOfColorStopsHandle);
|
|
}
|
|
return Messaging.Int64_objc_msgSendSuper(base.SuperHandle, selNumberOfColorStopsHandle);
|
|
}
|
|
}
|
|
|
|
[Export("initWithColorsAndLocations:")]
|
|
public NSGradient(NSColor[] colors, double[] locations)
|
|
: this(colors, locations, NSColorSpace.GenericRGBColorSpace)
|
|
{
|
|
}
|
|
|
|
[Export("initWithColors:atLocations:colorSpace:")]
|
|
public NSGradient(NSColor[] colors, double[] locations, NSColorSpace colorSpace)
|
|
: base(NSObjectFlag.Empty)
|
|
{
|
|
if (colors == null)
|
|
{
|
|
throw new ArgumentNullException("colors");
|
|
}
|
|
if (locations == null)
|
|
{
|
|
throw new ArgumentNullException("locations");
|
|
}
|
|
if (colorSpace == null)
|
|
{
|
|
throw new ArgumentNullException("colorSpace");
|
|
}
|
|
NSArray nSArray = NSArray.FromNSObjects(colors);
|
|
IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(locations[0]) * locations.Length);
|
|
Marshal.Copy(locations, 0, intPtr, locations.Length);
|
|
if (IsDirectBinding)
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr_IntPtr(base.Handle, selInitWithColorsAtLocationsColorSpace, nSArray.Handle, intPtr, colorSpace.Handle);
|
|
}
|
|
else
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr_IntPtr_IntPtr(base.SuperHandle, selInitWithColorsAtLocationsColorSpace, nSArray.Handle, intPtr, colorSpace.Handle);
|
|
}
|
|
nSArray.Dispose();
|
|
Marshal.FreeHGlobal(intPtr);
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Advanced)]
|
|
[Export("init")]
|
|
public NSGradient()
|
|
: base(NSObjectFlag.Empty)
|
|
{
|
|
if (IsDirectBinding)
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSend(base.Handle, Selector.Init);
|
|
}
|
|
else
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, Selector.Init);
|
|
}
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Advanced)]
|
|
[Export("initWithCoder:")]
|
|
public NSGradient(NSCoder coder)
|
|
: base(NSObjectFlag.Empty)
|
|
{
|
|
if (IsDirectBinding)
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, Selector.InitWithCoder, coder.Handle);
|
|
}
|
|
else
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, Selector.InitWithCoder, coder.Handle);
|
|
}
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Advanced)]
|
|
public NSGradient(NSObjectFlag t)
|
|
: base(t)
|
|
{
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Advanced)]
|
|
public NSGradient(IntPtr handle)
|
|
: base(handle)
|
|
{
|
|
}
|
|
|
|
[Export("initWithStartingColor:endingColor:")]
|
|
public NSGradient(NSColor startingColor, NSColor endingColor)
|
|
: base(NSObjectFlag.Empty)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (startingColor == null)
|
|
{
|
|
throw new ArgumentNullException("startingColor");
|
|
}
|
|
if (endingColor == null)
|
|
{
|
|
throw new ArgumentNullException("endingColor");
|
|
}
|
|
if (IsDirectBinding)
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(base.Handle, selInitWithStartingColorEndingColor_Handle, startingColor.Handle, endingColor.Handle);
|
|
}
|
|
else
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selInitWithStartingColorEndingColor_Handle, startingColor.Handle, endingColor.Handle);
|
|
}
|
|
}
|
|
|
|
[Export("initWithColors:")]
|
|
public NSGradient(NSColor[] colorArray)
|
|
: base(NSObjectFlag.Empty)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (colorArray == null)
|
|
{
|
|
throw new ArgumentNullException("colorArray");
|
|
}
|
|
NSArray nSArray = NSArray.FromNSObjects(colorArray);
|
|
if (IsDirectBinding)
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selInitWithColors_Handle, nSArray.Handle);
|
|
}
|
|
else
|
|
{
|
|
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selInitWithColors_Handle, nSArray.Handle);
|
|
}
|
|
nSArray.Dispose();
|
|
}
|
|
|
|
[Export("drawFromPoint:toPoint:options:")]
|
|
public virtual void DrawFromPoint(CGPoint startingPoint, CGPoint endingPoint, NSGradientDrawingOptions options)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_CGPoint_CGPoint_UInt64(base.Handle, selDrawFromPointToPointOptions_Handle, startingPoint, endingPoint, (ulong)options);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_CGPoint_CGPoint_UInt64(base.SuperHandle, selDrawFromPointToPointOptions_Handle, startingPoint, endingPoint, (ulong)options);
|
|
}
|
|
}
|
|
|
|
[Export("drawInRect:angle:")]
|
|
public virtual void DrawInRect(CGRect rect, double angle)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_CGRect_Double(base.Handle, selDrawInRectAngle_Handle, rect, angle);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_CGRect_Double(base.SuperHandle, selDrawInRectAngle_Handle, rect, angle);
|
|
}
|
|
}
|
|
|
|
[Export("drawInBezierPath:angle:")]
|
|
public virtual void DrawInBezierPath(NSBezierPath path, double angle)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (path == null)
|
|
{
|
|
throw new ArgumentNullException("path");
|
|
}
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_IntPtr_Double(base.Handle, selDrawInBezierPathAngle_Handle, path.Handle, angle);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_IntPtr_Double(base.SuperHandle, selDrawInBezierPathAngle_Handle, path.Handle, angle);
|
|
}
|
|
}
|
|
|
|
[Export("drawFromCenter:radius:toCenter:radius:options:")]
|
|
public virtual void DrawFromCenterRadius(CGPoint startCenter, double startRadius, CGPoint endCenter, double endRadius, NSGradientDrawingOptions options)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_CGPoint_Double_CGPoint_Double_UInt64(base.Handle, selDrawFromCenterRadiusToCenterRadiusOptions_Handle, startCenter, startRadius, endCenter, endRadius, (ulong)options);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_CGPoint_Double_CGPoint_Double_UInt64(base.SuperHandle, selDrawFromCenterRadiusToCenterRadiusOptions_Handle, startCenter, startRadius, endCenter, endRadius, (ulong)options);
|
|
}
|
|
}
|
|
|
|
[Export("drawInRect:relativeCenterPosition:")]
|
|
public virtual void DrawInRect(CGRect rect, CGPoint relativeCenterPosition)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_CGRect_CGPoint(base.Handle, selDrawInRectRelativeCenterPosition_Handle, rect, relativeCenterPosition);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_CGRect_CGPoint(base.SuperHandle, selDrawInRectRelativeCenterPosition_Handle, rect, relativeCenterPosition);
|
|
}
|
|
}
|
|
|
|
[Export("drawInBezierPath:relativeCenterPosition:")]
|
|
public virtual void DrawInBezierPath(NSBezierPath path, CGPoint relativeCenterPosition)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (path == null)
|
|
{
|
|
throw new ArgumentNullException("path");
|
|
}
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_IntPtr_CGPoint(base.Handle, selDrawInBezierPathRelativeCenterPosition_Handle, path.Handle, relativeCenterPosition);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_IntPtr_CGPoint(base.SuperHandle, selDrawInBezierPathRelativeCenterPosition_Handle, path.Handle, relativeCenterPosition);
|
|
}
|
|
}
|
|
|
|
[Export("getColor:location:atIndex:")]
|
|
public virtual void GetColor(out NSColor color, out double location, long index)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
IntPtr intPtr = Marshal.AllocHGlobal(4);
|
|
Marshal.WriteInt32(intPtr, 0);
|
|
if (IsDirectBinding)
|
|
{
|
|
Messaging.void_objc_msgSend_IntPtr_out_Double_Int64(base.Handle, selGetColorLocationAtIndex_Handle, intPtr, out location, index);
|
|
}
|
|
else
|
|
{
|
|
Messaging.void_objc_msgSendSuper_IntPtr_out_Double_Int64(base.SuperHandle, selGetColorLocationAtIndex_Handle, intPtr, out location, index);
|
|
}
|
|
IntPtr intPtr2 = Marshal.ReadIntPtr(intPtr);
|
|
color = ((intPtr2 != IntPtr.Zero) ? ((NSColor)Runtime.GetNSObject(intPtr2)) : null);
|
|
Marshal.FreeHGlobal(intPtr);
|
|
}
|
|
|
|
[Export("interpolatedColorAtLocation:")]
|
|
public virtual NSColor GetInterpolatedColor(double location)
|
|
{
|
|
NSApplication.EnsureUIThread();
|
|
if (IsDirectBinding)
|
|
{
|
|
return (NSColor)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Double(base.Handle, selInterpolatedColorAtLocation_Handle, location));
|
|
}
|
|
return (NSColor)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_Double(base.SuperHandle, selInterpolatedColorAtLocation_Handle, location));
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
if (base.Handle == IntPtr.Zero)
|
|
{
|
|
__mt_ColorSpace_var = null;
|
|
}
|
|
}
|
|
}
|
|
}
|