public void DrawLocalString(SpriteBatch batch, string text, Vector2 to, TextStyle style, Rectangle bounds, TextAlignment align, Rectangle margin, UIElementState state)
{
//TODO: We should find some way to cache this data
/**
* Work out the scale of the vector font.
*
* We need to scale it based on the UIElement's scale factory,
* but we also need to scale it based on the text styles scale factor.
*
* Aka if the vector font is 12px and we asked for 24px it would be scale of 2.0
*/
var scale = _Scale;
if (style.Scale != 1.0f)
{
scale = new Vector2(scale.X * style.Scale, scale.Y * style.Scale);
}
/** Work out how big the text will be so we can align it **/
var textSize = style.SpriteFont.MeasureString(text);
Vector2 size = textSize * style.Scale;
/** Apply margins **/
if (margin != Rectangle.Empty)
{
bounds.X += margin.X;
bounds.Y += margin.Y;
bounds.Width -= margin.Right;
bounds.Height -= margin.Bottom;
}
/** Work out X and Y based on alignment & bounding box **/
var pos = to;
pos.X += bounds.X;
pos.Y += bounds.Y;
if ((align & TextAlignment.Right) == TextAlignment.Right)
{
pos.X += (bounds.Width - size.X);
}
else if ((align & TextAlignment.Center) == TextAlignment.Center)
{
pos.X += (bounds.Width - size.X) / 2;
}
if ((align & TextAlignment.Middle) == TextAlignment.Middle)
{
pos.Y += (bounds.Height - size.Y) / 2;
}
else if ((align & TextAlignment.Bottom) == TextAlignment.Bottom)
{
pos.Y += (bounds.Height - size.Y);
}
//pos.Y += style.BaselineOffset;
/** Draw the string **/
pos = FlooredLocalPoint(pos);
if (style.Shadow) batch.DrawString(style.SpriteFont, text, pos + new Vector2(1, 1), Color.Black, 0, Vector2.Zero, scale, SpriteEffects.None, 0);
batch.DrawString(style.SpriteFont, text, pos, style.GetColor(state), 0, Vector2.Zero, scale, SpriteEffects.None, 0);
}