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