From 71f50b841f432516914e38bea30f7af33ea56b88 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:39:06 -0800 Subject: [PATCH] Move webgl-specific types into addon --- addons/addon-webgl/src/CharAtlasCache.ts | 2 +- addons/addon-webgl/src/CharAtlasUtils.ts | 2 +- addons/addon-webgl/src/GlyphRenderer.ts | 4 +- addons/addon-webgl/src/TextureAtlas.ts | 2 +- addons/addon-webgl/src/Types.ts | 95 ++++++++++++++++++- addons/addon-webgl/src/WebglRenderer.ts | 4 +- .../src/renderLayer/BaseRenderLayer.ts | 3 +- src/browser/renderer/shared/README.md | 2 +- src/browser/renderer/shared/Types.ts | 94 +----------------- 9 files changed, 106 insertions(+), 102 deletions(-) diff --git a/addons/addon-webgl/src/CharAtlasCache.ts b/addons/addon-webgl/src/CharAtlasCache.ts index 051f5bfe..5f596a15 100644 --- a/addons/addon-webgl/src/CharAtlasCache.ts +++ b/addons/addon-webgl/src/CharAtlasCache.ts @@ -6,7 +6,7 @@ import { TextureAtlas } from './TextureAtlas'; import { ITerminalOptions, Terminal } from '@xterm/xterm'; import { ITerminal, ReadonlyColorSet } from 'browser/Types'; -import { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types'; +import { ICharAtlasConfig, ITextureAtlas } from './Types'; import { generateConfig, configEquals } from 'CharAtlasUtils'; interface ITextureAtlasCacheEntry { diff --git a/addons/addon-webgl/src/CharAtlasUtils.ts b/addons/addon-webgl/src/CharAtlasUtils.ts index 31c09fe4..db601383 100644 --- a/addons/addon-webgl/src/CharAtlasUtils.ts +++ b/addons/addon-webgl/src/CharAtlasUtils.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ICharAtlasConfig } from '../../../src/browser/renderer/shared/Types'; +import { ICharAtlasConfig } from './Types'; import { Attributes } from 'common/buffer/Constants'; import { ITerminalOptions } from '@xterm/xterm'; import { IColorSet, ReadonlyColorSet } from 'browser/Types'; diff --git a/addons/addon-webgl/src/GlyphRenderer.ts b/addons/addon-webgl/src/GlyphRenderer.ts index a2c901d6..68df7624 100644 --- a/addons/addon-webgl/src/GlyphRenderer.ts +++ b/addons/addon-webgl/src/GlyphRenderer.ts @@ -3,11 +3,11 @@ * @license MIT */ import { TextureAtlas } from 'TextureAtlas'; -import { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types'; +import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { NULL_CELL_CODE } from 'common/buffer/Constants'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { Terminal } from '@xterm/xterm'; -import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types'; +import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject, type IRasterizedGlyph, type ITextureAtlas } from './Types'; import { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils'; import type { IOptionsService } from 'common/services/Services'; import { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; diff --git a/addons/addon-webgl/src/TextureAtlas.ts b/addons/addon-webgl/src/TextureAtlas.ts index c0842d54..27e94b1b 100644 --- a/addons/addon-webgl/src/TextureAtlas.ts +++ b/addons/addon-webgl/src/TextureAtlas.ts @@ -7,7 +7,7 @@ import { IColorContrastCache } from 'browser/Types'; import { DIM_OPACITY, TEXT_BASELINE } from './Constants'; import { tryDrawCustomChar } from 'CustomGlyphs'; import { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; -import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types'; +import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from './Types'; import { NULL_COLOR, channels, color, rgba } from 'common/Color'; import { FourKeyMap } from 'common/MultiKeyMap'; import { IdleTaskQueue } from 'common/TaskQueue'; diff --git a/addons/addon-webgl/src/Types.ts b/addons/addon-webgl/src/Types.ts index fe6e10c7..e030e579 100644 --- a/addons/addon-webgl/src/Types.ts +++ b/addons/addon-webgl/src/Types.ts @@ -3,8 +3,11 @@ * @license MIT */ +import { FontWeight } from '@xterm/xterm'; +import { IColorSet } from 'browser/Types'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; -import { CursorInactiveStyle, CursorStyle } from 'common/Types'; +import { CursorInactiveStyle, CursorStyle, type IDisposable } from 'common/Types'; +import type { Event } from 'vs/base/common/event'; export interface IRenderModel { cells: Uint32Array; @@ -31,3 +34,93 @@ export interface IWebGL2RenderingContext extends WebGLRenderingContext { export interface IWebGLVertexArrayObject { } + +export interface ICharAtlasConfig { + customGlyphs: boolean; + devicePixelRatio: number; + deviceMaxTextureSize: number; + letterSpacing: number; + lineHeight: number; + fontSize: number; + fontFamily: string; + fontWeight: FontWeight; + fontWeightBold: FontWeight; + deviceCellWidth: number; + deviceCellHeight: number; + deviceCharWidth: number; + deviceCharHeight: number; + allowTransparency: boolean; + drawBoldTextInBrightColors: boolean; + minimumContrastRatio: number; + colors: IColorSet; +} + +export interface ITextureAtlas extends IDisposable { + readonly pages: { canvas: HTMLCanvasElement, version: number }[]; + + onAddTextureAtlasCanvas: Event; + onRemoveTextureAtlasCanvas: Event; + + /** + * Warm up the texture atlas, adding common glyphs to avoid slowing early frame. + */ + warmUp(): void; + + /** + * Call when a frame is being drawn, this will return true if the atlas was cleared to make room + * for a new set of glyphs. + */ + beginFrame(): boolean; + + /** + * Clear all glyphs from the texture atlas. + */ + clearTexture(): void; + getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph; + getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph; +} + +/** + * Represents a rasterized glyph within a texture atlas. Some numbers are + * tracked in CSS pixels as well in order to reduce calculations during the + * render loop. + */ +export interface IRasterizedGlyph { + /** + * The x and y offset between the glyph's top/left and the top/left of a cell + * in pixels. + */ + offset: IVector; + /** + * The index of the texture page that the glyph is on. + */ + texturePage: number; + /** + * the x and y position of the glyph in the texture in pixels. + */ + texturePosition: IVector; + /** + * the x and y position of the glyph in the texture in clip space coordinates. + */ + texturePositionClipSpace: IVector; + /** + * The width and height of the glyph in the texture in pixels. + */ + size: IVector; + /** + * The width and height of the glyph in the texture in clip space coordinates. + */ + sizeClipSpace: IVector; +} + +export interface IVector { + x: number; + y: number; +} + +export interface IBoundingBox { + top: number; + left: number; + right: number; + bottom: number; +} diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index ce9b58c5..2c97714f 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -8,7 +8,7 @@ import { CellColorResolver } from 'CellColorResolver'; import { acquireTextureAtlas, removeTerminalFromCache } from 'CharAtlasCache'; import { CursorBlinkStateManager } from './CursorBlinkStateManager'; import { observeDevicePixelDimensions } from 'DevicePixelObserver'; -import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types'; +import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { CharData, IBufferLine, ICellData } from 'common/Types'; import { AttributeData } from 'common/buffer/AttributeData'; @@ -19,7 +19,7 @@ import { Terminal } from '@xterm/xterm'; import { GlyphRenderer } from './GlyphRenderer'; import { RectangleRenderer } from './RectangleRenderer'; import { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel'; -import { IWebGL2RenderingContext } from './Types'; +import { IWebGL2RenderingContext, type ITextureAtlas } from './Types'; import { LinkRenderLayer } from './renderLayer/LinkRenderLayer'; import { IRenderLayer } from './renderLayer/Types'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts index ae7e47ef..2ce76346 100644 --- a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -5,7 +5,7 @@ import { ReadonlyColorSet } from 'browser/Types'; import { acquireTextureAtlas } from 'CharAtlasCache'; -import { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types'; +import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { CellData } from 'common/buffer/CellData'; @@ -14,6 +14,7 @@ import { Terminal } from '@xterm/xterm'; import { IRenderLayer } from './Types'; import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { TEXT_BASELINE } from 'Constants'; +import type { ITextureAtlas } from '../Types'; export abstract class BaseRenderLayer extends Disposable implements IRenderLayer { private _canvas: HTMLCanvasElement; diff --git a/src/browser/renderer/shared/README.md b/src/browser/renderer/shared/README.md index 58084235..25b9a239 100644 --- a/src/browser/renderer/shared/README.md +++ b/src/browser/renderer/shared/README.md @@ -1 +1 @@ -This folder contains files that are shared between the renderer addons, but not necessarily bundled into the `xterm` module. +This folder contains files that are shared between the renderers. diff --git a/src/browser/renderer/shared/Types.ts b/src/browser/renderer/shared/Types.ts index 6b4881cb..f783ffec 100644 --- a/src/browser/renderer/shared/Types.ts +++ b/src/browser/renderer/shared/Types.ts @@ -3,31 +3,11 @@ * @license MIT */ -import { FontWeight, Terminal } from '@xterm/xterm'; -import { IColorSet, ITerminal } from 'browser/Types'; +import { Terminal } from '@xterm/xterm'; +import { ITerminal } from 'browser/Types'; import { IDisposable } from 'common/Types'; import type { Event } from 'vs/base/common/event'; -export interface ICharAtlasConfig { - customGlyphs: boolean; - devicePixelRatio: number; - deviceMaxTextureSize: number; - letterSpacing: number; - lineHeight: number; - fontSize: number; - fontFamily: string; - fontWeight: FontWeight; - fontWeightBold: FontWeight; - deviceCellWidth: number; - deviceCellHeight: number; - deviceCharWidth: number; - deviceCharHeight: number; - allowTransparency: boolean; - drawBoldTextInBrightColors: boolean; - minimumContrastRatio: number; - colors: IColorSet; -} - export interface IDimensions { width: number; height: number; @@ -87,76 +67,6 @@ export interface IRenderer extends IDisposable { clearTextureAtlas?(): void; } -export interface ITextureAtlas extends IDisposable { - readonly pages: { canvas: HTMLCanvasElement, version: number }[]; - - onAddTextureAtlasCanvas: Event; - onRemoveTextureAtlasCanvas: Event; - - /** - * Warm up the texture atlas, adding common glyphs to avoid slowing early frame. - */ - warmUp(): void; - - /** - * Call when a frame is being drawn, this will return true if the atlas was cleared to make room - * for a new set of glyphs. - */ - beginFrame(): boolean; - - /** - * Clear all glyphs from the texture atlas. - */ - clearTexture(): void; - getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph; - getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph; -} - -/** - * Represents a rasterized glyph within a texture atlas. Some numbers are - * tracked in CSS pixels as well in order to reduce calculations during the - * render loop. - */ -export interface IRasterizedGlyph { - /** - * The x and y offset between the glyph's top/left and the top/left of a cell - * in pixels. - */ - offset: IVector; - /** - * The index of the texture page that the glyph is on. - */ - texturePage: number; - /** - * the x and y position of the glyph in the texture in pixels. - */ - texturePosition: IVector; - /** - * the x and y position of the glyph in the texture in clip space coordinates. - */ - texturePositionClipSpace: IVector; - /** - * The width and height of the glyph in the texture in pixels. - */ - size: IVector; - /** - * The width and height of the glyph in the texture in clip space coordinates. - */ - sizeClipSpace: IVector; -} - -export interface IVector { - x: number; - y: number; -} - -export interface IBoundingBox { - top: number; - left: number; - right: number; - bottom: number; -} - export interface ISelectionRenderModel { readonly hasSelection: boolean; readonly columnSelectMode: boolean;