tools.Spray = function(e, cx, cxMain) {
            var radius = cx.lineWidth / 2;
            var area = radius * radius * Math.PI;
            var dotsPerTick = Math.ceil(area / 30);

            var currentPos = utils.relativePos(e, cx.canvas);

            var spray = setInterval(function() {
                for (var i = 0 ; i < dotsPerTick ; i += 1) {
                    var offset = utils.randomPointInRadius(radius);
                    cx.fillRect(currentPos.x + offset.x,
                                currentPos.y + offset.y, 1, 1);
                }
            }, 10);

            utils.trackDrag(
                null,
                function(e) {
                    currentPos = utils.relativePos(e, cx.canvas);
                },
                function() {
                    clearInterval(spray);
                    updateCanvas(cx, cxMain);
                }
            );
        }
        tools.Marker = function(e, cx, cxMain, onEnd) {
            cx.lineCap = 'round';

            var pos = utils.relativePos(e, cx.canvas);

            function draw(e) {
                cx.beginPath();
                cx.moveTo(pos.x, pos.y);
                pos = utils.relativePos(e, cx.canvas);
                cx.lineTo(pos.x, pos.y);
                cx.stroke();
                cx.closePath();
            }

            utils.trackDrag(
                draw,
                draw,
                function(e){
                    if (onEnd) {
                        onEnd(e);
                    }
                    updateCanvas(cx, cxMain);
                }
            );
        }
 function draw(e) {
     cx.beginPath();
     cx.moveTo(pos.x, pos.y);
     pos = utils.relativePos(e, cx.canvas);
     cx.lineTo(pos.x, pos.y);
     cx.stroke();
     cx.closePath();
 }
                function(e) {
                    cx.clearRect(0, 0, cx.canvas.width, cx.canvas.height);

                    var rect = utils.rectangleFrom(relativeStart, utils.relativePos(e, cx.canvas));

                    cx.beginPath();
                    cx.fillRect(rect.left, rect.top, rect.width, rect.height);
                    cx.closePath();
                },
                function(e) {
                    cx.clearRect(0, 0, cx.canvas.width, cx.canvas.height);

                    cx.beginPath();
                    cx.moveTo(startPos.x, startPos.y);
                    pos = utils.relativePos(e, cx.canvas);
                    cx.lineTo(pos.x, pos.y);
                    cx.stroke();
                    cx.closePath();
                },
                function(e) {
                    cx.clearRect(0, 0, cx.canvas.width, cx.canvas.height);

                    var circle = utils.getCircle(relativeStart, utils.relativePos(e, cx.canvas));

                    cx.beginPath();
                    cx.arc(circle.centerX, circle.centerY, circle.radius, 0, Math.PI*2, false);
                    cx.fill();
                    cx.closePath();
                },
        tools.Rectangle = function(e, cx, cxMain) {
            var relativeStart = utils.relativePos(e, cx.canvas);

            utils.trackDrag(
                null,
                function(e) {
                    cx.clearRect(0, 0, cx.canvas.width, cx.canvas.height);

                    var rect = utils.rectangleFrom(relativeStart, utils.relativePos(e, cx.canvas));

                    cx.beginPath();
                    cx.fillRect(rect.left, rect.top, rect.width, rect.height);
                    cx.closePath();
                },
                (e) => {
                    updateCanvas(cx, cxMain);
                }
            );
        }
        tools.Circle = function(e, cx, cxMain) {
            var relativeStart = utils.relativePos(e, cx.canvas);

            utils.trackDrag(
                null,
                function(e) {
                    cx.clearRect(0, 0, cx.canvas.width, cx.canvas.height);

                    var circle = utils.getCircle(relativeStart, utils.relativePos(e, cx.canvas));

                    cx.beginPath();
                    cx.arc(circle.centerX, circle.centerY, circle.radius, 0, Math.PI*2, false);
                    cx.fill();
                    cx.closePath();
                },
                (e) => {
                    updateCanvas(cx, cxMain);
                }
            );
        }
 function(e){
     startPos = utils.relativePos(e, cx.canvas);
 },
 function(e) {
     currentPos = utils.relativePos(e, cx.canvas);
 },