From e642b97c8c0b1f62aae03e6dcbde976e0f73d00a Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Fri, 19 Jan 2007 17:27:16 +0000 Subject: [PATCH] Make the generator multithreaded svn path=/trunk/playground/graphics/okular/; revision=625262 --- generators/comicbook/generator_comicbook.cpp | 100 ++++++++++++++++++- generators/comicbook/generator_comicbook.h | 7 ++ 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/generators/comicbook/generator_comicbook.cpp b/generators/comicbook/generator_comicbook.cpp index bbd6446ba..0ad76562d 100644 --- a/generators/comicbook/generator_comicbook.cpp +++ b/generators/comicbook/generator_comicbook.cpp @@ -7,7 +7,9 @@ * (at your option) any later version. * ***************************************************************************/ -#include +#include +#include + #include #include @@ -16,13 +18,78 @@ OKULAR_EXPORT_PLUGIN(ComicBookGenerator) +class GeneratorThread : public QThread +{ + public: + GeneratorThread(); + + void startGeneration( Okular::PixmapRequest* request, ComicBook::Document *document ); + void endGeneration(); + + Okular::PixmapRequest *request() const; + QImage image(); + + private: + void run(); + + Okular::PixmapRequest* mRequest; + QImage mImage; + ComicBook::Document* mDocument; +}; + +GeneratorThread::GeneratorThread() + : QThread(), mRequest( 0 ), mDocument( 0 ) +{ +} + +void GeneratorThread::startGeneration( Okular::PixmapRequest* request, ComicBook::Document *document ) +{ + mRequest = request; + mDocument = document; + start( QThread::InheritPriority ); +} + +void GeneratorThread::endGeneration() +{ + mRequest = 0; + mDocument = 0; +} + +Okular::PixmapRequest* GeneratorThread::request() const +{ + return mRequest; +} + +QImage GeneratorThread::image() +{ + const QImage image = mImage; + mImage = QImage(); + + return image; +} + +void GeneratorThread::run() +{ + int width = mRequest->width(); + int height = mRequest->height(); + + mImage = mDocument->pageImage( mRequest->pageNumber() ); + mImage = mImage.scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); +} + ComicBookGenerator::ComicBookGenerator() - : Generator() + : Generator(), mReady( false ) { + mThread = new GeneratorThread(); + connect( mThread, SIGNAL( finished() ), this, SLOT( threadFinished() ), Qt::QueuedConnection ); } ComicBookGenerator::~ComicBookGenerator() { + if ( mThread ) + mThread->wait(); + + delete mThread; } bool ComicBookGenerator::loadDocument( const QString & fileName, QVector & pagesVector ) @@ -38,21 +105,32 @@ bool ComicBookGenerator::loadDocument( const QString & fileName, QVectorasynchronous() ) { + mThread->startGeneration( request, &mDocument ); + return; + } + int width = request->width(); int height = request->height(); @@ -60,8 +138,22 @@ void ComicBookGenerator::generatePixmap( Okular::PixmapRequest * request ) image = image.scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); request->page()->setPixmap( request->id(), new QPixmap( QPixmap::fromImage( image ) ) ); + mReady = true; + // signal that the request has been accomplished - signalRequestDone(request); + signalRequestDone( request ); +} + +void ComicBookGenerator::threadFinished() +{ + Okular::PixmapRequest *request = mThread->request(); + mThread->endGeneration(); + + request->page()->setPixmap( request->id(), new QPixmap( QPixmap::fromImage( mThread->image() ) ) ); + + mReady = true; + + signalRequestDone( request ); } bool ComicBookGenerator::print( KPrinter& printer ) diff --git a/generators/comicbook/generator_comicbook.h b/generators/comicbook/generator_comicbook.h index 0e261ddc6..525e45caa 100644 --- a/generators/comicbook/generator_comicbook.h +++ b/generators/comicbook/generator_comicbook.h @@ -14,6 +14,8 @@ #include "document.h" +class GeneratorThread; + class ComicBookGenerator : public Okular::Generator { Q_OBJECT @@ -35,8 +37,13 @@ class ComicBookGenerator : public Okular::Generator bool hasFeature( GeneratorFeature feature ) const; + private Q_SLOTS: + void threadFinished(); + private: ComicBook::Document mDocument; + GeneratorThread *mThread; + bool mReady; }; #endif