2010-03-08 14:49:45 +00:00
|
|
|
// Copyright (C) 2000 Constantin Kaplinsky. All Rights Reserved.
|
|
|
|
// Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
|
|
|
|
// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
|
|
|
//
|
|
|
|
// This file is part of the VNC system.
|
|
|
|
//
|
|
|
|
// The VNC system 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 program 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 program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
|
|
// USA.
|
|
|
|
//
|
|
|
|
// TightVNC distribution homepage on the Web: http://www.tightvnc.com/
|
|
|
|
//
|
|
|
|
// If the source code for the VNC system is not available from the place
|
|
|
|
// whence you received this file, check http://www.uk.research.att.com/vnc or contact
|
|
|
|
// the authors on vnc@uk.research.att.com for information on obtaining it.
|
|
|
|
|
|
|
|
|
|
|
|
// vncEncodeTight object
|
|
|
|
|
|
|
|
class vncEncodeTight;
|
|
|
|
|
|
|
|
#if !defined(_WINVNC_ENCODETIGHT)
|
|
|
|
#define _WINVNC_ENCODETIGHT
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "vncEncoder.h"
|
|
|
|
|
|
|
|
#include "zlib/zlib.h"
|
|
|
|
extern "C" {
|
|
|
|
#include "libjpeg/jpeglib.h"
|
|
|
|
}
|
|
|
|
|
|
|
|
// Minimum amount of data to be compressed. This value should not be
|
|
|
|
// changed, doing so will break compatibility with existing clients.
|
|
|
|
#define TIGHT_MIN_TO_COMPRESS 12
|
|
|
|
|
|
|
|
// The parameters below may be adjusted.
|
|
|
|
#define MIN_SPLIT_RECT_SIZE 4096
|
|
|
|
#define MIN_SOLID_SUBRECT_SIZE 2048
|
|
|
|
#define MAX_SPLIT_TILE_SIZE 16
|
|
|
|
|
|
|
|
// C-style structures to store palette entries and compression paramentes.
|
|
|
|
// Such code probably should be converted into C++ classes.
|
|
|
|
|
|
|
|
struct COLOR_LIST {
|
|
|
|
COLOR_LIST *next;
|
|
|
|
int idx;
|
|
|
|
CARD32 rgb;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct PALETTE_ENTRY {
|
|
|
|
COLOR_LIST *listNode;
|
|
|
|
int numPixels;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct PALETTE {
|
|
|
|
PALETTE_ENTRY entry[256];
|
|
|
|
COLOR_LIST *hash[256];
|
|
|
|
COLOR_LIST list[256];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct TIGHT_CONF {
|
|
|
|
int maxRectSize, maxRectWidth;
|
|
|
|
int monoMinRectSize, gradientMinRectSize;
|
|
|
|
int idxZlibLevel, monoZlibLevel, rawZlibLevel, gradientZlibLevel;
|
|
|
|
unsigned long gradientThreshold, gradientThreshold24;
|
|
|
|
int idxMaxColorsDivisor;
|
|
|
|
int jpegQuality;
|
|
|
|
unsigned long jpegThreshold, jpegThreshold24;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Class definition
|
|
|
|
|
|
|
|
class vncEncodeTight : public vncEncoder
|
|
|
|
{
|
|
|
|
// Fields
|
|
|
|
public:
|
|
|
|
|
|
|
|
// Methods
|
|
|
|
public:
|
|
|
|
// Create/Destroy methods
|
|
|
|
vncEncodeTight();
|
|
|
|
~vncEncodeTight();
|
|
|
|
|
2010-03-24 00:00:05 +00:00
|
|
|
//virtual VOID UpdateZLibDictionary( AGENT_CTX * lpAgentContext );
|
|
|
|
//virtual VOID DumpZLibDictionary( AGENT_CTX * lpAgentContext );
|
|
|
|
|
2010-03-08 14:49:45 +00:00
|
|
|
virtual void Init();
|
|
|
|
virtual const char* GetEncodingName() { return "Tight"; }
|
|
|
|
|
|
|
|
virtual UINT RequiredBuffSize(UINT width, UINT height);
|
|
|
|
virtual UINT NumCodedRects(RECT &rect);
|
|
|
|
|
|
|
|
virtual UINT EncodeRect(BYTE *source, VSocket *outConn, BYTE *dest, const RECT &rect, int offx, int offy);
|
|
|
|
|
|
|
|
// Implementation
|
|
|
|
protected:
|
|
|
|
int m_paletteNumColors, m_paletteMaxColors;
|
|
|
|
CARD32 m_monoBackground, m_monoForeground;
|
|
|
|
PALETTE m_palette;
|
|
|
|
|
|
|
|
z_stream m_zsStruct[4];
|
|
|
|
bool m_zsActive[4];
|
|
|
|
int m_zsLevel[4];
|
|
|
|
|
|
|
|
BYTE *m_hdrBuffer;
|
|
|
|
int m_hdrBufferBytes;
|
|
|
|
BYTE *m_buffer;
|
|
|
|
int m_bufflen;
|
|
|
|
int *m_prevRowBuf;
|
|
|
|
int offsetx;
|
|
|
|
int offsety;
|
|
|
|
|
|
|
|
bool m_usePixelFormat24;
|
|
|
|
|
|
|
|
static const TIGHT_CONF m_conf[10];
|
|
|
|
|
|
|
|
// Protected member functions.
|
|
|
|
|
|
|
|
void FindBestSolidArea(BYTE *source, int x, int y, int w, int h,
|
|
|
|
CARD32 colorValue, int *w_ptr, int *h_ptr);
|
|
|
|
void ExtendSolidArea (BYTE *source, int x, int y, int w, int h,
|
|
|
|
CARD32 colorValue,
|
|
|
|
int *x_ptr, int *y_ptr, int *w_ptr, int *h_ptr);
|
|
|
|
bool CheckSolidTile (BYTE *source, int x, int y, int w, int h,
|
|
|
|
CARD32 *colorPtr, bool needSameColor);
|
|
|
|
bool CheckSolidTile8 (BYTE *source, int x, int y, int w, int h,
|
|
|
|
CARD32 *colorPtr, bool needSameColor);
|
|
|
|
bool CheckSolidTile16 (BYTE *source, int x, int y, int w, int h,
|
|
|
|
CARD32 *colorPtr, bool needSameColor);
|
|
|
|
bool CheckSolidTile32 (BYTE *source, int x, int y, int w, int h,
|
|
|
|
CARD32 *colorPtr, bool needSameColor);
|
|
|
|
|
|
|
|
UINT EncodeRectSimple (BYTE *source, VSocket *outConn, BYTE *dest,
|
|
|
|
const RECT &rect);
|
|
|
|
UINT EncodeSubrect (BYTE *source, VSocket *outConn, BYTE *dest,
|
|
|
|
int x, int y, int w, int h);
|
|
|
|
void SendTightHeader (int x, int y, int w, int h);
|
|
|
|
|
|
|
|
int SendSolidRect (BYTE *dest);
|
|
|
|
int SendMonoRect (BYTE *dest, int w, int h);
|
|
|
|
int SendIndexedRect (BYTE *dest, int w, int h);
|
|
|
|
int SendFullColorRect (BYTE *dest, int w, int h);
|
|
|
|
int SendGradientRect (BYTE *dest, int w, int h);
|
|
|
|
int CompressData (BYTE *dest, int streamId, int dataLen,
|
|
|
|
int zlibLevel, int zlibStrategy);
|
|
|
|
int SendCompressedData(size_t compressedLen);
|
|
|
|
|
|
|
|
void FillPalette8 (int count);
|
|
|
|
void FillPalette16(int count);
|
|
|
|
void FillPalette32(int count);
|
|
|
|
|
|
|
|
void PaletteReset(void);
|
|
|
|
int PaletteInsert(CARD32 rgb, int numPixels, int bpp);
|
|
|
|
|
|
|
|
void Pack24(BYTE *buf, int count);
|
|
|
|
|
|
|
|
void EncodeIndexedRect16(BYTE *buf, int count);
|
|
|
|
void EncodeIndexedRect32(BYTE *buf, int count);
|
|
|
|
|
|
|
|
void EncodeMonoRect8 (BYTE *buf, int w, int h);
|
|
|
|
void EncodeMonoRect16(BYTE *buf, int w, int h);
|
|
|
|
void EncodeMonoRect32(BYTE *buf, int w, int h);
|
|
|
|
|
|
|
|
void FilterGradient24(BYTE *buf, int w, int h);
|
|
|
|
void FilterGradient16(CARD16 *buf, int w, int h);
|
|
|
|
void FilterGradient32(CARD32 *buf, int w, int h);
|
|
|
|
|
|
|
|
int DetectSmoothImage (int w, int h);
|
|
|
|
unsigned long DetectSmoothImage24 (int w, int h);
|
|
|
|
unsigned long DetectSmoothImage16 (int w, int h);
|
|
|
|
unsigned long DetectSmoothImage32 (int w, int h);
|
|
|
|
|
|
|
|
int SendJpegRect(BYTE *dst, int w, int h, int quality);
|
|
|
|
void PrepareRowForJpeg(BYTE *dst, int y, int w);
|
|
|
|
void PrepareRowForJpeg24(BYTE *dst, CARD32 *src, int count);
|
|
|
|
void PrepareRowForJpeg16(BYTE *dst, CARD16 *src, int count);
|
|
|
|
void PrepareRowForJpeg32(BYTE *dst, CARD32 *src, int count);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _WINVNC_ENCODETIGHT
|
|
|
|
|