Auto scaling mode of the vncviewer make improved.
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
diff --git a/win/rfb_win32/ScaledDIBSectionBuffer.cxx b/win/rfb_win32/ScaledDIBSectionBuffer.cxx
index 5ac8361..fc63b21 100644
--- a/win/rfb_win32/ScaledDIBSectionBuffer.cxx
+++ b/win/rfb_win32/ScaledDIBSectionBuffer.cxx
@@ -92,8 +92,29 @@
   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)){
diff --git a/win/rfb_win32/ScaledDIBSectionBuffer.h b/win/rfb_win32/ScaledDIBSectionBuffer.h
index 509411c..8221593 100644
--- a/win/rfb_win32/ScaledDIBSectionBuffer.h
+++ b/win/rfb_win32/ScaledDIBSectionBuffer.h
@@ -51,6 +51,7 @@
       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();