fix: recentrage incorrect si loin du centre d origine

This commit is contained in:
qguillaume
2026-06-11 21:02:47 +02:00
parent fec33a327a
commit 653aa5d5b0

View File

@@ -155,10 +155,31 @@ void _viewportCropIsolateEntry(_ViewportCropParams p) {
final int srcX = (cropCenterX - side / 2).round(); final int srcX = (cropCenterX - side / 2).round();
final int srcY = (cropCenterY - side / 2).round(); final int srcY = (cropCenterY - side / 2).round();
// Toile carrée noire opaque ; compositeImage rogne automatiquement les bords // Toile carrée NOIRE opaque (numChannels 3 → pixels initialisés à 0 = noir).
// hors-cadre, donc les débordements restent noirs (padding).
final out = img.Image(width: side, height: side, numChannels: 3); final out = img.Image(width: side, height: side, numChannels: 3);
img.compositeImage(out, rotated, dstX: -srcX, dstY: -srcY);
// Intersection de la fenêtre de visée avec l'image réelle. Tout ce qui
// déborde reste noir (padding) → aucun recentrage forcé.
final int vx0 = math.max(0, srcX);
final int vy0 = math.max(0, srcY);
final int vx1 = math.min(rotated.width, srcX + side);
final int vy1 = math.min(rotated.height, srcY + side);
final int vw = vx1 - vx0;
final int vh = vy1 - vy0;
if (vw > 0 && vh > 0) {
final region = img.copyCrop(rotated, x: vx0, y: vy0, width: vw, height: vh);
// dstW/dstH EXPLICITES = taille de la région → AUCUN redimensionnement
// (sinon compositeImage étire la source pour remplir la destination).
img.compositeImage(
out,
region,
dstX: vx0 - srcX,
dstY: vy0 - srcY,
dstW: vw,
dstH: vh,
);
}
img.Image result = out; img.Image result = out;
if (side != p.outputSize) { if (side != p.outputSize) {