162 lines
4.4 KiB
JavaScript
162 lines
4.4 KiB
JavaScript
function magnifying(imgID, zoom) {
|
|
window.bgcolor = "#292930";
|
|
var img, glass, w, h, bw;
|
|
img = document.getElementById(imgID);
|
|
|
|
glass = document.createElement("CANVAS");
|
|
glass.setAttribute("class", "img-magnifier-glass");
|
|
glass.style.display = "none";
|
|
glass.setAttribute("width", "100");
|
|
glass.setAttribute("height", "100");
|
|
|
|
img.parentElement.appendChild(glass);
|
|
|
|
let scene = glass.getContext("2d");
|
|
// scene.textAlign = "center";
|
|
// scene.textBaseline = "middle";
|
|
// scene.font = "18px Arial";
|
|
window.lens = document.querySelector(".img-magnifier-glass");
|
|
|
|
let field = [];
|
|
let colors = {
|
|
"free" : "white",
|
|
"head" : "black",
|
|
"body" : "orange",
|
|
"apple" : "red"
|
|
}
|
|
let lens_width = window.getComputedStyle(window.lens).width.split("px")[0];
|
|
let cellSize = zoom;
|
|
let fieldWidth = Math.round(lens_width / cellSize);
|
|
let fieldHeight = Math.round(lens_width / cellSize);
|
|
|
|
for (let x = 0; x < fieldWidth; x++){
|
|
field[x] = [];
|
|
for(let y = 0; y < fieldWidth; y++){
|
|
field[x][y] = new Cell(scene, x, y, cellSize, "");
|
|
}
|
|
}
|
|
|
|
document.addEventListener("click", function(e){
|
|
// console.log(e.target.classList);
|
|
});
|
|
|
|
document.querySelector(".canvas-container").addEventListener("mousemove", function(e){
|
|
if(window.lens_move){
|
|
moveMagnifier(e);
|
|
}
|
|
});
|
|
|
|
// glass.addEventListener("touchmove", moveMagnifier);
|
|
// img.addEventListener("touchmove", moveMagnifier);
|
|
|
|
function moveMagnifier(e) {
|
|
var pos, x, y;
|
|
|
|
e.preventDefault();
|
|
pos = getCursorPos(e);
|
|
x = pos.x;
|
|
y = pos.y;
|
|
|
|
if(!x && !y){
|
|
return;
|
|
}
|
|
|
|
if (x > img.width - (w / zoom)) {x = img.width - (w / zoom);}
|
|
if (x < w / zoom) {x = w / zoom;}
|
|
if (y > img.height - (h / zoom)) {y = img.height - (h / zoom);}
|
|
if (y < h / zoom) {y = h / zoom;}
|
|
|
|
w = glass.offsetWidth;
|
|
h = glass.offsetHeight;
|
|
|
|
var luft = element_ico_size / 2 + 14;
|
|
|
|
var item = canvas.getActiveObject();
|
|
if(item && !item.is_background && item.line){
|
|
var param = text2Angle(item.line.x1, item.line.y1, item.line.x2, item.line.y2);
|
|
var alpha = param.ang;
|
|
|
|
var gap = Math.sqrt(w*w*2) / 2 + 15;
|
|
|
|
if(item.pointType == "arrow_start"){
|
|
var sign = -1;
|
|
}
|
|
if(item.pointType == "arrow_end"){
|
|
var sign = 1;
|
|
}
|
|
var direction = Math.sign(Math.cos(alpha*Math.PI/180));
|
|
var param = getRadiusCoords(x, y, sign*gap, (alpha + 45 * direction) * Math.PI/180);
|
|
glass.style.left = param.x + "px";
|
|
glass.style.top = param.y + "px";
|
|
}
|
|
else{
|
|
glass.style.left = x + "px";
|
|
glass.style.top = y + "px";
|
|
}
|
|
}
|
|
|
|
function getCursorPos(e) {
|
|
var a, x = 0, y = 0;
|
|
e = e || window.event;
|
|
a = img.getBoundingClientRect();
|
|
|
|
if(!mouse_down_flag){
|
|
x = e.pageX - a.left;
|
|
y = e.pageY - a.top;
|
|
var coords = {x : x, y : y};
|
|
}
|
|
|
|
|
|
var item = canvas.getActiveObject();
|
|
if(mouse_down_flag && item && (item.pointType == "arrow_start" || item.pointType == "arrow_end") ){
|
|
var t = canvas.viewportTransform;
|
|
if(item.pointType == "arrow_start"){
|
|
x = t[0] * item.line.x1 + t[4];
|
|
y = t[3] * item.line.y1 + t[5];
|
|
}
|
|
if(item.pointType == "arrow_end"){
|
|
x = t[0] * item.line.x2 + t[4];
|
|
y = t[3] * item.line.y2 + t[5];
|
|
}
|
|
}
|
|
|
|
if(mouse_down_flag){
|
|
if(x && y){
|
|
var coords = {x : x - a.left, y : y - a.top};
|
|
}
|
|
else{
|
|
var coords = {x : 0, y : 0};
|
|
}
|
|
}
|
|
drawCell( Math.round(x - fieldWidth/2), Math.round(y - fieldHeight/2), fieldWidth, fieldHeight, field );
|
|
|
|
return coords;
|
|
}
|
|
|
|
function drawCell(x0, y0, x1, y1, field){
|
|
|
|
var ctx = document.querySelector("#intro-canvas").getContext("2d");
|
|
|
|
var imgData = ctx.getImageData(x0 + Math.abs(1 - window.devicePixelRatio) * x0, y0 + Math.abs(1 - window.devicePixelRatio) * y0, x1, y1);
|
|
var pix = imgData.data;
|
|
|
|
for(var i = 0; i < pix.length; i+= 4){
|
|
var r = pix[i],
|
|
g = pix[i + 1],
|
|
b = pix[i + 2];
|
|
var y = Math.floor(i / (4 * x1));
|
|
var x = i / 4 - x1 * y;
|
|
if(pix[i + 3] == 0){ // альфа канал
|
|
field[x][y].value = bgcolor; // заменяем прозрачные пиксели на цвет фона
|
|
}
|
|
else{
|
|
field[x][y].value = `rgb(${r}, ${g}, ${b})`;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
export {magnifying};
|
|
|
|
|