[Add] Added multithreaded thumbnail generator.

This commit is contained in:
Rtch90 2014-12-17 14:48:32 +00:00
parent 27255eb6f4
commit 8607725224
7 changed files with 142 additions and 4 deletions

View File

@ -11,6 +11,8 @@ HEADERS += \
../src/pdf_page_widget.h \ ../src/pdf_page_widget.h \
../src/pdf_table_widget.h \ ../src/pdf_table_widget.h \
../src/pdf_file_widget.h \ ../src/pdf_file_widget.h \
../src/pdf_jam.h \
../src/thumbgen.h \
../src/pdf_preview_widget.h ../src/pdf_preview_widget.h
SOURCES += \ SOURCES += \
@ -19,6 +21,8 @@ SOURCES += \
../src/pdf_page_widget.cpp \ ../src/pdf_page_widget.cpp \
../src/pdf_table_widget.cpp \ ../src/pdf_table_widget.cpp \
../src/pdf_file_widget.cpp \ ../src/pdf_file_widget.cpp \
../src/pdf_jam.cpp \
../src/thumbgen.cpp \
../src/pdf_preview_widget.cpp ../src/pdf_preview_widget.cpp
RESOURCES += hpdf.qrc RESOURCES += hpdf.qrc

View File

@ -101,6 +101,13 @@ PDFFileWidget::PDFFileWidget(QWidget* parent) {
setLayout(topLayout); setLayout(topLayout);
setCollapsed(false); 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) { void PDFFileWidget::setCollapsed(bool state) {
@ -118,20 +125,28 @@ void PDFFileWidget::collapsedButtonClick(void) {
setCollapsed(!collapsed); setCollapsed(!collapsed);
} }
void PDFFileWidget::pageClickedHandler(QMouseEvent*, QImage) {
}
void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) { void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) {
document->setRenderHint(Poppler::Document::TextAntialiasing);
int numPages = document->numPages(); int numPages = document->numPages();
for(int i = 0; i < numPages; i++) { for(int i = 0; i < numPages; i++) {
Poppler::Page* pdfPage = document->page(i); Poppler::Page* pdfPage = document->page(i);
QImage pageImage = pdfPage->renderToImage(144, 144);
PDFPageWidget* pageWidget = new PDFPageWidget(); PDFPageWidget* pageWidget = new PDFPageWidget();
pageWidget->setThumbnail(pageImage);
tgen.render(pageWidget, pdfPage);
connect(pageWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this, connect(pageWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this,
SIGNAL(pageClicked(QMouseEvent*,QImage))); SIGNAL(pageClicked(QMouseEvent*,QImage)));
pagesContainerWidget->addPageWidget(pageWidget); pagesContainerWidget->addPageWidget(pageWidget);
/* Process event. */
/*qApp->processEvents();*/
} }
tgen.start();
fileNameLabel->setText(fileName); fileNameLabel->setText(fileName);
} }

View File

@ -2,6 +2,7 @@
#include <QWidget> #include <QWidget>
#include <poppler-qt5.h> #include <poppler-qt5.h>
#include "pdf_page_widget.h" #include "pdf_page_widget.h"
#include "thumbgen.h"
class QImage; class QImage;
class QHBoxLayout; class QHBoxLayout;
@ -16,6 +17,7 @@ class QDragEnterEvent;
class QDropEvent; class QDropEvent;
class QMouseEvent; class QMouseEvent;
class PDFPageWidget; class PDFPageWidget;
class ThumbGen;
class PagesContainerWidget : public QWidget { class PagesContainerWidget : public QWidget {
Q_OBJECT Q_OBJECT
@ -56,8 +58,11 @@ protected:
private slots: private slots:
void collapsedButtonClick(); void collapsedButtonClick();
void pageClickedHandler(QMouseEvent*, QImage);
void updateThumbnail(QImage, PDFPageWidget*);
private: private:
ThumbGen tgen;
QGridLayout* topLayout; QGridLayout* topLayout;
QLabel* fileNameLabel; QLabel* fileNameLabel;
@ -69,5 +74,6 @@ private:
signals: signals:
void pageClicked(QMouseEvent*, QImage); void pageClicked(QMouseEvent*, QImage);
void pageClicked(QMouseEvent*, Poppler::Page*);
}; };

24
src/pdf_jam.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <QtGlobal>
#include <QtWidgets>
#include <unistd.h>
#include <stdlib.h>
#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
}

14
src/pdf_jam.h Normal file
View File

@ -0,0 +1,14 @@
#pragma once
class PDFJam { /*:public QThread {*/
public:
PDFJam(void);
protected:
void run(void);
private:
volatile bool stopped;
};

45
src/thumbgen.cpp Normal file
View File

@ -0,0 +1,45 @@
#include <QtGlobal>
#include <QtWidgets>
#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();
}

30
src/thumbgen.h Normal file
View File

@ -0,0 +1,30 @@
#pragma once
#include <QThread>
#include <QMutex>
#include <QImage>
#include <poppler-qt5.h>
class PDFPageWidget;
class QImage;
class ThumbGen : public QThread {
Q_OBJECT
public:
ThumbGen(void);
void render(PDFPageWidget*, Poppler::Page*);
protected:
void run(void);
QVector<PDFPageWidget*> pWidgets;
QVector<Poppler::Page*> pPages;
QMutex mutex;
private:
double calcDpi(Poppler::Page* pdfPage, QSize targetSize);
signals:
void updateThumbnail(QImage, PDFPageWidget*);
};