diff options
Diffstat (limited to 'common/rfb/HextileDecoder.cxx')
-rw-r--r-- | common/rfb/HextileDecoder.cxx | 61 |
1 files changed, 56 insertions, 5 deletions
diff --git a/common/rfb/HextileDecoder.cxx b/common/rfb/HextileDecoder.cxx index 705ccf51..d1412d4a 100644 --- a/common/rfb/HextileDecoder.cxx +++ b/common/rfb/HextileDecoder.cxx @@ -15,7 +15,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ + #include <rdr/InStream.h> +#include <rdr/MemInStream.h> +#include <rdr/OutStream.h> + #include <rfb/ConnParams.h> #include <rfb/PixelBuffer.h> #include <rfb/HextileDecoder.h> @@ -41,13 +45,60 @@ HextileDecoder::~HextileDecoder() } void HextileDecoder::readRect(const Rect& r, rdr::InStream* is, - const ConnParams& cp, ModifiablePixelBuffer* pb) + const ConnParams& cp, rdr::OutStream* os) +{ + Rect t; + size_t bytesPerPixel; + + bytesPerPixel = cp.pf().bpp/8; + + for (t.tl.y = r.tl.y; t.tl.y < r.br.y; t.tl.y += 16) { + + t.br.y = __rfbmin(r.br.y, t.tl.y + 16); + + for (t.tl.x = r.tl.x; t.tl.x < r.br.x; t.tl.x += 16) { + rdr::U8 tileType; + + t.br.x = __rfbmin(r.br.x, t.tl.x + 16); + + tileType = is->readU8(); + os->writeU8(tileType); + + if (tileType & hextileRaw) { + os->copyBytes(is, t.area() * bytesPerPixel); + continue; + } + + if (tileType & hextileBgSpecified) + os->copyBytes(is, bytesPerPixel); + + if (tileType & hextileFgSpecified) + os->copyBytes(is, bytesPerPixel); + + if (tileType & hextileAnySubrects) { + rdr::U8 nSubrects; + + nSubrects = is->readU8(); + os->writeU8(nSubrects); + + if (tileType & hextileSubrectsColoured) + os->copyBytes(is, nSubrects * (bytesPerPixel + 2)); + else + os->copyBytes(is, nSubrects * 2); + } + } + } +} + +void HextileDecoder::decodeRect(const Rect& r, const void* buffer, + size_t buflen, const ConnParams& cp, + ModifiablePixelBuffer* pb) { + rdr::MemInStream is(buffer, buflen); const PixelFormat& pf = cp.pf(); - rdr::U8 buf[16 * 16 * 4 * pf.bpp/8]; switch (pf.bpp) { - case 8: hextileDecode8 (r, is, (rdr::U8*) buf, pf, pb); break; - case 16: hextileDecode16(r, is, (rdr::U16*)buf, pf, pb); break; - case 32: hextileDecode32(r, is, (rdr::U32*)buf, pf, pb); break; + case 8: hextileDecode8 (r, &is, pf, pb); break; + case 16: hextileDecode16(r, &is, pf, pb); break; + case 32: hextileDecode32(r, &is, pf, pb); break; } } |