< prev index next >

src/java.desktop/windows/native/libawt/windows/awt_Win32GraphicsDevice.cpp

Print this page
rev 60071 : 8211999: Window positioning bugs due to overlapping GraphicsDevice bounds (Windows/HiDPI)
Reviewed-by: XXX

*** 75,84 **** --- 75,85 ---- { this->screen = screen; this->devicesArray = arr; this->scaleX = 1; this->scaleY = 1; + disableScaleAutoRefresh = FALSE; javaDevice = NULL; colorData = new ImgColorData; colorData->grayscale = GS_NOTGRAY; palette = NULL; cData = NULL;
*** 631,655 **** --- 632,680 ---- int AwtWin32GraphicsDevice::ScaleUpX(int x) { return ClipRound(x * scaleX); } + int AwtWin32GraphicsDevice::ScaleUpAbsX(int x) + { + LONG screen = pMonitorInfo->rcMonitor.left; + return screen + ClipRound((x - screen) * scaleX); + } + int AwtWin32GraphicsDevice::ScaleUpY(int y) { return ClipRound(y * scaleY); } + int AwtWin32GraphicsDevice::ScaleUpAbsY(int y) + { + LONG screen = pMonitorInfo->rcMonitor.top; + return screen + ClipRound((y - screen) * scaleY); + } + int AwtWin32GraphicsDevice::ScaleDownX(int x) { return ClipRound(x / scaleX); } + int AwtWin32GraphicsDevice::ScaleDownAbsX(int x) + { + LONG screen = pMonitorInfo->rcMonitor.left; + return screen + ClipRound((x - screen) / scaleX); + } + int AwtWin32GraphicsDevice::ScaleDownY(int y) { return ClipRound(y / scaleY); } + int AwtWin32GraphicsDevice::ScaleDownAbsY(int y) + { + LONG screen = pMonitorInfo->rcMonitor.top; + return screen + ClipRound((y - screen) / scaleY); + } + int AwtWin32GraphicsDevice::ClipRound(double value) { value -= 0.5; if (value < INT_MIN) {
*** 662,679 **** } return (int)ceil(value); } ! void AwtWin32GraphicsDevice::InitDesktopScales() ! { float dpiX = -1.0f; float dpiY = -1.0f; GetScreenDpi(GetMonitor(), &dpiX, &dpiY); if (dpiX > 0 && dpiY > 0) { SetScale(dpiX / 96, dpiY / 96); } } float AwtWin32GraphicsDevice::GetScaleX() { return scaleX; --- 687,705 ---- } return (int)ceil(value); } ! void AwtWin32GraphicsDevice::InitDesktopScales() { ! if (!disableScaleAutoRefresh) { float dpiX = -1.0f; float dpiY = -1.0f; GetScreenDpi(GetMonitor(), &dpiX, &dpiY); if (dpiX > 0 && dpiY > 0) { SetScale(dpiX / 96, dpiY / 96); } + } } float AwtWin32GraphicsDevice::GetScaleX() { return scaleX;
*** 692,701 **** --- 718,732 ---- void AwtWin32GraphicsDevice::DisableOffscreenAcceleration() { // REMIND: noop for now } + void AwtWin32GraphicsDevice::DisableScaleAutoRefresh() + { + disableScaleAutoRefresh = TRUE; + } + /** * Invalidates the GraphicsDevice object associated with this * device by disabling offscreen acceleration and calling * invalidate(defIndex) on the java object. */
*** 752,761 **** --- 783,807 ---- ::GetMonitorInfo(monitor, devices->GetDevice(deviceIndex)->pMonitorInfo); } } + /** + * This function updates the scale factor for all monitors on the system. + */ + void AwtWin32GraphicsDevice::ResetAllDesktopScales() + { + if (!Devices::GetInstance()){ + return; + } + Devices::InstanceAccess devices; + int devicesNum = devices->GetNumDevices(); + for (int deviceIndex = 0; deviceIndex < devicesNum; deviceIndex++) { + devices->GetDevice(deviceIndex)->InitDesktopScales(); + } + } + void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice( HMONITOR hMonitor) { Devices::InstanceAccess devices; if (hMonitor == NULL) {
*** 1391,1400 **** --- 1437,1447 ---- { Devices::InstanceAccess devices; AwtWin32GraphicsDevice *device = devices->GetDevice(screen); if (device != NULL ) { + device->DisableScaleAutoRefresh(); device->SetScale(scaleX, scaleY); } } /*
< prev index next >