void ClientConnection::ReadUltraRect(rfbFramebufferUpdateRectHeader *pfburh) { UINT numpixels = pfburh->r.w * pfburh->r.h; // this assumes at least one byte per pixel. Naughty. UINT numRawBytes = numpixels * m_minPixelBytes; UINT numCompBytes; lzo_uint new_len; rfbZlibHeader hdr; // Read in the rfbZlibHeader omni_mutex_lock l(m_bitmapdcMutex); ReadExact((char *)&hdr, sz_rfbZlibHeader); numCompBytes = Swap32IfLE(hdr.nBytes); // Read in the compressed data CheckBufferSize(numCompBytes); ReadExact(m_netbuf, numCompBytes); CheckZlibBufferSize(numRawBytes); lzo1x_decompress((BYTE*)m_netbuf,numCompBytes,(BYTE*)m_zlibbuf,&new_len,NULL); SoftCursorLockArea(pfburh->r.x, pfburh->r.y,pfburh->r.w,pfburh->r.h); if (!Check_Rectangle_borders(pfburh->r.x, pfburh->r.y,pfburh->r.w,pfburh->r.h)) return; if (m_DIBbits) ConvertAll(pfburh->r.w,pfburh->r.h,pfburh->r.x, pfburh->r.y,m_myFormat.bitsPerPixel/8,(BYTE *)m_zlibbuf,(BYTE *)m_DIBbits,m_si.framebufferWidth); }
//--------------------------------------------------------------------------------------------- void TMainForm::sl_Start() { // для загрузки Mesh нужно устройство MakeDevice(); // создать список файлов MakeListPath(); // загружать по одному и сохранять ConvertAll(); DestroyDevice(); }
void ClientConnection::ReadUltraZip(rfbFramebufferUpdateRectHeader *pfburh,HRGN *prgn) { UINT nNbCacheRects = pfburh->r.x; UINT numRawBytes = pfburh->r.y+pfburh->r.w*65535; UINT numCompBytes; lzo_uint new_len; rfbZlibHeader hdr; // Read in the rfbZlibHeader omni_mutex_lock l(m_bitmapdcMutex); ReadExact((char *)&hdr, sz_rfbZlibHeader); numCompBytes = Swap32IfLE(hdr.nBytes); // Check the net buffer CheckBufferSize(numCompBytes); // Read the compressed data ReadExact((char *)m_netbuf, numCompBytes); // Verify buffer space for cache rects list CheckZlibBufferSize(numRawBytes+500); lzo1x_decompress((BYTE*)m_netbuf,numCompBytes,(BYTE*)m_zlibbuf,&new_len,NULL); BYTE* pzipbuf = m_zlibbuf; for (UINT i = 0 ; i < nNbCacheRects; i++) { rfbFramebufferUpdateRectHeader surh; memcpy((char *) &surh,pzipbuf, sz_rfbFramebufferUpdateRectHeader); 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(surh.encoding); pzipbuf += sz_rfbFramebufferUpdateRectHeader; RECT rect; rect.left = surh.r.x; rect.right = surh.r.x + surh.r.w; rect.top = surh.r.y; rect.bottom = surh.r.y + surh.r.h; //border check if (!Check_Rectangle_borders(rect.left,rect.top,surh.r.w,surh.r.h)) return; SoftCursorLockArea(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); if ( surh.encoding==rfbEncodingRaw) { UINT numpixels = surh.r.w * surh.r.h; if (m_DIBbits) ConvertAll(surh.r.w,surh.r.h,surh.r.x, surh.r.y,m_myFormat.bitsPerPixel/8,(BYTE *)pzipbuf,(BYTE *)m_DIBbits,m_si.framebufferWidth); pzipbuf +=numpixels*m_myFormat.bitsPerPixel/8; if (!m_opts.m_Directx)InvalidateRegion(&rect,prgn); } } }
int CZipCentralDir::FindFile(LPCTSTR lpszFileName, bool bCaseSensitive, bool bSporadically, bool bFileNameOnly) { // this is required for fast finding and is done only once if (!m_bConvertAfterOpen) { TRACE(_T("%s(%i) : Converting all the filenames.\n"),__FILE__,__LINE__); ConvertAll(); } if (!m_bFindFastEnabled) EnableFindFast(true, bSporadically ? !bCaseSensitive : bCaseSensitive); int iResult = -1; if (bFileNameOnly) { // a non-effective search (treat an array as unsorted) int iSize = m_findarray.GetSize(); for (int i = 0; i < iSize; i++) { CZipString sz = GetProperHeaderFileName(m_findarray[i].m_pHeader); CZipPathComponent::RemoveSeparators(sz); // to find a dir CZipPathComponent zpc(sz); sz = zpc.GetFileName(); if ((sz.*m_pCompare)(lpszFileName) == 0) { iResult = i; break; } } } else if (bCaseSensitive == m_bCaseSensitive) iResult = FindFileNameIndex(lpszFileName); else { if (bSporadically) { // a non-effective search (treat an array as unsorted) int iSize = m_findarray.GetSize(); for (int i = 0; i < iSize; i++) if (CompareElement(lpszFileName, (WORD)i) == 0) { iResult = i; break; } } else { BuildFindFastArray(bCaseSensitive); iResult = FindFileNameIndex(lpszFileName); } } return iResult == -1 ? -1 : m_findarray[iResult].m_uIndex; }
void ClientConnection::ReadRawRect(rfbFramebufferUpdateRectHeader *pfburh) { UINT numpixels = pfburh->r.w * pfburh->r.h; // this assumes at least one byte per pixel. Naughty. UINT numbytes = numpixels * m_minPixelBytes; // Read in the whole thing CheckBufferSize(numbytes); ReadExact(m_netbuf, numbytes); if (UltraFast && m_DIBbits) { boost::recursive_mutex::scoped_lock l(m_bitmapdcMutex); ConvertAll(pfburh->r.w,pfburh->r.h,pfburh->r.x, pfburh->r.y,m_myFormat.bitsPerPixel/8,(BYTE *)m_netbuf,(BYTE *)m_DIBbits,m_si.framebufferWidth); return; } SETUP_COLOR_SHORTCUTS; { // No other threads can use bitmap DC boost::recursive_mutex::scoped_lock l(m_bitmapdcMutex); ObjectSelector b(m_hBitmapDC, m_hBitmap); \ PaletteSelector p(m_hBitmapDC, m_hPalette); \ // This big switch is untidy but fast switch (m_myFormat.bitsPerPixel) { case 8: SETPIXELS(m_netbuf, 8, pfburh->r.x, pfburh->r.y, pfburh->r.w, pfburh->r.h) break; case 16: SETPIXELS(m_netbuf, 16, pfburh->r.x, pfburh->r.y, pfburh->r.w, pfburh->r.h) break; case 24: case 32: SETPIXELS(m_netbuf, 32, pfburh->r.x, pfburh->r.y, pfburh->r.w, pfburh->r.h) break; default: //vnclog.Print(0, _T("Invalid number of bits per pixel: %d\n"), m_myFormat.bitsPerPixel); Log.Add(_ERROR_, "Invalid number of bits per pixel: %d", m_myFormat.bitsPerPixel); return; } } }