allow caching to be turned off for Svg objects which won't benefit from it

svn path=/trunk/KDE/kdelibs/; revision=967623
This commit is contained in:
Aaron J. Seigo 2009-05-13 16:07:58 +00:00
parent ba9927eadf
commit 0ab881867d
2 changed files with 48 additions and 11 deletions

37
svg.cpp
View File

@ -70,11 +70,15 @@ class SvgPrivate
: q(svg), : q(svg),
saveTimer(0), saveTimer(0),
renderer(0), renderer(0),
lastModified(0),
multipleImages(false), multipleImages(false),
themed(false), themed(false),
applyColors(false), applyColors(false),
lastModified(0) cacheRendering(true)
{ {
saveTimer = new QTimer(q);
saveTimer->setSingleShot(true);
QObject::connect(saveTimer, SIGNAL(timeout()), q, SLOT(scheduledCacheUpdate()));
} }
~SvgPrivate() ~SvgPrivate()
@ -188,7 +192,7 @@ class SvgPrivate
Theme *theme = Theme::defaultTheme(); Theme *theme = Theme::defaultTheme();
QPixmap p; QPixmap p;
if (theme->findInCache(id, p, lastModified)) { if (cacheRendering && theme->findInCache(id, p, lastModified)) {
//kDebug() << "found cached version of " << id << p.size(); //kDebug() << "found cached version of " << id << p.size();
return p; return p;
} else { } else {
@ -219,7 +223,7 @@ class SvgPrivate
p = p.fromImage(itmp); p = p.fromImage(itmp);
} }
if (!itemsToSave.contains(id)) { if (cacheRendering && !itemsToSave.contains(id)) {
itemsToSave.insert(id, p); itemsToSave.insert(id, p);
saveTimer->start(300); saveTimer->start(300);
} }
@ -232,7 +236,7 @@ class SvgPrivate
QHash<QString, QPixmap>::const_iterator i = itemsToSave.constBegin(); QHash<QString, QPixmap>::const_iterator i = itemsToSave.constBegin();
while (i != itemsToSave.constEnd()) { while (i != itemsToSave.constEnd()) {
//kDebug()<<"Saving item to cache: "<<i.key(); //kDebug()<<"Saving item to cache: " << i.key();
Theme::defaultTheme()->insertIntoCache(i.key(), i.value()); Theme::defaultTheme()->insertIntoCache(i.key(), i.value());
++i; ++i;
} }
@ -332,7 +336,10 @@ class SvgPrivate
elementRect = QRectF(elementRect.x() * dx, elementRect.y() * dy, elementRect = QRectF(elementRect.x() * dx, elementRect.y() * dy,
elementRect.width() * dx, elementRect.height() * dy); elementRect.width() * dx, elementRect.height() * dy);
Theme::defaultTheme()->insertIntoRectsCache(path, cacheId(elementId), elementRect);
if (cacheRendering) {
Theme::defaultTheme()->insertIntoRectsCache(path, cacheId(elementId), elementRect);
}
return elementRect; return elementRect;
} }
@ -415,10 +422,11 @@ class SvgPrivate
QString path; QString path;
QSizeF size; QSizeF size;
QSizeF naturalSize; QSizeF naturalSize;
bool multipleImages;
bool themed;
bool applyColors;
unsigned int lastModified; unsigned int lastModified;
bool multipleImages : 1;
bool themed : 1;
bool applyColors : 1;
bool cacheRendering : 1;
}; };
QHash<QString, SharedSvgRenderer::Ptr> SvgPrivate::s_renderers; QHash<QString, SharedSvgRenderer::Ptr> SvgPrivate::s_renderers;
@ -427,9 +435,6 @@ Svg::Svg(QObject *parent)
: QObject(parent), : QObject(parent),
d(new SvgPrivate(this)) d(new SvgPrivate(this))
{ {
d->saveTimer = new QTimer(this);
d->saveTimer->setSingleShot(true);
connect(d->saveTimer, SIGNAL(timeout()), this, SLOT(scheduledCacheUpdate()));
} }
Svg::~Svg() Svg::~Svg()
@ -602,6 +607,16 @@ QString Svg::imagePath() const
return d->themed ? d->themePath : d->path; return d->themed ? d->themePath : d->path;
} }
void Svg::setUsingDiskCache(bool useCache)
{
d->cacheRendering = useCache;
}
bool Svg::usingDiskCache() const
{
return d->cacheRendering;
}
} // Plasma namespace } // Plasma namespace
#include "svg.moc" #include "svg.moc"

22
svg.h
View File

@ -59,6 +59,7 @@ class PLASMA_EXPORT Svg : public QObject
Q_PROPERTY(QSize size READ size) Q_PROPERTY(QSize size READ size)
Q_PROPERTY(bool multipleImages READ containsMultipleImages WRITE setContainsMultipleImages) Q_PROPERTY(bool multipleImages READ containsMultipleImages WRITE setContainsMultipleImages)
Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath) Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath)
Q_PROPERTY(bool usingDiskCache READ usingDiskCache WRITE setUsingDiskCache)
public: public:
@ -217,6 +218,27 @@ class PLASMA_EXPORT Svg : public QObject
*/ */
QString imagePath() const; QString imagePath() const;
/**
* Sets whether or not to cache the results of rendering to pixmaps.
* If the Svg is resized and re-rendered often without pattern to the resulting
* pixmap dimensions, then it may be less efficient to do disk caching. A good
* example might be a progress meter that uses an Svg object to paint itself:
* the meter will be changing often enoughi, with enough unpredictability and
* without re-use of the previous pixmaps to not get a gain from caching.
*
* Most Svg objects should use the caching feature, however.
* Therefore, the default is to use the render cache.
*
* @param useCache true to cache rendered pixmaps
* @since 4.3
*/
void setUsingDiskCache(bool useCache);
/**
* @return true if the Svgis using caching for rendering results
*/
bool usingDiskCache() const;
Q_SIGNALS: Q_SIGNALS:
void repaintNeeded(); void repaintNeeded();