| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /**
- * WHITEBOPHIR
- *********************************************************
- * @licstart The following is the entire license notice for the
- * JavaScript code in this page.
- *
- * Copyright (C) 2013 Ophir LOJKINE
- *
- *
- * The JavaScript code in this page is free software: you can
- * redistribute it and/or modify it under the terms of the GNU
- * General Public License (GNU GPL) as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. The code is distributed WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
- *
- * As additional permission under GNU GPL version 3 section 7, you
- * may distribute non-source (e.g., minimized or compacted) forms of
- * that code without the copy of the GNU GPL normally required by
- * section 4, provided you include this license notice and a URL
- * through which recipients can access the Corresponding Source.
- *
- * @licend
- */
-
- (function () { //Code isolation
- //Indicates the id of the line the user is currently drawing or an empty string while the user is not drawing
- var curLine = null,
- lastTime = performance.now(); //The time at which the last point was drawn
-
- //The data of the message that will be sent for every update
- function UpdateMessage(x, y) {
- this.type = 'update';
- this.id = curLine.id;
- this.x2 = x;
- this.y2 = y;
- }
-
- function startLine(x, y, evt) {
-
- //Prevent the press from being interpreted by the browser
- evt.preventDefault();
-
- curLine = {
- 'type': 'straight',
- 'id': Tools.generateUID("s"), //"s" for straight line
- 'color': Tools.getColor(),
- 'size': Tools.getSize(),
- 'opacity': Tools.getOpacity(),
- 'x': x,
- 'y': y
- }
-
- Tools.drawAndSend(curLine);
- }
-
- function continueLine(x, y, evt) {
- /*Wait 70ms before adding any point to the currently drawing line.
- This allows the animation to be smother*/
- if (curLine !== null) {
- if (lineTool.secondary.active) {
- var alpha = Math.atan2(y - curLine.y, x - curLine.x);
- var d = Math.hypot(y - curLine.y, x - curLine.x);
- var increment = 2 * Math.PI / 16;
- alpha = Math.round(alpha / increment) * increment;
- x = curLine.x + d * Math.cos(alpha);
- y = curLine.y + d * Math.sin(alpha);
- }
- if (performance.now() - lastTime > 70) {
- Tools.drawAndSend(new UpdateMessage(x, y));
- lastTime = performance.now();
- } else {
- draw(new UpdateMessage(x, y));
- }
- }
- if (evt) evt.preventDefault();
- }
-
- function stopLine(x, y) {
- //Add a last point to the line
- continueLine(x, y);
- curLine = null;
- }
-
- function draw(data) {
- switch (data.type) {
- case "straight":
- createLine(data);
- break;
- case "update":
- var line = svg.getElementById(data['id']);
- if (!line) {
- console.error("Straight line: Hmmm... I received a point of a line that has not been created (%s).", data['id']);
- createLine({ //create a new line in order not to loose the points
- "id": data['id'],
- "x": data['x2'],
- "y": data['y2']
- });
- }
- updateLine(line, data);
- break;
- default:
- console.error("Straight Line: Draw instruction with unknown type. ", data);
- break;
- }
- }
-
- var svg = Tools.svg;
- function createLine(lineData) {
- //Creates a new line on the canvas, or update a line that already exists with new information
- var line = svg.getElementById(lineData.id) || Tools.createSVGElement("line");
- line.id = lineData.id;
- line.x1.baseVal.value = lineData['x'];
- line.y1.baseVal.value = lineData['y'];
- line.x2.baseVal.value = lineData['x2'] || lineData['x'];
- line.y2.baseVal.value = lineData['y2'] || lineData['y'];
- //If some data is not provided, choose default value. The line may be updated later
- line.setAttribute("stroke", lineData.color || "black");
- line.setAttribute("stroke-width", lineData.size || 10);
- line.setAttribute("opacity", Math.max(0.1, Math.min(1, lineData.opacity)) || 1);
- Tools.drawingArea.appendChild(line);
- return line;
- }
-
- function updateLine(line, data) {
- line.x2.baseVal.value = data['x2'];
- line.y2.baseVal.value = data['y2'];
- }
-
- var lineTool = {
- "name": "Straight line",
- "shortcut": "l",
- "listeners": {
- "press": startLine,
- "move": continueLine,
- "release": stopLine,
- },
- "secondary": {
- "name": "Straight line",
- "icon": "tools/line/icon-straight.svg",
- "active": false,
- },
- "draw": draw,
- "mouseCursor": "crosshair",
- "icon": "tools/line/icon.svg",
- "stylesheet": "tools/line/line.css"
- };
- Tools.add(lineTool);
- })(); //End of code isolation
|