/// <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); }
/// <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)); }