diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java
index 0aaa92847f3..0a901967da1 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java
@@ -892,9 +892,10 @@ public Rectangle getClientArea() {
trim.height += wrapHeight;
}
if (minimized) return new Rectangle(-trim.x, -trim.y, 0, 0);
- int width = size.x - trim.width;
- int height = size.y - trim.height;
- return new Rectangle(-trim.x, -trim.y, width, height);
+ float width = ((Point.OfFloat) size).getX() - trim.width;
+ float height = ((Point.OfFloat) size).getY() - trim.height;
+ Rectangle.OfFloat r = new Rectangle.OfFloat(-trim.x, -trim.y, width, height);
+ return r;
}
/**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Tests/win32/org/eclipse/swt/widgets/CoordinateSystemMapperTests.java b/bundles/org.eclipse.swt/Eclipse SWT Tests/win32/org/eclipse/swt/widgets/CoordinateSystemMapperTests.java
index 5fc56ba05d1..4f4b1989663 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Tests/win32/org/eclipse/swt/widgets/CoordinateSystemMapperTests.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Tests/win32/org/eclipse/swt/widgets/CoordinateSystemMapperTests.java
@@ -137,7 +137,7 @@ void translateRectangleInGapPartiallyInRightBackAndForthInSingleZoomShouldBeTheS
void translateRectangleInGapPartiallyInRightBackAndForthInMultiZoomShouldBeInside() {
MultiZoomCoordinateSystemMapper mapper = getMultiZoomCoordinateSystemMapper();
setupMonitors(mapper);
- Rectangle rectInPts = new MonitorAwareRectangle(1950, 400, 150, 100, monitors[1]);
+ Rectangle rectInPts = new Rectangle.WithMonitor(1950, 400, 150, 100, monitors[1]);
Rectangle rectInPxs = mapper.translateToDisplayCoordinates(rectInPts, monitors[0].getZoom());
assertEquals(rectInPts, mapper.translateFromDisplayCoordinates(rectInPxs, monitors[0].getZoom()));
}
@@ -223,7 +223,7 @@ private Point createExpectedPoint(CoordinateSystemMapper mapper, int x, int y, M
if (mapper instanceof SingleZoomCoordinateSystemMapper) {
return new Point(x, y);
} else {
- return new MonitorAwarePoint(x, y, monitor);
+ return new Point.WithMonitor(x, y, monitor);
}
}
@@ -231,7 +231,7 @@ private Rectangle createExpectedRectangle(CoordinateSystemMapper mapper, int x,
if (mapper instanceof SingleZoomCoordinateSystemMapper) {
return new Rectangle(x, y, width, height);
} else {
- return new MonitorAwareRectangle(x, y, width, height, monitor);
+ return new Rectangle.WithMonitor(x, y, width, height, monitor);
}
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/MonitorAwarePoint.java b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/MonitorAwarePoint.java
deleted file mode 100644
index 5e73e051e69..00000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/MonitorAwarePoint.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2025 Yatta Solutions and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Yatta Solutions - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.widgets.*;
-
-/**
- * Instances of this class represent {@link org.eclipse.swt.graphics.Point}
- * objects along with the context of the monitor in relation to which they are
- * placed on the display. The monitor awareness makes it easy to scale and
- * translate the points between pixels and points.
- *
- * @since 3.129
- * @noreference This class is not intended to be referenced by clients
- */
-public final class MonitorAwarePoint extends Point {
-
- private static final long serialVersionUID = 6077427420686999194L;
-
- private final Monitor monitor;
-
- /**
- * Constructs a new MonitorAwarePoint
- *
- * @param x the x coordinate of the point
- * @param y the y coordinate of the point
- * @param monitor the monitor with whose context the point is created
- */
- public MonitorAwarePoint(int x, int y, Monitor monitor) {
- super(x, y);
- this.monitor = monitor;
- }
-
- /**
- * {@return the monitor with whose context the instance is created}
- */
- public Monitor getMonitor() {
- return monitor;
- }
-
- @Override
- public boolean equals(Object object) {
- return super.equals(object);
- }
-
- @Override
- public int hashCode() {
- return super.hashCode();
- }
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/MonitorAwareRectangle.java b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/MonitorAwareRectangle.java
deleted file mode 100644
index c71ea94a389..00000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/MonitorAwareRectangle.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2025 Yatta Solutions and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Yatta Solutions - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.widgets.*;
-
-/**
- * Instances of this class represent {@link org.eclipse.swt.graphics.Rectangle}
- * objects along with the context of the monitor in relation to which they are
- * placed on the display. The monitor awareness makes it easy to scale and
- * translate the rectangles between pixels and points.
- *
- * @since 3.129
- * @noreference This class is not intended to be referenced by clients
- */
-public final class MonitorAwareRectangle extends Rectangle {
-
- private static final long serialVersionUID = 5041911840525116925L;
-
- private final Monitor monitor;
-
- /**
- * Constructs a new MonitorAwareRectangle
- *
- * @param x the x coordinate of the top left corner of the rectangle
- * @param y the y coordinate of the top left corner of the rectangle
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- * @param monitor the monitor with whose context the rectangle is created
- */
- public MonitorAwareRectangle(int x, int y, int width, int height, Monitor monitor) {
- super(x, y, width, height);
- this.monitor = monitor;
- }
-
- /**
- * {@return the monitor with whose context the instance is created}
- */
- public Monitor getMonitor() {
- return monitor;
- }
-
- @Override
- public boolean equals(Object object) {
- return super.equals(object);
- }
-
- @Override
- public int hashCode() {
- return super.hashCode();
- }
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Point.java b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Point.java
index 2aef2d06820..715eb83a965 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Point.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Point.java
@@ -16,6 +16,8 @@
import java.io.*;
+import org.eclipse.swt.widgets.*;
+
/**
* Instances of this class represent places on the (x, y)
* coordinate plane.
@@ -41,7 +43,7 @@
* @see Sample code and further information
*/
-public sealed class Point implements Serializable permits MonitorAwarePoint {
+public sealed class Point implements Serializable permits Point.OfFloat {
/**
* the x coordinate of the point
@@ -66,6 +68,8 @@ public Point (int x, int y) {
this.y = y;
}
+private Point() {}
+
/**
* Compares the argument to the receiver, and returns true
* if they represent the same object using a class
@@ -116,5 +120,84 @@ public String toString () {
return "Point {" + x + ", " + y + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
+/**
+ * Instances of this class represent {@link org.eclipse.swt.graphics.Point}
+ * objects with the fields capable of storing more precise value in float.
+ *
+ * @since 3.130
+ * @noreference This class is not intended to be referenced by clients
+ */
+public static sealed class OfFloat extends Point permits Point.WithMonitor {
+
+ private static final long serialVersionUID = -1862062276431597053L;
+
+ public float residualX, residualY;
+
+ public OfFloat(int x, int y) {
+ super(x, y);
+ }
+
+ public OfFloat(float x, float y) {
+ super();
+ this.x = Math.round(x);
+ this.y = Math.round(y);
+ this.residualX = x - this.x;
+ this.residualY = y - this.y;
+ }
+
+ public float getX() {
+ return x + residualX;
+ }
+
+ public float getY() {
+ return y + residualY;
+ }
+
+ public void setX(float x) {
+ this.x = Math.round(x);
+ this.residualX = x - this.x;
+ }
+
+ public void setY(float y) {
+ this.y = Math.round(y);
+ this.residualY = y - this.y;
+ }
+}
+
+/**
+ * Instances of this class represent {@link org.eclipse.swt.graphics.Point.OfFloat}
+ * objects along with the context of the monitor in relation to which they are
+ * placed on the display. The monitor awareness makes it easy to scale and
+ * translate the points between pixels and points.
+ *
+ * @since 3.130
+ * @noreference This class is not intended to be referenced by clients
+ */
+public static final class WithMonitor extends Point.OfFloat {
+
+ private static final long serialVersionUID = 6077427420686999194L;
+
+ private final Monitor monitor;
+
+ /**
+ * Constructs a new Point.WithMonitor
+ *
+ * @param x the x coordinate of the point
+ * @param y the y coordinate of the point
+ * @param monitor the monitor with whose context the point is created
+ */
+ public WithMonitor(int x, int y, Monitor monitor) {
+ super(x, y);
+ this.monitor = monitor;
+ }
+
+ /**
+ * {@return the monitor with whose context the instance is created}
+ */
+ public Monitor getMonitor() {
+ return monitor;
+ }
+
}
+}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Rectangle.java b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Rectangle.java
index e8060493d7e..d22bfdaf96a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Rectangle.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/Rectangle.java
@@ -17,6 +17,7 @@
import java.io.*;
import org.eclipse.swt.*;
+import org.eclipse.swt.widgets.*;
/**
* Instances of this class represent rectangular areas in an
@@ -45,7 +46,7 @@
* @see Sample code and further information
*/
-public sealed class Rectangle implements Serializable permits MonitorAwareRectangle {
+public sealed class Rectangle implements Serializable permits Rectangle.OfFloat {
/**
* the x coordinate of the rectangle
@@ -85,6 +86,8 @@ public Rectangle (int x, int y, int width, int height) {
this.height = height;
}
+private Rectangle() {}
+
/**
* Destructively replaces the x, y, width and height values
* in the receiver with ones which represent the union of the
@@ -356,4 +359,109 @@ public Rectangle union (Rectangle rect) {
return new Rectangle (left, top, right - left, bottom - top);
}
+/**
+ * Instances of this class represent {@link org.eclipse.swt.graphics.Rectangle}
+ * objects which supports values of Float type for it's fields
+ *
+ * @since 3.130
+ * @noreference This class is not intended to be referenced by clients
+ */
+public static sealed class OfFloat extends Rectangle permits Rectangle.WithMonitor {
+
+ private static final long serialVersionUID = -3006999002677468391L;
+
+ private float residualX, residualY, residualWidth, residualHeight;
+
+ public OfFloat(int x, int y, int width, int height) {
+ super(x, y, width, height);
+ }
+
+ public OfFloat(float x, float y, float width, float height) {
+ super();
+ this.x = Math.round(x);
+ this.y = Math.round(y);
+ this.width = Math.round(width);
+ this.height = Math.round(height);
+ this.residualX = x - this.x;
+ this.residualY = y - this.y;
+ this.residualWidth = width - this.width;
+ this.residualHeight = height - this.height;
+ }
+
+ public float getX() {
+ return x + residualX;
+ }
+
+ public float getY() {
+ return y + residualY;
+ }
+
+ public float getWidth() {
+ return width + residualWidth;
+ }
+
+ public float getHeight() {
+ return height + residualHeight;
+ }
+
+ public void setX(float x) {
+ this.x = Math.round(x);
+ this.residualX = x - this.x;
+ }
+
+ public void setY(float y) {
+ this.y = Math.round(y);
+ this.residualY = y - this.y;
+ }
+
+ public void setWidth(float width) {
+ this.width = Math.round(width);
+ this.residualWidth = width - this.width;
+ }
+
+ public void setHeight(float height) {
+ this.height = Math.round(height);
+ this.residualHeight = height - this.height;
+ }
+
+}
+
+/**
+ * Instances of this class represent {@link org.eclipse.swt.graphics.Rectangle.OfFloat}
+ * objects along with the context of the monitor in relation to which they are
+ * placed on the display. The monitor awareness makes it easy to scale and
+ * translate the rectangles between pixels and points.
+ *
+ * @since 3.130
+ * @noreference This class is not intended to be referenced by clients
+ */
+public static final class WithMonitor extends Rectangle.OfFloat {
+
+ private static final long serialVersionUID = 5041911840525116925L;
+
+ private final Monitor monitor;
+
+ /**
+ * Constructs a new Rectangle.WithMonitor
+ *
+ * @param x the x coordinate of the top left corner of the rectangle
+ * @param y the y coordinate of the top left corner of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ * @param monitor the monitor with whose context the rectangle is created
+ */
+ public WithMonitor(int x, int y, int width, int height, Monitor monitor) {
+ super(x, y, width, height);
+ this.monitor = monitor;
+ }
+
+ /**
+ * {@return the monitor with whose context the instance is created}
+ */
+ public Monitor getMonitor() {
+ return monitor;
+ }
+
}
+
+}
\ No newline at end of file
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 a15f4683ae3..505cd4da67d 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
@@ -228,11 +228,11 @@ public static Point autoScaleDown(Point point) {
public static Point scaleDown(Point point, int zoom) {
if (zoom == 100 || point == null) return point;
+ Point.OfFloat fPoint = FloatAwareGeometryFactory.createFloatAwarePoint(point);
float scaleFactor = getScalingFactor(zoom);
- Point scaledPoint = new Point (0,0);
- scaledPoint.x = Math.round (point.x / scaleFactor);
- scaledPoint.y = Math.round (point.y / scaleFactor);
- return scaledPoint;
+ float scaledX = fPoint.getX() / scaleFactor;
+ float scaledY = fPoint.getY() / scaleFactor;
+ return new Point.OfFloat(scaledX, scaledY);
}
/**
@@ -255,16 +255,7 @@ public static Rectangle autoScaleDown(Rectangle rect) {
}
public static Rectangle scaleDown(Rectangle rect, int zoom) {
- if (zoom == 100 || rect == null) return rect;
- Rectangle scaledRect = new Rectangle (0,0,0,0);
- Point scaledTopLeft = scaleDown(new Point (rect.x, rect.y), zoom);
- Point scaledBottomRight = scaleDown(new Point (rect.x + rect.width, rect.y + rect.height), zoom);
-
- scaledRect.x = scaledTopLeft.x;
- scaledRect.y = scaledTopLeft.y;
- scaledRect.width = scaledBottomRight.x - scaledTopLeft.x;
- scaledRect.height = scaledBottomRight.y - scaledTopLeft.y;
- return scaledRect;
+ return scaleBounds(rect, 100, zoom);
}
/**
* Returns a new scaled down Rectangle if enabled for Drawable class.
@@ -333,13 +324,13 @@ public static boolean isSmoothScalingEnabled() {
*/
public static Rectangle scaleBounds (Rectangle rect, int targetZoom, int currentZoom) {
if (rect == null || targetZoom == currentZoom) return rect;
+ Rectangle.OfFloat fRect = FloatAwareGeometryFactory.createFloatAwareRectangle(rect);
float scaleFactor = ((float)targetZoom) / (float)currentZoom;
- Rectangle returnRect = new Rectangle (0,0,0,0);
- returnRect.x = Math.round (rect.x * scaleFactor);
- returnRect.y = Math.round (rect.y * scaleFactor);
- returnRect.width = Math.round (rect.width * scaleFactor);
- returnRect.height = Math.round (rect.height * scaleFactor);
- return returnRect;
+ float scaledX = fRect.getX() * scaleFactor;
+ float scaledY = fRect.getY() * scaleFactor;
+ float scaledWidth = fRect.getWidth() * scaleFactor;
+ float scaledHeight = fRect.getHeight() * scaleFactor;
+ return new Rectangle.OfFloat(scaledX, scaledY, scaledWidth, scaledHeight);
}
/**
@@ -436,11 +427,11 @@ public static Point autoScaleUp(Point point) {
public static Point scaleUp(Point point, int zoom) {
if (zoom == 100 || point == null) return point;
+ Point.OfFloat fPoint = FloatAwareGeometryFactory.createFloatAwarePoint(point);
float scaleFactor = getScalingFactor(zoom);
- Point scaledPoint = new Point(0,0);
- scaledPoint.x = Math.round (point.x * scaleFactor);
- scaledPoint.y = Math.round (point.y * scaleFactor);
- return scaledPoint;
+ float scaledX = fPoint.getX() * scaleFactor;
+ float scaledY = fPoint.getY() * scaleFactor;
+ return new Point.OfFloat(scaledX, scaledY);
}
/**
@@ -463,16 +454,7 @@ public static Rectangle autoScaleUp(Rectangle rect) {
}
public static Rectangle scaleUp(Rectangle rect, int zoom) {
- if (zoom == 100 || rect == null) return rect;
- Rectangle scaledRect = new Rectangle(0,0,0,0);
- Point scaledTopLeft = scaleUp (new Point(rect.x, rect.y), zoom);
- Point scaledBottomRight = scaleUp (new Point(rect.x + rect.width, rect.y + rect.height), zoom);
-
- scaledRect.x = scaledTopLeft.x;
- scaledRect.y = scaledTopLeft.y;
- scaledRect.width = scaledBottomRight.x - scaledTopLeft.x;
- scaledRect.height = scaledBottomRight.y - scaledTopLeft.y;
- return scaledRect;
+ return scaleBounds(rect, zoom, 100);
}
/**
@@ -751,4 +733,20 @@ public ImageData getImageData(int zoom) {
return DPIUtil.scaleImageData(device, imageData, zoom, currentZoom);
}
}
+
+private class FloatAwareGeometryFactory {
+ static Rectangle.OfFloat createFloatAwareRectangle(Rectangle rectangle) {
+ if (rectangle instanceof Rectangle.OfFloat) {
+ return (Rectangle.OfFloat) rectangle;
+ }
+ return new Rectangle.OfFloat(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+ }
+
+ static Point.OfFloat createFloatAwarePoint(Point point) {
+ if (point instanceof Point.OfFloat) {
+ return (Point.OfFloat) point;
+ }
+ return new Point.OfFloat(point.x, point.y);
+ }
+}
}
\ No newline at end of file
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MultiZoomCoordinateSystemMapper.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MultiZoomCoordinateSystemMapper.java
index 0edae112b5f..693b76e96aa 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MultiZoomCoordinateSystemMapper.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MultiZoomCoordinateSystemMapper.java
@@ -98,19 +98,19 @@ public Point translateFromDisplayCoordinates(Point point, int zoom) {
@Override
public Point translateToDisplayCoordinates(Point point, int zoom) {
- Monitor monitor = point instanceof MonitorAwarePoint monitorAwarePoint ? monitorAwarePoint.getMonitor() : null;
+ Monitor monitor = point instanceof Point.WithMonitor pointWithMonitor ? pointWithMonitor.getMonitor() : null;
return translateLocationInPointsToPixels(point.x, point.y, monitor);
}
@Override
public Rectangle translateFromDisplayCoordinates(Rectangle rect, int zoom) {
- Monitor monitor = rect instanceof MonitorAwareRectangle monitorAwareRect ? monitorAwareRect.getMonitor() : null;
+ Monitor monitor = rect instanceof Rectangle.WithMonitor rectWithMonitor ? rectWithMonitor.getMonitor() : null;
return translateRectangleInPixelsToPoints(rect.x, rect.y, rect.width, rect.height, monitor);
}
@Override
public Rectangle translateToDisplayCoordinates(Rectangle rect, int zoom) {
- Monitor monitor = rect instanceof MonitorAwareRectangle monitorAwareRect ? monitorAwareRect.getMonitor() : null;
+ Monitor monitor = rect instanceof Rectangle.WithMonitor rectWithMonitor ? rectWithMonitor.getMonitor() : null;
return translateRectangleInPointsToPixels(rect.x, rect.y, rect.width, rect.height, monitor);
}
@@ -152,7 +152,7 @@ private Rectangle translateRectangleInPixelsToPoints(int x, int y, int widthInPi
Point topLeft = getPointFromPixels(monitor, x, y);
int width = DPIUtil.scaleDown(widthInPixels, zoom);
int height = DPIUtil.scaleDown(heightInPixels, zoom);
- MonitorAwareRectangle rect = new MonitorAwareRectangle(topLeft.x, topLeft.y, width, height, monitor);
+ Rectangle.WithMonitor rect = new Rectangle.WithMonitor(topLeft.x, topLeft.y, width, height, monitor);
return rect;
}
@@ -264,7 +264,7 @@ private Point getPointFromPixels(Monitor monitor, int x, int y) {
int zoom = getApplicableMonitorZoom(monitor);
int mappedX = DPIUtil.scaleDown(x - monitor.clientX, zoom) + monitor.clientX;
int mappedY = DPIUtil.scaleDown(y - monitor.clientY, zoom) + monitor.clientY;
- return new MonitorAwarePoint(mappedX, mappedY, monitor);
+ return new Point.WithMonitor(mappedX, mappedY, monitor);
}
private int getApplicableMonitorZoom(Monitor monitor) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java
index ef7f6ca9d8d..3d236a591fe 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java
@@ -8176,8 +8176,8 @@ private LRESULT positionTooltip(NMHDR hdr, long wParam, long lParam, boolean man
// of positioning and re-scaling events.
// Refer: https://github.com/eclipse-platform/eclipse.platform.swt/issues/557
Point cursorLocation = display.getCursorLocation();
- Rectangle monitorBounds = cursorLocation instanceof MonitorAwarePoint monitorAwarePoint
- ? getContainingMonitorBoundsInMultiZoomCoordinateSystem(monitorAwarePoint)
+ Rectangle monitorBounds = cursorLocation instanceof Point.WithMonitor pointWithMonitor
+ ? getContainingMonitorBoundsInMultiZoomCoordinateSystem(pointWithMonitor)
: getContainingMonitorBoundsInSingleZoomCoordinateSystem(cursorLocation);
if (monitorBounds != null) {
Rectangle adjustedTooltipBounds = fitTooltipBoundsIntoMonitor(toolRect, monitorBounds);
@@ -8229,7 +8229,7 @@ private Rectangle getContainingMonitorBoundsInSingleZoomCoordinateSystem(Point p
return null;
}
-private Rectangle getContainingMonitorBoundsInMultiZoomCoordinateSystem(MonitorAwarePoint point) {
+private Rectangle getContainingMonitorBoundsInMultiZoomCoordinateSystem(Point.WithMonitor point) {
Monitor monitor = point.getMonitor();
return new Rectangle(monitor.x, monitor.y, DPIUtil.scaleUp(monitor.width, monitor.zoom),
DPIUtil.scaleUp(monitor.height, monitor.zoom));
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..1bd1bcb29de 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
@@ -318,4 +318,40 @@ public void scaleUpRectangle() {
scaledValue = DPIUtil.scaleUp((Device) null, valueAt100, 100);
assertSame(valueAt100, scaledValue, "Scaling up Rectangle without zoom change with device failed");
}
+
+ @Test
+ public void scaleDownscaleUpRectangleInvertible() {
+ int[] zooms = new int[] {25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400};
+ for (int zoom1 : zooms) {
+ for (int zoom2 : zooms) {
+ for (int i = 1; i <= 10000; i++) {
+ Rectangle rect = new Rectangle(0, 0, i, i);
+ Rectangle scaleDown = DPIUtil.scaleDown(rect, zoom1);
+ Rectangle scaleUp = DPIUtil.scaleUp(scaleDown, zoom2);
+ scaleDown = DPIUtil.scaleDown(scaleUp, zoom2);
+ scaleUp = DPIUtil.scaleUp(scaleDown, zoom1);
+ assertEquals(rect.width, scaleUp.width);
+ assertEquals(rect.height, scaleUp.height);
+ }
+ }
+ }
+ }
+
+ @Test
+ public void scaleDownscaleUpPointInvertible() {
+ int[] zooms = new int[] {25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400};
+ for (int zoom1 : zooms) {
+ for (int zoom2 : zooms) {
+ for (int i = 1; i <= 10000; i++) {
+ Point pt = new Point(i, i);
+ Point scaleDown = DPIUtil.scaleDown(pt, zoom1);
+ Point scaleUp = DPIUtil.scaleUp(scaleDown, zoom2);
+ scaleDown = DPIUtil.scaleDown(scaleUp, zoom2);
+ scaleUp = DPIUtil.scaleUp(scaleDown, zoom1);
+ assertEquals(pt.x, scaleUp.x);
+ assertEquals(pt.y, scaleUp.y);
+ }
+ }
+ }
+ }
}