123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /* Copyright (C) 2000-2003 Constantin Kaplinsky. All Rights Reserved.
- * Copyright (C) 2011 D. R. Commander
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- * USA.
- */
- #ifndef __RFB_TIGHTENCODER_H__
- #define __RFB_TIGHTENCODER_H__
-
- #include <rdr/MemOutStream.h>
- #include <rdr/ZlibOutStream.h>
- #include <rfb/Encoder.h>
- #include <rfb/JpegCompressor.h>
- #include <rfb/Palette.h>
-
- // FIXME: Check if specifying extern "C" is really necessary.
- #include <stdio.h>
- extern "C" {
- #include <jpeglib.h>
- }
-
- namespace rfb {
-
- class PixelBuffer;
-
- struct TIGHT_CONF {
- unsigned int maxRectSize, maxRectWidth;
- unsigned int monoMinRectSize;
- int idxZlibLevel, monoZlibLevel, rawZlibLevel;
- int idxMaxColorsDivisor;
- int palMaxColorsWithJPEG;
- int jpegQuality;
- int jpegSubsampling;
- };
-
- //
- // Compression level stuff. The following array contains various
- // encoder parameters for each of 10 compression levels (0..9).
- // Last three parameters correspond to JPEG quality levels (0..9).
- //
- // NOTE: s_conf[9].maxRectSize should be >= s_conf[i].maxRectSize,
- // where i in [0..8]. RequiredBuffSize() method depends on this.
- // FIXME: Is this comment obsolete?
- //
-
-
- class TightEncoder : public Encoder {
- public:
- TightEncoder(SConnection* conn);
- virtual ~TightEncoder();
-
- virtual void setCompressLevel(int level);
- virtual void setQualityLevel(int level);
- virtual void setFineQualityLevel(int quality, int subsampling);
- virtual int getNumRects(const Rect &r);
- virtual void writeRect(const Rect& r, PixelBuffer* pb);
-
- private:
- bool checkSolidTile(Rect& r, rdr::U32* colorPtr, bool needSameColor);
- void extendSolidArea(const Rect& r, rdr::U32 colorValue, Rect& er);
- void findBestSolidArea(Rect& r, rdr::U32 colorValue, Rect& bestr);
- void sendRectSimple(const Rect& r);
- void writeSubrect(const Rect& r, bool forceSolid = false);
-
- void writeCompact(rdr::OutStream* os, rdr::U32 value);
-
- void compressData(const void *buf, unsigned int length,
- rdr::ZlibOutStream *zos, int zlibLevel,
- rdr::OutStream *os);
-
- void fastFillPalette8(const rdr::U8 *data, int stride, const Rect &r);
- void fastFillPalette16(const rdr::U16 *data, int stride, const Rect &r);
- void fastFillPalette32(const rdr::U32 *data, int stride, const Rect &r);
-
- void fillPalette8(rdr::U8 *data, int count);
- void fillPalette16(rdr::U16 *data, int count);
- void fillPalette32(rdr::U32 *data, int count);
-
- unsigned int packPixels8(rdr::U8 *buf, unsigned int count);
- unsigned int packPixels16(rdr::U16 *buf, unsigned int count);
- unsigned int packPixels32(rdr::U32 *buf, unsigned int count);
-
- void tightEncode8(const Rect& r, rdr::OutStream *os, bool forceSolid);
- void tightEncode16(const Rect& r, rdr::OutStream *os, bool forceSolid);
- void tightEncode32(const Rect& r, rdr::OutStream *os, bool forceSolid);
-
- bool checkSolidTile8(Rect& r, rdr::U32 *colorPtr, bool needSameColor);
- bool checkSolidTile16(Rect& r, rdr::U32 *colorPtr, bool needSameColor);
- bool checkSolidTile32(Rect& r, rdr::U32 *colorPtr, bool needSameColor);
-
- void encodeSolidRect8(rdr::U8 *buf, rdr::OutStream *os);
- void encodeSolidRect16(rdr::U16 *buf, rdr::OutStream *os);
- void encodeSolidRect32(rdr::U32 *buf, rdr::OutStream *os);
-
- void encodeFullColorRect8(rdr::U8 *buf, const Rect& r, rdr::OutStream *os);
- void encodeFullColorRect16(rdr::U16 *buf, const Rect& r, rdr::OutStream *os);
- void encodeFullColorRect32(rdr::U32 *buf, const Rect& r, rdr::OutStream *os);
-
- void encodeMonoRect8(rdr::U8 *buf, const Rect& r, rdr::OutStream *os);
- void encodeMonoRect16(rdr::U16 *buf, const Rect& r, rdr::OutStream *os);
- void encodeMonoRect32(rdr::U32 *buf, const Rect& r, rdr::OutStream *os);
-
- void encodeIndexedRect16(rdr::U16 *buf, const Rect& r, rdr::OutStream *os);
- void encodeIndexedRect32(rdr::U32 *buf, const Rect& r, rdr::OutStream *os);
-
- void encodeJpegRect16(rdr::U16 *buf, int stride, const Rect& r,
- rdr::OutStream *os);
- void encodeJpegRect32(rdr::U32 *buf, int stride, const Rect& r,
- rdr::OutStream *os);
-
- rdr::MemOutStream mos;
- rdr::ZlibOutStream zos[4];
- JpegCompressor jc;
- PixelBuffer *pb;
- PixelFormat serverpf, clientpf;
-
- bool pack24;
- int palMaxColors;
- Palette palette;
-
- static const int defaultCompressLevel;
- static const TIGHT_CONF conf[];
-
- const TIGHT_CONF* pconf;
- int jpegQuality;
- int jpegSubsampling;
- };
-
- }
-
- #endif
|