[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/kdeui/icons
From: Zack Rusin <zack () kde ! org>
Date: 2007-07-04 17:54:19
Message-ID: 1183571659.049750.1785.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 683420 by zack:
Optimize svg icon loading a bit. We introduce a cache
with at most 100 svg renderers and we cache them. XML parsing
on icon loading is just a horrible bottleneck.
M +23 -5 kiconloader.cpp
--- trunk/KDE/kdelibs/kdeui/icons/kiconloader.cpp #683419:683420
@@ -121,8 +121,8 @@
};
+static const int MAX_SVG_RENDERERS = 100;
/*** d pointer for KIconLoader. ***/
-
struct KIconLoaderPrivate
{
QStringList mThemesInTree;
@@ -137,6 +137,7 @@
int lastIconThreshold; // see K3Icon::threshold
QList<KIconThemeNode *> links;
bool extraDesktopIconsLoaded :1;
+ QHash<QString, KSvgRenderer*> svgRenderers;
};
#define KICONLOADER_CHECKS
@@ -313,6 +314,7 @@
delete[] d->mpGroups;
qDeleteAll(d->imgDict);
qDeleteAll(d->links);
+ qDeleteAll(d->svgRenderers);
delete d;
}
@@ -758,15 +760,31 @@
}
else
{
+ KSvgRenderer *renderer = d->svgRenderers[icon.path];
+ if (!renderer) {
+ renderer = new KSvgRenderer(icon.path);
+ if (renderer->isValid()) {
+ if (d->svgRenderers.count() >= MAX_SVG_RENDERERS) {
+ QList<QString> keys = d->svgRenderers.keys();
+ for (int i = 0; i < MAX_SVG_RENDERERS/2; ++i) {
+ KSvgRenderer *oldRenderer = d->svgRenderers.take(keys[i]);
+ delete oldRenderer;
+ }
+ }
+ d->svgRenderers.insert(icon.path, renderer);
+ }
+ }
// Special stuff for SVG icons
- KSvgRenderer renderer(icon.path);
- if (renderer.isValid()) {
+
+ if (renderer && renderer->isValid()) {
img = new QImage(size, size, QImage::Format_ARGB32_Premultiplied);
img->fill(0);
QPainter p(img);
- renderer.render(&p);
- } else
+ renderer->render(&p);
+ } else {
+ delete renderer;
return pix;
+ }
}
iconType = icon.type;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic