This limits the amount of damage a pathological program can cause in thrashing the LRU cache. I ran the script described here: https://github.com/xtermjs/xterm.js/pull/1327#issuecomment-374003960 Without this patch, the entire output would get drawn in one frame that took about 140 ms to draw. With this patch, it takes about 60 ms. It's still nowhere as good as the static or none atlas implementations, but it's not terrible, like it was. This should have minimal impact on real-world applications: it'll just take a little longer for the atlas to warm up. The implementation is a little hacky, since it involves throwing some code into TextRenderLayer that violates the separation of concerns, but we can clean this up later.
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
/**
|
|
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
|
|
* @license MIT
|
|
*/
|
|
|
|
import { IGlyphIdentifier } from './Types';
|
|
|
|
export default abstract class BaseCharAtlas {
|
|
private _didWarmUp: boolean = false;
|
|
|
|
/**
|
|
* Perform any work needed to warm the cache before it can be used. May be called multiple times.
|
|
* Implement _doWarmUp instead if you only want to get called once.
|
|
*/
|
|
public warmUp(): void {
|
|
if (!this._didWarmUp) {
|
|
this._doWarmUp();
|
|
this._didWarmUp = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Perform any work needed to warm the cache before it can be used. Used by the default
|
|
* implementation of warmUp(), and will only be called once.
|
|
*/
|
|
protected _doWarmUp(): void { }
|
|
|
|
/**
|
|
* Called when we start drawing a new frame.
|
|
*
|
|
* TODO: We rely on this getting called by TextRenderLayer. This should really be called by
|
|
* Renderer instead, but we need to make Renderer the source-of-truth for the char atlas, instead
|
|
* of BaseRenderLayer.
|
|
*/
|
|
public beginFrame(): void { }
|
|
|
|
/**
|
|
* May be called before warmUp finishes, however it is okay for the implementation to
|
|
* do nothing and return false in that case.
|
|
*
|
|
* @param ctx Where to draw the character onto.
|
|
* @param glyph Information about what to draw
|
|
* @param x The position on the context to start drawing at
|
|
* @param y The position on the context to start drawing at
|
|
* @returns The success state. True if we drew the character.
|
|
*/
|
|
public abstract draw(
|
|
ctx: CanvasRenderingContext2D,
|
|
glyph: IGlyphIdentifier,
|
|
x: number,
|
|
y: number,
|
|
): boolean;
|
|
}
|