Use lookup tables for pixel upconversion
You have to loop many times when converting e.g. 2 bits to 8,
so have a couple of lookup tables to speed things up. We still
use bit replication to get from 8 bits to 16 bits though.
diff --git a/common/rfb/PixelFormat.cxx b/common/rfb/PixelFormat.cxx
index 9e762d9..366c0a3 100644
--- a/common/rfb/PixelFormat.cxx
+++ b/common/rfb/PixelFormat.cxx
@@ -32,6 +32,42 @@
using namespace rfb;
+rdr::U8 PixelFormat::upconvTable[256*8];
+
+class PixelFormat::Init {
+public:
+ Init();
+};
+
+PixelFormat::Init PixelFormat::_init;
+
+
+PixelFormat::Init::Init()
+{
+ int bits;
+
+ // Bit replication is almost perfect, but not quite. And
+ // a lookup table is still quicker when there is a large
+ // difference between the source and destination depth.
+
+ for (bits = 1;bits <= 8;bits++) {
+ int i, maxVal;
+ rdr::U8 *subTable;
+
+ maxVal = (1 << bits) - 1;
+ subTable = &upconvTable[(bits-1)*256];
+
+ for (i = 0;i <= maxVal;i++)
+ subTable[i] = i * 255 / maxVal;
+
+ // Duplicate the table so that we don't have to care about
+ // the upper bits when doing a lookup
+ for (;i < 256;i += maxVal+1)
+ memcpy(&subTable[i], &subTable[0], maxVal+1);
+ }
+}
+
+
PixelFormat::PixelFormat(int b, int d, bool e, bool t,
int rm, int gm, int bm, int rs, int gs, int bs)
: bpp(b), depth(d), trueColour(t), bigEndian(e),