From d70f2a462c8718a4d32e51a33a27979050929558 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:35:39 -0800 Subject: [PATCH 1/4] Move webgl-specific shared code into addon Never got moved when canvas addon was removed --- .../addon-webgl/src}/CellColorResolver.ts | 0 .../addon-webgl/src}/CharAtlasCache.ts | 4 ++-- .../addon-webgl/src}/CharAtlasUtils.ts | 2 +- addons/addon-webgl/src/Constants.ts | 12 ++++++++++++ .../addon-webgl/src}/CursorBlinkStateManager.ts | 0 .../addon-webgl/src}/CustomGlyphs.ts | 0 .../addon-webgl/src}/DevicePixelObserver.ts | 0 addons/addon-webgl/src/GlyphRenderer.ts | 5 ++--- addons/addon-webgl/src/RectangleRenderer.ts | 2 +- .../addon-webgl/src}/TextureAtlas.ts | 4 ++-- addons/addon-webgl/src/WebglRenderer.ts | 10 +++++----- .../addon-webgl/src/renderLayer/BaseRenderLayer.ts | 6 +++--- .../addon-webgl/src/renderLayer/LinkRenderLayer.ts | 2 +- src/browser/renderer/shared/Constants.ts | 8 -------- 14 files changed, 29 insertions(+), 26 deletions(-) rename {src/browser/renderer/shared => addons/addon-webgl/src}/CellColorResolver.ts (100%) rename {src/browser/renderer/shared => addons/addon-webgl/src}/CharAtlasCache.ts (95%) rename {src/browser/renderer/shared => addons/addon-webgl/src}/CharAtlasUtils.ts (97%) create mode 100644 addons/addon-webgl/src/Constants.ts rename {src/browser/renderer/shared => addons/addon-webgl/src}/CursorBlinkStateManager.ts (100%) rename {src/browser/renderer/shared => addons/addon-webgl/src}/CustomGlyphs.ts (100%) rename {src/browser/renderer/shared => addons/addon-webgl/src}/DevicePixelObserver.ts (100%) rename {src/browser/renderer/shared => addons/addon-webgl/src}/TextureAtlas.ts (99%) diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/addons/addon-webgl/src/CellColorResolver.ts similarity index 100% rename from src/browser/renderer/shared/CellColorResolver.ts rename to addons/addon-webgl/src/CellColorResolver.ts diff --git a/src/browser/renderer/shared/CharAtlasCache.ts b/addons/addon-webgl/src/CharAtlasCache.ts similarity index 95% rename from src/browser/renderer/shared/CharAtlasCache.ts rename to addons/addon-webgl/src/CharAtlasCache.ts index 33e58078..051f5bfe 100644 --- a/src/browser/renderer/shared/CharAtlasCache.ts +++ b/addons/addon-webgl/src/CharAtlasCache.ts @@ -3,11 +3,11 @@ * @license MIT */ -import { TextureAtlas } from 'browser/renderer/shared/TextureAtlas'; +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 { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils'; +import { generateConfig, configEquals } from 'CharAtlasUtils'; interface ITextureAtlasCacheEntry { atlas: ITextureAtlas; diff --git a/src/browser/renderer/shared/CharAtlasUtils.ts b/addons/addon-webgl/src/CharAtlasUtils.ts similarity index 97% rename from src/browser/renderer/shared/CharAtlasUtils.ts rename to addons/addon-webgl/src/CharAtlasUtils.ts index db601383..31c09fe4 100644 --- a/src/browser/renderer/shared/CharAtlasUtils.ts +++ b/addons/addon-webgl/src/CharAtlasUtils.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ICharAtlasConfig } from './Types'; +import { ICharAtlasConfig } from '../../../src/browser/renderer/shared/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/Constants.ts b/addons/addon-webgl/src/Constants.ts new file mode 100644 index 00000000..a00434d6 --- /dev/null +++ b/addons/addon-webgl/src/Constants.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2017 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { isFirefox, isLegacyEdge } from 'common/Platform'; + +export const DIM_OPACITY = 0.5; +// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge +// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly +// unaligned Powerline fonts (PR 3356#issuecomment-850928179). +export const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic'; diff --git a/src/browser/renderer/shared/CursorBlinkStateManager.ts b/addons/addon-webgl/src/CursorBlinkStateManager.ts similarity index 100% rename from src/browser/renderer/shared/CursorBlinkStateManager.ts rename to addons/addon-webgl/src/CursorBlinkStateManager.ts diff --git a/src/browser/renderer/shared/CustomGlyphs.ts b/addons/addon-webgl/src/CustomGlyphs.ts similarity index 100% rename from src/browser/renderer/shared/CustomGlyphs.ts rename to addons/addon-webgl/src/CustomGlyphs.ts diff --git a/src/browser/renderer/shared/DevicePixelObserver.ts b/addons/addon-webgl/src/DevicePixelObserver.ts similarity index 100% rename from src/browser/renderer/shared/DevicePixelObserver.ts rename to addons/addon-webgl/src/DevicePixelObserver.ts diff --git a/addons/addon-webgl/src/GlyphRenderer.ts b/addons/addon-webgl/src/GlyphRenderer.ts index f76804fd..a2c901d6 100644 --- a/addons/addon-webgl/src/GlyphRenderer.ts +++ b/addons/addon-webgl/src/GlyphRenderer.ts @@ -2,9 +2,7 @@ * Copyright (c) 2018 The xterm.js authors. All rights reserved. * @license MIT */ - -import { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; -import { TextureAtlas } from 'browser/renderer/shared/TextureAtlas'; +import { TextureAtlas } from 'TextureAtlas'; import { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types'; import { NULL_CELL_CODE } from 'common/buffer/Constants'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -12,6 +10,7 @@ import { Terminal } from '@xterm/xterm'; import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types'; import { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils'; import type { IOptionsService } from 'common/services/Services'; +import { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; interface IVertices { attributes: Float32Array; diff --git a/addons/addon-webgl/src/RectangleRenderer.ts b/addons/addon-webgl/src/RectangleRenderer.ts index 6dbedf09..8ace9076 100644 --- a/addons/addon-webgl/src/RectangleRenderer.ts +++ b/addons/addon-webgl/src/RectangleRenderer.ts @@ -3,7 +3,6 @@ * @license MIT */ -import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; @@ -14,6 +13,7 @@ import { Terminal } from '@xterm/xterm'; import { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel'; import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types'; import { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils'; +import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; const enum VertexAttribLocations { POSITION = 0, diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/addons/addon-webgl/src/TextureAtlas.ts similarity index 99% rename from src/browser/renderer/shared/TextureAtlas.ts rename to addons/addon-webgl/src/TextureAtlas.ts index 7343d890..c0842d54 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/addons/addon-webgl/src/TextureAtlas.ts @@ -4,8 +4,8 @@ */ import { IColorContrastCache } from 'browser/Types'; -import { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants'; -import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs'; +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 { NULL_COLOR, channels, color, rgba } from 'common/Color'; diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index 4be864c1..ce9b58c5 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -4,11 +4,10 @@ */ import { ITerminal } from 'browser/Types'; -import { CellColorResolver } from 'browser/renderer/shared/CellColorResolver'; -import { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache'; -import { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager'; -import { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver'; -import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; +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 { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { CharData, IBufferLine, ICellData } from 'common/Types'; @@ -26,6 +25,7 @@ import { IRenderLayer } from './renderLayer/Types'; import { Emitter, Event } from 'vs/base/common/event'; import { addDisposableListener } from 'vs/base/browser/dom'; import { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; export class WebglRenderer extends Disposable implements IRenderer { private _renderLayers: IRenderLayer[]; diff --git a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts index 0cac7eb3..ae7e47ef 100644 --- a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -4,9 +4,7 @@ */ import { ReadonlyColorSet } from 'browser/Types'; -import { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache'; -import { TEXT_BASELINE } from 'browser/renderer/shared/Constants'; -import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; +import { acquireTextureAtlas } from 'CharAtlasCache'; import { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -14,6 +12,8 @@ import { CellData } from 'common/buffer/CellData'; import { IOptionsService } from 'common/services/Services'; import { Terminal } from '@xterm/xterm'; import { IRenderLayer } from './Types'; +import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; +import { TEXT_BASELINE } from 'Constants'; export abstract class BaseRenderLayer extends Disposable implements IRenderLayer { private _canvas: HTMLCanvasElement; diff --git a/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts index 1357dec6..50bf2d8f 100644 --- a/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { is256Color } from 'browser/renderer/shared/CharAtlasUtils'; +import { is256Color } from 'CharAtlasUtils'; import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; diff --git a/src/browser/renderer/shared/Constants.ts b/src/browser/renderer/shared/Constants.ts index b5105ec7..4bc4f985 100644 --- a/src/browser/renderer/shared/Constants.ts +++ b/src/browser/renderer/shared/Constants.ts @@ -3,12 +3,4 @@ * @license MIT */ -import { isFirefox, isLegacyEdge } from 'common/Platform'; - export const INVERTED_DEFAULT_COLOR = 257; - -export const DIM_OPACITY = 0.5; -// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge -// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly -// unaligned Powerline fonts (PR 3356#issuecomment-850928179). -export const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic'; 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 2/4] 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; From 6bcd4f0551f6ff07ace24cb7d9ea26a0a2aae368 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:45:41 -0800 Subject: [PATCH 3/4] Add missing relative dir to imports --- addons/addon-webgl/src/GlyphRenderer.ts | 2 +- addons/addon-webgl/src/WebglRenderer.ts | 6 +++--- addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts | 2 +- addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/addon-webgl/src/GlyphRenderer.ts b/addons/addon-webgl/src/GlyphRenderer.ts index 68df7624..10c9ad72 100644 --- a/addons/addon-webgl/src/GlyphRenderer.ts +++ b/addons/addon-webgl/src/GlyphRenderer.ts @@ -2,7 +2,7 @@ * Copyright (c) 2018 The xterm.js authors. All rights reserved. * @license MIT */ -import { TextureAtlas } from 'TextureAtlas'; +import { TextureAtlas } from './TextureAtlas'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { NULL_CELL_CODE } from 'common/buffer/Constants'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index 2c97714f..398594d9 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -4,10 +4,10 @@ */ import { ITerminal } from 'browser/Types'; -import { CellColorResolver } from 'CellColorResolver'; -import { acquireTextureAtlas, removeTerminalFromCache } from 'CharAtlasCache'; +import { CellColorResolver } from './CellColorResolver'; +import { acquireTextureAtlas, removeTerminalFromCache } from './CharAtlasCache'; import { CursorBlinkStateManager } from './CursorBlinkStateManager'; -import { observeDevicePixelDimensions } from 'DevicePixelObserver'; +import { observeDevicePixelDimensions } from './DevicePixelObserver'; 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'; diff --git a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts index 2ce76346..6ee65108 100644 --- a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -13,7 +13,7 @@ import { IOptionsService } from 'common/services/Services'; import { Terminal } from '@xterm/xterm'; import { IRenderLayer } from './Types'; import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; -import { TEXT_BASELINE } from 'Constants'; +import { TEXT_BASELINE } from '../Constants'; import type { ITextureAtlas } from '../Types'; export abstract class BaseRenderLayer extends Disposable implements IRenderLayer { diff --git a/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts index 50bf2d8f..faceac44 100644 --- a/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { is256Color } from 'CharAtlasUtils'; +import { is256Color } from '../CharAtlasUtils'; import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; From cfc1071c73f3e0c0380fe6a3286cd5b52b8226a1 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:54:57 -0800 Subject: [PATCH 4/4] Fix more relative imports --- addons/addon-webgl/src/CharAtlasCache.ts | 2 +- addons/addon-webgl/src/TextureAtlas.ts | 2 +- addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/addon-webgl/src/CharAtlasCache.ts b/addons/addon-webgl/src/CharAtlasCache.ts index 5f596a15..ea02581b 100644 --- a/addons/addon-webgl/src/CharAtlasCache.ts +++ b/addons/addon-webgl/src/CharAtlasCache.ts @@ -7,7 +7,7 @@ import { TextureAtlas } from './TextureAtlas'; import { ITerminalOptions, Terminal } from '@xterm/xterm'; import { ITerminal, ReadonlyColorSet } from 'browser/Types'; import { ICharAtlasConfig, ITextureAtlas } from './Types'; -import { generateConfig, configEquals } from 'CharAtlasUtils'; +import { generateConfig, configEquals } from './CharAtlasUtils'; interface ITextureAtlasCacheEntry { atlas: ITextureAtlas; diff --git a/addons/addon-webgl/src/TextureAtlas.ts b/addons/addon-webgl/src/TextureAtlas.ts index 27e94b1b..a7d1138e 100644 --- a/addons/addon-webgl/src/TextureAtlas.ts +++ b/addons/addon-webgl/src/TextureAtlas.ts @@ -5,7 +5,7 @@ import { IColorContrastCache } from 'browser/Types'; import { DIM_OPACITY, TEXT_BASELINE } from './Constants'; -import { tryDrawCustomChar } from 'CustomGlyphs'; +import { tryDrawCustomChar } from './CustomGlyphs'; import { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from './Types'; import { NULL_COLOR, channels, color, rgba } from 'common/Color'; diff --git a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts index 6ee65108..85b170e7 100644 --- a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -4,7 +4,7 @@ */ import { ReadonlyColorSet } from 'browser/Types'; -import { acquireTextureAtlas } from 'CharAtlasCache'; +import { acquireTextureAtlas } from '../CharAtlasCache'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle';