void* BaseEngine::_DrawingThread(void* arg) { BaseEngine* engine =(BaseEngine*)arg; int& pages = engine->fPages; std::vector< std::pair<BBitmap*, bool> >& bitmap = engine->fBitmap; std::vector< pthread_mutex_t >& mutex = engine->fMutex; int upperbound = -1; int lowerbound = -1; int pageFuture = -1; int pagePast = -1; int currentPage = -1; int deleteIndex = 0; bool forwardPriority = true; while(true) { pthread_mutex_lock(&gEngineStopMutex); if (engine->fStopThread) { engine->fStopThread = false; pthread_mutex_unlock(&gEngineStopMutex); return nullptr; } pthread_mutex_unlock(&gEngineStopMutex); if (currentPage != engine->fCurrentPageNo) { if (engine->fCurrentPageNo < currentPage) forwardPriority = false; else forwardPriority = true; deleteIndex = 0; currentPage = engine->fCurrentPageNo; pageFuture = pagePast = currentPage; lowerbound = currentPage - engine->fBackwardCache; upperbound = currentPage + engine->fForwardCache; if (lowerbound < 0) lowerbound = 0; if (upperbound >= pages) upperbound = pages - 1; } else { for (; deleteIndex < pages; ++deleteIndex) { pthread_mutex_lock(&mutex[deleteIndex]); if (bitmap[deleteIndex].first != nullptr && (deleteIndex < lowerbound || deleteIndex > upperbound)) { delete bitmap[deleteIndex].first; bitmap[deleteIndex].first = nullptr; pthread_mutex_unlock(&mutex[deleteIndex]); break; } pthread_mutex_unlock(&mutex[deleteIndex]); } if (forwardPriority) { if (pageFuture < upperbound) { ++pageFuture; pthread_mutex_lock(&mutex[pageFuture]); if (bitmap[pageFuture].first == nullptr) { bitmap[pageFuture] = engine->_RenderBitmap(pageFuture); } else if (bitmap[pageFuture].second == true) { delete bitmap[pageFuture].first; bitmap[pageFuture] = engine->_RenderBitmap(pageFuture); } pthread_mutex_unlock(&mutex[pageFuture]); } else if (pagePast > lowerbound) { --pagePast; pthread_mutex_lock(&mutex[pagePast]); if (bitmap[pagePast].first == nullptr) { bitmap[pagePast] = engine->_RenderBitmap(pagePast); } else if (bitmap[pageFuture].second == true) { delete bitmap[pageFuture].first; bitmap[pageFuture] = engine->_RenderBitmap(pageFuture); } pthread_mutex_unlock(&mutex[pagePast]); } else { usleep(1000); } } else { if (pagePast > lowerbound) { --pagePast; pthread_mutex_lock(&mutex[pagePast]); if (bitmap[pagePast].first == nullptr) bitmap[pagePast] = engine->_RenderBitmap(pagePast); pthread_mutex_unlock(&mutex[pagePast]); } else if (pageFuture < upperbound) { ++pageFuture; pthread_mutex_lock(&mutex[pageFuture]); if (bitmap[pageFuture].first == nullptr) bitmap[pageFuture] = engine->_RenderBitmap(pageFuture); pthread_mutex_unlock(&mutex[pageFuture]); } else { usleep(1000); } } } } return nullptr; }