UINT vncEncodeHexT::EncodeRect(BYTE *source, BYTE *dest, const rfb::Rect &rect_IN) { rfb::Rect rect; rect.tl.x=(rect_IN.tl.x < 0)? 0: rect_IN.tl.x; rect.tl.y=(rect_IN.tl.y < 0)? 0: rect_IN.tl.y; rect.br.x=(rect_IN.br.x < 0)? 0: rect_IN.br.x; rect.br.y=(rect_IN.br.y < 0)? 0: rect_IN.br.y; const UINT rectW = rect.br.x - rect.tl.x; const UINT rectH = rect.br.y - rect.tl.y; // Create the rectangle header rfbFramebufferUpdateRectHeader *surh=(rfbFramebufferUpdateRectHeader *)dest; surh->r.x = (CARD16) (rect.tl.x-m_SWOffsetx); surh->r.y = (CARD16) (rect.tl.y-m_SWOffsety); surh->r.w = (CARD16) (rectW); surh->r.h = (CARD16) (rectH); surh->r.x = Swap16IfLE(surh->r.x); surh->r.y = Swap16IfLE(surh->r.y); surh->r.w = Swap16IfLE(surh->r.w); surh->r.h = Swap16IfLE(surh->r.h); surh->encoding = Swap32IfLE(rfbEncodingHextile); // Do the encoding switch (m_remoteformat.bitsPerPixel) { case 8: return sz_rfbFramebufferUpdateRectHeader + EncodeHextiles8(source, dest + sz_rfbFramebufferUpdateRectHeader, rect.tl.x, rect.tl.y, rectW, rectH); case 16: return sz_rfbFramebufferUpdateRectHeader + EncodeHextiles16(source, dest + sz_rfbFramebufferUpdateRectHeader, rect.tl.x, rect.tl.y, rectW, rectH); case 32: return sz_rfbFramebufferUpdateRectHeader + EncodeHextiles32(source, dest + sz_rfbFramebufferUpdateRectHeader, rect.tl.x, rect.tl.y, rectW, rectH); } return vncEncoder::EncodeRect(source, dest, rect); }
UINT vncEncodeZlibHex::EncodeRect(BYTE *source, VSocket *outConn, BYTE *dest, const RECT &rect, int offx, int offy) { const int rectW = rect.right - rect.left; const int rectH = rect.bottom - rect.top; // Create the rectangle header rfbFramebufferUpdateRectHeader *surh=(rfbFramebufferUpdateRectHeader *)dest; surh->r.x = (CARD16) (rect.left - offx); surh->r.y = (CARD16) (rect.top - offy); surh->r.w = (CARD16) (rectW); surh->r.h = (CARD16) (rectH); surh->r.x = Swap16IfLE(surh->r.x); surh->r.y = Swap16IfLE(surh->r.y); surh->r.w = Swap16IfLE(surh->r.w); surh->r.h = Swap16IfLE(surh->r.h); surh->encoding = Swap32IfLE(rfbEncodingZlibHex); rectangleOverhead += sz_rfbFramebufferUpdateRectHeader; dataSize += ( rectW * rectH * m_remoteformat.bitsPerPixel) / 8; // Go ahead and send the RFB update header, in case partial updates // are send in EncodeHextiles#() below. outConn->SendQueued( (char *)dest, sz_rfbFramebufferUpdateRectHeader ); transmittedSize += sz_rfbFramebufferUpdateRectHeader; // Do the encoding switch (m_remoteformat.bitsPerPixel) { case 8: return EncodeHextiles8(source, dest, outConn, rect.left, rect.top, rectW, rectH); case 16: return EncodeHextiles16(source, dest, outConn, rect.left, rect.top, rectW, rectH); case 32: return EncodeHextiles32(source, dest, outConn, rect.left, rect.top, rectW, rectH); } return vncEncoder::EncodeRect(source, dest, rect, offx, offy); }