void GenericLayout::refreshRect( int x, int y, int width, int height ) { // Do nothing if the layout is hidden if( !m_visible ) return; // update the transparency global mask m_pImage->clear( x, y, width, height ); // Draw all the controls of the layout std::list<LayeredControl>::const_iterator iter; for( iter = m_controlList.begin(); iter != m_controlList.end(); ++iter ) { CtrlGeneric *pCtrl = (*iter).m_pControl; if( pCtrl->isVisible() ) { pCtrl->draw( *m_pImage, x, y, width, height ); } } // Refresh the associated window TopWindow *pWindow = getWindow(); if( pWindow ) { // first apply new shape to the window pWindow->updateShape(); pWindow->invalidateRect( x, y, width, height ); } }
void GenericLayout::refreshRect( int x, int y, int width, int height ) { // Do nothing if the layout is hidden if( !m_visible ) return; // Draw all the controls of the layout list<LayeredControl>::const_iterator iter; list<LayeredControl>::const_iterator iterVideo = m_controlList.end(); for( iter = m_controlList.begin(); iter != m_controlList.end(); iter++ ) { CtrlGeneric *pCtrl = (*iter).m_pControl; const Position *pPos = pCtrl->getPosition(); if( pPos && pCtrl->isVisible() ) { pCtrl->draw( *m_pImage, pPos->getLeft(), pPos->getTop() ); } } // Refresh the associated window TopWindow *pWindow = getWindow(); if( pWindow ) { // Check boundaries if( x < 0 ) x = 0; if( y < 0) y = 0; if( x + width > m_width ) width = m_width - x; if( y + height > m_height ) height = m_height - y; // Refresh the window... but do not paint on a visible video control! if( !m_pVideoControl || !m_pVideoControl->isVisible() ) { // No video control, we can safely repaint the rectangle pWindow->refresh( x, y, width, height ); } else { // Bad luck, there is a video control somewhere (not necessarily // in the repainting zone, btw). // We will divide the repainting into 4 regions (top, left, bottom // and right). The overlapping parts (i.e. the corners) of these // regions will be painted twice, because otherwise the algorithm // becomes a real mess :) // Use short variable names for convenience int xx = m_pVideoControl->getPosition()->getLeft(); int yy = m_pVideoControl->getPosition()->getTop(); int ww = m_pVideoControl->getPosition()->getWidth(); int hh = m_pVideoControl->getPosition()->getHeight(); // Top part: if( y < yy ) pWindow->refresh( x, y, width, yy - y ); // Left part: if( x < xx ) pWindow->refresh( x, y, xx - x, height ); // Bottom part if( y + height > yy + hh ) pWindow->refresh( x, yy + hh, width, y + height - (yy + hh) ); // Right part if( x + width > xx + ww ) pWindow->refresh( xx + ww, y, x + width - (xx + ww), height ); } } }