mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
* initial typescript conversion * test: update overflow+transform ref test * fix: correctly render pseudo element content * fix: testrunner build * fix: karma test urls * test: update underline tests with <u> elements * test: update to es6-promise polyfill * test: remove watch from server * test: remove flow * format: update prettier for typescript * test: update eslint to use typescript parser * test: update linear gradient reftest * test: update test runner * test: update testrunner promise polyfill * fix: handle display: -webkit-flex correctly (fix #1817) * fix: correctly render gradients with clip & repeat (fix #1773) * fix: webkit-gradient function support * fix: implement radial gradients * fix: text-decoration rendering * fix: missing scroll positions for elements * ci: fix ios 11 tests * fix: ie logging * ci: improve device availability logging * fix: lint errors * ci: update to ios 12 * fix: check for console availability * ci: fix build dependency * test: update text reftests * fix: window reference for unit tests * feat: add hsl/hsla color support * fix: render options * fix: CSSKeyframesRule cssText Permission Denied on Internet Explorer 11 (#1830) * fix: option lint * fix: list type rendering * test: fix platform import * fix: ie css parsing for numbers * ci: add minified build * fix: form element rendering * fix: iframe rendering * fix: re-introduce experimental foreignobject renderer * fix: text-shadow rendering * feat: improve logging * fix: unit test logging * fix: cleanup resources * test: update overflow scrolling to work with ie * build: update build to include typings * fix: do not parse select element children * test: fix onclone test to work with older IEs * test: reduce reftest canvas sizes * test: remove dynamic setUp from list tests * test: update linear-gradient tests * build: remove old source files * build: update docs dependencies * build: fix typescript definition path * ci: include test.js on docs website
61 lines
2.4 KiB
TypeScript
61 lines
2.4 KiB
TypeScript
import {RenderOptions} from './canvas-renderer';
|
|
import {Logger} from '../../core/logger';
|
|
import {createForeignObjectSVG} from '../../core/features';
|
|
import {asString} from '../../css/types/color';
|
|
|
|
export class ForeignObjectRenderer {
|
|
canvas: HTMLCanvasElement;
|
|
ctx: CanvasRenderingContext2D;
|
|
options: RenderOptions;
|
|
|
|
constructor(options: RenderOptions) {
|
|
this.canvas = options.canvas ? options.canvas : document.createElement('canvas');
|
|
this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;
|
|
this.options = options;
|
|
this.canvas.width = Math.floor(options.width * options.scale);
|
|
this.canvas.height = Math.floor(options.height * options.scale);
|
|
this.canvas.style.width = `${options.width}px`;
|
|
this.canvas.style.height = `${options.height}px`;
|
|
|
|
this.ctx.scale(this.options.scale, this.options.scale);
|
|
this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);
|
|
Logger.getInstance(options.id).debug(
|
|
`EXPERIMENTAL ForeignObject renderer initialized (${options.width}x${options.height} at ${options.x},${
|
|
options.y
|
|
}) with scale ${options.scale}`
|
|
);
|
|
}
|
|
|
|
async render(element: HTMLElement) {
|
|
const svg = createForeignObjectSVG(
|
|
Math.max(this.options.windowWidth, this.options.width) * this.options.scale,
|
|
Math.max(this.options.windowHeight, this.options.height) * this.options.scale,
|
|
this.options.scrollX * this.options.scale,
|
|
this.options.scrollY * this.options.scale,
|
|
element
|
|
);
|
|
|
|
const img = await loadSerializedSVG(svg);
|
|
|
|
if (this.options.backgroundColor) {
|
|
this.ctx.fillStyle = asString(this.options.backgroundColor);
|
|
this.ctx.fillRect(0, 0, this.options.width * this.options.scale, this.options.height * this.options.scale);
|
|
}
|
|
|
|
this.ctx.drawImage(img, -this.options.x * this.options.scale, -this.options.y * this.options.scale);
|
|
|
|
return this.canvas;
|
|
}
|
|
}
|
|
|
|
export const loadSerializedSVG = (svg: Node): Promise<HTMLImageElement> =>
|
|
new Promise((resolve, reject) => {
|
|
const img = new Image();
|
|
img.onload = () => {
|
|
resolve(img);
|
|
};
|
|
img.onerror = reject;
|
|
|
|
img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(new XMLSerializer().serializeToString(svg))}`;
|
|
});
|