1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-22 16:18:08 +02:00

Add an option to enable/disable hardware acceleration (bug 1902012)

This commit is contained in:
Calixte Denizet 2024-06-12 12:51:51 +02:00
parent 341ff40e74
commit ff6180a4c9
13 changed files with 62 additions and 12 deletions

View file

@ -242,7 +242,7 @@ class FakeUnicodeFont {
this.fontFamily = fontFamily;
const canvas = new OffscreenCanvas(1, 1);
this.ctxMeasure = canvas.getContext("2d");
this.ctxMeasure = canvas.getContext("2d", { willReadFrequently: true });
if (!FakeUnicodeFont._fontNameId) {
FakeUnicodeFont._fontNameId = 1;

View file

@ -213,6 +213,8 @@ const DefaultStandardFontDataFactory =
* when creating canvases. The default value is {new DOMCanvasFactory()}.
* @property {Object} [filterFactory] - A factory instance that will be used
* to create SVG filters when rendering some images on the main canvas.
* @property {boolean} [enableHWA] - Enables hardware acceleration for
* rendering. The default value is `false`.
*/
/**
@ -297,6 +299,7 @@ function getDocument(src) {
const disableStream = src.disableStream === true;
const disableAutoFetch = src.disableAutoFetch === true;
const pdfBug = src.pdfBug === true;
const enableHWA = src.enableHWA === true;
// Parameters whose default values depend on other parameters.
const length = rangeTransport ? rangeTransport.length : src.length ?? NaN;
@ -315,7 +318,7 @@ function getDocument(src) {
isValidFetchUrl(cMapUrl, document.baseURI) &&
isValidFetchUrl(standardFontDataUrl, document.baseURI));
const canvasFactory =
src.canvasFactory || new DefaultCanvasFactory({ ownerDocument });
src.canvasFactory || new DefaultCanvasFactory({ ownerDocument, enableHWA });
const filterFactory =
src.filterFactory || new DefaultFilterFactory({ docId, ownerDocument });

View file

@ -46,10 +46,13 @@ class BaseFilterFactory {
}
class BaseCanvasFactory {
constructor() {
#enableHWA = false;
constructor({ enableHWA = false } = {}) {
if (this.constructor === BaseCanvasFactory) {
unreachable("Cannot initialize BaseCanvasFactory.");
}
this.#enableHWA = enableHWA;
}
create(width, height) {
@ -59,7 +62,9 @@ class BaseCanvasFactory {
const canvas = this._createCanvas(width, height);
return {
canvas,
context: canvas.getContext("2d"),
context: canvas.getContext("2d", {
willReadFrequently: !this.#enableHWA,
}),
};
}

View file

@ -477,8 +477,8 @@ class DOMFilterFactory extends BaseFilterFactory {
}
class DOMCanvasFactory extends BaseCanvasFactory {
constructor({ ownerDocument = globalThis.document } = {}) {
super();
constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {
super({ enableHWA });
this._document = ownerDocument;
}

View file

@ -98,7 +98,7 @@ class ImageManager {
// behavior in Safari.
const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 1 1" width="1" height="1" xmlns="http://www.w3.org/2000/svg"><rect width="1" height="1" style="fill:red;"/></svg>`;
const canvas = new OffscreenCanvas(1, 3);
const ctx = canvas.getContext("2d");
const ctx = canvas.getContext("2d", { willReadFrequently: true });
const image = new Image();
image.src = svg;
const promise = image.decode().then(() => {

View file

@ -447,7 +447,10 @@ class TextLayer {
canvas.className = "hiddenCanvasElement";
canvas.lang = lang;
document.body.append(canvas);
canvasContext = canvas.getContext("2d", { alpha: false });
canvasContext = canvas.getContext("2d", {
alpha: false,
willReadFrequently: true,
});
this.#canvasContexts.set(lang, canvasContext);
}
return canvasContext;