650
currentLineRelativeOffset -= bigNumbersDelta;
651
}
653
>
const linesOffsets: number[] = [];
654
>
655
>
const verticalCenter = verticalOffset1 + (verticalOffset2 - verticalOffset1) / 2;
656
>
let centeredLineNumber = -1;
657
>
658
>
// Figure out how far the lines go
659
>
for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {
660
>
const lineHeight = this.getLineHeightForLineNumber(lineNumber);
661
>
if (centeredLineNumber === -1) {
662
>
const currentLineTop = currentVerticalOffset;
663
>
const currentLineBottom = currentVerticalOffset + lineHeight;
664
>
if ((currentLineTop <= verticalCenter && verticalCenter < currentLineBottom) || currentLineTop > verticalCenter) {
665
>
centeredLineNumber = lineNumber;
666
>
}
667
>
}
668
>
669
>
// Count current line height in the vertical offsets
670
>
currentVerticalOffset += lineHeight;
671
>
linesOffsets[lineNumber - startLineNumber] = currentLineRelativeOffset;
672
>
673
>
// Next line starts immediately after this one
674
>
currentLineRelativeOffset += lineHeight;
675
>
while (currentWhitespaceAfterLineNumber === lineNumber) {
676
>
// Push down next line with the height of the current whitespace
677
>
currentLineRelativeOffset += currentWhitespaceHeight;
678
>
679
>
// Count current whitespace in the vertical offsets
680
>
currentVerticalOffset += currentWhitespaceHeight;
681
>
whitespaceIndex++;
682
>
683
>
if (whitespaceIndex >= whitespaceCount) {
684
>
currentWhitespaceAfterLineNumber = endLineNumber + 1;
685
>
} else {
686
currentWhitespaceAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex) | 0;
687
currentWhitespaceHeight = this.getHeightForWhitespaceIndex(whitespaceIndex) | 0;
688
}
690
>
691
>
if (currentVerticalOffset >= verticalOffset2) {
692
>
// We have covered the entire viewport area, time to stop
693
>
endLineNumber = lineNumber;
694
>
break;
695
>
}
696
>
}
697
>
698
>
if (centeredLineNumber === -1) {
699
>
centeredLineNumber = endLineNumber;
700
>
}
701
>
702
>
const endLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(endLineNumber) | 0;
703
>
704
>
let completelyVisibleStartLineNumber = startLineNumber;
705
>
let completelyVisibleEndLineNumber = endLineNumber;
706
>
707
>
if (completelyVisibleStartLineNumber < completelyVisibleEndLineNumber) {
708
>
if (startLineNumberVerticalOffset < verticalOffset1) {
709
completelyVisibleStartLineNumber++;
710
}
712
>
if (completelyVisibleStartLineNumber < completelyVisibleEndLineNumber) {
713
>
const endLineHeight = this.getLineHeightForLineNumber(endLineNumber);
714
>
if (endLineNumberVerticalOffset + endLineHeight > verticalOffset2) {
715
completelyVisibleEndLineNumber--;
716
}
718
>
719
>
return {
720
>
bigNumbersDelta: bigNumbersDelta,
721
>
startLineNumber: startLineNumber,
722
>
endLineNumber: endLineNumber,
723
>
relativeVerticalOffset: linesOffsets,
724
>
centeredLineNumber: centeredLineNumber,
725
>
completelyVisibleStartLineNumber: completelyVisibleStartLineNumber,
726
>
completelyVisibleEndLineNumber: completelyVisibleEndLineNumber,
727
>
lineHeight: this._lineHeightsManager.defaultLineHeight,
728
>
};
729
>
}
730
731
public getVerticalOffsetForWhitespaceIndex(whitespaceIndex: number): number {