From 86077252242a3d2f0edfff69eaedb96ae4690568 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Wed, 17 Dec 2014 14:48:32 +0000 Subject: [PATCH] [Add] Added multithreaded thumbnail generator. --- bin/hpdf.pro | 4 ++++ src/pdf_file_widget.cpp | 21 ++++++++++++++++--- src/pdf_file_widget.h | 8 +++++++- src/pdf_jam.cpp | 24 ++++++++++++++++++++++ src/pdf_jam.h | 14 +++++++++++++ src/thumbgen.cpp | 45 +++++++++++++++++++++++++++++++++++++++++ src/thumbgen.h | 30 +++++++++++++++++++++++++++ 7 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 src/pdf_jam.cpp create mode 100644 src/pdf_jam.h create mode 100644 src/thumbgen.cpp create mode 100644 src/thumbgen.h diff --git a/bin/hpdf.pro b/bin/hpdf.pro index fc6c862..d83005e 100644 --- a/bin/hpdf.pro +++ b/bin/hpdf.pro @@ -11,6 +11,8 @@ HEADERS += \ ../src/pdf_page_widget.h \ ../src/pdf_table_widget.h \ ../src/pdf_file_widget.h \ + ../src/pdf_jam.h \ + ../src/thumbgen.h \ ../src/pdf_preview_widget.h SOURCES += \ @@ -19,6 +21,8 @@ SOURCES += \ ../src/pdf_page_widget.cpp \ ../src/pdf_table_widget.cpp \ ../src/pdf_file_widget.cpp \ + ../src/pdf_jam.cpp \ + ../src/thumbgen.cpp \ ../src/pdf_preview_widget.cpp RESOURCES += hpdf.qrc diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp index b15c9e1..385c360 100644 --- a/src/pdf_file_widget.cpp +++ b/src/pdf_file_widget.cpp @@ -101,6 +101,13 @@ PDFFileWidget::PDFFileWidget(QWidget* parent) { setLayout(topLayout); setCollapsed(false); + + connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this, + SLOT(updateThumbnail(QImage,PDFPageWidget*))); +} + +void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pw) { + pw->setThumbnail(img); } void PDFFileWidget::setCollapsed(bool state) { @@ -118,20 +125,28 @@ void PDFFileWidget::collapsedButtonClick(void) { setCollapsed(!collapsed); } +void PDFFileWidget::pageClickedHandler(QMouseEvent*, QImage) { + +} + void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) { + document->setRenderHint(Poppler::Document::TextAntialiasing); int numPages = document->numPages(); for(int i = 0; i < numPages; i++) { Poppler::Page* pdfPage = document->page(i); - QImage pageImage = pdfPage->renderToImage(144, 144); - PDFPageWidget* pageWidget = new PDFPageWidget(); - pageWidget->setThumbnail(pageImage); + + tgen.render(pageWidget, pdfPage); + connect(pageWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this, SIGNAL(pageClicked(QMouseEvent*,QImage))); pagesContainerWidget->addPageWidget(pageWidget); + /* Process event. */ + /*qApp->processEvents();*/ } + tgen.start(); fileNameLabel->setText(fileName); } diff --git a/src/pdf_file_widget.h b/src/pdf_file_widget.h index 300fe19..8ecd162 100644 --- a/src/pdf_file_widget.h +++ b/src/pdf_file_widget.h @@ -2,6 +2,7 @@ #include #include #include "pdf_page_widget.h" +#include "thumbgen.h" class QImage; class QHBoxLayout; @@ -16,6 +17,7 @@ class QDragEnterEvent; class QDropEvent; class QMouseEvent; class PDFPageWidget; +class ThumbGen; class PagesContainerWidget : public QWidget { Q_OBJECT @@ -56,9 +58,12 @@ protected: private slots: void collapsedButtonClick(); + void pageClickedHandler(QMouseEvent*, QImage); + void updateThumbnail(QImage, PDFPageWidget*); private: - QGridLayout* topLayout; + ThumbGen tgen; + QGridLayout* topLayout; QLabel* fileNameLabel; QPushButton* collapseButton; @@ -69,5 +74,6 @@ private: signals: void pageClicked(QMouseEvent*, QImage); + void pageClicked(QMouseEvent*, Poppler::Page*); }; diff --git a/src/pdf_jam.cpp b/src/pdf_jam.cpp new file mode 100644 index 0000000..236a734 --- /dev/null +++ b/src/pdf_jam.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include "pdf_jam.h" + +PDFJam::PDFJam(void) { + +} + +void PDFJam::run(void) { +#if 0 + if((pid = fork()) < 0) { + + } + else if(pid > 0) { + /* Parent. */ + } else { + /* Child. */ + system("echo 'tata' > /tmp/test.txt"); + } +#endif +} + diff --git a/src/pdf_jam.h b/src/pdf_jam.h new file mode 100644 index 0000000..548f9fd --- /dev/null +++ b/src/pdf_jam.h @@ -0,0 +1,14 @@ +#pragma once + +class PDFJam { /*:public QThread {*/ +public: + PDFJam(void); + +protected: + void run(void); + +private: + volatile bool stopped; + +}; + diff --git a/src/thumbgen.cpp b/src/thumbgen.cpp new file mode 100644 index 0000000..e44f000 --- /dev/null +++ b/src/thumbgen.cpp @@ -0,0 +1,45 @@ +#include +#include +#include "thumbgen.h" +#include "pdf_page_widget.h" + +ThumbGen::ThumbGen(void) { + +} + +double ThumbGen::calcDpi(Poppler::Page* pdfPage, QSize targetSize) { + double dpi; + QSizeF oriSize = pdfPage->pageSizeF(); + double oriDpi = 72; + + if(targetSize.width() > targetSize.height()) { + dpi = targetSize.height() / (float)oriSize.height()*72; + } else { + dpi = targetSize.width() / (float)oriSize.width()*72; + } + + return dpi; +} + +void ThumbGen::run(void) { + while(pWidgets.size() != 0) { + mutex.lock(); + PDFPageWidget* pw = pWidgets.first(); + pWidgets.pop_front(); + Poppler::Page* pp = pPages.last(); + pPages.pop_front(); + mutex.unlock(); + + double dpi = calcDpi(pp, pw->size()); + QImage pageImage = pp->renderToImage(dpi, dpi); + emit updateThumbnail(pageImage, pw); + } +} + +void ThumbGen::render(PDFPageWidget* pw, Poppler::Page* pp) { + mutex.lock(); + pWidgets.append(pw); + pPages.append(pp); + mutex.unlock(); +} + diff --git a/src/thumbgen.h b/src/thumbgen.h new file mode 100644 index 0000000..d758923 --- /dev/null +++ b/src/thumbgen.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include + +class PDFPageWidget; +class QImage; + +class ThumbGen : public QThread { + Q_OBJECT +public: + ThumbGen(void); + void render(PDFPageWidget*, Poppler::Page*); + +protected: + void run(void); + QVector pWidgets; + QVector pPages; + + QMutex mutex; + +private: + double calcDpi(Poppler::Page* pdfPage, QSize targetSize); + +signals: + void updateThumbnail(QImage, PDFPageWidget*); + +}; +