public bool MoveNext() { int runCount = _line.Runs.Count; for (; _runIndex < runCount; _runIndex++) { Line.Run run = _line.Runs[_runIndex]; if ((run.level & 1) != 0) { int index = _charIndex; int limit = run.offset + run.length; if (index == -1) { index = run.offset; } for (; index < limit; index++) { int mirror = PairingLookup.DetermineMirror(_line.Text[index]); if (mirror != 0) { _charIndex = index + 1; _agent.index = index; _agent.mirror = mirror; return(true); } } } _charIndex = -1; } Reset(); return(false); }
private void ResolveBrackets() { BidiLink strongLink = null; _bracketQueue.Clear(Level.MakeEmbeddingType(_level)); for (BidiLink link = _roller.Next; link != _roller; link = link.Next) { CharType type = link.type; switch (type) { case CharType.ON: BracketType bracketType; char ch = Text[link.offset]; int bracketValue = PairingLookup.DetermineBracketPair((int)ch, out bracketType); switch (bracketType) { case BracketType.Open: BracketPair bracketPair = new BracketPair() { bracketUnicode = ch, openingLink = link, priorStrongLink = strongLink }; _bracketQueue.Enqueue(bracketPair); break; case BracketType.Close: if (!_bracketQueue.IsEmpty) { _bracketQueue.ClosePair(link, bracketValue); if (_bracketQueue.ShouldDequeue) { ResolveAvailableBracketPairs(); } } break; } break; case CharType.L: case CharType.R: case CharType.AL: case CharType.EN: case CharType.AN: if (!_bracketQueue.IsEmpty) { if (type == CharType.EN || type == CharType.AN) { type = CharType.R; } _bracketQueue.SetStrongType(type); } strongLink = link; break; } } ResolveAvailableBracketPairs(); }