UNPKG

html2canvas

Version:
79 lines (62 loc) 3.74 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ForeignObjectRenderer = function () { function ForeignObjectRenderer(element) { _classCallCheck(this, ForeignObjectRenderer); this.element = element; } _createClass(ForeignObjectRenderer, [{ key: 'render', value: function render(options) { var _this = this; this.options = options; this.canvas = document.createElement('canvas'); this.ctx = this.canvas.getContext('2d'); 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'; options.logger.log('ForeignObject renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + options.scale); var svg = createForeignObjectSVG(Math.max(options.windowWidth, options.width) * options.scale, Math.max(options.windowHeight, options.height) * options.scale, options.scrollX * options.scale, options.scrollY * options.scale, this.element); return loadSerializedSVG(svg).then(function (img) { if (options.backgroundColor) { _this.ctx.fillStyle = options.backgroundColor.toString(); _this.ctx.fillRect(0, 0, options.width * options.scale, options.height * options.scale); } _this.ctx.drawImage(img, -options.x * options.scale, -options.y * options.scale); return _this.canvas; }); } }]); return ForeignObjectRenderer; }(); exports.default = ForeignObjectRenderer; var createForeignObjectSVG = exports.createForeignObjectSVG = function createForeignObjectSVG(width, height, x, y, node) { var xmlns = 'http://www.w3.org/2000/svg'; var svg = document.createElementNS(xmlns, 'svg'); var foreignObject = document.createElementNS(xmlns, 'foreignObject'); svg.setAttributeNS(null, 'width', width); svg.setAttributeNS(null, 'height', height); foreignObject.setAttributeNS(null, 'width', '100%'); foreignObject.setAttributeNS(null, 'height', '100%'); foreignObject.setAttributeNS(null, 'x', x); foreignObject.setAttributeNS(null, 'y', y); foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true'); svg.appendChild(foreignObject); foreignObject.appendChild(node); return svg; }; var loadSerializedSVG = exports.loadSerializedSVG = function loadSerializedSVG(svg) { return new Promise(function (resolve, reject) { var img = new Image(); img.onload = function () { return resolve(img); }; img.onerror = reject; img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg)); }); };