blob: a7af25db88ac565227b1b05a4076ee34b426f343 [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 */
18#include <rdr/OutStream.h>
Pierre Ossman456b2c22014-01-15 13:22:03 +010019#include <rfb/TransImageGetter.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000020#include <rfb/encodings.h>
21#include <rfb/SMsgWriter.h>
Pierre Ossman668468b2014-01-31 12:37:32 +010022#include <rfb/SConnection.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000023#include <rfb/RREEncoder.h>
24
25using namespace rfb;
26
27#define BPP 8
28#include <rfb/rreEncode.h>
29#undef BPP
30#define BPP 16
31#include <rfb/rreEncode.h>
32#undef BPP
33#define BPP 32
34#include <rfb/rreEncode.h>
35#undef BPP
36
Pierre Ossman668468b2014-01-31 12:37:32 +010037RREEncoder::RREEncoder(SConnection* conn) : RawEncoder(conn)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000038{
39}
40
41RREEncoder::~RREEncoder()
42{
43}
44
Pierre Ossman717c07b2014-01-21 14:45:10 +010045void RREEncoder::writeRect(const Rect& r, TransImageGetter* ig)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000046{
47 int w = r.width();
48 int h = r.height();
Pierre Ossman668468b2014-01-31 12:37:32 +010049 rdr::U8* imageBuf = conn->writer()->getImageBuf(w*h);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000050 ig->getImage(imageBuf, r);
51
52 mos.clear();
53
54 int nSubrects = -1;
Pierre Ossman668468b2014-01-31 12:37:32 +010055 switch (conn->cp.pf().bpp) {
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000056 case 8: nSubrects = rreEncode8(imageBuf, w, h, &mos); break;
57 case 16: nSubrects = rreEncode16(imageBuf, w, h, &mos); break;
58 case 32: nSubrects = rreEncode32(imageBuf, w, h, &mos); break;
59 }
60
61 if (nSubrects < 0) {
Pierre Ossmanfdba3fe2014-01-31 13:12:18 +010062 RawEncoder::writeRect(r, ig);
Pierre Ossman717c07b2014-01-21 14:45:10 +010063 return;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000064 }
65
Pierre Ossman668468b2014-01-31 12:37:32 +010066 conn->writer()->startRect(r, encodingRRE);
67 rdr::OutStream* os = conn->getOutStream();
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000068 os->writeU32(nSubrects);
69 os->writeBytes(mos.data(), mos.length());
Pierre Ossman668468b2014-01-31 12:37:32 +010070 conn->writer()->endRect();
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000071}