remove max previewimage memory usage
This commit is contained in:
parent
582abc333f
commit
4aed15f7a4
@ -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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user