// Encode the rectangle using zlib compression inline UINT vncEncodeZlib::EncodeRect(BYTE *source, CurlSocket *outConn, BYTE *dest, const RECT &rect, int offx, int offy) { int totalSize = 0; int partialSize = 0; int maxLines; int linesRemaining; offsetx = offx; offsety = offy; RECT partialRect; const int rectW = rect.right - rect.left; const int rectH = rect.bottom - rect.top; partialRect.right = rect.right; partialRect.left = rect.left; partialRect.top = rect.top; partialRect.bottom = rect.bottom; /* WBB: For testing purposes only! */ // vnclog.Print(LL_INTINFO, VNCLOG("rect.right=%d rect.left=%d rect.top=%d rect.bottom=%d\n"), rect.right, rect.left, rect.top, rect.bottom); maxLines = ( ZLIB_MAX_SIZE(rectW) / rectW ); linesRemaining = rectH; while ( linesRemaining > 0 ) { int linesToComp; if ( maxLines < linesRemaining ) linesToComp = maxLines; else linesToComp = linesRemaining; partialRect.bottom = partialRect.top + linesToComp; /* WBB: For testing purposes only! */ // vnclog.Print(LL_INTINFO, VNCLOG("partialRect.right=%d partialRect.left=%d partialRect.top=%d partialRect.bottom=%d\n"), partialRect.right, partialRect.left, partialRect.top, partialRect.bottom); partialSize = EncodeOneRect( source, dest, partialRect ); totalSize += partialSize; linesRemaining -= linesToComp; partialRect.top += linesToComp; if (( linesRemaining > 0 ) && ( partialSize > 0 )) { // Send the encoded data outConn->SendQueued( (char *)dest, partialSize ); transmittedSize += partialSize; } } transmittedSize += partialSize; return partialSize; }
UINT vncEncodeZlib::NumCodedRects(const rfb::Rect &rect) { const int rectW = rect.br.x - rect.tl.x; const int rectH = rect.br.y - rect.tl.y; int aantal=(( rectH - 1 ) / ( ZLIB_MAX_SIZE( rectW ) / rectW ) + 1 ); m_queueEnable=false; if (m_use_lastrect && aantal>1) { m_queueEnable=true; return 0; } /****************************************************************** return 1; ******************************************************************/ // Return the number of rectangles needed to encode the given // update. ( ZLIB_MAX_SIZE(rectW) / rectW ) is the number of lines in // each maximum size rectangle. // When solid is enabled, most of the pixels are removed return (( rectH - 1 ) / ( ZLIB_MAX_SIZE( rectW ) / rectW ) + 1 ); }
UINT vncEncodeZlib::NumCodedRects(RECT &rect) { /****************************************************************** return 1; ******************************************************************/ const int rectW = rect.right - rect.left; const int rectH = rect.bottom - rect.top; // Return the number of rectangles needed to encode the given // update. ( ZLIB_MAX_SIZE(rectW) / rectW ) is the number of lines in // each maximum size rectangle. return (( rectH - 1 ) / ( ZLIB_MAX_SIZE( rectW ) / rectW ) + 1 ); }