/* Stamp mode will paste a stamp onto the canvas */ define([], function() { function initGui() { PaintApp.elements.stampsButton = document.getElementById('stamps-button'); PaintApp.paletteModesButtons.push(PaintApp.elements.stampsButton); PaintApp.elements.stampsButton.addEventListener('click', function() { PaintApp.paletteRemoveActiveClass(); PaintApp.addActiveClassToElement(PaintApp.elements.stampsButton); PaintApp.switchMode('Stamp'); }); /* We handle changes from the stamp palette */ function onStampChange(event) { PaintApp.data.stamp = event.detail.stamp; PaintApp.data.stampBase = event.detail.stampBase; if (event.detail.proportionnal && event.detail.proportionnal === 'true') { PaintApp.data.stampProportionnal = true; } else { PaintApp.data.stampProportionnal = false; } } var stampPalette = new PaintApp.palettes.stampPalette.StampPalette(PaintApp.elements.stampsButton, undefined); stampPalette.addEventListener('stampChange', onStampChange); var stampInvoker = stampPalette.getPalette().querySelector('.palette-invoker'); stampPalette.setStamp(0); } //Handle the coloring of a SVG (specific header required) function changeColors(iconData, fillColor, strokeColor) { var fillColorRegex = //g; var strokeColorRegex = //g; iconData = iconData.replace(fillColorRegex, ''); iconData = iconData.replace(strokeColorRegex, ''); return iconData; } var Stamp = { initGui: initGui, changeColors: changeColors, defaultSize: 80, onMouseDown: function(event) { return function() { PaintApp.modes.Stamp.releasedFinger = false; PaintApp.handleCurrentFloatingElement(); var width = PaintApp.modes.Stamp.defaultSize; var height = PaintApp.modes.Stamp.defaultSize; var left = event.point.x - width / 2 + 'px'; var top = event.point.y + 55 - height / 2 + 'px'; /* Calculation of the svg url */ var url = window.location.href.split('/'); url.pop(); url = url.join('/') + '/' + PaintApp.data.stamp; var ctx = PaintApp.elements.canvas.getContext('2d'); var p = event.point; /* Http request to load the stamp */ var request = new XMLHttpRequest(); request.open('GET', url, true); request.onload = function(e) { if (request.status === 200 || request.status === 0) { var imgSRC = request.responseText; /* We change the color of the stamp to match ours */ imgSRC = changeColors(imgSRC, PaintApp.data.color.fill, PaintApp.data.color.stroke); /* We add a floating element image with the stamp */ var element = document.createElement('img'); element.style.backgroundRepeat = 'no-repeat'; element.style.backgroundSize = 'contain'; element.src = 'data:image/svg+xml;base64,' + btoa(imgSRC); element.style.width = width + 'px'; element.style.height = height + 'px'; element.style.position = 'absolute'; element.style.left = left; element.style.padding = '0px'; element.style.border = '5px dotted #500'; element.style.resize = 'both'; element.style.top = top; document.body.appendChild(element); /* We store the floating element */ PaintApp.data.currentElement = { type: 'stamp', element: element, proportionnal: PaintApp.data.stampProportionnal, startPoint: { x: parseInt(element.style.left) + element.getBoundingClientRect().width / 2, y: parseInt(element.style.top) + element.getBoundingClientRect().height / 2 } }; /* This will prevent bugs for mobile platforms if the user just do a single tap we won't get onMouseDrag and onMouseUp correctly*/ if (PaintApp.modes.Stamp.releasedFinger) { var ctx = PaintApp.elements.canvas.getContext('2d'); /* We draw the stamp to the canvas where the user clicked */ ctx.drawImage(PaintApp.data.currentElement.element, 5 + PaintApp.data.currentElement.element.getBoundingClientRect().left, PaintApp.data.currentElement.element.getBoundingClientRect().top - 55 + 5); /* If the activity is shared we send the element to everyone */ if (PaintApp.data.isShared) { var drawImage = { stampBase: PaintApp.data.stampBase, color: { fill: PaintApp.data.color.fill, stroke: PaintApp.data.color.stroke }, left: PaintApp.data.currentElement.element.getBoundingClientRect().left, top: PaintApp.data.currentElement.element.getBoundingClientRect().top - 55 + 5, width: PaintApp.data.currentElement.element.getBoundingClientRect().width, height: PaintApp.data.currentElement.element.getBoundingClientRect().height }; PaintApp.collaboration.sendMessage({ action: 'drawStamp', data: drawImage }); } PaintApp.data.currentElement.element.parentElement.removeChild(PaintApp.data.currentElement.element); PaintApp.data.currentElement = undefined; PaintApp.saveCanvas(); } } }; request.send(null); }(); }, onMouseDrag: function(event) { if (!PaintApp.data.currentElement) { return; } /* We will resize the floating element with the mouse drag */ var distanceX = Math.abs(event.point.x - PaintApp.data.currentElement.startPoint.x); var distanceY = Math.abs(event.point.y - PaintApp.data.currentElement.startPoint.y + 55); if (distanceX > distanceY) { distance = distanceX; } else { distance = distanceY; } /* The resize can be kept proportionnal or not (this is configured inside the stamp palette) */ if (PaintApp.data.stampProportionnal) { PaintApp.data.currentElement.element.style.width = PaintApp.modes.Stamp.defaultSize + distance + 'px'; PaintApp.data.currentElement.element.style.height = PaintApp.modes.Stamp.defaultSize + distance + 'px'; } else { PaintApp.data.currentElement.element.style.width = PaintApp.modes.Stamp.defaultSize + distanceX + 'px'; PaintApp.data.currentElement.element.style.height = PaintApp.modes.Stamp.defaultSize + distanceY + 'px'; } PaintApp.data.currentElement.element.style.left = PaintApp.data.currentElement.startPoint.x - PaintApp.data.currentElement.element.getBoundingClientRect().width / 2 + 'px'; PaintApp.data.currentElement.element.style.top = PaintApp.data.currentElement.startPoint.y - PaintApp.data.currentElement.element.getBoundingClientRect().height / 2 + 'px'; }, onMouseUp: function(event) { PaintApp.modes.Stamp.releasedFinger = true; if (!PaintApp.data.currentElement) { return; } var ctx = PaintApp.elements.canvas.getContext('2d'); /* We draw the stamp to the canvas where the user clicked */ ctx.drawImage(PaintApp.data.currentElement.element, PaintApp.data.currentElement.element.getBoundingClientRect().left, PaintApp.data.currentElement.element.getBoundingClientRect().top - 55, PaintApp.data.currentElement.element.getBoundingClientRect().width, PaintApp.data.currentElement.element.getBoundingClientRect().height); /* If the activity is shared we send the element to everyone */ if (PaintApp.data.isShared) { var drawImage = { stampBase: PaintApp.data.stampBase, color: { fill: PaintApp.data.color.fill, stroke: PaintApp.data.color.stroke }, left: PaintApp.data.currentElement.element.getBoundingClientRect().left, top: PaintApp.data.currentElement.element.getBoundingClientRect().top - 55, width: PaintApp.data.currentElement.element.getBoundingClientRect().width, height: PaintApp.data.currentElement.element.getBoundingClientRect().height }; PaintApp.collaboration.sendMessage({ action: 'drawStamp', data: drawImage }); } PaintApp.data.currentElement.element.parentElement.removeChild(PaintApp.data.currentElement.element); PaintApp.data.currentElement = undefined; PaintApp.saveCanvas(); } }; return Stamp; });