metasploit-framework/external/source/vncdll/winvnc/vncEncodeTight.h

195 lines
6.1 KiB
C++

// 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();
//virtual VOID UpdateZLibDictionary( AGENT_CTX * lpAgentContext );
//virtual VOID DumpZLibDictionary( AGENT_CTX * lpAgentContext );
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