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

📄 smsgwriter.cxx

📁 linux可以运行程序源码
💻 CXX
字号:
/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved. *  * 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. */#include <stdio.h>#include <assert.h>#include <rdr/OutStream.h>#include <rfb/msgTypes.h>#include <rfb/ColourMap.h>#include <rfb/ConnParams.h>#include <rfb/UpdateTracker.h>#include <rfb/SMsgWriter.h>#include <rfb/LogWriter.h>using namespace rfb;static LogWriter vlog("SMsgWriter");SMsgWriter::SMsgWriter(ConnParams* cp_, rdr::OutStream* os_)  : imageBufIdealSize(0), cp(cp_), os(os_), lenBeforeRect(0),    currentEncoding(0), updatesSent(0), rawBytesEquivalent(0),    imageBuf(0), imageBufSize(0){  for (unsigned int i = 0; i <= encodingMax; i++) {    encoders[i] = 0;    bytesSent[i] = 0;    rectsSent[i] = 0;  }}SMsgWriter::~SMsgWriter(){  vlog.info("framebuffer updates %d",updatesSent);  int bytes = 0;  for (unsigned int i = 0; i <= encodingMax; i++) {    delete encoders[i];    if (i != encodingCopyRect)      bytes += bytesSent[i];    if (rectsSent[i])      vlog.info("  %s rects %d, bytes %d",                encodingName(i), rectsSent[i], bytesSent[i]);  }  vlog.info("  raw bytes equivalent %d, compression ratio %f",          rawBytesEquivalent, (double)rawBytesEquivalent / bytes);  delete [] imageBuf;}void SMsgWriter::writeSetColourMapEntries(int firstColour, int nColours,                                          ColourMap* cm){  startMsg(msgTypeSetColourMapEntries);  os->pad(1);  os->writeU16(firstColour);  os->writeU16(nColours);  for (int i = firstColour; i < firstColour+nColours; i++) {    int r, g, b;    cm->lookup(i, &r, &g, &b);    os->writeU16(r);    os->writeU16(g);    os->writeU16(b);  }  endMsg();}void SMsgWriter::writeBell(){  startMsg(msgTypeBell);  endMsg();}void SMsgWriter::writeServerCutText(const char* str, int len){  startMsg(msgTypeServerCutText);  os->pad(3);  os->writeU32(len);  os->writeBytes(str, len);  endMsg();}void SMsgWriter::writeFramebufferUpdate(const UpdateInfo& ui, ImageGetter* ig,                                        Region* updatedRegion){  writeFramebufferUpdateStart(ui.numRects());  writeRects(ui, ig, updatedRegion);  writeFramebufferUpdateEnd();}void SMsgWriter::writeRects(const UpdateInfo& ui, ImageGetter* ig,                            Region* updatedRegion){  std::vector<Rect> rects;  std::vector<Rect>::const_iterator i;  updatedRegion->copyFrom(ui.changed);  updatedRegion->assign_union(ui.copied);  ui.copied.get_rects(&rects, ui.copy_delta.x <= 0, ui.copy_delta.y <= 0);  for (i = rects.begin(); i != rects.end(); i++)    writeCopyRect(*i, i->tl.x - ui.copy_delta.x, i->tl.y - ui.copy_delta.y);  ui.changed.get_rects(&rects);  for (i = rects.begin(); i != rects.end(); i++) {    Rect actual;    if (!writeRect(*i, ig, &actual)) {      updatedRegion->assign_subtract(*i);      updatedRegion->assign_union(actual);    }  }}bool SMsgWriter::needFakeUpdate(){  return false;}bool SMsgWriter::writeRect(const Rect& r, ImageGetter* ig, Rect* actual){  return writeRect(r, cp->currentEncoding(), ig, actual);}bool SMsgWriter::writeRect(const Rect& r, unsigned int encoding,                           ImageGetter* ig, Rect* actual){  if (!encoders[encoding]) {    encoders[encoding] = Encoder::createEncoder(encoding, this);    assert(encoders[encoding]);  }  return encoders[encoding]->writeRect(r, ig, actual);}void SMsgWriter::writeCopyRect(const Rect& r, int srcX, int srcY){  startRect(r,encodingCopyRect);  os->writeU16(srcX);  os->writeU16(srcY);  endRect();}rdr::U8* SMsgWriter::getImageBuf(int required, int requested, int* nPixels){  int requiredBytes = required * (cp->pf().bpp / 8);  int requestedBytes = requested * (cp->pf().bpp / 8);  int size = requestedBytes;  if (size > imageBufIdealSize) size = imageBufIdealSize;  if (size < requiredBytes)    size = requiredBytes;  if (imageBufSize < size) {    imageBufSize = size;    delete [] imageBuf;    imageBuf = new rdr::U8[imageBufSize];  }  if (nPixels)    *nPixels = imageBufSize / (cp->pf().bpp / 8);  return imageBuf;}int SMsgWriter::bpp(){  return cp->pf().bpp;}

⌨️ 快捷键说明

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