diff options
author | Peter Penz <ppenz@openismus.com> | 2011-01-14 13:42:52 +0100 |
---|---|---|
committer | Holger Schröder <holger.schroeder.ext@basyskom.de> | 2011-01-25 16:32:26 +0100 |
commit | b5231ff074f7cc3e7f16dd0636e124d5ceb7c043 (patch) | |
tree | 3b359fcbce9e6c092066bc363f5b7298a2a6b280 | |
parent | 4e94468f9498371082c810dedc6688af731bae5b (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.cpp | 12 | ||||
-rw-r--r-- | src/corelib/painting/mscalableimage_p.h | 2 |
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; }; |