From 4f4ce0146dfc390456542dceb3de9617fd2a5062 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 28 Oct 2022 08:54:57 -0700 Subject: [PATCH 1/4] Add console.image helper This is useful for printing canvases that aren't attached to the DOM --- demo/client.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/demo/client.ts b/demo/client.ts index 18ce1808..5b561a8c 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -992,3 +992,33 @@ function addOverviewRuler(): void { term.registerDecoration({ marker: term.registerMarker(10), overviewRulerOptions: { color: '#ffffff80', position: 'full' } }); } +(console as any).image = (source: ImageData | HTMLCanvasElement, scale: number = 1) => { + function getBox(width: number, height: number): any { + return { + string: '+', + style: 'font-size: 1px; padding: ' + Math.floor(height/2) + 'px ' + Math.floor(width/2) + 'px; line-height: ' + height + 'px;' + }; + } + if (source instanceof HTMLCanvasElement) { + source = source.getContext('2d')?.getImageData(0, 0, source.width, source.height)!; + } + const canvas = document.createElement('canvas'); + canvas.width = source.width; + canvas.height = source.height; + const ctx = canvas.getContext('2d')!; + ctx.putImageData(source, 0, 0); + + const sw = source.width * scale; + const sh = source.height * scale; + const dim = getBox(sw, sh); + console.log( + `Image: ${source.width} x ${source.height}\n%c${dim.string}`, + `${dim.style}background: url(${canvas.toDataURL()}); background-size: ${sw}px ${sh}px; background-repeat: no-repeat; color: transparent;` + ); + console.groupCollapsed('Zoomed'); + console.log( + `%c${dim.string}`, + `${getBox(sw * 10, sh * 10).style}background: url(${canvas.toDataURL()}); background-size: ${sw * 10}px ${sh * 10}px; background-repeat: no-repeat; color: transparent; image-rendering: pixelated;-ms-interpolation-mode: nearest-neighbor;` + ); + console.groupEnd(); +}; From 8b545a3fe4b58fbfc262f9777d18bd1b318edbbe Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 28 Oct 2022 08:57:41 -0700 Subject: [PATCH 2/4] Fix bbox right scan start offset This causes particularly wide glyphs like italic emoji to get clipped even if they're within the allowed padding. Fixes #4229 --- src/browser/renderer/shared/TextureAtlas.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index 23deb8a3..d59ee64e 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -730,7 +730,7 @@ export class TextureAtlas implements ITextureAtlas { } boundingBox.right = width; found = false; - for (let x = width - 1; x >= 0; x--) { + for (let x = padding + width - 1; x >= 0; x--) { for (let y = 0; y < height; y++) { const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3; if (imageData.data[alphaOffset] !== 0) { From 67b3faef0116589a321e9da05f9cbdcd8e51e729 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 28 Oct 2022 09:01:22 -0700 Subject: [PATCH 3/4] Use bbox padding and width consistently --- src/browser/renderer/shared/TextureAtlas.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index d59ee64e..4edebf5c 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -715,7 +715,7 @@ export class TextureAtlas implements ITextureAtlas { } boundingBox.left = 0; found = false; - for (let x = 0; x < width; x++) { + for (let x = 0; x < padding + width; x++) { for (let y = 0; y < height; y++) { const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3; if (imageData.data[alphaOffset] !== 0) { @@ -730,7 +730,7 @@ export class TextureAtlas implements ITextureAtlas { } boundingBox.right = width; found = false; - for (let x = padding + width - 1; x >= 0; x--) { + for (let x = padding + width - 1; x >= padding; x--) { for (let y = 0; y < height; y++) { const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3; if (imageData.data[alphaOffset] !== 0) { From b0672aac099a501db94603f955102cbce0a96539 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 28 Oct 2022 14:02:58 -0700 Subject: [PATCH 4/4] Correctly offset mcr check on canvas renderer Fixes #4224 --- addons/xterm-addon-canvas/src/BaseRenderLayer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 67d459f7..b037d61e 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -357,7 +357,7 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer */ protected _drawChars(cell: ICellData, x: number, y: number): void { const chars = cell.getChars(); - this._cellColorResolver.resolve(cell, x, y); + this._cellColorResolver.resolve(cell, x, this._bufferService.buffer.ydisp + y); let glyph: IRasterizedGlyph; if (chars && chars.length > 1) { glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext);