using CPF.Mac.CoreGraphics; using CPF.Mac.Foundation; using CPF.Mac.ObjCRuntime; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; namespace CPF.Mac.CoreText { [Since(3, 2)] public class CTFontDescriptorAttributes { public NSDictionary Dictionary { get; private set; } public NSUrl Url { get { return (NSUrl)Dictionary[CTFontDescriptorAttributeKey.Url]; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Url, value); } } public string Name { get { return Adapter.GetStringValue(Dictionary, CTFontDescriptorAttributeKey.Name); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Name, value); } } public string DisplayName { get { return Adapter.GetStringValue(Dictionary, CTFontDescriptorAttributeKey.DisplayName); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.DisplayName, value); } } public string FamilyName { get { return Adapter.GetStringValue(Dictionary, CTFontDescriptorAttributeKey.FamilyName); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.FamilyName, value); } } public string StyleName { get { return Adapter.GetStringValue(Dictionary, CTFontDescriptorAttributeKey.StyleName); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.StyleName, value); } } public CTFontTraits Traits { get { NSDictionary nSDictionary = (NSDictionary)Dictionary[CTFontDescriptorAttributeKey.Traits]; if (nSDictionary == null) { return null; } return new CTFontTraits(nSDictionary); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Traits, value?.Dictionary); } } public CTFontVariation Variation { get { NSDictionary nSDictionary = (NSDictionary)Dictionary[CTFontDescriptorAttributeKey.Variation]; if (nSDictionary != null) { return new CTFontVariation(nSDictionary); } return null; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Variation, value?.Dictionary); } } public float? Size { get { return Adapter.GetSingleValue(Dictionary, CTFontDescriptorAttributeKey.Size); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Size, value); } } public unsafe CGAffineTransform? Matrix { get { NSData nSData = (NSData)Dictionary[CTFontDescriptorAttributeKey.Matrix]; if (nSData == null) { return null; } return (CGAffineTransform)Marshal.PtrToStructure(nSData.Bytes, typeof(CGAffineTransform)); } set { if (!value.HasValue) { Adapter.SetValue((IDictionary)Dictionary, (NSObject)CTFontDescriptorAttributeKey.Matrix, (NSObject)null); return; } byte[] array = new byte[Marshal.SizeOf(typeof(CGAffineTransform))]; fixed (byte* value2 = array) { Marshal.StructureToPtr(value.Value, (IntPtr)(void*)value2, fDeleteOld: false); } Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Matrix, NSData.FromArray(array)); } } public IEnumerable CascadeList { get { return Adapter.GetNativeArray(Dictionary, CTFontDescriptorAttributeKey.CascadeList, (IntPtr d) => new CTFontDescriptor(d, owns: false)); } set { Adapter.SetNativeValue(Dictionary, CTFontDescriptorAttributeKey.CascadeList, value); } } public NSCharacterSet CharacterSet { get { return (NSCharacterSet)Dictionary[CTFontDescriptorAttributeKey.CharacterSet]; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.CharacterSet, value); } } public IEnumerable Languages { get { return Adapter.GetStringArray(Dictionary, CTFontDescriptorAttributeKey.Languages); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Languages, value); } } public float? BaselineAdjust { get { return Adapter.GetSingleValue(Dictionary, CTFontDescriptorAttributeKey.BaselineAdjust); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.BaselineAdjust, value); } } public float? MacintoshEncodings { get { return Adapter.GetSingleValue(Dictionary, CTFontDescriptorAttributeKey.MacintoshEncodings); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.MacintoshEncodings, value); } } public IEnumerable Features { get { return Adapter.GetNativeArray(Dictionary, CTFontDescriptorAttributeKey.Features, (IntPtr d) => new CTFontFeatures((NSDictionary)Runtime.GetNSObject(d))); } set { List source; if (value == null || (source = new List(value)).Count == 0) { Adapter.SetValue((IDictionary)Dictionary, (NSObject)CTFontDescriptorAttributeKey.Features, (NSObject)null); } else { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Features, NSArray.FromNSObjects(((IEnumerable)source).Select((Func)((CTFontFeatures e) => e.Dictionary)).ToList())); } } } public IEnumerable FeatureSettings { get { return Adapter.GetNativeArray(Dictionary, CTFontDescriptorAttributeKey.Features, (IntPtr d) => new CTFontFeatureSettings((NSDictionary)Runtime.GetNSObject(d))); } set { List source; if (value == null || (source = new List(value)).Count == 0) { Adapter.SetValue((IDictionary)Dictionary, (NSObject)CTFontDescriptorAttributeKey.Features, (NSObject)null); } else { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.FeatureSettings, NSArray.FromNSObjects(((IEnumerable)source).Select((Func)((CTFontFeatureSettings e) => e.Dictionary)).ToList())); } } } public float? FixedAdvance { get { return Adapter.GetSingleValue(Dictionary, CTFontDescriptorAttributeKey.FixedAdvance); } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.FixedAdvance, value); } } public CTFontOrientation? FontOrientation { get { uint? uInt32Value = Adapter.GetUInt32Value(Dictionary, CTFontDescriptorAttributeKey.FontOrientation); if (uInt32Value.HasValue) { return (CTFontOrientation)uInt32Value.Value; } return null; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.FontOrientation, value.HasValue ? new uint?((uint)value.Value) : null); } } public CTFontFormat? FontFormat { get { uint? uInt32Value = Adapter.GetUInt32Value(Dictionary, CTFontDescriptorAttributeKey.FontFormat); if (uInt32Value.HasValue) { return (CTFontFormat)uInt32Value.Value; } return null; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.FontFormat, value.HasValue ? new uint?((uint)value.Value) : null); } } public NSNumber RegistrationScope { get { return (NSNumber)Dictionary[CTFontDescriptorAttributeKey.RegistrationScope]; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.RegistrationScope, value); } } public CTFontPriority? Priority { get { uint? uInt32Value = Adapter.GetUInt32Value(Dictionary, CTFontDescriptorAttributeKey.Priority); if (uInt32Value.HasValue) { return (CTFontPriority)uInt32Value.Value; } return null; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Priority, value.HasValue ? new uint?((uint)value.Value) : null); } } public bool Enabled { get { NSNumber nSNumber = (NSNumber)Dictionary[CTFontDescriptorAttributeKey.Enabled]; if (nSNumber == null) { return false; } return nSNumber.Int32Value != 0; } set { Adapter.SetValue(Dictionary, CTFontDescriptorAttributeKey.Enabled, value ? new NSNumber(1) : null); } } public CTFontDescriptorAttributes() : this(new NSMutableDictionary()) { } public CTFontDescriptorAttributes(NSDictionary dictionary) { if (dictionary == null) { throw new ArgumentNullException("dictionary"); } Dictionary = dictionary; } } }