]> source.dussan.org Git - tigervnc.git/commitdiff
lots of fixes to scaling code. Adds support for FixedRatio and AutoScaling (code...
authorBrian Hinz <bphinz@users.sourceforge.net>
Sat, 1 Oct 2011 18:00:29 +0000 (18:00 +0000)
committerBrian Hinz <bphinz@users.sourceforge.net>
Sat, 1 Oct 2011 18:00:29 +0000 (18:00 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4684 3789f03b-4d11-0410-bbf8-ca57d06f2519

java/src/com/tigervnc/vncviewer/CConn.java
java/src/com/tigervnc/vncviewer/DesktopWindow.java
java/src/com/tigervnc/vncviewer/OptionsDialog.java

index 4abcf13b80b357e87a7e0c56e50b155ca076c34b..61b0ca1809572526e356c204704aab60c6520548 100644 (file)
@@ -62,7 +62,7 @@ import com.tigervnc.rfb.Exception;
 import com.tigervnc.rfb.Point;
 import com.tigervnc.rfb.Rect;
 
-class ViewportFrame extends JFrame 
+class ViewportFrame extends JFrame implements ComponentListener 
 {
   public ViewportFrame(String name, CConn cc_) {
     cc = cc_;
@@ -79,6 +79,32 @@ class ViewportFrame extends JFrame
         cc.close();
       }
     });
+    addComponentListener(this);
+  }
+
+  public void componentResized(ComponentEvent e) {
+    if (cc.options.autoScale || cc.options.fixedRatioScale) {
+      if (sp.getSize().width != cc.desktop.scaledWidth ||
+          sp.getSize().height != cc.desktop.scaledHeight) {
+        cc.reconfigureViewport();
+        if (cc.desktop.cursor != null) {
+          cc.setCursor(cc.desktop.cursor.width(), 
+                       cc.desktop.cursor.height(), 
+                       cc.desktop.cursor.hotspot, 
+                       cc.desktop.cursor.data, 
+                       cc.desktop.cursor.mask);
+        }
+      }
+    }      
+  }
+
+  public void componentHidden(ComponentEvent e) {
+  }
+
+  public void componentShown(ComponentEvent e) {
+  }
+
+  public void componentMoved(ComponentEvent e) {
   }
 
   public void addChild(DesktopWindow child) {
@@ -100,7 +126,8 @@ class ViewportFrame extends JFrame
     } else {
       setSize(w, h);
     }
-    setLocation(x, y);
+    if (!cc.options.autoScale && !cc.options.fixedRatioScale)
+      setLocation(x, y);
     setBackground(Color.BLACK);
   }
 
@@ -467,18 +494,14 @@ public class CConn extends CConnection
     desktop.requestFocusInWindow();
   }
 
-  private void reconfigureViewport()
+  public void reconfigureViewport()
   {
     //viewport.setMaxSize(cp.width, cp.height);
     boolean pack = true;
-    int w = cp.width;
-    int h = cp.height;
     Dimension dpySize = viewport.getToolkit().getScreenSize();
     desktop.setScaledSize();
-    if (!options.autoScale && !options.fixedRatioScale) {
-      w = (int)java.lang.Math.floor(cp.width*scaleFactor/100);
-      h = (int)java.lang.Math.floor(cp.height*scaleFactor/100);
-    }
+    int w = desktop.scaledWidth;
+    int h = desktop.scaledHeight;
     if (fullScreen) {
       viewport.setExtendedState(JFrame.MAXIMIZED_BOTH);
       viewport.setGeometry(0, 0, dpySize.width, dpySize.height, false);
@@ -503,6 +526,7 @@ public class CConn extends CConnection
       viewport.setExtendedState(JFrame.NORMAL);
       viewport.setGeometry(x, y, w, h, pack);
     }
+    viewport.update(viewport.g);
   }
 
   // autoSelectFormatAndEncoding() chooses the format and encoding appropriate
@@ -820,8 +844,10 @@ public class CConn extends CConnection
     String scaleString = viewer.scalingFactor.getValue();
     if (scaleString.equals("Auto")) {
       options.autoScale = true;
+      // FIXME: set scaleFactor?
     } else if( scaleString.equals("FixedRatio")) {
       options.fixedRatioScale = true;
+      // FIXME: set scaleFactor?
     } else { 
       digit = Integer.parseInt(scaleString);
       if (digit >= 1 && digit <= 1000) {
@@ -892,8 +918,22 @@ public class CConn extends CConnection
     viewer.acceptBell.setParam(options.acceptBell.isSelected());
     if (options.autoScale) {
       viewer.scalingFactor.setParam("Auto");
+      scaleFactor = -1;
+      if (desktop != null) {
+        reconfigureViewport();
+        viewport.update(viewport.g);
+        if (desktop.cursor != null)
+          setCursor(desktop.cursor.width(), desktop.cursor.height(), desktop.cursor.hotspot, desktop.cursor.data, desktop.cursor.mask);
+      }
     } else if(options.fixedRatioScale) {
       viewer.scalingFactor.setParam("FixedRatio");
+      scaleFactor = -1;
+      if (desktop != null) {
+        reconfigureViewport();
+        viewport.update(viewport.g);
+        if (desktop.cursor != null)
+          setCursor(desktop.cursor.width(), desktop.cursor.height(), desktop.cursor.hotspot, desktop.cursor.data, desktop.cursor.mask);
+      }
     } else { 
       String scaleString =
         options.scalingFactor.getSelectedItem().toString();
@@ -902,9 +942,10 @@ public class CConn extends CConnection
       scaleFactor = 
         Integer.parseInt(scaleString.substring(0, scaleString.length()-1));
       if (oldScaleFactor != scaleFactor && desktop != null) {
-        //desktop.setScaledSize();
         reconfigureViewport();
         viewport.update(viewport.g);
+        if (desktop.cursor != null)
+          setCursor(desktop.cursor.width(), desktop.cursor.height(), desktop.cursor.hotspot, desktop.cursor.data, desktop.cursor.mask);
       }
     }
 
@@ -1151,10 +1192,10 @@ public class CConn extends CConnection
 
     if (cp.width != desktop.scaledWidth || 
         cp.height != desktop.scaledHeight) {
-      int sx = (desktop.scaleWidthRatio == -1
-        ? ev.getX() : (int)java.lang.Math.floor(ev.getX()/desktop.scaleWidthRatio);
-      int sy = (desktop.scaleHeightRatio == -1
-        ? ev.getY() : (int)java.lang.Math.floor(ev.getY()/desktop.scaleWidthRatio);
+      int sx = (desktop.scaleWidthRatio == 1.00
+        ? ev.getX() : (int)Math.floor(ev.getX()/(float)desktop.scaleWidthRatio);
+      int sy = (desktop.scaleHeightRatio == 1.00
+        ? ev.getY() : (int)Math.floor(ev.getY()/(float)desktop.scaleHeightRatio);
       ev.translatePoint(sx - ev.getX(), sy - ev.getY());
       writer().writePointerEvent(new Point(ev.getX(),ev.getY()), buttonMask);
     } else {
@@ -1175,7 +1216,7 @@ public class CConn extends CConnection
       buttonMask = 16;
     }
     writeModifiers(ev.getModifiers() & ~KeyEvent.ALT_MASK & ~KeyEvent.META_MASK);
-    for (int i=0;i<java.lang.Math.abs(clicks);i++) {
+    for (int i=0;i<Math.abs(clicks);i++) {
       x = ev.getX();
       y = ev.getY();
       writer().writePointerEvent(new Point(x, y), buttonMask);
@@ -1272,7 +1313,7 @@ public class CConn extends CConnection
   boolean firstUpdate;
   boolean pendingUpdate;
   
-  int scaleFactor;
+  int scaleFactor = 100;
   
   static LogWriter vlog = new LogWriter("CConn");
 }
index ea57669e6aed7f502ba35b15f3b4fb23a5f3b924..97a3355c026a37d8bf782a9e852a878db51eb1d1 100644 (file)
@@ -1,4 +1,7 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+/* Copyright (C) 2010 D. R. Commander.  All Rights Reserved.
+ * Copyright (C) 2009 Paul Donohue.  All Rights Reserved.
+ * Copyright (C) 2006 Constantin Kaplinsky.  All Rights Reserved.
+ * Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -151,8 +154,13 @@ class DesktopWindow extends JPanel implements
     MemoryImageSource bitmap = 
       new MemoryImageSource(cursor.width(), cursor.height(), cursor.cm,
                             cursor.data, 0, cursor.width());
-    softCursor = 
-      tk.createCustomCursor(tk.createImage(bitmap), new java.awt.Point(hotspot.x,hotspot.y), "Cursor");
+    int cw = (int)Math.floor((float)cursor.width() * scaleWidthRatio);
+    int ch = (int)Math.floor((float)cursor.height() * scaleHeightRatio);
+    int hint = java.awt.Image.SCALE_DEFAULT;
+    Image cursorImage = (cw <= 0 || ch <= 0) ? tk.createImage(bitmap) :
+      tk.createImage(bitmap).getScaledInstance(cw,ch,hint);
+    softCursor = (tk.createCustomCursor(cursorImage,
+        new java.awt.Point(hotspot.x,hotspot.y), "Cursor"));
     }
 
     if (softCursor != null) {
@@ -310,12 +318,31 @@ class DesktopWindow extends JPanel implements
   }
 
   public void setScaledSize() {
-    int w = (int)java.lang.Math.floor(cc.cp.width*cc.scaleFactor/100);
-    int h = (int)java.lang.Math.floor(cc.cp.height*cc.scaleFactor/100);
-    scaledWidth = w;
-    scaledHeight = h;
-    scaleWidthRatio = ((float)w/(float)cc.cp.width);
-    scaleHeightRatio = ((float)h/(float)cc.cp.height);
+    if (!cc.options.autoScale && !cc.options.fixedRatioScale) {
+      scaledWidth = (int)Math.floor((float)cc.cp.width * (float)cc.scaleFactor/100.0);
+      scaledHeight = (int)Math.floor((float)cc.cp.height * (float)cc.scaleFactor/100.0);
+    } else {
+      if (cc.viewport == null) {
+        scaledWidth = cc.cp.width;
+        scaledHeight = cc.cp.height;
+      } else {
+        Dimension availableSize = cc.viewport.sp.getSize();
+        if (availableSize.width == 0 || availableSize.height == 0)
+          availableSize = new Dimension(cc.cp.width, cc.cp.height);
+        if (cc.options.fixedRatioScale) {
+          float widthRatio = (float)availableSize.width / (float)cc.cp.width;
+          float heightRatio = (float)availableSize.height / (float)cc.cp.height;
+          float ratio = Math.min(widthRatio, heightRatio);
+          scaledWidth = (int)Math.floor(cc.cp.width * ratio);
+          scaledHeight = (int)Math.floor(cc.cp.height * ratio);
+        } else {
+          scaledWidth = availableSize.width;
+          scaledHeight = availableSize.height;
+        }
+      }
+    }
+    scaleWidthRatio = (float)((float)scaledWidth / (float)cc.cp.width);
+    scaleHeightRatio = (float)((float)scaledHeight / (float)cc.cp.height);
   }
 
   synchronized public void paintComponent(Graphics g) {
index 0aa148f20835ef41624be2961c980be0ab6eb3ca..8a5cdb0891def672cc37e08e8e488c1629540725 100644 (file)
@@ -163,10 +163,9 @@ class OptionsDialog extends Dialog implements
     acceptBell.addItemListener(this);
     JLabel scalingFactorLabel = new JLabel("Scaling Factor");
     Object[] scalingFactors = { 
-      //"50%", "75%", "95%", "100%", "105%", 
       "Auto", "Fixed Aspect Ratio", "50%", "75%", "95%", "100%", "105%", 
       "125%", "150%", "175%", "200%", "250%", "300%", "350%", "400%" };
-    scalingFactor  = new JComboBox(scalingFactors);
+    scalingFactor = new JComboBox(scalingFactors);
     scalingFactor.setEditable(true);
     scalingFactor.addItemListener(this);
     addGBComponent(fullScreen,MiscPanel,     0, 0, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4));
@@ -381,6 +380,14 @@ class OptionsDialog extends Dialog implements
       qualityLevel.setEnabled(noJpeg.isSelected());
       defaults.setPref("noJpeg",(noJpeg.isSelected()) ? "on" : "off");
     }
+    if (s instanceof JComboBox && (JComboBox)s == scalingFactor) {
+      autoScale = fixedRatioScale = false;
+      if (scalingFactor.getSelectedItem().equals("Auto")) {
+        autoScale = true;
+      } else if (scalingFactor.getSelectedItem().equals("Fixed Aspect Ratio")) {
+        fixedRatioScale = true;
+      }
+    }
     if (s instanceof JCheckBox && (JCheckBox)s == sendLocalUsername) {
       defaults.setPref("sendLocalUsername",(sendLocalUsername.isSelected()) ? "on" : "off");
     }