From 26c257202d5741f040cdc14626c3fbf24943e93d Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 8 Oct 2013 16:30:37 +0200 Subject: [PATCH] kimgio generator: Apply transformations dictated by Exif metadata BUG: 322920 FIXED-IN: 4.12.0 REVIEW: 111793 --- generators/CMakeLists.txt | 7 +- generators/kimgio/CMakeLists.txt | 10 +- generators/kimgio/generator_kimgio.cpp | 14 +++ .../tests/data/testExifOrientation-0.jpg | Bin 0 -> 447 bytes .../data/testExifOrientation-0mirror.jpg | Bin 0 -> 457 bytes .../tests/data/testExifOrientation-180.jpg | Bin 0 -> 463 bytes .../data/testExifOrientation-180mirror.jpg | Bin 0 -> 456 bytes .../tests/data/testExifOrientation-270.jpg | Bin 0 -> 456 bytes .../data/testExifOrientation-270mirror.jpg | Bin 0 -> 447 bytes .../tests/data/testExifOrientation-90.jpg | Bin 0 -> 456 bytes .../data/testExifOrientation-90mirror.jpg | Bin 0 -> 462 bytes .../tests/data/testExifOrientation-noexif.jpg | Bin 0 -> 347 bytes .../data/testExifOrientation-unspecified.jpg | Bin 0 -> 367 bytes generators/kimgio/tests/kimgiotest.cpp | 101 ++++++++++++++++++ 14 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 generators/kimgio/tests/data/testExifOrientation-0.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-0mirror.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-180.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-180mirror.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-270.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-270mirror.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-90.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-90mirror.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-noexif.jpg create mode 100644 generators/kimgio/tests/data/testExifOrientation-unspecified.jpg create mode 100644 generators/kimgio/tests/kimgiotest.cpp diff --git a/generators/CMakeLists.txt b/generators/CMakeLists.txt index 531cc6e38..8653665ec 100644 --- a/generators/CMakeLists.txt +++ b/generators/CMakeLists.txt @@ -8,6 +8,9 @@ macro_log_feature(HAVE_POPPLER_0_12_1 "Poppler-Qt4" "A PDF rendering library" "h macro_optional_find_package(LibSpectre) macro_log_feature(LIBSPECTRE_FOUND "libspectre" "A PostScript rendering library" "http://libspectre.freedesktop.org/wiki/" FALSE "${LIBSPECTRE_MINIMUM_VERSION}" "Support for PS files in okular.") +macro_optional_find_package(Kexiv2) +macro_log_feature(KEXIV2_FOUND "LibKExiv2" "Wrapper around Exiv2 library" "http://www.digikam.org/sharedlibs" FALSE "" "Support for image files") + macro_optional_find_package(CHM) macro_log_feature(CHM_FOUND "CHM" "A library for dealing with Microsoft ITSS/CHM format files" "http://www.jedrea.com/chmlib" FALSE "" "Support CHM files in okular.") @@ -38,7 +41,9 @@ if(LIBSPECTRE_FOUND) add_subdirectory(spectre) endif(LIBSPECTRE_FOUND) -add_subdirectory( kimgio ) +if(KEXIV2_FOUND) + add_subdirectory( kimgio ) +endif(KEXIV2_FOUND) if(CHM_FOUND) add_subdirectory( chm ) diff --git a/generators/kimgio/CMakeLists.txt b/generators/kimgio/CMakeLists.txt index b0a61eb70..f751f9934 100644 --- a/generators/kimgio/CMakeLists.txt +++ b/generators/kimgio/CMakeLists.txt @@ -1,5 +1,8 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../.. + ${CMAKE_BINARY_DIR} + ${QIMAGEBLITZ_INCLUDES} + ${KEXIV2_INCLUDE_DIR} ) @@ -9,11 +12,12 @@ set(okularGenerator_kimgio_PART_SRCS generator_kimgio.cpp ) kde4_add_plugin(okularGenerator_kimgio ${okularGenerator_kimgio_PART_SRCS}) - -target_link_libraries(okularGenerator_kimgio okularcore ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${QT_QTXML_LIBRARY} ) - +target_link_libraries(okularGenerator_kimgio okularcore ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${QT_QTXML_LIBRARY} ${KEXIV2_LIBRARIES} ) install(TARGETS okularGenerator_kimgio DESTINATION ${PLUGIN_INSTALL_DIR}) +kde4_add_unit_test( kimgiotest tests/kimgiotest.cpp ../../ui/pagepainter.cpp ../../ui/guiutils.cpp ../../settings.cpp ) +target_link_libraries( kimgiotest ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${QT_QTGUI_LIBRARY} ${QT_QTTEST_LIBRARY} ${QIMAGEBLITZ_LIBRARIES} okularcore ) + ########### install files ############### diff --git a/generators/kimgio/generator_kimgio.cpp b/generators/kimgio/generator_kimgio.cpp index 1badab34e..06c2c7ac3 100644 --- a/generators/kimgio/generator_kimgio.cpp +++ b/generators/kimgio/generator_kimgio.cpp @@ -23,6 +23,8 @@ #include #include +#include + #include static KAboutData createAboutData() @@ -82,6 +84,12 @@ bool KIMGIOGenerator::loadDocument( const QString & fileName, QVectorBm<7<_#hv=|r|I2c$Ng&3HDEJh$? zV3cBD1+y6#ycnh7>>x%Bs2U~)1}0&IdZ1bmNC0A>ZjcQOjQ?*lID>4Y2!ITs$N-S$ z{|6WZIT)B2n3)-s7?=bZnFSgDA7Ky$Iu7VgWWWU!mK1>4hY)9DWnpGu0!oQsXkY+| z3Zfgs@c$MA4>KdsDrP|jdxpJDDW{sWGBkqSk9LaH85$n$JT|9brO|Trw7!aqi!Xjo kp2+b>Q{t0%uT-4R=B4LO&*qc4V_fj`^wa0_`2XJo0D|>B9RL6T literal 0 HcmV?d00001 diff --git a/generators/kimgio/tests/data/testExifOrientation-0mirror.jpg b/generators/kimgio/tests/data/testExifOrientation-0mirror.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12a49f4bc64f769afb04a6f93eef70a47e5d0e8a GIT binary patch literal 457 zcmex=Bm<7<_#hv=|r|I2c$Ng&3HDEJg+< zAR)!T3T87fcri-D*+GmN2sKQ?P&Ok_B?Ke@DG(260|Vp#+YHVi8z}-HLntx;r1}2= z20;#>x0sn3l^B==8JPtc{~uux1v(DsPGrCZ6qXlYU}9up0tE#Wu(Gi;uyBYna|(-y z0TqZ~Xk!403Zfgv@c$MA4>K@01(^jI>=`!C^j@FCIw$Vjso*&NB$k6}Te9t@xlY-* wOnidejV+DG*R|c-Zl)@ppuZwsKttecBX_@p#lgqAHDO_4cVx1Hn*ZMf0Qadoi~s-t literal 0 HcmV?d00001 diff --git a/generators/kimgio/tests/data/testExifOrientation-180.jpg b/generators/kimgio/tests/data/testExifOrientation-180.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41fd545bd85623b3834d506390e1a8d803609ad1 GIT binary patch literal 463 zcmex=Bm<7<_#hv=|r|I2c$Ng&3HDEJhH? zD8;}EW-~B&F-pVPL5vzuHB1Z)Ou|q$BTyv-BmgN84`>4eGI7|v{TMopcnGew&G8{%|RoUPrG;S+-d$!(~JNA FO#lNsLNx#Y literal 0 HcmV?d00001 diff --git a/generators/kimgio/tests/data/testExifOrientation-180mirror.jpg b/generators/kimgio/tests/data/testExifOrientation-180mirror.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60f8e446d83ccd0e4b104446f6b512d6c46d9ef2 GIT binary patch literal 456 zcmex=Bm<7<_#hv=|r|I2c$Ng&3HDEJg+v zAR)!T3T87fcri-D*+GmNP&G^p3{1jMHX~3a1S9|{5D#br1LObO49*}MDFPrvC^7(~ z`Tqe1K@J8c24-ePB?cxzMrJ|A|3?@^fsO;Z6B%#;g=GYQ-eO`#l44Bm<7<_#hv=|r|I2c$Ng&3HDEJh%k zfl-Qq70hN}@M4sPvx68lplX;H7?^~iY(}6;2uJ`@ARf>L2FCxl8Js~jQUpMTP-Fl| z^Zx@3f*e4{GBGnMF)#@-G7B>PKf)jibR5u~$bbtdEF%C>i4bRDWn*Aw;^1Tl%8Fp< zVE~B=qMO9<{}uxeGb7M8WBm<7<_#hv=|r|I2c$Ng&3HDEJg-a zARz@Jfoui_FGguNJBU#Os)mVyfk_z32C0I81Rw?C0c~Jl{C}Il8Dt|x0AvV727omG zKfoZ!0dy=AGoum%lOQ9rAmjfd45C2C0o{oVxPZcv0ucKU;%uxeK)paI5ey9sAW=bd zV;KJ5V&GwB1X{%`$Y9T~w<+aRlU9aCu=~+Yu{uM;!=1;S*n*fO~Js|)9 literal 0 HcmV?d00001 diff --git a/generators/kimgio/tests/data/testExifOrientation-90.jpg b/generators/kimgio/tests/data/testExifOrientation-90.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3a2182f9eddd1a8878591799a57f6894a75ddba GIT binary patch literal 456 zcmex=Bm<7<_#hv=|r|I2c$Ng&3HDEJg-4 zAR)!T3T87fcri-D*+GmNP&G^p3{1jMHX~3a1S9|{5D#br1LObO49*}MDFPrvC^7(~ z`Tqe1K@Ol}nV1=s7?=bZnFSgDA7Ky$Iu7VgWWWU!mJ?uLVq{@Pl450NV_@MBWfl?R z1j>tG=wbkg3LsONNcpQ#Rn=IzN xhEMpS-wn=+kWDe=zOr&kcFOq*dJb(H1Qs^Fv6c;NezRuB4&5DBma_l92>|VEJRbl6 literal 0 HcmV?d00001 diff --git a/generators/kimgio/tests/data/testExifOrientation-90mirror.jpg b/generators/kimgio/tests/data/testExifOrientation-90mirror.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04e7301be08e1fafd27f057661172d2873753956 GIT binary patch literal 462 zcmex=Bm<7<_#hv=|r|I2c$Ng&3HDEJg-) zAR)!T3T87fcri-D*+GmNP&G^p3{1jMHX~3a1S9|{5D#br1LObO49*}MDFPrvC^7(~ z`Tqe1K@Ol}nV1=s7?=bZnFSgDA7Ky$Iu7VgWWWg&RuEudWM*bXl450J2kK_ws4o6 zdujUlOo;jOfZpF1wt6mcEZ0&q+10Q=V7`D&eOk#%W63{tfku)$x92~(6EsEs|4jhZ C9zrPq literal 0 HcmV?d00001 diff --git a/generators/kimgio/tests/data/testExifOrientation-noexif.jpg b/generators/kimgio/tests/data/testExifOrientation-noexif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d0a50bb6d6aa33e6d753644b80096ad959896d4 GIT binary patch literal 347 zcmex=>2hprJQQg%FqaQKiVl)XJ~l1^Vpn%l}5|e)A}kdF249Vc_POjO^Hw5y;5;Lo0pzD UJ)2MFj&Z@$(@&qz * + * * + * 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 + +#include "../generator_kimgio.h" +#include "../../settings_core.h" + +#include +#include +#include + +#include +#include +#include +#include + +class KIMGIOTest +: public QObject +{ + Q_OBJECT + + private slots: + void testExifOrientation_data(); + void testExifOrientation(); +}; + +// The following images have different Exif orientation tags, but they all +// are a 3x2 rectangle whose top-left pixel is black, and whose other pixels are +// white. Note that, due to JPEG lossy compression, some pixels are not pure +// white. In testExifOrientation, we only check the top-left and bottom-right +// corners. +void KIMGIOTest::testExifOrientation_data() +{ + QTest::addColumn( "imgPath" ); + + // No Exif metadata at all + QTest::newRow( "No Exif metadata" ) << KDESRCDIR "tests/data/testExifOrientation-noexif.jpg"; + + // No Exif orientation information + QTest::newRow( "Unspecified" ) << KDESRCDIR "tests/data/testExifOrientation-unspecified.jpg"; + + // Valid Orientation values + QTest::newRow( "Horizontal (normal)" ) << KDESRCDIR "tests/data/testExifOrientation-0.jpg"; + QTest::newRow( "Mirror horizontal" ) << KDESRCDIR "tests/data/testExifOrientation-0mirror.jpg"; + QTest::newRow( "Rotate 90 CW" ) << KDESRCDIR "tests/data/testExifOrientation-90.jpg"; + QTest::newRow( "Mirror horizontal and rotate 90 CW" ) << KDESRCDIR "tests/data/testExifOrientation-90mirror.jpg"; + QTest::newRow( "Rotate 180" ) << KDESRCDIR "tests/data/testExifOrientation-180.jpg"; + QTest::newRow( "Mirror vertical" ) << KDESRCDIR "tests/data/testExifOrientation-180mirror.jpg"; + QTest::newRow( "Rotate 270 CW" ) << KDESRCDIR "tests/data/testExifOrientation-270.jpg"; + QTest::newRow( "Mirror horizontal and rotate 270 CW" ) << KDESRCDIR "tests/data/testExifOrientation-270mirror.jpg"; +} + +void KIMGIOTest::testExifOrientation() +{ + QFETCH( QString, imgPath ); + + Okular::SettingsCore::instance( "kimgiotest" ); + Okular::Document *m_document = new Okular::Document( 0 ); + const KMimeType::Ptr mime = KMimeType::findByPath( imgPath ); + + Okular::DocumentObserver *dummyDocumentObserver = new Okular::DocumentObserver(); + m_document->addObserver( dummyDocumentObserver ); + + // Load image + m_document->openDocument( imgPath, KUrl(), mime ); + m_document->setRotation( 0 ); // Test the default rotation + QCOMPARE( m_document->pages(), 1u ); + + // Check size + QCOMPARE( m_document->page(0)->width(), double(3) ); + QCOMPARE( m_document->page(0)->height(), double(2) ); + + // Generate pixmap + Okular::PixmapRequest *req = new Okular::PixmapRequest( dummyDocumentObserver, 0, 3, 2, + 1, Okular::PixmapRequest::NoFeature ); + m_document->requestPixmaps( QLinkedList() << req ); + QVERIFY( m_document->page(0)->hasPixmap( dummyDocumentObserver, 3, 2 ) ); + + // Obtain image + QImage img( 3, 2, QImage::Format_ARGB32_Premultiplied ); + QPainter p( &img ); + PagePainter::paintPageOnPainter( &p, m_document->page(0), dummyDocumentObserver, 0, 3, 2, QRect(0, 0, 3, 2) ); + + // Verify pixel data + QCOMPARE( img.pixel(0, 0), qRgb(0, 0, 0) ); + QCOMPARE( img.pixel(2, 1), qRgb(255, 255, 255) ); + + m_document->removeObserver( dummyDocumentObserver ); + delete dummyDocumentObserver; + delete m_document; +} + +QTEST_KDEMAIN( KIMGIOTest, GUI ) +#include "kimgiotest.moc"