Graph database Analysis of the Steam Network
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

122 lines
3.2 KiB

;(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);