zrle.cxx

来自「realvnc是一个非常流行的远程控制程序」· CXX 代码 · 共 116 行

CXX
116
字号
//// Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.//#include <rdr/ZlibInStream.h>#include <rdr/FdInStream.h>#include <rdr/Exception.h>#include "stdhdrs.h"#include "vncviewer.h"#include "ClientConnection.h"// Instantiate the decoding function for 8, 16 and 32 BPP#define FAVOUR_FILL_RECT#define zrleDecode ClientConnection::zrleDecode#define BPP 8#define IMAGE_RECT(x,y,w,h,data)                \    SETUP_COLOR_SHORTCUTS;                      \    SETPIXELS(8,x,y,w,h)#define FILL_RECT(x,y,w,h,pix)                          \    SETUP_COLOR_SHORTCUTS;                              \    COLORREF color = COLOR_FROM_PIXEL8_ADDRESS(&pix);   \    FillSolidRect(x,y,w,h,color)#include <rfb/zrleDecode.h>#undef BPP#undef IMAGE_RECT#undef FILL_RECT#define BPP 16#define IMAGE_RECT(x,y,w,h,data)                \    SETUP_COLOR_SHORTCUTS;                      \    SETPIXELS(16,x,y,w,h)#define FILL_RECT(x,y,w,h,pix)                          \    SETUP_COLOR_SHORTCUTS;                              \    COLORREF color = COLOR_FROM_PIXEL16_ADDRESS(&pix);  \    FillSolidRect(x,y,w,h,color)#include <rfb/zrleDecode.h>#undef BPP#undef IMAGE_RECT#undef FILL_RECT#define IMAGE_RECT(x,y,w,h,data)                \    SETUP_COLOR_SHORTCUTS;                      \    SETPIXELS(32,x,y,w,h)#define FILL_RECT(x,y,w,h,pix)                          \    SETUP_COLOR_SHORTCUTS;                              \    COLORREF color = COLOR_FROM_PIXEL32_ADDRESS(&pix);  \    FillSolidRect(x,y,w,h,color)#define BPP 32#include <rfb/zrleDecode.h>#define CPIXEL 24A#include <rfb/zrleDecode.h>#undef CPIXEL#define CPIXEL 24B#include <rfb/zrleDecode.h>#undef CPIXEL#undef BPP#undef IMAGE_RECT#undef FILL_RECT#undef zrleDecodevoid ClientConnection::zrleDecode(int x, int y, int w, int h){  try {    CheckBufferSize(rfbZRLETileWidth * rfbZRLETileHeight * 4);    omni_mutex_lock l(m_bitmapdcMutex);    ObjectSelector b(m_hBitmapDC, m_hBitmap);    PaletteSelector p(m_hBitmapDC, m_hPalette);    switch (m_myFormat.bitsPerPixel) {    case 8:      zrleDecode8(x,y,w,h,fis,zis,(rdr::U8*)m_netbuf);      break;    case 16:      zrleDecode16(x,y,w,h,fis,zis,(rdr::U16*)m_netbuf);      break;    case 32:      bool fitsInLS3Bytes        = ((m_myFormat.redMax   << m_myFormat.redShift)   < (1<<24) &&           (m_myFormat.greenMax << m_myFormat.greenShift) < (1<<24) &&           (m_myFormat.blueMax  << m_myFormat.blueShift)  < (1<<24));      bool fitsInMS3Bytes = (m_myFormat.redShift   > 7  &&                             m_myFormat.greenShift > 7  &&                             m_myFormat.blueShift  > 7);      if ((fitsInLS3Bytes && !m_myFormat.bigEndian) ||          (fitsInMS3Bytes && m_myFormat.bigEndian))      {        zrleDecode24A(x,y,w,h,fis,zis,(rdr::U32*)m_netbuf);      }      else if ((fitsInLS3Bytes && m_myFormat.bigEndian) ||               (fitsInMS3Bytes && !m_myFormat.bigEndian))      {        zrleDecode24B(x,y,w,h,fis,zis,(rdr::U32*)m_netbuf);      }      else      {        zrleDecode32(x,y,w,h,fis,zis,(rdr::U32*)m_netbuf);      }      break;    }  } catch (rdr::Exception& e) {    fprintf(stderr,"ZRLE decoder exception: %s\n",e.str());    throw;  }}

⌨️ 快捷键说明

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