|
Lines 26-32
Link Here
|
| 26 |
|
26 |
|
| 27 |
using namespace rfb; |
27 |
using namespace rfb; |
| 28 |
|
28 |
|
| 29 |
rdr::MemOutStream* ZRLEEncoder::sharedMos = 0; |
|
|
| 30 |
int ZRLEEncoder::maxLen = 4097 * 1024; // enough for width 16384 32-bit pixels |
29 |
int ZRLEEncoder::maxLen = 4097 * 1024; // enough for width 16384 32-bit pixels |
| 31 |
|
30 |
|
| 32 |
IntParameter zlibLevel("ZlibLevel","Zlib compression level",-1); |
31 |
IntParameter zlibLevel("ZlibLevel","Zlib compression level",-1); |
|
Lines 55-87
Link Here
|
| 55 |
} |
54 |
} |
| 56 |
|
55 |
|
| 57 |
ZRLEEncoder::ZRLEEncoder(SMsgWriter* writer_) |
56 |
ZRLEEncoder::ZRLEEncoder(SMsgWriter* writer_) |
| 58 |
: writer(writer_), zos(0,0,zlibLevel) |
57 |
: writer(writer_), zos(0,0,zlibLevel), mos(129*1024) |
| 59 |
{ |
58 |
{ |
| 60 |
if (sharedMos) |
|
|
| 61 |
mos = sharedMos; |
| 62 |
else |
| 63 |
mos = new rdr::MemOutStream(129*1024); |
| 64 |
} |
59 |
} |
| 65 |
|
60 |
|
| 66 |
ZRLEEncoder::~ZRLEEncoder() |
61 |
ZRLEEncoder::~ZRLEEncoder() |
| 67 |
{ |
62 |
{ |
| 68 |
if (!sharedMos) |
|
|
| 69 |
delete mos; |
| 70 |
} |
63 |
} |
| 71 |
|
64 |
|
| 72 |
bool ZRLEEncoder::writeRect(const Rect& r, TransImageGetter* ig, Rect* actual) |
65 |
bool ZRLEEncoder::writeRect(const Rect& r, TransImageGetter* ig, Rect* actual) |
| 73 |
{ |
66 |
{ |
| 74 |
rdr::U8* imageBuf = writer->getImageBuf(64 * 64 * 4 + 4); |
67 |
rdr::U8* imageBuf = writer->getImageBuf(64 * 64 * 4 + 4); |
| 75 |
mos->clear(); |
68 |
mos.clear(); |
| 76 |
bool wroteAll = true; |
69 |
bool wroteAll = true; |
| 77 |
*actual = r; |
70 |
*actual = r; |
| 78 |
|
71 |
|
| 79 |
switch (writer->bpp()) { |
72 |
switch (writer->bpp()) { |
| 80 |
case 8: |
73 |
case 8: |
| 81 |
wroteAll = zrleEncode8(r, mos, &zos, imageBuf, maxLen, actual, ig); |
74 |
wroteAll = zrleEncode8(r, &mos, &zos, imageBuf, maxLen, actual, ig); |
| 82 |
break; |
75 |
break; |
| 83 |
case 16: |
76 |
case 16: |
| 84 |
wroteAll = zrleEncode16(r, mos, &zos, imageBuf, maxLen, actual, ig); |
77 |
wroteAll = zrleEncode16(r, &mos, &zos, imageBuf, maxLen, actual, ig); |
| 85 |
break; |
78 |
break; |
| 86 |
case 32: |
79 |
case 32: |
| 87 |
{ |
80 |
{ |
|
Lines 94-109
Link Here
|
| 94 |
if ((fitsInLS3Bytes && pf.isLittleEndian()) || |
87 |
if ((fitsInLS3Bytes && pf.isLittleEndian()) || |
| 95 |
(fitsInMS3Bytes && pf.isBigEndian())) |
88 |
(fitsInMS3Bytes && pf.isBigEndian())) |
| 96 |
{ |
89 |
{ |
| 97 |
wroteAll = zrleEncode24A(r, mos, &zos, imageBuf, maxLen, actual, ig); |
90 |
wroteAll = zrleEncode24A(r, &mos, &zos, imageBuf, maxLen, actual, ig); |
| 98 |
} |
91 |
} |
| 99 |
else if ((fitsInLS3Bytes && pf.isBigEndian()) || |
92 |
else if ((fitsInLS3Bytes && pf.isBigEndian()) || |
| 100 |
(fitsInMS3Bytes && pf.isLittleEndian())) |
93 |
(fitsInMS3Bytes && pf.isLittleEndian())) |
| 101 |
{ |
94 |
{ |
| 102 |
wroteAll = zrleEncode24B(r, mos, &zos, imageBuf, maxLen, actual, ig); |
95 |
wroteAll = zrleEncode24B(r, &mos, &zos, imageBuf, maxLen, actual, ig); |
| 103 |
} |
96 |
} |
| 104 |
else |
97 |
else |
| 105 |
{ |
98 |
{ |
| 106 |
wroteAll = zrleEncode32(r, mos, &zos, imageBuf, maxLen, actual, ig); |
99 |
wroteAll = zrleEncode32(r, &mos, &zos, imageBuf, maxLen, actual, ig); |
| 107 |
} |
100 |
} |
| 108 |
break; |
101 |
break; |
| 109 |
} |
102 |
} |
|
Lines 111-118
Link Here
|
| 111 |
|
104 |
|
| 112 |
writer->startRect(*actual, encodingZRLE); |
105 |
writer->startRect(*actual, encodingZRLE); |
| 113 |
rdr::OutStream* os = writer->getOutStream(); |
106 |
rdr::OutStream* os = writer->getOutStream(); |
| 114 |
os->writeU32(mos->length()); |
107 |
os->writeU32(mos.length()); |
| 115 |
os->writeBytes(mos->data(), mos->length()); |
108 |
os->writeBytes(mos.data(), mos.length()); |
| 116 |
writer->endRect(); |
109 |
writer->endRect(); |
| 117 |
return wroteAll; |
110 |
return wroteAll; |
| 118 |
} |
111 |
} |