From e2ec8149e7880f281a13a05598ba3ffc1ecfc8e0 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Thu, 1 Aug 2024 06:54:04 +0200 Subject: [PATCH] Do not set the baselineOrigin of ShapedTextRuns to (0,0) and rework the BaselineOffset calculation (#16545) Co-authored-by: Jumar Macato <16554748+jmacato@users.noreply.github.com> --- .../Media/TextFormatting/ShapedTextRun.cs | 3 +-- .../Media/TextFormatting/TextLineImpl.cs | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 9 deletions(-) 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; } ///