diff --git a/generators/kimgio/generator_kimgio.cpp b/generators/kimgio/generator_kimgio.cpp index 9be961f06..84c155b5a 100644 --- a/generators/kimgio/generator_kimgio.cpp +++ b/generators/kimgio/generator_kimgio.cpp @@ -12,6 +12,7 @@ #include "generator_kimgio.h" #include +#include #include #include #include @@ -63,53 +64,49 @@ KIMGIOGenerator::~KIMGIOGenerator() bool KIMGIOGenerator::loadDocument( const QString & fileName, QVector & pagesVector ) { - QMimeDatabase db; - const QString mime = db.mimeTypeForFile(fileName, QMimeDatabase::MatchContent).name(); - const QStringList types = KImageIO::typeForMime(mime); - const QByteArray type = !types.isEmpty() ? types[0].toAscii() : QByteArray(); - QImageReader reader( fileName, type ); - if ( !reader.read( &m_img ) ) { - emit error( i18n( "Unable to load document: %1", reader.errorString() ), -1 ); + QFile f( fileName ); + if ( !f.open(QFile::ReadOnly) ) { + emit error( i18n( "Unable to load document: %1", f.errorString() ), -1 ); return false; } - docInfo.set( Okular::DocumentInfo::MimeType, mime ); - - // Apply transformations dictated by Exif metadata - KExiv2Iface::KExiv2 exifMetadata; - if ( exifMetadata.load( fileName ) ) { - exifMetadata.rotateExifQImage( m_img, exifMetadata.getImageOrientation() ); - } - - pagesVector.resize( 1 ); - - Okular::Page * page = new Okular::Page( 0, m_img.width(), m_img.height(), Okular::Rotation0 ); - pagesVector[0] = page; - - return true; + return loadDocumentInternal( f.readAll(), fileName, pagesVector ); } bool KIMGIOGenerator::loadDocumentFromData( const QByteArray & fileData, QVector & pagesVector ) { - QMimeDatabase db; - const QString mime = db.mimeTypeForData(fileData).name(); - const QStringList types = KImageIO::typeForMime(mime); - const QByteArray type = !types.isEmpty() ? types[0].toAscii() : QByteArray(); - + return loadDocumentInternal( fileData, QString(), pagesVector ); +} + +bool KIMGIOGenerator::loadDocumentInternal(const QByteArray & fileData, const QString & fileName, QVector & pagesVector ) +{ QBuffer buffer; buffer.setData( fileData ); buffer.open( QIODevice::ReadOnly ); - QImageReader reader( &buffer, type ); + QImageReader reader( &buffer, QImageReader::imageFormat( &buffer ) ); + reader.setAutoDetectImageFormat( true ); if ( !reader.read( &m_img ) ) { emit error( i18n( "Unable to load document: %1", reader.errorString() ), -1 ); return false; } - docInfo.set( Okular::DocumentInfo::MimeType, mime ); + QMimeDatabase db; + auto mime = db.mimeTypeForFileNameAndData( fileName, fileData ); + docInfo.set( Okular::DocumentInfo::MimeType, mime.name() ); // Apply transformations dictated by Exif metadata KExiv2Iface::KExiv2 exifMetadata; if ( exifMetadata.loadFromData( fileData ) ) { - exifMetadata.rotateExifQImage( m_img, exifMetadata.getImageOrientation() ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) && QT_VERSION < QT_VERSION_CHECK(5, 4, 2) + // Qt 5.4 (up to 5.4.1) rotates jpeg images automatically with no way of disabling it + // See https://bugreports.qt.io/browse/QTBUG-37946 + // and https://codereview.qt-project.org/#/c/98013/ + // and https://codereview.qt-project.org/#/c/110668/ + if (reader.format() != QByteArrayLiteral("jpeg")) { + exifMetadata.rotateExifQImage( m_img, exifMetadata.getImageOrientation() ); + } +#else + exifMetadata.rotateExifQImage(m_img, exifMetadata.getImageOrientation()); +#endif } pagesVector.resize( 1 ); diff --git a/generators/kimgio/generator_kimgio.h b/generators/kimgio/generator_kimgio.h index 139c23032..1d7d89ed9 100644 --- a/generators/kimgio/generator_kimgio.h +++ b/generators/kimgio/generator_kimgio.h @@ -38,6 +38,9 @@ class KIMGIOGenerator : public Okular::Generator bool doCloseDocument(); QImage image( Okular::PixmapRequest * request ); + private: + bool loadDocumentInternal(const QByteArray & fileData, const QString & fileName, + QVector & pagesVector ); private: QImage m_img; Okular::DocumentInfo docInfo;