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
This commit is contained in:
Jacopo De Simoi 2010-08-05 21:15:18 +00:00
parent 87548d03c1
commit 1cef7c2a8d
2 changed files with 12 additions and 4 deletions

View File

@ -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();

View File

@ -69,7 +69,9 @@ public:
FrameSvg::EnabledBorders enabledBorders;
QPixmap cachedBackground;
QRegion cachedMask;
QHash<QString, QRegion> cachedMasks;
static const int MAX_CACHED_MASKS = 10;
QSize frameSize;
//measures