Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@xamarin.com>2013-12-04 20:10:42 +0400
committerLluis Sanchez <lluis@xamarin.com>2013-12-05 12:27:39 +0400
commit354c93ae204a81c06c3807011fa69cfeac085295 (patch)
treef6ba2fdb94ad3564e2310d2c8b48f78cdc3e97de /Xwt.Mac
parentdc519179e926d81bbae858aace3fedcf579b46f3 (diff)
[Mac] Fixed font unit tests
Diffstat (limited to 'Xwt.Mac')
-rw-r--r--Xwt.Mac/Xwt.Mac/ExpanderBackend.cs2
-rw-r--r--Xwt.Mac/Xwt.Mac/FontBackendHandler.cs219
-rw-r--r--Xwt.Mac/Xwt.Mac/RichTextViewBackend.cs6
-rw-r--r--Xwt.Mac/Xwt.Mac/TextLayoutBackendHandler.cs2
-rw-r--r--Xwt.Mac/Xwt.Mac/ViewBackend.cs24
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 ();
}
}