diff --git a/src/Avalonia.Base/Media/TextFormatting/ShapedTextRun.cs b/src/Avalonia.Base/Media/TextFormatting/ShapedTextRun.cs index f01de9cc9e..05f3f84d45 100644 --- a/src/Avalonia.Base/Media/TextFormatting/ShapedTextRun.cs +++ b/src/Avalonia.Base/Media/TextFormatting/ShapedTextRun.cs @@ -204,8 +204,7 @@ namespace Avalonia.Media.TextFormatting ShapedBuffer.FontRenderingEmSize, Text, ShapedBuffer, - biDiLevel: BidiLevel, - baselineOrigin: new Point()); + biDiLevel: BidiLevel); } public void Dispose() diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs index 154c98ae54..c6da172604 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs @@ -96,7 +96,7 @@ namespace Avalonia.Media.TextFormatting { case DrawableTextRun drawableTextRun: { - var offsetY = GetBaselineOffset(this, drawableTextRun); + var offsetY = GetBaselineOffset(drawableTextRun); drawableTextRun.Draw(drawingContext, new Point(currentX, currentY + offsetY)); @@ -108,29 +108,38 @@ namespace Avalonia.Media.TextFormatting } } - private static double GetBaselineOffset(TextLine textLine, DrawableTextRun textRun) + private double GetBaselineOffset(DrawableTextRun textRun) { var baseline = textRun.Baseline; var baselineAlignment = textRun.Properties?.BaselineAlignment; + var baselineOffset = -baseline; + switch (baselineAlignment) { case BaselineAlignment.Baseline: - return textLine.Baseline; + baselineOffset += Baseline; + break; case BaselineAlignment.Top: case BaselineAlignment.TextTop: - return textLine.Baseline - textLine.Extent + textRun.Size.Height / 2; + baselineOffset += Height - Extent + textRun.Size.Height / 2; + break; case BaselineAlignment.Center: - return textLine.Height / 2 + baseline - textRun.Size.Height / 2; + baselineOffset += Height / 2 + baseline - textRun.Size.Height / 2; + break; case BaselineAlignment.Subscript: case BaselineAlignment.Bottom: case BaselineAlignment.TextBottom: - return textLine.Height - textRun.Size.Height + baseline; + baselineOffset += Height - textRun.Size.Height + baseline; + break; case BaselineAlignment.Superscript: - return baseline; + baselineOffset += baseline; + break; default: throw new ArgumentOutOfRangeException(nameof(baselineAlignment), baselineAlignment, null); } + + return baselineOffset; } ///