viewportEndRect method

Rect viewportEndRect(
  1. Rect baseRect,
  2. Rect displayRect, {
  3. double? maxScale,
})

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 inside displayRect.
  • Zoomed within maxScale: shift to fit inside displayRect (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);
}