define(() => { 'use strict'; // Thanks, https://stackoverflow.com/a/23522755/1180785 const safari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // Thanks, https://stackoverflow.com/a/9851769/1180785 const firefox = (typeof window.InstallTrigger !== 'undefined'); return class Exporter { constructor() { this.latestSVG = null; this.latestInternalSVG = null; this.canvas = null; this.context = null; this.indexPNG = 0; this.latestPNGIndex = 0; this.latestPNG = null; } getSVGContent(renderer, size = null) { let code = renderer.svg().outerHTML; if(firefox && size) { // Firefox fails to render SVGs unless they have size // attributes on the tag code = code.replace( /^ { this.canvas.width = width; this.canvas.height = height; this.context.drawImage(img, 0, 0); if(safariHackaround) { document.body.removeChild(safariHackaround); } this.canvas.toBlob(callback, 'image/png'); }; img.addEventListener('load', () => { if(safariHackaround) { // Wait for custom fonts to load (Safari takes a moment) setTimeout(render, 50); } else { render(); } }, {once: true}); img.src = this.getSVGURL(renderer, {width, height}); } getPNGURL(renderer, resolution, callback) { ++ this.indexPNG; const index = this.indexPNG; this.getPNGBlob(renderer, resolution, (blob) => { const url = URL.createObjectURL(blob); const isLatest = index >= this.latestPNGIndex; if(isLatest) { if(this.latestPNG) { URL.revokeObjectURL(this.latestPNG); } this.latestPNG = url; this.latestPNGIndex = index; callback(url, true); } else { callback(url, false); URL.revokeObjectURL(url); } }); } }; });