/// <summary> /// This utility will draw a line of text onto the UIElement. /// </summary> /// <param name="batch">The SpriteBatch to draw the text onto</param> /// <param name="text">The content of the text</param> /// <param name="to">The position of the text. Relative to this UIElement.</param> /// <param name="style">The text style</param> /// <param name="bounds">Rectangle relative to this UIElement which the text should be positioned within</param> /// <param name="align">Alignment of the text within the bounds box.</param> /// <param name="margin">Margin offset from the bounding box.</param> /// <param name="state">State of the text, e.g. hover, down, normal</param> 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); }
/// <summary> /// This utility will draw a line of text onto the UIElement. /// </summary> /// <param name="batch">The SpriteBatch to draw the text onto</param> /// <param name="text">The content of the text</param> /// <param name="to">The position of the text. Relative to this UIElement.</param> /// <param name="style">The text style</param> /// <param name="bounds">Rectangle relative to this UIElement which the text should be positioned within</param> /// <param name="align">Alignment of the text within the bounds box.</param> /// <param name="margin">Margin offset from the bounding box.</param> /// <param name="state">State of the text, e.g. hover, down, normal</param> 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 size = (align == 0) ? Vector2.Zero : style.MeasureString(text); /** 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.VFont != null) { batch.End(); Matrix?mat = null; var ui = (batch as UISpriteBatch); if (ui != null && ui.BatchMatrixStack.Count > 0) { mat = ui.BatchMatrixStack.Peek(); } if (style.Shadow) { style.VFont.Draw(batch.GraphicsDevice, text, pos + new Vector2(FSOEnvironment.DPIScaleFactor), Color.Black, scale, mat); } style.VFont.Draw(batch.GraphicsDevice, text, pos, style.GetColor(state) * Opacity, scale, mat); if (mat != null) { batch.Begin(transformMatrix: mat, rasterizerState: RasterizerState.CullNone); } else { batch.Begin(rasterizerState: RasterizerState.CullNone); } } else { if (style.Shadow) { batch.DrawString(style.SpriteFont, text, pos + new Vector2(FSOEnvironment.DPIScaleFactor), Color.Black, 0, Vector2.Zero, scale, SpriteEffects.None, 0); } batch.DrawString(style.SpriteFont, text, pos, style.GetColor(state) * Opacity, 0, Vector2.Zero, scale, SpriteEffects.None, 0); } }
/// <summary> /// This utility will draw a line of text onto the UIElement. /// </summary> /// <param name="batch">The SpriteBatch to draw the text onto</param> /// <param name="text">The content of the text</param> /// <param name="to">The position of the text. Relative to this UIElement.</param> /// <param name="style">The text style</param> /// <param name="bounds">Rectangle relative to this UIElement which the text should be positioned within</param> /// <param name="align">Alignment of the text within the bounds box.</param> /// <param name="margin">Margin offset from the bounding box.</param> /// <param name="state">State of the text, e.g. hover, down, normal</param> 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); }