]> source.dussan.org Git - tigervnc.git/commitdiff
Added the routines for manipulation the scale filter method. It allow change the
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Tue, 20 Mar 2007 10:54:38 +0000 (10:54 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Tue, 20 Mar 2007 10:54:38 +0000 (10:54 +0000)
scale filter.

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

common/rfb/ScaledPixelBuffer.cxx
common/rfb/ScaledPixelBuffer.h
win/vncviewer/DesktopWindow.cxx
win/vncviewer/DesktopWindow.h

index 1be029df07a7cedc99451ea6f0d81143e5d507a8..35d5d3b161046fc38010385fcfee13c000056609 100644 (file)
@@ -86,6 +86,19 @@ void ScaledPixelBuffer::setScale(int scale_) {
   }
 }
 
+void ScaledPixelBuffer::setScaleFilter(unsigned int scaleFilterID_) {
+  if (scaleFilterID == scaleFilterID_ || scaleFilterID_ > scaleFilterMaxNumber) return;
+
+  scaleFilterID = scaleFilterID_;
+  
+  if (src_width && src_height && scaled_width && scaled_height && pf.depth > 0) {
+    freeWeightTabs();
+    scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
+    scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
+    if (scale != 100) scaleRect(Rect(0, 0, src_width, src_height));
+  }
+}
+
 inline void ScaledPixelBuffer::rgbFromPixel(U32 p, int &r, int &g, int &b) {
   r = (((p >> pf.redShift  ) & pf.redMax  ) * 255 + pf.redMax  /2) / pf.redMax;
   g = (((p >> pf.greenShift) & pf.greenMax) * 255 + pf.greenMax/2) / pf.greenMax;
index b41c59ada14d117ad444c19b9e821a6868024fd5..fbdba8cb4c4043564059d9d6a0c8baf9fcc59cb2 100644 (file)
@@ -77,6 +77,10 @@ namespace rfb {
     // Set the new scale, in percent
     virtual void setScale(int scale);
 
+    // Set/get the scale method
+    virtual void setScaleFilter(unsigned int scaleFilterID);
+    unsigned int getScaleFilterID() const { return scaleFilterID; }
+
     // Scale rect from the source image buffer to the destination buffer
     // using the current interpolation method
     virtual void scaleRect(const Rect& r);
index 31018d124322b6093c5c9f6418f9e88679f3ba49..75437070068db6824146f0ba9a0dd3944156b642 100644 (file)
@@ -1024,6 +1024,12 @@ void DesktopWindow::setDesktopScale(int scale_) {
   InvalidateRect(frameHandle, 0, FALSE);
 }
 
+void DesktopWindow::setDesktopScaleFilter(unsigned int scaleFilterID) { 
+  if (scaleFilterID == getDesktopScaleFilterID() || scaleFilterID > scaleFilterMaxNumber) return;
+  buffer->setScaleFilter(scaleFilterID);
+  InvalidateRect(frameHandle, 0, FALSE);
+}
+
 void DesktopWindow::convertCursorToBuffer() {
   if (memcmp(&(cursor.getPF()), &(buffer->getPF()), sizeof(PixelBuffer)) == 0) return;
   internalSetCursor = true;
index 94f361deef2daf3f2cad5e4996b9ca2103dce0b5..4319b752ec86bb70edc2d279face12e73c474303 100644 (file)
@@ -90,6 +90,8 @@ namespace rfb {
       bool isAutoScaling() const { return autoScaling; }
       void setDesktopScale(int scale);
       int  getDesktopScale() const { return buffer->getScale(); }
+      void setDesktopScaleFilter(unsigned int scaleFilterID);
+      unsigned int getDesktopScaleFilterID() const { return buffer->getScaleFilterID(); }
       void fitBufferToWindow(bool repaint = true);
       void printScale();