⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vncencodezrle.cxx

📁 realvnc是一个非常流行的远程控制程序
💻 CXX
字号:
//  Copyright (C) 2002-2003 RealVNC Ltd. All Rights Reserved.////  This program 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.//// If the source code for the program is not available from the place from// which you received this file, check http://www.realvnc.com/ or contact// the authors on info@realvnc.com for information on obtaining it.#include "vncEncodeZRLE.h"#include "rfb.h"#include "rfbMisc.h"#include <stdlib.h>#include <time.h>#include <rdr/MemOutStream.h>#include <rdr/ZlibOutStream.h>#include <rdr/Exception.h>#define GET_IMAGE_INTO_BUF(tx,ty,tw,th,buf)     \  rfb::Rect rect;                                    \  rect.tl.x = tx;                               \  rect.tl.y = ty;                                \  rect.br.x = tx+tw;                           \  rect.br.y = ty+th;                          \  encoder->Translate(source, (BYTE*)buf, rect);#define EXTRA_ARGS , BYTE* source, vncEncoder* encoder#define BPP 8#include <rfb/zrleEncode.h>#undef BPP#define BPP 16#include <rfb/zrleEncode.h>#undef BPP#define BPP 32#include <rfb/zrleEncode.h>#define CPIXEL 24A#include <rfb/zrleEncode.h>#undef CPIXEL#define CPIXEL 24B#include <rfb/zrleEncode.h>#undef CPIXEL#undef BPPvncEncodeZRLE::vncEncodeZRLE(){  mos = new rdr::MemOutStream;  zos = new rdr::ZlibOutStream;  beforeBuf = new rdr::U32[rfbZRLETileWidth * rfbZRLETileHeight + 1];}vncEncodeZRLE::~vncEncodeZRLE(){  delete mos;  delete zos;  delete [] beforeBuf;}void vncEncodeZRLE::Init(){  vncEncoder::Init();}UINT vncEncodeZRLE::RequiredBuffSize(UINT width, UINT height){  // this is a guess - 12 bytes plus 1.5 times raw... (zlib.h says compress  // needs 12 bytes plus 1.001 times raw data but that's not quite what we give  // zlib anyway)  return (sz_rfbFramebufferUpdateRectHeader + sz_rfbZRLEHeader + 12 +          width * height * (m_remoteformat.bitsPerPixel / 8) * 3 / 2);}UINT vncEncodeZRLE::EncodeRect(BYTE *source, BYTE *dest, const rfb::Rect &rect){  int x = rect.tl.x;  int y = rect.tl.y;  int w = rect.br.x - x;  int h = rect.br.y - y;  try {    mos->clear();    switch (m_remoteformat.bitsPerPixel) {    case 8:      zrleEncode8( x, y, w, h, mos, zos, beforeBuf, source, this);      break;    case 16:      zrleEncode16(x, y, w, h, mos, zos, beforeBuf, source, this);      break;    case 32:      bool fitsInLS3Bytes        = ((m_remoteformat.redMax   << m_remoteformat.redShift)   < (1<<24) &&           (m_remoteformat.greenMax << m_remoteformat.greenShift) < (1<<24) &&           (m_remoteformat.blueMax  << m_remoteformat.blueShift)  < (1<<24));      bool fitsInMS3Bytes = (m_remoteformat.redShift   > 7  &&                             m_remoteformat.greenShift > 7  &&                             m_remoteformat.blueShift  > 7);      if ((fitsInLS3Bytes && !m_remoteformat.bigEndian) ||          (fitsInMS3Bytes && m_remoteformat.bigEndian))      {        zrleEncode24A(x, y, w, h, mos, zos, beforeBuf, source, this);      }      else if ((fitsInLS3Bytes && m_remoteformat.bigEndian) ||               (fitsInMS3Bytes && !m_remoteformat.bigEndian))      {        zrleEncode24B(x, y, w, h, mos, zos, beforeBuf, source, this);      }      else      {        zrleEncode32(x, y, w, h, mos, zos, beforeBuf, source, this);      }      break;    }    rfbFramebufferUpdateRectHeader* surh = (rfbFramebufferUpdateRectHeader*)dest;    surh->r.x = Swap16IfLE(x);    surh->r.y = Swap16IfLE(y);    surh->r.w = Swap16IfLE(w);    surh->r.h = Swap16IfLE(h);    surh->encoding = Swap32IfLE(rfbEncodingZRLE);    rfbZRLEHeader* hdr = (rfbZRLEHeader*)(dest +                                          sz_rfbFramebufferUpdateRectHeader);    hdr->length = Swap32IfLE(mos->length());    memcpy(dest + sz_rfbFramebufferUpdateRectHeader + sz_rfbZRLEHeader,           (rdr::U8*)mos->data(), mos->length());    return sz_rfbFramebufferUpdateRectHeader + sz_rfbZRLEHeader + mos->length();  } catch (rdr::Exception& e) {    vnclog.Print(LL_INTERR, VNCLOG("ZRLE EncodeRect error:%s\n"), e.str());    return 0;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -