xterm-addon-webgl
Advanced tools
Comparing version 0.12.0-beta.29 to 0.12.0-beta.30
{ | ||
"name": "xterm-addon-webgl", | ||
"version": "0.12.0-beta.29", | ||
"version": "0.12.0-beta.30", | ||
"author": { | ||
@@ -5,0 +5,0 @@ "name": "The xterm.js authors", |
@@ -9,3 +9,4 @@ /** | ||
import { Terminal, FontWeight } from 'xterm'; | ||
import { IColorSet, IColor } from 'browser/Types'; | ||
import { IColorSet } from 'browser/Types'; | ||
import { IColor } from 'common/Types'; | ||
@@ -12,0 +13,0 @@ const NULL_COLOR: IColor = { |
@@ -11,6 +11,6 @@ /** | ||
import { throwIfFalsy } from '../WebglUtils'; | ||
import { IColor } from 'browser/Types'; | ||
import { IColor } from 'common/Types'; | ||
import { IDisposable } from 'xterm'; | ||
import { AttributeData } from 'common/buffer/AttributeData'; | ||
import { channels, rgba } from 'browser/Color'; | ||
import { channels, rgba } from 'common/Color'; | ||
import { tryDrawCustomChar } from 'browser/renderer/CustomGlyphs'; | ||
@@ -17,0 +17,0 @@ import { isPowerlineGlyph } from 'browser/renderer/RendererUtils'; |
@@ -12,5 +12,6 @@ /** | ||
import { slice } from './TypedArray'; | ||
import { NULL_CELL_CODE, WHITESPACE_CELL_CODE, Attributes, FgFlags } from 'common/buffer/Constants'; | ||
import { NULL_CELL_CODE, Attributes, FgFlags } from 'common/buffer/Constants'; | ||
import { Terminal, IBufferLine } from 'xterm'; | ||
import { IColorSet, IColor } from 'browser/Types'; | ||
import { IColor } from 'common/Types'; | ||
import { IColorSet } from 'browser/Types'; | ||
import { IRenderDimensions } from 'browser/renderer/Types'; | ||
@@ -191,2 +192,4 @@ import { AttributeData } from 'common/buffer/AttributeData'; | ||
} | ||
// Get the glyph | ||
if (chars && chars.length > 1) { | ||
@@ -193,0 +196,0 @@ rasterizedGlyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg); |
@@ -11,3 +11,4 @@ /** | ||
import { Terminal } from 'xterm'; | ||
import { IColorSet, IColor } from 'browser/Types'; | ||
import { IColor } from 'common/Types'; | ||
import { IColorSet } from 'browser/Types'; | ||
import { IRenderDimensions } from 'browser/renderer/Types'; | ||
@@ -14,0 +15,0 @@ import { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel'; |
@@ -12,2 +12,3 @@ /** | ||
import { isSafari } from 'common/Platform'; | ||
import { IDecorationService } from 'common/services/Services'; | ||
@@ -34,4 +35,5 @@ export class WebglAddon implements ITerminalAddon { | ||
const characterJoinerService: ICharacterJoinerService = (terminal as any)._core._characterJoinerService; | ||
const decorationService: IDecorationService = (terminal as any)._core._decorationService; | ||
const colors: IColorSet = (terminal as any)._core._colorManager.colors; | ||
this._renderer = new WebglRenderer(terminal, colors, characterJoinerService, this._preserveDrawingBuffer); | ||
this._renderer = new WebglRenderer(terminal, colors, characterJoinerService, decorationService, this._preserveDrawingBuffer); | ||
this._renderer.onContextLoss(() => this._onContextLoss.fire()); | ||
@@ -38,0 +40,0 @@ renderService.setRenderer(this._renderer); |
@@ -15,3 +15,3 @@ /** | ||
import { Disposable } from 'common/Lifecycle'; | ||
import { Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; | ||
import { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; | ||
import { Terminal, IEvent } from 'xterm'; | ||
@@ -27,2 +27,3 @@ import { IRenderLayer } from './renderLayer/Types'; | ||
import { AttributeData } from 'common/buffer/AttributeData'; | ||
import { IDecorationService } from 'common/services/Services'; | ||
@@ -36,2 +37,3 @@ export class WebglRenderer extends Disposable implements IRenderer { | ||
private _workCell: CellData = new CellData(); | ||
private _workColors: { fg: number, bg: number } = { fg: 0, bg: 0 }; | ||
@@ -58,2 +60,3 @@ private _canvas: HTMLCanvasElement; | ||
private readonly _characterJoinerService: ICharacterJoinerService, | ||
private readonly _decorationService: IDecorationService, | ||
preserveDrawingBuffer?: boolean | ||
@@ -338,2 +341,5 @@ ) { | ||
// Load colors/resolve overrides into work colors | ||
this._loadColorsForCell(x, row); | ||
if (code !== NULL_CELL_CODE) { | ||
@@ -345,4 +351,4 @@ this._model.lineLengths[y] = x + 1; | ||
if (this._model.cells[i] === code && | ||
this._model.cells[i + RENDER_MODEL_BG_OFFSET] === cell.bg && | ||
this._model.cells[i + RENDER_MODEL_FG_OFFSET] === cell.fg) { | ||
this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._workColors.bg && | ||
this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._workColors.fg) { | ||
continue; | ||
@@ -358,6 +364,6 @@ } | ||
this._model.cells[i] = code; | ||
this._model.cells[i + RENDER_MODEL_BG_OFFSET] = cell.bg; | ||
this._model.cells[i + RENDER_MODEL_FG_OFFSET] = cell.fg; | ||
this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._workColors.bg; | ||
this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._workColors.fg; | ||
this._glyphRenderer.updateCell(x, y, code, cell.bg, cell.fg, chars); | ||
this._glyphRenderer.updateCell(x, y, code, this._workColors.bg, this._workColors.fg, chars); | ||
@@ -373,4 +379,4 @@ if (isJoined) { | ||
this._model.cells[j] = NULL_CELL_CODE; | ||
this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._workCell.bg; | ||
this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._workCell.fg; | ||
this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._workColors.bg; | ||
this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._workColors.fg; | ||
} | ||
@@ -387,2 +393,60 @@ } | ||
/** | ||
* Loads colors for the cell into the work colors object. This resolves overrides/inverse if | ||
* necessary which is why the work cell object is not used. | ||
*/ | ||
private _loadColorsForCell(x: number, y: number): void { | ||
this._workColors.bg = this._workCell.bg; | ||
this._workColors.fg = this._workCell.fg; | ||
// Get any decoration foreground/background overrides, this happens on the model to avoid | ||
// spreading decoration override logic throughout the different sub-renderers | ||
let bgOverride: number | undefined; | ||
let fgOverride: number | undefined; | ||
for (const d of this._decorationService.getDecorationsAtCell(x, y)) { | ||
if (d.backgroundColorRGB) { | ||
bgOverride = (d.backgroundColorRGB.rgba >> 8) >>> 0 & 0xFFFFFF; | ||
} | ||
if (d.foregroundColorRGB) { | ||
fgOverride = (d.foregroundColorRGB.rgba >> 8) >>> 0 & 0xFFFFFF; | ||
} | ||
} | ||
// Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag | ||
// ahead of time in order to use the correct cache key | ||
if (bgOverride !== undefined) { | ||
// Non-RGB attributes from model + override + force RGB color mode | ||
bgOverride = (this._workCell.bg & ~Attributes.RGB_MASK) | bgOverride | Attributes.CM_RGB; | ||
} | ||
if (fgOverride !== undefined) { | ||
// Non-RGB attributes from model + force disable inverse + override + force RGB color mode | ||
fgOverride = (this._workCell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | fgOverride | Attributes.CM_RGB; | ||
} | ||
// Handle case where inverse was specified by only one of bgOverride or fgOverride was set, | ||
// resolving the other inverse color and setting the inverse flag if needed. | ||
if (this._workColors.fg & FgFlags.INVERSE) { | ||
if (bgOverride !== undefined && fgOverride === undefined) { | ||
// Resolve bg color type (default color has a different meaning in fg vs bg) | ||
if ((this._workColors.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) { | ||
fgOverride = (this._workColors.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | ((this._colors.background.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB; | ||
} else { | ||
fgOverride = (this._workColors.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this._workColors.bg & (Attributes.RGB_MASK | Attributes.CM_MASK); | ||
} | ||
} | ||
if (bgOverride === undefined && fgOverride !== undefined) { | ||
// Resolve bg color type (default color has a different meaning in fg vs bg) | ||
if ((this._workColors.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) { | ||
bgOverride = (this._workColors.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | ((this._colors.foreground.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB; | ||
} else { | ||
bgOverride = (this._workColors.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this._workColors.fg & (Attributes.RGB_MASK | Attributes.CM_MASK); | ||
} | ||
} | ||
} | ||
// Use the override if it exists | ||
this._workColors.bg = bgOverride ?? this._workColors.bg; | ||
this._workColors.fg = fgOverride ?? this._workColors.fg; | ||
} | ||
private _updateSelectionModel(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void { | ||
@@ -389,0 +453,0 @@ const terminal = this._terminal; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
495282
3180