Make the generator multithreaded

svn path=/trunk/playground/graphics/okular/; revision=625262
remotes/origin/KDE/4.0
Tobias Koenig 19 years ago
parent 1f478d57fb
commit e642b97c8c
  1. 100
      generators/comicbook/generator_comicbook.cpp
  2. 7
      generators/comicbook/generator_comicbook.h

@ -7,7 +7,9 @@
* (at your option) any later version. *
***************************************************************************/
#include <qpainter.h>
#include <QtCore/QThread>
#include <QtGui/QPainter>
#include <kprinter.h>
#include <okular/core/page.h>
@ -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<Okular::Page*> & pagesVector )
@ -38,21 +105,32 @@ bool ComicBookGenerator::loadDocument( const QString & fileName, QVector<Okular:
pagesVector[i] = page;
}
mReady = true;
return true;
}
bool ComicBookGenerator::closeDocument()
{
mReady = false;
return true;
}
bool ComicBookGenerator::canGeneratePixmap( bool ) const
{
return true;
return mReady;
}
void ComicBookGenerator::generatePixmap( Okular::PixmapRequest * request )
{
mReady = false;
if ( request->asynchronous() ) {
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 )

@ -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

Loading…
Cancel
Save