709
}
710
711
>
function search(T: IntervalTree, filterOwnerId: number, filterOutValidation: boolean, filterFontDecorations: boolean, cachedVersionId: number, onlyMarginDecorations: boolean): IntervalNode[] {
intervalTree.ts
712
>
let node = T.root;
713
>
let delta = 0;
714
>
let nodeStart = 0;
715
>
let nodeEnd = 0;
716
>
const result: IntervalNode[] = [];
717
>
let resultLen = 0;
718
>
while (node !== SENTINEL) {
719
>
if (getNodeIsVisited(node)) {
720
>
// going up from this node
721
>
setNodeIsVisited(node.left, false);
722
>
setNodeIsVisited(node.right, false);
723
>
if (node === node.parent.right) {
724
delta -= node.parent.delta;
725
}
727
>
continue;
728
>
}
729
>
730
>
if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) {
731
// go left
732
node = node.left;
733
continue;
734
}
736
>
// handle current node
737
>
nodeStart = delta + node.start;
738
>
nodeEnd = delta + node.end;
739
>
740
>
node.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId);
741
>
742
>
let include = true;
743
>
if (filterOwnerId && node.ownerId && node.ownerId !== filterOwnerId) {
744
include = false;
745
}
746
>
if (filterOutValidation && getNodeIsForValidation(node)) {
intervalTree.ts
747
include = false;
748
}
749
>
if (filterFontDecorations && getNodeAffectsFont(node)) {
intervalTree.ts
750
include = false;
751
}
752
>
if (onlyMarginDecorations && !getNodeIsInGlyphMargin(node)) {
intervalTree.ts
753
include = false;
754
}
756
>
if (include) {
757
>
result[resultLen++] = node;
758
>
}
759
>
760
>
setNodeIsVisited(node, true);
761
>
762
>
if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {
763
// go right
764
delta += node.delta;