summaryrefslogtreecommitdiffstats
path: root/src/pdf
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf')
-rw-r--r--src/pdf/qpdfdocument.cpp25
-rw-r--r--src/pdf/qpdfdocument.h2
-rw-r--r--src/pdf/qpdfdocument_p.h2
3 files changed, 27 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();
diff --git a/src/pdf/qpdfdocument.h b/src/pdf/qpdfdocument.h
index 6459f39..c846333 100644
--- a/src/pdf/qpdfdocument.h
+++ b/src/pdf/qpdfdocument.h
@@ -44,11 +44,13 @@ public:
QSizeF pageSize(int page) const;
+ bool canRender(int page) const;
QImage render(int page, const QSizeF &pageSize);
Q_SIGNALS:
void passwordRequired();
void documentLoadStarted();
+ void pageAvailable(int page);
void documentLoadFinished();
void pageCountChanged();
diff --git a/src/pdf/qpdfdocument_p.h b/src/pdf/qpdfdocument_p.h
index 7850c65..2e19fb0 100644
--- a/src/pdf/qpdfdocument_p.h
+++ b/src/pdf/qpdfdocument_p.h
@@ -9,6 +9,7 @@
#include <qbuffer.h>
#include <qnetworkreply.h>
#include <qpointer.h>
+#include <qbitarray.h>
QT_BEGIN_NAMESPACE
@@ -23,6 +24,7 @@ public:
FPDF_AVAIL avail;
FPDF_DOCUMENT doc;
bool loadComplete;
+ QBitArray reportedAvailablePages;
QPointer<QIODevice> device;
QScopedPointer<QIODevice> ownDevice;