diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 526f3fcbc..aa7360546 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -1974,7 +1974,7 @@ class PartialEvaluator { normalizeWhitespace = false, combineTextItems = false, sink, - seenStyles = Object.create(null), + seenStyles = new Set(), }) { // Ensure that `resources`/`stateManager` is correctly initialized, // even if the provided parameter is e.g. `null`. @@ -2024,17 +2024,19 @@ class PartialEvaluator { if (textContentItem.initialized) { return textContentItem; } - var font = textState.font; - if (!(font.loadedName in seenStyles)) { - seenStyles[font.loadedName] = true; - textContent.styles[font.loadedName] = { + const font = textState.font, + loadedName = font.loadedName; + if (!seenStyles.has(loadedName)) { + seenStyles.add(loadedName); + + textContent.styles[loadedName] = { fontFamily: font.fallbackName, ascent: font.ascent, descent: font.descent, vertical: font.vertical, }; } - textContentItem.fontName = font.loadedName; + textContentItem.fontName = loadedName; // 9.4.4 Text Space Details var tsm = [ diff --git a/src/display/api.js b/src/display/api.js index 6549d85ab..b88a72f82 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1284,10 +1284,7 @@ class PDFPageProxy { } const complete = error => { - const i = intentState.renderTasks.indexOf(internalRenderTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } + intentState.renderTasks.delete(internalRenderTask); // Attempt to reduce memory usage during *printing*, by always running // cleanup once rendering has finished (regardless of cleanupAfterRender). @@ -1332,10 +1329,7 @@ class PDFPageProxy { pdfBug: this._pdfBug, }); - if (!intentState.renderTasks) { - intentState.renderTasks = []; - } - intentState.renderTasks.push(internalRenderTask); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); const renderTask = internalRenderTask.task; Promise.all([ @@ -1370,10 +1364,7 @@ class PDFPageProxy { if (intentState.operatorList.lastChunk) { intentState.opListReadCapability.resolve(intentState.operatorList); - const i = intentState.renderTasks.indexOf(opListTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } + intentState.renderTasks.delete(opListTask); } } @@ -1389,8 +1380,7 @@ class PDFPageProxy { opListTask = Object.create(null); opListTask.operatorListChanged = operatorListChanged; intentState.opListReadCapability = createPromiseCapability(); - intentState.renderTasks = []; - intentState.renderTasks.push(opListTask); + (intentState.renderTasks ||= new Set()).add(opListTask); intentState.operatorList = { fnArray: [], argsArray: [], @@ -1518,7 +1508,7 @@ class PDFPageProxy { return false; } for (const { renderTasks, operatorList } of this._intentStates.values()) { - if (renderTasks.length !== 0 || !operatorList.lastChunk) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { return false; } } @@ -1565,8 +1555,8 @@ class PDFPageProxy { intentState.operatorList.lastChunk = operatorListChunk.lastChunk; // Notify all the rendering tasks there are more operators to be consumed. - for (let i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); } if (operatorListChunk.lastChunk) { @@ -1615,8 +1605,8 @@ class PDFPageProxy { // Mark operator list as complete. intentState.operatorList.lastChunk = true; - for (let i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); } this._tryCleanup(); } @@ -1650,7 +1640,7 @@ class PDFPageProxy { if (!force) { // Ensure that an Error occurring in *only* one `InternalRenderTask`, e.g. // multiple render() calls on the same canvas, won't break all rendering. - if (intentState.renderTasks.length !== 0) { + if (intentState.renderTasks.size > 0) { return; } // Don't immediately abort parsing on the worker-thread when rendering is