[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_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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
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