remove max previewimage memory usage

This commit is contained in:
Albert S. 2019-08-26 09:35:39 +02:00
parent 582abc333f
commit 4aed15f7a4

View File

@ -19,88 +19,71 @@ struct Renderer
double scaleX; double scaleX;
double scaleY; double scaleY;
QHash<QString, Poppler::Document *> documentcache; QHash<QString, Poppler::Document *> documentcache;
qsizetype maxTotalPreviewImageMemUsage;
std::atomic<qsizetype> currentTotalPreviewImageMemUsage { 0 };
QVector<QString> wordsToHighlight; QVector<QString> wordsToHighlight;
Renderer(double scaleX, double scaleY, qsizetype maxPreviewImageMemUsage, QVector<QString> wordsToHighlight) Renderer(double scaleX, double scaleY, QVector<QString> wordsToHighlight)
{ {
this->scaleX = scaleX; this->scaleX = scaleX;
this->scaleY = scaleY; this->scaleY = scaleY;
this->maxTotalPreviewImageMemUsage = maxPreviewImageMemUsage;
this->wordsToHighlight = wordsToHighlight; this->wordsToHighlight = wordsToHighlight;
} }
/*we need this one because std::atomic has none, but this is only a functor for
concurrentmap, thus, it's ok for it to be half-broken*/
Renderer(const Renderer &o)
{
this->scaleX = o.scaleX;
this->scaleY = o.scaleY;
this->maxTotalPreviewImageMemUsage = o.maxTotalPreviewImageMemUsage;
this->wordsToHighlight = o.wordsToHighlight;
}
~Renderer() ~Renderer()
{ {
qDeleteAll(documentcache); qDeleteAll(documentcache);
} }
Poppler::Document *document(QString path) Poppler::Document *document(QString path)
{ {
if(documentcache.contains(path)) if(documentcache.contains(path))
return documentcache.value(path); {
return documentcache.value(path);
Poppler::Document *result = Poppler::Document::load(path); }
if(result == nullptr) Poppler::Document *result = Poppler::Document::load(path);
{ if(result == nullptr)
//TODO: some kind of user feedback would be nice {
return nullptr; //TODO: some kind of user feedback would be nice
} return nullptr;
result->setRenderHint(Poppler::Document::TextAntialiasing); }
QMutexLocker locker(&cacheMutex); result->setRenderHint(Poppler::Document::TextAntialiasing);
documentcache.insert(path, result); QMutexLocker locker(&cacheMutex);
return result; documentcache.insert(path, result);
return result;
} }
PdfPreview operator()(const PdfPreview &preview) PdfPreview operator()(const PdfPreview &preview)
{ {
PdfPreview result = preview; PdfPreview result = preview;
if(currentTotalPreviewImageMemUsage.load() < maxTotalPreviewImageMemUsage) Poppler::Document *doc = document(preview.documentPath);
{ if(doc == nullptr)
Poppler::Document *doc = document(preview.documentPath); {
if(doc == nullptr) return preview;
{ }
return preview; if(doc->isLocked())
} {
if(doc->isLocked()) return preview;
{ }
return preview; int p = (int)preview.page - 1;
} if(p < 0)
int p = (int)preview.page - 1; {
if(p < 0) p = 0;
{ }
p = 0; Poppler::Page *pdfPage = doc->page(p);
} QImage img = pdfPage->renderToImage(scaleX, scaleY);
Poppler::Page *pdfPage = doc->page(p); for(QString & word : wordsToHighlight)
QImage img = pdfPage->renderToImage(scaleX, scaleY); {
for(QString & word : wordsToHighlight) QList<QRectF> rects = pdfPage->search(word, Poppler::Page::CaseInsensitive);
{ for(QRectF &rect : rects)
QList<QRectF> rects = pdfPage->search(word, Poppler::Page::CaseInsensitive); {
for(QRectF &rect : rects) QPainter painter(&img);
{ painter.scale(scaleX / 72.0, scaleY / 72.0);
QPainter painter(&img); painter.fillRect(rect, QColor(255, 255, 0, 64));
painter.scale(scaleX / 72.0, scaleY / 72.0); }
painter.fillRect(rect, QColor(255, 255, 0, 64)); }
} result.previewImage = img;
} return result;
result.previewImage = img; }
currentTotalPreviewImageMemUsage += img.sizeInBytes();
}
return result;
}
}; };
@ -126,7 +109,6 @@ QFuture<PdfPreview> PdfWorker::generatePreviews(const QVector<SearchResult> path
double scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * scalefactor; double scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * scalefactor;
QSettings setting; QSettings setting;
qsizetype maxPreviewImageMemUsage = setting.value("maxpreviewimagesmemory", 1024 * 1024 * 1024).toLongLong(); return QtConcurrent::mapped(previews, Renderer(scaleX, scaleY, wordsToHighlight));
return QtConcurrent::mapped(previews, Renderer(scaleX, scaleY, maxPreviewImageMemUsage, wordsToHighlight));
} }