Make the rendering for TextDocument-based generators threaded, only if Qt (via QFontDatabase) tells us we can.

... but, as it's proving to be buggy (text disappearing from menus) and crashing (out-of-range font engine list), it's disabled for now, define OKULAR_TEXTDOCUMENT_THREADED_RENDERING to try it.

svn path=/trunk/KDE/kdegraphics/okular/; revision=804719
This commit is contained in:
Pino Toscano 2008-05-06 20:20:10 +00:00
parent a3287b38c7
commit 697d51e1a2
4 changed files with 47 additions and 15 deletions

View file

@ -141,6 +141,11 @@ QVariant GeneratorPrivate::metaData( const QString &, const QVariant & ) const
return QVariant();
}
QImage GeneratorPrivate::image( PixmapRequest * )
{
return QImage();
}
Generator::Generator( QObject *parent, const QVariantList &args )
: QObject( parent ), d_ptr( new GeneratorPrivate() )
@ -245,9 +250,10 @@ void Generator::generateTextPage( Page *page )
signalTextGenerationDone( page, tp );
}
QImage Generator::image( PixmapRequest * )
QImage Generator::image( PixmapRequest *request )
{
return QImage();
Q_D( Generator );
return d->image( request );
}
TextPage* Generator::textPage( Page* )

View file

@ -47,6 +47,7 @@ class GeneratorPrivate
QMutex* threadsLock();
virtual QVariant metaData( const QString &key, const QVariant &option ) const;
virtual QImage image( PixmapRequest * );
DocumentPrivate *m_document;
// NOTE: the following should be a QSet< GeneratorFeature >,

View file

@ -11,11 +11,13 @@
#include "textdocumentgenerator_p.h"
#include <QtCore/QFile>
#include <QtCore/QMutex>
#include <QtCore/QStack>
#include <QtCore/QTextStream>
#include <QtCore/QVector>
#include <QtGui/QFontDatabase>
#include <QtGui/QImage>
#include <QtGui/QPainter>
#include <QtGui/QPixmap>
#include <QtGui/QPrinter>
#include <okular/core/action.h>
@ -55,10 +57,15 @@ TextDocumentGenerator* TextDocumentConverter::generator() const
*/
Okular::TextPage* TextDocumentGeneratorPrivate::createTextPage( int pageNumber ) const
{
Q_Q( const TextDocumentGenerator );
Okular::TextPage *textPage = new Okular::TextPage;
int start, end;
#ifdef OKULAR_TEXTDOCUMENT_THREADED_RENDERING
q->userMutex()->lock();
#endif
Utils::calculatePositions( mDocument, pageNumber, start, end );
QTextCursor cursor( mDocument );
@ -76,6 +83,9 @@ Okular::TextPage* TextDocumentGeneratorPrivate::createTextPage( int pageNumber )
textPage->append( text, new Okular::NormalizedRect( rect.left(), rect.top(), rect.right(), rect.bottom() ) );
}
}
#ifdef OKULAR_TEXTDOCUMENT_THREADED_RENDERING
q->userMutex()->unlock();
#endif
return textPage;
}
@ -205,6 +215,10 @@ TextDocumentGenerator::TextDocumentGenerator( TextDocumentConverter *converter,
setFeature( TextExtraction );
setFeature( PrintNative );
setFeature( PrintToFile );
#ifdef OKULAR_TEXTDOCUMENT_THREADED_RENDERING
if ( QFontDatabase::supportsThreadedFontRendering() )
setFeature( Threaded );
#endif
connect( converter, SIGNAL( addAction( Action*, int, int ) ),
this, SLOT( addAction( Action*, int, int ) ) );
@ -314,37 +328,47 @@ bool TextDocumentGenerator::doCloseDocument()
bool TextDocumentGenerator::canGeneratePixmap() const
{
return true;
return Generator::canGeneratePixmap();
}
void TextDocumentGenerator::generatePixmap( Okular::PixmapRequest * request )
{
Q_D( TextDocumentGenerator );
if ( !d->mDocument )
return;
Generator::generatePixmap( request );
}
const QSize size = d->mDocument->pageSize().toSize();
QImage TextDocumentGeneratorPrivate::image( PixmapRequest * request )
{
if ( !mDocument )
return QImage();
QPixmap *pixmap = new QPixmap( request->width(), request->height() );
pixmap->fill( Qt::white );
Q_Q( TextDocumentGenerator );
QImage image( request->width(), request->height(), QImage::Format_ARGB32 );
image.fill( Qt::white );
QPainter p;
p.begin( pixmap );
p.begin( &image );
qreal width = request->width();
qreal height = request->height();
const QSize size = mDocument->pageSize().toSize();
p.scale( width / (qreal)size.width(), height / (qreal)size.height() );
QRect rect;
rect = QRect( 0, request->pageNumber() * size.height(), size.width(), size.height() );
p.translate( QPoint( 0, request->pageNumber() * size.height() * -1 ) );
d->mDocument->drawContents( &p, rect );
#ifdef OKULAR_TEXTDOCUMENT_THREADED_RENDERING
q->userMutex()->lock();
#endif
mDocument->drawContents( &p, rect );
#ifdef OKULAR_TEXTDOCUMENT_THREADED_RENDERING
q->userMutex()->unlock();
#endif
p.end();
request->page()->setPixmap( request->id(), pixmap );
signalPixmapRequestDone( request );
return image;
}
Okular::TextPage* TextDocumentGenerator::textPage( Okular::Page * page )

View file

@ -123,6 +123,7 @@ class TextDocumentGeneratorPrivate : public GeneratorPrivate
Q_DECLARE_PUBLIC( TextDocumentGenerator )
/* reimp */ QVariant metaData( const QString &key, const QVariant &option ) const;
/* reimp */ QImage image( PixmapRequest * );
void calculateBoundingRect( int startPosition, int endPosition, QRectF &rect, int &page ) const;
void calculatePositions( int page, int &start, int &end ) const;