@xterm/addon-webgl 0.19.0-beta.4 → 0.19.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/common/EventEmitter.ts", "../../../src/common/Lifecycle.ts", "../../../src/common/Platform.ts", "../../../src/browser/Lifecycle.ts", "../../../src/common/buffer/Constants.ts", "../../../src/common/Color.ts", "../../../src/browser/renderer/shared/RendererUtils.ts", "../../../src/browser/renderer/shared/CellColorResolver.ts", "../../../src/browser/renderer/shared/Constants.ts", "../../../src/browser/renderer/shared/CustomGlyphs.ts", "../../../src/common/MultiKeyMap.ts", "../../../src/common/TaskQueue.ts", "../../../src/common/buffer/AttributeData.ts", "../../../src/browser/renderer/shared/TextureAtlas.ts", "../../../src/browser/renderer/shared/CharAtlasUtils.ts", "../../../src/browser/renderer/shared/CharAtlasCache.ts", "../../../src/browser/renderer/shared/CursorBlinkStateManager.ts", "../../../src/browser/renderer/shared/DevicePixelObserver.ts", "../../../src/common/input/TextDecoder.ts", "../../../src/common/buffer/CellData.ts", "../src/WebglUtils.ts", "../src/GlyphRenderer.ts", "../../../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/RenderModel.ts", "../src/RectangleRenderer.ts", "../src/renderLayer/BaseRenderLayer.ts", "../src/renderLayer/LinkRenderLayer.ts", "../src/WebglRenderer.ts", "../../../src/common/services/ServiceRegistry.ts", "../../../src/common/services/Services.ts", "../../../src/common/services/LogService.ts", "../src/WebglAddon.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: Set<IListener<T, U>> = new Set();\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.add(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n this._listeners.delete(listener);\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (const l of this._listeners.values()) {\n queue.push(l);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n this.clearListeners();\n this._disposed = true;\n }\n\n public clearListeners(): void {\n if (this._listeners) {\n this._listeners.clear();\n }\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n\nexport function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => any): IDisposable {\n handler(undefined);\n return event(e => handler(e));\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n /**\n * Gets the value if it exists.\n */\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n /**\n * Sets the value, disposing of the old value if it exists.\n */\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n /**\n * Resets the stored value and disposes of the previously stored value.\n */\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any)) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n node: Element | Window | Document,\n type: string,\n handler: (e: any) => void,\n options?: boolean | AddEventListenerOptions\n): IDisposable {\n node.addEventListener(type, handler, options);\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n node.removeEventListener(type, handler, options);\n }\n };\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.codepointMask;`\n * write: `content |= codepoint & Content.codepointMask;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indication whether a cell contains combined content\n * read: `isCombined = content & Content.isCombined;`\n * set: `content |= Content.isCombined;`\n * clear: `content &= ~Content.isCombined;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.hasContent)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.widthMask) >> Content.widthShift;`\n * `hasWidth = content & Content.widthMask;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.widthShift;`\n * write: `content |= (width << Content.widthShift) & Content.widthMask;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.widthShift;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1]);\n $g = parseInt(rgbaMatch[2]);\n $b = parseInt(rgbaMatch[3]);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IBlockVector {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n // Block elements (0x2580-0x2590)\n '\u2580': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n '\u2581': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n '\u2582': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n '\u2583': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n '\u2584': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n '\u2585': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n '\u2586': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n '\u2587': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n '\u2588': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n '\u2589': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n '\u258A': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n '\u258B': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n '\u258C': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n '\u258D': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n '\u258E': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n '\u258F': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n '\u2590': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n // Block elements (0x2594-0x2595)\n '\u2594': [{ x: 0, y: 0, w: 8, h: 1 }], // UPPER ONE EIGHTH BLOCK\n '\u2595': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (0x2596-0x259F)\n '\u2596': [{ x: 0, y: 4, w: 4, h: 4 }], // QUADRANT LOWER LEFT\n '\u2597': [{ x: 4, y: 4, w: 4, h: 4 }], // QUADRANT LOWER RIGHT\n '\u2598': [{ x: 0, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT\n '\u2599': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n '\u259A': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n '\u259B': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '\u259C': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '\u259D': [{ x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER RIGHT\n '\u259E': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n '\u259F': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // UPPER AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n // HORIZONTAL ONE EIGHTH BLOCK-1358\n '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n // UPPER ONE QUARTER BLOCK\n '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n // UPPER THREE QUARTERS BLOCK\n '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n // RIGHT ONE QUARTER BLOCK\n '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n // RIGHT SEVEN EIGHTHS B0OCK\n '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n // CHECKER BOARD FILL\n '\\u{1FB95}': [\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ],\n // INVERSE CHECKER BOARD FILL\n '\\u{1FB96}': [\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ],\n // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n // Shade characters (0x2591-0x2593)\n '\u2591': [ // LIGHT SHADE (25%)\n [1, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 0]\n ],\n '\u2592': [ // MEDIUM SHADE (50%)\n [1, 0],\n [0, 0],\n [0, 1],\n [0, 0]\n ],\n '\u2593': [ // DARK SHADE (75%)\n [0, 1],\n [1, 1],\n [1, 0],\n [1, 1]\n ]\n};\n\nconst enum Shapes {\n /** \u2502 */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** \u2500 */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** \u2514 */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** \u2518 */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** \u2510 */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** \u250C */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** \u2575 */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** \u2574 */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** \u2576 */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** \u2577 */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** \u2534 */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** \u2524 */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** \u251C */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** \u252C */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** \u253C */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** \u254C */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** \u2504 */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** \u2509 */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** \u254E */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** \u2506 */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** \u250A */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n NORMAL = 1,\n BOLD = 3\n}\n\n/**\n * @param xp The percentage of 15% of the x axis.\n * @param yp The percentage of 15% of the x axis on the y axis.\n */\ntype DrawFunctionDefinition = (xp: number, yp: number) => string;\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | DrawFunctionDefinition } | undefined } = {\n // Uniform normal and bold\n '\u2500': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n '\u2501': { [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2502': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n '\u2503': { [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u250C': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n '\u250F': { [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2510': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n '\u2513': { [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2514': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n '\u2517': { [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2518': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n '\u251B': { [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u251C': { [Style.NORMAL]: Shapes.T_RIGHT },\n '\u2523': { [Style.BOLD]: Shapes.T_RIGHT },\n '\u2524': { [Style.NORMAL]: Shapes.T_LEFT },\n '\u252B': { [Style.BOLD]: Shapes.T_LEFT },\n '\u252C': { [Style.NORMAL]: Shapes.T_BOTTOM },\n '\u2533': { [Style.BOLD]: Shapes.T_BOTTOM },\n '\u2534': { [Style.NORMAL]: Shapes.T_TOP },\n '\u253B': { [Style.BOLD]: Shapes.T_TOP },\n '\u253C': { [Style.NORMAL]: Shapes.CROSS },\n '\u254B': { [Style.BOLD]: Shapes.CROSS },\n '\u2574': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n '\u2578': { [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2575': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n '\u2579': { [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2576': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n '\u257A': { [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2577': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n '\u257B': { [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n\n // Double border\n '\u2550': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u2551': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u2552': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '\u2553': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n '\u2554': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '\u2555': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n '\u2556': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n '\u2557': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n '\u2558': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n '\u2559': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '\u255A': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n '\u255B': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n '\u255C': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n '\u255D': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n '\u255E': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '\u255F': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n '\u2560': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '\u2561': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n '\u2562': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u2563': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n '\u2564': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n '\u2565': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n '\u2566': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '\u2567': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u2568': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '\u2569': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '\u256A': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u256B': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u256C': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n // Diagonal\n '\u2571': { [Style.NORMAL]: 'M1,0 L0,1' },\n '\u2572': { [Style.NORMAL]: 'M0,0 L1,1' },\n '\u2573': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n // Mixed weight\n '\u257C': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u257D': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u257E': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u257F': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u250D': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u250E': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2511': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2512': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2515': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2516': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2519': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u251A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u251D': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u251E': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u251F': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2520': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2521': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2522': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2525': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2526': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2527': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2528': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2529': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u252A': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u252D': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u252E': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u252F': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2530': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2531': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2532': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2535': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2536': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2537': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2538': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2539': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u253A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u253D': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u253E': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u253F': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2540': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2541': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2542': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2543': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u2544': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2545': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2546': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2547': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n '\u2548': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n '\u2549': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n '\u254A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n // Dashed\n '\u254C': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n '\u254D': { [Style.BOLD]: Shapes.TWO_DASHES_HORIZONTAL },\n '\u2504': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n '\u2505': { [Style.BOLD]: Shapes.THREE_DASHES_HORIZONTAL },\n '\u2508': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n '\u2509': { [Style.BOLD]: Shapes.FOUR_DASHES_HORIZONTAL },\n '\u254E': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n '\u254F': { [Style.BOLD]: Shapes.TWO_DASHES_VERTICAL },\n '\u2506': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL },\n '\u2507': { [Style.BOLD]: Shapes.THREE_DASHES_VERTICAL },\n '\u250A': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n '\u250B': { [Style.BOLD]: Shapes.FOUR_DASHES_VERTICAL },\n\n // Curved\n '\u256D': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5` },\n '\u256E': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5` },\n '\u256F': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5` },\n '\u2570': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5` }\n};\n\ninterface IVectorShape {\n d: string;\n type: VectorType;\n leftPadding?: number;\n rightPadding?: number;\n}\n\nconst enum VectorType {\n FILL,\n STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n * visible.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n // Git branch\n '\\u{E0A0}': { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: VectorType.FILL },\n // L N\n '\\u{E0A1}': { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: VectorType.FILL },\n // Lock\n '\\u{E0A2}': { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: VectorType.FILL },\n // Right triangle solid\n '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL, rightPadding: 2 },\n // Right triangle line\n '\\u{E0B1}': { d: 'M-1,-.5 L1,.5 L-1,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Left triangle solid\n '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL, leftPadding: 2 },\n // Left triangle line\n '\\u{E0B3}': { d: 'M2,-.5 L0,.5 L2,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Right semi-circle solid\n '\\u{E0B4}': { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: VectorType.FILL, rightPadding: 1 },\n // Right semi-circle line\n '\\u{E0B5}': { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: VectorType.STROKE, rightPadding: 1 },\n // Left semi-circle solid\n '\\u{E0B6}': { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: VectorType.FILL, leftPadding: 1 },\n // Left semi-circle line\n '\\u{E0B7}': { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: VectorType.STROKE, leftPadding: 1 },\n // Lower left triangle\n '\\u{E0B8}': { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: VectorType.FILL },\n // Backslash separator\n '\\u{E0B9}': { d: 'M-.5,-.5 L1.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Lower right triangle\n '\\u{E0BA}': { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: VectorType.FILL },\n // Upper left triangle\n '\\u{E0BC}': { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: VectorType.FILL },\n // Forward slash separator\n '\\u{E0BD}': { d: 'M1.5,-.5 L-.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Upper right triangle\n '\\u{E0BE}': { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: VectorType.FILL }\n};\n// Forward slash separator redundant\npowerlineDefinitions['\\u{E0BB}'] = powerlineDefinitions['\\u{E0BD}'];\n// Backslash separator redundant\npowerlineDefinitions['\\u{E0BF}'] = powerlineDefinitions['\\u{E0B9}'];\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number\n): boolean {\n const blockElementDefinition = blockElementDefinitions[c];\n if (blockElementDefinition) {\n drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n return true;\n }\n\n const patternDefinition = patternCharacterDefinitions[c];\n if (patternDefinition) {\n drawPatternChar(ctx, patternDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n return true;\n }\n\n const boxDrawingDefinition = boxDrawingDefinitions[c];\n if (boxDrawingDefinition) {\n drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, devicePixelRatio);\n return true;\n }\n\n const powerlineDefinition = powerlineDefinitions[c];\n if (powerlineDefinition) {\n drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, fontSize, devicePixelRatio);\n return true;\n }\n\n return false;\n}\n\nfunction drawBlockElementChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n const tmpCanvas = ctx.canvas.ownerDocument.createElement('canvas');\n tmpCanvas.width = width;\n tmpCanvas.height = height;\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles: \u250E\u2530\u2512\u250D\u252F\u2511\u2553\u2565\u2556\u2552\u2564\u2555 \u250F\u2533\u2513\u250C\u2532\u2513\u250C\u252C\u2510\u250F\u2531\u2510\n * \u250C\u2500\u252C\u2500\u2510 \u250F\u2501\u2533\u2501\u2513 \u2554\u2550\u2566\u2550\u2557 \u2520\u2542\u2528\u251D\u253F\u2525\u255F\u256B\u2562\u255E\u256A\u2561 \u2521\u2547\u2529\u251C\u254A\u252B\u2522\u2548\u252A\u2523\u2549\u2524\n * \u2502 \u2502 \u2502 \u2503 \u2503 \u2503 \u2551 \u2551 \u2551 \u2516\u2538\u251A\u2515\u2537\u2519\u2559\u2568\u255C\u2558\u2567\u255B \u2514\u2534\u2518\u2514\u253A\u251B\u2517\u253B\u251B\u2517\u2539\u2518\n * \u251C\u2500\u253C\u2500\u2524 \u2523\u2501\u254B\u2501\u252B \u2560\u2550\u256C\u2550\u2563 \u250F\u2531\u2510\u250C\u2532\u2513\u250C\u252C\u2510\u250C\u252C\u2510 \u250F\u2533\u2513\u250C\u252E\u2513\u250C\u252C\u2510\u250F\u252D\u2510\n * \u2502 \u2502 \u2502 \u2503 \u2503 \u2503 \u2551 \u2551 \u2551 \u2521\u2543\u2524\u251C\u2544\u2529\u251C\u2546\u252A\u2522\u2545\u2524 \u251E\u2540\u2526\u251C\u253E\u252B\u251F\u2541\u2527\u2523\u253D\u2524\n * \u2514\u2500\u2534\u2500\u2518 \u2517\u2501\u253B\u2501\u251B \u255A\u2550\u2569\u2550\u255D \u2514\u2534\u2518\u2514\u2534\u2518\u2514\u253A\u251B\u2517\u2539\u2518 \u2514\u2534\u2518\u2514\u2536\u251B\u2517\u253B\u251B\u2517\u2535\u2518\n *\n * Other:\n * \u256D\u2500\u256E \u2572 \u2571 \u2577\u257B\u254E\u254F\u2506\u2507\u250A\u250B \u257A\u257E\u2574 \u254C\u254C\u254C \u2504\u2504\u2504 \u2508\u2508\u2508\n * \u2502 \u2502 \u2573 \u257D\u257F\u254E\u254F\u2506\u2507\u250A\u250B \u2576\u257C\u2578 \u254D\u254D\u254D \u2505\u2505\u2505 \u2509\u2509\u2509\n * \u2570\u2500\u256F \u2571 \u2572 \u2579\u2575\u254E\u254F\u2506\u2507\u250A\u250B\n *\n * All box drawing characters:\n * \u2500 \u2501 \u2502 \u2503 \u2504 \u2505 \u2506 \u2507 \u2508 \u2509 \u250A \u250B \u250C \u250D \u250E \u250F\n * \u2510 \u2511 \u2512 \u2513 \u2514 \u2515 \u2516 \u2517 \u2518 \u2519 \u251A \u251B \u251C \u251D \u251E \u251F\n * \u2520 \u2521 \u2522 \u2523 \u2524 \u2525 \u2526 \u2527 \u2528 \u2529 \u252A \u252B \u252C \u252D \u252E \u252F\n * \u2530 \u2531 \u2532 \u2533 \u2534 \u2535 \u2536 \u2537 \u2538 \u2539 \u253A \u253B \u253C \u253D \u253E \u253F\n * \u2540 \u2541 \u2542 \u2543 \u2544 \u2545 \u2546 \u2547 \u2548 \u2549 \u254A \u254B \u254C \u254D \u254E \u254F\n * \u2550 \u2551 \u2552 \u2553 \u2554 \u2555 \u2556 \u2557 \u2558 \u2559 \u255A \u255B \u255C \u255D \u255E \u255F\n * \u2560 \u2561 \u2562 \u2563 \u2564 \u2565 \u2566 \u2567 \u2568 \u2569 \u256A \u256B \u256C \u256D \u256E \u256F\n * \u2570 \u2571 \u2572 \u2573 \u2574 \u2575 \u2576 \u2577 \u2578 \u2579 \u257A \u257B \u257C \u257D \u257E \u257F\n *\n * ---\n *\n * Box drawing alignment tests: \u2588\n * \u2589\n * \u2554\u2550\u2550\u2566\u2550\u2550\u2557 \u250C\u2500\u2500\u252C\u2500\u2500\u2510 \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u250F\u2501\u2501\u2533\u2501\u2501\u2513 \u250E\u2512\u250F\u2511 \u2577 \u257B \u250F\u252F\u2513 \u250C\u2530\u2510 \u258A \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n * \u2551\u250C\u2500\u2568\u2500\u2510\u2551 \u2502\u2554\u2550\u2567\u2550\u2557\u2502 \u2502\u2552\u2550\u256A\u2550\u2555\u2502 \u2502\u2553\u2500\u2541\u2500\u2556\u2502 \u2503\u250C\u2500\u2542\u2500\u2510\u2503 \u2517\u2543\u2544\u2519 \u2576\u253C\u2574\u257A\u254B\u2578\u2520\u253C\u2528 \u251D\u254B\u2525 \u258B \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n * \u2551\u2502\u2572 \u2571\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257F \u2502\u2503 \u250D\u2545\u2546\u2513 \u2575 \u2579 \u2517\u2537\u251B \u2514\u2538\u2518 \u258C \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n * \u2560\u2561 \u2573 \u255E\u2563 \u251C\u2562 \u255F\u2524 \u251C\u253C\u2500\u253C\u2500\u253C\u2524 \u251C\u256B\u2500\u2542\u2500\u256B\u2524 \u2523\u253F\u257E\u253C\u257C\u253F\u252B \u2515\u251B\u2516\u251A \u250C\u2504\u2504\u2510 \u254E \u250F\u2505\u2505\u2513 \u250B \u258D \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n * \u2551\u2502\u2571 \u2572\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257D \u2502\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258E\n * \u2551\u2514\u2500\u2565\u2500\u2518\u2551 \u2502\u255A\u2550\u2564\u2550\u255D\u2502 \u2502\u2558\u2550\u256A\u2550\u255B\u2502 \u2502\u2559\u2500\u2540\u2500\u255C\u2502 \u2503\u2514\u2500\u2542\u2500\u2518\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258F\n * \u255A\u2550\u2550\u2569\u2550\u2550\u255D \u2514\u2500\u2500\u2534\u2500\u2500\u2518 \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2517\u2501\u2501\u253B\u2501\u2501\u251B \u2514\u254C\u254C\u2518 \u254E \u2517\u254D\u254D\u251B \u250B \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number\n): void {\n ctx.strokeStyle = ctx.fillStyle;\n for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n ctx.beginPath();\n ctx.lineWidth = devicePixelRatio * Number.parseInt(fontWeight);\n let actualInstructions: string;\n if (typeof instructions === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = instructions(xp, yp);\n } else {\n actualInstructions = instructions;\n }\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio));\n }\n ctx.stroke();\n ctx.closePath();\n }\n}\n\nfunction drawPowerlineChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ));\n }\n if (charDefinition.type === VectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n 'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n 'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n 'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (doClamp && result[x] !== 0) {\n result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (doClamp && result[y] !== 0) {\n result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration = 0;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining = 0;\n while (this._i < this._tasks.length) {\n taskDuration = Date.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n // this is not an issue here as a clock change during a short running task is very unlikely\n // in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, Date.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = Date.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - Date.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor() {\n this._queue = new IdleTaskQueue();\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { IUnicodeService } from 'common/services/Services';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap<number, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap<string, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transfered to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue();\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _requestClearModel = false;\n public beginFrame(): boolean {\n return this._requestClearModel;\n }\n\n public clearTexture(): void {\n if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n return;\n }\n for (const page of this._pages) {\n page.clear();\n }\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a > b ? 1 : -1);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version++;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Request the model to be cleared to refresh all texture pages.\n this._requestClearModel = true;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version++;\n }\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap<string | number, number, number, number, IRasterizedGlyph>,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean = false\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor || undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._textureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n customGlyph = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yMid = yTop + lineWidth;\n const yBot = yTop + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n\n for (let i = 0; i < chWidth; i++) {\n this._tmpCtx.save();\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n const xChMid = xChLeft + this._config.deviceCellWidth / 2;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n this._tmpCtx.moveTo(xChLeft, yBot);\n this._tmpCtx.lineTo(xChRight, yBot);\n break;\n case UnderlineStyle.CURLY:\n // Choose the bezier top and bottom based on the device pixel ratio, the curly line is\n // made taller when the line width is as otherwise it's not very clear otherwise.\n const yCurlyBot = lineWidth <= 1 ? yBot : Math.ceil(padding + this._config.deviceCharHeight - lineWidth / 2) - yOffset;\n const yCurlyTop = lineWidth <= 1 ? yTop : Math.ceil(padding + this._config.deviceCharHeight + lineWidth / 2) - yOffset;\n // Clip the left and right edges of the underline such that it can be drawn just outside\n // the edge of the cell to ensure a continuous stroke when there are multiple underlined\n // glyphs adjacent to one another.\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n // Start 1/2 cell before and end 1/2 cells after to ensure a smooth curve with other\n // cells\n this._tmpCtx.moveTo(xChLeft - this._config.deviceCellWidth / 2, yMid);\n this._tmpCtx.bezierCurveTo(\n xChLeft - this._config.deviceCellWidth / 2, yCurlyTop,\n xChLeft, yCurlyTop,\n xChLeft, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChLeft, yCurlyBot,\n xChMid, yCurlyBot,\n xChMid, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChMid, yCurlyTop,\n xChRight, yCurlyTop,\n xChRight, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChRight, yCurlyBot,\n xChRight + this._config.deviceCellWidth / 2, yCurlyBot,\n xChRight + this._config.deviceCellWidth / 2, yMid\n );\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTop);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n break;\n }\n this._tmpCtx.stroke();\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version++;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray<IRasterizedGlyph> { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Used to check whether the canvas of the atlas page has changed.\n */\n public version = 0;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n if (sourcePages) {\n for (const p of sourcePages) {\n this._glyphs.push(...p.glyphs);\n this._usedPixels += p._usedPixels;\n }\n }\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version++;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevent pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required<ITerminalOptions>, colors: ReadonlyColorSet, devicePixelRatio: number): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs: options.customGlyphs,\n devicePixelRatio,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required<ITerminalOptions>,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this.restartBlinkAnimation();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint = 0;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n cp <<= 6;\n cp |= tmp;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n console.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n console.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { IOptionsService } from 'common/services/Services';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals}\n}`);\n}\n\nconst INDICES_PER_CELL = 11;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages)));\n this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n this._vertexArrayObject = gl.createVertexArray();\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this.register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n public beginFrame(): boolean {\n return this._atlas ? this._atlas.beginFrame() : true;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed\n for (let i = 0; i < this._atlas.pages.length; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n gl.generateMipmap(gl.TEXTURE_2D);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 4;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\nexport const RENDER_MODEL_EXT_OFFSET = 3;\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RENDER_MODEL_INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n this._vertexArrayObject = gl.createVertexArray();\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this.register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + 4) {\n vertices.attributes = expandFloat32Array(vertices.attributes, this._terminal.rows * this._terminal.cols * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache';\nimport { TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this.register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this.register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from 'browser/renderer/shared/CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from 'browser/renderer/shared/CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache';\nimport { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { CharData, IBufferLine, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel';\nimport { IWebGL2RenderingContext } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();\n private _charAtlasDisposable = this.register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _observerDisposable = this.register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _workCell: ICellData = new CellData();\n private _workCell2: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable<RectangleRenderer> = this.register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable<GlyphRenderer> = this.register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this.register(new EventEmitter<void>());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n this.register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this.register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this.register(addDisposableDomListener(this._canvas, 'webglcontextlost', (e) => {\n console.log('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n console.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this.register(addDisposableDomListener(this._canvas, 'webglcontextrestored', (e) => {\n console.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this.register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement!);\n\n this.register(toDisposable(() => {\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = getDisposeArrayDisposable([\n forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n ]);\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return -1;\n }\n\n public deregisterCharacterJoiner(joinerId: number): boolean {\n return false;\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let lastCharX: number;\n let range: [number, number];\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n line = terminal.buffer.lines.get(row)!;\n this._model.lineLengths[y] = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ?\n (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n (terminal.options.cursorStyle || 'block') === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x < lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0, 0);\n this._model.cells[j] = NULL_CELL_CODE;\n this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[j + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n }\n }\n }\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The the size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may causes blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n this._requestRedrawViewport();\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator.toString = () => id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[DI_TARGET] === target) {\n (target as any)[DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, CursorInactiveStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from '@xterm/xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent<{ cols: number, rows: number }>;\n onScroll: IEvent<number>;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent<CoreMouseEventType>;\n\n /**\n * Human readable version of mouse events.\n */\n explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n\n readonly onData: IEvent<string>;\n readonly onUserInput: IEvent<void>;\n readonly onBinary: IEvent<string>;\n readonly onRequestScrollToBottom: IEvent<void>;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n getService<T>(id: IServiceIdentifier<T>): T | undefined;\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required<ITerminalOptions>;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required<ITerminalOptions>;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n customGlyphs?: boolean;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsMode?: boolean;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n overviewRulerWidth?: number;\n\n [key: string]: any;\n cancelEvents: boolean;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register an Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered, when activate version changed. */\n readonly onChange: IEvent<string>;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator<IInternalDecoration>;\n readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n // For trace logging, assume the latest created log service is valid\n traceLogger = this;\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n if (typeof descriptor.value !== 'function') {\n throw new Error('not supported');\n }\n const fnKey = 'value';\n const fn = descriptor.value;\n descriptor[fnKey] = function (...args: any[]) {\n // Early exit\n if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n return fn.apply(this, args);\n }\n\n traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n const result = fn.apply(this, args);\n traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n return result;\n };\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { setTraceLogger } from 'common/services/LogService';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this.register(new EventEmitter<void>());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _preserveDrawingBuffer?: boolean\n ) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('Webgl2 is only supported on Safari 16 and above');\n }\n }\n super();\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this.register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n // Set trace logger just in case it hasn't been yet which could happen when the addon is\n // bundled separately to the core module\n setTraceLogger(logService);\n\n this._renderer = this.register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n optionsService,\n themeService,\n this._preserveDrawingBuffer\n ));\n this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss));\n this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this.register(forwardEvent(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this.register(toDisposable(() => {\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"],
|
|
5
|
+
"mappings": "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G,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGhC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGhC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAG5D,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAG5H,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAExC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAExC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAExC,YAAa,CAAC,CAAE,EAAG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",
|
|
6
|
+
"names": ["EventEmitter", "listener", "arg1", "arg2", "queue", "l", "i", "forwardEvent", "from", "to", "e", "Disposable", "d", "index", "MutableDisposable", "value", "toDisposable", "f", "disposeArray", "disposables", "getDisposeArrayDisposable", "array", "isNode", "userAgent", "platform", "isFirefox", "isLegacyEdge", "isSafari", "getSafariVersion", "majorVersion", "isMac", "isWindows", "platform", "isLinux", "isChromeOS", "userAgent", "addDisposableDomListener", "node", "type", "handler", "options", "disposed", "NULL_CELL_CHAR", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isRestrictedPowerlineGlyph", "isNerdFontGlyph", "isBoxOrBlockGlyph", "isEmoji", "allowRescaling", "width", "glyphSizeX", "deviceCellWidth", "treatGlyphAsBackgroundColor", "createRenderDimensions", "createDimension", "computeNextVariantOffset", "cellWidth", "lineWidth", "currentOffset", "$fg", "$bg", "$hasFg", "$hasBg", "$isSelected", "$colors", "$variantOffset", "CellColorResolver", "_terminal", "_optionService", "_selectionRenderModel", "_decorationService", "_coreBrowserService", "_themeService", "cell", "x", "y", "deviceCellWidth", "lineWidth", "d", "rgba", "treatGlyphAsBackgroundColor", "INVERTED_DEFAULT_COLOR", "DIM_OPACITY", "TEXT_BASELINE", "isFirefox", "isLegacyEdge", "blockElementDefinitions", "patternCharacterDefinitions", "boxDrawingDefinitions", "xp", "yp", "powerlineDefinitions", "tryDrawCustomChar", "ctx", "c", "xOffset", "yOffset", "deviceCellWidth", "deviceCellHeight", "fontSize", "devicePixelRatio", "blockElementDefinition", "blockElementDefinitions", "drawBlockElementChar", "patternDefinition", "patternCharacterDefinitions", "drawPatternChar", "boxDrawingDefinition", "boxDrawingDefinitions", "drawBoxDrawingChar", "powerlineDefinition", "drawPowerlineChar", "charDefinition", "i", "box", "xEighth", "yEighth", "cachedPatterns", "patternSet", "fillStyle", "pattern", "width", "height", "tmpCanvas", "tmpCtx", "throwIfFalsy", "imageData", "r", "g", "b", "a", "e", "y", "x", "fontWeight", "instructions", "actualInstructions", "yp", "instruction", "type", "f", "svgToCanvasInstructionMap", "args", "translateArgs", "clipRegion", "cssLineWidth", "clamp", "value", "max", "min", "cellWidth", "cellHeight", "doClamp", "leftPadding", "rightPadding", "result", "TwoKeyMap", "first", "second", "value", "FourKeyMap", "third", "fourth", "TaskQueue", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "isNode", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "NULL_RASTERIZED_GLYPH", "TMP_CANVAS_GLYPH_PADDING", "$glyph", "TextureAtlas", "_TextureAtlas", "_document", "_config", "_unicodeService", "FourKeyMap", "AttributeData", "EventEmitter", "createCanvas", "TMP_CANVAS_GLYPH_PADDING", "throwIfFalsy", "page", "queue", "IdleTaskQueue", "i", "rasterizedGlyph", "pagesBySize", "e", "b", "sameSizeI", "size", "mergingPages", "sortedMergingPagesIndexes", "mergedPageIndex", "mergedPage", "newPage", "AtlasPage", "mergedSize", "p", "xOffset", "yOffset", "g", "index", "pageIndex", "j", "adjustingPage", "chars", "bg", "fg", "ext", "restrictToCellHeight", "code", "cacheMap", "key", "idx", "bgColorMode", "bgColor", "inverse", "dim", "NULL_COLOR", "result", "arr", "channels", "color", "fgColorMode", "fgColor", "bold", "excludeFromContrastRatioDemands", "minimumContrastColor", "DIM_OPACITY", "cache", "adjustedColor", "bgRgba", "fgRgba", "rgba", "codeOrChars", "allowedWidth", "allowedHeight", "NULL_RASTERIZED_GLYPH", "italic", "underline", "strikethrough", "overline", "temp", "temp2", "backgroundColor", "fontWeight", "fontStyle", "TEXT_BASELINE", "powerlineGlyph", "isPowerlineGlyph", "restrictedPowerlineGlyph", "isRestrictedPowerlineGlyph", "foregroundColor", "treatGlyphAsBackgroundColor", "padding", "customGlyph", "tryDrawCustomChar", "enableClearThresholdCheck", "chWidth", "lineWidth", "xLeft", "yTop", "yMid", "yBot", "nextOffset", "xChLeft", "xChRight", "xChMid", "yCurlyBot", "yCurlyTop", "clipRegion", "offsetWidth", "computeNextVariantOffset", "lineRatio", "gapRatio", "xChWidth", "line", "gap", "end", "metrics", "isBeyondCellBounds", "clearColor", "offset", "imageData", "isEmpty", "checkCompletelyTransparent", "activePage", "activeRow", "row", "wasPageAndRowFound", "candidatePage", "boundingBox", "restrictedGlyph", "height", "width", "found", "y", "x", "alphaOffset", "document", "sourcePages", "glyph", "enableThresholdCheck", "r", "fgR", "fgG", "fgB", "threshold", "canvas", "generateConfig", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "options", "colors", "devicePixelRatio", "clonedColors", "NULL_COLOR", "configEquals", "a", "b", "i", "is256Color", "colorCode", "charAtlasCache", "acquireTextureAtlas", "terminal", "options", "colors", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "devicePixelRatio", "newConfig", "generateConfig", "i", "entry", "ownedByIndex", "configEquals", "core", "newEntry", "TextureAtlas", "removeTerminalFromCache", "index", "BLINK_INTERVAL", "CursorBlinkStateManager", "_renderCallback", "_coreBrowserService", "timeToStart", "time", "observeDevicePixelDimensions", "element", "parentWindow", "callback", "observer", "entries", "entry", "width", "height", "toDisposable", "stringFromCodePoint", "codePoint", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "PROJECTION_MATRIX", "createProgram", "gl", "vertexSource", "fragmentSource", "program", "throwIfFalsy", "createShader", "type", "source", "shader", "expandFloat32Array", "max", "newLength", "newArray", "i", "GLTexture", "texture", "vertexShaderSource", "createFragmentShaderSource", "maxFragmentShaderTextureUnits", "textureConditionals", "i", "INDICES_PER_CELL", "BYTES_PER_CELL", "CELL_POSITION_INDICES", "$i", "$glyph", "$leftCellPadding", "$clippedPixels", "GlyphRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_optionsService", "gl", "TextureAtlas", "throwIfFalsy", "createProgram", "toDisposable", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "textureUnits", "PROJECTION_MATRIX", "glTexture", "GLTexture", "x", "y", "code", "bg", "fg", "ext", "chars", "width", "lastBg", "array", "allowRescaling", "terminal", "newCount", "renderModel", "activeBuffer", "bufferLength", "si", "sub", "atlas", "dimensions", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "RENDER_MODEL_EXT_OFFSET", "COMBINED_CHAR_BIT_MASK", "RenderModel", "createSelectionRenderModel", "cols", "rows", "indexCount", "vertexShaderSource", "fragmentShaderSource", "INDICES_PER_RECTANGLE", "BYTES_PER_RECTANGLE", "INITIAL_BUFFER_RECTANGLE_CAPACITY", "Vertices", "$rgba", "$x1", "$y1", "$r", "$g", "$b", "$a", "RectangleRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_themeService", "gl", "throwIfFalsy", "createProgram", "toDisposable", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "e", "vertices", "PROJECTION_MATRIX", "dimensions", "colors", "model", "terminal", "rectangleCount", "y", "x", "currentStartX", "currentBg", "currentFg", "currentInverse", "modelIndex", "bg", "fg", "inverse", "offset", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "cursor", "startX", "endX", "expandFloat32Array", "array", "x1", "y1", "width", "height", "r", "g", "b", "a", "color", "BaseRenderLayer", "Disposable", "terminal", "_container", "id", "zIndex", "_alpha", "_coreBrowserService", "_optionsService", "_themeService", "e", "toDisposable", "throwIfFalsy", "startRow", "endRow", "start", "end", "columnSelectMode", "alpha", "oldCanvas", "colorSet", "acquireTextureAtlas", "dim", "x", "y", "width", "height", "cell", "TEXT_BASELINE", "isBold", "isItalic", "fontWeight", "LinkRenderLayer", "BaseRenderLayer", "container", "zIndex", "terminal", "linkifier2", "coreBrowserService", "optionsService", "themeService", "e", "dim", "middleRowCount", "INVERTED_DEFAULT_COLOR", "is256Color", "y", "WebglRenderer", "Disposable", "_terminal", "_characterJoinerService", "_charSizeService", "_coreBrowserService", "_coreService", "_decorationService", "_optionsService", "_themeService", "preserveDrawingBuffer", "MutableDisposable", "RenderModel", "CellData", "EventEmitter", "CellColorResolver", "LinkRenderLayer", "createRenderDimensions", "contextAttributes", "addDisposableDomListener", "e", "removeTerminalFromCache", "observeDevicePixelDimensions", "w", "h", "toDisposable", "l", "cols", "rows", "start", "end", "columnSelectMode", "RectangleRenderer", "GlyphRenderer", "atlas", "acquireTextureAtlas", "getDisposeArrayDisposable", "forwardEvent", "clearGlyphRenderer", "handler", "joinerId", "CursorBlinkStateManager", "terminal", "cell", "lastBg", "y", "row", "line", "joinedRanges", "isJoined", "lastCharX", "range", "chars", "code", "width", "i", "x", "j", "clamp", "cursorY", "viewportRelativeCursorY", "cursorX", "lastCursorX", "isCursorVisible", "modelUpdated", "JoinedCellData", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "RENDER_MODEL_EXT_OFFSET", "COMBINED_CHAR_BIT_MASK", "NULL_CELL_CHAR", "height", "AttributeData", "firstCell", "value", "max", "min", "DI_TARGET", "DI_DEPENDENCIES", "serviceRegistry", "createDecorator", "id", "serviceRegistry", "decorator", "target", "key", "index", "storeServiceDependency", "DI_TARGET", "DI_DEPENDENCIES", "IBufferService", "createDecorator", "ICoreMouseService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "traceLogger", "optionalParams", "i", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "setTraceLogger", "logger", "WebglAddon", "Disposable", "_preserveDrawingBuffer", "isSafari", "getSafariVersion", "contextAttributes", "EventEmitter", "terminal", "core", "coreService", "optionsService", "unsafeCore", "renderService", "characterJoinerService", "charSizeService", "coreBrowserService", "decorationService", "logService", "themeService", "setTraceLogger", "WebglRenderer", "forwardEvent", "toDisposable"]
|
|
7
|
+
}
|