// Modif rdv@2002 - v1.1.x - videodriver BOOL vncDesktopThread::handle_driver_changes(rfb::Region2D &rgncache,rfb::UpdateTracker &tracker) { omni_mutex_lock l(m_desktop->m_videodriver_lock); int oldaantal=m_desktop->m_videodriver->oldaantal; int counter=m_desktop->pchanges_buf->counter; // int nr_updates=m_desktop->pchanges_buf->pointrect[0].type; // vnclog.Print(LL_INTERR, VNCLOG("updates, rects %i\n"),oldaantal-counter); if (oldaantal==counter) return FALSE; if (counter<1 || counter >1999) return FALSE; // m_desktop->pchanges_buf->pointrect[0].type=0; if (!m_server->SingleWindow()) m_screen_moved=m_desktop->CalcCopyRects(tracker); else m_screen_moved=true; /// HEITE01E // buffer was overloaded, so we use the bounding rect /* if (nr_updates>2000) { rfb::Rect rect; int x = m_desktop->pchanges_buf->pointrect[0].rect.left; int w = m_desktop->pchanges_buf->pointrect[0].rect.right-m_desktop->pchanges_buf->pointrect[0].rect.left; int y = m_desktop->pchanges_buf->pointrect[0].rect.top; int h = m_desktop->pchanges_buf->pointrect[0].rect.bottom-m_desktop->pchanges_buf->pointrect[0].rect.top; if (ClipRect(&x, &y, &w, &h, m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.tl.y, m_desktop->m_bmrect.br.x-m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.br.y-m_desktop->m_bmrect.tl.y)) { rect.tl.x = x; rect.br.x = x+w; rect.tl.y = y; rect.br.y = y+h; rgncache=rgncache.union_(rect); m_desktop->m_videodriver->oldaantal=counter; } return TRUE; }*/ if (m_server->SingleWindow()) m_screen_moved=true; if (oldaantal<counter) { for (int i =oldaantal+1; i<=counter;i++) { copy_bitmaps_to_buffer(i,rgncache,tracker); } } else { int i = 0; for (i =oldaantal+1;i<MAXCHANGES_BUF;i++) { copy_bitmaps_to_buffer(i,rgncache,tracker); } for (i=1;i<=counter;i++) { copy_bitmaps_to_buffer(i,rgncache,tracker); } } // vnclog.Print(LL_INTINFO, VNCLOG("Nr rects %i \n"),rgncache.Numrects()); m_desktop->m_videodriver->oldaantal=counter; // A lot updates left after combining // This generates an overflow // We expand each single update to minimum 32x32 if (rgncache.Numrects()>150) { rfb::Region2D rgntemp; rfb::RectVector rects; rfb::RectVector::iterator i; rgncache.get_rects(rects, 1, 1); for (i = rects.begin(); i != rects.end(); i++) { rfb::Rect rect = *i; rect.tl.x=rect.tl.x/32*32; rect.tl.y=rect.tl.y/32*32; rect.br.x=rect.br.x/32*32+32; rect.br.y=rect.br.y/32*32+32; if (rect.br.x>m_desktop->m_bmrect.br.x) rect.br.x=m_desktop->m_bmrect.br.x; if (rect.br.y>m_desktop->m_bmrect.br.y) rect.br.y=m_desktop->m_bmrect.br.y; rgntemp.assign_union(rect); } //Still to many little updates //Use the bounding rectangle for updates if (rgntemp.Numrects()>50) { Rect brect=rgntemp.get_bounding_rect(); rgncache.clear(); rgncache.assign_union(brect); } else { rgncache.clear(); rgncache.assign_union(rgntemp); } } return TRUE; }