diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2013-12-04 20:10:42 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2013-12-05 12:27:39 +0400 |
commit | 354c93ae204a81c06c3807011fa69cfeac085295 (patch) | |
tree | f6ba2fdb94ad3564e2310d2c8b48f78cdc3e97de /Xwt.Mac | |
parent | dc519179e926d81bbae858aace3fedcf579b46f3 (diff) |
[Mac] Fixed font unit tests
Diffstat (limited to 'Xwt.Mac')
-rw-r--r-- | Xwt.Mac/Xwt.Mac/ExpanderBackend.cs | 2 | ||||
-rw-r--r-- | Xwt.Mac/Xwt.Mac/FontBackendHandler.cs | 219 | ||||
-rw-r--r-- | Xwt.Mac/Xwt.Mac/RichTextViewBackend.cs | 6 | ||||
-rw-r--r-- | Xwt.Mac/Xwt.Mac/TextLayoutBackendHandler.cs | 2 | ||||
-rw-r--r-- | Xwt.Mac/Xwt.Mac/ViewBackend.cs | 24 |
5 files changed, 194 insertions, 59 deletions
diff --git a/Xwt.Mac/Xwt.Mac/ExpanderBackend.cs b/Xwt.Mac/Xwt.Mac/ExpanderBackend.cs index cad32673..0ba6f79b 100644 --- a/Xwt.Mac/Xwt.Mac/ExpanderBackend.cs +++ b/Xwt.Mac/Xwt.Mac/ExpanderBackend.cs @@ -81,7 +81,7 @@ namespace Xwt.Mac return Widget.Expander.Font; } set { - Widget.Expander.Font = (NSFont)value; + Widget.Expander.Font = ((FontData)value).Font; } } } diff --git a/Xwt.Mac/Xwt.Mac/FontBackendHandler.cs b/Xwt.Mac/Xwt.Mac/FontBackendHandler.cs index c1d65611..dc7e692b 100644 --- a/Xwt.Mac/Xwt.Mac/FontBackendHandler.cs +++ b/Xwt.Mac/Xwt.Mac/FontBackendHandler.cs @@ -36,7 +36,7 @@ namespace Xwt.Mac { public override object GetSystemDefaultFont () { - return NSFont.SystemFontOfSize (0); + return FontData.FromFont (NSFont.SystemFontOfSize (0)); } public override object GetSystemDefaultMonospaceFont () @@ -52,115 +52,236 @@ namespace Xwt.Mac public override object Create (string fontName, double size, FontStyle style, FontWeight weight, FontStretch stretch) { - object o = NSFont.FromFontName (fontName, (float)size); - o = SetStyle (o, style); - o = SetWeight (o, weight); - o = SetStretch (o, stretch); - return o; + var t = GetStretchTrait (stretch) | GetStyleTrait (style); + var f = NSFontManager.SharedFontManager.FontWithFamily (fontName, t, GetWeightValue (weight), (float)size); + var fd = FontData.FromFont (NSFontManager.SharedFontManager.ConvertFont (f, t)); + fd.Style = style; + fd.Weight = weight; + fd.Stretch = stretch; + return fd; } #region IFontBackendHandler implementation public override object Copy (object handle) { - NSFont f = (NSFont) handle; - return f.Copy (); + FontData f = (FontData) handle; + f = f.Copy (); + f.Font = (NSFont) f.Font.Copy (); + return f; } public override object SetSize (object handle, double size) { - NSFont f = (NSFont) handle; - return NSFontManager.SharedFontManager.ConvertFont (f, (float)size); + FontData f = (FontData) handle; + f = f.Copy (); + f.Font = NSFontManager.SharedFontManager.ConvertFont (f.Font, (float)size); + return f; } public override object SetFamily (object handle, string family) { - NSFont f = (NSFont) handle; - return NSFontManager.SharedFontManager.ConvertFontToFamily (f, family); + FontData f = (FontData) handle; + f = f.Copy (); + f.Font = NSFontManager.SharedFontManager.ConvertFontToFamily (f.Font, family); + return f; } public override object SetStyle (object handle, FontStyle style) { - NSFont f = (NSFont) handle; + FontData f = (FontData) handle; + f = f.Copy (); NSFontTraitMask mask; if (style == FontStyle.Italic || style == FontStyle.Oblique) mask = NSFontTraitMask.Italic; else mask = NSFontTraitMask.Unitalic; - return NSFontManager.SharedFontManager.ConvertFont (f, mask); + f.Font = NSFontManager.SharedFontManager.ConvertFont (f.Font, mask); + f.Style = style; + return f; + } + + static int GetWeightValue (FontWeight weight) + { + switch (weight) { + case FontWeight.Ultralight: + return 2; + case FontWeight.Light: + return 4; + case FontWeight.Normal: + return 5; + case FontWeight.Semibold: + return 7; + case FontWeight.Bold: + return 9; + case FontWeight.Ultrabold: + return 11; + default: + return 13; + } + } + + internal static FontWeight GetWeightFromValue (int w) + { + if (w <= 2) + return FontWeight.Ultralight; + if (w <= 4) + return FontWeight.Light; + if (w <= 6) + return FontWeight.Normal; + if (w <= 8) + return FontWeight.Semibold; + if (w == 9) + return FontWeight.Bold; + if (w <= 12) + return FontWeight.Ultrabold; + return FontWeight.Heavy; + } + + NSFontTraitMask GetStretchTrait (FontStretch stretch) + { + switch (stretch) { + case FontStretch.Condensed: + case FontStretch.ExtraCondensed: + case FontStretch.SemiCondensed: + return NSFontTraitMask.Condensed; + case FontStretch.Normal: + return default (NSFontTraitMask); + default: + return NSFontTraitMask.Expanded; + } + } + + NSFontTraitMask GetStyleTrait (FontStyle style) + { + switch (style) { + case FontStyle.Italic: + case FontStyle.Oblique: + return NSFontTraitMask.Italic; + default: + return default (NSFontTraitMask); + } } public override object SetWeight (object handle, FontWeight weight) { - NSFont f = (NSFont) handle; - NSFontTraitMask mask; - if (weight > FontWeight.Normal) - mask = NSFontTraitMask.Bold; - else - mask = NSFontTraitMask.Unbold; - return NSFontManager.SharedFontManager.ConvertFont (f, mask); + FontData f = (FontData) handle; + f = f.Copy (); + int w = GetWeightValue (weight); + f.Font = NSFontManager.SharedFontManager.FontWithFamily (f.Font.FamilyName, NSFontManager.SharedFontManager.TraitsOfFont (f.Font), w, f.Font.PointSize); + f.Weight = weight; + return f; } public override object SetStretch (object handle, FontStretch stretch) { - NSFont f = (NSFont) handle; - if (stretch < FontStretch.Normal) { - f = NSFontManager.SharedFontManager.ConvertFont (f, NSFontTraitMask.Condensed); - f = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (f, NSFontTraitMask.Expanded); + FontData f = (FontData) handle; + f = f.Copy (); + + NSFont font = f.Font; + if (stretch < FontStretch.SemiCondensed) { + font = NSFontManager.SharedFontManager.ConvertFont (font, NSFontTraitMask.Condensed); + font = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (font, NSFontTraitMask.Compressed | NSFontTraitMask.Expanded | NSFontTraitMask.Narrow); + } + if (stretch == FontStretch.SemiCondensed) { + font = NSFontManager.SharedFontManager.ConvertFont (font, NSFontTraitMask.Narrow); + font = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (font, NSFontTraitMask.Compressed | NSFontTraitMask.Expanded | NSFontTraitMask.Condensed); } else if (stretch > FontStretch.Normal) { - f = NSFontManager.SharedFontManager.ConvertFont (f, NSFontTraitMask.Expanded); - f = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (f, NSFontTraitMask.Condensed); + font = NSFontManager.SharedFontManager.ConvertFont (font, NSFontTraitMask.Expanded); + font = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (font, NSFontTraitMask.Compressed | NSFontTraitMask.Narrow | NSFontTraitMask.Condensed); } else { - f = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (f, NSFontTraitMask.Condensed | NSFontTraitMask.Expanded); + font = NSFontManager.SharedFontManager.ConvertFontToNotHaveTrait (font, NSFontTraitMask.Condensed | NSFontTraitMask.Expanded | NSFontTraitMask.Narrow | NSFontTraitMask.Compressed); } + f.Font = font; + f.Stretch = stretch; return f; } public override double GetSize (object handle) { - NSFont f = (NSFont) handle; - return f.PointSize; + FontData f = (FontData) handle; + return f.Font.PointSize; } public override string GetFamily (object handle) { - NSFont f = (NSFont) handle; - return f.FamilyName; + FontData f = (FontData) handle; + return f.Font.FamilyName; } public override FontStyle GetStyle (object handle) { - NSFont f = (NSFont) handle; - if ((f.FontDescriptor.SymbolicTraits & NSFontSymbolicTraits.ItalicTrait) != 0) - return FontStyle.Italic; - else - return FontStyle.Normal; + FontData f = (FontData) handle; + return f.Style; } public override FontWeight GetWeight (object handle) { - NSFont f = (NSFont) handle; - if ((f.FontDescriptor.SymbolicTraits & NSFontSymbolicTraits.BoldTrait) != 0) - return FontWeight.Bold; - else - return FontWeight.Normal; + FontData f = (FontData) handle; + return f.Weight; } public override FontStretch GetStretch (object handle) { - NSFont f = (NSFont) handle; - var traits = NSFontManager.SharedFontManager.TraitsOfFont (f); + FontData f = (FontData) handle; + return f.Stretch; + } + #endregion + } + + public class FontData + { + public NSFont Font; + public FontStyle Style; + public FontWeight Weight; + public FontStretch Stretch; + + public FontData () + { + } + + public static FontData FromFont (NSFont font) + { + var traits = NSFontManager.SharedFontManager.TraitsOfFont (font); + + FontStretch stretch; if ((traits & NSFontTraitMask.Condensed) != 0) - return FontStretch.Condensed; + stretch = FontStretch.Condensed; + else if ((traits & NSFontTraitMask.Narrow) != 0) + stretch = FontStretch.SemiCondensed; + else if ((traits & NSFontTraitMask.Compressed) != 0) + stretch = FontStretch.ExtraCondensed; else if ((traits & NSFontTraitMask.Expanded) != 0) - return FontStretch.Expanded; + stretch = FontStretch.Expanded; else - return FontStretch.Normal; - } - #endregion + stretch = FontStretch.Normal; + + FontStyle style; + if ((traits & NSFontTraitMask.Italic) != 0) + style = FontStyle.Italic; + else + style = FontStyle.Normal; + return new FontData { + Font = font, + Style = style, + Weight = MacFontBackendHandler.GetWeightFromValue (NSFontManager.SharedFontManager.WeightOfFont (font)), + Stretch = stretch + }; + } + public FontData Copy () + { + return new FontData { + Font = Font, + Style = Style, + Weight = Weight, + Stretch = Stretch + }; + } } + } + diff --git a/Xwt.Mac/Xwt.Mac/RichTextViewBackend.cs b/Xwt.Mac/Xwt.Mac/RichTextViewBackend.cs index 90936e69..14aefe26 100644 --- a/Xwt.Mac/Xwt.Mac/RichTextViewBackend.cs +++ b/Xwt.Mac/Xwt.Mac/RichTextViewBackend.cs @@ -45,7 +45,11 @@ namespace Xwt.Mac public override object Font { get { return base.Font; } set { - font = value as NSFont; + var fd = value as FontData; + if (fd != null) + font = fd.Font; + else + font = null; base.Font = value; } } diff --git a/Xwt.Mac/Xwt.Mac/TextLayoutBackendHandler.cs b/Xwt.Mac/Xwt.Mac/TextLayoutBackendHandler.cs index b2dd59ad..40f3a07d 100644 --- a/Xwt.Mac/Xwt.Mac/TextLayoutBackendHandler.cs +++ b/Xwt.Mac/Xwt.Mac/TextLayoutBackendHandler.cs @@ -63,7 +63,7 @@ namespace Xwt.Mac public override void SetFont (object backend, Xwt.Drawing.Font font) { LayoutInfo li = (LayoutInfo)backend; - li.Font = (NSFont)Toolkit.GetBackend (font); + li.Font = ((FontData)Toolkit.GetBackend (font)).Font; } public override void SetWidth (object backend, double value) diff --git a/Xwt.Mac/Xwt.Mac/ViewBackend.cs b/Xwt.Mac/Xwt.Mac/ViewBackend.cs index f91b7d44..ad2269cf 100644 --- a/Xwt.Mac/Xwt.Mac/ViewBackend.cs +++ b/Xwt.Mac/Xwt.Mac/ViewBackend.cs @@ -122,7 +122,8 @@ namespace Xwt.Mac get { return viewObject; } set { viewObject = value; - viewObject.Backend = this; + if (viewObject.Backend == null) + viewObject.Backend = this; } } @@ -346,25 +347,34 @@ namespace Xwt.Mac newChild.Frame = f; } + FontData customFont; + public virtual object Font { get { + if (customFont != null) + return customFont; + + NSFont font = null; var widget = Widget; if (widget is CustomAlignedContainer) widget = ((CustomAlignedContainer)widget).Child; if (widget is NSControl) - return ((NSControl)(object)widget).Font; - if (widget is NSText) - return ((NSText)(object)widget).Font; - return NSFont.ControlContentFontOfSize (NSFont.SystemFontSize); + font = ((NSControl)(object)widget).Font; + else if (widget is NSText) + font = ((NSText)(object)widget).Font; + else + font = NSFont.ControlContentFontOfSize (NSFont.SystemFontSize); + return customFont = FontData.FromFont (font); } set { + customFont = (FontData) value; var widget = Widget; if (widget is CustomAlignedContainer) widget = ((CustomAlignedContainer)widget).Child; if (widget is NSControl) - ((NSControl)(object)widget).Font = (NSFont) value; + ((NSControl)(object)widget).Font = customFont.Font; if (widget is NSText) - ((NSText)(object)widget).Font = (NSFont) value; + ((NSText)(object)widget).Font = customFont.Font; ResetFittingSize (); } } |