From c4eb6262e62defefd076c7080b3aa3d48446b09d Mon Sep 17 00:00:00 2001 From: george82 Date: Tue, 20 Mar 2007 10:54:38 +0000 Subject: [PATCH] Added the routines for manipulation the scale filter method. It allow change the scale filter. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2241 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- common/rfb/ScaledPixelBuffer.cxx | 13 +++++++++++++ common/rfb/ScaledPixelBuffer.h | 4 ++++ win/vncviewer/DesktopWindow.cxx | 6 ++++++ win/vncviewer/DesktopWindow.h | 2 ++ 4 files changed, 25 insertions(+) diff --git a/common/rfb/ScaledPixelBuffer.cxx b/common/rfb/ScaledPixelBuffer.cxx index 1be029df..35d5d3b1 100644 --- a/common/rfb/ScaledPixelBuffer.cxx +++ b/common/rfb/ScaledPixelBuffer.cxx @@ -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; diff --git a/common/rfb/ScaledPixelBuffer.h b/common/rfb/ScaledPixelBuffer.h index b41c59ad..fbdba8cb 100644 --- a/common/rfb/ScaledPixelBuffer.h +++ b/common/rfb/ScaledPixelBuffer.h @@ -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); diff --git a/win/vncviewer/DesktopWindow.cxx b/win/vncviewer/DesktopWindow.cxx index 31018d12..75437070 100644 --- a/win/vncviewer/DesktopWindow.cxx +++ b/win/vncviewer/DesktopWindow.cxx @@ -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; diff --git a/win/vncviewer/DesktopWindow.h b/win/vncviewer/DesktopWindow.h index 94f361de..4319b752 100644 --- a/win/vncviewer/DesktopWindow.h +++ b/win/vncviewer/DesktopWindow.h @@ -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(); -- 2.39.5