@xterm/addon-image 0.9.0-beta.98 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/addon-image.js +1 -1
- package/lib/addon-image.js.map +1 -1
- package/lib/addon-image.mjs.map +1 -1
- package/package.json +2 -5
- package/lib/addon-image.js.LICENSE.txt +0 -24
- package/out/IIPHandler.js +0 -148
- package/out/IIPHandler.js.map +0 -1
- package/out/IIPHeaderParser.js +0 -156
- package/out/IIPHeaderParser.js.map +0 -1
- package/out/IIPHeaderParser.test.js +0 -137
- package/out/IIPHeaderParser.test.js.map +0 -1
- package/out/IIPMetrics.js +0 -69
- package/out/IIPMetrics.js.map +0 -1
- package/out/IIPMetrics.test.js +0 -39
- package/out/IIPMetrics.test.js.map +0 -1
- package/out/ImageAddon.js +0 -261
- package/out/ImageAddon.js.map +0 -1
- package/out/ImageRenderer.js +0 -330
- package/out/ImageRenderer.js.map +0 -1
- package/out/ImageStorage.js +0 -563
- package/out/ImageStorage.js.map +0 -1
- package/out/SixelHandler.js +0 -140
- package/out/SixelHandler.js.map +0 -1
- package/out/Types.js +0 -7
- package/out/Types.js.map +0 -1
- package/src/IIPHeaderParser.test.ts +0 -138
- package/src/IIPMetrics.test.ts +0 -44
package/out/ImageStorage.js
DELETED
|
@@ -1,563 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Copyright (c) 2020 The xterm.js authors. All rights reserved.
|
|
4
|
-
* @license MIT
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ImageStorage = exports.CELL_SIZE_DEFAULT = void 0;
|
|
8
|
-
const ImageRenderer_1 = require("./ImageRenderer");
|
|
9
|
-
// fallback default cell size
|
|
10
|
-
exports.CELL_SIZE_DEFAULT = {
|
|
11
|
-
width: 7,
|
|
12
|
-
height: 14
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Extend extended attribute to also hold image tile information.
|
|
16
|
-
*
|
|
17
|
-
* Object definition is copied from base repo to fully mimick its behavior.
|
|
18
|
-
* Image data is added as additional public properties `imageId` and `tileId`.
|
|
19
|
-
*/
|
|
20
|
-
class ExtendedAttrsImage {
|
|
21
|
-
get ext() {
|
|
22
|
-
if (this._urlId) {
|
|
23
|
-
return ((this._ext & ~469762048 /* ExtFlags.UNDERLINE_STYLE */) |
|
|
24
|
-
(this.underlineStyle << 26));
|
|
25
|
-
}
|
|
26
|
-
return this._ext;
|
|
27
|
-
}
|
|
28
|
-
set ext(value) { this._ext = value; }
|
|
29
|
-
get underlineStyle() {
|
|
30
|
-
// Always return the URL style if it has one
|
|
31
|
-
if (this._urlId) {
|
|
32
|
-
return 5 /* UnderlineStyle.DASHED */;
|
|
33
|
-
}
|
|
34
|
-
return (this._ext & 469762048 /* ExtFlags.UNDERLINE_STYLE */) >> 26;
|
|
35
|
-
}
|
|
36
|
-
set underlineStyle(value) {
|
|
37
|
-
this._ext &= ~469762048 /* ExtFlags.UNDERLINE_STYLE */;
|
|
38
|
-
this._ext |= (value << 26) & 469762048 /* ExtFlags.UNDERLINE_STYLE */;
|
|
39
|
-
}
|
|
40
|
-
get underlineColor() {
|
|
41
|
-
return this._ext & (50331648 /* Attributes.CM_MASK */ | 16777215 /* Attributes.RGB_MASK */);
|
|
42
|
-
}
|
|
43
|
-
set underlineColor(value) {
|
|
44
|
-
this._ext &= ~(50331648 /* Attributes.CM_MASK */ | 16777215 /* Attributes.RGB_MASK */);
|
|
45
|
-
this._ext |= value & (50331648 /* Attributes.CM_MASK */ | 16777215 /* Attributes.RGB_MASK */);
|
|
46
|
-
}
|
|
47
|
-
get underlineVariantOffset() {
|
|
48
|
-
const val = (this._ext & 3758096384 /* ExtFlags.VARIANT_OFFSET */) >> 29;
|
|
49
|
-
if (val < 0) {
|
|
50
|
-
return val ^ 0xFFFFFFF8;
|
|
51
|
-
}
|
|
52
|
-
return val;
|
|
53
|
-
}
|
|
54
|
-
set underlineVariantOffset(value) {
|
|
55
|
-
this._ext &= ~3758096384 /* ExtFlags.VARIANT_OFFSET */;
|
|
56
|
-
this._ext |= (value << 29) & 3758096384 /* ExtFlags.VARIANT_OFFSET */;
|
|
57
|
-
}
|
|
58
|
-
get urlId() {
|
|
59
|
-
return this._urlId;
|
|
60
|
-
}
|
|
61
|
-
set urlId(value) {
|
|
62
|
-
this._urlId = value;
|
|
63
|
-
}
|
|
64
|
-
constructor(ext = 0, urlId = 0, imageId = -1, tileId = -1) {
|
|
65
|
-
this.imageId = imageId;
|
|
66
|
-
this.tileId = tileId;
|
|
67
|
-
this._ext = 0;
|
|
68
|
-
this._urlId = 0;
|
|
69
|
-
this._ext = ext;
|
|
70
|
-
this._urlId = urlId;
|
|
71
|
-
}
|
|
72
|
-
clone() {
|
|
73
|
-
/**
|
|
74
|
-
* Technically we dont need a clone variant of ExtendedAttrsImage,
|
|
75
|
-
* as we never clone a cell holding image data.
|
|
76
|
-
* Note: Clone is only meant to be used by the InputHandler for
|
|
77
|
-
* sticky attributes, which is never the case for image data.
|
|
78
|
-
* We still provide a proper clone method to reflect the full ext attr
|
|
79
|
-
* state in case there are future use cases for clone.
|
|
80
|
-
*/
|
|
81
|
-
return new ExtendedAttrsImage(this._ext, this._urlId, this.imageId, this.tileId);
|
|
82
|
-
}
|
|
83
|
-
isEmpty() {
|
|
84
|
-
return this.underlineStyle === 0 /* UnderlineStyle.NONE */ && this._urlId === 0 && this.imageId === -1;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const EMPTY_ATTRS = new ExtendedAttrsImage();
|
|
88
|
-
/**
|
|
89
|
-
* ImageStorage - extension of CoreTerminal:
|
|
90
|
-
* - hold image data
|
|
91
|
-
* - write/read image data to/from buffer
|
|
92
|
-
*
|
|
93
|
-
* TODO: image composition for overwrites
|
|
94
|
-
*/
|
|
95
|
-
class ImageStorage {
|
|
96
|
-
constructor(_terminal, _renderer, _opts) {
|
|
97
|
-
this._terminal = _terminal;
|
|
98
|
-
this._renderer = _renderer;
|
|
99
|
-
this._opts = _opts;
|
|
100
|
-
// storage
|
|
101
|
-
this._images = new Map();
|
|
102
|
-
// last used id
|
|
103
|
-
this._lastId = 0;
|
|
104
|
-
// last evicted id
|
|
105
|
-
this._lowestId = 0;
|
|
106
|
-
// whether a full clear happened before
|
|
107
|
-
this._fullyCleared = false;
|
|
108
|
-
// whether render should do a full clear
|
|
109
|
-
this._needsFullClear = false;
|
|
110
|
-
// hard limit of stored pixels (fallback limit of 10 MB)
|
|
111
|
-
this._pixelLimit = 2500000;
|
|
112
|
-
try {
|
|
113
|
-
this.setLimit(this._opts.storageLimit);
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
console.error(e.message);
|
|
117
|
-
console.warn(`storageLimit is set to ${this.getLimit()} MB`);
|
|
118
|
-
}
|
|
119
|
-
this._viewportMetrics = {
|
|
120
|
-
cols: this._terminal.cols,
|
|
121
|
-
rows: this._terminal.rows
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
dispose() {
|
|
125
|
-
this.reset();
|
|
126
|
-
}
|
|
127
|
-
reset() {
|
|
128
|
-
var _a;
|
|
129
|
-
for (const spec of this._images.values()) {
|
|
130
|
-
(_a = spec.marker) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
131
|
-
}
|
|
132
|
-
// NOTE: marker.dispose above already calls ImageBitmap.close
|
|
133
|
-
// therefore we can just wipe the map here
|
|
134
|
-
this._images.clear();
|
|
135
|
-
this._renderer.clearAll();
|
|
136
|
-
}
|
|
137
|
-
getLimit() {
|
|
138
|
-
return this._pixelLimit * 4 / 1000000;
|
|
139
|
-
}
|
|
140
|
-
setLimit(value) {
|
|
141
|
-
if (value < 0.5 || value > 1000) {
|
|
142
|
-
throw RangeError('invalid storageLimit, should be at least 0.5 MB and not exceed 1G');
|
|
143
|
-
}
|
|
144
|
-
this._pixelLimit = (value / 4 * 1000000) >>> 0;
|
|
145
|
-
this._evictOldest(0);
|
|
146
|
-
}
|
|
147
|
-
getUsage() {
|
|
148
|
-
return this._getStoredPixels() * 4 / 1000000;
|
|
149
|
-
}
|
|
150
|
-
_getStoredPixels() {
|
|
151
|
-
let storedPixels = 0;
|
|
152
|
-
for (const spec of this._images.values()) {
|
|
153
|
-
if (spec.orig) {
|
|
154
|
-
storedPixels += spec.orig.width * spec.orig.height;
|
|
155
|
-
if (spec.actual && spec.actual !== spec.orig) {
|
|
156
|
-
storedPixels += spec.actual.width * spec.actual.height;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return storedPixels;
|
|
161
|
-
}
|
|
162
|
-
_delImg(id) {
|
|
163
|
-
const spec = this._images.get(id);
|
|
164
|
-
this._images.delete(id);
|
|
165
|
-
// FIXME: really ugly workaround to get bitmaps deallocated :(
|
|
166
|
-
if (spec && window.ImageBitmap && spec.orig instanceof ImageBitmap) {
|
|
167
|
-
spec.orig.close();
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Wipe canvas and images on alternate buffer.
|
|
172
|
-
*/
|
|
173
|
-
wipeAlternate() {
|
|
174
|
-
var _a;
|
|
175
|
-
// remove all alternate tagged images
|
|
176
|
-
const zero = [];
|
|
177
|
-
for (const [id, spec] of this._images.entries()) {
|
|
178
|
-
if (spec.bufferType === 'alternate') {
|
|
179
|
-
(_a = spec.marker) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
180
|
-
zero.push(id);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
for (const id of zero) {
|
|
184
|
-
this._delImg(id);
|
|
185
|
-
}
|
|
186
|
-
// mark canvas to be wiped on next render
|
|
187
|
-
this._needsFullClear = true;
|
|
188
|
-
this._fullyCleared = false;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Only advance text cursor.
|
|
192
|
-
* This is an edge case from empty sixels carrying only a height but no pixels.
|
|
193
|
-
* Partially fixes https://github.com/jerch/xterm-addon-image/issues/37.
|
|
194
|
-
*/
|
|
195
|
-
advanceCursor(height) {
|
|
196
|
-
if (this._opts.sixelScrolling) {
|
|
197
|
-
let cellSize = this._renderer.cellSize;
|
|
198
|
-
if (cellSize.width === -1 || cellSize.height === -1) {
|
|
199
|
-
cellSize = exports.CELL_SIZE_DEFAULT;
|
|
200
|
-
}
|
|
201
|
-
const rows = Math.ceil(height / cellSize.height);
|
|
202
|
-
for (let i = 1; i < rows; ++i) {
|
|
203
|
-
this._terminal._core._inputHandler.lineFeed();
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Method to add an image to the storage.
|
|
209
|
-
*/
|
|
210
|
-
addImage(img) {
|
|
211
|
-
var _a;
|
|
212
|
-
// never allow storage to exceed memory limit
|
|
213
|
-
this._evictOldest(img.width * img.height);
|
|
214
|
-
// calc rows x cols needed to display the image
|
|
215
|
-
let cellSize = this._renderer.cellSize;
|
|
216
|
-
if (cellSize.width === -1 || cellSize.height === -1) {
|
|
217
|
-
cellSize = exports.CELL_SIZE_DEFAULT;
|
|
218
|
-
}
|
|
219
|
-
const cols = Math.ceil(img.width / cellSize.width);
|
|
220
|
-
const rows = Math.ceil(img.height / cellSize.height);
|
|
221
|
-
const imageId = ++this._lastId;
|
|
222
|
-
const buffer = this._terminal._core.buffer;
|
|
223
|
-
const termCols = this._terminal.cols;
|
|
224
|
-
const termRows = this._terminal.rows;
|
|
225
|
-
const originX = buffer.x;
|
|
226
|
-
const originY = buffer.y;
|
|
227
|
-
let offset = originX;
|
|
228
|
-
let tileCount = 0;
|
|
229
|
-
if (!this._opts.sixelScrolling) {
|
|
230
|
-
buffer.x = 0;
|
|
231
|
-
buffer.y = 0;
|
|
232
|
-
offset = 0;
|
|
233
|
-
}
|
|
234
|
-
this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);
|
|
235
|
-
for (let row = 0; row < rows; ++row) {
|
|
236
|
-
const line = buffer.lines.get(buffer.y + buffer.ybase);
|
|
237
|
-
for (let col = 0; col < cols; ++col) {
|
|
238
|
-
if (offset + col >= termCols)
|
|
239
|
-
break;
|
|
240
|
-
this._writeToCell(line, offset + col, imageId, row * cols + col);
|
|
241
|
-
tileCount++;
|
|
242
|
-
}
|
|
243
|
-
if (this._opts.sixelScrolling) {
|
|
244
|
-
if (row < rows - 1)
|
|
245
|
-
this._terminal._core._inputHandler.lineFeed();
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
if (++buffer.y >= termRows)
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
buffer.x = offset;
|
|
252
|
-
}
|
|
253
|
-
this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);
|
|
254
|
-
// cursor positioning modes
|
|
255
|
-
if (this._opts.sixelScrolling) {
|
|
256
|
-
buffer.x = offset;
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
buffer.x = originX;
|
|
260
|
-
buffer.y = originY;
|
|
261
|
-
}
|
|
262
|
-
// deleted images with zero tile count
|
|
263
|
-
const zero = [];
|
|
264
|
-
for (const [id, spec] of this._images.entries()) {
|
|
265
|
-
if (spec.tileCount < 1) {
|
|
266
|
-
(_a = spec.marker) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
267
|
-
zero.push(id);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
for (const id of zero) {
|
|
271
|
-
this._delImg(id);
|
|
272
|
-
}
|
|
273
|
-
// eviction marker:
|
|
274
|
-
// delete the image when the marker gets disposed
|
|
275
|
-
const endMarker = this._terminal.registerMarker(0);
|
|
276
|
-
endMarker === null || endMarker === void 0 ? void 0 : endMarker.onDispose(() => {
|
|
277
|
-
const spec = this._images.get(imageId);
|
|
278
|
-
if (spec) {
|
|
279
|
-
this._delImg(imageId);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
// since markers do not work on alternate for some reason,
|
|
283
|
-
// we evict images here manually
|
|
284
|
-
if (this._terminal.buffer.active.type === 'alternate') {
|
|
285
|
-
this._evictOnAlternate();
|
|
286
|
-
}
|
|
287
|
-
// create storage entry
|
|
288
|
-
const imgSpec = {
|
|
289
|
-
orig: img,
|
|
290
|
-
origCellSize: cellSize,
|
|
291
|
-
actual: img,
|
|
292
|
-
actualCellSize: Object.assign({}, cellSize), // clone needed, since later modified
|
|
293
|
-
marker: endMarker || undefined,
|
|
294
|
-
tileCount,
|
|
295
|
-
bufferType: this._terminal.buffer.active.type
|
|
296
|
-
};
|
|
297
|
-
// finally add the image
|
|
298
|
-
this._images.set(imageId, imgSpec);
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Render method. Collects buffer information and triggers
|
|
302
|
-
* canvas updates.
|
|
303
|
-
*/
|
|
304
|
-
// TODO: Should we move this to the ImageRenderer?
|
|
305
|
-
render(range) {
|
|
306
|
-
// setup image canvas in case we have none yet, but have images in store
|
|
307
|
-
if (!this._renderer.canvas && this._images.size) {
|
|
308
|
-
this._renderer.insertLayerToDom();
|
|
309
|
-
// safety measure - in case we cannot spawn a canvas at all, just exit
|
|
310
|
-
if (!this._renderer.canvas) {
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
// rescale if needed
|
|
315
|
-
this._renderer.rescaleCanvas();
|
|
316
|
-
// exit early if we dont have any images to test for
|
|
317
|
-
if (!this._images.size) {
|
|
318
|
-
if (!this._fullyCleared) {
|
|
319
|
-
this._renderer.clearAll();
|
|
320
|
-
this._fullyCleared = true;
|
|
321
|
-
this._needsFullClear = false;
|
|
322
|
-
}
|
|
323
|
-
if (this._renderer.canvas) {
|
|
324
|
-
this._renderer.removeLayerFromDom();
|
|
325
|
-
}
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
// buffer switches force a full clear
|
|
329
|
-
if (this._needsFullClear) {
|
|
330
|
-
this._renderer.clearAll();
|
|
331
|
-
this._fullyCleared = true;
|
|
332
|
-
this._needsFullClear = false;
|
|
333
|
-
}
|
|
334
|
-
const { start, end } = range;
|
|
335
|
-
const buffer = this._terminal._core.buffer;
|
|
336
|
-
const cols = this._terminal._core.cols;
|
|
337
|
-
// clear drawing area
|
|
338
|
-
this._renderer.clearLines(start, end);
|
|
339
|
-
// walk all cells in viewport and draw tiles found
|
|
340
|
-
for (let row = start; row <= end; ++row) {
|
|
341
|
-
const line = buffer.lines.get(row + buffer.ydisp);
|
|
342
|
-
if (!line)
|
|
343
|
-
return;
|
|
344
|
-
for (let col = 0; col < cols; ++col) {
|
|
345
|
-
if (line.getBg(col) & 268435456 /* BgFlags.HAS_EXTENDED */) {
|
|
346
|
-
let e = line._extendedAttrs[col] || EMPTY_ATTRS;
|
|
347
|
-
const imageId = e.imageId;
|
|
348
|
-
if (imageId === undefined || imageId === -1) {
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
const imgSpec = this._images.get(imageId);
|
|
352
|
-
if (e.tileId !== -1) {
|
|
353
|
-
const startTile = e.tileId;
|
|
354
|
-
const startCol = col;
|
|
355
|
-
let count = 1;
|
|
356
|
-
/**
|
|
357
|
-
* merge tiles to the right into a single draw call, if:
|
|
358
|
-
* - not at end of line
|
|
359
|
-
* - cell has same image id
|
|
360
|
-
* - cell has consecutive tile id
|
|
361
|
-
*/
|
|
362
|
-
while (++col < cols
|
|
363
|
-
&& (line.getBg(col) & 268435456 /* BgFlags.HAS_EXTENDED */)
|
|
364
|
-
&& (e = line._extendedAttrs[col] || EMPTY_ATTRS)
|
|
365
|
-
&& (e.imageId === imageId)
|
|
366
|
-
&& (e.tileId === startTile + count)) {
|
|
367
|
-
count++;
|
|
368
|
-
}
|
|
369
|
-
col--;
|
|
370
|
-
if (imgSpec) {
|
|
371
|
-
if (imgSpec.actual) {
|
|
372
|
-
this._renderer.draw(imgSpec, startTile, startCol, row, count);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
else if (this._opts.showPlaceholder) {
|
|
376
|
-
this._renderer.drawPlaceholder(startCol, row, count);
|
|
377
|
-
}
|
|
378
|
-
this._fullyCleared = false;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
viewportResize(metrics) {
|
|
385
|
-
var _a;
|
|
386
|
-
// exit early if we have nothing in storage
|
|
387
|
-
if (!this._images.size) {
|
|
388
|
-
this._viewportMetrics = metrics;
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
// handle only viewport width enlargements, exit all other cases
|
|
392
|
-
// TODO: needs patch for tile counter
|
|
393
|
-
if (this._viewportMetrics.cols >= metrics.cols) {
|
|
394
|
-
this._viewportMetrics = metrics;
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
// walk scrollbuffer at old col width to find all possible expansion matches
|
|
398
|
-
const buffer = this._terminal._core.buffer;
|
|
399
|
-
const rows = buffer.lines.length;
|
|
400
|
-
const oldCol = this._viewportMetrics.cols - 1;
|
|
401
|
-
for (let row = 0; row < rows; ++row) {
|
|
402
|
-
const line = buffer.lines.get(row);
|
|
403
|
-
if (line.getBg(oldCol) & 268435456 /* BgFlags.HAS_EXTENDED */) {
|
|
404
|
-
const e = line._extendedAttrs[oldCol] || EMPTY_ATTRS;
|
|
405
|
-
const imageId = e.imageId;
|
|
406
|
-
if (imageId === undefined || imageId === -1) {
|
|
407
|
-
continue;
|
|
408
|
-
}
|
|
409
|
-
const imgSpec = this._images.get(imageId);
|
|
410
|
-
if (!imgSpec) {
|
|
411
|
-
continue;
|
|
412
|
-
}
|
|
413
|
-
// found an image tile at oldCol, check if it qualifies for right exapansion
|
|
414
|
-
const tilesPerRow = Math.ceil((((_a = imgSpec.actual) === null || _a === void 0 ? void 0 : _a.width) || 0) / imgSpec.actualCellSize.width);
|
|
415
|
-
if ((e.tileId % tilesPerRow) + 1 >= tilesPerRow) {
|
|
416
|
-
continue;
|
|
417
|
-
}
|
|
418
|
-
// expand only if right side is empty (nothing got wrapped from below)
|
|
419
|
-
let hasData = false;
|
|
420
|
-
for (let rightCol = oldCol + 1; rightCol > metrics.cols; ++rightCol) {
|
|
421
|
-
if (line._data[rightCol * 3 /* Cell.SIZE */ + 0 /* Cell.CONTENT */] & 4194303 /* Content.HAS_CONTENT_MASK */) {
|
|
422
|
-
hasData = true;
|
|
423
|
-
break;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
if (hasData) {
|
|
427
|
-
continue;
|
|
428
|
-
}
|
|
429
|
-
// do right expansion on terminal buffer
|
|
430
|
-
const end = Math.min(metrics.cols, tilesPerRow - (e.tileId % tilesPerRow) + oldCol);
|
|
431
|
-
let lastTile = e.tileId;
|
|
432
|
-
for (let expandCol = oldCol + 1; expandCol < end; ++expandCol) {
|
|
433
|
-
this._writeToCell(line, expandCol, imageId, ++lastTile);
|
|
434
|
-
imgSpec.tileCount++;
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
// store new viewport metrics
|
|
439
|
-
this._viewportMetrics = metrics;
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Retrieve original canvas at buffer position.
|
|
443
|
-
*/
|
|
444
|
-
getImageAtBufferCell(x, y) {
|
|
445
|
-
var _a, _b;
|
|
446
|
-
const buffer = this._terminal._core.buffer;
|
|
447
|
-
const line = buffer.lines.get(y);
|
|
448
|
-
if (line && line.getBg(x) & 268435456 /* BgFlags.HAS_EXTENDED */) {
|
|
449
|
-
const e = line._extendedAttrs[x] || EMPTY_ATTRS;
|
|
450
|
-
if (e.imageId && e.imageId !== -1) {
|
|
451
|
-
const orig = (_a = this._images.get(e.imageId)) === null || _a === void 0 ? void 0 : _a.orig;
|
|
452
|
-
if (window.ImageBitmap && orig instanceof ImageBitmap) {
|
|
453
|
-
const canvas = ImageRenderer_1.ImageRenderer.createCanvas(window.document, orig.width, orig.height);
|
|
454
|
-
(_b = canvas.getContext('2d')) === null || _b === void 0 ? void 0 : _b.drawImage(orig, 0, 0, orig.width, orig.height);
|
|
455
|
-
return canvas;
|
|
456
|
-
}
|
|
457
|
-
return orig;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Extract active single tile at buffer position.
|
|
463
|
-
*/
|
|
464
|
-
extractTileAtBufferCell(x, y) {
|
|
465
|
-
const buffer = this._terminal._core.buffer;
|
|
466
|
-
const line = buffer.lines.get(y);
|
|
467
|
-
if (line && line.getBg(x) & 268435456 /* BgFlags.HAS_EXTENDED */) {
|
|
468
|
-
const e = line._extendedAttrs[x] || EMPTY_ATTRS;
|
|
469
|
-
if (e.imageId && e.imageId !== -1 && e.tileId !== -1) {
|
|
470
|
-
const spec = this._images.get(e.imageId);
|
|
471
|
-
if (spec) {
|
|
472
|
-
return this._renderer.extractTile(spec, e.tileId);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
// TODO: Do we need some blob offloading tricks here to avoid early eviction?
|
|
478
|
-
// also see https://stackoverflow.com/questions/28307789/is-there-any-limitation-on-javascript-max-blob-size
|
|
479
|
-
_evictOldest(room) {
|
|
480
|
-
var _a;
|
|
481
|
-
const used = this._getStoredPixels();
|
|
482
|
-
let current = used;
|
|
483
|
-
while (this._pixelLimit < current + room && this._images.size) {
|
|
484
|
-
const spec = this._images.get(++this._lowestId);
|
|
485
|
-
if (spec && spec.orig) {
|
|
486
|
-
current -= spec.orig.width * spec.orig.height;
|
|
487
|
-
if (spec.actual && spec.orig !== spec.actual) {
|
|
488
|
-
current -= spec.actual.width * spec.actual.height;
|
|
489
|
-
}
|
|
490
|
-
(_a = spec.marker) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
491
|
-
this._delImg(this._lowestId);
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
return used - current;
|
|
495
|
-
}
|
|
496
|
-
_writeToCell(line, x, imageId, tileId) {
|
|
497
|
-
if (line._data[x * 3 /* Cell.SIZE */ + 2 /* Cell.BG */] & 268435456 /* BgFlags.HAS_EXTENDED */) {
|
|
498
|
-
const old = line._extendedAttrs[x];
|
|
499
|
-
if (old) {
|
|
500
|
-
if (old.imageId !== undefined) {
|
|
501
|
-
// found an old ExtendedAttrsImage, since we know that
|
|
502
|
-
// they are always isolated instances (single cell usage),
|
|
503
|
-
// we can re-use it and just update their id entries
|
|
504
|
-
const oldSpec = this._images.get(old.imageId);
|
|
505
|
-
if (oldSpec) {
|
|
506
|
-
// early eviction for in-viewport overwrites
|
|
507
|
-
oldSpec.tileCount--;
|
|
508
|
-
}
|
|
509
|
-
old.imageId = imageId;
|
|
510
|
-
old.tileId = tileId;
|
|
511
|
-
return;
|
|
512
|
-
}
|
|
513
|
-
// found a plain ExtendedAttrs instance, clone it to new entry
|
|
514
|
-
line._extendedAttrs[x] = new ExtendedAttrsImage(old.ext, old.urlId, imageId, tileId);
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
// fall-through: always create new ExtendedAttrsImage entry
|
|
519
|
-
line._data[x * 3 /* Cell.SIZE */ + 2 /* Cell.BG */] |= 268435456 /* BgFlags.HAS_EXTENDED */;
|
|
520
|
-
line._extendedAttrs[x] = new ExtendedAttrsImage(0, 0, imageId, tileId);
|
|
521
|
-
}
|
|
522
|
-
_evictOnAlternate() {
|
|
523
|
-
var _a, _b;
|
|
524
|
-
// nullify tile count of all images on alternate buffer
|
|
525
|
-
for (const spec of this._images.values()) {
|
|
526
|
-
if (spec.bufferType === 'alternate') {
|
|
527
|
-
spec.tileCount = 0;
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
// re-count tiles on whole buffer
|
|
531
|
-
const buffer = this._terminal._core.buffer;
|
|
532
|
-
for (let y = 0; y < this._terminal.rows; ++y) {
|
|
533
|
-
const line = buffer.lines.get(y);
|
|
534
|
-
if (!line) {
|
|
535
|
-
continue;
|
|
536
|
-
}
|
|
537
|
-
for (let x = 0; x < this._terminal.cols; ++x) {
|
|
538
|
-
if (line._data[x * 3 /* Cell.SIZE */ + 2 /* Cell.BG */] & 268435456 /* BgFlags.HAS_EXTENDED */) {
|
|
539
|
-
const imgId = (_a = line._extendedAttrs[x]) === null || _a === void 0 ? void 0 : _a.imageId;
|
|
540
|
-
if (imgId) {
|
|
541
|
-
const spec = this._images.get(imgId);
|
|
542
|
-
if (spec) {
|
|
543
|
-
spec.tileCount++;
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
// deleted images with zero tile count
|
|
550
|
-
const zero = [];
|
|
551
|
-
for (const [id, spec] of this._images.entries()) {
|
|
552
|
-
if (spec.bufferType === 'alternate' && !spec.tileCount) {
|
|
553
|
-
(_b = spec.marker) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
554
|
-
zero.push(id);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
for (const id of zero) {
|
|
558
|
-
this._delImg(id);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
exports.ImageStorage = ImageStorage;
|
|
563
|
-
//# sourceMappingURL=ImageStorage.js.map
|
package/out/ImageStorage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImageStorage.js","sourceRoot":"","sources":["../src/ImageStorage.ts"],"names":[],"mappings":"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"}
|