const gridSize = 14; var cellSizeX = null; var cellSizeY = null; var inputImage = null; var image_bef = null; var image_aft = null; var canvas_before = null; var canvas_after = null; var ctx_bef = null; var ctx_aft = null; var canvasBg_bef = null; var canvasBg_aft = null; let grid_bef = new Array(gridSize).fill(null).map(() => new Array(gridSize).fill(false)); let grid_aft = new Array(gridSize).fill(null).map(() => new Array(gridSize).fill(false)); var isInitialized_bef = false; var isInitialized_aft = false; let selectedCells_bef = 0; let selectedCells_aft = 0; function createGridBefore() { console.log('createGrid') for (let i = 0; i < 196; i++) { const div = document.createElement('div'); div.classList.add('checkbox'); div.innerHTML = ''; grid_bef.appendChild(div); } } function createGridAfter() { console.log('createGrid') for (let i = 0; i < 196; i++) { const div = document.createElement('div'); div.classList.add('checkbox'); div.innerHTML = ''; grid_aft.appendChild(div); } } function loadImageBefore(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = function (e) { image_bef.src = e.target.result; } reader.readAsDataURL(file); } function loadImageAfter(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = function (e) { image_aft.src = e.target.result; } reader.readAsDataURL(file); } function handleMouseDown(event) { // console.log("handleMouseDown"); } function handleMouseMove(event) { // console.log("handleMouseMove"); } function handleMouseUp(event) { // console.log("handleMouseUp"); } function handleMouseLeave(event) { // console.log("handleMouseLeave"); } function drawGridBefore() { ctx_bef.clearRect(0, 0, canvas_before.width, canvas_before.height); drawBackgroundBefore(); for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { ctx_bef.beginPath(); ctx_bef.rect(col * cellSizeX, row * cellSizeY, cellSizeX, cellSizeY); ctx_bef.strokeStyle = 'black'; ctx_bef.lineWidth = 1; ctx_bef.stroke(); if (grid_bef[row][col]) { ctx_bef.fillStyle = 'rgba(0, 255, 0, 0.5)'; ctx_bef.fillRect(col * cellSizeX, row * cellSizeY, cellSizeX, cellSizeY); } } } } function drawGridAfter() { ctx_aft.clearRect(0, 0, canvas_after.width, canvas_after.height); drawBackgroundAfter(); for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { ctx_aft.beginPath(); ctx_aft.rect(col * cellSizeX, row * cellSizeY, cellSizeX, cellSizeY); ctx_aft.strokeStyle = 'black'; ctx_aft.lineWidth = 1; ctx_aft.stroke(); if (grid_aft[row][col]) { ctx_aft.fillStyle = 'rgba(0, 255, 0, 0.5)'; ctx_aft.fillRect(col * cellSizeX, row * cellSizeY, cellSizeX, cellSizeY); } } } } function initializeEditorBefore() { console.log("initializeEditorBefore"); if (isInitialized_bef) { return; } isInitialized_bef = true; // image_bef = document.getElementById('image-before'); // Add click event listener to canvas canvas_before.addEventListener('mousedown', handleMouseDown); canvas_before.addEventListener('mousemove', handleMouseMove); canvas_before.addEventListener('mouseup', handleMouseUp); canvas_before.addEventListener('mouseleave', handleMouseLeave); canvas_before.addEventListener('click', (event) => { const rect = canvas_before.getBoundingClientRect(); const scaleX = canvas_before.width / rect.width; const scaleY = canvas_before.height / rect.height; const x = (event.clientX - rect.left) * scaleX; const y = (event.clientY - rect.top) * scaleY; const row = Math.floor(y / cellSizeY); const col = Math.floor(x / cellSizeX); // If the cell is already selected, it's always allowed to deselect it if (grid_bef[row][col]) { grid_bef[row][col] = false; selectedCells_bef--; // Decrement the selected cell count } else { // Only select a new cell if less than 50 cells are already selected if (selectedCells_bef < 197) { grid_bef[row][col] = true; selectedCells_bef++; // Increment the selected cell count } } drawGridBefore(); }); drawGridBefore(); } function initializeEditorAfter() { console.log("initializeEditorAfter"); if (isInitialized_aft) { return; } isInitialized_aft = true; // image_aft = document.getElementById('image-after'); // Add click event listener to canvas canvas_after.addEventListener('mousedown', handleMouseDown); canvas_after.addEventListener('mousemove', handleMouseMove); canvas_after.addEventListener('mouseup', handleMouseUp); canvas_after.addEventListener('mouseleave', handleMouseLeave); canvas_after.addEventListener('click', (event) => { const rect = canvas_after.getBoundingClientRect(); const scaleX = canvas_after.width / rect.width; const scaleY = canvas_after.height / rect.height; const x = (event.clientX - rect.left) * scaleX; const y = (event.clientY - rect.top) * scaleY; const row = Math.floor(y / cellSizeY); const col = Math.floor(x / cellSizeX); // If the cell is already selected, it's always allowed to deselect it if (grid_aft[row][col]) { grid_aft[row][col] = false; selectedCells_aft--; // Decrement the selected cell count } else { // Only select a new cell if less than 50 cells are already selected if (selectedCells_aft < 197) { grid_aft[row][col] = true; selectedCells_aft++; // Increment the selected cell count } } drawGridAfter(); }); drawGridAfter(); } function drawBackgroundBefore() { if (canvasBg_bef != null) { const canvasWidth = canvas_before.width; const canvasHeight = canvas_before.height; const bgWidth = canvasBg_bef.width; const bgHeight = canvasBg_bef.height; const scaleX = canvasWidth / bgWidth; const scaleY = canvasHeight / bgHeight; const scale = Math.min(scaleX, scaleY); const newWidth = bgWidth * scale; const newHeight = bgHeight * scale; const xOffset = (canvasWidth - newWidth) / 2; const yOffset = (canvasHeight - newHeight) / 2; ctx_bef.drawImage(canvasBg_bef, 0, 0, bgWidth, bgHeight, xOffset, yOffset, newWidth, newHeight); } } function drawBackgroundAfter() { if (canvasBg_aft != null) { const canvasWidth = canvas_after.width; const canvasHeight = canvas_after.height; const bgWidth = canvasBg_aft.width; const bgHeight = canvasBg_aft.height; const scaleX = canvasWidth / bgWidth; const scaleY = canvasHeight / bgHeight; const scale = Math.min(scaleX, scaleY); const newWidth = bgWidth * scale; const newHeight = bgHeight * scale; const xOffset = (canvasWidth - newWidth) / 2; const yOffset = (canvasHeight - newHeight) / 2; ctx_aft.drawImage(canvasBg_aft, 0, 0, bgWidth, bgHeight, xOffset, yOffset, newWidth, newHeight); } } function importBackgroundBefore(image_bef) { canvas_before = document.getElementById('before'); ctx_bef = canvas_before.getContext('2d'); if (image_bef == null) { canvasBg_bef = null; drawGridBefore(); return; } let m = new Image(); m.src = image_bef; m.onload = function () { canvasBg_bef = m; canvas_before.width = m.width; canvas_before.height = m.height; cellSizeX = canvas_before.width / gridSize; cellSizeY = canvas_before.height / gridSize; drawGridBefore(); } } function importBackgroundAfter(image_after) { canvas_after = document.getElementById('after'); ctx_aft = canvas_after.getContext('2d'); if (image_after == null) { canvasBg_aft = null; drawGridAfter(); return; } let m = new Image(); m.src = image_after; m.onload = function () { canvas_after.width = m.width; canvas_after.height = m.height; cellSizeX = canvas_after.width / gridSize; cellSizeY = canvas_after.height / gridSize; canvasBg_aft = m; drawGridAfter(); } } function read_js_Data_bef() { console.log("read_js_Data"); console.log("read_js_Data"); console.log("read_js_Data"); console.log("read_js_Data"); console.log("read_js_Data"); return grid_bef; } function read_js_Data_aft() { console.log("read_js_Data"); console.log("read_js_Data"); console.log("read_js_Data"); console.log("read_js_Data"); console.log("read_js_Data"); return grid_aft; } function set_grid_from_data(data) { if (data.length !== gridSize || data[0].length !== gridSize) { throw new Error('Invalid data dimensions. Expected ' + gridSize + 'x' + gridSize); } selectedCells = 0; // Reset the selected cell count for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { grid[row][col] = data[row][col]; if (grid[row][col]) { selectedCells++; // Count the number of initially selected cells } } } drawGrid(); } function clear_grid() { console.log("clearGrid"); for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { grid[row][col] = false; } } selectedCells = 0; // Reset the selected cell count drawGrid(); }