Browse Source

[Bidi] Optimize alloc of double dictionary

pull/9952/head
Sergey Mikolaitis 4 years ago
parent
commit
31beefe487
  1. 11
      src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs

11
src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs

@ -67,7 +67,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// The forward mapping maps the start index to the end index.
/// The reverse mapping maps the end index to the start index.
/// </remarks>
private readonly BidiDictionary<int, int> _isolatePairs = new BidiDictionary<int, int>();
private BidiDictionary<int, int>? _isolatePairs;
/// <summary>
/// The working BiDi classes
@ -228,7 +228,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
ArraySlice<sbyte>? outLevels)
{
// Reset state
_isolatePairs.Clear();
_isolatePairs?.Clear();
_workingClassesBuffer.Clear();
_levelRuns.Clear();
_resolvedLevelsBuffer.Clear();
@ -324,7 +324,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
// Skip isolate pairs
// (Because we're working with a slice, we need to adjust the indices
// we're using for the isolatePairs map)
if (_isolatePairs.TryGetValue(data.Start + i, out i))
if (_isolatePairs?.TryGetValue(data.Start + i, out i) == true)
{
i -= data.Start;
}
@ -379,6 +379,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{
if (_pendingIsolateOpenings.Count > 0)
{
_isolatePairs ??= new BidiDictionary<int, int>();
_isolatePairs.Add(_pendingIsolateOpenings.Pop(), i);
}
@ -499,7 +500,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
if (resolvedIsolate == BidiClass.FirstStrongIsolate)
{
if (!_isolatePairs.TryGetValue(i, out var endOfIsolate))
if (_isolatePairs == null || !_isolatePairs.TryGetValue(i, out var endOfIsolate))
{
endOfIsolate = _originalClasses.Length;
}
@ -830,7 +831,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
var lastCharacterIndex = _isolatedRunMapping[_isolatedRunMapping.Length - 1];
var lastType = _originalClasses[lastCharacterIndex];
if ((lastType == BidiClass.LeftToRightIsolate || lastType == BidiClass.RightToLeftIsolate || lastType == BidiClass.FirstStrongIsolate) &&
_isolatePairs.TryGetValue(lastCharacterIndex, out var nextRunIndex))
_isolatePairs?.TryGetValue(lastCharacterIndex, out var nextRunIndex) == true)
{
// Find the continuing run index
runIndex = FindRunForIndex(nextRunIndex);

Loading…
Cancel
Save