aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <ppenz@openismus.com>2011-01-14 13:42:52 +0100
committerHolger Schröder <holger.schroeder.ext@basyskom.de>2011-01-25 16:32:26 +0100
commitb5231ff074f7cc3e7f16dd0636e124d5ceb7c043 (patch)
tree3b359fcbce9e6c092066bc363f5b7298a2a6b280
parent4e94468f9498371082c810dedc6688af731bae5b (diff)
Changes: MScalableImage: Remove cached pixmap from QPixmapCache manually
RevBy: Armin Berres Details: Currently the scalable image gets cached in QPixmapCache if it is not rendered by an OpenGL-backend. But it does not get removed manually, which leads to an unnecessary increasing of QPixmapCache. Although QPixmapCache internally takes care to release pixmaps that are not used during a specific period of time, not manually releasing results in several MB of additional peak for some usecases.
-rw-r--r--src/corelib/painting/mscalableimage.cpp12
-rw-r--r--src/corelib/painting/mscalableimage_p.h2
2 files changed, 14 insertions, 0 deletions
diff --git a/src/corelib/painting/mscalableimage.cpp b/src/corelib/painting/mscalableimage.cpp
index f3d07783..76487a0b 100644
--- a/src/corelib/painting/mscalableimage.cpp
+++ b/src/corelib/painting/mscalableimage.cpp
@@ -35,6 +35,10 @@ MScalableImagePrivate::MScalableImagePrivate()
MScalableImagePrivate::~MScalableImagePrivate()
{
+ if (!cachedImageKey.isEmpty()) {
+ QPixmapCache::remove(cachedImageKey);
+ cachedImageKey.clear();
+ }
}
void MScalableImagePrivate::validateSize() const
@@ -133,6 +137,9 @@ void MScalableImagePrivate::drawScalable9(qreal x, qreal y, qreal w, qreal h, QP
// draw to screen
painter->drawPixmap(x, y, scaled);
QPixmapCache::insert(key, scaled);
+
+ // remember the key so that the entry can be removed on-demand
+ const_cast<MScalableImagePrivate*>(this)->cachedImageKey = key;
} else {
// caching isn't permitted for this case; scale and render direct to screen.
#if defined(M_OS_MAEMO5)
@@ -145,6 +152,11 @@ void MScalableImagePrivate::drawScalable9(qreal x, qreal y, qreal w, qreal h, QP
drawBorderPixmap(painter, QRectF(x, y, w, h), margins, *m_image);
painter->setRenderHint(QPainter::SmoothPixmapTransform, enabled);
#endif //defined(M_OS_MAEMO5)
+
+ if (!cachedImageKey.isEmpty()) {
+ QPixmapCache::remove(cachedImageKey);
+ const_cast<MScalableImagePrivate*>(this)->cachedImageKey.clear();
+ }
}
}
}
diff --git a/src/corelib/painting/mscalableimage_p.h b/src/corelib/painting/mscalableimage_p.h
index 7229d5da..7c065a26 100644
--- a/src/corelib/painting/mscalableimage_p.h
+++ b/src/corelib/painting/mscalableimage_p.h
@@ -86,6 +86,8 @@ public:
QString pixmapId;
+ QString cachedImageKey;
+
protected:
MScalableImage *q_ptr;
};