internal double Draw( Visual visual, string text, double x, double y, Brush brush, DrawingContext dc, double maxWidth, TextAlignment align, BiaTextTrimmingMode trimming, bool isUseCache) { if (text == null) { return(0d); } return(Draw( visual, text.AsSpan(), x, y, brush, dc, maxWidth, align, trimming, isUseCache)); }
internal double Draw( Visual visual, ReadOnlySpan <char> text, double x, double y, Brush brush, DrawingContext dc, double maxWidth, TextAlignment align, BiaTextTrimmingMode trimming, bool isUseCache) { if (NumberHelper.AreCloseZero(_fontSize)) { return(0); } if (text.Length == 0) { return(0); } maxWidth = Math.Ceiling(maxWidth); if (maxWidth <= 0) { return(0); } var gr = trimming switch { BiaTextTrimmingMode.None => MakeGlyphRunNone(visual, text, maxWidth, isUseCache), BiaTextTrimmingMode.Standard => MakeGlyphRunStandard(visual, text, maxWidth, isUseCache), BiaTextTrimmingMode.Filepath => MakeGlyphRunFilepath(visual, text, maxWidth, isUseCache), _ => throw new ArgumentOutOfRangeException(nameof(trimming), trimming, null) }; if (gr == default) { return(0); } switch (align) { case TextAlignment.Left: break; case TextAlignment.Right: x += maxWidth - gr.Width; break; case TextAlignment.Center: x += (maxWidth - gr.Width) / 2; break; default: throw new ArgumentOutOfRangeException(nameof(align), align, null); } if (NumberHelper.AreCloseZero(x) && NumberHelper.AreCloseZero(y)) { dc.DrawGlyphRun(brush, gr.GlyphRun); } else { var hash = HashCodeMaker.Make(x, y); if (_translateCache.TryGetValue(hash, out var t) == false) { t = new TranslateTransform(x, y); _translateCache.Add(hash, t); } dc.PushTransform(t); dc.DrawGlyphRun(brush, gr.GlyphRun); dc.Pop(); } return(gr.Width); }