Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/browser/Terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1292,6 +1292,10 @@ export class Terminal extends CoreTerminal implements ITerminal {
this.viewport?.syncScrollArea();
}

public clearTextureAtlas(): void {
this._renderService?.clearTextureAtlas();
}

private _reportWindowsOptions(type: WindowsOptionsReportType): void {
if (!this._renderService) {
return;
Expand Down
6 changes: 6 additions & 0 deletions src/browser/TestUtils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,9 @@ export class MockTerminal implements ITerminal {
public reset(): void {
throw new Error('Method not implemented.');
}
public clearTextureAtlas(): void {
throw new Error('Method not implemented.');
}
public refresh(start: number, end: number): void {
throw new Error('Method not implemented.');
}
Expand Down Expand Up @@ -374,6 +377,9 @@ export class MockRenderService implements IRenderService {
public refreshRows(start: number, end: number): void {
throw new Error('Method not implemented.');
}
public clearTextureAtlas(): void {
throw new Error('Method not implemented.');
}
public resize(cols: number, rows: number): void {
throw new Error('Method not implemented.');
}
Expand Down
1 change: 1 addition & 0 deletions src/browser/Types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export interface IPublicTerminal extends IDisposable {
write(data: string | Uint8Array, callback?: () => void): void;
paste(data: string): void;
refresh(start: number, end: number): void;
clearTextureAtlas(): void;
reset(): void;
}

Expand Down
3 changes: 3 additions & 0 deletions src/browser/public/Terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,9 @@ export class Terminal implements ITerminalApi {
public reset(): void {
this._core.reset();
}
public clearTextureAtlas(): void {
this._core.clearTextureAtlas();
}
public loadAddon(addon: ITerminalAddon): void {
return this._addonManager.loadAddon(this, addon);
}
Expand Down
4 changes: 4 additions & 0 deletions src/browser/renderer/BaseRenderLayer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@ export abstract class BaseRenderLayer implements IRenderLayer {

public abstract reset(): void;

public clearTextureAtlas(): void {
this._charAtlas?.clear();
}

/**
* Fills 1+ cells completely. This uses the existing fillStyle on the context.
* @param x The column to start at.
Expand Down
6 changes: 6 additions & 0 deletions src/browser/renderer/Renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@ export class Renderer extends Disposable implements IRenderer {
}
}

public clearTextureAtlas(): void {
for (const layer of this._renderLayers) {
layer.clearTextureAtlas();
}
}

/**
* Recalculates the character and canvas dimensions.
*/
Expand Down
6 changes: 6 additions & 0 deletions src/browser/renderer/Types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export interface IRenderer extends IDisposable {
onOptionsChanged(): void;
clear(): void;
renderRows(start: number, end: number): void;
clearTextureAtlas?(): void;
}

export interface IRenderLayer extends IDisposable {
Expand Down Expand Up @@ -100,4 +101,9 @@ export interface IRenderLayer extends IDisposable {
* Clear the state of the render layer.
*/
reset(): void;

/**
* Clears the texture atlas.
*/
clearTextureAtlas(): void;
}
2 changes: 2 additions & 0 deletions src/browser/renderer/atlas/BaseCharAtlas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ export abstract class BaseCharAtlas implements IDisposable {
*/
private _doWarmUp(): void { }

public clear(): void { }

/**
* Called when we start drawing a new frame.
*
Expand Down
10 changes: 10 additions & 0 deletions src/browser/renderer/atlas/DynamicCharAtlas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,16 @@ export class DynamicCharAtlas extends BaseCharAtlas {
this._drawToCacheCount = 0;
}

public clear(): void {
if (this._cacheMap.size > 0) {
const capacity = this._width * this._height;
this._cacheMap = new LRUMap(capacity);
this._cacheMap.prealloc(capacity);
}
this._cacheCtx.clearRect(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT);
this._tmpCtx.clearRect(0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight);
}

public draw(
ctx: CanvasRenderingContext2D,
glyph: IGlyphIdentifier,
Expand Down
5 changes: 5 additions & 0 deletions src/browser/services/RenderService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ export class RenderService extends Disposable implements IRenderService {
}
}

public clearTextureAtlas(): void {
this._renderer?.clearTextureAtlas?.();
this._fullRefresh();
}

public setColors(colors: IColorSet): void {
this._renderer.setColors(colors);
this._fullRefresh();
Expand Down
1 change: 1 addition & 0 deletions src/browser/services/Services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export interface IRenderService extends IDisposable {
dimensions: IRenderDimensions;

refreshRows(start: number, end: number): void;
clearTextureAtlas(): void;
resize(cols: number, rows: number): void;
changeOptions(): void;
setRenderer(renderer: IRenderer): void;
Expand Down
8 changes: 8 additions & 0 deletions typings/xterm.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1056,6 +1056,14 @@ declare module 'xterm' {
*/
refresh(start: number, end: number): void;

/**
* Clears the texture atlas of the canvas renderer if it's active. Doing this will force a
* redraw of all glyphs which can workaround issues causing the texture to become corrupt, for
* example Chromium/Nvidia has an issue where the texture gets messed up when resuming the OS
* from sleep.
*/
clearTextureAtlas(): void;

/**
* Perform a full reset (RIS, aka '\x1bc').
*/
Expand Down