blob: a499783d08b61c458cd8dc859ecbcbcfe2ed94d2 [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2000-2003 Constantin Kaplinsky. All Rights Reserved.
DRCcd2c5d42011-08-11 11:18:34 +00002 * Copyright (C) 2011 D. R. Commander
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00003 *
4 * This is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This software is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this software; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17 * USA.
18 */
19#ifndef __RFB_TIGHTENCODER_H__
20#define __RFB_TIGHTENCODER_H__
21
22#include <rdr/MemOutStream.h>
23#include <rdr/ZlibOutStream.h>
24#include <rfb/Encoder.h>
Pierre Ossmanb948a912014-01-15 13:23:43 +010025#include <rfb/JpegCompressor.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000026
27// FIXME: Check if specifying extern "C" is really necessary.
28#include <stdio.h>
29extern "C" {
Constantin Kaplinskye19ac6d2006-05-30 06:15:20 +000030#include <jpeglib.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000031}
32
33namespace rfb {
34
Pierre Ossman456b2c22014-01-15 13:22:03 +010035 class TransImageGetter;
36
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000037 struct TIGHT_CONF {
38 unsigned int maxRectSize, maxRectWidth;
39 unsigned int monoMinRectSize;
40 int idxZlibLevel, monoZlibLevel, rawZlibLevel;
41 int idxMaxColorsDivisor;
DRCcd2c5d42011-08-11 11:18:34 +000042 int palMaxColorsWithJPEG;
DRC773cf3c2009-03-12 19:26:44 +000043 int jpegQuality;
Pierre Ossmanb948a912014-01-15 13:23:43 +010044 int jpegSubsampling;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000045 };
46
47 //
DRCffe09d62011-08-17 02:27:59 +000048 // C-style structures to store palette entries and compression paramentes.
49 // Such code probably should be converted into C++ classes.
50 //
51
52 struct TIGHT_COLOR_LIST {
53 TIGHT_COLOR_LIST *next;
54 int idx;
55 rdr::U32 rgb;
56 };
57
58 struct TIGHT_PALETTE_ENTRY {
59 TIGHT_COLOR_LIST *listNode;
60 int numPixels;
61 };
62
63 struct TIGHT_PALETTE {
64 TIGHT_PALETTE_ENTRY entry[256];
65 TIGHT_COLOR_LIST *hash[256];
66 TIGHT_COLOR_LIST list[256];
67 };
68
69 //
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000070 // Compression level stuff. The following array contains various
71 // encoder parameters for each of 10 compression levels (0..9).
72 // Last three parameters correspond to JPEG quality levels (0..9).
73 //
74 // NOTE: s_conf[9].maxRectSize should be >= s_conf[i].maxRectSize,
75 // where i in [0..8]. RequiredBuffSize() method depends on this.
76 // FIXME: Is this comment obsolete?
77 //
78
79
80 class TightEncoder : public Encoder {
81 public:
Pierre Ossman316a3242014-01-15 12:40:20 +010082 TightEncoder(SMsgWriter* writer);
83 virtual ~TightEncoder();
84
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000085 virtual void setCompressLevel(int level);
86 virtual void setQualityLevel(int level);
Pierre Ossmanb948a912014-01-15 13:23:43 +010087 virtual void setFineQualityLevel(int quality, int subsampling);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000088 virtual int getNumRects(const Rect &r);
Pierre Ossman717c07b2014-01-21 14:45:10 +010089 virtual void writeRect(const Rect& r, TransImageGetter* ig);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000090
91 private:
DRCffe09d62011-08-17 02:27:59 +000092 bool checkSolidTile(Rect& r, rdr::U32* colorPtr, bool needSameColor);
93 void extendSolidArea(const Rect& r, rdr::U32 colorValue, Rect& er);
94 void findBestSolidArea(Rect& r, rdr::U32 colorValue, Rect& bestr);
95 void sendRectSimple(const Rect& r);
96 void writeSubrect(const Rect& r, bool forceSolid = false);
97
DRC3004cb62011-11-03 18:45:39 +000098 void compressData(const void *buf, unsigned int length,
99 rdr::ZlibOutStream *zos, int zlibLevel,
100 rdr::OutStream *os);
DRCffe09d62011-08-17 02:27:59 +0000101
102 int paletteInsert(rdr::U32 rgb, int numPixels, int bpp);
103 void paletteReset(void);
104
DRC56dee1a2012-02-13 03:55:10 +0000105 void fastFillPalette8(const rdr::U8 *data, int stride, const Rect &r);
106 void fastFillPalette16(const rdr::U16 *data, int stride, const Rect &r);
107 void fastFillPalette32(const rdr::U32 *data, int stride, const Rect &r);
DRCffe09d62011-08-17 02:27:59 +0000108
109 void fillPalette8(rdr::U8 *data, int count);
110 void fillPalette16(rdr::U16 *data, int count);
111 void fillPalette32(rdr::U32 *data, int count);
112
113 unsigned int packPixels8(rdr::U8 *buf, unsigned int count);
114 unsigned int packPixels16(rdr::U16 *buf, unsigned int count);
115 unsigned int packPixels32(rdr::U32 *buf, unsigned int count);
116
117 void tightEncode8(const Rect& r, rdr::OutStream *os, bool forceSolid);
118 void tightEncode16(const Rect& r, rdr::OutStream *os, bool forceSolid);
119 void tightEncode32(const Rect& r, rdr::OutStream *os, bool forceSolid);
120
121 bool checkSolidTile8(Rect& r, rdr::U32 *colorPtr, bool needSameColor);
122 bool checkSolidTile16(Rect& r, rdr::U32 *colorPtr, bool needSameColor);
123 bool checkSolidTile32(Rect& r, rdr::U32 *colorPtr, bool needSameColor);
124
DRC3004cb62011-11-03 18:45:39 +0000125 void encodeSolidRect8(rdr::U8 *buf, rdr::OutStream *os);
126 void encodeSolidRect16(rdr::U16 *buf, rdr::OutStream *os);
127 void encodeSolidRect32(rdr::U32 *buf, rdr::OutStream *os);
DRCffe09d62011-08-17 02:27:59 +0000128
DRC3004cb62011-11-03 18:45:39 +0000129 void encodeFullColorRect8(rdr::U8 *buf, const Rect& r, rdr::OutStream *os);
130 void encodeFullColorRect16(rdr::U16 *buf, const Rect& r, rdr::OutStream *os);
131 void encodeFullColorRect32(rdr::U32 *buf, const Rect& r, rdr::OutStream *os);
DRCffe09d62011-08-17 02:27:59 +0000132
DRC3004cb62011-11-03 18:45:39 +0000133 void encodeMonoRect8(rdr::U8 *buf, const Rect& r, rdr::OutStream *os);
134 void encodeMonoRect16(rdr::U16 *buf, const Rect& r, rdr::OutStream *os);
135 void encodeMonoRect32(rdr::U32 *buf, const Rect& r, rdr::OutStream *os);
DRCffe09d62011-08-17 02:27:59 +0000136
DRC3004cb62011-11-03 18:45:39 +0000137 void encodeIndexedRect16(rdr::U16 *buf, const Rect& r, rdr::OutStream *os);
138 void encodeIndexedRect32(rdr::U32 *buf, const Rect& r, rdr::OutStream *os);
DRCffe09d62011-08-17 02:27:59 +0000139
DRC56dee1a2012-02-13 03:55:10 +0000140 void encodeJpegRect16(rdr::U16 *buf, int stride, const Rect& r,
141 rdr::OutStream *os);
142 void encodeJpegRect32(rdr::U32 *buf, int stride, const Rect& r,
143 rdr::OutStream *os);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000144
145 SMsgWriter* writer;
146 rdr::MemOutStream mos;
147 rdr::ZlibOutStream zos[4];
DRCcd2c5d42011-08-11 11:18:34 +0000148 JpegCompressor jc;
DRCffe09d62011-08-17 02:27:59 +0000149 TransImageGetter *ig;
150 PixelFormat serverpf, clientpf;
151
152 bool pack24;
153 int palMaxColors, palNumColors;
154 rdr::U32 monoBackground, monoForeground;
155 TIGHT_PALETTE palette;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000156
157 static const int defaultCompressLevel;
158 static const TIGHT_CONF conf[];
159
160 const TIGHT_CONF* pconf;
DRCb4a83232011-08-19 04:57:18 +0000161 int jpegQuality;
Pierre Ossmanb948a912014-01-15 13:23:43 +0100162 int jpegSubsampling;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000163 };
164
165}
166
167#endif