QImage DjVuGenerator::image( Okular::PixmapRequest *request ) { userMutex()->lock(); QImage img = m_djvu->image( request->pageNumber(), request->width(), request->height(), request->page()->rotation() ); userMutex()->unlock(); return img; }
bool DjVuGenerator::doCloseDocument() { userMutex()->lock(); m_djvu->closeFile(); userMutex()->unlock(); delete m_docInfo; m_docInfo = 0; delete m_docSyn; m_docSyn = 0; return true; }
Okular::TextPage* DviGenerator::textPage( Okular::Page *page ) { kDebug(DviDebug); dviPageInfo *pageInfo = new dviPageInfo(); pageSize ps; pageInfo->width=page->width(); pageInfo->height=page->height(); pageInfo->pageNumber = page->number() + 1; pageInfo->resolution = m_resolution; QMutexLocker lock( userMutex() ); // get page text from m_dviRenderer Okular::TextPage *ktp = 0; if ( m_dviRenderer ) { SimplePageSize s = m_dviRenderer->sizeOfPage( pageInfo->pageNumber ); pageInfo->resolution = (double)(pageInfo->width)/ps.width().getLength_in_inch(); m_dviRenderer->getText( pageInfo ); lock.unlock(); ktp = extractTextFromPage( pageInfo ); } delete pageInfo; return ktp; }
QImage DviGenerator::image( Okular::PixmapRequest *request ) { dviPageInfo *pageInfo = new dviPageInfo(); pageSize ps; QImage ret; pageInfo->width = request->width(); pageInfo->height = request->height(); pageInfo->pageNumber = request->pageNumber() + 1; // pageInfo->resolution = m_resolution; QMutexLocker lock( userMutex() ); if ( m_dviRenderer ) { SimplePageSize s = m_dviRenderer->sizeOfPage( pageInfo->pageNumber ); /* if ( s.width() != pageInfo->width) */ // if (!useDocumentSpecifiedSize) // s = userPreferredSize; if (s.isValid()) { ps = s; /* it should be the user specified size, if any, instead */ } pageInfo->resolution = (double)(pageInfo->width)/ps.width().getLength_in_inch(); #if 0 kDebug(DviDebug) << *request << ", res:" << pageInfo->resolution << " - (" << pageInfo->width << "," << ps.width().getLength_in_inch() << ")," << ps.width().getLength_in_mm() << endl; #endif m_dviRenderer->drawPage( pageInfo ); if ( ! pageInfo->img.isNull() ) { kDebug(DviDebug) << "Image OK"; ret = pageInfo->img; if ( !m_linkGenerated[ request->pageNumber() ] ) { request->page()->setObjectRects( generateDviLinks( pageInfo ) ); m_linkGenerated[ request->pageNumber() ] = true; } } } lock.unlock(); delete pageInfo; return ret; }
bool DjVuGenerator::print( QPrinter& printer ) { bool result = false; // Create tempfile to write to KTemporaryFile tf; tf.setSuffix( ".ps" ); if ( !tf.open() ) return false; QMutexLocker locker( userMutex() ); QList<int> pageList = Okular::FilePrinter::pageList( printer, m_djvu->pages().count(), document()->currentPage() + 1, document()->bookmarkedPageList() ); if ( m_djvu->exportAsPostScript( &tf, pageList ) ) { tf.setAutoRemove( false ); const QString fileName = tf.fileName(); tf.close(); int ret = Okular::FilePrinter::printFile( printer, fileName, document()->orientation(), Okular::FilePrinter::SystemDeletesFiles, Okular::FilePrinter::ApplicationSelectsPages, document()->bookmarkedPageRange() ); result = ( ret >=0 ); } return result; }
const Okular::DocumentSynopsis *DviGenerator::generateDocumentSynopsis() { if ( m_docSynopsis ) return m_docSynopsis; m_docSynopsis = new Okular::DocumentSynopsis(); userMutex()->lock(); QVector<PreBookmark> prebookmarks = m_dviRenderer->getPrebookmarks(); userMutex()->unlock(); if ( prebookmarks.isEmpty() ) return m_docSynopsis; QStack<QDomElement> stack; QVector<PreBookmark>::ConstIterator it = prebookmarks.constBegin(); QVector<PreBookmark>::ConstIterator itEnd = prebookmarks.constEnd(); for( ; it != itEnd; ++it ) { QDomElement domel = m_docSynopsis->createElement( (*it).title ); Anchor a = m_dviRenderer->findAnchor((*it).anchorName); if ( a.isValid() ) { Okular::DocumentViewport vp; const Okular::Page *p = document()->page( a.page - 1 ); fillViewportFromAnchor( vp, a, (int)p->width(), (int)p->height() ); domel.setAttribute( "Viewport", vp.toString() ); } if ( stack.isEmpty() ) m_docSynopsis->appendChild( domel ); else { stack.top().appendChild( domel ); stack.pop(); } for ( int i = 0; i < (*it).noOfChildren; ++i ) stack.push( domel ); } return m_docSynopsis; }
bool DviGenerator::loadDocument( const QString & fileName, QVector< Okular::Page * > &pagesVector ) { //kDebug(DviDebug) << "file:" << fileName; KUrl base( fileName ); (void)userMutex(); m_dviRenderer = new dviRenderer(documentMetaData("TextHinting", QVariant()).toBool()); connect( m_dviRenderer, SIGNAL( error(QString,int) ), this, SIGNAL( error(QString,int) ) ); connect( m_dviRenderer, SIGNAL( warning(QString,int) ), this, SIGNAL( warning(QString,int) ) ); connect( m_dviRenderer, SIGNAL( notice(QString,int) ), this, SIGNAL( notice(QString,int) ) ); #ifdef DVI_OPEN_BUSYLOOP static const ushort s_waitTime = 800; // milliseconds static const int s_maxIterations = 10; int iter = 0; for ( ; !m_dviRenderer->isValidFile( fileName ) && iter < s_maxIterations; ++iter ) { kDebug(DviDebug).nospace() << "file not valid after iteration #" << iter << "/" << s_maxIterations << ", waiting for " << s_waitTime; #ifdef Q_OS_WIN Sleep( uint( s_waitTime ) ); #else struct timespec ts = { 0, s_waitTime * 1000 * 1000 }; nanosleep( &ts, NULL ); #endif } if ( iter >= s_maxIterations && !m_dviRenderer->isValidFile( fileName ) ) { kDebug(DviDebug) << "file still not valid after" << s_maxIterations; delete m_dviRenderer; m_dviRenderer = 0; return false; } #else if ( !m_dviRenderer->isValidFile( fileName ) ) { delete m_dviRenderer; m_dviRenderer = 0; return false; } #endif if ( ! m_dviRenderer->setFile( fileName, base ) ) { delete m_dviRenderer; m_dviRenderer = 0; return false; } kDebug(DviDebug) << "# of pages:" << m_dviRenderer->dviFile->total_pages; m_resolution = dpi().height(); loadPages( pagesVector ); return true; }
bool DjVuGenerator::loadDocument( const QString & fileName, QVector< Okular::Page * > & pagesVector ) { QMutexLocker locker( userMutex() ); if ( !m_djvu->openFile( fileName ) ) return false; locker.unlock(); loadPages( pagesVector, 0 ); return true; }
const Okular::DocumentSynopsis * DjVuGenerator::generateDocumentSynopsis() { QMutexLocker locker( userMutex() ); if ( m_docSyn ) return m_docSyn; const QDomDocument *doc = m_djvu->documentBookmarks(); if ( doc ) { m_docSyn = new Okular::DocumentSynopsis(); recurseCreateTOC( *m_docSyn, *doc, *m_docSyn, m_djvu ); } locker.unlock(); return m_docSyn; }
Okular::DocumentInfo DviGenerator::generateDocumentInfo( const QSet<Okular::DocumentInfo::Key> &keys ) const { Okular::DocumentInfo docInfo; if ( keys.contains( Okular::DocumentInfo::MimeType ) ) docInfo.set( Okular::DocumentInfo::MimeType, "application/x-dvi" ); QMutexLocker lock( userMutex() ); if ( m_dviRenderer && m_dviRenderer->dviFile ) { dvifile *dvif = m_dviRenderer->dviFile; // read properties from dvif //docInfo.set( "filename", dvif->filename, i18n("Filename") ); if ( keys.contains( Okular::DocumentInfo::CustomKeys ) ) docInfo.set( "generatorDate", dvif->generatorString, i18n("Generator/Date") ); if ( keys.contains( Okular::DocumentInfo::Pages ) ) docInfo.set( Okular::DocumentInfo::Pages, QString::number( dvif->total_pages ) ); } return docInfo; }
const Okular::DocumentInfo *DviGenerator::generateDocumentInfo() { if ( m_docInfo ) return m_docInfo; m_docInfo = new Okular::DocumentInfo(); m_docInfo->set( Okular::DocumentInfo::MimeType, "application/x-dvi" ); QMutexLocker lock( userMutex() ); if ( m_dviRenderer && m_dviRenderer->dviFile ) { dvifile *dvif = m_dviRenderer->dviFile; // read properties from dvif //m_docInfo->set( "filename", dvif->filename, i18n("Filename") ); m_docInfo->set( "generatorDate", dvif->generatorString, i18n("Generator/Date") ); m_docInfo->set( Okular::DocumentInfo::Pages, QString::number( dvif->total_pages ) ); } return m_docInfo; }