{"version":3,"file":"xterm-addon-webgl.js","mappings":"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","sources":["webpack://WebglAddon/webpack/universalModuleDefinition","webpack://WebglAddon/./src/GlyphRenderer.ts","webpack://WebglAddon/./src/RectangleRenderer.ts","webpack://WebglAddon/./src/RenderModel.ts","webpack://WebglAddon/./src/TypedArray.ts","webpack://WebglAddon/./src/WebglRenderer.ts","webpack://WebglAddon/./src/WebglUtils.ts","webpack://WebglAddon/./src/atlas/CharAtlasCache.ts","webpack://WebglAddon/./src/atlas/CharAtlasUtils.ts","webpack://WebglAddon/./src/atlas/WebglCharAtlas.ts","webpack://WebglAddon/./src/renderLayer/BaseRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/CursorRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/LinkRenderLayer.ts","webpack://WebglAddon/../../src/browser/Color.ts","webpack://WebglAddon/../../src/browser/Lifecycle.ts","webpack://WebglAddon/../../src/browser/renderer/CustomGlyphs.ts","webpack://WebglAddon/../../src/browser/renderer/RendererUtils.ts","webpack://WebglAddon/../../src/browser/renderer/atlas/Constants.ts","webpack://WebglAddon/../../src/common/EventEmitter.ts","webpack://WebglAddon/../../src/common/Lifecycle.ts","webpack://WebglAddon/../../src/common/Platform.ts","webpack://WebglAddon/../../src/common/TypedArrayUtils.ts","webpack://WebglAddon/../../src/common/buffer/AttributeData.ts","webpack://WebglAddon/../../src/common/buffer/CellData.ts","webpack://WebglAddon/../../src/common/buffer/Constants.ts","webpack://WebglAddon/../../src/common/input/TextDecoder.ts","webpack://WebglAddon/webpack/bootstrap","webpack://WebglAddon/./src/WebglAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WebglAddon\"] = factory();\n\telse\n\t\troot[\"WebglAddon\"] = factory();\n})(self, function() {\nreturn ","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { createProgram, PROJECTION_MATRIX, throwIfFalsy } from './WebglUtils';\nimport { WebglCharAtlas } from './atlas/WebglCharAtlas';\nimport { IWebGL2RenderingContext, IWebGLVertexArrayObject, IRenderModel, IRasterizedGlyph } from './Types';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_INDICIES_PER_CELL, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_BG_OFFSET } from './RenderModel';\nimport { fill } from 'common/TypedArrayUtils';\nimport { slice } from './TypedArray';\nimport { NULL_CELL_CODE, WHITESPACE_CELL_CODE, Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Terminal, IBufferLine } from 'xterm';\nimport { IColorSet, IColor } from 'browser/Types';\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\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 selectionAttributes: Float32Array;\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXCOORD = 4,\n TEXSIZE = 5\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.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;\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_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\n\nuniform sampler2D u_texture;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = texture(u_texture, v_texcoord);\n}`;\n\nconst INDICES_PER_CELL = 10;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\nexport class GlyphRenderer {\n private _atlas: WebglCharAtlas | undefined;\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _projectionLocation: WebGLUniformLocation;\n private _resolutionLocation: WebGLUniformLocation;\n private _textureLocation: WebGLUniformLocation;\n private _atlasTexture: WebGLTexture;\n private _attributesBuffer: WebGLBuffer;\n private _activeBuffer: number = 0;\n\n private _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ],\n selectionAttributes: new Float32Array(0)\n };\n\n constructor(\n private _terminal: Terminal,\n private _colors: IColorSet,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions\n ) {\n const gl = this._gl;\n const program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n this._program = 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 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 // unitQuadVertuces to allow is to draw 2 triangles from the vertices\n const unitQuadElementIndices = new Uint8Array([0, 1, 3, 0, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\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 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.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 4 * 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, 6 * 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, 8 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup empty texture atlas\n this._atlasTexture = throwIfFalsy(gl.createTexture());\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 255, 255]));\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\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.onResize();\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, chars: string): void {\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, chars);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, chars?: string): void {\n const terminal = this._terminal;\n\n const i = (y * 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 fill(array, 0, i, i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n return;\n }\n\n let rasterizedGlyph: IRasterizedGlyph;\n if (!this._atlas) {\n return;\n }\n if (chars && chars.length > 1) {\n rasterizedGlyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg);\n } else {\n rasterizedGlyph = this._atlas.getRasterizedGlyph(code, bg, fg);\n }\n\n // Fill empty if no glyph was found\n if (!rasterizedGlyph) {\n fill(array, 0, i, i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n return;\n }\n\n // a_origin\n array[i ] = -rasterizedGlyph.offset.x + this._dimensions.scaledCharLeft;\n array[i + 1] = -rasterizedGlyph.offset.y + this._dimensions.scaledCharTop;\n // a_size\n array[i + 2] = rasterizedGlyph.size.x / this._dimensions.scaledCanvasWidth;\n array[i + 3] = rasterizedGlyph.size.y / this._dimensions.scaledCanvasHeight;\n // a_texcoord\n array[i + 4] = rasterizedGlyph.texturePositionClipSpace.x;\n array[i + 5] = rasterizedGlyph.texturePositionClipSpace.y;\n // a_texsize\n array[i + 6] = rasterizedGlyph.sizeClipSpace.x;\n array[i + 7] = rasterizedGlyph.sizeClipSpace.y;\n // a_cellpos only changes on resize\n }\n\n public updateSelection(model: IRenderModel): void {\n const terminal = this._terminal;\n\n this._vertices.selectionAttributes = slice(this._vertices.attributes, 0);\n\n const bg = (this._colors.selectionOpaque.rgba >>> 8) | Attributes.CM_RGB;\n\n if (model.selection.columnSelectMode) {\n const startCol = model.selection.startCol;\n const width = model.selection.endCol - startCol;\n const height = model.selection.viewportCappedEndRow - model.selection.viewportCappedStartRow + 1;\n for (let y = model.selection.viewportCappedStartRow; y < model.selection.viewportCappedStartRow + height; y++) {\n this._updateSelectionRange(startCol, startCol + width, y, model, bg);\n }\n } else {\n // Draw first row\n const startCol = model.selection.viewportStartRow === model.selection.viewportCappedStartRow ? model.selection.startCol : 0;\n const startRowEndCol = model.selection.viewportCappedStartRow === model.selection.viewportCappedEndRow ? model.selection.endCol : terminal.cols;\n this._updateSelectionRange(startCol, startRowEndCol, model.selection.viewportCappedStartRow, model, bg);\n\n // Draw middle rows\n const middleRowsCount = Math.max(model.selection.viewportCappedEndRow - model.selection.viewportCappedStartRow - 1, 0);\n for (let y = model.selection.viewportCappedStartRow + 1; y <= model.selection.viewportCappedStartRow + middleRowsCount; y++) {\n this._updateSelectionRange(0, startRowEndCol, y, model, bg);\n }\n\n // Draw final row\n if (model.selection.viewportCappedStartRow !== model.selection.viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewportStartRow\n const endCol = model.selection.viewportEndRow === model.selection.viewportCappedEndRow ? model.selection.endCol : terminal.cols;\n this._updateSelectionRange(0, endCol, model.selection.viewportCappedEndRow, model, bg);\n }\n }\n }\n\n private _updateSelectionRange(startCol: number, endCol: number, y: number, model: IRenderModel, bg: number): void {\n const terminal = this._terminal;\n const row = y + terminal.buffer.active.viewportY;\n let line: IBufferLine | undefined;\n for (let x = startCol; x < endCol; x++) {\n const offset = (y * this._terminal.cols + x) * RENDER_MODEL_INDICIES_PER_CELL;\n const code = model.cells[offset];\n let fg = model.cells[offset + RENDER_MODEL_FG_OFFSET];\n if (fg & FgFlags.INVERSE) {\n const workCell = new AttributeData();\n workCell.fg = fg;\n workCell.bg = model.cells[offset + RENDER_MODEL_BG_OFFSET];\n // Get attributes from fg (excluding inverse) and resolve inverse by pullibng rgb colors\n // from bg. This is needed since the inverse fg color should be based on the original bg\n // color, not on the selection color\n fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK | FgFlags.INVERSE);\n switch (workCell.getBgColorMode()) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n const c = this._getColorFromAnsiIndex(workCell.getBgColor()).rgba;\n fg |= (c >> 8) & Attributes.RED_MASK | (c >> 8) & Attributes.GREEN_MASK | (c >> 8) & Attributes.BLUE_MASK;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(workCell.getBgColor());\n fg |= arr[0] << Attributes.RED_SHIFT | arr[1] << Attributes.GREEN_SHIFT | arr[2] << Attributes.BLUE_SHIFT;\n case Attributes.CM_DEFAULT:\n default:\n const c2 = this._colors.background.rgba;\n fg |= (c2 >> 8) & Attributes.RED_MASK | (c2 >> 8) & Attributes.GREEN_MASK | (c2 >> 8) & Attributes.BLUE_MASK;\n }\n fg |= Attributes.CM_RGB;\n }\n if (code & COMBINED_CHAR_BIT_MASK) {\n if (!line) {\n line = terminal.buffer.active.getLine(row);\n }\n const chars = line!.getCell(x)!.getChars();\n this._updateCell(this._vertices.selectionAttributes, x, y, model.cells[offset], bg, fg, chars);\n } else {\n this._updateCell(this._vertices.selectionAttributes, x, y, model.cells[offset], bg, fg);\n }\n }\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._colors.ansi[idx];\n }\n\n public onResize(): void {\n const terminal = this._terminal;\n const gl = this._gl;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Update vertices\n const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n if (this._vertices.count !== newCount) {\n this._vertices.count = newCount;\n this._vertices.attributes = new Float32Array(newCount);\n for (let i = 0; i < this._vertices.attributesBuffers.length; i++) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n }\n\n let 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 + 8] = x / terminal.cols;\n this._vertices.attributes[i + 9] = y / terminal.rows;\n i += INDICES_PER_CELL;\n }\n }\n }\n }\n\n public setColors(): void {\n }\n\n public render(renderModel: IRenderModel, isSelectionVisible: boolean): 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 = (isSelectionVisible ? this._vertices.selectionAttributes : 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 texture atlas if it's changed\n if (this._atlas.hasCanvasChanged) {\n this._atlas.hasCanvasChanged = false;\n gl.uniform1i(this._textureLocation, 0);\n gl.activeTexture(gl.TEXTURE0 + 0);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this._atlas.cacheCanvas);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n\n // Set uniforms\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: WebglCharAtlas): void {\n const gl = this._gl;\n this._atlas = atlas;\n\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.cacheCanvas);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX, throwIfFalsy } from './WebglUtils';\nimport { IRenderModel, IWebGLVertexArrayObject, IWebGL2RenderingContext, ISelectionRenderModel } from './Types';\nimport { fill } from 'common/TypedArrayUtils';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Terminal } from 'xterm';\nimport { IColorSet, IColor } from 'browser/Types';\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\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;\nuniform vec2 u_resolution;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = (a_position + (a_unitquad * a_size)) / u_resolution;\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\ninterface IVertices {\n attributes: Float32Array;\n selection: Float32Array;\n count: number;\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\nexport class RectangleRenderer {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _resolutionLocation: WebGLUniformLocation;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _selectionFloat!: Float32Array;\n\n private _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY),\n selection: new Float32Array(3 * INDICES_PER_RECTANGLE)\n };\n\n constructor(\n private _terminal: Terminal,\n private _colors: IColorSet,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions\n ) {\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n\n // Uniform locations\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\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 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 // unitQuadVertuces to allow is to draw 2 triangles from the vertices\n const unitQuadElementIndices = new Uint8Array([0, 1, 3, 0, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\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 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();\n }\n\n public render(): 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 gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0, this._vertices.count);\n\n // Bind selection buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this._vertices.selection, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0, 3);\n }\n\n public onResize(): void {\n this._updateViewportRectangle();\n }\n\n public setColors(): void {\n this._updateCachedColors();\n this._updateViewportRectangle();\n }\n\n private _updateCachedColors(): void {\n this._bgFloat = this._colorToFloat32Array(this._colors.background);\n this._selectionFloat = this._colorToFloat32Array(this._colors.selectionOpaque);\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.scaledCellWidth,\n this._terminal.rows * this._dimensions.scaledCellHeight,\n this._bgFloat\n );\n }\n\n public updateSelection(model: ISelectionRenderModel): void {\n const terminal = this._terminal;\n\n if (!model.hasSelection) {\n fill(this._vertices.selection, 0, 0);\n return;\n }\n\n if (model.columnSelectMode) {\n const startCol = model.startCol;\n const width = model.endCol - startCol;\n const height = model.viewportCappedEndRow - model.viewportCappedStartRow + 1;\n this._addRectangleFloat(\n this._vertices.selection,\n 0,\n startCol * this._dimensions.scaledCellWidth,\n model.viewportCappedStartRow * this._dimensions.scaledCellHeight,\n width * this._dimensions.scaledCellWidth,\n height * this._dimensions.scaledCellHeight,\n this._selectionFloat\n );\n fill(this._vertices.selection, 0, INDICES_PER_RECTANGLE);\n } else {\n // Draw first row\n const startCol = model.viewportStartRow === model.viewportCappedStartRow ? model.startCol : 0;\n const startRowEndCol = model.viewportCappedStartRow === model.viewportEndRow ? model.endCol : terminal.cols;\n this._addRectangleFloat(\n this._vertices.selection,\n 0,\n startCol * this._dimensions.scaledCellWidth,\n model.viewportCappedStartRow * this._dimensions.scaledCellHeight,\n (startRowEndCol - startCol) * this._dimensions.scaledCellWidth,\n this._dimensions.scaledCellHeight,\n this._selectionFloat\n );\n\n // Draw middle rows\n const middleRowsCount = Math.max(model.viewportCappedEndRow - model.viewportCappedStartRow - 1, 0);\n this._addRectangleFloat(\n this._vertices.selection,\n INDICES_PER_RECTANGLE,\n 0,\n (model.viewportCappedStartRow + 1) * this._dimensions.scaledCellHeight,\n terminal.cols * this._dimensions.scaledCellWidth,\n middleRowsCount * this._dimensions.scaledCellHeight,\n this._selectionFloat\n );\n\n // Draw final row\n if (model.viewportCappedStartRow !== model.viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewportStartRow\n const endCol = model.viewportEndRow === model.viewportCappedEndRow ? model.endCol : terminal.cols;\n this._addRectangleFloat(\n this._vertices.selection,\n INDICES_PER_RECTANGLE * 2,\n 0,\n model.viewportCappedEndRow * this._dimensions.scaledCellHeight,\n endCol * this._dimensions.scaledCellWidth,\n this._dimensions.scaledCellHeight,\n this._selectionFloat\n );\n } else {\n fill(this._vertices.selection, 0, INDICES_PER_RECTANGLE * 2);\n }\n }\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n let rectangleCount = 1;\n\n for (let y = 0; y < terminal.rows; y++) {\n let currentStartX = -1;\n let currentBg = 0;\n let currentFg = 0;\n let currentInverse = false;\n for (let x = 0; x < terminal.cols; x++) {\n const modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n const bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n const fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n const 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 const 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 const 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 private _updateRectangle(vertices: IVertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n let rgba: number | undefined;\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n rgba = this._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._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._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._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 const x1 = startX * this._dimensions.scaledCellWidth;\n const y1 = y * this._dimensions.scaledCellHeight;\n const r = ((rgba >> 24) & 0xFF) / 255;\n const g = ((rgba >> 16) & 0xFF) / 255;\n const b = ((rgba >> 8 ) & 0xFF) / 255;\n\n this._addRectangle(vertices.attributes, offset, x1, y1, (endX - startX) * this._dimensions.scaledCellWidth, this._dimensions.scaledCellHeight, r, g, b, 1);\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;\n array[offset + 1] = y1;\n array[offset + 2] = width;\n array[offset + 3] = 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;\n array[offset + 1] = y1;\n array[offset + 2] = width;\n array[offset + 3] = 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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderModel, ISelectionRenderModel } from './Types';\nimport { fill } from 'common/TypedArrayUtils';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 3;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\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\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = {\n hasSelection: false,\n columnSelectMode: false,\n viewportStartRow: 0,\n viewportEndRow: 0,\n viewportCappedStartRow: 0,\n viewportCappedEndRow: 0,\n startCol: 0,\n endCol: 0\n };\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 fill(this.cells, 0, 0);\n fill(this.lineLengths, 0, 0);\n }\n\n public clearSelection(): void {\n this.selection.hasSelection = false;\n this.selection.viewportStartRow = 0;\n this.selection.viewportEndRow = 0;\n this.selection.viewportCappedStartRow = 0;\n this.selection.viewportCappedEndRow = 0;\n this.selection.startCol = 0;\n this.selection.endCol = 0;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport type TypedArray = Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array;\n\nexport function slice(array: T, start?: number, end?: number): T {\n // all modern engines that support .slice\n if (array.slice) {\n return array.slice(start, end) as T;\n }\n return sliceFallback(array, start, end);\n}\n\nexport function sliceFallback(array: T, start: number = 0, end: number = array.length): T {\n if (start < 0) {\n start = (array.length + start) % array.length;\n }\n if (end >= array.length) {\n end = array.length;\n } else {\n end = (array.length + end) % array.length;\n }\n start = Math.min(start, end);\n\n const result: T = new (array.constructor as any)(end - start);\n for (let i = 0; i < end - start; ++i) {\n result[i] = array[i + start];\n }\n return result;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { CursorRenderLayer } from './renderLayer/CursorRenderLayer';\nimport { acquireCharAtlas } from './atlas/CharAtlasCache';\nimport { WebglCharAtlas } from './atlas/WebglCharAtlas';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { IWebGL2RenderingContext } from './Types';\nimport { RenderModel, COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { Disposable } from 'common/Lifecycle';\nimport { Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Terminal, IEvent } from 'xterm';\nimport { IRenderLayer } from './renderLayer/Types';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { ITerminal, IColorSet } from 'browser/Types';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { CellData } from 'common/buffer/CellData';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ICharacterJoinerService } from 'browser/services/Services';\nimport { CharData, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _charAtlas: WebglCharAtlas | undefined;\n private _devicePixelRatio: number;\n\n private _model: RenderModel = new RenderModel();\n private _workCell: CellData = new CellData();\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: RectangleRenderer;\n private _glyphRenderer: GlyphRenderer;\n\n public dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n\n private _onRequestRedraw = new EventEmitter();\n public get onRequestRedraw(): IEvent { return this._onRequestRedraw.event; }\n\n private _onContextLoss = new EventEmitter();\n public get onContextLoss(): IEvent { return this._onContextLoss.event; }\n\n constructor(\n private _terminal: Terminal,\n private _colors: IColorSet,\n private readonly _characterJoinerService: ICharacterJoinerService,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._colors, this._core),\n new CursorRenderLayer(_terminal, this._core.screenElement!, 3, this._colors, this._core, this._onRequestRedraw)\n ];\n this.dimensions = {\n scaledCharWidth: 0,\n scaledCharHeight: 0,\n scaledCellWidth: 0,\n scaledCellHeight: 0,\n scaledCharLeft: 0,\n scaledCharTop: 0,\n scaledCanvasWidth: 0,\n scaledCanvasHeight: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n actualCellWidth: 0,\n actualCellHeight: 0\n };\n this._devicePixelRatio = window.devicePixelRatio;\n this._updateDimensions();\n\n this._canvas = document.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) => { this._onContextLoss.fire(e); }));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n this._rectangleRenderer = new RectangleRenderer(this._terminal, this._colors, this._gl, this.dimensions);\n this._glyphRenderer = new GlyphRenderer(this._terminal, this._colors, this._gl, this.dimensions);\n\n // Update dimensions and acquire char atlas\n this.onCharSizeChanged();\n\n this._isAttached = document.body.contains(this._core.screenElement!);\n }\n\n public dispose(): void {\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n super.dispose();\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.cacheCanvas;\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n // Clear layers and force a full render\n for (const l of this._renderLayers) {\n l.setColors(this._terminal, this._colors);\n l.reset(this._terminal);\n }\n\n this._rectangleRenderer.setColors();\n this._glyphRenderer.setColors();\n\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._model.clear();\n }\n\n public onDevicePixelRatioChange(): 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 !== window.devicePixelRatio) {\n this._devicePixelRatio = window.devicePixelRatio;\n this.onResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public onResize(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.scaledCanvasWidth;\n this._canvas.height = this.dimensions.scaledCanvasHeight;\n this._canvas.style.width = `${this.dimensions.canvasWidth}px`;\n this._canvas.style.height = `${this.dimensions.canvasHeight}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.canvasWidth}px`;\n this._core.screenElement!.style.height = `${this.dimensions.canvasHeight}px`;\n\n this._rectangleRenderer.onResize();\n if (this._model.selection.hasSelection) {\n // Update selection as dimensions have changed\n this._rectangleRenderer.updateSelection(this._model.selection);\n }\n\n this._glyphRenderer.setDimensions(this.dimensions);\n this._glyphRenderer.onResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._model.clear();\n }\n\n public onCharSizeChanged(): void {\n this.onResize(this._terminal.cols, this._terminal.rows);\n }\n\n public onBlur(): void {\n for (const l of this._renderLayers) {\n l.onBlur(this._terminal);\n }\n }\n\n public onFocus(): void {\n for (const l of this._renderLayers) {\n l.onFocus(this._terminal);\n }\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.onSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n\n this._updateSelectionModel(start, end, columnSelectMode);\n\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n public onCursorMove(): void {\n for (const l of this._renderLayers) {\n l.onCursorMove(this._terminal);\n }\n }\n\n public onOptionsChanged(): void {\n for (const l of this._renderLayers) {\n l.onOptionsChanged(this._terminal);\n }\n this._updateDimensions();\n this._refreshCharAtlas();\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(): void {\n if (this.dimensions.scaledCharWidth <= 0 && this.dimensions.scaledCharHeight <= 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 = acquireCharAtlas(this._terminal, this._colors, this.dimensions.scaledCellWidth, this.dimensions.scaledCellHeight, this.dimensions.scaledCharWidth, this.dimensions.scaledCharHeight);\n if (!('getRasterizedGlyph' in atlas)) {\n throw new Error('The webgl renderer only works with the webgl char atlas');\n }\n this._charAtlas = atlas as WebglCharAtlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.setAtlas(this._charAtlas);\n }\n\n public clearCharAtlas(): void {\n this._charAtlas?.clearTexture();\n this._model.clear();\n this._updateModel(0, this._terminal.rows - 1);\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n public clear(): void {\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\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 (document.body.contains(this._core.screenElement!) && (this._core as any)._charSizeService.width && (this._core as any)._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.onGridChanged(this._terminal, start, end);\n }\n\n // Tell renderer the frame is beginning\n if (this._glyphRenderer.beginFrame()) {\n this._model.clear();\n this._updateSelectionModel(undefined, undefined);\n }\n\n // Update model to reflect what's drawn\n this._updateModel(start, end);\n\n // Render\n this._rectangleRenderer.render();\n this._glyphRenderer.render(this._model, this._model.selection.hasSelection);\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n for (let y = start; y <= end; y++) {\n const row = y + terminal.buffer.ydisp;\n const line = terminal.buffer.lines.get(row)!;\n this._model.lineLengths[y] = 0;\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (let x = 0; x < terminal.cols; x++) {\n line.loadCell(x, cell);\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n let 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 const 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 const chars = cell.getChars();\n let code = cell.getCode();\n const i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\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] === cell.bg &&\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] === cell.fg) {\n continue;\n }\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] = cell.bg;\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] = cell.fg;\n\n this._glyphRenderer.updateCell(x, y, code, cell.bg, cell.fg, chars);\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 const j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n this._glyphRenderer.updateCell(x, y, NULL_CELL_CODE, 0, 0, NULL_CELL_CHAR);\n this._model.cells[j] = NULL_CELL_CODE;\n this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._workCell.bg;\n this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._workCell.fg;\n }\n }\n }\n }\n this._rectangleRenderer.updateBackgrounds(this._model);\n if (this._model.selection.hasSelection) {\n // Model could be updated but the selection is unchanged\n this._glyphRenderer.updateSelection(this._model);\n }\n }\n\n private _updateSelectionModel(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n const terminal = this._terminal;\n\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this._model.clearSelection();\n this._rectangleRenderer.updateSelection(this._model.selection);\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportStartRow = start[1] - terminal.buffer.active.viewportY;\n const viewportEndRow = end[1] - terminal.buffer.active.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._model.clearSelection();\n this._rectangleRenderer.updateSelection(this._model.selection);\n return;\n }\n\n this._model.selection.hasSelection = true;\n this._model.selection.columnSelectMode = columnSelectMode;\n this._model.selection.viewportStartRow = viewportStartRow;\n this._model.selection.viewportEndRow = viewportEndRow;\n this._model.selection.viewportCappedStartRow = viewportCappedStartRow;\n this._model.selection.viewportCappedEndRow = viewportCappedEndRow;\n this._model.selection.startCol = start[0];\n this._model.selection.endCol = end[0];\n\n this._rectangleRenderer.updateSelection(this._model.selection);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // TODO: Acquire CharSizeService properly\n\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!(this._core as any)._charSizeService.width || !(this._core as any)._charSizeService.height) {\n return;\n }\n\n // Calculate the scaled character width. Width is floored as it must be\n // drawn to an integer grid in order for the CharAtlas \"stamps\" to not be\n // blurry. When text is drawn to the grid not using the CharAtlas, it is\n // clipped to ensure there is no overlap with the next cell.\n\n // NOTE: ceil fixes sometime, floor does others :s\n\n this.dimensions.scaledCharWidth = Math.floor((this._core as any)._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the scaled character height. Height is ceiled in case\n // devicePixelRatio is a floating point number in order to ensure there is\n // enough space to draw the character to the cell.\n this.dimensions.scaledCharHeight = Math.ceil((this._core as any)._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the scaled cell height, if lineHeight is not 1 then the value\n // will be floored because since lineHeight can never be lower then 1, there\n // is a guarentee that the scaled line height will always be larger than\n // scaled char height.\n this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._terminal.getOption('lineHeight'));\n\n // Calculate the y coordinate within a cell that text should draw from in\n // order to draw in the center of a cell.\n this.dimensions.scaledCharTop = this._terminal.getOption('lineHeight') === 1 ? 0 : Math.round((this.dimensions.scaledCellHeight - this.dimensions.scaledCharHeight) / 2);\n\n // Calculate the scaled cell width, taking the letterSpacing into account.\n this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._terminal.getOption('letterSpacing'));\n\n // Calculate the x coordinate with a cell that text should draw from in\n // order to draw in the center of a cell.\n this.dimensions.scaledCharLeft = Math.floor(this._terminal.getOption('letterSpacing') / 2);\n\n // Recalculate the canvas dimensions; scaled* define the actual number of\n // pixel in the canvas\n this.dimensions.scaledCanvasHeight = this._terminal.rows * this.dimensions.scaledCellHeight;\n this.dimensions.scaledCanvasWidth = this._terminal.cols * this.dimensions.scaledCellWidth;\n\n // The the size of the canvas on the page. It's very important that this\n // rounds to nearest integer and not ceils as browsers often set\n // window.devicePixelRatio as something like 1.100000023841858, when it's\n // actually 1.1. Ceiling causes blurriness as the backing canvas image is 1\n // pixel too large for the canvas element size.\n this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / this._devicePixelRatio);\n this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / this._devicePixelRatio);\n\n // this.dimensions.scaledCanvasHeight = this.dimensions.canvasHeight * devicePixelRatio;\n // this.dimensions.scaledCanvasWidth = this.dimensions.canvasWidth * devicePixelRatio;\n\n // Get the _actual_ dimensions of an individual cell. This needs to be\n // derived from the canvasWidth/Height calculated above which takes into\n // account window.devicePixelRatio. CharMeasure.width/height by itself is\n // insufficient when the page is not at 100% zoom level as CharMeasure is\n // measured in CSS pixels, but the actual char size on the canvas can\n // differ.\n // this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._terminal.rows;\n // this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._terminal.cols;\n\n // This fixes 110% and 125%, not 150% or 175% though\n this.dimensions.actualCellHeight = this.dimensions.scaledCellHeight / this._devicePixelRatio;\n this.dimensions.actualCellWidth = this.dimensions.scaledCellWidth / this._devicePixelRatio;\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","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\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 function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { generateConfig, configEquals } from './CharAtlasUtils';\nimport { WebglCharAtlas } from './WebglCharAtlas';\nimport { ICharAtlasConfig } from './Types';\nimport { Terminal } from 'xterm';\nimport { IColorSet } from 'browser/Types';\n\ninterface ICharAtlasCacheEntry {\n atlas: WebglCharAtlas;\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: ICharAtlasCacheEntry[] = [];\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 * @param terminal The terminal.\n * @param colors The colors to use.\n */\nexport function acquireCharAtlas(\n terminal: Terminal,\n colors: IColorSet,\n scaledCellWidth: number,\n scaledCellHeight: number,\n scaledCharWidth: number,\n scaledCharHeight: number\n): WebglCharAtlas {\n const newConfig = generateConfig(scaledCellWidth, scaledCellHeight, scaledCharWidth, scaledCharHeight, terminal, colors);\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 newEntry: ICharAtlasCacheEntry = {\n atlas: new WebglCharAtlas(document, newConfig),\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 { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { Terminal, FontWeight } from 'xterm';\nimport { IColorSet, IColor } from 'browser/Types';\n\nconst NULL_COLOR: IColor = {\n css: '',\n rgba: 0\n};\n\nexport function generateConfig(scaledCellWidth: number, scaledCellHeight: number, scaledCharWidth: number, scaledCharHeight: number, terminal: Terminal, colors: IColorSet): 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 selectionTransparent: NULL_COLOR,\n selectionOpaque: 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 };\n return {\n customGlyphs: terminal.getOption('customGlyphs'),\n devicePixelRatio: window.devicePixelRatio,\n letterSpacing: terminal.getOption('letterSpacing'),\n lineHeight: terminal.getOption('lineHeight'),\n scaledCellWidth,\n scaledCellHeight,\n scaledCharWidth,\n scaledCharHeight,\n fontFamily: terminal.getOption('fontFamily'),\n fontSize: terminal.getOption('fontSize'),\n fontWeight: terminal.getOption('fontWeight') as FontWeight,\n fontWeightBold: terminal.getOption('fontWeightBold') as FontWeight,\n allowTransparency: terminal.getOption('allowTransparency'),\n drawBoldTextInBrightColors: terminal.getOption('drawBoldTextInBrightColors'),\n minimumContrastRatio: terminal.getOption('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.scaledCharWidth === b.scaledCharWidth &&\n a.scaledCharHeight === b.scaledCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground === b.colors.foreground &&\n a.colors.background === b.colors.background;\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 { ICharAtlasConfig } from './Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/atlas/Constants';\nimport { IRasterizedGlyph, IBoundingBox, IRasterizedGlyphSet } from '../Types';\nimport { DEFAULT_COLOR, Attributes } from 'common/buffer/Constants';\nimport { throwIfFalsy } from '../WebglUtils';\nimport { IColor } from 'browser/Types';\nimport { IDisposable } from 'xterm';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { channels, rgba } from 'browser/Color';\nimport { tryDrawCustomChar } from 'browser/renderer/CustomGlyphs';\n\n// In practice we're probably never going to exhaust a texture this large. For debugging purposes,\n// however, it can be useful to set this to a really tiny value, to verify that LRU eviction works.\nconst TEXTURE_WIDTH = 1024;\nconst TEXTURE_HEIGHT = 1024;\n\n/**\n * The amount of the texture to be filled before throwing it away and starting\n * again. Since the throw away and individual glyph draws don't cost too much,\n * this prevent juggling multiple textures in the GL context.\n */\nconst TEXTURE_CAPACITY = Math.floor(TEXTURE_HEIGHT * 0.8);\n\nconst TRANSPARENT_COLOR = {\n css: 'rgba(0, 0, 0, 0)',\n rgba: 0\n};\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n offset: { x: 0, y: 0 },\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { 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\nexport class WebglCharAtlas implements IDisposable {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: { [code: number]: IRasterizedGlyphSet } = {};\n private _cacheMapCombined: { [chars: string]: IRasterizedGlyphSet } = {};\n\n // The texture that the atlas is drawn to\n public cacheCanvas: HTMLCanvasElement;\n private _cacheCtx: CanvasRenderingContext2D;\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 // Since glyphs are expected to be around the same height, the packing\n // strategy used it to fill a row with glyphs while keeping track of the\n // tallest glyph in the row. Once the row is full a new row is started at\n // (0,lastRow+lastRowTallestGlyph).\n private _currentRowY: number = 0;\n private _currentRowX: number = 0;\n private _currentRowHeight: number = 0;\n\n public hasCanvasChanged = false;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n constructor(\n document: Document,\n private _config: ICharAtlasConfig\n ) {\n this.cacheCanvas = document.createElement('canvas');\n this.cacheCanvas.width = TEXTURE_WIDTH;\n this.cacheCanvas.height = TEXTURE_HEIGHT;\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._cacheCtx = throwIfFalsy(this.cacheCanvas.getContext('2d', { alpha: true }));\n\n this._tmpCanvas = document.createElement('canvas');\n this._tmpCanvas.width = this._config.scaledCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2;\n this._tmpCanvas.height = this._config.scaledCellHeight + TMP_CANVAS_GLYPH_PADDING * 2;\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', { alpha: this._config.allowTransparency }));\n }\n\n public dispose(): void {\n if (this.cacheCanvas.parentElement) {\n this.cacheCanvas.parentElement.removeChild(this.cacheCanvas);\n }\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\n for (let i = 33; i < 126; i++) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR);\n this._cacheMap[i] = {\n [DEFAULT_COLOR]: {\n [DEFAULT_COLOR]: rasterizedGlyph\n }\n };\n }\n }\n\n public beginFrame(): boolean {\n if (this._currentRowY > TEXTURE_CAPACITY) {\n this.clearTexture();\n this.warmUp();\n return true;\n }\n return false;\n }\n\n public clearTexture(): void {\n if (this._currentRowX === 0 && this._currentRowY === 0) {\n return;\n }\n this._cacheCtx.clearRect(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT);\n this._cacheMap = {};\n this._cacheMapCombined = {};\n this._currentRowHeight = 0;\n this._currentRowX = 0;\n this._currentRowY = 0;\n this._didWarmUp = false;\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number): IRasterizedGlyph {\n let rasterizedGlyphSet = this._cacheMapCombined[chars];\n if (!rasterizedGlyphSet) {\n rasterizedGlyphSet = {};\n this._cacheMapCombined[chars] = rasterizedGlyphSet;\n }\n let rasterizedGlyph: IRasterizedGlyph | undefined;\n const rasterizedGlyphSetBg = rasterizedGlyphSet[bg];\n if (rasterizedGlyphSetBg) {\n rasterizedGlyph = rasterizedGlyphSetBg[fg];\n }\n if (!rasterizedGlyph) {\n rasterizedGlyph = this._drawToCache(chars, bg, fg);\n if (!rasterizedGlyphSet[bg]) {\n rasterizedGlyphSet[bg] = {};\n }\n rasterizedGlyphSet[bg]![fg] = rasterizedGlyph;\n }\n return rasterizedGlyph;\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n public getRasterizedGlyph(code: number, bg: number, fg: number): IRasterizedGlyph {\n let rasterizedGlyphSet = this._cacheMap[code];\n if (!rasterizedGlyphSet) {\n rasterizedGlyphSet = {};\n this._cacheMap[code] = rasterizedGlyphSet;\n }\n let rasterizedGlyph: IRasterizedGlyph | undefined;\n const rasterizedGlyphSetBg = rasterizedGlyphSet[bg];\n if (rasterizedGlyphSetBg) {\n rasterizedGlyph = rasterizedGlyphSetBg[fg];\n }\n if (!rasterizedGlyph) {\n rasterizedGlyph = this._drawToCache(code, bg, fg);\n if (!rasterizedGlyphSet[bg]) {\n rasterizedGlyphSet[bg] = {};\n }\n rasterizedGlyphSet[bg]![fg] = rasterizedGlyph;\n }\n return rasterizedGlyph;\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): 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 TRANSPARENT_COLOR;\n }\n\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor);\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n // TODO: This object creation is slow\n return {\n rgba: bgColor << 8,\n css: `#${toPaddedHex(arr[0])}${toPaddedHex(arr[1])}${toPaddedHex(arr[2])}`\n };\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground;\n }\n return this._config.colors.background;\n }\n }\n\n private _getForegroundCss(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): string {\n const minimumContrastCss = this._getMinimumContrastCss(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold);\n if (minimumContrastCss) {\n return minimumContrastCss;\n }\n\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).css;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n return channels.toCss(arr[0], arr[1], arr[2]);\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n const bg = this._config.colors.background.css;\n if (bg.length === 9) {\n // Remove bg alpha channel if present\n return bg.substr(0, 7);\n }\n return bg;\n }\n return this._config.colors.foreground.css;\n }\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 _getMinimumContrastCss(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): string | undefined {\n if (this._config.minimumContrastRatio === 1) {\n return undefined;\n }\n\n // Try get from cache first\n const adjustedColor = this._config.colors.contrastCache.getCss(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 const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio);\n\n if (!result) {\n this._config.colors.contrastCache.setCss(bg, fg, null);\n return undefined;\n }\n\n const css = channels.toCss(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n this._config.colors.contrastCache.setCss(bg, fg, css);\n\n return css;\n }\n\n private _drawToCache(code: number, bg: number, fg: number): IRasterizedGlyph;\n private _drawToCache(chars: string, bg: number, fg: number): IRasterizedGlyph;\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n this.hasCanvasChanged = true;\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 = this._config.scaledCharWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2;\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\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 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);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha, regardless of\n // 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 this._tmpCtx.fillStyle = this._getForegroundCss(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold);\n\n // Apply alpha to dim the character\n if (dim) {\n this._tmpCtx.globalAlpha = DIM_OPACITY;\n }\n\n // Check if the char is a powerline glyph, these will be restricted to a single cell glyph, no\n // padding on either side that are allowed for other glyphs since they are designed to be pixel\n // perfect but may render with \"bad\" anti-aliasing\n let isPowerlineGlyph = false;\n if (chars.length === 1) {\n const code = chars.charCodeAt(0);\n if (code >= 0xE0A0 && code <= 0xE0D6) {\n isPowerlineGlyph = true;\n }\n }\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = isPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING;\n\n // Draw custom characters if applicable\n let drawSuccess = false;\n if (this._config.customGlyphs !== false) {\n drawSuccess = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.scaledCellWidth, this._config.scaledCellHeight);\n }\n\n // Draw the character\n if (!drawSuccess) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.scaledCharHeight);\n }\n\n // If this charcater is underscore and beyond the cell bounds, shift it up until it is visible,\n // try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.scaledCellWidth, this._config.scaledCellHeight), backgroundColor);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.clearRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.fillText(chars, padding, padding + this._config.scaledCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.scaledCellWidth, this._config.scaledCellHeight), backgroundColor);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw underline and strikethrough\n if (underline || strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize / 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 if (underline) {\n this._tmpCtx.moveTo(padding, padding + this._config.scaledCharHeight - yOffset);\n this._tmpCtx.lineTo(padding + this._config.scaledCharWidth, padding + this._config.scaledCharHeight - yOffset);\n }\n if (strikethrough) {\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.scaledCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.scaledCharWidth, padding + Math.floor(this._config.scaledCharHeight / 2) - yOffset);\n }\n this._tmpCtx.stroke();\n this._tmpCtx.closePath();\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 // TODO: Support transparency\n // let isEmpty = false;\n // if (!this._config.allowTransparency) {\n // isEmpty = clearColor(imageData, backgroundColor);\n // }\n\n // Clear out the background color and determine if the glyph is empty.\n const isEmpty = clearColor(imageData, backgroundColor);\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, isPowerlineGlyph, drawSuccess);\n const clippedImageData = this._clipImageData(imageData, this._workBoundingBox);\n\n // Check if there is enough room in the current row and go to next if needed\n if (this._currentRowX + this._config.scaledCharWidth > TEXTURE_WIDTH) {\n this._currentRowX = 0;\n this._currentRowY += this._currentRowHeight;\n this._currentRowHeight = 0;\n }\n\n // Record texture position\n rasterizedGlyph.texturePosition.x = this._currentRowX;\n rasterizedGlyph.texturePosition.y = this._currentRowY;\n rasterizedGlyph.texturePositionClipSpace.x = this._currentRowX / TEXTURE_WIDTH;\n rasterizedGlyph.texturePositionClipSpace.y = this._currentRowY / TEXTURE_HEIGHT;\n\n // Update atlas current row\n this._currentRowHeight = Math.max(this._currentRowHeight, rasterizedGlyph.size.y);\n this._currentRowX += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n this._cacheCtx.putImageData(clippedImageData, rasterizedGlyph.texturePosition.x, rasterizedGlyph.texturePosition.y);\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): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.scaledCharHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.scaledCharWidth : 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 < 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 = width - 1; x >= 0; 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 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) / TEXTURE_WIDTH,\n y: (boundingBox.bottom - boundingBox.top + 1) / TEXTURE_HEIGHT\n },\n offset: {\n x: -boundingBox.left + (restrictedGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING) + (customGlyph ? Math.floor(this._config.letterSpacing / 2) : 0),\n y: -boundingBox.top + (restrictedGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING) + (customGlyph ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.scaledCellHeight - this._config.scaledCharHeight) / 2) : 0)\n }\n };\n }\n\n private _clipImageData(imageData: ImageData, boundingBox: IBoundingBox): ImageData {\n const width = boundingBox.right - boundingBox.left + 1;\n const height = boundingBox.bottom - boundingBox.top + 1;\n const clippedData = new Uint8ClampedArray(width * height * 4);\n for (let y = boundingBox.top; y <= boundingBox.bottom; y++) {\n for (let x = boundingBox.left; x <= boundingBox.right; x++) {\n const oldOffset = y * this._tmpCanvas.width * 4 + x * 4;\n const newOffset = (y - boundingBox.top) * width * 4 + (x - boundingBox.left) * 4;\n clippedData[newOffset] = imageData.data[oldOffset];\n clippedData[newOffset + 1] = imageData.data[oldOffset + 1];\n clippedData[newOffset + 2] = imageData.data[oldOffset + 2];\n clippedData[newOffset + 3] = imageData.data[oldOffset + 3];\n }\n }\n return new ImageData(clippedData, width, height);\n }\n}\n\n/**\n * Makes a partiicular rgb color in an ImageData completely transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, color: IColor): boolean {\n let isEmpty = true;\n const r = color.rgba >>> 24;\n const g = color.rgba >>> 16 & 0xFF;\n const b = color.rgba >>> 8 & 0xFF;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\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 isEmpty = false;\n }\n }\n return isEmpty;\n}\n\nfunction toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderLayer } from './Types';\nimport { acquireCharAtlas } from '../atlas/CharAtlasCache';\nimport { Terminal } from 'xterm';\nimport { IColorSet } from 'browser/Types';\nimport { TEXT_BASELINE } from 'browser/renderer/atlas/Constants';\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { WebglCharAtlas } from 'atlas/WebglCharAtlas';\nimport { throwIfFalsy } from '../WebglUtils';\n\nexport abstract class BaseRenderLayer implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _scaledCharWidth: number = 0;\n private _scaledCharHeight: number = 0;\n private _scaledCellWidth: number = 0;\n private _scaledCellHeight: number = 0;\n private _scaledCharLeft: number = 0;\n private _scaledCharTop: number = 0;\n\n protected _charAtlas: WebglCharAtlas | undefined;\n\n constructor(\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected _colors: IColorSet\n ) {\n this._canvas = document.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 }\n\n public dispose(): void {\n this._container.removeChild(this._canvas);\n if (this._charAtlas) {\n this._charAtlas.dispose();\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 onOptionsChanged(terminal: Terminal): void {}\n public onBlur(terminal: Terminal): void {}\n public onFocus(terminal: Terminal): void {}\n public onCursorMove(terminal: Terminal): void {}\n public onGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public onSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n public setColors(terminal: Terminal, colorSet: IColorSet): void {\n this._refreshCharAtlas(terminal, colorSet);\n }\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._colors);\n this.onGridChanged(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: IColorSet): void {\n if (this._scaledCharWidth <= 0 && this._scaledCharHeight <= 0) {\n return;\n }\n this._charAtlas = acquireCharAtlas(terminal, colorSet, this._scaledCellWidth, this._scaledCellHeight, this._scaledCharWidth, this._scaledCharHeight);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._scaledCellWidth = dim.scaledCellWidth;\n this._scaledCellHeight = dim.scaledCellHeight;\n this._scaledCharWidth = dim.scaledCharWidth;\n this._scaledCharHeight = dim.scaledCharHeight;\n this._scaledCharLeft = dim.scaledCharLeft;\n this._scaledCharTop = dim.scaledCharTop;\n this._canvas.width = dim.scaledCanvasWidth;\n this._canvas.height = dim.scaledCanvasHeight;\n this._canvas.style.width = `${dim.canvasWidth}px`;\n this._canvas.style.height = `${dim.canvasHeight}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._colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills 1+ cells completely. This uses the existing fillStyle on the context.\n * @param x The column to start at.\n * @param y The row to start at\n * @param width The number of columns to fill.\n * @param height The number of rows to fill.\n */\n protected _fillCells(x: number, y: number, width: number, height: number): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n }\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._scaledCellWidth,\n (y + 1) * this._scaledCellHeight - window.devicePixelRatio - 1 /* Ensure it's drawn within the cell */,\n width * this._scaledCellWidth,\n window.devicePixelRatio);\n }\n\n /**\n * Fills a 1px line (2px on HDPI) at the left 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 _fillLeftLineAtCell(x: number, y: number, width: number): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n window.devicePixelRatio * width,\n this._scaledCellHeight);\n }\n\n /**\n * Strokes a 1px rectangle (2px on HDPI) around a cell. This uses the existing\n * strokeStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _strokeRectAtCell(x: number, y: number, width: number, height: number): void {\n this._ctx.lineWidth = window.devicePixelRatio;\n this._ctx.strokeRect(\n x * this._scaledCellWidth + window.devicePixelRatio / 2,\n y * this._scaledCellHeight + (window.devicePixelRatio / 2),\n width * this._scaledCellWidth - window.devicePixelRatio,\n (height * this._scaledCellHeight) - window.devicePixelRatio);\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._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._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n } else {\n this._ctx.fillStyle = this._colors.background.css;\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\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 * @param color The color of the character.\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._clipRow(terminal, y);\n this._ctx.fillText(\n cell.getChars(),\n x * this._scaledCellWidth + this._scaledCharLeft,\n y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight);\n }\n\n /**\n * Clips a row to ensure no pixels will be drawn outside the cells in the row.\n * @param terminal The terminal.\n * @param y The row to clip.\n */\n private _clipRow(terminal: Terminal, y: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n 0,\n y * this._scaledCellHeight,\n terminal.cols * this._scaledCellWidth,\n this._scaledCellHeight);\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.getOption('fontWeightBold') : terminal.getOption('fontWeight');\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.getOption('fontSize') * window.devicePixelRatio}px ${terminal.getOption('fontFamily')}`;\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal } from 'xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\nimport { ICellData } from 'common/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IColorSet, ITerminal } from 'browser/Types';\nimport { IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { IEventEmitter } from 'common/EventEmitter';\n\ninterface ICursorState {\n x: number;\n y: number;\n isFocused: boolean;\n style: string;\n width: number;\n}\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorRenderLayer extends BaseRenderLayer {\n private _state: ICursorState;\n private _cursorRenderers: {[key: string]: (terminal: Terminal, x: number, y: number, cell: ICellData) => void};\n private _cursorBlinkStateManager: CursorBlinkStateManager | undefined;\n private _cell: ICellData = new CellData();\n\n constructor(\n terminal: Terminal,\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n private readonly _terminal: ITerminal,\n private _onRequestRefreshRowsEvent: IEventEmitter\n ) {\n super(container, 'cursor', zIndex, true, colors);\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n this._cursorRenderers = {\n 'bar': this._renderBarCursor.bind(this),\n 'block': this._renderBlockCursor.bind(this),\n 'underline': this._renderUnderlineCursor.bind(this)\n };\n this.onOptionsChanged(terminal);\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 = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n }\n\n public reset(terminal: Terminal): void {\n this._clearCursor();\n this._cursorBlinkStateManager?.restartBlinkAnimation(terminal);\n this.onOptionsChanged(terminal);\n }\n\n public onBlur(terminal: Terminal): void {\n this._cursorBlinkStateManager?.pause();\n this._onRequestRefreshRowsEvent.fire({ start: terminal.buffer.active.cursorY, end: terminal.buffer.active.cursorY });\n }\n\n public onFocus(terminal: Terminal): void {\n this._cursorBlinkStateManager?.resume(terminal);\n this._onRequestRefreshRowsEvent.fire({ start: terminal.buffer.active.cursorY, end: terminal.buffer.active.cursorY });\n }\n\n public onOptionsChanged(terminal: Terminal): void {\n if (terminal.getOption('cursorBlink')) {\n if (!this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager = new CursorBlinkStateManager(terminal, () => {\n this._render(terminal, true);\n });\n }\n } else {\n this._cursorBlinkStateManager?.dispose();\n this._cursorBlinkStateManager = undefined;\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._onRequestRefreshRowsEvent.fire({ start: terminal.buffer.active.cursorY, end: terminal.buffer.active.cursorY });\n }\n\n public onCursorMove(terminal: Terminal): void {\n this._cursorBlinkStateManager?.restartBlinkAnimation(terminal);\n }\n\n public onGridChanged(terminal: Terminal, startRow: number, endRow: number): void {\n if (!this._cursorBlinkStateManager || this._cursorBlinkStateManager.isPaused) {\n this._render(terminal, false);\n } else {\n this._cursorBlinkStateManager.restartBlinkAnimation(terminal);\n }\n }\n\n private _render(terminal: Terminal, triggeredByAnimationFrame: boolean): void {\n // Don't draw the cursor if it's hidden\n // TODO: Need to expose API for this\n if (!this._terminal.coreService.isCursorInitialized || this._terminal.coreService.isCursorHidden) {\n this._clearCursor();\n return;\n }\n\n const cursorY = terminal.buffer.active.baseY + terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.active.viewportY;\n\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(terminal.buffer.active.cursorX, terminal.cols - 1);\n\n // Don't draw the cursor if it's off-screen\n if (viewportRelativeCursorY < 0 || viewportRelativeCursorY >= terminal.rows) {\n this._clearCursor();\n return;\n }\n\n // TODO: Need fast buffer API for loading cell\n (terminal as any)._core.buffer.lines.get(cursorY).loadCell(cursorX, this._cell);\n if (this._cell.content === undefined) {\n return;\n }\n\n if (!isTerminalFocused(terminal)) {\n this._clearCursor();\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n const cursorStyle = terminal.getOption('cursorStyle');\n if (cursorStyle && cursorStyle !== 'block') {\n this._cursorRenderers[cursorStyle](terminal, cursorX, viewportRelativeCursorY, this._cell);\n } else {\n this._renderBlurCursor(terminal, cursorX, viewportRelativeCursorY, this._cell);\n }\n this._ctx.restore();\n this._state.x = cursorX;\n this._state.y = viewportRelativeCursorY;\n this._state.isFocused = false;\n this._state.style = cursorStyle;\n this._state.width = this._cell.getWidth();\n return;\n }\n\n // Don't draw the cursor if it's blinking\n if (this._cursorBlinkStateManager && !this._cursorBlinkStateManager.isCursorVisible) {\n this._clearCursor();\n return;\n }\n\n if (this._state) {\n // The cursor is already in the correct spot, don't redraw\n if (this._state.x === cursorX &&\n this._state.y === viewportRelativeCursorY &&\n this._state.isFocused === isTerminalFocused(terminal) &&\n this._state.style === terminal.getOption('cursorStyle') &&\n this._state.width === this._cell.getWidth()) {\n return;\n }\n this._clearCursor();\n }\n\n this._ctx.save();\n this._cursorRenderers[terminal.getOption('cursorStyle') || 'block'](terminal, cursorX, viewportRelativeCursorY, this._cell);\n this._ctx.restore();\n\n this._state.x = cursorX;\n this._state.y = viewportRelativeCursorY;\n this._state.isFocused = false;\n this._state.style = terminal.getOption('cursorStyle');\n this._state.width = this._cell.getWidth();\n }\n\n private _clearCursor(): void {\n if (this._state) {\n // Avoid potential rounding errors when device pixel ratio is less than 1\n if (window.devicePixelRatio < 1) {\n this._clearAll();\n } else {\n this._clearCells(this._state.x, this._state.y, this._state.width, 1);\n }\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n }\n }\n\n private _renderBarCursor(terminal: Terminal, x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillLeftLineAtCell(x, y, terminal.getOption('cursorWidth'));\n this._ctx.restore();\n }\n\n private _renderBlockCursor(terminal: Terminal, x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillCells(x, y, cell.getWidth(), 1);\n this._ctx.fillStyle = this._colors.cursorAccent.css;\n this._fillCharTrueColor(terminal, cell, x, y);\n this._ctx.restore();\n }\n\n private _renderUnderlineCursor(terminal: Terminal, x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillBottomLineAtCells(x, y);\n this._ctx.restore();\n }\n\n private _renderBlurCursor(terminal: Terminal, x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.strokeStyle = this._colors.cursor.css;\n this._strokeRectAtCell(x, y, cell.getWidth(), 1);\n this._ctx.restore();\n }\n}\n\nclass 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 terminal: Terminal,\n private _renderCallback: () => void\n ) {\n this.isCursorVisible = true;\n if (isTerminalFocused(terminal)) {\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 window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public restartBlinkAnimation(terminal: Terminal): 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 = 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 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 = 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 = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = 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 = 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 window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public resume(terminal: Terminal): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this.restartBlinkAnimation(terminal);\n }\n}\n\nfunction isTerminalFocused(terminal: Terminal): boolean {\n return document.activeElement === terminal.textarea && document.hasFocus();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal } from 'xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { is256Color } from '../atlas/CharAtlasUtils';\nimport { ITerminal, IColorSet, ILinkifierEvent } from 'browser/Types';\nimport { IRenderDimensions } from 'browser/renderer/Types';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(container: HTMLElement, zIndex: number, colors: IColorSet, terminal: ITerminal) {\n super(container, 'link', zIndex, true, colors);\n terminal.linkifier.onShowLinkUnderline(e => this._onShowLinkUnderline(e));\n terminal.linkifier.onHideLinkUnderline(e => this._onHideLinkUnderline(e));\n\n terminal.linkifier2.onShowLinkUnderline(e => this._onShowLinkUnderline(e));\n terminal.linkifier2.onHideLinkUnderline(e => this._onHideLinkUnderline(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 _onShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._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 _onHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from 'browser/Types';\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 // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\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 const 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 const r = bgR + Math.round((fgR - bgR) * a);\n const g = bgG + Math.round((fgG - bgG) * a);\n const 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 rgba.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 const [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 const a = Math.round(opacity * 0xFF);\n const [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\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb', '#rrggbbaa').\n */\nexport namespace css {\n export function toColor(css: string): IColor {\n switch (css.length) {\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 throw new Error('css.toColor: Unsupported css format');\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 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 return reduceLuminance(bgRgba, fgRgba, ratio);\n }\n return increaseLuminance(bgRgba, fgRgba, ratio);\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, fgB, fgG), 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, fgB, fgG), 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, fgB, fgG), 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, fgB, fgG), 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 export function toColor(r: number, g: number, b: number): IColor {\n return {\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n };\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) 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 type The event type.\n * @param handler The handler for the 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) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/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 '▀': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n '▁': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n '▂': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n '▃': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n '▄': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n '▅': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n '▆': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n '▇': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n '█': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n '▉': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n '▊': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n '▋': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n '▌': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n '▍': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n '▎': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n '▏': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n '▐': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n // Block elements (0x2594-0x2595)\n '▔': [{ x: 0, y: 0, w: 9, h: 1 }], // UPPER ONE EIGHTH BLOCK\n '▕': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (0x2596-0x259F)\n '▖': [{ x: 0, y: 4, w: 4, h: 4 }], // QUADRANT LOWER LEFT\n '▗': [{ x: 4, y: 4, w: 4, h: 4 }], // QUADRANT LOWER RIGHT\n '▘': [{ x: 0, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT\n '▙': [{ 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 '▚': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n '▛': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '▜': [{ 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 '▝': [{ x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER RIGHT\n '▞': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n '▟': [{ 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 '░': [ // 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 '▒': [ // MEDIUM SHADE (50%)\n [1, 0],\n [0, 0],\n [0, 1],\n [0, 0]\n ],\n '▓': [ // DARK SHADE (75%)\n [0, 1],\n [1, 1],\n [1, 0],\n [1, 1]\n ]\n};\n\nconst enum Shapes {\n /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** ┄ */ 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 /** ┉ */ 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 /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** ┊ */ 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 * 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 | ((xp: number, yp: number) => string) } | undefined } = {\n // Uniform normal and bold\n '─': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n '━': { [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '│': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n '┃': { [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '┌': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n '┏': { [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '┐': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n '┓': { [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '└': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n '┗': { [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '┘': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n '┛': { [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '├': { [Style.NORMAL]: Shapes.T_RIGHT },\n '┣': { [Style.BOLD]: Shapes.T_RIGHT },\n '┤': { [Style.NORMAL]: Shapes.T_LEFT },\n '┫': { [Style.BOLD]: Shapes.T_LEFT },\n '┬': { [Style.NORMAL]: Shapes.T_BOTTOM },\n '┳': { [Style.BOLD]: Shapes.T_BOTTOM },\n '┴': { [Style.NORMAL]: Shapes.T_TOP },\n '┻': { [Style.BOLD]: Shapes.T_TOP },\n '┼': { [Style.NORMAL]: Shapes.CROSS },\n '╋': { [Style.BOLD]: Shapes.CROSS },\n '╴': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n '╸': { [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '╵': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n '╹': { [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '╶': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n '╺': { [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '╷': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n '╻': { [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n\n // Double border\n '═': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '║': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '╒': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '╓': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n '╔': { [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 '╕': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n '╖': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n '╗': { [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 '╘': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n '╙': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '╚': { [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 '╛': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n '╜': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n '╝': { [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 '╞': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '╟': { [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 '╠': { [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 '╡': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n '╢': { [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 '╣': { [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 '╤': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n '╥': { [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 '╦': { [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 '╧': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '╨': { [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 '╩': { [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 '╪': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '╫': { [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 '╬': { [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 '╱': { [Style.NORMAL]: 'M1,0 L0,1' },\n '╲': { [Style.NORMAL]: 'M0,0 L1,1' },\n '╳': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n // Mixed weight\n '╼': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '╽': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '╾': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '╿': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┍': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┎': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┑': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┒': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┕': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┖': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┙': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┚': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┝': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┞': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┟': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┠': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '┡': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '┢': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '┥': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┦': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┧': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┨': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '┩': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '┪': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '┭': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┮': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┯': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '┰': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┱': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '┲': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '┵': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┶': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┷': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '┸': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┹': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '┺': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '┽': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┾': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┿': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '╀': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '╁': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '╂': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '╃': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '╄': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '╅': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '╆': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '╇': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n '╈': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n '╉': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n '╊': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n // Dashed\n '╌': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n '╍': { [Style.BOLD]: Shapes.TWO_DASHES_HORIZONTAL },\n '┄': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n '┅': { [Style.BOLD]: Shapes.THREE_DASHES_HORIZONTAL },\n '┈': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n '┉': { [Style.BOLD]: Shapes.FOUR_DASHES_HORIZONTAL },\n '╎': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n '╏': { [Style.BOLD]: Shapes.TWO_DASHES_VERTICAL },\n '┆': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL },\n '┇': { [Style.BOLD]: Shapes.THREE_DASHES_VERTICAL },\n '┊': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n '┋': { [Style.BOLD]: Shapes.FOUR_DASHES_VERTICAL },\n\n // Curved\n '╭': { [Style.NORMAL]: 'C.5,1,.5,.5,1,.5' },\n '╮': { [Style.NORMAL]: 'C.5,1,.5,.5,0,.5' },\n '╯': { [Style.NORMAL]: 'C.5,0,.5,.5,0,.5' },\n '╰': { [Style.NORMAL]: 'C.5,0,.5,.5,1,.5' }\n};\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 scaledCellWidth: number,\n scaledCellHeight: number\n): boolean {\n const blockElementDefinition = blockElementDefinitions[c];\n if (blockElementDefinition) {\n drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n return true;\n }\n\n const patternDefinition = patternCharacterDefinitions[c];\n if (patternDefinition) {\n drawPatternChar(ctx, patternDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n return true;\n }\n\n const boxDrawingDefinition = boxDrawingDefinitions[c];\n if (boxDrawingDefinition) {\n drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\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 scaledCellWidth: number,\n scaledCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = scaledCellWidth / 8;\n const yEighth = scaledCellHeight / 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> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n scaledCellWidth: number,\n scaledCellHeight: 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 = document.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.substr(1, 2), 16);\n g = parseInt(fillStyle.substr(3, 2), 16);\n b = parseInt(fillStyle.substr(5, 2), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.substr(7, 2), 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, scaledCellWidth, scaledCellHeight);\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: ┎┰┒┍┯┑╓╥╖╒╤╕ ┏┳┓┌┲┓┌┬┐┏┱┐\n * ┌─┬─┐ ┏━┳━┓ ╔═╦═╗ ┠╂┨┝┿┥╟╫╢╞╪╡ ┡╇┩├╊┫┢╈┪┣╉┤\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┖┸┚┕┷┙╙╨╜╘╧╛ └┴┘└┺┛┗┻┛┗┹┘\n * ├─┼─┤ ┣━╋━┫ ╠═╬═╣ ┏┱┐┌┲┓┌┬┐┌┬┐ ┏┳┓┌┮┓┌┬┐┏┭┐\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┡╃┤├╄┩├╆┪┢╅┤ ┞╀┦├┾┫┟╁┧┣┽┤\n * └─┴─┘ ┗━┻━┛ ╚═╩═╝ └┴┘└┴┘└┺┛┗┹┘ └┴┘└┶┛┗┻┛┗┵┘\n *\n * Other:\n * ╭─╮ ╲ ╱ ╷╻╎╏┆┇┊┋ ╺╾╴ ╌╌╌ ┄┄┄ ┈┈┈\n * │ │ ╳ ╽╿╎╏┆┇┊┋ ╶╼╸ ╍╍╍ ┅┅┅ ┉┉┉\n * ╰─╯ ╱ ╲ ╹╵╎╏┆┇┊┋\n *\n * All box drawing characters:\n * ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n * ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n * ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n * ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n * ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n * ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n * ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n * ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n *\n * ---\n *\n * Box drawing alignment tests: █\n * ▉\n * ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳\n * ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳\n * ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳\n * ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳\n * ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎\n * ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏\n * ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█\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 scaledCellWidth: number,\n scaledCellHeight: number\n): void {\n ctx.strokeStyle = ctx.fillStyle;\n for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n ctx.beginPath();\n ctx.lineWidth = window.devicePixelRatio * Number.parseInt(fontWeight);\n let actualInstructions: string;\n if (typeof instructions === 'function') {\n const xp = .15;\n const yp = .15 / scaledCellHeight * scaledCellWidth;\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, scaledCellWidth, scaledCellHeight, xOffset, yOffset));\n }\n ctx.stroke();\n ctx.closePath();\n }\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): 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;\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 (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;\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 (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) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox would\n// 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 ? 'bottom' : 'ideographic';\n\nexport const CHAR_ATLAS_CELL_SPACING = 1;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter {\n event: IEvent;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter implements IEventEmitter {\n private _listeners: IListener[] = [];\n private _event?: IEvent;\n private _disposed: boolean = false;\n\n public get event(): IEvent {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.push(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\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[] = [];\n for (let i = 0; i < this._listeners.length; i++) {\n queue.push(this._listeners[i]);\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 if (this._listeners) {\n this._listeners.length = 0;\n }\n this._disposed = true;\n }\n}\n\nexport function forwardEvent(from: IEvent, to: IEventEmitter): IDisposable {\n return from(e => to.fire(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 constructor() {\n }\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(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(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\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;\n\nconst isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\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","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport type TypedArray = Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array;\n\n\n/**\n * polyfill for TypedArray.fill\n * This is needed to support .fill in all safari versions and IE 11.\n */\nexport function fill(array: T, value: number, start?: number, end?: number): T {\n // all modern engines that support .fill\n if (array.fill) {\n return array.fill(value, start, end) as T;\n }\n return fillFallback(array, value, start, end);\n}\n\nexport function fillFallback(array: T, value: number, start: number = 0, end: number = array.length): T {\n // safari and IE 11\n // since IE 11 does not support Array.prototype.fill either\n // we cannot use the suggested polyfill from MDN\n // instead we simply fall back to looping\n if (start >= array.length) {\n return array;\n }\n start = (array.length + start) % array.length;\n if (end >= array.length) {\n end = array.length;\n } else {\n end = (array.length + end) % array.length;\n }\n for (let i = start; i < end; ++i) {\n array[i] = value;\n }\n return array;\n}\n\n/**\n * Concat two typed arrays `a` and `b`.\n * Returns a new typed array.\n */\nexport function concat(a: T, b: T): T {\n const result = new (a.constructor as any)(a.length + b.length);\n result.set(a);\n result.set(b, a.length);\n return result;\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 } 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 = 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 { return this.fg & FgFlags.UNDERLINE; }\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\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}\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 constructor(\n // underline style, NONE is empty\n public underlineStyle: UnderlineStyle = UnderlineStyle.NONE,\n // underline color, -1 is empty (same as FG)\n public underlineColor: number = -1\n ) {}\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this.underlineStyle, this.underlineColor);\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;\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) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 256;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 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 3 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000\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\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 pair\n // 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","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal, ITerminalAddon, IEvent } from 'xterm';\nimport { WebglRenderer } from './WebglRenderer';\nimport { ICharacterJoinerService, IRenderService } from 'browser/services/Services';\nimport { IColorSet } from 'browser/Types';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { isSafari } from 'common/Platform';\n\nexport class WebglAddon implements ITerminalAddon {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n private _onContextLoss = new EventEmitter();\n public get onContextLoss(): IEvent { return this._onContextLoss.event; }\n\n constructor(\n private _preserveDrawingBuffer?: boolean\n ) {}\n\n public activate(terminal: Terminal): void {\n if (!terminal.element) {\n throw new Error('Cannot activate WebglAddon before Terminal.open');\n }\n if (isSafari) {\n throw new Error('Webgl is not currently supported on Safari');\n }\n this._terminal = terminal;\n const renderService: IRenderService = (terminal as any)._core._renderService;\n const characterJoinerService: ICharacterJoinerService = (terminal as any)._core._characterJoinerService;\n const colors: IColorSet = (terminal as any)._core._colorManager.colors;\n this._renderer = new WebglRenderer(terminal, colors, characterJoinerService, this._preserveDrawingBuffer);\n this._renderer.onContextLoss(() => this._onContextLoss.fire());\n renderService.setRenderer(this._renderer);\n }\n\n public dispose(): void {\n if (!this._terminal) {\n throw new Error('Cannot dispose WebglAddon because it is activated');\n }\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.onResize(this._terminal.cols, this._terminal.rows);\n this._renderer = undefined;\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearCharAtlas();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","INDICES_PER_CELL","BYTES_PER_CELL","Float32Array","BYTES_PER_ELEMENT","_terminal","_colors","_gl","_dimensions","_activeBuffer","_vertices","count","attributes","attributesBuffers","selectionAttributes","gl","this","program","throwIfFalsy","createProgram","_program","_projectionLocation","getUniformLocation","_resolutionLocation","_textureLocation","_vertexArrayObject","createVertexArray","bindVertexArray","unitQuadVertices","unitQuadVerticesBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","unitQuadElementIndices","Uint8Array","elementIndicesBuffer","ELEMENT_ARRAY_BUFFER","_attributesBuffer","vertexAttribDivisor","_atlasTexture","createTexture","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","onResize","beginFrame","_atlas","updateCell","x","y","code","bg","fg","chars","_updateCell","array","rasterizedGlyph","i","cols","NULL_CELL_CODE","undefined","length","getRasterizedGlyphCombinedChar","getRasterizedGlyph","offset","scaledCharLeft","scaledCharTop","size","scaledCanvasWidth","scaledCanvasHeight","texturePositionClipSpace","sizeClipSpace","fill","updateSelection","model","terminal","slice","selectionOpaque","rgba","selection","columnSelectMode","startCol","width","endCol","height","viewportCappedEndRow","viewportCappedStartRow","_updateSelectionRange","viewportStartRow","startRowEndCol","middleRowsCount","Math","max","viewportEndRow","line","row","buffer","active","viewportY","RENDER_MODEL_INDICIES_PER_CELL","cells","RENDER_MODEL_FG_OFFSET","workCell","AttributeData","RENDER_MODEL_BG_OFFSET","getBgColorMode","c","_getColorFromAnsiIndex","getBgColor","arr","toColorRGB","c2","background","COMBINED_CHAR_BIT_MASK","getLine","getCell","getChars","idx","ansi","Error","viewport","canvas","newCount","rows","setColors","render","renderModel","isSelectionVisible","useProgram","activeBuffer","bufferLength","lineLengths","si","sub","subarray","set","STREAM_DRAW","hasCanvasChanged","uniform1i","activeTexture","TEXTURE0","cacheCanvas","generateMipmap","uniformMatrix4fv","PROJECTION_MATRIX","uniform2f","drawElementsInstanced","TRIANGLES","setAtlas","atlas","setDimensions","dimensions","GlyphRenderer","BYTES_PER_RECTANGLE","_updateCachedColors","DYNAMIC_DRAW","_updateViewportRectangle","_bgFloat","_colorToFloat32Array","_selectionFloat","_addRectangleFloat","scaledCellWidth","scaledCellHeight","hasSelection","INDICES_PER_RECTANGLE","updateBackgrounds","vertices","rectangleCount","currentStartX","currentBg","currentFg","currentInverse","modelIndex","inverse","_updateRectangle","startX","endX","foreground","expandFloat32Array","x1","y1","r","g","b","_addRectangle","a","color","RectangleRenderer","Uint32Array","resize","indexCount","clear","clearSelection","RenderModel","sliceFallback","start","end","min","result","constructor","_characterJoinerService","preserveDrawingBuffer","_model","_workCell","CellData","_onRequestRedraw","EventEmitter","_onContextLoss","_core","_renderLayers","LinkRenderLayer","screenElement","CursorRenderLayer","scaledCharWidth","scaledCharHeight","canvasWidth","canvasHeight","actualCellWidth","actualCellHeight","_devicePixelRatio","window","devicePixelRatio","_updateDimensions","_canvas","document","createElement","contextAttributes","antialias","depth","getContext","register","addDisposableDomListener","e","fire","appendChild","_rectangleRenderer","_glyphRenderer","onCharSizeChanged","_isAttached","body","contains","event","dispose","parentElement","removeChild","_charAtlas","colors","l","reset","_refreshCharAtlas","onDevicePixelRatioChange","style","onBlur","onFocus","onSelectionChanged","_updateSelectionModel","onCursorMove","onOptionsChanged","acquireCharAtlas","warmUp","clearCharAtlas","clearTexture","_updateModel","registerCharacterJoiner","handler","deregisterCharacterJoiner","joinerId","renderRows","_charSizeService","onGridChanged","cell","ydisp","lines","get","joinedRanges","getJoinedCharacters","loadCell","isJoined","lastCharX","range","shift","JoinedCellData","translateToString","getCode","j","NULL_CELL_CHAR","floor","ceil","getOption","round","Disposable","WebglRenderer","firstCell","content","combinedData","_width","isCombined","getWidth","setFromCharData","value","getAsCharData","createShader","type","source","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","deleteShader","vertexSource","fragmentSource","attachShader","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","deleteProgram","newLength","newArray","charAtlasCache","newConfig","generateConfig","ownedByIndex","entry","ownedBy","indexOf","configEquals","config","splice","push","newEntry","WebglCharAtlas","index","NULL_COLOR","css","clonedColors","cursor","cursorAccent","selectionTransparent","contrastCache","customGlyphs","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","allowTransparency","drawBoldTextInBrightColors","minimumContrastRatio","colorCode","TEXTURE_WIDTH","TEXTURE_HEIGHT","TEXTURE_CAPACITY","TRANSPARENT_COLOR","NULL_RASTERIZED_GLYPH","texturePosition","_config","_didWarmUp","_cacheMap","_cacheMapCombined","_currentRowY","_currentRowX","_currentRowHeight","_workBoundingBox","top","left","bottom","right","_workAttributeData","_cacheCtx","alpha","_tmpCanvas","TMP_CANVAS_GLYPH_PADDING","_tmpCtx","_doWarmUp","_drawToCache","DEFAULT_COLOR","clearRect","rasterizedGlyphSet","rasterizedGlyphSetBg","_getBackgroundColor","bgColorMode","bgColor","toPaddedHex","_getForegroundCss","fgColorMode","fgColor","bold","minimumContrastCss","_getMinimumContrastCss","channels","toCss","substr","_resolveBackgroundRgba","_resolveForegroundRgba","adjustedColor","getCss","bgRgba","fgRgba","ensureContrastRatio","setCss","codeOrChars","String","fromCharCode","allowedWidth","save","isInvisible","isBold","isInverse","dim","isDim","italic","isItalic","underline","isUnderline","strikethrough","isStrikethrough","getFgColor","getFgColorMode","temp","temp2","backgroundColor","globalCompositeOperation","fillStyle","fillRect","fontStyle","font","textBaseline","TEXT_BASELINE","globalAlpha","DIM_OPACITY","isPowerlineGlyph","charCodeAt","padding","drawSuccess","tryDrawCustomChar","fillText","isBeyondCellBounds","clearColor","getImageData","lineWidth","yOffset","strokeStyle","beginPath","moveTo","lineTo","stroke","closePath","restore","imageData","_findGlyphBoundingBox","clippedImageData","_clipImageData","putImageData","boundingBox","restrictedGlyph","customGlyph","found","alphaOffset","data","clippedData","Uint8ClampedArray","oldOffset","newOffset","ImageData","isEmpty","s","toString","_container","id","zIndex","_alpha","_scaledCharWidth","_scaledCharHeight","_scaledCellWidth","_scaledCellHeight","_scaledCharLeft","_scaledCharTop","classList","add","_initCanvas","_ctx","_clearAll","startRow","endRow","colorSet","_setTransparency","oldCanvas","cloneNode","replaceChild","_fillCells","_fillBottomLineAtCells","_fillLeftLineAtCell","_strokeRectAtCell","strokeRect","_clearCells","_fillCharTrueColor","_getFont","_clipRow","rect","clip","BaseRenderLayer","BLINK_INTERVAL","container","_onRequestRefreshRowsEvent","_cell","_state","isFocused","_cursorRenderers","_renderBarCursor","bind","_renderBlockCursor","_renderUnderlineCursor","_clearCursor","_cursorBlinkStateManager","restartBlinkAnimation","pause","cursorY","resume","CursorBlinkStateManager","_render","isPaused","triggeredByAnimationFrame","coreService","isCursorInitialized","isCursorHidden","baseY","viewportRelativeCursorY","cursorX","isTerminalFocused","cursorStyle","_renderBlurCursor","isCursorVisible","_renderCallback","_restartInterval","_blinkStartTimeout","_blinkInterval","clearInterval","clearTimeout","_animationFrame","cancelAnimationFrame","_animationTimeRestarted","Date","now","requestAnimationFrame","timeToStart","setTimeout","time","setInterval","activeElement","textarea","hasFocus","linkifier","onShowLinkUnderline","_onShowLinkUnderline","onHideLinkUnderline","_onHideLinkUnderline","linkifier2","_clearCurrentLink","middleRowCount","y2","x2","INVERTED_DEFAULT_COLOR","is256Color","rgb","contrastRatio","l1","l2","toRgba","blend","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ratio","toColor","opaque","rgbaColor","toChannels","opacity","parseInt","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","cr","increaseLuminance","bgL","fgL","node","options","addEventListener","disposed","removeEventListener","blockElementDefinitions","w","h","patternCharacterDefinitions","boxDrawingDefinitions","xp","yp","ctx","xOffset","blockElementDefinition","charDefinition","box","xEighth","yEighth","drawBlockElementChar","patternDefinition","patternSet","cachedPatterns","Map","pattern","tmpCanvas","tmpCtx","startsWith","substring","split","map","parseFloat","createPattern","drawPatternChar","boxDrawingDefinition","Object","entries","instructions","Number","instruction","f","svgToCanvasInstructionMap","args","translateArgs","drawBoxDrawingChar","clamp","bezierCurveTo","cellWidth","cellHeight","isFirefox","CHAR_ATLAS_CELL_SPACING","_listeners","_disposed","_event","listener","arg1","arg2","queue","call","from","to","_disposables","_isDisposed","d","unregister","disposeArray","disposables","isNode","navigator","userAgent","platform","includes","isSafari","test","isMac","isIpad","isIphone","isWindows","isLinux","fillFallback","extended","ExtendedAttrs","fromColorRGB","clone","newObj","isBlink","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","hasExtendedAttrs","updateExtended","getUnderlineColor","underlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","underlineStyle","fromCharData","obj","stringFromCodePoint","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","second","CHAR_DATA_WIDTH_INDEX","DEFAULT_ATTR","CHAR_DATA_CODE_INDEX","NULL_CELL_WIDTH","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","codepoint","_interim","decode","input","target","startPos","StringToUtf32","interim","byte1","byte2","byte3","byte4","discardInterim","cp","pos","tmp","missing","fourStop","Utf8ToUtf32","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","_preserveDrawingBuffer","activate","element","renderService","_renderService","characterJoinerService","_colorManager","_renderer","onContextLoss","setRenderer","_createRenderer","textureAtlas","clearTextureAtlas","WebglAddon"],"sourceRoot":""}