示例#1
0
        public static NSFont CreateFont(FontFamilyHandler familyHandler, float size, NSFontTraitMask traits, int weight = 5)
        {
            var font = NSFontManager.SharedFontManager.FontWithFamily(familyHandler.MacName, traits, weight, size);

            if (font == null)
            {
                if (traits.HasFlag(NSFontTraitMask.Italic))
                {
                    // fake italics by transforming the font
                    const float kRotationForItalicText = 14.0f;
                    var         fontTransform          = new NSAffineTransform();
                    fontTransform.Scale(size);
                    var italicTransform = new NSAffineTransform();
                    italicTransform.TransformStruct = Matrix.FromSkew(0, kRotationForItalicText).ToCG();
                    fontTransform.AppendTransform(italicTransform);
                    traits &= ~NSFontTraitMask.Italic;
                    font    = NSFontManager.SharedFontManager.FontWithFamily(familyHandler.MacName, traits, 5, size);
                    if (font != null)
                    {
                        font = NSFont.FromDescription(font.FontDescriptor, fontTransform);
                    }
                }
            }
            return(font);
        }
示例#2
0
        public override NSFont ConvertFont(NSFont fontObj, NSFontTraitMask trait)
        {
            // be a little less conservative when converting fonts to use the name when translating to italics.
            // e.g. 'Klavika Medium' translates to 'Klavika Italic' if adding italic trait, instead of
            // 'Klavika Medium Italic'.
            if (trait == NSFontTraitMask.Italic || trait == NSFontTraitMask.Unitalic)
            {
                var          oldName      = (string)FontTypefaceHandler.GetName(fontObj.Handle);
                const string italicSuffix = " Italic";
                string       newName      = null;
                if (trait == NSFontTraitMask.Italic)
                {
                    newName = oldName + italicSuffix;
                }
                else if (oldName.EndsWith(italicSuffix, StringComparison.OrdinalIgnoreCase))
                {
                    newName = oldName.Substring(0, oldName.Length - italicSuffix.Length);
                }

                if (newName != null)
                {
                    foreach (var descriptor in AvailableMembersOfFontFamily(fontObj.FamilyName))
                    {
                        var fontName = (string)Messaging.GetNSObject <NSString>(descriptor.ValueAt(1));
                        if (string.Equals(fontName, newName, StringComparison.OrdinalIgnoreCase))
                        {
                            var postScriptName = (string)Messaging.GetNSObject <NSString>(descriptor.ValueAt(0));
                            return(NSFont.FromFontName(postScriptName, fontObj.PointSize));
                        }
                    }
                }
            }

            return(base.ConvertFont(fontObj, trait));
        }
示例#3
0
 public FontTypefaceHandler(NSArray descriptor)
 {
     PostScriptName = (string)Messaging.GetNSObject <NSString>(descriptor.ValueAt(0));
     _name          = (string)Messaging.GetNSObject <NSString>(descriptor.ValueAt(1));
     Weight         = Messaging.GetNSObject <NSNumber>(descriptor.ValueAt(2))?.Int32Value ?? 1;
     Traits         = (NSFontTraitMask)(Messaging.GetNSObject <NSNumber>(descriptor.ValueAt(3))?.Int32Value ?? 0);
 }
示例#4
0
        public static NSFontTraitMask ToNSFontTraitMask(this FontStyle fontStyle)
        {
            NSFontTraitMask mask = (NSFontTraitMask)0;

            if (fontStyle.HasFlag(FontStyle.Bold))
            {
                mask = mask.SetFlags(NSFontTraitMask.Bold);
            }

            if (fontStyle.HasFlag(FontStyle.Italic))
            {
                mask = mask.SetFlags(NSFontTraitMask.Italic);
            }

            if (fontStyle.HasFlag(FontStyle.Regular))
            {
            }

            if (fontStyle.HasFlag(FontStyle.Strikeout))
            {
            }

            if (fontStyle.HasFlag(FontStyle.Underline))
            {
            }

            return(mask);
        }
示例#5
0
 public FontTypefaceHandler(string postScriptName, string name, NSFontTraitMask traits, int weight)
 {
     PostScriptName = postScriptName;
     this._name     = name;
     Weight         = weight;
     Traits         = traits;
 }
示例#6
0
 public static string ToDesignerString(this NSFontTraitMask mask)
 {
     if (mask.HasFlag(NSFontTraitMask.Bold))
     {
         return(string.Format("{0}.{1}", nameof(NSFontTraitMask), nameof(NSFontTraitMask.Bold)));
     }
     return("default(NSFontTraitMask)");
     //return string.Format("{0}.{1}", nameof(NSFontTraitMask), mask.ToString());
 }
 public static FontData FromFamily(string family, NSFontTraitMask traits, int weight, float size)
 {
     var font = NSFontManager.SharedFontManager.FontWithFamily (family, traits, weight, size);
     var gentraits = NSFontManager.SharedFontManager.TraitsOfFont (font);
     // NSFontManager may loose the traits, restore them here
     if (traits > 0 && gentraits == 0)
         font = NSFontManager.SharedFontManager.ConvertFont (font, traits);
     return FromFont (font);
 }
示例#8
0
        public void Create(FontFamily family, float size, FontStyle style)
        {
#if OSX
            string familyString;
            switch (family)
            {
            case FontFamily.Monospace: familyString = "Courier New"; break;

            default:
            case FontFamily.Sans: familyString = "Helvetica"; break;

            case FontFamily.Serif: familyString = "Times"; break;
            }
            bold = (style & FontStyle.Bold) != 0;

            NSFontTraitMask traits = (bold) ? NSFontTraitMask.Bold : NSFontTraitMask.Unbold;
            italic  = (style & FontStyle.Italic) != 0;
            traits |= (italic) ? NSFontTraitMask.Italic : NSFontTraitMask.Unitalic;
            var font = NSFontManager.SharedFontManager.FontWithFamily(familyString, traits, 3, size * FONT_SIZE_FACTOR);
            if (font == null || font.Handle == IntPtr.Zero)
            {
                throw new Exception(string.Format("Could not allocate font with family {0}, traits {1}, size {2}", familyString, traits, size));
            }
#elif IOS
            string suffix       = string.Empty;
            string italicString = "Italic";
            var    familyString = new StringBuilder();
            switch (family)
            {
            case FontFamily.Monospace: familyString.Append("CourierNewPS"); suffix = "MT"; break;

            default:
            case FontFamily.Sans: familyString.Append("Helvetica"); italicString = "Oblique"; break;

            case FontFamily.Serif: familyString.Append("TimesNewRomanPS"); suffix = "MT"; break;
            }
            bold   = (style & FontStyle.Bold) != 0;
            italic = (style & FontStyle.Italic) != 0;

            if (bold || italic)
            {
                familyString.Append("-");
            }
            if (bold)
            {
                familyString.Append("Bold");
            }
            if (italic)
            {
                familyString.Append(italicString);
            }

            familyString.Append(suffix);
            var font = UIFont.FromName(familyString.ToString(), size);
#endif
            Control = font;
        }
示例#9
0
        public FontTypefaceHandler(NSFont font, NSFontTraitMask?traits = null)
        {
            _font = font;
            var descriptor = font.FontDescriptor;

            PostScriptName = descriptor.PostscriptName;
            var manager = NSFontManager.SharedFontManager;

            Weight = (int)manager.WeightOfFont(font);
            Traits = traits ?? manager.TraitsOfFont(font);
        }
示例#10
0
        public static FontData FromFamily(string family, NSFontTraitMask traits, int weight, float size)
        {
            var font      = NSFontManager.SharedFontManager.FontWithFamily(family, traits, weight, size);
            var gentraits = NSFontManager.SharedFontManager.TraitsOfFont(font);

            // NSFontManager may loose the traits, restore them here
            if (traits > 0 && gentraits == 0)
            {
                font = NSFontManager.SharedFontManager.ConvertFont(font, traits);
            }
            return(FromFont(font));
        }
        static NSFont NSFontWithFamily(string name, NSFontTraitMask traits, int weight, float size)
        {
            if (NSThread.Current.IsMainThread)
            {
                return(NSFontManager.SharedFontManager.FontWithFamily(name, traits, weight, size));
            }

            NSFont font = null;

            NSThread.MainThread.InvokeOnMainThread(() => { font = NSFontManager.SharedFontManager.FontWithFamily(name, traits, weight, size); });
            return(font);
        }
示例#12
0
        bool HasFontAttribute(NSFontTraitMask traitMask)
        {
            NSRange  effectiveRange;
            var      attrib = Control.SelectedRange.Length == 0 ? Control.TypingAttributes : Control.TextStorage.GetAttributes((nnuint)Math.Min(Control.SelectedRange.Location, Control.TextStorage.Length - 1), out effectiveRange, Control.SelectedRange);
            NSObject value;

            if (attrib.TryGetValue(NSStringAttributeKey.Font, out value))
            {
                var font = value as NSFont;
                if (font != null)
                {
                    var traits = NSFontManager.SharedFontManager.TraitsOfFont(font);
                    return(traits.HasFlag(traitMask));
                }
            }
            return(false);
        }
示例#13
0
        public static NSFont ToNSFont(this FigmaTypeStyle style)
        {
            string family = style.fontFamily;

            if (family == "SF UI Text")
            {
                family = ".SF NS Text";
            }
            else if (family == "SF Mono")
            {
                family = ".SF NS Display";
            }
            else
            {
                Console.WriteLine("FONT: {0} - {1}", family, style.fontPostScriptName);
            }

            var             font   = NSFont.FromFontName(family, style.fontSize);
            var             w      = ToAppKitFontWeight(style.fontWeight);
            NSFontTraitMask traits = default(NSFontTraitMask);

            if (style.fontPostScriptName != null && style.fontPostScriptName.EndsWith("-Bold"))
            {
                traits = NSFontTraitMask.Bold;
            }
            else
            {
            }
            //if (font != null)
            //{
            //    var w = NSFontManager.SharedFontManager.WeightOfFont(font);
            //    var traits = NSFontManager.SharedFontManager.TraitsOfFont(font);

            //}

            font = NSFontManager.SharedFontManager.FontWithFamily(family, traits, w, style.fontSize);
            //var font = NSFont.FromFontName(".SF NS Text", 12);

            if (font == null)
            {
                Console.WriteLine($"[ERROR] Font not found :{family}");
                font = NSFont.LabelFontOfSize(style.fontSize);
            }
            return(font);
        }
示例#14
0
        public static FontStyle ToEto(this NSFontTraitMask traits)
        {
            var style = FontStyle.None;

            if (traits.HasFlag(NSFontTraitMask.Bold))
            {
                style |= FontStyle.Bold;
            }
            if (traits.HasFlag(NSFontTraitMask.Italic))
            {
                style |= FontStyle.Italic;
            }
            //if (traits.HasFlag (NSFontTraitMask.Condensed))
            //	style |= FontStyle.Condensed;
            //if (traits.HasFlag (NSFontTraitMask.Narrow))
            //	style |= FontStyle.Light;
            return(style);
        }
示例#15
0
        public void Create(FontFamily family, float size, FontStyle style, FontDecoration decoration)
        {
            this.style      = style;
            this.family     = family;
            this.decoration = decoration;
#if OSX
            var             familyHandler = (FontFamilyHandler)family.Handler;
            NSFontTraitMask traits        = style.ToNS() & familyHandler.TraitMask;
            var             font          = NSFontManager.SharedFontManager.FontWithFamily(familyHandler.MacName, traits, 5, size);
            if (font == null || font.Handle == IntPtr.Zero)
            {
                throw new ArgumentOutOfRangeException(string.Empty, string.Format("Could not allocate font with family {0}, traits {1}, size {2}", family.Name, traits, size));
            }
#elif IOS
            string suffix        = string.Empty;
            var    familyHandler = (FontFamilyHandler)family.Handler;
            var    font          = familyHandler.CreateFont(size, style);

            /*
             * var familyString = new StringBuilder();
             * switch (family)
             * {
             * case FontFamily.Monospace: familyString.Append ("CourierNewPS"); suffix = "MT"; break;
             * default:
             * case FontFamily.Sans: familyString.Append ("Helvetica"); italicString = "Oblique"; break;
             * case FontFamily.Serif: familyString.Append ("TimesNewRomanPS"); suffix = "MT"; break;
             * }
             * bold = (style & FontStyle.Bold) != 0;
             * italic = (style & FontStyle.Italic) != 0;
             *
             * if (bold || italic) familyString.Append ("-");
             * if (bold) familyString.Append ("Bold");
             * if (italic) familyString.Append (italicString);
             *
             * familyString.Append (suffix);
             * var font = UIFont.FromName (familyString.ToString (), size);
             */
#endif
            Control = font;
        }
示例#16
0
        private bool canToggleTrait(NSFont font, NSFontTraitMask trait)
        {
            NSFont testFont = null;

            if ((NSFontTraitMask)((int)font.FontDescriptor.SymbolicTraits & (int)trait) == trait)
            {
                testFont = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait(arcView.Font, trait);
            }
            else
            {
                testFont = NSFontManager.SharedFontManager.ConvertFont(arcView.Font, trait);
            }

            if (testFont != null)
            {
                if ((NSFontTraitMask)(testFont.FontDescriptor.SymbolicTraits ^ font.FontDescriptor.SymbolicTraits) == trait)
                {
                    return(true);
                }
            }
            return(false);
        }
示例#17
0
 private bool canToggleTrait (NSFont font, NSFontTraitMask trait)
 {
         NSFont testFont = null;
         
         if ((NSFontTraitMask)((int)font.FontDescriptor.SymbolicTraits & (int)trait) == trait) {
                 testFont = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (arcView.Font, trait);
         } else {
                 testFont = NSFontManager.SharedFontManager.ConvertFont (arcView.Font, trait);
         }
         
         if (testFont != null) {
                 if ((NSFontTraitMask)(testFont.FontDescriptor.SymbolicTraits ^ font.FontDescriptor.SymbolicTraits) == trait) {
                         return true;
                 }
         }
         return false;
 }
示例#18
0
        public static NSFont ToUIFont(this Font self)
        {
            float fontSize = (float)self.FontSize;

            if (self.UseNamedSize)
            {
                switch (self.NamedSize)
                {
                case NamedSize.Micro:
                    fontSize = 12f;
                    break;

                case NamedSize.Small:
                    fontSize = 14f;
                    break;

                case NamedSize.Medium:
                    fontSize = 17f;
                    break;

                case NamedSize.Large:
                    fontSize = 22f;
                    break;

                default:
                    fontSize = 17f;
                    break;
                }
            }
            bool isBold   = ((Enum)self.FontAttributes).HasFlag((Enum)FontAttributes.Bold);
            bool isItalic = ((Enum)self.FontAttributes).HasFlag((Enum)FontAttributes.Italic);

            int fontWeight = 0;

            NSFontTraitMask mask = 0;

            if (isBold)
            {
                mask = mask | NSFontTraitMask.Bold;
            }
            if (isItalic)
            {
                mask = mask | NSFontTraitMask.Italic;
            }

            String fontFamily;

            if (string.IsNullOrWhiteSpace(self.FontFamily))
            {
                fontFamily = "Verdana";                 // Default OS X font
            }
            else
            {
                fontFamily = self.FontFamily;
            }

            try
            {
                var font = NSFontManager.SharedFontManager.FontWithFamily(
                    fontFamily, mask, fontWeight, fontSize);
                return(font);
            }
            catch
            {
            }
            return(NSFont.SystemFontOfSize((nfloat)fontSize));
        }
示例#19
0
 public static NSFont CreateFont(FontFamilyHandler familyHandler, float size, NSFontTraitMask traits, int weight = 5)
 {
     return(CreateFont(familyHandler.MacName, size, traits, weight));
 }
        public static NSFont GetFont(
            this ResourceDictionary resourceDictionary,
            bool respectScale = true)
        {
            NSFontDescriptor fontDescriptor = null;
            nfloat           fontSize       = 0;

            switch (resourceDictionary[TypefaceId])
            {
            case NSFontDescriptor fd:
                fontDescriptor = fd;
                break;

            case NSFont rdFont:
                fontDescriptor = rdFont.FontDescriptor;
                fontSize       = rdFont.PointSize;
                break;

            case string fontName:
                fontDescriptor = NSFontWorkarounds
                                 .FromFontName(fontName, 0)
                                 .FontDescriptor;
                break;
            }

            switch (resourceDictionary[FontRenderingSizeId])
            {
            case double d:
                fontSize = (nfloat)d;
                break;

            case float f:
                fontSize = f;
                break;

            case nfloat nf:
                fontSize = nf;
                break;

            case int i:
                fontSize = i;
                break;
            }

            if (fontSize <= 0)
            {
                fontSize = NSFont.SystemFontSize;
            }

            if (respectScale && resourceDictionary[FontRenderingScaleId] is double scale)
            {
                fontSize *= (nfloat)scale;
            }

            var font = fontDescriptor == null
                ? NSFontWorkarounds.UserFixedPitchFontOfSize(fontSize)
                : NSFontWorkarounds.FromDescriptor(fontDescriptor, fontSize);

            NSFontTraitMask convertFontTraits = 0;

            if (resourceDictionary.Contains(IsBoldId) &&
                resourceDictionary[IsBoldId] is bool isBold &&
                isBold)
            {
                convertFontTraits |= NSFontTraitMask.Bold;
            }

            if (resourceDictionary.Contains(IsItalicId) &&
                resourceDictionary[IsItalicId] is bool isItalic &&
                isItalic)
            {
                convertFontTraits |= NSFontTraitMask.Italic;
            }

            if (convertFontTraits != 0)
            {
                font = NSFontManager.SharedFontManager.ConvertFontWorkaround(
                    font,
                    convertFontTraits);
            }

            return(font);
        }
示例#21
0
        NSFont UpdateFontTrait(NSFont font, NSFontTraitMask traitMask, NSFontTraitMask traitUnmask, bool enabled)
        {
            var traits = enabled ? traitMask : traitUnmask;

            return(NSFontManager.SharedFontManager.ConvertFont(font, traits));
        }
示例#22
0
 void SetFontAttribute(NSRange range, NSFontTraitMask traitMask, NSFontTraitMask traitUnmask, bool enabled)
 {
     SetFontAttribute(range, enabled, f => UpdateFontTrait(f, traitMask, traitUnmask, enabled));
 }
示例#23
0
 void SetSelectedFontAttribute(NSFontTraitMask traitMask, NSFontTraitMask traitUnmask, bool enabled)
 {
     SetSelectedFontAttribute(enabled, f => UpdateFontTrait(f, traitMask, traitUnmask, enabled));
 }