;(function(undefined) { /** * Sigma Renderer Snapshot Utility * ================================ * * The aim of this plugin is to enable users to retrieve a static image * of the graph being rendered. * * Author: Guillaume Plique (Yomguithereal) * Version: 0.0.1 */ // Terminating if sigma were not to be found if (typeof sigma === 'undefined') throw 'sigma.renderers.snapshot: sigma not in scope.'; // Constants var CONTEXTS = ['scene', 'edges', 'nodes', 'labels'], TYPES = { png: 'image/png', jpg: 'image/jpeg', gif: 'image/gif', tiff: 'image/tiff' }; // Utilities function download(dataUrl, extension, filename) { // Anchor var anchor = document.createElement('a'); anchor.setAttribute('href', dataUrl); anchor.setAttribute('download', filename || 'graph.' + extension); // Click event var event = document.createEvent('MouseEvent'); event.initMouseEvent('click', true, false, window, 0, 0, 0 ,0, 0, false, false, false, false, 0, null); anchor.dispatchEvent(event); delete anchor; } // Main function function snapshot(params) { params = params || {}; // Enforcing if (params.format && !(params.format in TYPES)) throw Error('sigma.renderers.snaphot: unsupported format "' + params.format + '".'); var self = this, webgl = this instanceof sigma.renderers.webgl, doneContexts = []; // Creating a false canvas where we'll merge the other var merged = document.createElement('canvas'), mergedContext = merged.getContext('2d'), sized = false; // Iterating through context CONTEXTS.forEach(function(name) { if (!self.contexts[name]) return; if (params.labels === false && name === 'labels') return; var canvas = self.domElements[name] || self.domElements['scene'], context = self.contexts[name]; if (~doneContexts.indexOf(context)) return; if (!sized) { merged.width = webgl && context instanceof WebGLRenderingContext ? canvas.width / 2 : canvas.width; merged.height = webgl && context instanceof WebGLRenderingContext ? canvas.height / 2 : canvas.height sized = true; // Do we want a background color? if (params.background) { mergedContext.rect(0, 0, merged.width, merged.height); mergedContext.fillStyle = params.background; mergedContext.fill(); } } if (context instanceof WebGLRenderingContext) mergedContext.drawImage(canvas, 0, 0, canvas.width / 2, canvas.height / 2); else mergedContext.drawImage(canvas, 0, 0); doneContexts.push(context); }); var dataUrl = merged.toDataURL(TYPES[params.format || 'png']); if (params.download) download( dataUrl, params.format || 'png', params.filename ); // Cleaning delete mergedContext; delete merged; delete doneContexts; return dataUrl; } // Extending canvas and webl renderers sigma.renderers.canvas.prototype.snapshot = snapshot; sigma.renderers.webgl.prototype.snapshot = snapshot; }).call(this);