Browse Source

Use TextLine.GetTextBounds in BackgroundGeometryBuilder. Fixes visual problems with bidirectional text.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5421 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
2b23a870f5
  1. 16
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/BackgroundGeometryBuilder.cs

16
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/BackgroundGeometryBuilder.cs

@ -125,9 +125,19 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -125,9 +125,19 @@ namespace ICSharpCode.AvalonEdit.Rendering
break;
if (segmentStartVC > visualEndCol)
continue;
double left = line.GetDistanceFromCharacterHit(new CharacterHit(Math.Max(segmentStartVC, visualStartCol), 0));
double right = line.GetDistanceFromCharacterHit(new CharacterHit(Math.Min(segmentEndVC, visualEndCol), 0));
int segmentStartVCInLine = Math.Max(segmentStartVC, visualStartCol);
int segmentEndVCInLine = Math.Min(segmentEndVC, visualEndCol);
y -= scrollOffset.Y;
if (segmentStartVCInLine == segmentEndVCInLine) {
// GetTextBounds crashes for length=0, so we'll handle this case with GetDistanceFromCharacterHit
// We need to return a rectangle to ensure empty lines are still visible
double pos = line.GetDistanceFromCharacterHit(new CharacterHit(segmentStartVCInLine, 0));
pos -= scrollOffset.X;
yield return new Rect(pos, y, 1, line.Height);
} else {
foreach (TextBounds b in line.GetTextBounds(segmentStartVCInLine, segmentEndVCInLine - segmentStartVCInLine)) {
double left = b.Rectangle.Left;
double right = b.Rectangle.Right;
left -= scrollOffset.X;
right -= scrollOffset.X;
// left>right is possible in RTL languages
@ -135,6 +145,8 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -135,6 +145,8 @@ namespace ICSharpCode.AvalonEdit.Rendering
}
}
}
}
}
PathFigureCollection figures = new PathFigureCollection();
PathFigure figure;

Loading…
Cancel
Save