$(function(){ // initialize drawing status var shape = { status: false, color: 'rgba(19,88,163,1)', shadowColor: 'rgba(0,0,0,.25)', startX: 0, startY: 0, coords: [] }; // get the menu and buttons var $menu = $('#menu'); var $buttonClear = $('#menu .clear'); var $buttonSave = $('#menu .save'); var $colorButtons = $('#colors li a'); // get the canvas, set to full width var canvas = $('canvas')[0]; canvas.width = $(document).width(); canvas.height = $(document).height(); // get the context var ctx = canvas.getContext('2d'); // fill the initial canvas ctx.fillStyle = "#fffff3"; ctx.fillRect(0,0,canvas.width,canvas.height); // set the click event to start drawing $(canvas).click(function(e){ // 1. get the x,y just clicked var currentX = e.clientX; var currentY = e.clientY; // 2. if shape not drawn yet, set init values, hide menu, and draw start if ( !shape.status ) { $menu.hide(); // set fill, stroke, and shadow styles ctx.fillStyle = shape.color; ctx.strokeStyle = shape.color; ctx.lineWidth = 1; ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 0; ctx.shadowBlur = 1; ctx.shadowColor = shape.shadowColor; // draw the shape shape.status = true; shape.startX = currentX; shape.startY = currentY; ctx.beginPath(); ctx.moveTo(currentX, currentY); ctx.fillRect(currentX, currentY, 2, 2); } // 3. else, we can draw a line of our shape... else { // 3.a get the previous x,y clicked var lastX = shape.coords[shape.coords.length - 1][0]; var lastY = shape.coords[shape.coords.length - 1][1]; // 3.b draw the line ctx.lineTo(currentX, currentY); ctx.stroke(); // 3.c if this is within 10px of the initial coordinate and there are less than three points in the shape so far, close it and fill the shape and show menu again if ( Math.abs( shape.startX - currentX ) < 11 && Math.abs( shape.startY - currentY ) < 11 && shape.coords.length > 2 ) { ctx.lineTo( shape.startX, shape.startY); ctx.closePath(); ctx.stroke(); ctx.fill(); $menu.show(); // reset shape and wash your hands of it shape.status = false; shape.coords = []; return; } } // 4. add this coordinate to our array shape.coords.push([currentX,currentY]); }); // clear canvas when clear button clicked $buttonClear.click(function(){ ctx.fillStyle = "#fffff3"; ctx.fillRect(0,0,canvas.width,canvas.height); }); // open png in new window when save button clicked $buttonSave.click(function(){ window.open(canvas.toDataURL('image/png')); }); // change color of cut-out based on color button chosen $colorButtons.click(function(){ shape.color = $(this).css('background-color'); }); })