diff options
author | Gunnar Sletta <gunnar@sletta.org> | 2014-10-03 16:12:56 +0200 |
---|---|---|
committer | Gunnar Sletta <gunnar@sletta.org> | 2014-10-09 15:47:36 +0200 |
commit | 5a0eb9bebc002cc6e8de2dad6247c2b419571ade (patch) | |
tree | 729457a98538341094c9277a6bc805feec4fb9ee /src/quick/util/qquickpixmapcache.cpp | |
parent | 918dbea80119a5ded09909f8261e86140ceb6f7c (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.cpp | 25 |
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; |