diff --git a/ui/pageview.cpp b/ui/pageview.cpp index d061a9d81..e99760519 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -3927,6 +3927,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) const QRect viewportRectAtZeroZero( 0, 0, viewport()->width(), viewport()->height() ); // some variables used to determine the viewport + Okular::NormalizedRect visibleRect; int nearPageNumber = -1; const double viewportCenterX = (viewportRect.left() + viewportRect.right()) / 2.0; const double viewportCenterY = (viewportRect.top() + viewportRect.bottom()) / 2.0; @@ -3981,9 +3982,20 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) kWarning() << "checking for pixmap for page" << i->pageNumber() << "=" << i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight() ); kWarning() << "checking for text for page" << i->pageNumber() << "=" << i->page()->hasTextPage(); #endif + + visibleRect = vItem->rect; + Okular::NormalizedRect expandedVisibleRect = vItem->rect; + if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low ) + { + int value = 512; + double rectMargin = value/(double)i->uncroppedHeight(); + expandedVisibleRect.top = qMax( 0.0, expandedVisibleRect.top - rectMargin ); + expandedVisibleRect.bottom = qMin( 1.0, expandedVisibleRect.bottom + rectMargin ); + } + // if the item has not the right pixmap, add a request for it // TODO: We presently request a pixmap for the full page, and then render just the crop part. This waste memory and cycles. - if ( !i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight(), vItem->rect ) ) + if ( !i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight(), expandedVisibleRect ) ) { #ifdef PAGEVIEW_DEBUG kWarning() << "rerequesting visible pixmaps for page" << i->pageNumber() << "!"; @@ -3996,7 +4008,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) if ( tilesManager ) { Okular::NormalizedRect tilesRect; - QList tiles = i->page()->tilesManager( PAGEVIEW_ID )->tilesAt( vItem->rect ); + QList tiles = i->page()->tilesManager( PAGEVIEW_ID )->tilesAt( expandedVisibleRect ); QList::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd(); while ( tIt != tEnd ) { @@ -4054,13 +4066,50 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) { // add the page after the 'visible series' in preload int tailRequest = d->visibleItems.last()->pageNumber() + j; + if ( tailRequest < (int)d->items.count() ) { PageViewItem * i = d->items[ tailRequest ]; + Okular::TilesManager *tilesManager = i->page()->tilesManager( PAGEVIEW_ID ); + Okular::NormalizedRect preRenderRegion; + if ( tilesManager && !visibleRect.isNull() ) + { + int value = 512; + double rectMargin = value/(double)i->uncroppedHeight(); + preRenderRegion.left = visibleRect.left; + preRenderRegion.top = 0.0; + preRenderRegion.right = visibleRect.right; + preRenderRegion.bottom = qMin( 1.0, rectMargin ); + } + // request the pixmap if not already present - if ( !i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight() ) && i->uncroppedWidth() > 0 ) - requestedPixmaps.push_back( new Okular::PixmapRequest( - PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ) ); + if ( !i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight(), preRenderRegion ) && i->uncroppedWidth() > 0 ) + { + Okular::PixmapRequest * p = new Okular::PixmapRequest( PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ); + requestedPixmaps.push_back( p ); + + if ( tilesManager && !preRenderRegion.isNull() ) + { + Okular::NormalizedRect tilesRect; + QList tiles = tilesManager->tilesAt( preRenderRegion ); + QList::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd(); + while ( tIt != tEnd ) + { + Okular::Tile tile = *tIt; + if ( !tile.isValid() ) + { + if ( tilesRect.isNull() ) + tilesRect = tile.rect; + else + tilesRect |= tile.rect; + } + + tIt++; + } + + p->setNormalizedRect( tilesRect ); + } + } } } @@ -4071,10 +4120,46 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) if ( headRequest >= 0 ) { PageViewItem * i = d->items[ headRequest ]; + Okular::TilesManager *tilesManager = i->page()->tilesManager( PAGEVIEW_ID ); + Okular::NormalizedRect preRenderRegion; + if ( tilesManager && !visibleRect.isNull() ) + { + int value = 512; + double rectMargin = value/(double)i->uncroppedHeight(); + preRenderRegion.left = visibleRect.left; + preRenderRegion.top = qMax( 0.0, 1.0 - rectMargin ); + preRenderRegion.right = visibleRect.right; + preRenderRegion.bottom = 1.0; + } + // request the pixmap if not already present - if ( !i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight() ) && i->uncroppedWidth() > 0 ) - requestedPixmaps.push_back( new Okular::PixmapRequest( - PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ) ); + if ( !i->page()->hasPixmap( PAGEVIEW_ID, i->uncroppedWidth(), i->uncroppedHeight(), preRenderRegion ) && i->uncroppedWidth() > 0 ) + { + Okular::PixmapRequest * p = new Okular::PixmapRequest( PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ); + requestedPixmaps.push_back( p ); + + if ( tilesManager && !preRenderRegion.isNull() ) + { + Okular::NormalizedRect tilesRect; + QList tiles = tilesManager->tilesAt( preRenderRegion ); + QList::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd(); + while ( tIt != tEnd ) + { + Okular::Tile tile = *tIt; + if ( !tile.isValid() ) + { + if ( tilesRect.isNull() ) + tilesRect = tile.rect; + else + tilesRect |= tile.rect; + } + + tIt++; + } + + p->setNormalizedRect( tilesRect ); + } + } } } }