From 4c1b586dd24d499e0a7f7b47ef5c70d049b8a67f Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 5 Sep 2021 12:12:34 +0200 Subject: [PATCH] Reduce the size of `TextLayerRenderTask._textDivProperties` in "regular" text-selection mode While these changes will obviously not have a significant effect on overall memory usage, it cannot hurt as far as I'm concerned. This patch makes the following changes: - Clear out `_textDivProperties` once rendering is done, since those properties are only necessary to keep alive when *enhanced* text-selection is being used. - Reduce the size of the `_textDivProperties`-entries by default, since a majority of the properties are only relevant when *enhanced* text-selection is being used. --- src/display/text_layer.js | 43 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/display/text_layer.js b/src/display/text_layer.js index b1b22ec1afb00..5ba09adbedcd6 100644 --- a/src/display/text_layer.js +++ b/src/display/text_layer.js @@ -118,18 +118,25 @@ function getAscent(fontFamily, ctx) { function appendText(task, geom, styles, ctx) { // Initialize all used properties to keep the caches monomorphic. const textDiv = document.createElement("span"); - const textDivProperties = { - angle: 0, - canvasWidth: 0, - hasText: geom.str !== "", - hasEOL: geom.hasEOL, - originalTransform: null, - paddingBottom: 0, - paddingLeft: 0, - paddingRight: 0, - paddingTop: 0, - scale: 1, - }; + const textDivProperties = task._enhanceTextSelection + ? { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + originalTransform: null, + paddingBottom: 0, + paddingLeft: 0, + paddingRight: 0, + paddingTop: 0, + scale: 1, + } + : { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + }; task._textDivs.push(textDiv); @@ -588,6 +595,11 @@ class TextLayerRenderTask { // Always clean-up the temporary canvas once rendering is no longer pending. this._capability.promise .finally(() => { + if (!this._enhanceTextSelection) { + // The `textDiv` properties are no longer needed. + this._textDivProperties = null; + } + if (this._layoutTextCtx) { // Zeroing the width and height cause Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. @@ -679,8 +691,11 @@ class TextLayerRenderTask { const { width } = this._layoutTextCtx.measureText(textDiv.textContent); if (width > 0) { - textDivProperties.scale = textDivProperties.canvasWidth / width; - transform = `scaleX(${textDivProperties.scale})`; + const scale = textDivProperties.canvasWidth / width; + if (this._enhanceTextSelection) { + textDivProperties.scale = scale; + } + transform = `scaleX(${scale})`; } } if (textDivProperties.angle !== 0) {