CPF/CPF.Mac/Mac/CoreText/CTFrame.cs

138 lines
3.7 KiB
C#
Raw Normal View History

2023-11-21 23:05:03 +08:00
using CPF.Mac.CoreFoundation;
using CPF.Mac.CoreGraphics;
using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.CoreText
{
[Since(3, 2)]
public class CTFrame : INativeObject, IDisposable
{
internal IntPtr handle;
public IntPtr Handle => handle;
internal CTFrame(IntPtr handle, bool owns)
{
if (handle == IntPtr.Zero)
{
throw ConstructorError.ArgumentNull(this, "handle");
}
this.handle = handle;
if (!owns)
{
CFObject.CFRetain(handle);
}
}
~CTFrame()
{
Dispose(disposing: false);
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (handle != IntPtr.Zero)
{
CFObject.CFRelease(handle);
handle = IntPtr.Zero;
}
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern NSRange CTFrameGetStringRange(IntPtr handle);
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern NSRange CTFrameGetVisibleStringRange(IntPtr handle);
public NSRange GetStringRange()
{
return CTFrameGetStringRange(handle);
}
public NSRange GetVisibleStringRange()
{
return CTFrameGetVisibleStringRange(handle);
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern IntPtr CTFrameGetPath(IntPtr handle);
public CGPath GetPath()
{
IntPtr value = CTFrameGetPath(handle);
if (!(value == IntPtr.Zero))
{
return new CGPath(value, owns: false);
}
return null;
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern IntPtr CTFrameGetFrameAttributes(IntPtr handle);
public CTFrameAttributes GetFrameAttributes()
{
NSDictionary nSDictionary = (NSDictionary)Runtime.GetNSObject(CTFrameGetFrameAttributes(handle));
if (nSDictionary != null)
{
return new CTFrameAttributes(nSDictionary);
}
return null;
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern IntPtr CTFrameGetLines(IntPtr handle);
public CTLine[] GetLines()
{
IntPtr value = CTFrameGetLines(handle);
if (value == IntPtr.Zero)
{
return new CTLine[0];
}
return NSArray.ArrayFromHandleFunc(value, (IntPtr p) => new CTLine(p, owns: false));
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern void CTFrameGetLineOrigins(IntPtr handle, NSRange range, [Out] CGPoint[] origins);
public void GetLineOrigins(NSRange range, CGPoint[] origins)
{
if (origins == null)
{
throw new ArgumentNullException("origins");
}
if (range.Length != 0L && (ulong)origins.Length < range.Length)
{
throw new ArgumentException("origins must contain at least range.Length elements.", "origins");
}
if (origins.Length < CFArray.GetCount(CTFrameGetLines(handle)))
{
throw new ArgumentException("origins must contain at least GetLines().Length elements.", "origins");
}
CTFrameGetLineOrigins(handle, range, origins);
}
[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/CoreText")]
private static extern void CTFrameDraw(IntPtr handle, IntPtr context);
public void Draw(CGContext ctx)
{
if (ctx == null)
{
throw new ArgumentNullException("ctx");
}
CTFrameDraw(handle, ctx.Handle);
}
}
}