Use PixelBuffer objects as the interface for encoders and decoders
This avoid a lot of unnecessary middle men. This also pushes the
responsibility for pixel format conversion into the encoders and
decoders. The new bufferFromBuffer() is used for direct conversion,
rather than PixelTransformer/TransImageGetter.
diff --git a/common/rfb/ZRLEEncoder.cxx b/common/rfb/ZRLEEncoder.cxx
index 968edcf..54613e2 100644
--- a/common/rfb/ZRLEEncoder.cxx
+++ b/common/rfb/ZRLEEncoder.cxx
@@ -17,7 +17,6 @@
*/
#include <rdr/OutStream.h>
#include <rfb/Exception.h>
-#include <rfb/TransImageGetter.h>
#include <rfb/encodings.h>
#include <rfb/ConnParams.h>
#include <rfb/SMsgWriter.h>
@@ -69,22 +68,22 @@
{
}
-void ZRLEEncoder::writeRect(const Rect& r, TransImageGetter* ig)
+void ZRLEEncoder::writeRect(const Rect& r, PixelBuffer* pb)
{
+ const PixelFormat& pf = conn->cp.pf();
+
rdr::U8* imageBuf = conn->writer()->getImageBuf(64 * 64 * 4 + 4);
mos.clear();
- switch (conn->cp.pf().bpp) {
+ switch (pf.bpp) {
case 8:
- zrleEncode8(r, &mos, &zos, imageBuf, ig);
+ zrleEncode8(r, &mos, &zos, imageBuf, pf, pb);
break;
case 16:
- zrleEncode16(r, &mos, &zos, imageBuf, ig);
+ zrleEncode16(r, &mos, &zos, imageBuf, pf, pb);
break;
case 32:
{
- const PixelFormat& pf = conn->cp.pf();
-
Pixel maxPixel = pf.pixelFromRGB((rdr::U16)-1, (rdr::U16)-1, (rdr::U16)-1);
bool fitsInLS3Bytes = maxPixel < (1<<24);
bool fitsInMS3Bytes = (maxPixel & 0xff) == 0;
@@ -92,16 +91,16 @@
if ((fitsInLS3Bytes && pf.isLittleEndian()) ||
(fitsInMS3Bytes && pf.isBigEndian()))
{
- zrleEncode24A(r, &mos, &zos, imageBuf, ig);
+ zrleEncode24A(r, &mos, &zos, imageBuf, pf, pb);
}
else if ((fitsInLS3Bytes && pf.isBigEndian()) ||
(fitsInMS3Bytes && pf.isLittleEndian()))
{
- zrleEncode24B(r, &mos, &zos, imageBuf, ig);
+ zrleEncode24B(r, &mos, &zos, imageBuf, pf, pb);
}
else
{
- zrleEncode32(r, &mos, &zos, imageBuf, ig);
+ zrleEncode32(r, &mos, &zos, imageBuf, pf, pb);
}
break;
}