Added the improvements of the ScaledPixelBuffer class - increased scaled image quality when scale < 100%.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2365 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/ScaledPixelBuffer.cxx b/common/rfb/ScaledPixelBuffer.cxx
index 5b6e310..12658f7 100644
--- a/common/rfb/ScaledPixelBuffer.cxx
+++ b/common/rfb/ScaledPixelBuffer.cxx
@@ -94,8 +94,8 @@
void ScaledPixelBuffer::setScale(int scale_) {
if (scale != scale_ && scale_ > 0) {
- freeWeightTabs();
scale = scale_;
+ freeWeightTabs();
calculateScaledBufferSize();
scaleFilters.makeWeightTabs(scaleFilterID, src_width, scaled_width, &xWeightTabs);
scaleFilters.makeWeightTabs(scaleFilterID, src_height, scaled_height, &yWeightTabs);
@@ -204,13 +204,16 @@
Rect ScaledPixelBuffer::calculateScaleBoundary(const Rect& r) {
int x_start, y_start, x_end, y_end;
- double radius = scaleFilters[scaleFilterID].radius;
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);
+ double sourceXScale = __rfbmax(1.0, 1.0/scale_ratio_x);
+ double sourceYScale = __rfbmax(1.0, 1.0/scale_ratio_y);
+ double sourceXRadius = __rfbmax(0.5, sourceXScale*scaleFilters[scaleFilterID].radius);
+ double sourceYRadius = __rfbmax(0.5, sourceYScale*scaleFilters[scaleFilterID].radius);
+ x_start = (int)ceil(scale_ratio_x*(r.tl.x-sourceXRadius) + translate_x + SCALE_ERROR);
+ y_start = (int)ceil(scale_ratio_y*(r.tl.y-sourceYRadius) + translate_y + SCALE_ERROR);
+ x_end = (int)floor(scale_ratio_x*((r.br.x-1)+sourceXRadius) + translate_x - SCALE_ERROR) + 1;
+ y_end = (int)floor(scale_ratio_y*((r.br.y-1)+sourceXRadius) + translate_y - SCALE_ERROR) + 1;
if (x_start < 0) x_start = 0;
if (y_start < 0) y_start = 0;
if (x_end > scaled_width) x_end = scaled_width;