From bdbd03f5c9dc9637feffbb250cec6e1a656d8d81 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 8 Nov 2012 19:21:09 +0100 Subject: [PATCH] Misc minor changes in DocumentPrivate::cleanupPixmapMemory 1) Fixed underflow when memoryDiff > memoryToFree 2) Use current viewport's page number instead of any visible page as page from which distances are calculated 3) Renamed currentVieport to visibleRect, because the currentVieport is a different thing --- core/document.cpp | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 1e1cf249d..a4b877f35 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -227,15 +227,13 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree ) { if ( memoryToFree > 0 ) { - // Number of one of the visible pages (to be used by tiles cleanup) - int visiblePageNumber = -1; + const int currentViewportPage = (*m_viewportIterator).pageNumber; + + // Create a QMap of visible rects, indexed by page number QMap< int, VisiblePageRect * > visibleRects; QVector< Okular::VisiblePageRect * >::const_iterator vIt = m_pageRects.constBegin(), vEnd = m_pageRects.constEnd(); for ( ; vIt != vEnd; ++vIt ) - { - visiblePageNumber = (*vIt)->pageNumber; visibleRects.insert( (*vIt)->pageNumber, (*vIt) ); - } // Free memory starting from pages that are farthest from the current one int pagesFreed = 0; @@ -262,8 +260,7 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree ) delete p; } - // If we're still on low memory, try to free individual tiles based on - // a ranking algorithm + // If we're still on low memory, try to free individual tiles // Store pages that weren't completely removed QLinkedList< AllocatedPixmap * > pixmapsToKeep; @@ -276,17 +273,17 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree ) TilesManager *tilesManager = m_pagesVector.at( p->page )->tilesManager( p->id ); if ( tilesManager && tilesManager->totalMemory() > 0 ) { - int memoryDiff = p->memory; - NormalizedRect currentViewport; + qulonglong memoryDiff = p->memory; + NormalizedRect visibleRect; if ( visibleRects.contains( p->page ) ) - currentViewport = visibleRects[ p->page ]->rect; + visibleRect = visibleRects[ p->page ]->rect; - // Cleanup non visible tiles based on its dirty state and distance from the viewport - tilesManager->cleanupPixmapMemory( memoryToFree, currentViewport, visiblePageNumber ); + // Free non visible tiles + tilesManager->cleanupPixmapMemory( memoryToFree, visibleRect, currentViewportPage ); p->memory = tilesManager->totalMemory(); memoryDiff -= p->memory; - memoryToFree = memoryToFree - memoryDiff; + memoryToFree = (memoryDiff < memoryToFree) ? (memoryToFree - memoryDiff) : 0; m_allocatedPixmapsTotalMemory -= memoryDiff; if ( p->memory > 0 )