Add fast paths for RGB to 16-bit and 8-bit true color conversion
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4764 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/PixelFormat.cxx b/common/rfb/PixelFormat.cxx
index f707322..a2e9496 100644
--- a/common/rfb/PixelFormat.cxx
+++ b/common/rfb/PixelFormat.cxx
@@ -224,6 +224,24 @@
}
}
+#define trueColorBufferFromRGB(BPP) { \
+ rdr::U8 r, g, b; \
+ int dstPad = pitch - w * BPP / 8; \
+ while (h > 0) { \
+ rdr::U8 *dstEndOfRow = (rdr::U8 *)dst + w * BPP / 8; \
+ while (dst < dstEndOfRow) { \
+ r = *(src++); \
+ g = *(src++); \
+ b = *(src++); \
+ *(rdr::U##BPP *)dst = (((r * redMax + 127) / 255) << redShift) \
+ | (((g * greenMax + 127) / 255) << greenShift) \
+ | (((b * blueMax + 127) / 255) << blueShift); \
+ dst += BPP / 8; \
+ } \
+ dst += dstPad; \
+ h--; \
+ } \
+}
void PixelFormat::bufferFromRGB(rdr::U8 *dst, const rdr::U8* src,
int w, int pitch, int h, ColourMap* cm) const
@@ -254,6 +272,10 @@
dst += dstPad;
h--;
}
+ } else if (!cm && bpp == 16) {
+ trueColorBufferFromRGB(16);
+ } else if (!cm && bpp == 8) {
+ trueColorBufferFromRGB(8);
} else {
// Generic code
Pixel p;