diff --git a/common/rfb/ScaledPixelBuffer.cxx b/common/rfb/ScaledPixelBuffer.cxx
index d9a245b..2bfb4e8 100644
--- a/common/rfb/ScaledPixelBuffer.cxx
+++ b/common/rfb/ScaledPixelBuffer.cxx
@@ -110,40 +110,44 @@
 }
 
 void ScaledPixelBuffer::scaleRect(const Rect& rect) {
-  U8 *ptr;
-  static double c1_sub_dx, c1_sub_dy;
   Rect changed_rect;
-  float rx, gx, bx;
-  float red, green, blue; 
-  int r, g, b;
-  
+  U8 *ptr;
+  U32 *px, *psrc_data = (U32*)(*src_data);
+  float rx, gx, bx, red, green, blue, *xweight, *yweight, xWeight, yWeight;
+  int r, g, b, xwi, ywi;
 
   // Calculate the changed pixel rect in the scaled image
   changed_rect = calculateScaleBoundary(rect);
 
-  int bytesPerPixel = pf.bpp/8;
-  int bytesPerRow = src_width * bytesPerPixel;
-
   for (int y = changed_rect.tl.y; y < changed_rect.br.y; y++) {
-    ptr = &(*scaled_data)[(changed_rect.tl.x + y*scaled_width) * bytesPerPixel];
-    
+    ptr = &(*scaled_data)[(changed_rect.tl.x + y*scaled_width) * 4];
+    yweight = xWeightTabs[y].weight;
+
     for (int x = changed_rect.tl.x; x < changed_rect.br.x; x++) {
-            
-      int ywi = 0; red = 0; green = 0; blue = 0;
+      ywi = 0; red = 0; green = 0; blue = 0;
+      px = &psrc_data[xWeightTabs[x].i0 + yWeightTabs[y].i0*src_width];
+      xweight = xWeightTabs[x].weight;
+    
+      // Calculate the scaled pixel value at (x, y) coordinates by
+      // convolution the matrix from source image:
+      // [(xWeight.i0,yWeight.i0)......(xWeight.i1-1,yWeight.i0)]
+      // [......................................................]
+      // [(xWeight.i0,yWeight.i1-1)..(xWeight.i1-1,yWeight.i1-1)],
+      // where [i0, i1) is the scaled filter interval.
       for (int ys = yWeightTabs[y].i0; ys < yWeightTabs[y].i1; ys++) {
-        
-        int xwi = 0; rx = 0; gx = 0; bx = 0;
+        xwi = 0; rx = 0; gx = 0; bx = 0;
         for (int xs = xWeightTabs[x].i0; xs < xWeightTabs[x].i1; xs++) {
-          rgbFromPixel(getSourcePixel(xs, ys), r, g, b);
-          rx += r * xWeightTabs[x].weight[xwi];
-          gx += g * xWeightTabs[x].weight[xwi];
-          bx += b * xWeightTabs[x].weight[xwi];
-          xwi++;
+          rgbFromPixel(px[xwi], r, g, b);
+          xWeight = xweight[xwi++];
+          rx += r * xWeight;
+          gx += g * xWeight;
+          bx += b * xWeight;
         }
-        red += rx * yWeightTabs[y].weight[ywi];
-        green += gx * yWeightTabs[y].weight[ywi];
-        blue += bx * yWeightTabs[y].weight[ywi];
-        ywi++;
+        yWeight = yweight[ywi++];
+        red += rx * yWeight;
+        green += gx * yWeight;
+        blue += bx * yWeight;
+        px += src_width;
       }
       *ptr++ = U8(blue);
       *ptr++ = U8(green);
