white / client-data /tools /rect /rect.js
hanahana05's picture
Upload folder using huggingface_hub
34e0b30 verified
/**
* 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 shape the user is currently drawing or an empty string while the user is not drawing
var end = false,
curId = "",
curUpdate = {
//The data of the message that will be sent for every new point
type: "update",
id: "",
x: 0,
y: 0,
x2: 0,
y2: 0,
},
lastTime = performance.now(); //The time at which the last point was drawn
function start(x, y, evt) {
//Prevent the press from being interpreted by the browser
evt.preventDefault();
curId = Tools.generateUID("r"); //"r" for rectangle
Tools.drawAndSend({
type: "rect",
id: curId,
color: Tools.getColor(),
size: Tools.getSize(),
opacity: Tools.getOpacity(),
x: x,
y: y,
x2: x,
y2: y,
});
curUpdate.id = curId;
curUpdate.x = x;
curUpdate.y = y;
}
function move(x, y, evt) {
/*Wait 70ms before adding any point to the currently drawing shape.
This allows the animation to be smother*/
if (curId !== "") {
if (rectangleTool.secondary.active) {
var dx = x - curUpdate.x;
var dy = y - curUpdate.y;
var d = Math.max(Math.abs(dx), Math.abs(dy));
x = curUpdate.x + (dx > 0 ? d : -d);
y = curUpdate.y + (dy > 0 ? d : -d);
}
curUpdate["x2"] = x;
curUpdate["y2"] = y;
if (performance.now() - lastTime > 70 || end) {
Tools.drawAndSend(curUpdate);
lastTime = performance.now();
} else {
draw(curUpdate);
}
}
if (evt) evt.preventDefault();
}
function stop(x, y) {
//Add a last point to the shape
end = true;
move(x, y);
end = false;
curId = "";
}
function draw(data) {
Tools.drawingEvent = true;
switch (data.type) {
case "rect":
createShape(data);
break;
case "update":
var shape = svg.getElementById(data["id"]);
if (!shape) {
console.error(
"Straight shape: Hmmm... I received a point of a rect that has not been created (%s).",
data["id"],
);
createShape({
//create a new shape in order not to loose the points
id: data["id"],
x: data["x2"],
y: data["y2"],
});
}
updateShape(shape, data);
break;
default:
console.error(
"Straight shape: Draw instruction with unknown type. ",
data,
);
break;
}
}
var svg = Tools.svg;
function createShape(data) {
//Creates a new shape on the canvas, or update a shape that already exists with new information
var shape = svg.getElementById(data.id) || Tools.createSVGElement("rect");
shape.id = data.id;
updateShape(shape, data);
//If some data is not provided, choose default value. The shape may be updated later
shape.setAttribute("stroke", data.color || "black");
shape.setAttribute("stroke-width", data.size || 10);
shape.setAttribute(
"opacity",
Math.max(0.1, Math.min(1, data.opacity)) || 1,
);
Tools.drawingArea.appendChild(shape);
return shape;
}
function updateShape(shape, data) {
shape.x.baseVal.value = Math.min(data["x2"], data["x"]);
shape.y.baseVal.value = Math.min(data["y2"], data["y"]);
shape.width.baseVal.value = Math.abs(data["x2"] - data["x"]);
shape.height.baseVal.value = Math.abs(data["y2"] - data["y"]);
}
var rectangleTool = {
name: "Rectangle",
shortcut: "r",
listeners: {
press: start,
move: move,
release: stop,
},
secondary: {
name: "Square",
icon: "tools/rect/icon-square.svg",
active: false,
},
draw: draw,
mouseCursor: "crosshair",
icon: "tools/rect/icon.svg",
stylesheet: "tools/rect/rect.css",
};
Tools.add(rectangleTool);
})(); //End of code isolation