Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
        }