Fix iOS touch position offset in image masking

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-10-25 06:22:35 +00:00
parent 3ab64ac688
commit 263d476ffe
1 changed files with 19 additions and 33 deletions

View File

@ -242,35 +242,27 @@ function onImagePointerdown(ev: PointerEvent) {
const AW = canvasEl.value.clientWidth; const AW = canvasEl.value.clientWidth;
const AH = canvasEl.value.clientHeight; const AH = canvasEl.value.clientHeight;
const BW = imageBitmap.width; const BW = canvasEl.value.width; // Canvas intrinsic width (render width)
const BH = imageBitmap.height; const BH = canvasEl.value.height; // Canvas intrinsic height (render height)
let xOffset = 0; // Calculate the scale factor for object-fit: contain
let yOffset = 0; const scale = Math.min(AW / BW, AH / BH);
if (AW / AH < BW / BH) { // // Calculate the actual rendered size of the canvas content
yOffset = AH - BH * (AW / BW); const renderW = BW * scale;
} else { // const renderH = BH * scale;
xOffset = AW - BW * (AH / BH);
}
xOffset /= 2; // Calculate the offset to center the image
yOffset /= 2; const xOffset = (AW - renderW) / 2;
const yOffset = (AH - renderH) / 2;
const rect = canvasEl.value.getBoundingClientRect(); const rect = canvasEl.value.getBoundingClientRect();
const pointerOffsetX = ev.clientX - rect.left; const pointerOffsetX = ev.clientX - rect.left;
const pointerOffsetY = ev.clientY - rect.top; const pointerOffsetY = ev.clientY - rect.top;
let startX = pointerOffsetX - xOffset; // Convert from client coordinates to canvas coordinates
let startY = pointerOffsetY - yOffset; let startX = (pointerOffsetX - xOffset) / scale;
let startY = (pointerOffsetY - yOffset) / scale;
if (AW / AH < BW / BH) { //
startX = startX / (Math.max(AW, AH) / Math.max(BH / BW, 1));
startY = startY / (Math.max(AW, AH) / Math.max(BW / BH, 1));
} else { //
startX = startX / (Math.min(AW, AH) / Math.max(BH / BW, 1));
startY = startY / (Math.min(AW, AH) / Math.max(BW / BH, 1));
}
const id = genId(); const id = genId();
if (penMode.value === 'fill') { if (penMode.value === 'fill') {
@ -320,16 +312,10 @@ function onImagePointerdown(ev: PointerEvent) {
function _move(pointerClientX: number, pointerClientY: number) { function _move(pointerClientX: number, pointerClientY: number) {
const pointerX = pointerClientX - rect.left; const pointerX = pointerClientX - rect.left;
const pointerY = pointerClientY - rect.top; const pointerY = pointerClientY - rect.top;
let x = pointerX - xOffset;
let y = pointerY - yOffset;
if (AW / AH < BW / BH) { // // Convert from client coordinates to canvas coordinates
x = x / (Math.max(AW, AH) / Math.max(BH / BW, 1)); let x = (pointerX - xOffset) / scale;
y = y / (Math.max(AW, AH) / Math.max(BW / BH, 1)); let y = (pointerY - yOffset) / scale;
} else { //
x = x / (Math.min(AW, AH) / Math.max(BH / BW, 1));
y = y / (Math.min(AW, AH) / Math.max(BW / BH, 1));
}
const scaleX = Math.abs(x - startX); const scaleX = Math.abs(x - startX);
const scaleY = Math.abs(y - startY); const scaleY = Math.abs(y - startY);