123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- /* Copyright 2017 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 { DefaultCanvasFactory, getDocument } from "../../src/display/api.js";
- import { buildGetDocumentParams } from "./test_utils.js";
- function getTopLeftPixel(canvasContext) {
- const imgData = canvasContext.getImageData(0, 0, 1, 1);
- return {
- r: imgData.data[0],
- g: imgData.data[1],
- b: imgData.data[2],
- a: imgData.data[3],
- };
- }
- describe("custom canvas rendering", function () {
- const transparentGetDocumentParams =
- buildGetDocumentParams("transparent.pdf");
- let CanvasFactory;
- let loadingTask;
- let page;
- beforeAll(async function () {
- CanvasFactory = new DefaultCanvasFactory();
- loadingTask = getDocument(transparentGetDocumentParams);
- const doc = await loadingTask.promise;
- const data = await doc.getPage(1);
- page = data;
- });
- afterAll(async function () {
- CanvasFactory = null;
- page = null;
- await loadingTask.destroy();
- });
- it("renders to canvas with a default white background", async function () {
- const viewport = page.getViewport({ scale: 1 });
- const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
- const renderTask = page.render({
- canvasContext: canvasAndCtx.context,
- viewport,
- });
- await renderTask.promise;
- expect(getTopLeftPixel(canvasAndCtx.context)).toEqual({
- r: 255,
- g: 255,
- b: 255,
- a: 255,
- });
- CanvasFactory.destroy(canvasAndCtx);
- });
- it("renders to canvas with a custom background", async function () {
- const viewport = page.getViewport({ scale: 1 });
- const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
- const renderTask = page.render({
- canvasContext: canvasAndCtx.context,
- viewport,
- background: "rgba(255,0,0,1.0)",
- });
- await renderTask.promise;
- expect(getTopLeftPixel(canvasAndCtx.context)).toEqual({
- r: 255,
- g: 0,
- b: 0,
- a: 255,
- });
- CanvasFactory.destroy(canvasAndCtx);
- });
- });
- describe("custom ownerDocument", function () {
- const FontFace = globalThis.FontFace;
- const checkFont = font => /g_d\d+_f1/.test(font.family);
- const checkFontFaceRule = rule =>
- /^@font-face {font-family:"g_d\d+_f1";src:/.test(rule);
- beforeEach(() => {
- globalThis.FontFace = function MockFontFace(name) {
- this.family = name;
- };
- });
- afterEach(() => {
- globalThis.FontFace = FontFace;
- });
- function getMocks() {
- const elements = [];
- const createElement = name => {
- let element =
- typeof document !== "undefined" && document.createElement(name);
- if (name === "style") {
- element = {
- tagName: name,
- sheet: {
- cssRules: [],
- insertRule(rule) {
- this.cssRules.push(rule);
- },
- },
- };
- Object.assign(element, {
- remove() {
- this.remove.called = true;
- },
- });
- }
- elements.push(element);
- return element;
- };
- const ownerDocument = {
- fonts: new Set(),
- createElement,
- documentElement: {
- getElementsByTagName: () => [{ append: () => {} }],
- },
- };
- const CanvasFactory = new DefaultCanvasFactory({ ownerDocument });
- return {
- elements,
- ownerDocument,
- CanvasFactory,
- };
- }
- it("should use given document for loading fonts (with Font Loading API)", async function () {
- const { ownerDocument, elements, CanvasFactory } = getMocks();
- const getDocumentParams = buildGetDocumentParams(
- "TrueType_without_cmap.pdf",
- {
- disableFontFace: false,
- ownerDocument,
- }
- );
- const loadingTask = getDocument(getDocumentParams);
- const doc = await loadingTask.promise;
- const page = await doc.getPage(1);
- const viewport = page.getViewport({ scale: 1 });
- const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
- await page.render({
- canvasContext: canvasAndCtx.context,
- viewport,
- }).promise;
- const style = elements.find(element => element.tagName === "style");
- expect(style).toBeFalsy();
- expect(ownerDocument.fonts.size).toBeGreaterThanOrEqual(1);
- expect(Array.from(ownerDocument.fonts).find(checkFont)).toBeTruthy();
- await loadingTask.destroy();
- CanvasFactory.destroy(canvasAndCtx);
- expect(ownerDocument.fonts.size).toBe(0);
- });
- it("should use given document for loading fonts (with CSS rules)", async function () {
- const { ownerDocument, elements, CanvasFactory } = getMocks();
- ownerDocument.fonts = null;
- const getDocumentParams = buildGetDocumentParams(
- "TrueType_without_cmap.pdf",
- {
- disableFontFace: false,
- ownerDocument,
- }
- );
- const loadingTask = getDocument(getDocumentParams);
- const doc = await loadingTask.promise;
- const page = await doc.getPage(1);
- const viewport = page.getViewport({ scale: 1 });
- const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
- await page.render({
- canvasContext: canvasAndCtx.context,
- viewport,
- }).promise;
- const style = elements.find(element => element.tagName === "style");
- expect(style.sheet.cssRules.length).toBeGreaterThanOrEqual(1);
- expect(style.sheet.cssRules.find(checkFontFaceRule)).toBeTruthy();
- await loadingTask.destroy();
- CanvasFactory.destroy(canvasAndCtx);
- expect(style.remove.called).toBe(true);
- });
- });
|