okular/core/generator_p.cpp
Pino Toscano e5037f45b1 Refator a bit the way Document and the generators use to read the font information from a document.
Instead of having a synchronous function that extracts all the information at once, use a function to read the fonts of a single page.
This way, we can get all the result step by step (aka page by page), and possibly in an asynchronous way.
The resuls of the font "scanning" are sent via signals, as well the end of the work.
So, instead of block waiting for the results of all the document at once, the Fonts tab in the properties dialog can have a progress bar with the progress, and the results (the fonts) that are added incrementally to the list.

Only two minor things are left:
- the process is always asynchronous at the moment, as the only generator that can provide this kind of information is the Poppler one (safe)
- there is no check for duplicate fonts
But they should be easy to solve.

svn path=/trunk/KDE/kdegraphics/okular/; revision=685002
2007-07-07 20:35:01 +00:00

122 lines
2.5 KiB
C++

/***************************************************************************
* Copyright (C) 2007 Tobias Koenig <tokoe@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "generator_p.h"
#include <kdebug.h>
#include "fontinfo.h"
#include "generator.h"
using namespace Okular;
PixmapGenerationThread::PixmapGenerationThread( Generator *generator )
: mGenerator( generator ), mRequest( 0 )
{
}
void PixmapGenerationThread::startGeneration( PixmapRequest *request )
{
mRequest = request;
start( QThread::InheritPriority );
}
void PixmapGenerationThread::endGeneration()
{
mRequest = 0;
}
PixmapRequest *PixmapGenerationThread::request() const
{
return mRequest;
}
QImage PixmapGenerationThread::image() const
{
return mImage;
}
void PixmapGenerationThread::run()
{
mImage = QImage();
if ( mRequest )
mImage = mGenerator->image( mRequest );
}
TextPageGenerationThread::TextPageGenerationThread( Generator *generator )
: mGenerator( generator ), mPage( 0 )
{
}
void TextPageGenerationThread::startGeneration( Page *page )
{
mPage = page;
start( QThread::InheritPriority );
}
void TextPageGenerationThread::endGeneration()
{
mPage = 0;
}
Page *TextPageGenerationThread::page() const
{
return mPage;
}
TextPage* TextPageGenerationThread::textPage() const
{
return mTextPage;
}
void TextPageGenerationThread::run()
{
mTextPage = 0;
if ( mPage )
mTextPage = mGenerator->textPage( mPage );
}
FontExtractionThread::FontExtractionThread( Generator *generator, int pages )
: mGenerator( generator ), mNumOfPages( pages )
{
}
void FontExtractionThread::startExtraction( bool async )
{
if ( async )
{
start( QThread::InheritPriority );
}
else
{
run();
}
}
void FontExtractionThread::run()
{
for ( int i = 1; i <= mNumOfPages; ++i )
{
FontInfo::List list = mGenerator->fontsForPage( i );
foreach ( const FontInfo& fi, list )
{
emit gotFont( fi );
}
emit progress( i );
}
}
#include "generator_p.moc"