function SVGContainer(src) { this.src = src; this.image = null; var self = this; this.promise = this.hasFabric().then(function() { return (self.isInline(src) ? Promise.resolve(self.inlineFormatting(src)) : XHR(src)); }).then(function(svg) { return new Promise(function(resolve) { html2canvas.fabric.loadSVGFromString(svg, self.createCanvas.call(self, resolve)); }); }); } SVGContainer.prototype.hasFabric = function() { return !html2canvas.fabric ? Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")) : Promise.resolve(); }; SVGContainer.prototype.inlineFormatting = function(src) { return (/^data:image\/svg\+xml;base64,/.test(src)) ? this.decode64(this.removeContentType(src)) : this.removeContentType(src); }; SVGContainer.prototype.removeContentType = function(src) { return src.replace(/^data:image\/svg\+xml(;base64)?,/,''); }; SVGContainer.prototype.isInline = function(src) { return (/^data:image\/svg\+xml/i.test(src)); }; SVGContainer.prototype.createCanvas = function(resolve) { var self = this; return function (objects, options) { var canvas = new html2canvas.fabric.StaticCanvas('c'); self.image = canvas.lowerCanvasEl; canvas .setWidth(options.width) .setHeight(options.height) .add(html2canvas.fabric.util.groupSVGElements(objects, options)) .renderAll(); resolve(canvas.lowerCanvasEl); }; }; SVGContainer.prototype.decode64 = function(str) { return (typeof(window.atob) === "function") ? window.atob(str) : decode64(str); }; /* * base64-arraybuffer * https://github.com/niklasvh/base64-arraybuffer * * Copyright (c) 2012 Niklas von Hertzen * Licensed under the MIT license. */ function decode64(base64) { var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var len = base64.length, i, encoded1, encoded2, encoded3, encoded4, byte1, byte2, byte3; var output = ""; for (i = 0; i < len; i+=4) { encoded1 = chars.indexOf(base64[i]); encoded2 = chars.indexOf(base64[i+1]); encoded3 = chars.indexOf(base64[i+2]); encoded4 = chars.indexOf(base64[i+3]); byte1 = (encoded1 << 2) | (encoded2 >> 4); byte2 = ((encoded2 & 15) << 4) | (encoded3 >> 2); byte3 = ((encoded3 & 3) << 6) | encoded4; if (encoded3 === 64) { output += String.fromCharCode(byte1); } else if (encoded4 === 64 || encoded4 === -1) { output += String.fromCharCode(byte1, byte2); } else{ output += String.fromCharCode(byte1, byte2, byte3); } } return output; }