/// <summary> /// Measures the specified text string. Parameter bounds contains the bounds of the text.<br/> /// Measured values are returned in local coordinate space. /// </summary> /// <param name="bounds">Contains the bounds of the text when returned.</param> /// <returns>The horizontal advance of the measured text (i.e. where the next character should be drawn).</returns> public static float TextBounds(this Nvg nvg, Vector2D <float> pos, string @string, string end, out Rectangle <float> bounds) { bounds = default; Fontstash fons = nvg.fontManager.Fontstash; State state = nvg.stateStack.CurrentState; float scale = nvg.fontManager.GetFontScale() * nvg.pixelRatio.DevicePxRatio; float invscale = 1.0f / scale; if (state.FontId == Fontstash.INVALID) { return(0); } fons.SetSize(state.FontSize * scale); fons.SetSpacing(state.LetterSpacing * scale); fons.SetBlur(state.FontBlur * scale); fons.SetAlign((int)state.TextAlign); fons.SetFont(state.FontId); float width = fons.TextBounds(pos.X * scale, pos.Y * scale, @string, end, out float[] bs); if (bs != null) { fons.LineBounds(pos.Y * scale, out bs[1], out bs[3]); bounds = new Rectangle <float>() { Origin = new Vector2D <float>(bs[0] * invscale, bs[1] * invscale), Size = new Vector2D <float>((bs[2] - bs[0]) * invscale, (bs[3] - bs[1]) * invscale) }; } return(width * invscale); }