diff --git a/CHANGELOG.md b/CHANGELOG.md
index b763c2868..484acbdfe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file.
### Fixed
- crash when decoding large region
+- viewer position drift during scale
## [v1.10.7] - 2024-03-12
diff --git a/plugins/aves_magnifier/lib/src/core/core.dart b/plugins/aves_magnifier/lib/src/core/core.dart
index 1dd776e67..5f07d13fc 100644
--- a/plugins/aves_magnifier/lib/src/core/core.dart
+++ b/plugins/aves_magnifier/lib/src/core/core.dart
@@ -220,12 +220,16 @@ class _AvesMagnifierState extends State with TickerProviderStateM
newScale = boundaries.clampScale(newScale);
}
newScale = max(0, newScale);
+ // focal point is in viewport coordinates
final scaleFocalPoint = _doubleTap ? _startFocalPoint! : details.localFocalPoint;
+ final viewportCenter = boundaries.viewportCenter;
+ final centerContentPosition = boundaries.viewportToContentPosition(controller, viewportCenter);
+ final scalePositionDelta = (scaleFocalPoint - viewportCenter) * (scale! / newScale - 1);
final panPositionDelta = scaleFocalPoint - _lastViewportFocalPosition!;
- final scalePositionDelta = boundaries.viewportToStatePosition(controller, scaleFocalPoint) * (scale! / newScale - 1);
+
final newPosition = boundaries.clampPosition(
- position: position + panPositionDelta + scalePositionDelta,
+ position: boundaries.contentToStatePosition(newScale, centerContentPosition) + scalePositionDelta + panPositionDelta,
scale: newScale,
);
diff --git a/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart b/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart
index f3c12f8f9..39186af8a 100644
--- a/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart
+++ b/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart
@@ -90,16 +90,12 @@ class ScaleBoundaries extends Equatable {
double get initialScale => scaleForLevel(_initialScale);
- Offset get _viewportCenter => viewportSize.center(Offset.zero);
+ Offset get viewportCenter => viewportSize.center(Offset.zero);
Offset get _contentCenter => contentSize.center(Offset.zero);
- Offset viewportToStatePosition(AvesMagnifierController controller, Offset viewportPosition) {
- return viewportPosition - _viewportCenter - controller.position;
- }
-
Offset viewportToContentPosition(AvesMagnifierController controller, Offset viewportPosition) {
- return viewportToStatePosition(controller, viewportPosition) / controller.scale! + _contentCenter;
+ return (viewportPosition - viewportCenter - controller.position) / controller.scale! + _contentCenter;
}
Offset contentToStatePosition(double scale, Offset contentPosition) {