87void RenderWorker::requestPage(quint64 requestId,
int pageNumber, QSize imageSize,
88 QPdfDocumentRenderOptions options)
90 const QMutexLocker locker(&m_mutex);
92 if (!m_document || m_document->status() != QPdfDocument::Status::Ready)
95 const QImage image = m_document->render(pageNumber, imageSize, options);
97 emit pageRendered(pageNumber, imageSize, image, options, requestId);
112 if (m_requests.isEmpty())
115 const PageRequest request = m_requests.takeFirst();
116 m_pendingRequests.append(request);
118 QMetaObject::invokeMethod(m_renderWorker.data(),
"requestPage", Qt::QueuedConnection,
119 Q_ARG(quint64, request.id), Q_ARG(
int, request.pageNumber),
120 Q_ARG(QSize, request.imageSize), Q_ARG(QPdfDocumentRenderOptions,
128 const auto it = std::find_if(m_pendingRequests.begin(), m_pendingRequests.end(),
129 [page, imageSize, options](
const PageRequest &request){
return request.pageNumber == page && request.imageSize == imageSize && request.options == options; });
131 if (it != m_pendingRequests.end())
132 m_pendingRequests.erase(it);
155QPdfPageRenderer::QPdfPageRenderer(QObject *parent)
156 : QObject(parent), d_ptr(
new QPdfPageRendererPrivate)
158 qRegisterMetaType<QPdfDocumentRenderOptions>();
160 connect(d_ptr->m_renderWorker.data(), &RenderWorker::pageRendered,
this,
161 [
this](
int page, QSize imageSize,
const QImage &image,
162 QPdfDocumentRenderOptions options, quint64 requestId) {
163 d_ptr->requestFinished(page, imageSize, image, options, requestId);
164 emit pageRendered(page, imageSize, image, options, requestId);
165 d_ptr->handleNextRequest();
211void QPdfPageRenderer::setRenderMode(RenderMode mode)
213 if (d_ptr->m_renderMode == mode)
216 d_ptr->m_renderMode = mode;
217 emit renderModeChanged(d_ptr->m_renderMode);
219 if (d_ptr->m_renderMode == RenderMode::MultiThreaded) {
220 d_ptr->m_renderThread =
new QThread;
221 d_ptr->m_renderWorker->moveToThread(d_ptr->m_renderThread);
222 d_ptr->m_renderThread->start();
224 d_ptr->m_renderThread->quit();
225 d_ptr->m_renderThread->wait();
226 delete d_ptr->m_renderThread;
227 d_ptr->m_renderThread =
nullptr;
230 d_ptr->m_renderWorker->moveToThread(
this->thread());
259void QPdfPageRenderer::setDocument(QPdfDocument *document)
261 if (d_ptr->m_document == document)
264 d_ptr->m_document = document;
265 emit documentChanged(d_ptr->m_document);
267 d_ptr->m_renderWorker->setDocument(d_ptr->m_document);
279quint64 QPdfPageRenderer::requestPage(
int pageNumber, QSize imageSize,
280 QPdfDocumentRenderOptions options)
282 if (!d_ptr->m_document || d_ptr->m_document->status() != QPdfDocument::Status::Ready)
285 for (
const auto &request : std::as_const(d_ptr->m_pendingRequests)) {
286 if (request.pageNumber == pageNumber
287 && request.imageSize == imageSize
288 && request.options == options)
292 const auto id = d_ptr->m_requestIdCounter++;
294 QPdfPageRendererPrivate::PageRequest request;
296 request.pageNumber = pageNumber;
297 request.imageSize = imageSize;
298 request.options = options;
300 d_ptr->m_requests.append(request);
302 d_ptr->handleNextRequest();