ClientConnectionCoRRE.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:3k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. //  Copyright (C) 1997, 1998 Olivetti & Oracle Research Laboratory
  2. //
  3. //  This file is part of the VNC system.
  4. //
  5. //  The VNC system is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  18. //  USA.
  19. //
  20. // If the source code for the VNC system is not available from the place 
  21. // whence you received this file, check http://www.orl.co.uk/vnc or contact
  22. // the authors on vnc@orl.co.uk for information on obtaining it.
  23. // CoRRE (Compact Rising Rectangle Encoding)
  24. //
  25. // The bits of the ClientConnection object to do with CoRRE.
  26. #include "stdhdrs.h"
  27. #include "vncviewer.h"
  28. #include "ClientConnection.h"
  29. void ClientConnection::ReadCoRRERect(rfbFramebufferUpdateRectHeader *pfburh)
  30. {
  31. // An RRE rect is always followed by a background color
  32. // For speed's sake we read them together into a buffer.
  33. char tmpbuf[sz_rfbRREHeader+4]; // biggest pixel is 4 bytes long
  34.     rfbRREHeader *prreh = (rfbRREHeader *) tmpbuf;
  35. CARD8 *pcolor = (CARD8 *) tmpbuf + sz_rfbRREHeader;
  36. ReadExact(tmpbuf, sz_rfbRREHeader + m_minPixelBytes);
  37. prreh->nSubrects = Swap32IfLE(prreh->nSubrects);
  38. SETUP_COLOR_SHORTCUTS;
  39.     COLORREF color;
  40.     switch (m_myFormat.bitsPerPixel) {
  41.         case 8:
  42.             color = COLOR_FROM_PIXEL8_ADDRESS(pcolor); break;
  43.         case 16:
  44. color = COLOR_FROM_PIXEL16_ADDRESS(pcolor); break;
  45.         case 24:
  46.         case 32:
  47.             color = COLOR_FROM_PIXEL32_ADDRESS(pcolor); break;
  48.     }
  49.     // Draw the background of the rectangle
  50.     FillSolidRect(pfburh->r.x, pfburh->r.y, pfburh->r.w, pfburh->r.h, color);
  51.     if (prreh->nSubrects == 0) return;
  52. // Draw the sub-rectangles
  53.     rfbCoRRERectangle *pRect;
  54. rfbRectangle rect;
  55. // The size of an CoRRE subrect including color info
  56. int subRectSize = m_minPixelBytes + sz_rfbCoRRERectangle;
  57. // Read subrects into the buffer 
  58. CheckBufferSize(subRectSize * prreh->nSubrects);
  59.     ReadExact(m_netbuf, subRectSize * prreh->nSubrects);
  60. BYTE *p = (BYTE *) m_netbuf;
  61.     for (CARD32 i = 0; i < prreh->nSubrects; i++) {
  62.         pRect = (rfbCoRRERectangle *) (p + m_minPixelBytes);
  63. switch (m_myFormat.bitsPerPixel) {
  64.         case 8:
  65.             color = COLOR_FROM_PIXEL8_ADDRESS(p); break;
  66.         case 16:
  67.             color = COLOR_FROM_PIXEL16_ADDRESS(p); break;
  68.         case 32:
  69.             color = COLOR_FROM_PIXEL32_ADDRESS(p); break;
  70.         };
  71. // color = COLOR_FROM_PIXEL8_ADDRESS(netbuf);
  72.         rect.x = pRect->x + pfburh->r.x;
  73.         rect.y = pRect->y + pfburh->r.y;
  74.         rect.w = pRect->w;
  75.         rect.h = pRect->h;
  76.         FillSolidRect(rect.x, rect.y, rect.w, rect.h, color);
  77. p+=subRectSize;
  78.     }
  79. }