Don't rotate images with Qt 5.4.0 and 5.4.1

There was behaviour change that automatically rotated jpeg images based
on exif metadata that was reverted in 5.4.2.
We now skip rotating with those two version to prevent rotating twice.

Also shared some code so that the #ifdef does not need to be added to
both methods

REVIEW: 123895
frameworks
Alex Richardson 11 years ago
parent 824a35ced0
commit bb22f7d3f1
  1. 55
      generators/kimgio/generator_kimgio.cpp
  2. 3
      generators/kimgio/generator_kimgio.h

@ -12,6 +12,7 @@
#include "generator_kimgio.h"
#include <QBuffer>
#include <QFile>
#include <QImageReader>
#include <QPainter>
#include <QPrinter>
@ -63,53 +64,49 @@ KIMGIOGenerator::~KIMGIOGenerator()
bool KIMGIOGenerator::loadDocument( const QString & fileName, QVector<Okular::Page*> & 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<Okular::Page*> & 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<Okular::Page*> & 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 );

@ -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<Okular::Page*> & pagesVector );
private:
QImage m_img;
Okular::DocumentInfo docInfo;

Loading…
Cancel
Save