diff --git a/digikam-2.0.0-qt_rasterengine.patch b/digikam-2.0.0-qt_rasterengine.patch new file mode 100644 index 0000000..89d37d3 --- /dev/null +++ b/digikam-2.0.0-qt_rasterengine.patch @@ -0,0 +1,93 @@ +commit 2b739c70f008ac2538eb635b7334104167ad0a50 +Author: Marcel Wiesweg +Date: Sat Aug 6 16:51:41 2011 +0200 + + Pass a persistent QImage to QPixmap::fromImage when paint engine is raster. + For native engines, a temporary QImage can be provided, but raster will just take + and store the QImage, so a memcpy is needed. + The paint engine relevant for pixmaps can be detected by opening a painter on a + 1x1 pixmap and querying the QPaintEngine. For optimization, this is done only once + per application lifetime because DImg::convertToPixmap is very time critical. + + BUG: 278320 + +--- a/libs/dimg/dimg.cpp ++++ b/libs/dimg/dimg.cpp +@@ -47,6 +47,8 @@ extern "C" + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -55,6 +57,7 @@ extern "C" + // KDE includes + + #include ++#include + + // LibKDcraw includes + +@@ -1768,6 +1771,34 @@ QImage DImg::copyQImage(int x, int y, int w, int h) const + return img.copyQImage(); + } + ++class PixmapPaintEngineDetector ++{ ++public: ++ ++ PixmapPaintEngineDetector() ++ : m_isRaster(detectRasterFromPixmap()) ++ { ++ } ++ ++ bool isRaster() const ++ { ++ return m_isRaster; ++ } ++ ++private: ++ ++ static bool detectRasterFromPixmap() ++ { ++ QPixmap pix(1,1); ++ QPainter p(&pix); ++ return p.paintEngine() && p.paintEngine()->type() == QPaintEngine::Raster; ++ } ++ ++ const bool m_isRaster; ++}; ++ ++K_GLOBAL_STATIC(PixmapPaintEngineDetector, pixmapPaintEngineDetector) ++ + QPixmap DImg::convertToPixmap() const + { + if (isNull()) +@@ -1796,18 +1827,21 @@ QPixmap DImg::convertToPixmap() const + sptr += 4; + } + +- // NOTE: Qt4 do not provide anymore QImage::setAlphaChannel() because + // alpha channel is auto-detected during QImage->QPixmap conversion +- + return QPixmap::fromImage(img); + } + else + { ++ // This is a temporary image operating on the DImg buffer + QImage img(bits(), width(), height(), hasAlpha() ? QImage::Format_ARGB32 : QImage::Format_RGB32); + +- // NOTE: Qt4 do not provide anymore QImage::setAlphaChannel() because +- // alpha channel is auto-detected during QImage->QPixmap conversion ++ // For paint engines which base the QPixmap internally on a QImage, we must use a persistent QImage ++ if (pixmapPaintEngineDetector->isRaster()) ++ { ++ img = img.copy(); ++ } + ++ // alpha channel is auto-detected during QImage->QPixmap conversion + return QPixmap::fromImage(img); + } + } diff --git a/digikam.spec b/digikam.spec index ce2a91d..11e6a75 100644 --- a/digikam.spec +++ b/digikam.spec @@ -1,7 +1,7 @@ Name: digikam Version: 2.0.0 -Release: 2%{?pre}%{?dist} +Release: 3%{?pre}%{?dist} Summary: A digital camera accessing & photo management application License: GPLv2+ @@ -16,6 +16,7 @@ Source1: digikam-import.desktop ## upstreamable patches ## upstream patches +Patch100: digikam-2.0.0-qt_rasterengine.patch BuildRequires: desktop-file-utils BuildRequires: doxygen @@ -181,6 +182,10 @@ Requires: kipi-plugins = %{version}-%{release} %prep %setup -q -n %{name}-%{version}%{?pre:-%{pre}} +pushd core +%patch100 -p1 -b .qt_rasterengine +popd + %build @@ -423,6 +428,9 @@ update-desktop-database -q &> /dev/null %changelog +* Thu Aug 18 2011 Rex Dieter 2.0.0-3 +- digikam crashes with "-graphicssystem raster" (#726971) + * Tue Aug 02 2011 Rex Dieter 2.0.0-2 - new libkface, libkgeomap, libmediawiki subpkgs (#727570) - remove rpm cruft (%%clean, %%defattr, Group:, BuildRoot:)