private static Vector2 MeasureTextWidth(DynamicFontRenderer renderer, string text, float textScale, out Vector2 yBounds) { float width = 1f; float height = 0; int size = Mathf.CeilToInt(((UIDynamicFont)renderer.font).baseline * textScale) * 2; ((UIDynamicFont)renderer.font).RequestCharacters(text, size, FontStyle.Normal); yBounds = new Vector2(float.MaxValue, float.MinValue); CharacterInfo characterInfo = default; for (int i = 0; i < text.Length; i++) { char c = text[i]; ((UIDynamicFont)renderer.font).baseFont.GetCharacterInfo(c, out characterInfo, size, FontStyle.Normal); if (c == '\t') { width += renderer.tabSize; } else { width += ((c != ' ') ? characterInfo.maxX : (characterInfo.advance + (renderer.characterSpacing * textScale))); height = Mathf.Max(characterInfo.glyphHeight, height); yBounds.x = Mathf.Min(yBounds.x, characterInfo.minY); yBounds.y = Mathf.Max(yBounds.y, characterInfo.maxY); } } if (text.Length > 2) { width += (text.Length - 2) * renderer.characterSpacing * textScale; } return(new Vector2(width, height) / 2f); }
public static void CalcTokenRenderSizeNewTags(DynamicFontRenderer renderer, UIMarkupToken token) { if (token.tokenType == UIMarkupTokenType.StartTag && Matches(token, TAG_LINE) && renderer.spriteAtlas != null && token.GetAttribute(0).m_Value.value.Split(',').Length == 3) { float num = 0f; Texture2D texture = renderer.spriteAtlas.texture; float num3 = ((UIDynamicFont)renderer.font).baseline * renderer.textScale * 2.5f; string value = token.GetAttribute(0).m_Value.value.Split(',')[0]; UITextureAtlas.SpriteInfo spriteInfo = renderer.spriteAtlas[value]; if (spriteInfo != null) { float num4 = spriteInfo.region.width * texture.width / (spriteInfo.region.height * texture.height); num = Mathf.CeilToInt((num3 * num4)); } token.height = Mathf.CeilToInt(num3); typeof(UIMarkupToken).GetProperty("width").GetSetMethod(true).Invoke(token, new object[] { Mathf.CeilToInt(num) }); } }
public override dfFontRendererBase ObtainRenderer() { return(DynamicFontRenderer.Obtain(this)); }
private static void RenderText(DynamicFontRenderer renderer, string text, Vector3 position, float rescale, UIRenderData renderData, float textScale, Color textColor, Color outlineColor) { var uidynamicFont = (UIDynamicFont)renderer.font; float size = ((UIDynamicFont)renderer.font).baseline * textScale; FontStyle style = FontStyle.Normal; int descent = uidynamicFont.Descent * 2; int ascent = renderer.font.baseFont.ascent * 2; PoolList <Vector3> vertices = renderData.vertices; PoolList <int> triangles = renderData.triangles; PoolList <Vector2> uvs = renderData.uvs; PoolList <Color32> colors = renderData.colors; float x = position.x; float y = position.y; renderData.material = uidynamicFont.material; Color color2 = ApplyOpacity(renderer, textColor); Color c = color2; if (renderer.bottomColor != null) { c = ApplyOpacity(renderer, textColor); } for (int i = 0; i < text.Length; i++) { if (i > 0) { x += renderer.characterSpacing * textScale; } if (uidynamicFont.baseFont.GetCharacterInfo(text[i], out CharacterInfo glyph, Mathf.CeilToInt(size) * 2, style)) { float num3 = (glyph.maxY / 2f); float minX = x + (glyph.minX / 2f); float maxY = y + num3; float maxX = minX + (glyph.glyphWidth * rescale / 2f); float minY = maxY - (glyph.glyphHeight / 2f); Vector3 vector = new Vector3(minX, maxY) * renderer.pixelRatio; Vector3 vector2 = new Vector3(maxX, maxY) * renderer.pixelRatio; Vector3 vector3 = new Vector3(maxX, minY) * renderer.pixelRatio; Vector3 vector4 = new Vector3(minX, minY) * renderer.pixelRatio; if (renderer.shadow) { AddTriangleIndices(vertices, triangles); Vector3 b = renderer.shadowOffset * renderer.pixelRatio; vertices.Add(vector + b); vertices.Add(vector2 + b); vertices.Add(vector3 + b); vertices.Add(vector4 + b); Color c2 = ApplyOpacity(renderer, renderer.shadowColor); Color32 item = c2.linear; colors.Add(item); colors.Add(item); colors.Add(item); colors.Add(item); AddUVCoords(uvs, glyph); } if (outlineColor != default) { for (int j = 0; j < kOutlineOffsets.Length; j++) { AddTriangleIndices(vertices, triangles); Vector3 b2 = kOutlineOffsets[j] * renderer.outlineSize * renderer.pixelRatio; vertices.Add(vector + b2); vertices.Add(vector2 + b2); vertices.Add(vector3 + b2); vertices.Add(vector4 + b2); Color c3 = ApplyOpacity(renderer, outlineColor); Color32 item2 = c3.linear; colors.Add(item2); colors.Add(item2); colors.Add(item2); colors.Add(item2); AddUVCoords(uvs, glyph); } } AddTriangleIndices(vertices, triangles); vertices.Add(vector); vertices.Add(vector2); vertices.Add(vector3); vertices.Add(vector4); Color32 item3 = color2.linear; Color32 item4 = c.linear; colors.Add(item3); colors.Add(item3); colors.Add(item4); colors.Add(item4); AddUVCoords(uvs, glyph); x += glyph.maxX / 2f * rescale; } } }
public static void RenderSpriteLine(DynamicFontRenderer renderer, UIMarkupToken token, Vector3 position, UIRenderData destination) { string[] args = token.GetAttribute(0)?.m_Value?.value?.Split(new char[] { ',' }, 3); if (args == null || args.Length != 3) { LogUtils.DoErrorLog($"INVALID ARGUMENT: {token.GetAttribute(0)?.m_Value?.value ?? "<NULL>"}"); return; } UITextureAtlas.SpriteInfo spriteInfo = renderer.spriteAtlas[args[0]]; if (spriteInfo == null) { CODebugBase <InternalLogChannel> .Warn(InternalLogChannel.UI, "Missing sprite " + args[0] + " in " + renderer.spriteAtlas.name); } else { var midLine = new Vector3(position.x, position.y - (((UIDynamicFont)renderer.font).baseline * renderer.textScale / 2)); Texture2D texture = renderer.spriteAtlas.texture; float calcHeight = ((UIDynamicFont)renderer.font).baseline * renderer.textScale * 2f; float calcProportion = spriteInfo.region.width * texture.width / (spriteInfo.region.height * texture.height); float calcWidth = Mathf.CeilToInt(calcHeight * calcProportion); int height = Mathf.CeilToInt(calcHeight); int width = Mathf.CeilToInt(calcWidth); Color32 bgColor = ColorExtensions.FromRGB(args[1]); Color32 color2 = ApplyOpacity(renderer, bgColor); var size = new Vector3(width, height); Vector2 textDimensions = MeasureTextWidth(renderer, args[2], renderer.textScale, out Vector2 yBounds); float imageProportions = width / spriteInfo.width; float borderWidth = renderer.textScale * 2; float textBoundHeight = height - (spriteInfo.border.vertical * imageProportions) - borderWidth; float textBoundWidth = width - (spriteInfo.border.horizontal * imageProportions) - borderWidth; var textAreaSize = new Vector4((spriteInfo.border.left * imageProportions) + (borderWidth / 2), (-spriteInfo.border.top + spriteInfo.border.bottom) * imageProportions / 2, textBoundWidth, textBoundHeight); float textScale = renderer.textScale; float multipler = Mathf.Min(Mathf.Min(3.5f, textAreaSize.z / textDimensions.x), Mathf.Min(3.5f, textAreaSize.w / textDimensions.y)); if (multipler > 1) { textScale *= 1 + ((multipler - 1) / 2.1f); multipler = 1; textDimensions = MeasureTextWidth(renderer, args[2], textScale, out yBounds); } float midLineOffset = (((UIDynamicFont)renderer.font).baseline / 2 * renderer.textScale); Color contrastColor = KlyteMonoUtils.ContrastColor(bgColor); RenderSprite(renderer.spriteBuffer, new RenderOptions { atlas = renderer.spriteAtlas, color = contrastColor, fillAmount = 1f, flip = UISpriteFlip.None, offset = position - new Vector3(0, -(height / 2) + midLineOffset), pixelsToUnits = renderer.pixelRatio, size = size, spriteInfo = spriteInfo }); RenderSprite(renderer.spriteBuffer, new RenderOptions { atlas = renderer.spriteAtlas, color = color2, fillAmount = 1f, flip = UISpriteFlip.None, offset = position - new Vector3(0, -(height / 2) + midLineOffset) + (new Vector3(borderWidth, -borderWidth) / 2), pixelsToUnits = renderer.pixelRatio, size = size - new Vector3(borderWidth, borderWidth), spriteInfo = spriteInfo }); midLineOffset = ((UIDynamicFont)renderer.font).baseline * textScale; Vector3 targetTextPos = midLine + VectorUtils.XY_(textAreaSize) + (new Vector3(textAreaSize.z - (textDimensions.x * multipler), -textDimensions.y) / 2); RenderText(renderer, args[2], targetTextPos, multipler, destination, textScale, contrastColor, bgColor); } }