Merge branch 'slakkimsetti/NeonhiDpiWork' of ssh://slakkimsetti@git.eclipse.org/gitroot/platform/eclipse.platform.swt.git into slakkimsetti/NeonhiDpiWork
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java
index 9dbed7e..5b7e890 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java
@@ -73,7 +73,6 @@
 
 	Drawable drawable;
 	GCData data;
-	boolean autoScaleEnabled;
 
 	static final int FOREGROUND = 1 << 0;
 	static final int BACKGROUND = 1 << 1;
@@ -170,7 +169,6 @@
 	if (device == null) device = Device.getDevice();
 	if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
 	this.device = data.device = device;
-	this.autoScaleEnabled = DPIUtil.getAutoScale ();
 	init (drawable, data, hDC);
 	init();
 }
@@ -500,7 +498,12 @@
  */
 public void copyArea(int srcX, int srcY, int width, int height, int destX, int destY, boolean paint) {
 	if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
-
+	srcX = DPIUtil.autoScaleUp(srcX, device);
+	srcY = DPIUtil.autoScaleUp(srcY, device);
+	width = DPIUtil.autoScaleUp(width, device);
+	height = DPIUtil.autoScaleUp(height, device);
+	destX = DPIUtil.autoScaleUp(destX, device);
+	destY = DPIUtil.autoScaleUp(destY, device);
 	/*
 	* Feature in WinCE.  The function WindowFromDC is not part of the
 	* WinCE SDK.  The fix is to remember the HWND.
@@ -1939,12 +1942,10 @@
  */
 public void drawRectangle (int x, int y, int width, int height) {
 	if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
-	if (autoScaleEnabled) {
-		x = DPIUtil.autoScaleUp (x, device);
-		y = DPIUtil.autoScaleUp (y, device);
-		width = DPIUtil.autoScaleUp (width, device);
-		height = DPIUtil.autoScaleUp (height, device);
-	}
+	x = DPIUtil.autoScaleUp (x, device);
+	y = DPIUtil.autoScaleUp (y, device);
+	width = DPIUtil.autoScaleUp (width, device);
+	height = DPIUtil.autoScaleUp (height, device);
 	checkGC(DRAW);
 	long /*int*/ gdipGraphics = data.gdipGraphics;
 	if (gdipGraphics != 0) {
@@ -3067,12 +3068,10 @@
  */
 public void fillRectangle (int x, int y, int width, int height) {
 	if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
-	if (autoScaleEnabled) {
-		x = DPIUtil.autoScaleUp (x, device);
-		y = DPIUtil.autoScaleUp (y, device);
-		width = DPIUtil.autoScaleUp (width, device);
-		height = DPIUtil.autoScaleUp (height, device);
-	}
+	x = DPIUtil.autoScaleUp (x, device);
+	y = DPIUtil.autoScaleUp (y, device);
+	width = DPIUtil.autoScaleUp (width, device);
+	height = DPIUtil.autoScaleUp (height, device);
 	checkGC(FILL);
 	if (data.gdipGraphics != 0) {
 		if (width < 0) {
@@ -3236,7 +3235,7 @@
 	if (OS.IsWinCE) {
 		SIZE size = new SIZE();
 		OS.GetTextExtentPoint32W(handle, new char[]{ch}, 1, size);
-		return size.cx;
+		return DPIUtil.autoScaleDown(size.cx, getDevice ());
 	}
 	int tch = ch;
 	if (ch > 0x7F) {
@@ -3245,7 +3244,7 @@
 	}
 	int[] width = new int[1];
 	OS.GetCharWidth(handle, tch, tch, width);
-	return width[0];
+	return DPIUtil.autoScaleDown(width[0], getDevice ());
 }
 
 /**
@@ -3388,7 +3387,7 @@
 		}
 		int[] width = new int[3];
 		if (OS.GetCharABCWidths(handle, tch, tch, width)) {
-			return width[1];
+			return DPIUtil.autoScaleDown(width[1], getDevice ());
 		}
 	}
 
@@ -3397,7 +3396,7 @@
 	OS.GetTextMetrics(handle, lptm);
 	SIZE size = new SIZE();
 	OS.GetTextExtentPoint32W(handle, new char[]{ch}, 1, size);
-	return size.cx - lptm.tmOverhang;
+	return DPIUtil.autoScaleDown(size.cx - lptm.tmOverhang, getDevice ());
 }
 
 /**
@@ -3420,11 +3419,11 @@
 		Gdip.Graphics_SetPixelOffsetMode(gdipGraphics, Gdip.PixelOffsetModeNone);
 		Gdip.Graphics_GetVisibleClipBounds(gdipGraphics, rect);
 		Gdip.Graphics_SetPixelOffsetMode(gdipGraphics, Gdip.PixelOffsetModeHalf);
-		return new Rectangle(rect.X, rect.Y, rect.Width, rect.Height);
+		return DPIUtil.autoScaleDown(new Rectangle(rect.X, rect.Y, rect.Width, rect.Height), getDevice ());
 	}
 	RECT rect = new RECT();
 	OS.GetClipBox(handle, rect);
-	return new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
+	return DPIUtil.autoScaleDown(new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top), getDevice ());
 }
 
 /**
@@ -4341,6 +4340,10 @@
  */
 public void setClipping (int x, int y, int width, int height) {
 	if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+	x = DPIUtil.autoScaleUp(x, getDevice ());
+	y = DPIUtil.autoScaleUp(y, getDevice ());
+	width = DPIUtil.autoScaleUp(width, getDevice ());
+	height = DPIUtil.autoScaleUp(height, getDevice ());
 	long /*int*/ hRgn = OS.CreateRectRgn(x, y, x + width, y + height);
 	setClipping(hRgn);
 	OS.DeleteObject(hRgn);
@@ -4399,6 +4402,7 @@
  */
 public void setClipping (Rectangle rect) {
 	if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+	rect = DPIUtil.autoScaleUp(rect, getDevice ());
 	if (rect == null) {
 		setClipping(0);
 	} else {
@@ -5010,19 +5014,19 @@
 	if (gdipGraphics != 0) {
 		Point size = new Point(0, 0);
 		drawText(gdipGraphics, string, 0, 0, 0, size);
-		return size;
+		return DPIUtil.autoScaleDown(size, getDevice ());
 	}
 	SIZE size = new SIZE();
 	if (length == 0) {
 //		OS.GetTextExtentPoint32(handle, SPACE, SPACE.length(), size);
 		OS.GetTextExtentPoint32W(handle, new char[]{' '}, 1, size);
-		return new Point(0, size.cy);
+		return DPIUtil.autoScaleDown(new Point(0, size.cy), getDevice ());
 	} else {
 //		TCHAR buffer = new TCHAR (getCodePage(), string, false);
 		char[] buffer = new char [length];
 		string.getChars(0, length, buffer, 0);
 		OS.GetTextExtentPoint32W(handle, buffer, length, size);
-		return new Point(size.cx, size.cy);
+		return DPIUtil.autoScaleDown(new Point(size.cx, size.cy), getDevice ());
 	}
 }
 
@@ -5088,13 +5092,13 @@
 	if (gdipGraphics != 0) {
 		Point size = new Point(0, 0);
 		drawText(gdipGraphics, string, 0, 0, flags, size);
-		return size;
+		return DPIUtil.autoScaleDown(size, getDevice ());
 	}
 	if (string.length () == 0) {
 		SIZE size = new SIZE();
 //		OS.GetTextExtentPoint32(handle, SPACE, SPACE.length(), size);
 		OS.GetTextExtentPoint32W(handle, new char [] {' '}, 1, size);
-		return new Point(0, size.cy);
+		return DPIUtil.autoScaleDown(new Point(0, size.cy), getDevice ());
 	}
 	RECT rect = new RECT();
 	TCHAR buffer = new TCHAR(getCodePage(), string, false);
@@ -5103,7 +5107,7 @@
 	if ((flags & SWT.DRAW_TAB) != 0) uFormat |= OS.DT_EXPANDTABS;
 	if ((flags & SWT.DRAW_MNEMONIC) == 0) uFormat |= OS.DT_NOPREFIX;
 	OS.DrawText(handle, buffer, buffer.length(), rect, uFormat);
-	return new Point(rect.right, rect.bottom);
+	return DPIUtil.autoScaleDown(new Point(rect.right, rect.bottom), getDevice ());
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java
index 37d5154..7b9f6b0 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java
@@ -197,6 +197,7 @@
  */
 public Image(Device device, int width, int height) {
 	super(device);
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
 	width = DPIUtil.autoScaleUp (width, device);
 	height = DPIUtil.autoScaleUp (height, device);
 	init(width, height);
@@ -458,6 +459,7 @@
 public Image(Device device, Rectangle bounds) {
 	super(device);
 	if (bounds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
 	bounds = DPIUtil.autoScaleUp (bounds, device);
 	init(bounds.width, bounds.height);
 	init();
@@ -489,6 +491,7 @@
 public Image(Device device, ImageData data) {
 	super(device);
 	if (data == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
 	data = DPIUtil.autoScaleUp (data, device);
 	init(data);
 	init();
@@ -531,6 +534,7 @@
 	if (source.width != mask.width || source.height != mask.height) {
 		SWT.error(SWT.ERROR_INVALID_ARGUMENT);
 	}
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
 	source = DPIUtil.autoScaleUp(source, device);
 	mask = DPIUtil.autoScaleUp(mask, device);
 	mask = ImageData.convertMask(mask);
@@ -593,7 +597,9 @@
  */
 public Image (Device device, InputStream stream) {
 	super(device);
-	init(new ImageData(stream));
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
+	ImageData data = DPIUtil.autoScaleUp(new ImageData(stream), device);
+	init(data);
 	init();
 }
 
@@ -632,8 +638,9 @@
 public Image (Device device, String filename) {
 	super(device);
 	if (filename == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
-	initNative(filename);
-	if (this.handle == 0) init(new ImageData(filename));
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
+	ImageData data = DPIUtil.autoScaleUp(new ImageData(filename), device);
+	init(data);
 	init();
 }
 
@@ -669,7 +676,7 @@
 public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
 	super(device);
 	this.imageFileNameProvider = imageFileNameProvider;
-	currentDeviceZoom = device.getDeviceZoom ();
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
 	boolean[] found = new boolean[1];
 	String fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, currentDeviceZoom, found);
 	if (found[0]) {
@@ -714,7 +721,7 @@
 public Image(Device device, ImageDataProvider imageDataProvider) {
 	super(device);
 	this.imageDataProvider = imageDataProvider;
-	currentDeviceZoom = device.getDeviceZoom ();
+	if (device != null) currentDeviceZoom = device.getDeviceZoom ();
 	boolean[] found = new boolean[1];
 	ImageData data =  DPIUtil.validateAndGetImageDataAtZoom(imageDataProvider, currentDeviceZoom, found);
 	if (found[0]) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ImageList.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ImageList.java
index 3941a17..2838e36 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ImageList.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ImageList.java
@@ -11,9 +11,9 @@
 package org.eclipse.swt.internal;
 
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 public class ImageList {
 	long /*int*/ handle;
@@ -402,7 +402,7 @@
 			* Note that the image size has to match the image list icon size.
 			*/
 			long /*int*/ hBitmap = 0, hMask = 0;
-			ImageData data = image.getImageData ();
+			ImageData data = image.getImageData (image.getDevice().getDeviceZoom());
 			switch (data.getTransparencyType ()) {
 				case SWT.TRANSPARENCY_ALPHA:
 					/*
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Button.java
index 839ba18..cb1cf35 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Button.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Button.java
@@ -11,11 +11,11 @@
 package org.eclipse.swt.widgets;
 
 
+import org.eclipse.swt.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
 
 /**
  * Instances of this class represent a selectable user interface object that
@@ -168,8 +168,8 @@
 		if (image != null) {
 			switch (image.type) {
 				case SWT.BITMAP: {
-					Rectangle rect = image.getBounds ();
-					ImageData data = image.getImageData ();
+					Rectangle rect = image.getBounds (image.getDevice().getDeviceZoom());
+					ImageData data = image.getImageData (image.getDevice().getDeviceZoom());
 					switch (data.getTransparencyType ()) {
 						case SWT.TRANSPARENCY_PIXEL:
 							if (rect.width <= ICON_WIDTH && rect.height <= ICON_HEIGHT) {
@@ -400,6 +400,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0, border = getBorderWidth ();
 	if ((style & SWT.ARROW) != 0) {
 		if ((style & (SWT.UP | SWT.DOWN)) != 0) {
@@ -499,7 +501,7 @@
 	if (hHint != SWT.DEFAULT) height = hHint;
 	width += border * 2;
 	height += border * 2;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Canvas.java
index 1c17b19..22dfddb 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Canvas.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Canvas.java
@@ -11,9 +11,9 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class provide a surface for drawing
@@ -197,6 +197,12 @@
  */
 public void scroll (int destX, int destY, int x, int y, int width, int height, boolean all) {
 	checkWidget ();
+	destX = DPIUtil.autoScaleUp(destX, getDisplay());
+	destY = DPIUtil.autoScaleUp(destY, getDisplay());
+	x = DPIUtil.autoScaleUp(x, getDisplay());
+	y = DPIUtil.autoScaleUp(y, getDisplay());
+	width = DPIUtil.autoScaleUp(width, getDisplay());
+	height = DPIUtil.autoScaleUp(height, getDisplay());
 	forceResize ();
 	boolean isFocus = caret != null && caret.isFocusCaret ();
 	if (isFocus) caret.killFocus ();
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Combo.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Combo.java
index e3abaa9..9804db7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Combo.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Combo.java
@@ -12,11 +12,11 @@
 package org.eclipse.swt.widgets;
 
 
+import org.eclipse.swt.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
 
 /**
  * Instances of this class are controls that allow the user
@@ -625,6 +625,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0;
 	if (wHint == SWT.DEFAULT) {
 		long /*int*/ newFont, oldFont = 0;
@@ -698,7 +700,7 @@
 	if ((style & SWT.SIMPLE) != 0 && (style & SWT.H_SCROLL) != 0) {
 		height += OS.GetSystemMetrics (OS.SM_CYHSCROLL);
 	}
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 /**
@@ -1120,7 +1122,7 @@
 	checkWidget ();
 	int result = (int)/*64*/OS.SendMessage (handle, OS.CB_GETITEMHEIGHT, 0, 0);
 	if (result == OS.CB_ERR) error (SWT.ERROR_CANNOT_GET_ITEM_HEIGHT);
-	return result;
+	return DPIUtil.autoScaleDown(result, getDisplay());
 }
 
 /**
@@ -1997,6 +1999,10 @@
 	* items and ignore the height value that the programmer supplies.
 	*/
 	if ((style & SWT.DROP_DOWN) != 0) {
+		x = DPIUtil.autoScaleUp (x, getDisplay ());
+		y = DPIUtil.autoScaleUp (y, getDisplay ());
+		width = DPIUtil.autoScaleUp (width, getDisplay ());
+		height = DPIUtil.autoScaleUp (height, getDisplay());
 		int visibleCount = getItemCount() == 0 ? VISIBLE_COUNT : this.visibleCount;
 		height = getTextHeight () + (getItemHeight () * visibleCount) + 2;
 		/*
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Composite.java
index 09b3f7a..7e6c9e5 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Composite.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Composite.java
@@ -230,6 +230,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	display.runSkin ();
 	Point size;
 	if (layout != null) {
@@ -247,6 +249,7 @@
 	}
 	if (wHint != SWT.DEFAULT) size.x = wHint;
 	if (hHint != SWT.DEFAULT) size.y = hHint;
+	size = DPIUtil.autoScaleDown(size, getDisplay ());
 	Rectangle trim = computeTrim (0, 0, size.x, size.y);
 	return new Point (trim.width, trim.height);
 }
@@ -1072,6 +1075,7 @@
 
 @Override
 void setBounds (int x, int y, int width, int height, int flags, boolean defer) {
+	// AutoScaleUp taken care by super.setBounds
 	if (display.resizeCount > Display.RESIZE_LIMIT) {
 		defer = false;
 	}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Control.java
index 9a3f692..2442248 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Control.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Control.java
@@ -657,6 +657,8 @@
  */
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = DEFAULT_WIDTH;
 	int height = DEFAULT_HEIGHT;
 	if (wHint != SWT.DEFAULT) width = wHint;
@@ -664,7 +666,7 @@
 	int border = getBorderWidth ();
 	width += border * 2;
 	height += border * 2;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 Widget computeTabGroup () {
@@ -1226,7 +1228,7 @@
 	if ((bits1 & OS.WS_EX_CLIENTEDGE) != 0) return OS.GetSystemMetrics (OS.SM_CXEDGE);
 	if ((bits1 & OS.WS_EX_STATICEDGE) != 0) return OS.GetSystemMetrics (OS.SM_CXBORDER);
 	int bits2 = OS.GetWindowLong (borderHandle, OS.GWL_STYLE);
-	if ((bits2 & OS.WS_BORDER) != 0) return OS.GetSystemMetrics (OS.SM_CXBORDER);
+	if ((bits2 & OS.WS_BORDER) != 0) return DPIUtil.autoScaleDown(OS.GetSystemMetrics (OS.SM_CXBORDER), getDisplay ());
 	return 0;
 }
 
@@ -1252,7 +1254,7 @@
 	OS.MapWindowPoints (0, hwndParent, rect, 2);
 	int width = rect.right - rect.left;
 	int height =  rect.bottom - rect.top;
-	return new Rectangle (rect.left, rect.top, width, height);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, width, height), getDisplay ());
 }
 
 int getCodePage () {
@@ -1424,7 +1426,7 @@
 	OS.GetWindowRect (topHandle (), rect);
 	long /*int*/ hwndParent = parent == null ? 0 : parent.handle;
 	OS.MapWindowPoints (0, hwndParent, rect, 2);
-	return new Point (rect.left, rect.top);
+	return DPIUtil.autoScaleDown(new Point (rect.left, rect.top), getDisplay ());
 }
 
 /**
@@ -1592,7 +1594,7 @@
 	OS.GetWindowRect (topHandle (), rect);
 	int width = rect.right - rect.left;
 	int height = rect.bottom - rect.top;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 /**
@@ -2427,6 +2429,10 @@
  */
 public void redraw (int x, int y, int width, int height, boolean all) {
 	checkWidget ();
+	x = DPIUtil.autoScaleUp(x, getDisplay ());
+	y = DPIUtil.autoScaleUp(y, getDisplay ());
+	width = DPIUtil.autoScaleUp(width, getDisplay ());
+	height = DPIUtil.autoScaleUp(height, getDisplay ());
 	if (width <= 0 || height <= 0) return;
 	if (!OS.IsWindowVisible (handle)) return;
 	RECT rect = new RECT ();
@@ -3166,6 +3172,10 @@
 }
 
 void setBounds (int x, int y, int width, int height, int flags, boolean defer) {
+	x = DPIUtil.autoScaleUp(x, getDisplay ());
+	y = DPIUtil.autoScaleUp(y, getDisplay ());
+	width = DPIUtil.autoScaleUp(width, getDisplay ());
+	height = DPIUtil.autoScaleUp(height, getDisplay ());
 	if (findImageControl () != null) {
 		if (backgroundImage == null) flags |= OS.SWP_NOCOPYBITS;
 	} else {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolBar.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolBar.java
index d68f57d..7d70c53 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolBar.java
@@ -11,9 +11,9 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class provide an area for dynamically
@@ -143,10 +143,12 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0;
 	int border = getBorderWidth ();
-	int newWidth = wHint == SWT.DEFAULT ? 0x3FFF : wHint + (border * 2);
-	int newHeight = hHint == SWT.DEFAULT ? 0x3FFF : hHint + (border * 2);
+	int newWidth = wHint == SWT.DEFAULT ? DPIUtil.autoScaleUp(0x3FFF, getDisplay()) : wHint + (border * 2);
+	int newHeight = hHint == SWT.DEFAULT ? DPIUtil.autoScaleUp(0x3FFF, getDisplay()) : hHint + (border * 2);
 	int count = (int)/*64*/OS.SendMessage (handle, OS.RB_GETBANDCOUNT, 0, 0);
 	if (count != 0) {
 		ignoreResize = true;
@@ -207,7 +209,7 @@
 	if (hHint != SWT.DEFAULT) height = hHint;
 	height += border * 2;
 	width += border * 2;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
@@ -584,6 +586,9 @@
 			sizes [i] = new Point (rect.right - rect.left, rbBand.cyChild);
 		}
 	}
+	for (int i = 0; i < sizes.length; i++) {
+		sizes [i] = DPIUtil.autoScaleDown(sizes [i], getDisplay ());
+	}
 	return sizes;
 }
 
@@ -905,6 +910,9 @@
  */
 void setItemSizes (Point [] sizes) {
 	if (sizes == null) error (SWT.ERROR_NULL_ARGUMENT);
+	for (int i = 0; i < sizes.length; i++) {
+		sizes [i] = DPIUtil.autoScaleUp(sizes [i], getDisplay ());
+	}
 	int count = (int)/*64*/OS.SendMessage (handle, OS.RB_GETBANDCOUNT, 0, 0);
 	if (sizes.length != count) error (SWT.ERROR_INVALID_ARGUMENT);
 	REBARBANDINFO rbBand = new REBARBANDINFO ();
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolItem.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolItem.java
index 9742ca5..cba258f 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/CoolItem.java
@@ -11,10 +11,10 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class are selectable user interface
@@ -185,6 +185,8 @@
  */
 public Point computeSize (int wHint, int hHint) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int index = parent.indexOf (this);
 	if (index == -1) return new Point (0, 0);
 	int width = wHint, height = hHint;
@@ -195,7 +197,7 @@
 	} else {
 		width += parent.getMargin (index);
 	}
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
@@ -234,9 +236,9 @@
 	int width = rect.right - rect.left;
 	int height = rect.bottom - rect.top;
 	if ((parent.style & SWT.VERTICAL) != 0) {
-		return new Rectangle (rect.top, rect.left, height, width);
+		return DPIUtil.autoScaleDown(new Rectangle (rect.top, rect.left, height, width), getDisplay ());
 	}
-	return new Rectangle (rect.left, rect.top, width, height);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, width, height), getDisplay ());
 }
 
 Rectangle getClientArea () {
@@ -384,9 +386,9 @@
 	OS.SendMessage (hwnd, OS.RB_GETBANDINFO, index, rbBand);
 	int width = rbBand.cxIdeal + parent.getMargin (index);
 	if ((parent.style & SWT.VERTICAL) != 0) {
-		return new Point (rbBand.cyMaxChild, width);
+		return DPIUtil.autoScaleDown(new Point (rbBand.cyMaxChild, width), getDisplay ());
 	}
-	return new Point (width, rbBand.cyMaxChild);
+	return DPIUtil.autoScaleDown(new Point (width, rbBand.cyMaxChild), getDisplay ());
 }
 
 /**
@@ -402,6 +404,8 @@
  */
 public void setPreferredSize (int width, int height) {
 	checkWidget ();
+	width = DPIUtil.autoScaleUp (width, getDisplay ());
+	height = DPIUtil.autoScaleUp (height, getDisplay ());
 	int index = parent.indexOf (this);
 	if (index == -1) return;
 	width = Math.max (0, width);
@@ -482,9 +486,9 @@
 	int width = rect.right - rect.left;
 	int height = rect.bottom - rect.top;
 	if ((parent.style & SWT.VERTICAL) != 0) {
-		return new Point (height, width);
+		return DPIUtil.autoScaleDown(new Point (height, width), getDisplay ());
 	}
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 /**
@@ -505,6 +509,8 @@
  */
 public void setSize (int width, int height) {
 	checkWidget ();
+	width = DPIUtil.autoScaleUp(width, getDisplay ());
+	height = DPIUtil.autoScaleUp(height, getDisplay ());
 	int index = parent.indexOf (this);
 	if (index == -1) return;
 	width = Math.max (0, width);
@@ -594,9 +600,9 @@
 	rbBand.fMask = OS.RBBIM_CHILDSIZE;
 	OS.SendMessage (hwnd, OS.RB_GETBANDINFO, index, rbBand);
 	if ((parent.style & SWT.VERTICAL) != 0) {
-		return new Point (rbBand.cyMinChild, rbBand.cxMinChild);
+		return DPIUtil.autoScaleDown(new Point (rbBand.cyMinChild, rbBand.cxMinChild), getDisplay ());
 	}
-	return new Point (rbBand.cxMinChild, rbBand.cyMinChild);
+	return DPIUtil.autoScaleDown(new Point (rbBand.cxMinChild, rbBand.cyMinChild), getDisplay ());
 }
 
 /**
@@ -615,6 +621,8 @@
  */
 public void setMinimumSize (int width, int height) {
 	checkWidget ();
+	width = DPIUtil.autoScaleUp (width, getDisplay ());
+	height = DPIUtil.autoScaleUp (height, getDisplay ());
 	int index = parent.indexOf (this);
 	if (index == -1) return;
 	width = Math.max (0, width);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/DateTime.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/DateTime.java
index 828e7ab..0b60038 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/DateTime.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/DateTime.java
@@ -10,10 +10,10 @@
  *******************************************************************************/
 package org.eclipse.swt.widgets;
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.events.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class are selectable user interface
@@ -250,6 +250,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0;
 	if (wHint == SWT.DEFAULT || hHint == SWT.DEFAULT) {
 		if ((style & SWT.CALENDAR) != 0) {
@@ -320,7 +322,7 @@
 	int border = getBorderWidth ();
 	width += border * 2;
 	height += border * 2;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java
index bf7af0a..f60d968 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java
@@ -351,7 +351,10 @@
 @Override
 public Rectangle computeTrim (int x, int y, int width, int height) {
 	checkWidget ();
-
+	x = DPIUtil.autoScaleUp(x, getDisplay ());
+	y = DPIUtil.autoScaleUp(y, getDisplay ());
+	width = DPIUtil.autoScaleUp(width, getDisplay ());
+	height = DPIUtil.autoScaleUp(height, getDisplay ());
 	/* Get the size of the trimmings */
 	RECT rect = new RECT ();
 	OS.SetRect (rect, x, y, x + width, y + height);
@@ -376,7 +379,7 @@
 			OS.SendMessage (handle, OS.WM_NCCALCSIZE, 0, testRect);
 		}
 	}
-	return new Rectangle (rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top), getDisplay ());
 }
 
 void createAccelerators () {
@@ -655,9 +658,9 @@
 			lpwndpl.length = WINDOWPLACEMENT.sizeof;
 			OS.GetWindowPlacement (handle, lpwndpl);
 			if ((lpwndpl.flags & OS.WPF_RESTORETOMAXIMIZED) != 0) {
-				return new Point (maxRect.left, maxRect.top);
+				return DPIUtil.autoScaleDown(new Point (maxRect.left, maxRect.top), getDisplay ());
 			}
-			return new Point (lpwndpl.left, lpwndpl.top);
+			return DPIUtil.autoScaleDown(new Point (lpwndpl.left, lpwndpl.top), getDisplay ());
 		}
 	}
 	return super.getLocation ();
@@ -737,11 +740,11 @@
 			if ((lpwndpl.flags & OS.WPF_RESTORETOMAXIMIZED) != 0) {
 				int width = maxRect.right - maxRect.left;
 				int height = maxRect.bottom - maxRect.top;
-				return new Point (width, height);
+				return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 			}
 			int width = lpwndpl.right - lpwndpl.left;
 			int height = lpwndpl.bottom - lpwndpl.top;
-			return new Point (width, height);
+			return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 		}
 	}
 	return super.getSize ();
@@ -872,6 +875,10 @@
 
 @Override
 void setBounds (int x, int y, int width, int height, int flags, boolean defer) {
+	x = DPIUtil.autoScaleUp (x, getDisplay ());
+	y = DPIUtil.autoScaleUp (y, getDisplay ());
+	width = DPIUtil.autoScaleUp (width, getDisplay());
+	height = DPIUtil.autoScaleUp (height, getDisplay());
 	swFlags = OS.SW_SHOWNOACTIVATE;
 	if (OS.IsWinCE) {
 		swFlags = OS.SW_RESTORE;
@@ -902,6 +909,10 @@
 			return;
 		}
 	}
+	x = DPIUtil.autoScaleDown (x, getDisplay ());
+	y = DPIUtil.autoScaleDown (y, getDisplay ());
+	width = DPIUtil.autoScaleDown (width, getDisplay());
+	height = DPIUtil.autoScaleDown (height, getDisplay());
 	super.setBounds (x, y, width, height, flags, defer);
 }
 
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java
index 2571637..da25824 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java
@@ -1086,7 +1086,7 @@
 
 static Image createIcon (Image image) {
 	Device device = image.getDevice ();
-	ImageData data = image.getImageData ();
+	ImageData data = image.getImageData (device.getDeviceZoom ());
 	if (data.alpha == -1 && data.alphaData == null) {
 		ImageData mask = data.getTransparencyMask ();
 		return new Image (device, data, mask);
@@ -1586,13 +1586,13 @@
 		OS.SystemParametersInfo (OS.SPI_GETWORKAREA, 0, rect, 0);
 		int width = rect.right - rect.left;
 		int height = rect.bottom - rect.top;
-		return new Rectangle (rect.left, rect.top, width, height);
+		return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, width, height), this);
 	}
 	int x = OS.GetSystemMetrics (OS.SM_XVIRTUALSCREEN);
 	int y = OS.GetSystemMetrics (OS.SM_YVIRTUALSCREEN);
 	int width = OS.GetSystemMetrics (OS.SM_CXVIRTUALSCREEN);
 	int height = OS.GetSystemMetrics (OS.SM_CYVIRTUALSCREEN);
-	return new Rectangle (x, y, width, height);
+	return DPIUtil.autoScaleDown(new Rectangle (x, y, width, height), this);
 }
 
 Control getControl (long /*int*/ handle) {
@@ -1662,7 +1662,7 @@
 	checkDevice ();
 	POINT pt = new POINT ();
 	OS.GetCursorPos (pt);
-	return new Point (pt.x, pt.y);
+	return DPIUtil.autoScaleDown(new Point (pt.x, pt.y), this);
 }
 
 /**
@@ -2995,10 +2995,10 @@
 	long /*int*/ hwndFrom = from != null ? from.handle : 0;
 	long /*int*/ hwndTo = to != null ? to.handle : 0;
 	POINT point = new POINT ();
-	point.x = x;
-	point.y = y;
+	point.x = DPIUtil.autoScaleUp(x, this);
+	point.y = DPIUtil.autoScaleUp(y, this);
 	OS.MapWindowPoints (hwndFrom, hwndTo, point, 1);
-	return new Point (point.x, point.y);
+	return DPIUtil.autoScaleDown(new Point (point.x, point.y), this);
 }
 
 /**
@@ -3089,12 +3089,12 @@
 	long /*int*/ hwndFrom = from != null ? from.handle : 0;
 	long /*int*/ hwndTo = to != null ? to.handle : 0;
 	RECT rect = new RECT ();
-	rect.left = x;
-	rect.top  = y;
-	rect.right = x + width;
-	rect.bottom = y + height;
+	rect.left = DPIUtil.autoScaleUp(x, this);
+	rect.top  = DPIUtil.autoScaleUp(y, this);
+	rect.right = DPIUtil.autoScaleUp(x + width, this);
+	rect.bottom = DPIUtil.autoScaleUp(y + height, this);
 	OS.MapWindowPoints (hwndFrom, hwndTo, rect, 2);
-	return new Rectangle (rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top), this);
 }
 
 /*
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandBar.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandBar.java
index ddfcb84..44a93a2 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandBar.java
@@ -10,10 +10,10 @@
  *******************************************************************************/
 package org.eclipse.swt.widgets;
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class support the layout of selectable
@@ -130,6 +130,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int height = 0, width = 0;
 	if (wHint == SWT.DEFAULT || hHint == SWT.DEFAULT) {
 		if (itemCount > 0) {
@@ -175,6 +177,8 @@
 	if (height == 0) height = DEFAULT_HEIGHT;
 	if (wHint != SWT.DEFAULT) width = wHint;
 	if (hHint != SWT.DEFAULT) height = hHint;
+	width = DPIUtil.autoScaleDown(width, getDisplay ());
+	height = DPIUtil.autoScaleDown(height, getDisplay ());
 	Rectangle trim = computeTrim (0, 0, width, height);
 	return new Point (trim.width, trim.height);
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Group.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Group.java
index 8436df5..c30b523 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Group.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Group.java
@@ -11,10 +11,10 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.BidiUtil;
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class provide an etched border
@@ -155,6 +155,7 @@
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
 	Point size = super.computeSize (wHint, hHint, changed);
+	size = DPIUtil.autoScaleUp(size, getDisplay ());
 	int length = text.length ();
 	if (length != 0) {
 		String string = fixText (false);
@@ -176,13 +177,14 @@
 		int offsetY = OS.COMCTL32_MAJOR >= 6 && OS.IsAppThemed () ? 0 : 1;
 		size.x = Math.max (size.x, rect.right - rect.left + CLIENT_INSET * 6 + offsetY);
 	}
-	return size;
+	return DPIUtil.autoScaleDown(size, getDisplay ());
 }
 
 @Override
 public Rectangle computeTrim (int x, int y, int width, int height) {
 	checkWidget ();
 	Rectangle trim = super.computeTrim (x, y, width, height);
+	trim = DPIUtil.autoScaleUp(trim, getDisplay ());
 	long /*int*/ newFont, oldFont = 0;
 	long /*int*/ hDC = OS.GetDC (handle);
 	newFont = OS.SendMessage (handle, OS.WM_GETFONT, 0, 0);
@@ -196,7 +198,7 @@
 	trim.y -= tm.tmHeight + offsetY;
 	trim.width += CLIENT_INSET * 2;
 	trim.height += tm.tmHeight + CLIENT_INSET + offsetY;
-	return trim;
+	return DPIUtil.autoScaleDown(trim, getDisplay ());
 }
 
 @Override
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java
index 7133858..020b832 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java
@@ -13,7 +13,7 @@
 
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.BidiUtil;
+import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
 
 /**
@@ -131,6 +131,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0, border = getBorderWidth ();
 	if ((style & SWT.SEPARATOR) != 0) {
 		int lineWidth = OS.GetSystemMetrics (OS.SM_CXBORDER);
@@ -142,7 +144,7 @@
 		if (wHint != SWT.DEFAULT) width = wHint;
 		if (hHint != SWT.DEFAULT) height = hHint;
 		width += border * 2; height += border * 2;
-		return new Point (width, height);
+		return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 	}
 	int bits = OS.GetWindowLong (handle, OS.GWL_STYLE);
 	boolean drawText = true;
@@ -195,7 +197,7 @@
 	* this trim.
 	*/
 	if (OS.IsWinCE && !drawImage) width += 2;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Link.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Link.java
index c1b6cd8..39696d0 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Link.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Link.java
@@ -10,12 +10,12 @@
  *******************************************************************************/
 package org.eclipse.swt.widgets;
 
-import org.eclipse.swt.internal.BidiUtil;
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
 import org.eclipse.swt.accessibility.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class represent a selectable
@@ -179,6 +179,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	if (wHint != SWT.DEFAULT && wHint < 0) wHint = 0;
 	if (hHint != SWT.DEFAULT && hHint < 0) hHint = 0;
 	int width, height;
@@ -226,7 +228,7 @@
 	int border = getBorderWidth ();
 	width += border * 2;
 	height += border * 2;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/List.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/List.java
index ce40298..8e8348e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/List.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/List.java
@@ -14,7 +14,7 @@
 import org.eclipse.swt.*;
 import org.eclipse.swt.events.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.BidiUtil;
+import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
 
 /**
@@ -218,6 +218,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0;
 	if (wHint == SWT.DEFAULT) {
 		if ((style & SWT.H_SCROLL) != 0) {
@@ -268,7 +270,7 @@
 	if ((style & SWT.H_SCROLL) != 0) {
 		height += OS.GetSystemMetrics (OS.SM_CYHSCROLL);
 	}
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 @Override
@@ -479,7 +481,7 @@
 	checkWidget ();
 	int result = (int)/*64*/OS.SendMessage (handle, OS.LB_GETITEMHEIGHT, 0, 0);
 	if (result == OS.LB_ERR) error (SWT.ERROR_CANNOT_GET_ITEM_HEIGHT);
-	return result;
+	return DPIUtil.autoScaleDown(result, getDisplay ());
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Sash.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Sash.java
index efae7ca..ffb09fd 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Sash.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Sash.java
@@ -11,10 +11,10 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of the receiver represent a selectable user interface object
@@ -129,6 +129,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int border = getBorderWidth ();
 	int width = border * 2, height = border * 2;
 	if ((style & SWT.HORIZONTAL) != 0) {
@@ -138,11 +140,15 @@
 	}
 	if (wHint != SWT.DEFAULT) width = wHint + (border * 2);
 	if (hHint != SWT.DEFAULT) height = hHint + (border * 2);
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 void drawBand (int x, int y, int width, int height) {
 	if ((style & SWT.SMOOTH) != 0) return;
+	x = DPIUtil.autoScaleUp (x, getDisplay ());
+	y = DPIUtil.autoScaleUp (y, getDisplay ());
+	width = DPIUtil.autoScaleUp (width, getDisplay ());
+	height = DPIUtil.autoScaleUp (height, getDisplay ());
 	long /*int*/ hwndTrack = parent.handle;
 	byte [] bits = {-86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0};
 	long /*int*/ stippleBitmap = OS.CreateBitmap (8, 8, 1, 1, bits);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Scrollable.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Scrollable.java
index a71d676..f14af0b 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Scrollable.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Scrollable.java
@@ -11,9 +11,9 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * This class is the abstract superclass of all classes which
@@ -116,6 +116,10 @@
  */
 public Rectangle computeTrim (int x, int y, int width, int height) {
 	checkWidget ();
+	x = DPIUtil.autoScaleUp (x, getDisplay ());
+	y = DPIUtil.autoScaleUp (y, getDisplay ());
+	width = DPIUtil.autoScaleUp (width, getDisplay ());
+	height = DPIUtil.autoScaleUp (height, getDisplay ());
 	long /*int*/ scrolledHandle = scrolledHandle ();
 	RECT rect = new RECT ();
 	OS.SetRect (rect, x, y, x + width, y + height);
@@ -125,7 +129,7 @@
 	if (horizontalBar != null) rect.bottom += OS.GetSystemMetrics (OS.SM_CYHSCROLL);
 	if (verticalBar != null) rect.right += OS.GetSystemMetrics (OS.SM_CXVSCROLL);
 	int nWidth = rect.right - rect.left, nHeight = rect.bottom - rect.top;
-	return new Rectangle (rect.left, rect.top, nWidth, nHeight);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, nWidth, nHeight), getDisplay ());
 }
 
 ScrollBar createScrollBar (int type) {
@@ -207,7 +211,7 @@
 		x = -rect.left;
 		y = -rect.top;
 	}
-	return new Rectangle (x, y, width, height);
+	return DPIUtil.autoScaleDown(new Rectangle (x, y, width, height), getDisplay ());
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Shell.java
index fe67133..a451cae 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Shell.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Shell.java
@@ -940,7 +940,7 @@
 	OS.GetWindowRect (handle, rect);
 	int width = rect.right - rect.left;
 	int height = rect.bottom - rect.top;
-	return new Rectangle (rect.left, rect.top, width, height);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, width, height), getDisplay ());
 }
 
 ToolTip getCurrentToolTip () {
@@ -1040,7 +1040,7 @@
 	}
 	RECT rect = new RECT ();
 	OS.GetWindowRect (handle, rect);
-	return new Point (rect.left, rect.top);
+	return DPIUtil.autoScaleDown(new Point (rect.left, rect.top), getDisplay ());
 }
 
 @Override
@@ -1140,7 +1140,7 @@
 	OS.GetWindowRect (handle, rect);
 	int width = rect.right - rect.left;
 	int height = rect.bottom - rect.top;
-	return new Point (width, height);
+	return DPIUtil.autoScaleDown(new Point (width, height), getDisplay ());
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TabFolder.java
index 901aaf7..3108357 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TabFolder.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TabFolder.java
@@ -11,11 +11,11 @@
 package org.eclipse.swt.widgets;
 
 
+import org.eclipse.swt.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
 
 /**
  * Instances of this class implement the notebook user interface
@@ -196,6 +196,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	Point size = super.computeSize (wHint, hHint, changed);
 	RECT insetRect = new RECT (), itemRect = new RECT ();
 	OS.SendMessage (handle, OS.TCM_ADJUSTRECT, 0, insetRect);
@@ -212,12 +214,16 @@
 	rect.left -= border;  rect.right += border;
 	width = rect.right - rect.left;
 	size.x = Math.max (width, size.x);
-	return size;
+	return DPIUtil.autoScaleDown(size, getDisplay ());
 }
 
 @Override
 public Rectangle computeTrim (int x, int y, int width, int height) {
 	checkWidget ();
+	x = DPIUtil.autoScaleUp(x, getDisplay ());
+	y = DPIUtil.autoScaleUp(y, getDisplay ());
+	width = DPIUtil.autoScaleUp(width, getDisplay ());
+	height = DPIUtil.autoScaleUp(height, getDisplay ());
 	RECT rect = new RECT ();
 	OS.SetRect (rect, x, y, x + width, y + height);
 	OS.SendMessage (handle, OS.TCM_ADJUSTRECT, 1, rect);
@@ -226,7 +232,7 @@
 	rect.top -= border;  rect.bottom += border;
 	int newWidth = rect.right - rect.left;
 	int newHeight = rect.bottom - rect.top;
-	return new Rectangle (rect.left, rect.top, newWidth, newHeight);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, newWidth, newHeight), getDisplay ());
 }
 
 void createItem (TabItem item, int index) {
@@ -338,7 +344,7 @@
 	OS.SendMessage (handle, OS.TCM_ADJUSTRECT, 0, rect);
 	int width = rect.right - rect.left;
 	int height = rect.bottom - rect.top;
-	return new Rectangle (rect.left, rect.top, width, height);
+	return DPIUtil.autoScaleDown(new Rectangle (rect.left, rect.top, width, height), getDisplay ());
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java
index fabcfc8..e224817 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java
@@ -2656,7 +2656,8 @@
 	if (!painted && hooks (SWT.MeasureItem)) hitTestSelection (0, 0, 0);
 	long /*int*/ empty = OS.SendMessage (handle, OS.LVM_APPROXIMATEVIEWRECT, 0, 0);
 	long /*int*/ oneItem = OS.SendMessage (handle, OS.LVM_APPROXIMATEVIEWRECT, 1, 0);
-	return OS.HIWORD (oneItem) - OS.HIWORD (empty);
+	int itemHeight = OS.HIWORD (oneItem) - OS.HIWORD (empty);
+	return DPIUtil.autoScaleDown(itemHeight, getDisplay ());
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Text.java
index 35d889e..9382fd0 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Text.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Text.java
@@ -14,7 +14,7 @@
 import org.eclipse.swt.*;
 import org.eclipse.swt.events.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.BidiUtil;
+import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
 
 /**
@@ -667,6 +667,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int height = 0, width = 0;
 	if (wHint == SWT.DEFAULT || hHint == SWT.DEFAULT) {
 		long /*int*/ newFont, oldFont = 0;
@@ -709,6 +711,8 @@
 	if (height == 0) height = DEFAULT_HEIGHT;
 	if (wHint != SWT.DEFAULT) width = wHint;
 	if (hHint != SWT.DEFAULT) height = hHint;
+	width = DPIUtil.autoScaleDown(width, getDisplay ());
+	height = DPIUtil.autoScaleDown(height, getDisplay ());
 	Rectangle trim = computeTrim (0, 0, width, height);
 	return new Point (trim.width, trim.height);
 }
@@ -717,6 +721,7 @@
 public Rectangle computeTrim (int x, int y, int width, int height) {
 	checkWidget ();
 	Rectangle rect = super.computeTrim (x, y, width, height);
+	rect = DPIUtil.autoScaleUp(rect, getDisplay ());
 	/*
 	* The preferred height of a single-line text widget
 	* has been hand-crafted to be the same height as
@@ -733,7 +738,7 @@
 		rect.width += 2;
 		rect.height += 2;
 	}
-	return rect;
+	return DPIUtil.autoScaleDown(rect, getDisplay ());
 }
 
 /**
@@ -907,7 +912,7 @@
 //	if ((style & SWT.BORDER) != 0 && (style & SWT.FLAT) != 0) {
 //		return OS.GetSystemMetrics (OS.SM_CXBORDER);
 //	}
-	return super.getBorderWidth ();
+	return DPIUtil.autoScaleDown(super.getBorderWidth (), getDisplay ());
 }
 
 /**
@@ -982,7 +987,7 @@
 			OS.SendMessage (handle, OS.EM_SETSEL, start [0], end [0]);
 		}
 	}
-	return new Point (OS.GET_X_LPARAM (caretPos), OS.GET_Y_LPARAM (caretPos));
+	return DPIUtil.autoScaleDown(new Point (OS.GET_X_LPARAM (caretPos), OS.GET_Y_LPARAM (caretPos)), getDisplay ());
 }
 
 /**
@@ -1177,7 +1182,7 @@
 	OS.GetTextMetrics (hDC, tm);
 	if (newFont != 0) OS.SelectObject (hDC, oldFont);
 	OS.ReleaseDC (handle, hDC);
-	return tm.tmHeight;
+	return DPIUtil.autoScaleDown(tm.tmHeight, getDisplay ());
 }
 
 /**
@@ -1892,6 +1897,7 @@
 
 @Override
 void setBounds (int x, int y, int width, int height, int flags) {
+	// AutoScaleUp happens in super.setBounds
 	/*
 	* Feature in Windows.  When the caret is moved,
 	* the text widget scrolls to show the new location.
@@ -1916,6 +1922,10 @@
 			int [] start = new int [1], end = new int [1];
 			OS.SendMessage (handle, OS.EM_GETSEL, start, end);
 			if (start [0] != 0 || end [0] != 0) {
+				x = DPIUtil.autoScaleUp(x, getDisplay ());
+				y = DPIUtil.autoScaleUp(y, getDisplay ());
+				width = DPIUtil.autoScaleUp(width, getDisplay ());
+				height = DPIUtil.autoScaleUp(height, getDisplay ());
 				SetWindowPos (handle, 0, x, y, width, height, flags);
 				OS.SendMessage (handle, OS.EM_SETSEL, 0, 0);
 				OS.SendMessage (handle, OS.EM_SETSEL, start [0], end [0]);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ToolBar.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ToolBar.java
index a43e4f9..2d5b5b8 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ToolBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ToolBar.java
@@ -11,10 +11,10 @@
 package org.eclipse.swt.widgets;
 
 
-import org.eclipse.swt.internal.*;
-import org.eclipse.swt.internal.win32.*;
 import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.win32.*;
 
 /**
  * Instances of this class support the layout of selectable
@@ -191,6 +191,8 @@
 @Override
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
+	wHint = (wHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(wHint, getDisplay ()) : wHint);
+	hHint = (hHint != SWT.DEFAULT ? DPIUtil.autoScaleUp(hHint, getDisplay ()) : hHint);
 	int width = 0, height = 0;
 	if ((style & SWT.VERTICAL) != 0) {
 		RECT rect = new RECT ();
@@ -246,6 +248,8 @@
 	if (height == 0) height = DEFAULT_HEIGHT;
 	if (wHint != SWT.DEFAULT) width = wHint;
 	if (hHint != SWT.DEFAULT) height = hHint;
+	width = DPIUtil.autoScaleDown (width, getDisplay ());
+	height = DPIUtil.autoScaleDown (height, getDisplay ());
 	Rectangle trim = computeTrim (0, 0, width, height);
 	width = trim.width;  height = trim.height;
 	return new Point (width, height);
@@ -255,9 +259,10 @@
 public Rectangle computeTrim (int x, int y, int width, int height) {
 	checkWidget ();
 	Rectangle trim = super.computeTrim (x, y, width, height);
+	trim = DPIUtil.autoScaleUp(trim, getDisplay ());
 	int bits = OS.GetWindowLong (handle, OS.GWL_STYLE);
 	if ((bits & OS.CCS_NODIVIDER) == 0) trim.height += 2;
-	return trim;
+	return DPIUtil.autoScaleDown(trim, getDisplay ());
 }
 
 @Override
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 1e0de9f..a2ade1d 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
@@ -11,11 +11,11 @@
 package org.eclipse.swt.widgets;
 
 
+import org.eclipse.swt.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.win32.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
 
 /**
  * Instances of this class provide a selectable user interface object
@@ -3270,7 +3270,8 @@
  */
 public int getItemHeight () {
 	checkWidget ();
-	return (int)/*64*/OS.SendMessage (handle, OS.TVM_GETITEMHEIGHT, 0, 0);
+	int itemHeight = (int)/*64*/OS.SendMessage (handle, OS.TVM_GETITEMHEIGHT, 0, 0);
+	return DPIUtil.autoScaleDown(itemHeight, getDisplay ());
 }
 
 /**