提交 1f648fc8 编写于 作者: A Alex Dima

Use pixelOffsetCache in all lines that do not contain RTL

上级 e9bf9094
......@@ -123,7 +123,6 @@ export class ViewLine implements IVisibleLineData {
this._renderedViewLine = createRenderedLine(
this._renderedViewLine ? this._renderedViewLine.domNode : null,
renderLineInput,
this._context.model.mightContainRTL(),
isWhitespaceOnly,
renderViewLine(renderLineInput)
);
......@@ -182,7 +181,7 @@ class RenderedViewLine {
*/
private _pixelOffsetCache: number[];
constructor(domNode: FastDomNode, renderLineInput: RenderLineInput, modelContainsRTL: boolean, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput) {
constructor(domNode: FastDomNode, renderLineInput: RenderLineInput, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput) {
this.domNode = domNode;
this.input = renderLineInput;
this.html = renderLineOutput.output;
......@@ -191,7 +190,7 @@ class RenderedViewLine {
this._cachedWidth = -1;
this._pixelOffsetCache = null;
if (!modelContainsRTL) {
if (!renderLineOutput.containsRTL) {
this._pixelOffsetCache = [];
for (let column = 0, len = this._characterMapping.length; column <= len; column++) {
this._pixelOffsetCache[column] = -1;
......@@ -375,17 +374,17 @@ class WebKitRenderedViewLine extends RenderedViewLine {
}
}
const createRenderedLine: (domNode: FastDomNode, renderLineInput: RenderLineInput, modelContainsRTL: boolean, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput) => RenderedViewLine = (function () {
const createRenderedLine: (domNode: FastDomNode, renderLineInput: RenderLineInput, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput) => RenderedViewLine = (function () {
if (browser.isWebKit) {
return createWebKitRenderedLine;
}
return createNormalRenderedLine;
})();
function createWebKitRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, modelContainsRTL: boolean, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput): RenderedViewLine {
return new WebKitRenderedViewLine(domNode, renderLineInput, modelContainsRTL, isWhitespaceOnly, renderLineOutput);
function createWebKitRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput): RenderedViewLine {
return new WebKitRenderedViewLine(domNode, renderLineInput, isWhitespaceOnly, renderLineOutput);
}
function createNormalRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, modelContainsRTL: boolean, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput): RenderedViewLine {
return new RenderedViewLine(domNode, renderLineInput, modelContainsRTL, isWhitespaceOnly, renderLineOutput);
function createNormalRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, isWhitespaceOnly: boolean, renderLineOutput: RenderLineOutput): RenderedViewLine {
return new RenderedViewLine(domNode, renderLineInput, isWhitespaceOnly, renderLineOutput);
}
......@@ -190,10 +190,12 @@ export class RenderLineOutput {
readonly characterMapping: CharacterMapping;
readonly output: string;
readonly containsRTL: boolean;
constructor(characterMapping: CharacterMapping, output: string) {
constructor(characterMapping: CharacterMapping, output: string, containsRTL: boolean) {
this.characterMapping = characterMapping;
this.output = output;
this.containsRTL = containsRTL;
}
}
......@@ -202,7 +204,8 @@ export function renderViewLine(input: RenderLineInput): RenderLineOutput {
return new RenderLineOutput(
new CharacterMapping(0),
// This is basically for IE's hit test to work
'<span><span>&nbsp;</span></span>'
'<span><span>&nbsp;</span></span>',
false
);
}
......@@ -217,7 +220,7 @@ class ResolvedRenderLineInput {
public readonly tokens: ViewLineToken[],
public readonly lineDecorations: Decoration[],
public readonly tabSize: number,
public readonly emitLTRDir: boolean,
public readonly containsRTL: boolean,
public readonly spaceWidth: number,
public readonly renderWhitespace: RenderWhitespace,
public readonly renderControlCharacters: boolean,
......@@ -490,7 +493,7 @@ function _renderLine(input: ResolvedRenderLineInput): RenderLineOutput {
const isOverflowing = input.isOverflowing;
const tokens = input.tokens;
const tabSize = input.tabSize;
const emitLTRDir = input.emitLTRDir;
const containsRTL = input.containsRTL;
const spaceWidth = input.spaceWidth;
const renderWhitespace = input.renderWhitespace;
const renderControlCharacters = input.renderControlCharacters;
......@@ -601,7 +604,7 @@ function _renderLine(input: ResolvedRenderLineInput): RenderLineOutput {
charOffsetInPart++;
}
if (emitLTRDir) {
if (containsRTL) {
out += `<span dir="ltr" class="${tokenType}">${partContent}</span>`;
} else {
out += `<span class="${tokenType}">${partContent}</span>`;
......@@ -620,5 +623,5 @@ function _renderLine(input: ResolvedRenderLineInput): RenderLineOutput {
out += '</span>';
return new RenderLineOutput(characterMapping, out);
return new RenderLineOutput(characterMapping, out, containsRTL);
}
......@@ -353,6 +353,7 @@ suite('viewLineRenderer.renderLine', () => {
));
assert.equal(_actual.output, '<span>' + expectedOutput + '</span>');
assert.equal(_actual.containsRTL, true);
});
test('issue #6885: Splits large tokens', () => {
......@@ -469,6 +470,7 @@ suite('viewLineRenderer.renderLine', () => {
false
));
assert.equal(actual.output, '<span>' + expectedOutput.join('') + '</span>');
assert.equal(actual.containsRTL, true);
});
function assertCharacterMapping(actual: CharacterMapping, expected: number[][]): void {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册