bool CCanvas::ApplyRenderers(CCanvasRendererStorage& storage, CCanvas* source, const CCanvas* target, const CRectangle* dstRect, const CRectangle* srcRect) const { if(!source->m_vecRendererVault.empty()) { std::vector<CCanvasRendererStorage::iterator> removeList; CCanvasRendererStorage::iterator end = storage.end(); CRectangle rdstRect; CRectangle rsrcRect; if(dstRect) { rdstRect = CRectangle(*dstRect); } if(srcRect) { rsrcRect = CRectangle(*srcRect); } CCanvasRenderModifierData mdata(&rsrcRect, &rdstRect); for(CCanvasRendererStorage::iterator it = storage.begin(); it < end; ++it) { (*it)(target, const_cast<CCanvas *>(source), mdata); if(mdata.markedForDeletion) { CCanvasRendererStorage::iterator it2 = it; removeList.push_back(it2); } } BOOST_FOREACH(CCanvasRendererStorage::iterator itpos, removeList) { storage.erase(itpos); }
bool CCanvas::ApplyRenderers(CCanvasRendererStorage& storage, CCanvas* source, const CCanvas* target, const CRectangle* dstRect, const CRectangle* srcRect) const { if(!source->m_vecRendererVault.empty()) { std::vector<CCanvasRendererStorage::iterator> removeList; CCanvasRendererStorage::iterator end = storage.end(); CRectangle rdstRect; CRectangle rsrcRect; if(dstRect) { rdstRect = CRectangle(*dstRect); } if(srcRect) { rsrcRect = CRectangle(*srcRect); } CCanvasRenderModifierData mdata(&rsrcRect, &rdstRect); for(CCanvasRendererStorage::iterator it = storage.begin(); it < end; ++it) { (*it)(target, const_cast<CCanvas *>(source), mdata); if(mdata.markedForDeletion) { CCanvasRendererStorage::iterator it2 = it; // it has to be checked, if removing has no side effects. see CSpriteManager::OnIdle // for a solution with "while". //removeList.push_back(it2); removeList.insert(removeList.begin(), it2); } } BOOST_FOREACH(CCanvasRendererStorage::iterator itpos, removeList) { storage.erase(itpos); }