summaryrefslogtreecommitdiffstats
path: root/src/pdf/qpdfdocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf/qpdfdocument.cpp')
-rw-r--r--src/pdf/qpdfdocument.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp
index b48bbda..4d7990d 100644
--- a/src/pdf/qpdfdocument.cpp
+++ b/src/pdf/qpdfdocument.cpp
@@ -57,6 +57,7 @@ void QPdfDocumentPrivate::clear()
avail = 0;
loadComplete = false;
+ reportedAvailablePages.clear();
asyncBuffer.close();
asyncBuffer.setData(QByteArray());
@@ -169,8 +170,11 @@ void QPdfDocumentPrivate::tryLoadDocument()
updateLastError();
if (lastError == QPdfDocument::IncorrectPasswordError)
emit q->passwordRequired();
- else if (doc)
+ else if (doc) {
emit q->documentLoadStarted();
+ reportedAvailablePages.resize(FPDF_GetPageCount(doc));
+ reportedAvailablePages.fill(false);
+ }
}
void QPdfDocumentPrivate::checkComplete()
@@ -187,8 +191,14 @@ void QPdfDocumentPrivate::checkComplete()
loadComplete = true;
for (int i = 0, count = FPDF_GetPageCount(doc); i < count; ++i)
- if (!FPDFAvail_IsPageAvail(avail, i, this))
+ if (FPDFAvail_IsPageAvail(avail, i, this)) {
+ if (!reportedAvailablePages.at(i)) {
+ reportedAvailablePages[i] = true;
+ emit q->pageAvailable(i);
+ }
+ } else {
loadComplete = false;
+ }
if (loadComplete)
emit q->documentLoadFinished();
}
@@ -285,6 +295,14 @@ QSizeF QPdfDocument::pageSize(int page) const
return result;
}
+bool QPdfDocument::canRender(int page) const
+{
+ QMutexLocker lock(pdfMutex());
+ if (!d->doc)
+ return false;
+ return d->reportedAvailablePages.at(page);
+}
+
QImage QPdfDocument::render(int page, const QSizeF &pageSize)
{
if (!d->doc)
@@ -292,6 +310,9 @@ QImage QPdfDocument::render(int page, const QSizeF &pageSize)
QMutexLocker lock(pdfMutex());
+ if (!FPDFAvail_IsPageAvail(d->avail, page, d.data()))
+ return QImage();
+
FPDF_PAGE pdfPage = FPDF_LoadPage(d->doc, page);
if (!pdfPage)
return QImage();