- Over time the number and size of these factories have increased, especially the `DOMFilterFactory` class, and this split should thus aid readability/maintainability of the code. - By introducing a couple of new import maps we can avoid bundling the `DOMCMapReaderFactory`/`DOMStandardFontDataFactory` classes in the Firefox PDF Viewer, since they are dead code there given that worker-thread fetching is always being used. - This patch has been successfully tested, by running `$ ./mach test toolkit/components/pdfjs/`, in a local Firefox artifact-build. *Note:* This patch reduces the size of the `gulp mozcentral` output by `1.3` kilo-bytes, which isn't a lot but still cannot hurt.
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(canvasAndContext, width, height) {
|
|
if (!canvasAndContext.canvas) {
|
|
throw new Error("Canvas is not specified");
|
|
}
|
|
if (width <= 0 || height <= 0) {
|
|
throw new Error("Invalid canvas size");
|
|
}
|
|
canvasAndContext.canvas.width = width;
|
|
canvasAndContext.canvas.height = height;
|
|
}
|
|
|
|
destroy(canvasAndContext) {
|
|
if (!canvasAndContext.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.
|
|
canvasAndContext.canvas.width = 0;
|
|
canvasAndContext.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 };
|