src/gui/image/qpixmapfilter.cpp
changeset 18 2f34d5167611
parent 3 41300fa6a67c
child 19 fcece45ef507
--- a/src/gui/image/qpixmapfilter.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/src/gui/image/qpixmapfilter.cpp	Fri Apr 16 15:50:13 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -422,6 +422,9 @@
     if(d->kernelWidth<=0 || d->kernelHeight <= 0)
         return;
 
+    if (src.isNull())
+        return;
+
     QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
         static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
     QPixmapConvolutionFilter *convolutionFilter = static_cast<QPixmapConvolutionFilter*>(filter);
@@ -602,7 +605,7 @@
 }
 
 template <int shift>
-inline int static_shift(int value)
+inline int qt_static_shift(int value)
 {
     if (shift == 0)
         return value;
@@ -613,15 +616,15 @@
 }
 
 template<int aprec, int zprec>
-inline void blurinner(uchar *bptr, int &zR, int &zG, int &zB, int &zA, int alpha)
+inline void qt_blurinner(uchar *bptr, int &zR, int &zG, int &zB, int &zA, int alpha)
 {
     QRgb *pixel = (QRgb *)bptr;
 
 #define Z_MASK (0xff << zprec)
-    const int A_zprec = static_shift<zprec - 24>(*pixel) & Z_MASK;
-    const int R_zprec = static_shift<zprec - 16>(*pixel) & Z_MASK;
-    const int G_zprec = static_shift<zprec - 8>(*pixel)  & Z_MASK;
-    const int B_zprec = static_shift<zprec>(*pixel)      & Z_MASK;
+    const int A_zprec = qt_static_shift<zprec - 24>(*pixel) & Z_MASK;
+    const int R_zprec = qt_static_shift<zprec - 16>(*pixel) & Z_MASK;
+    const int G_zprec = qt_static_shift<zprec - 8>(*pixel)  & Z_MASK;
+    const int B_zprec = qt_static_shift<zprec>(*pixel)      & Z_MASK;
 #undef Z_MASK
 
     const int zR_zprec = zR >> aprec;
@@ -636,17 +639,17 @@
 
 #define ZA_MASK (0xff << (zprec + aprec))
     *pixel =
-        static_shift<24 - zprec - aprec>(zA & ZA_MASK)
-        | static_shift<16 - zprec - aprec>(zR & ZA_MASK)
-        | static_shift<8 - zprec - aprec>(zG & ZA_MASK)
-        | static_shift<-zprec - aprec>(zB & ZA_MASK);
+        qt_static_shift<24 - zprec - aprec>(zA & ZA_MASK)
+        | qt_static_shift<16 - zprec - aprec>(zR & ZA_MASK)
+        | qt_static_shift<8 - zprec - aprec>(zG & ZA_MASK)
+        | qt_static_shift<-zprec - aprec>(zB & ZA_MASK);
 #undef ZA_MASK
 }
 
 const int alphaIndex = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3);
 
 template<int aprec, int zprec>
-inline void blurinner_alphaOnly(uchar *bptr, int &z, int alpha)
+inline void qt_blurinner_alphaOnly(uchar *bptr, int &z, int alpha)
 {
     const int A_zprec = int(*(bptr)) << zprec;
     const int z_zprec = z >> aprec;
@@ -655,7 +658,7 @@
 }
 
 template<int aprec, int zprec, bool alphaOnly>
-inline void blurrow(QImage & im, int line, int alpha)
+inline void qt_blurrow(QImage & im, int line, int alpha)
 {
     uchar *bptr = im.scanLine(line);
 
@@ -668,9 +671,9 @@
     const int im_width = im.width();
     for (int index = 0; index < im_width; ++index) {
         if (alphaOnly)
-            blurinner_alphaOnly<aprec, zprec>(bptr, zA, alpha);
+            qt_blurinner_alphaOnly<aprec, zprec>(bptr, zA, alpha);
         else
-            blurinner<aprec, zprec>(bptr, zR, zG, zB, zA, alpha);
+            qt_blurinner<aprec, zprec>(bptr, zR, zG, zB, zA, alpha);
         bptr += stride;
     }
 
@@ -679,9 +682,9 @@
     for (int index = im_width - 2; index >= 0; --index) {
         bptr -= stride;
         if (alphaOnly)
-            blurinner_alphaOnly<aprec, zprec>(bptr, zA, alpha);
+            qt_blurinner_alphaOnly<aprec, zprec>(bptr, zA, alpha);
         else
-            blurinner<aprec, zprec>(bptr, zR, zG, zB, zA, alpha);
+            qt_blurinner<aprec, zprec>(bptr, zR, zG, zB, zA, alpha);
     }
 }
 
@@ -710,7 +713,8 @@
         radius *= qreal(0.5);
 
     Q_ASSERT(img.format() == QImage::Format_ARGB32_Premultiplied
-             || img.format() == QImage::Format_RGB32);
+             || img.format() == QImage::Format_RGB32
+             || img.format() == QImage::Format_Indexed8);
 
     // choose the alpha such that pixels at radius distance from a fully
     // saturated pixel will have an alpha component of no greater than
@@ -723,7 +727,7 @@
     int img_height = img.height();
     for (int row = 0; row < img_height; ++row) {
         for (int i = 0; i <= improvedQuality; ++i)
-            blurrow<aprec, zprec, alphaOnly>(img, row, alpha);
+            qt_blurrow<aprec, zprec, alphaOnly>(img, row, alpha);
     }
 
     QImage temp(img.height(), img.width(), img.format());
@@ -756,7 +760,7 @@
     img_height = temp.height();
     for (int row = 0; row < img_height; ++row) {
         for (int i = 0; i <= improvedQuality; ++i)
-            blurrow<aprec, zprec, alphaOnly>(temp, row, alpha);
+            qt_blurrow<aprec, zprec, alphaOnly>(temp, row, alpha);
     }
 
     if (transposed == 0) {
@@ -902,6 +906,9 @@
     if (!painter->isActive())
         return;
 
+    if (src.isNull())
+        return;
+
     QRectF srcRect = rect;
     if (srcRect.isNull())
         srcRect = src.rect();
@@ -953,7 +960,7 @@
         srcRect = dest.rect();
         destRect = dest.rect();
     }
-    if (image != dest) {
+    if (&image != &dest) {
         destRect.moveTo(QPoint(0, 0));
     }
 
@@ -1082,6 +1089,10 @@
 void QPixmapColorizeFilter::draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect) const
 {
     Q_D(const QPixmapColorizeFilter);
+
+    if (src.isNull())
+        return;
+
     QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
         static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
     QPixmapColorizeFilter *colorizeFilter = static_cast<QPixmapColorizeFilter*>(filter);
@@ -1312,6 +1323,10 @@
                                    const QRectF &src) const
 {
     Q_D(const QPixmapDropShadowFilter);
+
+    if (px.isNull())
+        return;
+
     QPixmapFilter *filter = p->paintEngine() && p->paintEngine()->isExtended() ?
         static_cast<QPaintEngineEx *>(p->paintEngine())->pixmapFilter(type(), this) : 0;
     QPixmapDropShadowFilter *dropShadowFilter = static_cast<QPixmapDropShadowFilter*>(filter);