diff --git a/CHANGELOG.md b/CHANGELOG.md index 673bc39..0a611c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,7 +32,7 @@ Fixes ### MLEM.Extended Improvements -- Adjusted GenericStashFont line height calculations to result in the same values as GenericSpriteFont +- Adjusted GenericStashFont line height calculations to result in values closer to GenericSpriteFont and added a constructor parameter to set a custom line height ### MLEM.Data Additions diff --git a/MLEM.Extended/Font/GenericStashFont.cs b/MLEM.Extended/Font/GenericStashFont.cs index 1b497ee..bbe5579 100644 --- a/MLEM.Extended/Font/GenericStashFont.cs +++ b/MLEM.Extended/Font/GenericStashFont.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Text; using FontStashSharp; using Microsoft.Xna.Framework; @@ -24,12 +25,19 @@ namespace MLEM.Extended.Font { /// Creates a new generic font using . /// Optionally, a bold and italic version of the font can be supplied. /// + /// + /// doesn't expose a text-independent line height (https://github.com/rds1983/FontStashSharp/blob/main/src/FontStashSharp/DynamicSpriteFont.cs#L130). + /// Since exposes , there is somewhat of an incompatibility between the two. + /// Because of this, uses a heuristic to determine a text-independent line height based on the tallest character out of a set of predetermined characters (spaces, numbers and uppercase and lowercase A through Z). + /// Because this heuristic is just that, and because it excludes non-latin characters, the desired line height can be specified using , overriding the default heuristic. + /// /// The font to wrap /// A bold version of the font /// An italic version of the font - public GenericStashFont(SpriteFontBase font, SpriteFontBase bold = null, SpriteFontBase italic = null) { + /// The line height that should be used for instead of the heuristic described in the remarks + public GenericStashFont(SpriteFontBase font, SpriteFontBase bold = null, SpriteFontBase italic = null, float? lineHeight = null) { this.Font = font; - this.LineHeight = CalculateLineHeight(font); + this.LineHeight = lineHeight ?? CalculateLineHeight(font); this.Bold = bold != null ? new GenericStashFont(bold) : this; this.Italic = italic != null ? new GenericStashFont(italic) : this; } @@ -54,11 +62,11 @@ namespace MLEM.Extended.Font { // this is the same calculation used internally by StaticSpriteFont return s.FontSize + s.LineSpacing; } else { - // Y (min y) just stores the glyph's Y offset, whereas Y2 (max y) stores the glyph's height - // since we technically want line spacing rather than line height, we calculate it like this - var bounds = new Bounds(); - font.TextBounds(" ", Vector2.Zero, ref bounds); - return bounds.Y2 + (bounds.Y2 - bounds.Y); + // use a heuristic to determine the text-independent line heights as described in the constructor remarks + return new[] {' ', '\n', OneEmSpace, Zwsp, Nbsp} + .Concat(Enumerable.Range('a', 'z' - 'a' + 1).SelectMany(c => new[] {(char) c, char.ToUpper((char) c)})) + .Concat(Enumerable.Range('0', '9' - '0' + 1).Select(c => (char) c)) + .Select(c => font.MeasureString(c.ToString()).Y).Max(); } }