Browse Source

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>
pull/16568/head
Benedikt Stebner 2 years ago
committed by GitHub
parent
commit
e2ec8149e7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      src/Avalonia.Base/Media/TextFormatting/ShapedTextRun.cs
  2. 23
      src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs

3
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()

23
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/>

Loading…
Cancel
Save