mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-06-06 10:11:03 +02:00
The cache has been added in #3312 in 2013 and a lot of things changed since. Having too many cached accelerated canvases can lead to have to move their data from the GPU to the RAM which is costly. So this patch: - removes all the cached canvases; - destroys the useless canvases in order to free their associated memory asap; - slightly rewrite canvas.js::_scaleImage to avoid too much canvas creation.
93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
/* Copyright 2015 Mozilla Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { unreachable } from "../shared/util.js";
|
|
|
|
class BaseCanvasFactory {
|
|
#enableHWA = false;
|
|
|
|
constructor({ enableHWA = false }) {
|
|
if (
|
|
(typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) &&
|
|
this.constructor === BaseCanvasFactory
|
|
) {
|
|
unreachable("Cannot initialize BaseCanvasFactory.");
|
|
}
|
|
this.#enableHWA = enableHWA;
|
|
}
|
|
|
|
create(width, height) {
|
|
if (width <= 0 || height <= 0) {
|
|
throw new Error("Invalid canvas size");
|
|
}
|
|
const canvas = this._createCanvas(width, height);
|
|
return {
|
|
canvas,
|
|
context: canvas.getContext("2d", {
|
|
willReadFrequently: !this.#enableHWA,
|
|
}),
|
|
};
|
|
}
|
|
|
|
reset({ canvas }, width, height) {
|
|
if (!canvas) {
|
|
throw new Error("Canvas is not specified");
|
|
}
|
|
if (width <= 0 || height <= 0) {
|
|
throw new Error("Invalid canvas size");
|
|
}
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
}
|
|
|
|
destroy(canvasAndContext) {
|
|
const { canvas } = canvasAndContext;
|
|
if (!canvas) {
|
|
throw new Error("Canvas is not specified");
|
|
}
|
|
// Zeroing the width and height cause Firefox to release graphics
|
|
// resources immediately, which can greatly reduce memory consumption.
|
|
canvas.width = canvas.height = 0;
|
|
canvasAndContext.canvas = null;
|
|
canvasAndContext.context = null;
|
|
}
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
_createCanvas(width, height) {
|
|
unreachable("Abstract method `_createCanvas` called.");
|
|
}
|
|
}
|
|
|
|
class DOMCanvasFactory extends BaseCanvasFactory {
|
|
constructor({ ownerDocument = globalThis.document, enableHWA = false }) {
|
|
super({ enableHWA });
|
|
this._document = ownerDocument;
|
|
}
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
_createCanvas(width, height) {
|
|
const canvas = this._document.createElement("canvas");
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
return canvas;
|
|
}
|
|
}
|
|
|
|
export { BaseCanvasFactory, DOMCanvasFactory };
|