Added support all true color pixel format for scaling the
remote desktop. Palette is not supported yet.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2133 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/ScaledPixelBuffer.cxx b/common/rfb/ScaledPixelBuffer.cxx
index 2bfb4e8..c38a254 100644
--- a/common/rfb/ScaledPixelBuffer.cxx
+++ b/common/rfb/ScaledPixelBuffer.cxx
@@ -111,21 +111,22 @@
void ScaledPixelBuffer::scaleRect(const Rect& rect) {
Rect changed_rect;
- U8 *ptr;
- U32 *px, *psrc_data = (U32*)(*src_data);
+ U8 *ptr, *pxs, *px;
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;
+
for (int y = changed_rect.tl.y; y < changed_rect.br.y; y++) {
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++) {
ywi = 0; red = 0; green = 0; blue = 0;
- px = &psrc_data[xWeightTabs[x].i0 + yWeightTabs[y].i0*src_width];
+ pxs = &(*src_data)[(xWeightTabs[x].i0 + yWeightTabs[y].i0*src_width) * bytesPerPixel];
xweight = xWeightTabs[x].weight;
// Calculate the scaled pixel value at (x, y) coordinates by
@@ -135,19 +136,19 @@
// [(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++) {
- xwi = 0; rx = 0; gx = 0; bx = 0;
+ xwi = 0; rx = 0; gx = 0; bx = 0; px = pxs;
for (int xs = xWeightTabs[x].i0; xs < xWeightTabs[x].i1; xs++) {
- rgbFromPixel(px[xwi], r, g, b);
+ rgbFromPixel(*(U32*)(px), r, g, b);
xWeight = xweight[xwi++];
rx += r * xWeight;
gx += g * xWeight;
bx += b * xWeight;
+ px += bytesPerPixel;
}
yWeight = yweight[ywi++];
red += rx * yWeight;
green += gx * yWeight;
blue += bx * yWeight;
- px += src_width;
}
*ptr++ = U8(blue);
*ptr++ = U8(green);
diff --git a/win/rfb_win32/ScaledDIBSectionBuffer.cxx b/win/rfb_win32/ScaledDIBSectionBuffer.cxx
index 63e3082..aa52e07 100644
--- a/win/rfb_win32/ScaledDIBSectionBuffer.cxx
+++ b/win/rfb_win32/ScaledDIBSectionBuffer.cxx
@@ -59,7 +59,7 @@
void ScaledDIBSectionBuffer::setPF(const PixelFormat &pf_) {
if (memcmp(&(ScaledPixelBuffer::pf), &pf_, sizeof(pf_)) == 0) return;
- if (pf_.depth != 24) throw rfb::UnsupportedPixelFormatException();
+ if (!pf_.trueColour) throw rfb::UnsupportedPixelFormatException();
pf = pf_;
if (scaling) {