]> source.dussan.org Git - tigervnc.git/commitdiff
Auto scaling mode of the vncviewer make improved.
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Mon, 12 Mar 2007 10:48:09 +0000 (10:48 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Mon, 12 Mar 2007 10:48:09 +0000 (10:48 +0000)
In this mode scaling works against vncviewer window size
(instead scale factor).
Added ScaledDIBSectionBuffer::setScaleWindowSize() and
DesktopWindow::printScale() methods.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2234 3789f03b-4d11-0410-bbf8-ca57d06f2519

win/rfb_win32/ScaledDIBSectionBuffer.cxx
win/rfb_win32/ScaledDIBSectionBuffer.h
win/vncviewer/CConn.cxx
win/vncviewer/DesktopWindow.cxx
win/vncviewer/DesktopWindow.h

index 5ac8361430485e858fb75c78453d5ffd7dd6b1c1..fc63b21bed95bb8252804189a22cc6eab5d75d61 100644 (file)
@@ -92,8 +92,29 @@ void ScaledDIBSectionBuffer::setSize(int src_width_, int src_height_) {
   recreateBuffers();
 }
 
+void ScaledDIBSectionBuffer::setScaleWindowSize(int width, int height) {
+  if (scaled_width == width && scaled_height == height) return;
+
+  freeWeightTabs();
+
+  scaled_width = width_ = width;
+  scaled_height = height_ = height;
+
+  if (scaled_width == src_width && scaled_height == src_height) scaling = false;
+  else scaling = true;
+  scale_ratio_x = (double)scaled_width / src_width;
+  scale_ratio_y = (double)scaled_height / src_height;
+  scale = (int)(scale_ratio_x * 100);
+  
+  // FIXME:
+  // Calculate the scale weight tabs must be in the ScalePixelBuffer class
+  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
+
+  recreateBuffers();
+}
+
 void ScaledDIBSectionBuffer::recreateScaledBuffer() {
-  calculateScaledBufferSize();
   if (scaling && memcmp(&(DIBSectionBuffer::getPF()), &RGB24, sizeof(PixelFormat)) != 0) {
     DIBSectionBuffer::setPF(RGB24);
   } else if (!scaling && (memcmp(&(DIBSectionBuffer::getPF()), &pf, sizeof(PixelFormat)) != 0)){
index 509411c0d1a4813638683f51b0d196130d96a5d5..8221593796271480412c378d17b6119ba8d36c29 100644 (file)
@@ -51,6 +51,7 @@ namespace rfb {
       virtual const PixelFormat& getScaledPixelFormat() const { return getPF(); }
       virtual void setSize(int w, int h);
       virtual void setScale(int scale);
+      virtual void setScaleWindowSize(int width, int height);
       
       virtual void calculateScaledBufferSize();
 
index 0d95180cba26ca4771ca51431a4efd60eeb653f8..2341f76ba297aeb106d9183ac221d752cbc641ad 100644 (file)
@@ -157,6 +157,7 @@ CConn::applyOptions(CConnOptions& opt) {
     window->setMenuKey(options.menuKey);
     window->setDisableWinKeys(options.disableWinKeys);
     window->setShowToolbar(options.showToolbar);
+    window->printScale();
     if (options.autoScaling) {
       window->setAutoScaling(true);
     } else {
index 679964a0e964e586964bafccf4a4533b99e32472..c7c6e61c12d27fcdd74adff2b379e3fc6c516e40 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <windows.h>
 #include <commctrl.h>
+#include <math.h>
 #include <rfb/Configuration.h>
 #include <rfb/LogWriter.h>
 #include <rfb_win32/WMShatter.h>
@@ -1014,10 +1015,7 @@ void DesktopWindow::setDesktopScale(int scale_) {
   buffer->setScale(scale_);
   if (isToolbarEnabled()) refreshToolbarButtons();
   if (!isAutoScaling() && !isFullscreen()) resizeDesktopWindowToBuffer();
-  char *newTitle = new char[strlen(desktopName)+20];
-  sprintf(newTitle, "%s @ %i%%", desktopName, getDesktopScale());
-  SetWindowText(handle, TStr(newTitle));
-  delete [] newTitle;
+  printScale();
   InvalidateRect(frameHandle, 0, FALSE);
 }
 
@@ -1035,11 +1033,21 @@ void DesktopWindow::fitBufferToWindow(bool repaint) {
     client_size = Rect(r.left, r.top, r.right, r.bottom);
   }
   if (resized_aspect_corr > aspect_corr) {
-    scale_ratio = double(client_size.height()) / buffer->getSrcHeight();
+    scale_ratio = (double)client_size.height() / buffer->getSrcHeight();
+    buffer->setScaleWindowSize(ceil(buffer->getSrcWidth()*scale_ratio), client_size.height());
   } else { 
-    scale_ratio = double(client_size.width()) / buffer->getSrcWidth();
+    scale_ratio = (double)client_size.width() / buffer->getSrcWidth();
+    buffer->setScaleWindowSize(client_size.width(), ceil(buffer->getSrcHeight()*scale_ratio));
   }
-  setDesktopScale(int(scale_ratio * 100));
+  printScale();
+  InvalidateRect(frameHandle, 0, FALSE);
+}
+
+void DesktopWindow::printScale() {
+  char *newTitle = new char[strlen(desktopName)+20];
+  sprintf(newTitle, "%s @ %i%%", desktopName, getDesktopScale());
+  SetWindowText(handle, TStr(newTitle));
+  delete [] newTitle;
 }
 
 void
index 7a8fa2c384b9a858ee5ca791a28135314afac0d0..a6bc5df4b38746c1c1348e8ae49e51de343c7817 100644 (file)
@@ -91,6 +91,7 @@ namespace rfb {
       void setDesktopScale(int scale);
       int  getDesktopScale() const { return buffer->getScale(); }
       void fitBufferToWindow(bool repaint = true);
+      void printScale();
 
       // - Set the cursor to render when the pointer is within the desktop buffer
       void setCursor(int w, int h, const Point& hotspot, void* data, void* mask);