aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickpixmapcache.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar@sletta.org>2014-10-03 16:12:56 +0200
committerGunnar Sletta <gunnar@sletta.org>2014-10-09 15:47:36 +0200
commit5a0eb9bebc002cc6e8de2dad6247c2b419571ade (patch)
tree729457a98538341094c9277a6bc805feec4fb9ee /src/quick/util/qquickpixmapcache.cpp
parent918dbea80119a5ded09909f8261e86140ceb6f7c (diff)
Remove alpha channel from images that doesn't actually have alpha.
We did this for QPixmap since forever, and it has a huge impact on rendering performance, so there is no reason why we shouldn't spend that extra bit of time. Change-Id: Ibd2e6d585525a5b5a975b8d7498c21dec00647c5 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/util/qquickpixmapcache.cpp')
-rw-r--r--src/quick/util/qquickpixmapcache.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/quick/util/qquickpixmapcache.cpp b/src/quick/util/qquickpixmapcache.cpp
index 0764665182..22ed9b7486 100644
--- a/src/quick/util/qquickpixmapcache.cpp
+++ b/src/quick/util/qquickpixmapcache.cpp
@@ -40,6 +40,7 @@
#include <private/qqmlengine_p.h>
#include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/private/qimage_p.h>
#include <qpa/qplatformintegration.h>
#include <QtQuick/private/qsgtexture_p.h>
@@ -331,6 +332,29 @@ QNetworkAccessManager *QQuickPixmapReader::networkAccessManager()
return accessManager;
}
+static void maybeRemoveAlpha(QImage *image)
+{
+ // If the image
+ if (image->hasAlphaChannel() && image->data_ptr()
+ && !image->data_ptr()->checkForAlphaPixels()) {
+ switch (image->format()) {
+ case QImage::Format_RGBA8888:
+ case QImage::Format_RGBA8888_Premultiplied:
+ *image = image->convertToFormat(QImage::Format_RGBX8888);
+ break;
+ case QImage::Format_A2BGR30_Premultiplied:
+ *image = image->convertToFormat(QImage::Format_BGR30);
+ break;
+ case QImage::Format_A2RGB30_Premultiplied:
+ *image = image->convertToFormat(QImage::Format_RGB30);
+ break;
+ default:
+ *image = image->convertToFormat(QImage::Format_RGB32);
+ break;
+ }
+ }
+}
+
static bool readImage(const QUrl& url, QIODevice *dev, QImage *image, QString *errorString, QSize *impsize,
const QSize &requestSize)
{
@@ -360,6 +384,7 @@ static bool readImage(const QUrl& url, QIODevice *dev, QImage *image, QString *e
*impsize = imgio.size();
if (imgio.read(image)) {
+ maybeRemoveAlpha(image);
if (impsize && impsize->width() < 0)
*impsize = image->size();
return true;