modules/graphics/src/main/native-glass/win/GlassScreen.cpp

Print this page

        

@@ -46,12 +46,12 @@
     RECT rcWork;
     RECT fxMonitor;
     RECT fxWork;
     jboolean primaryScreen;
     jint colorDepth;
-    jfloat uiScale;
-    jfloat renderScale;
+    jfloat uiScaleX;
+    jfloat uiScaleY;
     jint dpiX;
     jint dpiY;
     jint anchoredInPass;
     jobject gScreen;
 };

@@ -188,11 +188,11 @@
     ASSERT(hDC);
 
     mis->primaryScreen = ((mix.dwFlags & MONITORINFOF_PRIMARY) != 0) ? JNI_TRUE : JNI_FALSE;
     mis->colorDepth = ::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES);
     UINT resx, resy;
-    UINT uires;
+    UINT uiresx, uiresy;
     if (pGetDPIForMonitor) {
         // If we can use the GetDPIForMonitor function, then its Effective
         // value will tell us how much we should scale ourselves based on
         // all system settings, and its Raw value will tell us exactly how
         // many pixels per inch there are.  The Effective value can be

@@ -210,27 +210,29 @@
 #endif /* DEBUG_DPI */
         if (res != S_OK) {
             resx = ::GetDeviceCaps(hDC, LOGPIXELSX);
             resy = ::GetDeviceCaps(hDC, LOGPIXELSY);
         }
-        uires = resx;
+        uiresx = resx;
+        uiresy = resy;
         res = (*pGetDPIForMonitor)(hMonitor, MDT_Raw_DPI, &resx, &resy);
 #ifdef DEBUG_DPI
         fprintf(stderr, "raw DPI X,Y = [0x%08x] %d, %d\n", res, resx, resy);
 #endif /* DEBUG_DPI */
     } else {
         resx = ::GetDeviceCaps(hDC, LOGPIXELSX);
         resy = ::GetDeviceCaps(hDC, LOGPIXELSY);
 #ifdef DEBUG_DPI
         fprintf(stderr, "logpixelsX,Y = %d, %d\n", resx, resy);
 #endif /* DEBUG_DPI */
-        uires = resx;
+        uiresx = resx;
+        uiresy = resy;
     }
     mis->dpiX = resx;
     mis->dpiY = resy;
-    mis->uiScale = GlassApplication::GetUIScale(uires);
-    mis->renderScale = GlassApplication::getRenderScale(mis->uiScale);
+    mis->uiScaleX = GlassApplication::GetUIScale(uiresx);
+    mis->uiScaleY = GlassApplication::GetUIScale(uiresy);
 
     ::DeleteDC(hDC);
 }
 
 jclass GetScreenCls(JNIEnv *env)

@@ -277,11 +279,11 @@
 jobject CreateJavaMonitorFromMIS(JNIEnv *env, MonitorInfoStruct *pMIS)
 {
     jclass screenCls = GetScreenCls(env);
 
     if (javaIDs.Screen.init == NULL) {
-        javaIDs.Screen.init = env->GetMethodID(screenCls, "<init>", "(JIIIIIIIIIIIFF)V");
+        javaIDs.Screen.init = env->GetMethodID(screenCls, "<init>", "(JIIIIIIIIIIIIIIIFFFF)V");
         ASSERT(javaIDs.Screen.init);
         if (CheckAndClearException(env)) return NULL;
     }
 
     jobject gScn = env->NewObject(screenCls, javaIDs.Screen.init,

@@ -291,20 +293,27 @@
                           pMIS->fxMonitor.left,
                           pMIS->fxMonitor.top,
                           pMIS->fxMonitor.right  - pMIS->fxMonitor.left,
                           pMIS->fxMonitor.bottom - pMIS->fxMonitor.top,
 
+                          pMIS->rcMonitor.left,
+                          pMIS->rcMonitor.top,
+                          pMIS->rcMonitor.right  - pMIS->rcMonitor.left,
+                          pMIS->rcMonitor.bottom - pMIS->rcMonitor.top,
+
                           pMIS->fxWork.left,
                           pMIS->fxWork.top,
                           pMIS->fxWork.right  - pMIS->fxWork.left,
                           pMIS->fxWork.bottom - pMIS->fxWork.top,
 
                           pMIS->dpiX,
                           pMIS->dpiY,
 
-                          pMIS->uiScale,
-                          pMIS->renderScale);
+                          pMIS->uiScaleX,
+                          pMIS->uiScaleY,
+                          pMIS->uiScaleX,
+                          pMIS->uiScaleY);
     if (CheckAndClearException(env)) return NULL;
     pMIS->gScreen = env->NewGlobalRef(gScn);
     return gScn;
 }
 

@@ -388,20 +397,23 @@
     jint monH = pMIS->rcMonitor.bottom - monY;
     jint wrkL = pMIS->rcWork   .left   - monX;
     jint wrkT = pMIS->rcWork   .top    - monY;
     jint wrkR = pMIS->rcWork   .right  - monX;
     jint wrkB = pMIS->rcWork   .bottom - monY;
-    jfloat scale = pMIS->uiScale;
-    if (scale > 1.0f) {
-        pMIS->dpiX = (jint) floorf((pMIS->dpiX / scale) + 0.5f);
-        pMIS->dpiY = (jint) floorf((pMIS->dpiY / scale) + 0.5f);
-        monW = (jint) floorf((monW / scale) + 0.5f);
-        monH = (jint) floorf((monH / scale) + 0.5f);
-        wrkL = (jint) floorf((wrkL / scale) + 0.5f);
-        wrkT = (jint) floorf((wrkT / scale) + 0.5f);
-        wrkR = (jint) floorf((wrkR / scale) + 0.5f);
-        wrkB = (jint) floorf((wrkB / scale) + 0.5f);
+    jfloat scalex = pMIS->uiScaleX;
+    jfloat scaley = pMIS->uiScaleY;
+    if (scalex != 1.0f) {
+        pMIS->dpiX = (jint) floorf((pMIS->dpiX / scalex) + 0.5f);
+        monW = (jint) floorf((monW / scalex) + 0.5f);
+        wrkL = (jint) floorf((wrkL / scalex) + 0.5f);
+        wrkR = (jint) floorf((wrkR / scalex) + 0.5f);
+    }
+    if (scaley != 1.0f) {
+        pMIS->dpiY = (jint) floorf((pMIS->dpiY / scaley) + 0.5f);
+        monH = (jint) floorf((monH / scaley) + 0.5f);
+        wrkT = (jint) floorf((wrkT / scaley) + 0.5f);
+        wrkB = (jint) floorf((wrkB / scaley) + 0.5f);
     }
 
     if (xBefore) fxX -= monW;
     if (yBefore) fxY -= monH;
     pMIS->fxMonitor.left   = fxX;

@@ -437,21 +449,21 @@
              jboolean before, jint pass)
 {
     int x = before ? pAnchor->fxMonitor.left : pAnchor->fxMonitor.right;
     int yoff = originOffsetFromRanges(pAnchor->rcMonitor.top, pAnchor->rcMonitor.bottom,
                                       pMon->rcMonitor.top, pMon->rcMonitor.bottom,
-                                      pAnchor->uiScale, pMon->uiScale);
+                                      pAnchor->uiScaleY, pMon->uiScaleY);
     int y = pAnchor->fxMonitor.top + yoff;
     anchorTo(pMon, x, before, y, false, pass);
 }
 
 void anchorV(MonitorInfoStruct *pAnchor, MonitorInfoStruct *pMon,
              jboolean before, jint pass)
 {
     int xoff = originOffsetFromRanges(pAnchor->rcMonitor.left, pAnchor->rcMonitor.right,
                                       pMon->rcMonitor.left, pMon->rcMonitor.right,
-                                      pAnchor->uiScale, pMon->uiScale);
+                                      pAnchor->uiScaleX, pMon->uiScaleX);
     int x = pAnchor->fxMonitor.left + xoff;
     int y = before ? pAnchor->fxMonitor.top : pAnchor->fxMonitor.bottom;
     anchorTo(pMon, x, false, y, before, pass);
 }