From 1cef7c2a8d0f9ae5310b98100c19b6f3c5951346 Mon Sep 17 00:00:00 2001 From: Jacopo De Simoi Date: Thu, 5 Aug 2010 21:15:18 +0000 Subject: [PATCH] Implement mask caching for a number of different sizes. The number of cached masks is now capped in a rather brutal way, in practice it should work well for most cases. svn path=/trunk/KDE/kdelibs/; revision=1159649 --- framesvg.cpp | 12 +++++++++--- private/framesvg_p.h | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/framesvg.cpp b/framesvg.cpp index 3afe41f70..aa83402ab 100644 --- a/framesvg.cpp +++ b/framesvg.cpp @@ -282,8 +282,15 @@ QPixmap FrameSvg::alphaMask() const QRegion FrameSvg::mask() const { FrameData *frame = d->frames[d->prefix]; - frame->cachedMask = QRegion(QBitmap(d->alphaMask().alphaChannel().createMaskFromColor(Qt::black))); - return frame->cachedMask; + QString id = d->cacheId(frame, QString()); + if (!frame->cachedMasks.contains(id)) { + //TODO: Implement a better way to cap the number of cached masks + if (frame->cachedMasks.count() > frame->MAX_CACHED_MASKS) { + frame->cachedMasks.clear(); + } + frame->cachedMasks.insert(id, QRegion(QBitmap(d->alphaMask().alphaChannel().createMaskFromColor(Qt::black)))); + } + return frame->cachedMasks[id]; } void FrameSvg::setCacheAllRenderedFrames(bool cache) @@ -707,7 +714,6 @@ void FrameSvgPrivate::updateSizes() const QSize s = q->size(); q->resize(); frame->cachedBackground = QPixmap(); - frame->cachedMask = QRegion(); if (frame->enabledBorders & FrameSvg::TopBorder) { frame->topHeight = q->elementSize(prefix + "top").height(); diff --git a/private/framesvg_p.h b/private/framesvg_p.h index e51cddb89..a3c94eaa8 100644 --- a/private/framesvg_p.h +++ b/private/framesvg_p.h @@ -69,7 +69,9 @@ public: FrameSvg::EnabledBorders enabledBorders; QPixmap cachedBackground; - QRegion cachedMask; + QHash cachedMasks; + static const int MAX_CACHED_MASKS = 10; + QSize frameSize; //measures