From 0d427ae202346e2281aa40a6cf3524dea6464098 Mon Sep 17 00:00:00 2001 From: Ben Olden-Cooligan Date: Sun, 31 Mar 2024 11:45:17 -0700 Subject: [PATCH] Max zoom for preview form --- NAPS2.Lib.Mac/EtoForms/Ui/MacPreviewForm.cs | 6 +++++- NAPS2.Lib/EtoForms/Widgets/ScrollZoomImageViewer.cs | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/NAPS2.Lib.Mac/EtoForms/Ui/MacPreviewForm.cs b/NAPS2.Lib.Mac/EtoForms/Ui/MacPreviewForm.cs index 78fb0a1d7..34dd374cd 100644 --- a/NAPS2.Lib.Mac/EtoForms/Ui/MacPreviewForm.cs +++ b/NAPS2.Lib.Mac/EtoForms/Ui/MacPreviewForm.cs @@ -19,7 +19,11 @@ public class MacPreviewForm : PreviewForm DoubleValue = 0, ToolTip = UiStrings.Zoom }.WithAction(ZoomUpdated); - ImageViewer.ZoomChanged += (_, _) => { _zoomSlider.DoubleValue = Math.Log10(ImageViewer.ZoomFactor); }; + ImageViewer.ZoomChanged += (_, _) => + { + _zoomSlider.DoubleValue = Math.Log10(ImageViewer.ZoomFactor); + _zoomSlider.MaxValue = Math.Log10(ImageViewer.MaxZoom); + }; } protected override void CreateToolbar() diff --git a/NAPS2.Lib/EtoForms/Widgets/ScrollZoomImageViewer.cs b/NAPS2.Lib/EtoForms/Widgets/ScrollZoomImageViewer.cs index f99ae8cc8..81bc0b683 100644 --- a/NAPS2.Lib/EtoForms/Widgets/ScrollZoomImageViewer.cs +++ b/NAPS2.Lib/EtoForms/Widgets/ScrollZoomImageViewer.cs @@ -123,6 +123,9 @@ public class ScrollZoomImageViewer public float ZoomFactor => _renderFactor; + // GDI doesn't like when the render size (4 bytes per pixel) exceeds int.MaxValue + public float MaxZoom => (float) Math.Sqrt(int.MaxValue * 0.99 / (Image!.Width * Image.Height * 4)); + public void ChangeZoom(float step, bool anchorToMouse = false) { SetZoom(_renderFactor * (float) Math.Pow(1.2, step), anchorToMouse); @@ -130,9 +133,7 @@ public class ScrollZoomImageViewer public void SetZoom(float value, bool anchorToMouse = false) { - // TODO: Adjust clamp values based on image size - // (and also propagate that to the Mac slider limits) - _renderFactor = value.Clamp(0.01f, 10); + _renderFactor = value.Clamp(0.01f, MaxZoom); _scrollable.SuspendLayout(); var anchor = GetMouseAnchor(anchorToMouse); RenderSize = @@ -219,7 +220,6 @@ public class ScrollZoomImageViewer _scrollable.ScrollPosition = Point.Round(new PointF(xScroll, yScroll)); } - public static implicit operator LayoutElement(ScrollZoomImageViewer control) { return control._scrollable;