[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