summaryrefslogtreecommitdiffstats
path: root/libvncclient/rfbproto.c
diff options
context:
space:
mode:
authorChristian Beier <dontmind@freeshell.org>2018-01-22 22:13:15 +0100
committerGitHub <noreply@github.com>2018-01-22 22:13:15 +0100
commitccd7208cf32b4011db0b558185df9f8caf8f5455 (patch)
treef57eb58328198a107a48d6685b73e09ea3b14796 /libvncclient/rfbproto.c
parent6814e946e0afed20a6ef0f45a9bcbfeda2e77706 (diff)
parentbeb82f8dde3c1e1d4d6600e568283919e5a04712 (diff)
downloadlibtdevnc-ccd7208cf32b4011db0b558185df9f8caf8f5455.tar.gz
libtdevnc-ccd7208cf32b4011db0b558185df9f8caf8f5455.zip
Merge pull request #197 from wwqwwqwd/master
Add trle decoder
Diffstat (limited to 'libvncclient/rfbproto.c')
-rw-r--r--libvncclient/rfbproto.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/libvncclient/rfbproto.c b/libvncclient/rfbproto.c
index df8b6d0..242fd52 100644
--- a/libvncclient/rfbproto.c
+++ b/libvncclient/rfbproto.c
@@ -161,6 +161,13 @@ static rfbBool HandleUltra32(rfbClient* client, int rx, int ry, int rw, int rh);
static rfbBool HandleUltraZip8(rfbClient* client, int rx, int ry, int rw, int rh);
static rfbBool HandleUltraZip16(rfbClient* client, int rx, int ry, int rw, int rh);
static rfbBool HandleUltraZip32(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE8(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE15(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE16(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE24(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE24Up(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE24Down(rfbClient* client, int rx, int ry, int rw, int rh);
+static rfbBool HandleTRLE32(rfbClient* client, int rx, int ry, int rw, int rh);
#ifdef LIBVNCSERVER_HAVE_LIBZ
static rfbBool HandleZlib8(rfbClient* client, int rx, int ry, int rw, int rh);
static rfbBool HandleZlib16(rfbClient* client, int rx, int ry, int rw, int rh);
@@ -1295,6 +1302,8 @@ SetFormatAndEncodings(rfbClient* client)
encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZlibHex);
if (client->appData.compressLevel >= 0 && client->appData.compressLevel <= 9)
requestCompressLevel = TRUE;
+ } else if (strncasecmp(encStr,"trle",encStrLen) == 0) {
+ encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingTRLE);
} else if (strncasecmp(encStr,"zrle",encStrLen) == 0) {
encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZRLE);
} else if (strncasecmp(encStr,"zywrle",encStrLen) == 0) {
@@ -2010,6 +2019,47 @@ HandleRFBServerMessage(rfbClient* client)
break;
}
+ case rfbEncodingTRLE:
+ {
+ switch (client->format.bitsPerPixel) {
+ case 8:
+ if (!HandleTRLE8(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h))
+ return FALSE;
+ break;
+ case 16:
+ if (client->si.format.greenMax > 0x1F) {
+ if (!HandleTRLE16(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h))
+ return FALSE;
+ } else {
+ if (!HandleTRLE15(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h))
+ return FALSE;
+ }
+ break;
+ case 32: {
+ uint32_t maxColor =
+ (client->format.redMax << client->format.redShift) |
+ (client->format.greenMax << client->format.greenShift) |
+ (client->format.blueMax << client->format.blueShift);
+ if ((client->format.bigEndian && (maxColor & 0xff) == 0) ||
+ (!client->format.bigEndian && (maxColor & 0xff000000) == 0)) {
+ if (!HandleTRLE24(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h))
+ return FALSE;
+ } else if (!client->format.bigEndian && (maxColor & 0xff) == 0) {
+ if (!HandleTRLE24Up(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h))
+ return FALSE;
+ } else if (client->format.bigEndian && (maxColor & 0xff000000) == 0) {
+ if (!HandleTRLE24Down(client, rect.r.x, rect.r.y, rect.r.w,
+ rect.r.h))
+ return FALSE;
+ } else if (!HandleTRLE32(client, rect.r.x, rect.r.y, rect.r.w,
+ rect.r.h))
+ return FALSE;
+ break;
+ }
+ }
+ break;
+ }
+
#ifdef LIBVNCSERVER_HAVE_LIBZ
case rfbEncodingZlib:
{
@@ -2300,6 +2350,7 @@ HandleRFBServerMessage(rfbClient* client)
#include "ultra.c"
#include "zlib.c"
#include "tight.c"
+#include "trle.c"
#include "zrle.c"
#undef BPP
#define BPP 16
@@ -2309,8 +2360,11 @@ HandleRFBServerMessage(rfbClient* client)
#include "ultra.c"
#include "zlib.c"
#include "tight.c"
+#include "trle.c"
#include "zrle.c"
#define REALBPP 15
+#include "trle.c"
+#define REALBPP 15
#include "zrle.c"
#undef BPP
#define BPP 32
@@ -2320,14 +2374,23 @@ HandleRFBServerMessage(rfbClient* client)
#include "ultra.c"
#include "zlib.c"
#include "tight.c"
+#include "trle.c"
#include "zrle.c"
#define REALBPP 24
+#include "trle.c"
+#define REALBPP 24
#include "zrle.c"
#define REALBPP 24
#define UNCOMP 8
+#include "trle.c"
+#define REALBPP 24
+#define UNCOMP 8
#include "zrle.c"
#define REALBPP 24
#define UNCOMP -8
+#include "trle.c"
+#define REALBPP 24
+#define UNCOMP -8
#include "zrle.c"
#undef BPP