attempt to share renderers. this should make quite a difference, one would hope. needs more testing.

svn path=/trunk/KDE/kdebase/workspace/plasma/lib/; revision=669390
This commit is contained in:
Aaron J. Seigo 2007-05-29 07:56:21 +00:00
parent c7b7b5b8ca
commit 498ce9d548

51
svg.cpp
View File

@ -22,14 +22,40 @@
#include <QMatrix>
#include <QPainter>
#include <QPixmapCache>
#include <QSharedData>
#include <KDebug>
#include <KSharedPtr>
#include <KSvgRenderer>
#include "theme.h"
namespace Plasma
{
class SharedSvgRenderer : public KSvgRenderer, public QSharedData
{
public:
typedef KSharedPtr<SharedSvgRenderer> Ptr;
SharedSvgRenderer(QObject *parent = 0)
: KSvgRenderer(parent)
{}
SharedSvgRenderer(const QString &filename, QObject *parent = 0)
: KSvgRenderer(filename, parent)
{}
SharedSvgRenderer(const QByteArray &contents, QObject *parent = 0)
: KSvgRenderer(contents, parent)
{}
~SharedSvgRenderer()
{
kDebug() << "leaving this world for a better one." << endl;
}
};
class Svg::Private
{
public:
@ -47,7 +73,12 @@ class Svg::Private
~Private()
{
delete renderer;
if (renderer.count() == 2) {
// this and the cache reference it; and boy is this not thread safe ;)
renderers.erase(renderers.find(themePath));
}
renderer = 0;
}
void removeFromCache()
@ -112,7 +143,15 @@ class Svg::Private
//TODO: connect the renderer's repaintNeeded to the Plasma::Svg signal
// take into consideration for cache, e.g. don't cache if svg is animated
renderer = new KSvgRenderer(path);
QHash<QString, SharedSvgRenderer::Ptr>::const_iterator it = renderers.find(path);
if (it != renderers.end()) {
kDebug() << "gots us an existing one!" << endl;
renderer = it.value();
} else {
renderer = new SharedSvgRenderer(path);
renderers[path] = renderer;
}
}
QSize elementSize( const QString& elementId )
@ -127,8 +166,8 @@ class Svg::Private
return elementSize.toSize();
}
//TODO: share renderers between Svg objects with identical themePath
KSvgRenderer* renderer;
static QHash<QString, SharedSvgRenderer::Ptr> renderers;
SharedSvgRenderer::Ptr renderer;
QString themePath;
QString path;
QString id;
@ -136,6 +175,8 @@ class Svg::Private
bool themed;
};
QHash<QString, SharedSvgRenderer::Ptr> Svg::Private:: renderers;
Svg::Svg( const QString& imagePath, QObject* parent )
: QObject( parent ),
d( new Private( imagePath ) )
@ -199,7 +240,7 @@ void Svg::themeChanged()
{
d->removeFromCache();
d->path.clear();
delete d->renderer;
//delete d->renderer; we're a KSharedPtr
d->renderer = 0;
emit repaintNeeded();
}