diff --git a/generators/tiff/generator_tiff.cpp b/generators/tiff/generator_tiff.cpp index fb2a934db..25831bbe5 100644 --- a/generators/tiff/generator_tiff.cpp +++ b/generators/tiff/generator_tiff.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -27,6 +28,8 @@ #include #include +#define TiffDebug 4714 + class TIFFGenerator::Private { public: @@ -102,6 +105,7 @@ bool TIFFGenerator::doCloseDocument() d->tiff = 0; delete m_docInfo; m_docInfo = 0; + m_pageMapping.clear(); } return true; @@ -112,7 +116,7 @@ QImage TIFFGenerator::image( Okular::PixmapRequest * request ) bool generated = false; QImage img; - if ( TIFFSetDirectory( d->tiff, request->page()->number() ) ) + if ( TIFFSetDirectory( d->tiff, mapPage( request->page()->number() ) ) ) { int rotation = request->page()->rotation(); uint32 width = (uint32)request->page()->width(); @@ -197,6 +201,7 @@ void TIFFGenerator::loadPages( QVector & pagesVector ) tdir_t dirs = TIFFNumberOfDirectories( d->tiff ); pagesVector.resize( dirs ); + tdir_t realdirs = 0; uint32 width = 0; uint32 height = 0; @@ -210,11 +215,15 @@ void TIFFGenerator::loadPages( QVector & pagesVector ) TIFFGetField( d->tiff, TIFFTAG_IMAGELENGTH, &height ) != 1 ) continue; - delete pagesVector[i]; - Okular::Page * page = new Okular::Page( i, width, height, Okular::Rotation0 ); - pagesVector[i] = page; + Okular::Page * page = new Okular::Page( realdirs, width, height, Okular::Rotation0 ); + pagesVector[ realdirs ] = page; + m_pageMapping[ realdirs ] = i; + + ++realdirs; } + + pagesVector.resize( realdirs ); } bool TIFFGenerator::print( QPrinter& printer ) @@ -231,7 +240,7 @@ bool TIFFGenerator::print( QPrinter& printer ) for ( tdir_t i = 0; i < pageList.count(); ++i ) { - if ( !TIFFSetDirectory( d->tiff, pageList[i] - 1 ) ) + if ( !TIFFSetDirectory( d->tiff, mapPage( pageList[i] - 1 ) ) ) continue; if ( TIFFGetField( d->tiff, TIFFTAG_IMAGEWIDTH, &width ) != 1 || @@ -263,5 +272,16 @@ bool TIFFGenerator::print( QPrinter& printer ) return true; } +int TIFFGenerator::mapPage( int page ) const +{ + QHash< int, int >::const_iterator it = m_pageMapping.find( page ); + if ( it == m_pageMapping.end() ) + { + kWarning(TiffDebug) << "Requesting unmapped page" << page << ":" << m_pageMapping; + return -1; + } + return it.value(); +} + #include "generator_tiff.moc" diff --git a/generators/tiff/generator_tiff.h b/generators/tiff/generator_tiff.h index 5a6e263ce..4c0cc6368 100644 --- a/generators/tiff/generator_tiff.h +++ b/generators/tiff/generator_tiff.h @@ -12,6 +12,8 @@ #include +#include + class TIFFGenerator : public Okular::Generator { Q_OBJECT @@ -34,8 +36,10 @@ class TIFFGenerator : public Okular::Generator Private * const d; void loadPages( QVector & pagesVector ); + int mapPage( int page ) const; Okular::DocumentInfo * m_docInfo; + QHash< int, int > m_pageMapping; }; #endif