]> source.dussan.org Git - tigervnc.git/commitdiff
Fixed the bug with crashing vncviewer when it works in the
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Sat, 10 Mar 2007 08:55:35 +0000 (08:55 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Sat, 10 Mar 2007 08:55:35 +0000 (08:55 +0000)
scaling mode and scale < 10%.
Scale part of vncviewer code improvements.

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

common/rfb/ScaleFilters.cxx
common/rfb/ScaleFilters.h
common/rfb/ScaledPixelBuffer.cxx
common/rfb/ScaledPixelBuffer.h
win/rfb_win32/ScaledDIBSectionBuffer.cxx
win/rfb_win32/ScaledDIBSectionBuffer.h
win/vncviewer/DesktopWindow.cxx
win/vncviewer/DesktopWindow.h

index cd08f674f6549a7b5444f51e550f06d34449c36c..2e6b88da15e8701426b9027c3aae15cf249be5b5 100644 (file)
@@ -87,9 +87,10 @@ SFilter ScaleFilters::create(char *name_, double radius_, filter_func func_) {
   return filter;\r
 }\r
 \r
-void ScaleFilters::makeWeightTabs(int filter_id, int src_x, int dst_x, double ratio, SFilterWeightTab **pWeightTabs) {\r
+void ScaleFilters::makeWeightTabs(int filter_id, int src_x, int dst_x, SFilterWeightTab **pWeightTabs) {\r
   double sxc;\r
   double offset = 0.5;\r
+  double ratio = (double)dst_x / src_x;\r
 \r
   SFilter sFilter = filters[filter_id];\r
   \r
index 75b1e7f175d4dc6678afbe50fa3ec7e984d4240c..62075d54a64a8f7bbc408dbc542ada2dbb341155 100644 (file)
@@ -60,7 +60,7 @@ namespace rfb {
 \r
     SFilter &operator[](unsigned int filter_id);\r
 \r
-    void makeWeightTabs(int filter, int src_x, int dst_x, double ratio, SFilterWeightTab **weightTabs);\r
+    void makeWeightTabs(int filter, int src_x, int dst_x, SFilterWeightTab **weightTabs);\r
 \r
   protected:\r
     void initFilters();\r
index 6b95058f874aa9f64dc88e18ecff1098405021da..1be029df07a7cedc99451ea6f0d81143e5d507a8 100644 (file)
@@ -30,7 +30,7 @@ using namespace rfb;
 
 ScaledPixelBuffer::ScaledPixelBuffer(U8 **src_data_, int src_width_,
                                      int src_height_, int scale, PixelFormat pf_)
-  : scale_ratio(1), scaleFilterID(scaleFilterBicubic),
+  : scale(100), scale_ratio_x(1), scale_ratio_y(1), scaleFilterID(scaleFilterBicubic),
     xWeightTabs(0), yWeightTabs(0), scaled_data(0) {
 
   setSourceBuffer(src_data_, src_width_, src_height_);
@@ -38,8 +38,8 @@ ScaledPixelBuffer::ScaledPixelBuffer(U8 **src_data_, int src_width_,
 }
 
 ScaledPixelBuffer::ScaledPixelBuffer() 
-  : src_width(0), src_height(0), scaled_width(0), scaled_height(0),
-    scale_ratio(1), scaleFilterID(scaleFilterBicubic),
+  : src_width(0), src_height(0), scaled_width(0), scaled_height(0), scale(100), 
+    scale_ratio_x(1), scale_ratio_y(1), scaleFilterID(scaleFilterBicubic),
     xWeightTabs(0), yWeightTabs(0), src_data(0), scaled_data(0) {
   memset(&pf, 0, sizeof(pf));
 }
@@ -67,8 +67,8 @@ void ScaledPixelBuffer::setSourceBuffer(U8 **src_data_, int w, int h) {
   src_width  = w;
   src_height = h;
   calculateScaledBufferSize();
-  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, scale_ratio, &xWeightTabs);
-  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, scale_ratio, &yWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
 }
 
 void ScaledPixelBuffer::setPF(const PixelFormat &pf_) {
@@ -76,13 +76,13 @@ void ScaledPixelBuffer::setPF(const PixelFormat &pf_) {
   pf = pf_;
 }
 
-void ScaledPixelBuffer::setScaleRatio(double scale_ratio_) {
-  if (scale_ratio != scale_ratio_) {
+void ScaledPixelBuffer::setScale(int scale_) {
+  if (scale != scale_ && scale_ > 0) {
     freeWeightTabs();
-    scale_ratio = scale_ratio_;
+    scale = scale_;
     calculateScaledBufferSize();
-    scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, scale_ratio, &xWeightTabs);
-    scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, scale_ratio, &yWeightTabs);
+    scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
+    scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
   }
 }
 
@@ -166,11 +166,12 @@ void ScaledPixelBuffer::scaleRect(const Rect& rect) {
 Rect ScaledPixelBuffer::calculateScaleBoundary(const Rect& r) {
   int x_start, y_start, x_end, y_end;
   double radius = scaleFilters[scaleFilterID].radius;
-  double translate = 0.5*scale_ratio - 0.5;
-  x_start = (int)ceil(scale_ratio*(r.tl.x-radius) + translate);
-  y_start = (int)ceil(scale_ratio*(r.tl.y-radius) + translate);
-  x_end = (int)ceil(scale_ratio*(r.br.x+radius) + translate);
-  y_end = (int)ceil(scale_ratio*(r.br.y+radius) + translate);
+  double translate_x = 0.5*scale_ratio_x - 0.5;
+  double translate_y = 0.5*scale_ratio_y - 0.5;
+  x_start = (int)ceil(scale_ratio_x*(r.tl.x-radius) + translate_x);
+  y_start = (int)ceil(scale_ratio_y*(r.tl.y-radius) + translate_y);
+  x_end = (int)ceil(scale_ratio_x*(r.br.x+radius) + translate_x);
+  y_end = (int)ceil(scale_ratio_y*(r.br.y+radius) + translate_y);
   if (x_start < 0) x_start = 0;
   if (y_start < 0) y_start = 0;
   if (x_end > scaled_width) x_end = scaled_width;
@@ -179,6 +180,9 @@ Rect ScaledPixelBuffer::calculateScaleBoundary(const Rect& r) {
 }
 
 void ScaledPixelBuffer::calculateScaledBufferSize() {
+  double scale_ratio = (double)scale / 100;
   scaled_width  = (int)ceil(src_width  * scale_ratio);
   scaled_height = (int)ceil(src_height * scale_ratio);
+  scale_ratio_x = (double)scaled_width / src_width;
+  scale_ratio_y = (double)scaled_height / src_height;
 }
index ca0ddf561915b5db3ffe7a2264cf4f02004c8409..b41c59ada14d117ad444c19b9e821a6868024fd5 100644 (file)
@@ -49,8 +49,9 @@ namespace rfb {
     int getSrcWidth()  const { return src_width; }
     int getSrcHeight() const { return src_height; }
     int area() const { return scaled_width * scaled_height; }
-    int getScale() const { return int(scale_ratio * 100 + 0.5); }
-    double getScaleRatio() const { return scale_ratio; }
+    int getScale() const { return scale; }
+    double getScaleRatioX() const { return scale_ratio_x; }
+    double getScaleRatioY() const { return scale_ratio_y; }
 
     // Pixel manipulation routines
     inline U32 getSourcePixel(int x, int y);
@@ -74,8 +75,7 @@ namespace rfb {
     void setPF(const PixelFormat &pf);
 
     // Set the new scale, in percent
-    virtual void setScale(int scale) { setScaleRatio(double(scale)/100.0); }
-    virtual void setScaleRatio(double scale_ratio);
+    virtual void setScale(int scale);
 
     // Scale rect from the source image buffer to the destination buffer
     // using the current interpolation method
@@ -99,8 +99,10 @@ namespace rfb {
     int src_height;
     int scaled_width;
     int scaled_height;
+    int scale;
+    double scale_ratio_x;
+    double scale_ratio_y;
     PixelFormat pf;
-    double scale_ratio;
     unsigned int scaleFilterID;
     ScaleFilters scaleFilters;
     SFilterWeightTab *xWeightTabs;
index 1a287c063a7a7a86aa4ab137f69270e2f702781d..5ac8361430485e858fb75c78453d5ffd7dd6b1c1 100644 (file)
@@ -39,19 +39,19 @@ ScaledDIBSectionBuffer::~ScaledDIBSectionBuffer() {
   if (src_buffer) delete src_buffer;
 }
 
-void ScaledDIBSectionBuffer::setScaleRatio(double scale_ratio_) {
-  if (scale_ratio == scale_ratio_ || scale_ratio <= 0) return;
+void ScaledDIBSectionBuffer::setScale(int scale_) {
+  if (scale == scale_ || scale_ <= 0) return;
 
-  scale_ratio = scale_ratio_;
-  if (scale_ratio == 1) scaling = false;
+  scale = scale_;
+  if (scale == 100) scaling = false;
   else scaling = true;
   
   // FIXME:
   // Calculate the scale weight tabs must be in the ScalePixelBuffer class
   freeWeightTabs();
   calculateScaledBufferSize();
-  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, scale_ratio, &xWeightTabs);
-  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, scale_ratio, &yWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
 
   recreateBuffers();
 }
@@ -86,8 +86,8 @@ void ScaledDIBSectionBuffer::setSize(int src_width_, int src_height_) {
   // Calculate the scale weight tabs must be in the ScalePixelBuffer class
   freeWeightTabs();
   calculateScaledBufferSize();
-  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, scale_ratio, &xWeightTabs);
-  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, scale_ratio, &yWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
+  scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
 
   recreateBuffers();
 }
index eb1d093fabf8dbf0422dfe448d4c9e30134087de..509411c0d1a4813638683f51b0d196130d96a5d5 100644 (file)
@@ -50,9 +50,8 @@ namespace rfb {
       virtual const PixelFormat& getPixelFormat() const { return pf; }
       virtual const PixelFormat& getScaledPixelFormat() const { return getPF(); }
       virtual void setSize(int w, int h);
-      virtual void setScale(int scale) { setScaleRatio(double(scale)/100.0); };
-      virtual void setScaleRatio(double scale_ratio);
-
+      virtual void setScale(int scale);
+      
       virtual void calculateScaledBufferSize();
 
       Rect getRect() const { return ScaledPixelBuffer::getRect(); }
index 5aba7802724bc41f5c4f14e4d3571f53f90e16ea..4a316ad5e18ee0570db34658b607f26a43312ed3 100644 (file)
@@ -858,8 +858,8 @@ DesktopWindow::processMouseMessage(UINT msg, WPARAM wParam, LPARAM lParam)
     // Send a pointer event to the server
     oldpos = p;
     if (buffer->isScaling()) {
-      p.x /= buffer->getScaleRatio();
-      p.y /= buffer->getScaleRatio();
+      p.x /= buffer->getScaleRatioX();
+      p.y /= buffer->getScaleRatioY();
     }
     ptr.pointerEvent(callback, p, mask);
 #ifdef WM_MOUSEWHEEL
@@ -1005,13 +1005,15 @@ DesktopWindow::setSize(int w, int h) {
 
 void DesktopWindow::setAutoScaling(bool as) { 
   autoScaling = as;
+  if (isToolbarEnabled()) refreshToolbarButtons();
   if (as) fitBufferToWindow();
 }
 
-void DesktopWindow::setDesktopScaleRatio(double scale_ratio) {
-  buffer->setScaleRatio(scale_ratio);
-  if (!isAutoScaling()) resizeDesktopWindowToBuffer();
+void DesktopWindow::setDesktopScale(int scale_) {
+  if (buffer->getScale() == scale_ || scale_ <= 0) return;
+  buffer->setScale(scale_);
   if (isToolbarEnabled()) refreshToolbarButtons();
+  if (!isAutoScaling()) resizeDesktopWindowToBuffer();
   char *newTitle = new char[strlen(desktopName)+20];
   sprintf(newTitle, "%s @ %i%%", desktopName, getDesktopScale());
   SetWindowText(handle, TStr(newTitle));
@@ -1037,7 +1039,7 @@ void DesktopWindow::fitBufferToWindow(bool repaint) {
   } else { 
     scale_ratio = double(client_size.width()) / buffer->getSrcWidth();
   }
-  setDesktopScaleRatio(scale_ratio);
+  setDesktopScale(int(scale_ratio * 100));
 }
 
 void
index bce7cf72e044e4f2958873d85a3960adef5404de..7a8fa2c384b9a858ee5ca791a28135314afac0d0 100644 (file)
@@ -88,8 +88,7 @@ namespace rfb {
       void setColour(int i, int r, int g, int b) {buffer->setColour(i, r, g, b);}
       void setAutoScaling(bool as);
       bool isAutoScaling() const { return autoScaling; }
-      void setDesktopScaleRatio(double scale_ratio);
-      void setDesktopScale(int scale) { setDesktopScaleRatio(double(scale)/100); }
+      void setDesktopScale(int scale);
       int  getDesktopScale() const { return buffer->getScale(); }
       void fitBufferToWindow(bool repaint = true);