modules/graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java

Print this page

        

@@ -275,73 +275,134 @@
         }
     }
 
     @Override public void setBounds(float x, float y, boolean xSet, boolean ySet,
                                     float w, float h, float cw, float ch,
-                                    float xGravity, float yGravity)
+                                    float xGravity, float yGravity,
+                                    float renderScaleX, float renderScaleY)
     {
+        if (renderScaleX > 0.0 || renderScaleY > 0.0) {
+            // We set the render scale first since the call to setBounds()
+            // below can induce a recursive update on the scales if it moves
+            // the window to a new screen and we will then end up being called
+            // back with a new scale.  We do not want to set these old scale
+            // values after that recursion happens.
+            if (renderScaleX > 0.0) {
+                platformWindow.setRenderScaleX(renderScaleX);
+            }
+            if (renderScaleY > 0.0) {
+                platformWindow.setRenderScaleY(renderScaleY);
+            }
+            ViewScene vscene = getViewScene();
+            if (vscene != null) {
+                vscene.updateSceneState();
+                vscene.entireSceneNeedsRepaint();
+            }
+        }
         if (isAppletStage) {
             xSet = ySet = false;
         }
-        float pScale = platformWindow.getPlatformScale();
+        float pScaleX = platformWindow.getPlatformScaleX();
+        float pScaleY = platformWindow.getPlatformScaleY();
         int px, py;
         if (xSet || ySet) {
             Screen screen = platformWindow.getScreen();
             List<Screen> screens = Screen.getScreens();
             if (screens.size() > 1) {
-                float wx = xSet ? x : platformWindow.getX();
-                float wy = ySet ? y : platformWindow.getY();
-                float relx = screen.getX() + screen.getWidth() / 2.0f - wx;
-                float rely = screen.getY() + screen.getHeight()/ 2.0f - wy;
+                float winfxW = (w > 0) ? w : (platformWindow.getWidth() / pScaleX);
+                float winfxH = (h > 0) ? h : (platformWindow.getHeight()/ pScaleY);
+                float winfxX = xSet ? x :
+                        screen.getX() + (platformWindow.getX() - screen.getPlatformX()) / pScaleX;
+                float winfxY = ySet ? y :
+                        screen.getY() + (platformWindow.getY() - screen.getPlatformY()) / pScaleY;
+                float winfxCX = winfxX + winfxW/2f;
+                float winfxCY = winfxY + winfxH/2f;
+                // If the center point of the window (winfxCX,Y) is on any
+                // screen, then use that screen.  Otherwise, use the screen
+                // whose center is closest to the window center.
+                int scrX = screen.getX();
+                int scrY = screen.getY();
+                int scrW = screen.getWidth();
+                int scrH = screen.getHeight();
+                if (winfxCX < scrX ||
+                    winfxCY < scrY ||
+                    winfxCX >= scrX + scrW ||
+                    winfxCY >= scrY + scrH)
+                {
+                    float relx = scrX + scrW / 2.0f - winfxCX;
+                    float rely = scrY + scrH / 2.0f - winfxCY;
                 float distsq = relx * relx + rely * rely;
                 for (Screen s : Screen.getScreens()) {
-                    relx = s.getX() + s.getWidth() / 2.0f - wx;
-                    rely = s.getY() + s.getHeight()/ 2.0f - wy;
+                        scrX = s.getX();
+                        scrY = s.getY();
+                        scrW = s.getWidth();
+                        scrH = s.getHeight();
+                        if (winfxCX >= scrX &&
+                            winfxCY >= scrY &&
+                            winfxCX < scrX + scrW &&
+                            winfxCY < scrY + scrH)
+                        {
+                            screen = s;
+                            break;
+                        }
+                        relx = scrX + scrW / 2.0f - winfxCX;
+                        rely = scrY + scrH / 2.0f - winfxCY;
                     float distsq2 = relx * relx + rely * rely;
                     if (distsq2 < distsq) {
                         screen = s;
                         distsq = distsq2;
                     }
                 }
             }
+            }
             float sx = screen == null ? 0 : screen.getX();
             float sy = screen == null ? 0 : screen.getY();
-            px = xSet ? Math.round(sx + (x - sx) * pScale) : 0;
-            py = ySet ? Math.round(sy + (y - sy) * pScale) : 0;
+            float sScaleX = screen.getPlatformScaleX();
+            float sScaleY = screen.getPlatformScaleY();
+            px = xSet ? Math.round(screen.getPlatformX() + (x - sx) * sScaleX) : 0;
+            py = ySet ? Math.round(screen.getPlatformY() + (y - sy) * sScaleY) : 0;
         } else {
             px = py = 0;
         }
-        int pw = (int) (w > 0 ? Math.ceil(w * pScale) : w);
-        int ph = (int) (h > 0 ? Math.ceil(h * pScale) : h);
-        int pcw = (int) (cw > 0 ? Math.ceil(cw * pScale) : cw);
-        int pch = (int) (ch > 0 ? Math.ceil(ch * pScale) : ch);
+        int pw = (int) (w > 0 ? Math.ceil(w * pScaleX) : w);
+        int ph = (int) (h > 0 ? Math.ceil(h * pScaleY) : h);
+        int pcw = (int) (cw > 0 ? Math.ceil(cw * pScaleX) : cw);
+        int pch = (int) (ch > 0 ? Math.ceil(ch * pScaleY) : ch);
         platformWindow.setBounds(px, py, xSet, ySet,
                                  pw, ph, pcw, pch,
                                  xGravity, yGravity);
     }
 
     @Override
-    public float getUIScale() {
-        return platformWindow.getPlatformScale();
+    public float getPlatformScaleX() {
+        return platformWindow.getPlatformScaleX();
+    }
+
+    @Override
+    public float getPlatformScaleY() {
+        return platformWindow.getPlatformScaleY();
+    }
+
+    @Override
+    public float getOutputScaleX() {
+        return platformWindow.getOutputScaleX();
     }
 
     @Override
-    public float getRenderScale() {
-        return platformWindow.getRenderScale();
+    public float getOutputScaleY() {
+        return platformWindow.getOutputScaleY();
     }
 
     @Override public void setMinimumSize(int minWidth, int minHeight) {
-        float pScale = platformWindow.getPlatformScale();
-        minWidth  = (int) Math.ceil(minWidth  * pScale);
-        minHeight = (int) Math.ceil(minHeight * pScale);
+        minWidth  = (int) Math.ceil(minWidth  * getPlatformScaleX());
+        minHeight = (int) Math.ceil(minHeight * getPlatformScaleY());
         platformWindow.setMinimumSize(minWidth, minHeight);
     }
 
     @Override public void setMaximumSize(int maxWidth, int maxHeight) {
-        float pScale = platformWindow.getPlatformScale();
-        maxWidth  = (int) Math.ceil(maxWidth  * pScale);
-        maxHeight = (int) Math.ceil(maxHeight * pScale);
+        maxWidth  = (int) Math.ceil(maxWidth  * getPlatformScaleX());
+        maxHeight = (int) Math.ceil(maxHeight * getPlatformScaleY());
         platformWindow.setMaximumSize(maxWidth, maxHeight);
     }
 
     static Image findBestImage(java.util.List icons, int width, int height) {
         Image image = null;