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