add function to set given rectangular area on canvas to protect or not
This commit is contained in:
parent
ce293974a8
commit
71c5caaec6
|
@ -166,3 +166,72 @@ export async function imagemask2Canvas(
|
||||||
}
|
}
|
||||||
logger.info('Imagemask loading done.');
|
logger.info('Imagemask loading done.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set an area of the canvas to protected
|
||||||
|
* @param canvasId numerical ID of canvas
|
||||||
|
* @param x X coordinate on canvas
|
||||||
|
* @param y Y coordinate on canvas
|
||||||
|
* @param width Width of image
|
||||||
|
* @param height height of image
|
||||||
|
*/
|
||||||
|
export async function protectCanvasArea(
|
||||||
|
canvasId: number,
|
||||||
|
x: number,
|
||||||
|
y: number,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
protect: boolean = true,
|
||||||
|
) {
|
||||||
|
logger.info(
|
||||||
|
// eslint-disable-next-line max-len
|
||||||
|
`Setting protection ${protect} with size ${width} / ${height} to ${x} / ${y}`,
|
||||||
|
);
|
||||||
|
const canvas = canvases[canvasId];
|
||||||
|
const canvasMinXY = -(canvas.size / 2);
|
||||||
|
|
||||||
|
const [ucx, ucy] = getChunkOfPixel(canvas.size, x, y);
|
||||||
|
const [lcx, lcy] = getChunkOfPixel(canvas.size, x + width, y + height);
|
||||||
|
|
||||||
|
let chunk;
|
||||||
|
for (let cx = ucx; cx <= lcx; cx += 1) {
|
||||||
|
for (let cy = ucy; cy <= lcy; cy += 1) {
|
||||||
|
chunk = await RedisCanvas.getChunk(canvasId, cx, cy);
|
||||||
|
if (!chunk) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
chunk = new Uint8Array(chunk);
|
||||||
|
// offset of area in chunk
|
||||||
|
const cOffX = x - cx * TILE_SIZE + canvasMinXY;
|
||||||
|
const cOffY = y - cy * TILE_SIZE + canvasMinXY;
|
||||||
|
const cOffXE = cOffX + width;
|
||||||
|
const cOffYE = cOffY + height;
|
||||||
|
const startX = (cOffX > 0) ? cOffX : 0;
|
||||||
|
const startY = (cOffY > 0) ? cOffY : 0;
|
||||||
|
const endX = (cOffXE >= TILE_SIZE) ? TILE_SIZE : cOffXE;
|
||||||
|
const endY = (cOffYE >= TILE_SIZE) ? TILE_SIZE : cOffYE;
|
||||||
|
let pxlCnt = 0;
|
||||||
|
for (let py = startX; py < endX; py += 1) {
|
||||||
|
for (let px = startY; px < endY; px += 1) {
|
||||||
|
const offset = (px + py * TILE_SIZE) * 3;
|
||||||
|
if (protect) {
|
||||||
|
chunk[offset] |= 0x80;
|
||||||
|
} else {
|
||||||
|
chunk[offset] &= 0x07;
|
||||||
|
}
|
||||||
|
pxlCnt += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pxlCnt) {
|
||||||
|
const ret = await RedisCanvas.setChunk(cx, cy, chunk);
|
||||||
|
if (ret) {
|
||||||
|
// eslint-disable-next-line max-len
|
||||||
|
logger.info(`Set protection for ${pxlCnt} pixels in chunk ${cx}, ${cy}.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chunk = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info('Setting protection for area done.');
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user