/// <summary>
        /// Creates an immutable clone of the <see cref="TextDecorationCollection"/>.
        /// </summary>
        /// <returns>The immutable clone.</returns>
        public ImmutableTextDecoration[] ToImmutable()
        {
            var immutable = new ImmutableTextDecoration[Count];

            for (var i = 0; i < Count; i++)
            {
                immutable[i] = this[i].ToImmutable();
            }

            return(immutable);
        }
Exemple #2
0
        /// <summary>
        /// Draws the <see cref="TextDecoration"/> at given origin.
        /// </summary>
        /// <param name="drawingContext">The drawing context.</param>
        /// <param name="textDecoration">The text decoration.</param>
        /// <param name="origin">The origin.</param>
        private void DrawTextDecoration(IDrawingContextImpl drawingContext, ImmutableTextDecoration textDecoration, Point origin)
        {
            var textFormat = Style.TextFormat;

            var fontMetrics = Style.TextFormat.FontMetrics;

            var thickness = textDecoration.Pen?.Thickness ?? 1.0;

            switch (textDecoration.PenThicknessUnit)
            {
            case TextDecorationUnit.FontRecommended:
                switch (textDecoration.Location)
                {
                case TextDecorationLocation.Underline:
                    thickness = fontMetrics.UnderlineThickness;
                    break;

                case TextDecorationLocation.Strikethrough:
                    thickness = fontMetrics.StrikethroughThickness;
                    break;
                }
                break;

            case TextDecorationUnit.FontRenderingEmSize:
                thickness = textFormat.FontRenderingEmSize * thickness;
                break;
            }

            switch (textDecoration.Location)
            {
            case TextDecorationLocation.Overline:
                origin += new Point(0, textFormat.FontMetrics.Ascent);
                break;

            case TextDecorationLocation.Strikethrough:
                origin += new Point(0, -textFormat.FontMetrics.StrikethroughPosition);
                break;

            case TextDecorationLocation.Underline:
                origin += new Point(0, -textFormat.FontMetrics.UnderlinePosition);
                break;
            }

            switch (textDecoration.PenOffsetUnit)
            {
            case TextDecorationUnit.FontRenderingEmSize:
                origin += new Point(0, textDecoration.PenOffset * textFormat.FontRenderingEmSize);
                break;

            case TextDecorationUnit.Pixel:
                origin += new Point(0, textDecoration.PenOffset);
                break;
            }

            var pen = new ImmutablePen(
                textDecoration.Pen?.Brush ?? Style.Foreground.ToImmutable(),
                thickness,
                textDecoration.Pen?.DashStyle?.ToImmutable(),
                textDecoration.Pen?.LineCap ?? default,
                textDecoration.Pen?.LineJoin ?? PenLineJoin.Miter,
                textDecoration.Pen?.MiterLimit ?? 10.0);

            drawingContext.DrawLine(pen, origin, origin + new Point(GlyphRun.Bounds.Width, 0));
        }