refboard: fix native export pixel bounds rounding

This commit is contained in:
Hiren Kangad
2026-03-13 15:51:12 +05:30
parent 7b2fcfd6a8
commit 1ceafec67f
+14 -6
View File
@@ -78,9 +78,13 @@ export async function renderNativeImageSelection(
const pixelsPerWorld = getNativePixelsPerWorld(items, options?.scale ?? 1); const pixelsPerWorld = getNativePixelsPerWorld(items, options?.scale ?? 1);
const paddingPx = options?.paddingPx ?? 10; const paddingPx = options?.paddingPx ?? 10;
const minPxX = Math.floor(minX * pixelsPerWorld) - paddingPx;
const minPxY = Math.floor(minY * pixelsPerWorld) - paddingPx;
const maxPxX = Math.ceil(maxX * pixelsPerWorld) + paddingPx;
const maxPxY = Math.ceil(maxY * pixelsPerWorld) + paddingPx;
const canvas = document.createElement('canvas'); const canvas = document.createElement('canvas');
canvas.width = Math.max(1, Math.ceil((maxX - minX) * pixelsPerWorld) + paddingPx * 2); canvas.width = Math.max(1, maxPxX - minPxX);
canvas.height = Math.max(1, Math.ceil((maxY - minY) * pixelsPerWorld) + paddingPx * 2); canvas.height = Math.max(1, maxPxY - minPxY);
const ctx = canvas.getContext('2d'); const ctx = canvas.getContext('2d');
if (!ctx) throw new Error('2D context unavailable'); if (!ctx) throw new Error('2D context unavailable');
@@ -102,8 +106,8 @@ export async function renderNativeImageSelection(
ctx.save(); ctx.save();
ctx.translate( ctx.translate(
Math.round((t.x - minX) * pixelsPerWorld) + paddingPx, t.x * pixelsPerWorld - minPxX,
Math.round((t.y - minY) * pixelsPerWorld) + paddingPx, t.y * pixelsPerWorld - minPxY,
); );
ctx.rotate((t.angle * Math.PI) / 180); ctx.rotate((t.angle * Math.PI) / 180);
ctx.scale(t.scaleX * pixelsPerWorld, t.scaleY * pixelsPerWorld); ctx.scale(t.scaleX * pixelsPerWorld, t.scaleY * pixelsPerWorld);
@@ -144,9 +148,13 @@ export function getNativeImageExportDimensions(
} }
const pixelsPerWorld = getNativePixelsPerWorld(items, scale); const pixelsPerWorld = getNativePixelsPerWorld(items, scale);
const minPxX = Math.floor(minX * pixelsPerWorld) - paddingPx;
const minPxY = Math.floor(minY * pixelsPerWorld) - paddingPx;
const maxPxX = Math.ceil(maxX * pixelsPerWorld) + paddingPx;
const maxPxY = Math.ceil(maxY * pixelsPerWorld) + paddingPx;
return { return {
width: Math.max(1, Math.ceil((maxX - minX) * pixelsPerWorld) + paddingPx * 2), width: Math.max(1, maxPxX - minPxX),
height: Math.max(1, Math.ceil((maxY - minY) * pixelsPerWorld) + paddingPx * 2), height: Math.max(1, maxPxY - minPxY),
}; };
} }