From 96486c414bea233920809086c91915a0b5f62be6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 16 Oct 2022 07:04:34 -0700 Subject: [PATCH] Acquire char size service better in webgl renderer --- addons/xterm-addon-webgl/src/WebglAddon.ts | 15 +++++++++++++-- addons/xterm-addon-webgl/src/WebglRenderer.ts | 17 ++++++++--------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 1f8e2616..4f4c9dcc 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ICharacterJoinerService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; +import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ITerminal } from 'browser/Types'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; @@ -46,11 +46,22 @@ export class WebglAddon extends Disposable implements ITerminalAddon { const unsafeCore = core as any; const renderService: IRenderService = unsafeCore._renderService; const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService; + const charSizeService: ICharSizeService = unsafeCore._charSizeService; const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService; const decorationService: IDecorationService = unsafeCore._decorationService; const themeService: IThemeService = unsafeCore._themeService; - this._renderer = this.register(new WebglRenderer(terminal, themeService, characterJoinerService, coreBrowserService, optionsService, coreService, decorationService, this._preserveDrawingBuffer)); + this._renderer = this.register(new WebglRenderer( + terminal, + characterJoinerService, + charSizeService, + coreBrowserService, + coreService, + decorationService, + optionsService, + themeService, + this._preserveDrawingBuffer + )); this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss)); this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); renderService.setRenderer(this._renderer); diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index f4eceb00..f366c379 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -9,7 +9,7 @@ import { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/s import { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver'; import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types'; -import { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; +import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ITerminal } from 'browser/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; @@ -56,12 +56,13 @@ export class WebglRenderer extends Disposable implements IRenderer { constructor( private _terminal: Terminal, - private readonly _themeService: IThemeService, private readonly _characterJoinerService: ICharacterJoinerService, + private readonly _charSizeService: ICharSizeService, private readonly _coreBrowserService: ICoreBrowserService, - optionsService: IOptionsService, coreService: ICoreService, private readonly _decorationService: IDecorationService, + optionsService: IOptionsService, + private readonly _themeService: IThemeService, preserveDrawingBuffer?: boolean ) { super(); @@ -302,7 +303,7 @@ export class WebglRenderer extends Disposable implements IRenderer { public renderRows(start: number, end: number): void { if (!this._isAttached) { - if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && (this._core as any)._charSizeService.width && (this._core as any)._charSizeService.height) { + if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) { this._updateDimensions(); this._refreshCharAtlas(); this._isAttached = true; @@ -440,21 +441,19 @@ export class WebglRenderer extends Disposable implements IRenderer { * Recalculates the character and canvas dimensions. */ private _updateDimensions(): void { - // TODO: Acquire CharSizeService properly - // Perform a new measure if the CharMeasure dimensions are not yet available - if (!(this._core as any)._charSizeService.width || !(this._core as any)._charSizeService.height) { + if (!this._charSizeService.width || !this._charSizeService.height) { return; } // Calculate the device character width. Width is floored as it must be drawn to an integer grid // in order for the char atlas glyphs to not be blurry. - this.dimensions.device.char.width = Math.floor((this._core as any)._charSizeService.width * this._devicePixelRatio); + this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio); // Calculate the device character height. Height is ceiled in case devicePixelRatio is a // floating point number in order to ensure there is enough space to draw the character to the // cell. - this.dimensions.device.char.height = Math.ceil((this._core as any)._charSizeService.height * this._devicePixelRatio); + this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio); // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be // floored since lineHeight can never be lower then 1, this guarentees the device cell height