Browse Source

Do not set the baselineOrigin of ShapedTextRuns to (0,0) and rework the BaselineOffset calculation (#16545)

Co-authored-by: Jumar Macato <[email protected]>
Benedikt Stebner 1 year ago
parent
commit
e2ec8149e7

+ 1 - 2
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()

+ 16 - 7
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;
         }
 
         /// <inheritdoc/>