Spaces:
Running
Running
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 = '<input type="checkbox">'; | |
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 = '<input type="checkbox">'; | |
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(); | |
} |