Multiple Tiles Managers per Page

It's straighforward implementation. Every single place, where there were call for (or with) TilesManager, now has a DocumentObserver as companion. The m_tiledManager reference in PagePrivate was changed to QMap<DocumentObserver, TilesManager>.

REVIEW: 113986
remotes/origin/KDE/4.13
Michal Humpula 12 years ago committed by Albert Astals Cid
parent 41d55ee477
commit c07ee043a3
  1. 1
      active/components/documentitem.cpp
  2. 152
      core/document.cpp
  3. 1
      core/document.h
  4. 3
      core/document_p.h
  5. 6
      core/generator.cpp
  6. 2
      core/generator_p.h
  7. 54
      core/page.cpp
  8. 9
      core/page.h
  9. 12
      core/page_p.h
  10. 2
      part.cpp
  11. 6
      ui/pagepainter.cpp
  12. 6
      ui/pageview.cpp

@ -207,7 +207,6 @@ Observer *DocumentItem::pageviewObserver()
{ {
if (!m_pageviewObserver) { if (!m_pageviewObserver) {
m_pageviewObserver = new Observer(this); m_pageviewObserver = new Observer(this);
m_document->d->m_tiledObserver = m_pageviewObserver;
} }
return m_pageviewObserver; return m_pageviewObserver;

@ -339,52 +339,59 @@ void DocumentPrivate::cleanupPixmapMemory()
void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree ) void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree )
{ {
if ( memoryToFree > 0 ) if ( memoryToFree < 1 )
{ return;
const int currentViewportPage = (*m_viewportIterator).pageNumber;
// Create a QMap of visible rects, indexed by page number const int currentViewportPage = (*m_viewportIterator).pageNumber;
QMap< int, VisiblePageRect * > visibleRects;
QVector< Okular::VisiblePageRect * >::const_iterator vIt = m_pageRects.constBegin(), vEnd = m_pageRects.constEnd();
for ( ; vIt != vEnd; ++vIt )
visibleRects.insert( (*vIt)->pageNumber, (*vIt) );
// Free memory starting from pages that are farthest from the current one // Create a QMap of visible rects, indexed by page number
int pagesFreed = 0; QMap< int, VisiblePageRect * > visibleRects;
while ( memoryToFree > 0 ) QVector< Okular::VisiblePageRect * >::const_iterator vIt = m_pageRects.constBegin(), vEnd = m_pageRects.constEnd();
{ for ( ; vIt != vEnd; ++vIt )
AllocatedPixmap * p = searchLowestPriorityPixmap( true, true ); visibleRects.insert( (*vIt)->pageNumber, (*vIt) );
if ( !p ) // No pixmap to remove
break;
kDebug().nospace() << "Evicting cache pixmap observer=" << p->observer << " page=" << p->page; // Free memory starting from pages that are farthest from the current one
int pagesFreed = 0;
while ( memoryToFree > 0 )
{
AllocatedPixmap * p = searchLowestPriorityPixmap( true, true );
if ( !p ) // No pixmap to remove
break;
// m_allocatedPixmapsTotalMemory can't underflow because we always add or remove kDebug().nospace() << "Evicting cache pixmap observer=" << p->observer << " page=" << p->page;
// the memory used by the AllocatedPixmap so at most it can reach zero
m_allocatedPixmapsTotalMemory -= p->memory; // m_allocatedPixmapsTotalMemory can't underflow because we always add or remove
// Make sure memoryToFree does not underflow // the memory used by the AllocatedPixmap so at most it can reach zero
if ( p->memory > memoryToFree ) m_allocatedPixmapsTotalMemory -= p->memory;
memoryToFree = 0; // Make sure memoryToFree does not underflow
else if ( p->memory > memoryToFree )
memoryToFree -= p->memory; memoryToFree = 0;
pagesFreed++; else
// delete pixmap memoryToFree -= p->memory;
m_pagesVector.at( p->page )->deletePixmap( p->observer ); pagesFreed++;
// delete allocation descriptor // delete pixmap
delete p; m_pagesVector.at( p->page )->deletePixmap( p->observer );
} // delete allocation descriptor
delete p;
}
// If we're still on low memory, try to free individual tiles // If we're still on low memory, try to free individual tiles
// Store pages that weren't completely removed // Store pages that weren't completely removed
QLinkedList< AllocatedPixmap * > pixmapsToKeep;
while ( memoryToFree > 0 ) QLinkedList< AllocatedPixmap * > pixmapsToKeep;
while (memoryToFree > 0)
{
int clean_hits = 0;
foreach (DocumentObserver *observer, m_observers)
{ {
AllocatedPixmap * p = searchLowestPriorityPixmap( false, true, m_tiledObserver ); AllocatedPixmap * p = searchLowestPriorityPixmap( false, true, observer );
if ( !p ) // No pixmap to remove if ( !p ) // No pixmap to remove
break; continue;
TilesManager *tilesManager = m_pagesVector.at( p->page )->d->tilesManager(); clean_hits++;
TilesManager *tilesManager = m_pagesVector.at( p->page )->d->tilesManager( observer );
if ( tilesManager && tilesManager->totalMemory() > 0 ) if ( tilesManager && tilesManager->totalMemory() > 0 )
{ {
qulonglong memoryDiff = p->memory; qulonglong memoryDiff = p->memory;
@ -409,9 +416,11 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree )
pixmapsToKeep.append( p ); pixmapsToKeep.append( p );
} }
m_allocatedPixmaps += pixmapsToKeep; if (clean_hits == 0) break;
//p--rintf("freeMemory A:[%d -%d = %d] \n", m_allocatedPixmaps.count() + pagesFreed, pagesFreed, m_allocatedPixmaps.count() );
} }
m_allocatedPixmaps += pixmapsToKeep;
//p--rintf("freeMemory A:[%d -%d = %d] \n", m_allocatedPixmaps.count() + pagesFreed, pagesFreed, m_allocatedPixmaps.count() );
} }
/* Returns the next pixmap to evict from cache, or NULL if no suitable pixmap /* Returns the next pixmap to evict from cache, or NULL if no suitable pixmap
@ -1321,7 +1330,7 @@ void DocumentPrivate::sendGeneratorPixmapRequest()
} }
QRect requestRect = r->isTile() ? r->normalizedRect().geometry( r->width(), r->height() ) : QRect( 0, 0, r->width(), r->height() ); QRect requestRect = r->isTile() ? r->normalizedRect().geometry( r->width(), r->height() ) : QRect( 0, 0, r->width(), r->height() );
TilesManager *tilesManager = ( r->observer() == m_tiledObserver ) ? r->page()->d->tilesManager() : 0; TilesManager *tilesManager = r->d->tilesManager();
// If it's a preload but the generator is not threaded no point in trying to preload // If it's a preload but the generator is not threaded no point in trying to preload
if ( r->preload() && !m_generator->hasFeature( Generator::Threaded ) ) if ( r->preload() && !m_generator->hasFeature( Generator::Threaded ) )
@ -1349,7 +1358,7 @@ void DocumentPrivate::sendGeneratorPixmapRequest()
delete r; delete r;
} }
// If the requested area is above 8000000 pixels, switch on the tile manager // If the requested area is above 8000000 pixels, switch on the tile manager
else if ( !tilesManager && r->observer() == m_tiledObserver && m_generator->hasFeature( Generator::TiledRendering ) && (long)r->width() * (long)r->height() > 8000000L ) else if ( !tilesManager && m_generator->hasFeature( Generator::TiledRendering ) && (long)r->width() * (long)r->height() > 8000000L )
{ {
// if the image is too big. start using tiles // if the image is too big. start using tiles
kDebug(OkularDebug).nospace() << "Start using tiles on page " << r->pageNumber() kDebug(OkularDebug).nospace() << "Start using tiles on page " << r->pageNumber()
@ -1370,7 +1379,7 @@ void DocumentPrivate::sendGeneratorPixmapRequest()
} }
tilesManager->setRequest( r->normalizedRect(), r->width(), r->height() ); tilesManager->setRequest( r->normalizedRect(), r->width(), r->height() );
r->page()->deletePixmap( r->observer() ); r->page()->deletePixmap( r->observer() );
r->page()->d->setTilesManager( tilesManager ); r->page()->d->setTilesManager( r->observer(), tilesManager );
r->setTile( true ); r->setTile( true );
// Change normalizedRect to the smallest rect that contains all // Change normalizedRect to the smallest rect that contains all
@ -1443,7 +1452,7 @@ void DocumentPrivate::sendGeneratorPixmapRequest()
// [MEM] preventive memory freeing // [MEM] preventive memory freeing
qulonglong pixmapBytes = 0; qulonglong pixmapBytes = 0;
TilesManager * tm = ( request->observer() == m_tiledObserver ) ? request->page()->d->tilesManager() : 0; TilesManager * tm = request->d->tilesManager();
if ( tm ) if ( tm )
pixmapBytes = tm->totalMemory(); pixmapBytes = tm->totalMemory();
else else
@ -1571,39 +1580,43 @@ void DocumentPrivate::refreshPixmaps( int pageNumber )
requestedPixmaps.push_back( p ); requestedPixmaps.push_back( p );
} }
TilesManager *tilesManager = page->d->tilesManager(); foreach (DocumentObserver *observer, m_observers)
if ( tilesManager )
{ {
tilesManager->markDirty(); TilesManager *tilesManager = page->d->tilesManager( observer );
if ( tilesManager )
{
tilesManager->markDirty();
PixmapRequest * p = new PixmapRequest( m_tiledObserver, pageNumber, tilesManager->width(), tilesManager->height(), 1, PixmapRequest::Asynchronous ); PixmapRequest * p = new PixmapRequest( observer, pageNumber, tilesManager->width(), tilesManager->height(), 1, PixmapRequest::Asynchronous );
NormalizedRect tilesRect; NormalizedRect tilesRect;
// Get the visible page rect // Get the visible page rect
NormalizedRect visibleRect; NormalizedRect visibleRect;
QVector< Okular::VisiblePageRect * >::const_iterator vIt = m_pageRects.constBegin(), vEnd = m_pageRects.constEnd(); QVector< Okular::VisiblePageRect * >::const_iterator vIt = m_pageRects.constBegin(), vEnd = m_pageRects.constEnd();
for ( ; vIt != vEnd; ++vIt ) for ( ; vIt != vEnd; ++vIt )
{
if ( (*vIt)->pageNumber == pageNumber )
{ {
visibleRect = (*vIt)->rect; if ( (*vIt)->pageNumber == pageNumber )
break; {
visibleRect = (*vIt)->rect;
break;
}
} }
}
if ( !visibleRect.isNull() ) if ( !visibleRect.isNull() )
{ {
p->setNormalizedRect( visibleRect ); p->setNormalizedRect( visibleRect );
p->setTile( true ); p->setTile( true );
p->d->mForce = true; p->d->mForce = true;
requestedPixmaps.push_back( p ); requestedPixmaps.push_back( p );
} }
else else
{ {
delete p; delete p;
}
} }
} }
if ( !requestedPixmaps.isEmpty() ) if ( !requestedPixmaps.isEmpty() )
m_parent->requestPixmaps( requestedPixmaps, Okular::Document::NoOption ); m_parent->requestPixmaps( requestedPixmaps, Okular::Document::NoOption );
} }
@ -2045,7 +2058,6 @@ Document::Document( QWidget *widget )
d->m_bookmarkManager = new BookmarkManager( d ); d->m_bookmarkManager = new BookmarkManager( d );
d->m_viewportIterator = d->m_viewportHistory.insert( d->m_viewportHistory.end(), DocumentViewport() ); d->m_viewportIterator = d->m_viewportHistory.insert( d->m_viewportHistory.end(), DocumentViewport() );
d->m_undoStack = new QUndoStack(this); d->m_undoStack = new QUndoStack(this);
d->m_tiledObserver = 0;
connect( SettingsCore::self(), SIGNAL(configChanged()), this, SLOT(_o_configChanged()) ); connect( SettingsCore::self(), SIGNAL(configChanged()), this, SLOT(_o_configChanged()) );
connect( d->m_undoStack, SIGNAL( canUndoChanged(bool) ), this, SIGNAL( canUndoChanged(bool))); connect( d->m_undoStack, SIGNAL( canUndoChanged(bool) ), this, SIGNAL( canUndoChanged(bool)));
@ -2888,7 +2900,7 @@ void Document::requestPixmaps( const QLinkedList< PixmapRequest * > & requests,
// Change the current request rect so that only invalid tiles are // Change the current request rect so that only invalid tiles are
// requested. Also make sure the rect is tile-aligned. // requested. Also make sure the rect is tile-aligned.
NormalizedRect tilesRect; NormalizedRect tilesRect;
const QList<Tile> tiles = request->page()->d->tilesManager()->tilesAt( request->normalizedRect(), TilesManager::TerminalTile ); const QList<Tile> tiles = request->d->tilesManager()->tilesAt( request->normalizedRect(), TilesManager::TerminalTile );
QList<Tile>::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd(); QList<Tile>::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd();
while ( tIt != tEnd ) while ( tIt != tEnd )
{ {
@ -4371,7 +4383,7 @@ void DocumentPrivate::requestDone( PixmapRequest * req )
{ {
// [MEM] 1.2 append memory allocation descriptor to the FIFO // [MEM] 1.2 append memory allocation descriptor to the FIFO
qulonglong memoryBytes = 0; qulonglong memoryBytes = 0;
const TilesManager *tm = ( req->observer() == m_tiledObserver ) ? req->page()->d->tilesManager() : 0; const TilesManager *tm = req->d->tilesManager();
if ( tm ) if ( tm )
memoryBytes = tm->totalMemory(); memoryBytes = tm->totalMemory();
else else

@ -964,7 +964,6 @@ class OKULAR_EXPORT Document : public QObject
private: private:
/// @cond PRIVATE /// @cond PRIVATE
friend class DocumentPrivate; friend class DocumentPrivate;
friend class Part;
friend class ::DocumentItem; friend class ::DocumentItem;
friend class EditAnnotationContentsCommand; friend class EditAnnotationContentsCommand;
friend class EditFormTextCommand; friend class EditFormTextCommand;

@ -216,9 +216,6 @@ class DocumentPrivate
// observers / requests / allocator stuff // observers / requests / allocator stuff
QSet< DocumentObserver * > m_observers; QSet< DocumentObserver * > m_observers;
// FIXME This is a hack, we need to support
// multiple tiled observers, but for the moment we only support one
DocumentObserver *m_tiledObserver;
QLinkedList< PixmapRequest * > m_pixmapRequestsStack; QLinkedList< PixmapRequest * > m_pixmapRequestsStack;
QLinkedList< PixmapRequest * > m_executingPixmapRequests; QLinkedList< PixmapRequest * > m_executingPixmapRequests;
QMutex m_pixmapRequestsMutex; QMutex m_pixmapRequestsMutex;

@ -22,6 +22,7 @@
#include "document.h" #include "document.h"
#include "document_p.h" #include "document_p.h"
#include "page.h" #include "page.h"
#include "page_p.h"
#include "textpage.h" #include "textpage.h"
#include "utils.h" #include "utils.h"
@ -517,6 +518,11 @@ const NormalizedRect& PixmapRequest::normalizedRect() const
return d->mNormalizedRect; return d->mNormalizedRect;
} }
Okular::TilesManager* PixmapRequestPrivate::tilesManager() const
{
return mPage->d->tilesManager(mObserver);
}
void PixmapRequestPrivate::swap() void PixmapRequestPrivate::swap()
{ {
qSwap( mWidth, mHeight ); qSwap( mWidth, mHeight );

@ -30,6 +30,7 @@ class PixmapGenerationThread;
class PixmapRequest; class PixmapRequest;
class TextPage; class TextPage;
class TextPageGenerationThread; class TextPageGenerationThread;
class TilesManager;
class GeneratorPrivate class GeneratorPrivate
{ {
@ -72,6 +73,7 @@ class PixmapRequestPrivate
{ {
public: public:
void swap(); void swap();
TilesManager *tilesManager() const;
DocumentObserver *mObserver; DocumentObserver *mObserver;
int mPageNumber; int mPageNumber;

@ -66,7 +66,7 @@ static void deleteObjectRects( QLinkedList< ObjectRect * >& rects, const QSet<Ob
} }
PagePrivate::PagePrivate( Page *page, uint n, double w, double h, Rotation o ) PagePrivate::PagePrivate( Page *page, uint n, double w, double h, Rotation o )
: m_tilesManager( 0 ), m_page( page ), m_number( n ), m_orientation( o ), : m_page( page ), m_number( n ), m_orientation( o ),
m_width( w ), m_height( h ), m_doc( 0 ), m_boundingBox( 0, 0, 1, 1 ), m_width( w ), m_height( h ), m_doc( 0 ), m_boundingBox( 0, 0, 1, 1 ),
m_rotation( Rotation0 ), m_rotation( Rotation0 ),
m_text( 0 ), m_transition( 0 ), m_textSelections( 0 ), m_text( 0 ), m_transition( 0 ), m_textSelections( 0 ),
@ -93,7 +93,7 @@ PagePrivate::~PagePrivate()
void PagePrivate::imageRotationDone( RotationJob * job ) void PagePrivate::imageRotationDone( RotationJob * job )
{ {
TilesManager *tm = ( job->observer() == m_doc->m_tiledObserver ) ? m_tilesManager : 0; TilesManager *tm = tilesManager( job->observer() );
if ( tm ) if ( tm )
{ {
QPixmap *pixmap = new QPixmap( QPixmap::fromImage( job->image() ) ); QPixmap *pixmap = new QPixmap( QPixmap::fromImage( job->image() ) );
@ -201,7 +201,7 @@ void Page::setBoundingBox( const NormalizedRect& bbox )
bool Page::hasPixmap( DocumentObserver *observer, int width, int height, const NormalizedRect &rect ) const bool Page::hasPixmap( DocumentObserver *observer, int width, int height, const NormalizedRect &rect ) const
{ {
TilesManager *tm = ( observer == d->m_doc->m_tiledObserver ) ? d->m_tilesManager : 0; TilesManager *tm = d->tilesManager( observer );
if ( tm ) if ( tm )
{ {
if ( width != tm->width() || height != tm->height() ) if ( width != tm->width() || height != tm->height() )
@ -379,8 +379,14 @@ void PagePrivate::rotateAt( Rotation orientation )
/** /**
* Rotate tiles manager * Rotate tiles manager
*/ */
if ( m_tilesManager ) QMapIterator<const DocumentObserver *, TilesManager *> i(m_tilesManagers);
m_tilesManager->setRotation( m_rotation ); while (i.hasNext()) {
i.next();
TilesManager *tm = i.value();
if ( tm )
tm->setRotation( m_rotation );
}
/** /**
* Rotate the object rects on the page. * Rotate the object rects on the page.
@ -501,7 +507,7 @@ QLinkedList< FormField * > Page::formFields() const
void Page::setPixmap( DocumentObserver *observer, QPixmap *pixmap, const NormalizedRect &rect ) void Page::setPixmap( DocumentObserver *observer, QPixmap *pixmap, const NormalizedRect &rect )
{ {
if ( d->m_rotation == Rotation0 ) { if ( d->m_rotation == Rotation0 ) {
TilesManager *tm = ( observer == d->m_doc->m_tiledObserver ) ? d->m_tilesManager : 0; TilesManager *tm = d->tilesManager( observer );
if ( tm ) if ( tm )
{ {
tm->setPixmap( pixmap, rect ); tm->setPixmap( pixmap, rect );
@ -705,10 +711,11 @@ void Page::setFormFields( const QLinkedList< FormField * >& fields )
void Page::deletePixmap( DocumentObserver *observer ) void Page::deletePixmap( DocumentObserver *observer )
{ {
if ( observer == d->m_doc->m_tiledObserver && d->m_tilesManager ) TilesManager *tm = d->tilesManager( observer );
if ( tm )
{ {
delete d->m_tilesManager; delete tm;
d->m_tilesManager = 0; d->m_tilesManagers.remove(observer);
} }
else else
{ {
@ -726,8 +733,9 @@ void Page::deletePixmaps()
} }
d->m_pixmaps.clear(); d->m_pixmaps.clear();
delete d->m_tilesManager;
d->m_tilesManager = 0; qDeleteAll(d->m_tilesManagers);
d->m_tilesManagers.clear();
} }
void Page::deleteRects() void Page::deleteRects()
@ -982,27 +990,29 @@ const QPixmap * Page::_o_nearestPixmap( DocumentObserver *observer, int w, int h
return pixmap; return pixmap;
} }
bool Page::hasTilesManager() const bool Page::hasTilesManager( const DocumentObserver *observer ) const
{ {
return d->m_tilesManager != 0; return d->tilesManager( observer ) != 0;
} }
QList<Tile> Page::tilesAt( const NormalizedRect &rect ) const QList<Tile> Page::tilesAt( const DocumentObserver *observer, const NormalizedRect &rect ) const
{ {
if ( d->m_tilesManager ) TilesManager *tm = d->m_tilesManagers.value( observer );
return d->m_tilesManager->tilesAt( rect, TilesManager::PixmapTile ); if ( tm )
return tm->tilesAt( rect, TilesManager::PixmapTile );
else else
return QList<Tile>(); return QList<Tile>();
} }
TilesManager *PagePrivate::tilesManager() const TilesManager *PagePrivate::tilesManager( const DocumentObserver *observer ) const
{ {
return m_tilesManager; return m_tilesManagers.value( observer );
} }
void PagePrivate::setTilesManager( TilesManager *tm ) void PagePrivate::setTilesManager( const DocumentObserver *observer, TilesManager *tm )
{ {
delete m_tilesManager; TilesManager *old = m_tilesManagers.value( observer );
m_tilesManager = tm; delete old;
}
m_tilesManagers.insert(observer, tm);
}

@ -372,18 +372,18 @@ class OKULAR_EXPORT Page
* Returns whether pixmaps for the tiled observer are handled by a * Returns whether pixmaps for the tiled observer are handled by a
* tile manager. * tile manager.
* *
* @since 0.16 (KDE 4.10) * @since 0.19 (KDE 4.13)
*/ */
bool hasTilesManager() const; bool hasTilesManager( const DocumentObserver *observer ) const;
/** /**
* Returns a list of all tiles intersecting with @p rect. * Returns a list of all tiles intersecting with @p rect.
* *
* The list contains only tiles with a pixmap * The list contains only tiles with a pixmap
* *
* @since 0.16 (KDE 4.10) * @since 0.19 (KDE 4.13)
*/ */
QList<Tile> tilesAt( const NormalizedRect &rect ) const; QList<Tile> tilesAt( const DocumentObserver *observer, const NormalizedRect &rect ) const;
private: private:
PagePrivate* const d; PagePrivate* const d;
@ -391,6 +391,7 @@ class OKULAR_EXPORT Page
friend class PagePrivate; friend class PagePrivate;
friend class Document; friend class Document;
friend class DocumentPrivate; friend class DocumentPrivate;
friend class PixmapRequestPrivate;
/** /**
* To improve performance PagePainter accesses the following * To improve performance PagePainter accesses the following

@ -105,10 +105,14 @@ class PagePrivate
void deleteTextSelections(); void deleteTextSelections();
/** /**
* Get/set the tiles manager for the tiled observer * Get the tiles manager for the tiled @observer
*/ */
TilesManager *tilesManager() const; TilesManager *tilesManager( const DocumentObserver *observer ) const;
void setTilesManager( TilesManager *tm );
/**
* Set the tiles manager for the tiled @observer
*/
void setTilesManager( const DocumentObserver *observer, TilesManager *tm );
class PixmapObject class PixmapObject
{ {
@ -117,7 +121,7 @@ class PagePrivate
Rotation m_rotation; Rotation m_rotation;
}; };
QMap< DocumentObserver*, PixmapObject > m_pixmaps; QMap< DocumentObserver*, PixmapObject > m_pixmaps;
TilesManager* m_tilesManager; QMap< const DocumentObserver*, TilesManager *> m_tilesManagers;
Page *m_page; Page *m_page;
int m_number; int m_number;

@ -89,7 +89,6 @@
#include "core/annotations.h" #include "core/annotations.h"
#include "core/bookmarkmanager.h" #include "core/bookmarkmanager.h"
#include "core/document.h" #include "core/document.h"
#include "core/document_p.h"
#include "core/generator.h" #include "core/generator.h"
#include "core/page.h" #include "core/page.h"
#include "core/fileprinter.h" #include "core/fileprinter.h"
@ -432,7 +431,6 @@ m_cliPresentation(false), m_cliPrint(false), m_embedMode(detectEmbedMode(parentW
m_formsMessage = new PageViewTopMessage( rightContainer ); m_formsMessage = new PageViewTopMessage( rightContainer );
rightLayout->addWidget( m_formsMessage ); rightLayout->addWidget( m_formsMessage );
m_pageView = new PageView( rightContainer, m_document ); m_pageView = new PageView( rightContainer, m_document );
m_document->d->m_tiledObserver = m_pageView;
QMetaObject::invokeMethod( m_pageView, "setFocus", Qt::QueuedConnection ); //usability setting QMetaObject::invokeMethod( m_pageView, "setFocus", Qt::QueuedConnection ); //usability setting
// m_splitter->setFocusProxy(m_pageView); // m_splitter->setFocusProxy(m_pageView);
connect( m_pageView, SIGNAL(urlDropped(KUrl)), SLOT(openUrlFromDocument(KUrl))); connect( m_pageView, SIGNAL(urlDropped(KUrl)), SLOT(openUrlFromDocument(KUrl)));

@ -89,7 +89,7 @@ void PagePainter::paintCroppedPageOnPainter( QPainter * destPainter, const Okula
} }
destPainter->fillRect( limits, backgroundColor ); destPainter->fillRect( limits, backgroundColor );
const bool hasTilesManager = ( page->d->m_doc->m_tiledObserver == observer && page->hasTilesManager() ); const bool hasTilesManager = page->hasTilesManager( observer );
const QPixmap *pixmap = 0; const QPixmap *pixmap = 0;
if ( !hasTilesManager ) if ( !hasTilesManager )
@ -246,7 +246,7 @@ void PagePainter::paintCroppedPageOnPainter( QPainter * destPainter, const Okula
if ( hasTilesManager ) if ( hasTilesManager )
{ {
const Okular::NormalizedRect normalizedLimits( limitsInPixmap, scaledWidth, scaledHeight ); const Okular::NormalizedRect normalizedLimits( limitsInPixmap, scaledWidth, scaledHeight );
const QList<Okular::Tile> tiles = page->tilesAt( normalizedLimits ); const QList<Okular::Tile> tiles = page->tilesAt( observer, normalizedLimits );
QList<Okular::Tile>::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd(); QList<Okular::Tile>::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd();
while ( tIt != tEnd ) while ( tIt != tEnd )
{ {
@ -301,7 +301,7 @@ void PagePainter::paintCroppedPageOnPainter( QPainter * destPainter, const Okula
backImage.fill( paperColor.rgb() ); backImage.fill( paperColor.rgb() );
QPainter p( &backImage ); QPainter p( &backImage );
const Okular::NormalizedRect normalizedLimits( limitsInPixmap, scaledWidth, scaledHeight ); const Okular::NormalizedRect normalizedLimits( limitsInPixmap, scaledWidth, scaledHeight );
const QList<Okular::Tile> tiles = page->tilesAt( normalizedLimits ); const QList<Okular::Tile> tiles = page->tilesAt( observer, normalizedLimits );
QList<Okular::Tile>::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd(); QList<Okular::Tile>::const_iterator tIt = tiles.constBegin(), tEnd = tiles.constEnd();
while ( tIt != tEnd ) while ( tIt != tEnd )
{ {

@ -4147,7 +4147,7 @@ static void slotRequestPreloadPixmap( Okular::DocumentObserver * observer, const
{ {
Okular::PixmapRequest::PixmapRequestFeatures requestFeatures = Okular::PixmapRequest::Preload; Okular::PixmapRequest::PixmapRequestFeatures requestFeatures = Okular::PixmapRequest::Preload;
requestFeatures |= Okular::PixmapRequest::Asynchronous; requestFeatures |= Okular::PixmapRequest::Asynchronous;
const bool pageHasTilesManager = i->page()->hasTilesManager(); const bool pageHasTilesManager = i->page()->hasTilesManager( observer );
if ( pageHasTilesManager && !preRenderRegion.isNull() ) if ( pageHasTilesManager && !preRenderRegion.isNull() )
{ {
Okular::PixmapRequest * p = new Okular::PixmapRequest( observer, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, requestFeatures ); Okular::PixmapRequest * p = new Okular::PixmapRequest( observer, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, requestFeatures );
@ -4240,7 +4240,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue )
#endif #endif
Okular::NormalizedRect expandedVisibleRect = vItem->rect; Okular::NormalizedRect expandedVisibleRect = vItem->rect;
if ( i->page()->hasTilesManager() && Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low ) if ( i->page()->hasTilesManager( this ) && Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low )
{ {
double rectMargin = pixelsToExpand/(double)i->uncroppedHeight(); double rectMargin = pixelsToExpand/(double)i->uncroppedHeight();
expandedVisibleRect.left = qMax( 0.0, vItem->rect.left - rectMargin ); expandedVisibleRect.left = qMax( 0.0, vItem->rect.left - rectMargin );
@ -4258,7 +4258,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue )
Okular::PixmapRequest * p = new Okular::PixmapRequest( this, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRIO, Okular::PixmapRequest::Asynchronous ); Okular::PixmapRequest * p = new Okular::PixmapRequest( this, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRIO, Okular::PixmapRequest::Asynchronous );
requestedPixmaps.push_back( p ); requestedPixmaps.push_back( p );
if ( i->page()->hasTilesManager() ) if ( i->page()->hasTilesManager( this ) )
{ {
p->setNormalizedRect( expandedVisibleRect ); p->setNormalizedRect( expandedVisibleRect );
p->setTile( true ); p->setTile( true );

Loading…
Cancel
Save