[Add] Added multithreaded thumbnail generator.
This commit is contained in:
parent
27255eb6f4
commit
8607725224
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <QWidget>
|
||||
#include <poppler-qt5.h>
|
||||
#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*);
|
||||
};
|
||||
|
||||
|
24
src/pdf_jam.cpp
Normal file
24
src/pdf_jam.cpp
Normal 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
14
src/pdf_jam.h
Normal 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
45
src/thumbgen.cpp
Normal 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
30
src/thumbgen.h
Normal 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*);
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user