viewportEndRect method
Computes the "viewport-correct" end rect for a release-while-displayed.
Mirrors the imagineai interactionEndRect:
- Zoomed (scale > 1.02) past
maxScale: clamp scale to maxScale, adjust center proportionally so the same scene stays centered, then shift to fit insidedisplayRect. - Zoomed within
maxScale: shift to fit insidedisplayRect(covers display when rect is bigger than display). - Not zoomed: return
baseRect(snap to base).
Implementation
Rect viewportEndRect(Rect baseRect, Rect displayRect, {double? maxScale}) {
final scale = width / baseRect.width;
if (scale <= 1.02) return baseRect;
Rect target = this;
if (maxScale != null && scale > maxScale) {
final ratio = (baseRect.width * maxScale) / width;
final newCenter =
(center - displayRect.center) * ratio + displayRect.center;
target = resize(
baseRect.width * maxScale,
baseRect.height * maxScale,
).copyWithCenter(newCenter);
}
return target.shiftXToFitInside(displayRect).shiftYToFitInside(displayRect);
}