public void DrawString(YSpriteFont font, string text, Vector2 position, float font_size, Vector2? area = null, Color? color = null, FontJustification justification = FontJustification.Left) { position.X = (int)position.X; position.Y = (int)position.Y + font.Line0VerticalOffset; Color c = (color.HasValue) ? color.Value : new Color(1,1,1,1f); Vector2 a = (area.HasValue ? area.Value : Vector2.Zero); InternalBeginDrawString(font.Texture); font.DrawInto(this, text, position, c, a, justification, font_size); InternalEndDrawString(); }
public void Draw(YSpriteBatch spritebatch, YSpriteFont font, Rectangle area, string text, float font_size, FontJustification justification, Color color) { if (text != null && text != string.Empty) { // if (m_InternalCaption != text) { m_InternalCaption = text; m_InternalCaptionWithLineBreaks = font.BreakStringIntoLines(m_InternalCaption, area.Width, font_size); } spritebatch.DrawString(font, m_InternalCaptionWithLineBreaks, new Vector2(area.X, area.Y), font_size, new Vector2(area.Width, area.Height), color: color, justification: justification); } }
/// <inheritdoc /> /// <summary> /// Applies the specified justification /// </summary> /// <param name="justification">Justification to use</param> public virtual void SetJustification(FontJustification justification) { // If "keep current" justification is set, do nothing if (justification == FontJustification.NOP) { return; } Justification = justification; if (JustificationCommands.ContainsKey(justification)) { byte[] cmd = JustificationCommands[justification]; if (cmd != null) { internalSend(cmd); } } }
public FontAsset(string text, Color color, FloatRectangle position, FontFamily fontFamily, FontJustification justification = FontJustification.Left, int?caretPos = null, bool?multiLine = false) { Text.Value = text; FontColor.Value = color; Position.Value = position; if (fontFamily != null) { FontName.Value = Solids.Instance.Fonts.Fonts.First(t => t.Value.FontName == fontFamily.FontName).Key; } //FontFamily = fontFamily; Justification.Value = justification; CaretPos.Value = caretPos; if (multiLine.HasValue && multiLine.Value) { MultiLine.Value = true; } Text.SetChangeAction(() => fontKey = "x"); }
public static Vector2 DrawFontAsset( SmartSpriteBatch spriteBatch, ScreenAbstractor screen, float opacity, string text, Color?fontColor, FloatRectangle?position, float fontSize, float?lineHeight, string fontName, bool pseudoAntiAlias, bool wordWrap, FontJustification justification, float fontMargin, Thickness margin = null, Color?outlineColor = null, FloatRectangle?clip = null, Texture2D bgTexture = null, Vector2?scrollOffset = null, int?caretPos = null, bool multiLine = false, Rectangle?scissorRect = null) { if (position == null) { return(Vector2.Zero); } if (string.IsNullOrWhiteSpace(text)) { return(Vector2.Zero); } List <string> textValues = new List <string> { text }; if (multiLine) { textValues = text.ToList(); } if (fontSize == 0) { fontSize = 24; } float lHeight = fontSize * 1.25f; if (lineHeight.HasValue) { lHeight = lineHeight.Value; } float translatedBaseSize = screen.Translate(new Vector2(1f, 1f)).Y; float fontSizeRatio = (translatedBaseSize / 1080f); float translatedFontSize = fontSizeRatio * fontSize; FontFamily fontFamily = Solids.Instance.Fonts.Fonts[fontName]; if (fontFamily == null) { return(Vector2.Zero); } string currentKey = translatedFontSize.ToString() + fontFamily.ToString(); BMFont myFont = fontFamily.GetFont((int)translatedFontSize); Vector2 sizeOfI = myFont.MeasureString("Igj'#" + FontSystem.MDL2Symbols.Download.AsChar()); float translatedWidth = screen.Translate(position).Value.Width; float wordWrapWidth = translatedWidth; if (margin != null) { wordWrapWidth = wordWrapWidth - screen.Translate(new Vector2(margin.Left + margin.Right, 0)).X; position = new FloatRectangle(position.Value.X, position.Value.Y + margin.Top, position.Value.Width, position.Value.Height); } Vector2 size = myFont.MeasureString(text); float scale = translatedFontSize / sizeOfI.Y; if (wordWrap && multiLine) { List <string> lines = textValues.ToList(); textValues = new List <string>(); string reconstructedLine = ""; foreach (string line in lines) { string[] words = line.Split(' '); for (int i = 0; i < words.Length; i++) { string withoutCurrentWord = reconstructedLine; reconstructedLine = reconstructedLine + words[i] + " "; Vector2 wwSize = myFont.MeasureString(reconstructedLine); if (wwSize.X * scale > wordWrapWidth) { textValues.Add(withoutCurrentWord); reconstructedLine = ""; i = i - 1; } } } textValues.Add(reconstructedLine); } float ulHeight = lHeight / translatedBaseSize; Vector2 calcSize = Vector2.Zero; for (int i = 0; i < textValues.Count; i++) { FloatRectangle positionValue = new FloatRectangle(position.Value.X, position.Value.Y + (ulHeight * i), position.Value.Width, ulHeight); FloatRectangle fontPos = new FloatRectangle(positionValue.X, positionValue.Y + fontMargin, positionValue.Width, positionValue.Height - (fontMargin * 2f)); string textValue = textValues[i]; FloatRectangle?tclip = screen.Translate(clip); FloatRectangle positionRectangle = new FloatRectangle(); FloatRectangle translatedPosition = screen.Translate(fontPos).Value; if (tclip.HasValue) { if (translatedPosition.Right < tclip.Value.X || translatedPosition.X > tclip.Value.Right) { return(Vector2.Zero); } } if (string.IsNullOrWhiteSpace(fontName)) { return(Vector2.Zero); } float width = size.X * scale; switch (justification) { case FontJustification.Left: { positionRectangle = new FloatRectangle(translatedPosition.X, translatedPosition.Y, width, translatedPosition.Height); break; } case FontJustification.Right: { positionRectangle = new FloatRectangle(translatedPosition.Right - width, translatedPosition.Y, width, translatedPosition.Height); break; } case FontJustification.Center: { positionRectangle = new FloatRectangle(translatedPosition.X + (translatedPosition.Width / 2f) - (width / 2f), translatedPosition.Y, width, translatedPosition.Height); break; } } if (caretPos != null) { using (new SmartSpriteBatchManager(Solids.Instance.SpriteBatch, scissorRect: tclip)) { float actualCarotPos = (width / text.Length) * caretPos.Value; float oppax = (DateTime.Now.Millisecond % 250) / 250f; spriteBatch.DrawLine( new Vector2(positionRectangle.X + actualCarotPos, positionRectangle.Y), new Vector2(positionRectangle.X + actualCarotPos, positionRectangle.Bottom), Color.White * oppax, tclip, 1f); } } Rectangle source = new Rectangle(0, 0, (int)size.X, (int)size.Y); tclip = tclip?.Clamp(scissorRect); (Rectangle position, Rectangle? source)translator = TextureHelpers.GetAdjustedDestAndSourceAfterClip(positionRectangle, source, tclip); Solids.Instance.SpriteBatch.Scissor = tclip.ToRectangle(); Rectangle tmp = Solids.Instance.Bounds; if (tclip.HasValue) { tmp = tclip.Clamp(scissorRect).ToRectangle; } Solids.Instance.SpriteBatch.Scissor = tmp; using (new SmartSpriteBatchManager(Solids.Instance.SpriteBatch)) { if ((pseudoAntiAlias || outlineColor.HasValue)) { Color?cl = fontColor * opacity * 0.3f; if (outlineColor.HasValue) { cl = outlineColor.Value * opacity; } for (int y = -1; y <= 1; y = y + 2) { for (int x = -1; x <= 1; x = x + 2) { myFont.DrawText(Solids.Instance.SpriteBatch, translator.position.X + x, translator.position.Y + y, textValue, cl, scale); } } } myFont.DrawText(Solids.Instance.SpriteBatch, translator.position.X, translator.position.Y, textValue, fontColor * opacity, scale); calcSize = new Vector2(position.Value.Width, calcSize.Y + lHeight); } Solids.Instance.SpriteBatch.Scissor = null; } float actHeight = screen.Untranslate(calcSize.Y); if (margin != null) { calcSize.Y = calcSize.Y + margin.Bottom; } return(new Vector2(position.Value.Width, actHeight)); }