canvas-designer
Version:
Collaborative, extendable, JavaScript Canvas2D drawing tool, supporting dozens of builtin tools, as well as generates JavaScript code for 2D animations.
227 lines (184 loc) • 6.17 kB
JavaScript
// _______________
// Canvas-Designer
// Open-Sourced: https://github.com/muaz-khan/Canvas-Designer
// --------------------------------------------------
// Muaz Khan - www.MuazKhan.com
// MIT License - www.WebRTC-Experiment.com/licence
// --------------------------------------------------
function CanvasDesigner() {
var designer = this;
designer.iframe = null;
var tools = {
line: true,
arrow: true,
pencil: true,
dragSingle: true,
dragMultiple: true,
eraser: true,
rectangle: true,
arc: true,
bezier: true,
quadratic: true,
text: true,
image: true,
pdf: true,
marker: true,
zoom: true,
lineWidth: true,
colorsPicker: true,
extraOptions: true,
code: true
};
designer.icons = {
line: null,
arrow: null,
pencil: null,
dragSingle: null,
dragMultiple: null,
eraser: null,
rectangle: null,
arc: null,
bezier: null,
quadratic: null,
text: null,
image: null,
pdf: null,
pdf_next: null,
pdf_prev: null,
pdf_close: null,
marker: null,
zoom: null,
lineWidth: null,
colorsPicker: null,
extraOptions: null,
code: null
};
var selectedIcon = 'pencil';
function syncData(data) {
if (!designer.iframe) return;
designer.postMessage({
canvasDesignerSyncData: data
});
}
var syncDataListener = function(data) {};
var dataURLListener = function(dataURL) {};
var captureStreamCallback = function() {};
function onMessage(event) {
if (!event.data || event.data.uid !== designer.uid) return;
if(!!event.data.sdp) {
webrtcHandler.createAnswer(event.data, function(response) {
if(response.sdp) {
designer.postMessage(response);
return;
}
captureStreamCallback(response.stream);
});
return;
}
if (!!event.data.canvasDesignerSyncData) {
designer.pointsLength = event.data.canvasDesignerSyncData.points.length;
syncDataListener(event.data.canvasDesignerSyncData);
return;
}
if (!!event.data.dataURL) {
dataURLListener(event.data.dataURL);
return;
}
}
function getRandomString() {
if (window.crypto && window.crypto.getRandomValues && navigator.userAgent.indexOf('Safari') === -1) {
var a = window.crypto.getRandomValues(new Uint32Array(3)),
token = '';
for (var i = 0, l = a.length; i < l; i++) {
token += a[i].toString(36);
}
return token;
} else {
return (Math.random() * new Date().getTime()).toString(36).replace(/\./g, '');
}
}
designer.uid = getRandomString();
designer.appendTo = function(parentNode, callback) {
callback = callback || function() {};
designer.iframe = document.createElement('iframe');
// designer load callback
designer.iframe.onload = function() {
callback();
callback = null;
};
designer.iframe.src = designer.widgetHtmlURL + '?widgetJsURL=' + designer.widgetJsURL + '&tools=' + JSON.stringify(tools) + '&selectedIcon=' + selectedIcon + '&icons=' + JSON.stringify(designer.icons);
designer.iframe.style.width = '100%';
designer.iframe.style.height = '100%';
designer.iframe.style.border = 0;
window.removeEventListener('message', onMessage);
window.addEventListener('message', onMessage, false);
parentNode.appendChild(designer.iframe);
};
designer.destroy = function() {
if (designer.iframe) {
designer.iframe.parentNode.removeChild(designer.iframe);
designer.iframe = null;
}
window.removeEventListener('message', onMessage);
};
designer.addSyncListener = function(callback) {
syncDataListener = callback;
};
designer.syncData = syncData;
designer.setTools = function(_tools) {
tools = _tools;
};
designer.setSelected = function(icon) {
if (typeof tools[icon] !== 'undefined') {
selectedIcon = icon;
}
};
designer.toDataURL = function(format, callback) {
dataURLListener = callback;
if (!designer.iframe) return;
designer.postMessage({
genDataURL: true,
format: format
});
};
designer.sync = function() {
if (!designer.iframe) return;
designer.postMessage({
syncPoints: true
});
};
designer.pointsLength = 0;
designer.undo = function(index) {
if (!designer.iframe) return;
designer.postMessage({
undo: true,
index: index || designer.pointsLength - 1 || -1
});
};
designer.postMessage = function(message) {
if (!designer.iframe) return;
message.uid = designer.uid;
designer.iframe.contentWindow.postMessage(message, '*');
};
designer.captureStream = function(callback) {
if (!designer.iframe) return;
captureStreamCallback = callback;
designer.postMessage({
captureStream: true
});
};
designer.clearCanvas = function () {
if (!designer.iframe) return;
designer.postMessage({
clearCanvas: true
});
};
designer.renderStream = function() {
if (!designer.iframe) return;
designer.postMessage({
renderStream: true
});
};
designer.widgetHtmlURL = 'widget.html';
designer.widgetJsURL = 'widget.min.js';
}