diff --git a/core/document.cpp b/core/document.cpp index 8ae3a5be1..d7e558530 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include #include @@ -1394,6 +1396,17 @@ void DocumentPrivate::sendGeneratorPixmapRequest() QRect requestRect = r->isTile() ? r->normalizedRect().geometry( r->width(), r->height() ) : QRect( 0, 0, r->width(), r->height() ); TilesManager *tilesManager = r->d->tilesManager(); const double normalizedArea = r->normalizedRect().width() * r->normalizedRect().height(); + const QScreen *screen = nullptr; + if (m_widget) + { + const QWindow *window = m_widget->window()->windowHandle(); + if (window) + screen = window->screen(); + } + if (!screen) + screen = QGuiApplication::primaryScreen(); + const long screenSize = screen->devicePixelRatio() * screen->size().width() + * screen->devicePixelRatio() * screen->size().height(); // 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 ) ) @@ -1419,9 +1432,9 @@ void DocumentPrivate::sendGeneratorPixmapRequest() m_pixmapRequestsStack.pop_back(); delete r; } - // If the requested area is above 8000000 pixels, and we're not rendering most of the page, switch on the tile manager + // If the requested area is above 4*screenSize pixels, and we're not rendering most of the page, switch on the tile manager else if ( !tilesManager && m_generator->hasFeature( Generator::TiledRendering ) && - (long)r->width() * (long)r->height() > 8000000L && + (long)r->width() * (long)r->height() > 4L*screenSize && normalizedArea < 0.75 && normalizedArea != 0 ) { // if the image is too big. start using tiles @@ -1477,8 +1490,8 @@ void DocumentPrivate::sendGeneratorPixmapRequest() delete r; } } - // If the requested area is below 6000000 pixels, switch off the tile manager - else if ( tilesManager && (long)r->width() * (long)r->height() < 6000000L ) + // If the requested area is below 3*screenSize pixels, switch off the tile manager + else if ( tilesManager && (long)r->width() * (long)r->height() < 3L*screenSize ) { qCDebug(OkularCoreDebug).nospace() << "Stop using tiles on page " << r->pageNumber() << " (" << r->width() << "x" << r->height() << " px);"; @@ -1489,7 +1502,7 @@ void DocumentPrivate::sendGeneratorPixmapRequest() request = r; } - else if ( (long)requestRect.width() * (long)requestRect.height() > 200000000L && (SettingsCore::memoryLevel() != SettingsCore::EnumMemoryLevel::Greedy ) ) + else if ( (long)requestRect.width() * (long)requestRect.height() > 100L*screenSize && (SettingsCore::memoryLevel() != SettingsCore::EnumMemoryLevel::Greedy ) ) { m_pixmapRequestsStack.pop_back(); if ( !m_warnedOutOfMemory )