From 75b80d7c5434dcdaf2d15169858ac984eb7f1d90 Mon Sep 17 00:00:00 2001 From: Andreas Koch Date: Wed, 16 Apr 2025 12:04:46 +0200 Subject: [PATCH] Preserved width/height on scaleUp/Down a Rectangle This commit extends the logic when a Rectangle is scaled up/down from points to pixels regarding width and height. Fixes https://github.com/eclipse-platform/eclipse.platform.swt/issues/2003 --- .../org/eclipse/swt/internal/DPIUtil.java | 21 +++++++++++++++++++ .../eclipse/swt/tests/junit/DPIUtilTests.java | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java index 5f1dd60f7af..3390c28e1c9 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java @@ -257,6 +257,17 @@ public static Rectangle scaleDown(Rectangle rect, int zoom) { scaledRect.y = scaledTopLeft.y; scaledRect.width = scaledBottomRight.x - scaledTopLeft.x; scaledRect.height = scaledBottomRight.y - scaledTopLeft.y; + + int scaledDownWidth = DPIUtil.scaleDown(rect.width, zoom); + int scaledDownHeight = DPIUtil.scaleDown(rect.height, zoom); + + // It must be ensured, that a scaled down width or height + // based on Rectangle x or y is not bigger than directly + // scaling down the width or height. Therefore the min + // value is used + scaledRect.width = Math.min(scaledRect.width, scaledDownWidth); + scaledRect.height = Math.min(scaledRect.height, scaledDownHeight); + return scaledRect; } /** @@ -464,6 +475,16 @@ public static Rectangle scaleUp(Rectangle rect, int zoom) { scaledRect.y = scaledTopLeft.y; scaledRect.width = scaledBottomRight.x - scaledTopLeft.x; scaledRect.height = scaledBottomRight.y - scaledTopLeft.y; + + int scaledUpWidth = DPIUtil.scaleUp(rect.width, zoom); + int scaledUpHeight = DPIUtil.scaleUp(rect.height, zoom); + + // It must be ensured, that a scaled up width or height + // based on Rectangle x or y is not smaller that directly + // scaling up the width or height. Therefore the max + // value is used + scaledRect.width = Math.max(scaledRect.width, scaledUpWidth); + scaledRect.height = Math.max(scaledRect.height, scaledUpHeight); return scaledRect; } diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/DPIUtilTests.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/DPIUtilTests.java index a517ed9942b..d22a74cdbad 100644 --- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/DPIUtilTests.java +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/DPIUtilTests.java @@ -160,7 +160,7 @@ public void scaleDownPoint() { @Test public void scaleDownRectangle() { Rectangle valueAt200 = new Rectangle(100, 150, 10, 14); - Rectangle valueAt150 = new Rectangle(75, 113, 7, 10); + Rectangle valueAt150 = new Rectangle(75, 113, 7, 11); Rectangle valueAt100 = new Rectangle(50, 75, 5, 7); Rectangle scaledValue = DPIUtil.autoScaleDown(valueAt200); @@ -295,7 +295,7 @@ public void scaleUpPoint() { @Test public void scaleUpRectangle() { Rectangle valueAt200 = new Rectangle(100, 150, 10, 14); - Rectangle valueAt150 = new Rectangle(75, 113, 8, 10); + Rectangle valueAt150 = new Rectangle(75, 113, 8, 11); Rectangle valueAt100 = new Rectangle(50, 75, 5, 7); Rectangle scaledValue = DPIUtil.autoScaleUp(valueAt100);