Cosmos/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntMetrics.cs

81 lines
1.9 KiB
C#

using System;
namespace Orvid.Graphics.FontSupport.fnt
{
internal class FntFontMetrics : FontMetrics
{
private Rectangle box;
public FntFontMetrics(FntFont font)
: base(font)
{
this.box = font.GetBounds();
}
public override int GetHeight()
{
return box.Height;
}
public override int GetAscent()
{
return Math.Abs(box.Y);
}
public override int GetDescent()
{
return box.Height + Math.Abs(box.Y);
}
public override int GetLeading()
{
return Math.Abs(box.X);
}
public override int GetMaxAdvance()
{
return box.Width;
}
public override int CharWidth(char ch)
{
FntGlyph g = ((FntFont)(font)).GetLoader().GetGlyph(ch);
if (g != null)
{
return (int)((g.Width + 1) & ~1);
}
return 0;
}
public override int[] CharsWidths(char[] chars, int start, int len)
{
int[] advances = new int[len];
int adv_idx = 0;
for (int i = start; i < start + len; i++)
{
FntGlyph glyph = ((FntFont)(font)).GetLoader().GetGlyph(chars[i]);
if (adv_idx == 0)
{
advances[adv_idx++] = glyph.Width;
}
else
{
advances[adv_idx++] = advances[adv_idx - 1] + glyph.Width;
}
}
return advances;
}
public override int CharsWidth(char[] chars, int start, int len)
{
int total = 0;
int[] lengths = CharsWidths(chars, start, len);
for (int i = 0; i < lengths.Length; i++)
total += lengths[i];
return total;
}
}
}