Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <mpg@redhat.com>2007-08-26 10:36:34 (GMT)
committer Marco Pesenti Gritti <mpg@redhat.com>2007-08-26 10:36:34 (GMT)
commitf44c340b3a3d38dac49d50a8fa3a55871a973670 (patch)
treee8625e01687b40cdfe02c2ed73b8778a836daf0e /sugar
parenta8938ab8ba7aa15254c32f5df9c35f7b99fda315 (diff)
Smarter/configurable surface cache in IconBuffer
Diffstat (limited to 'sugar')
-rw-r--r--sugar/graphics/icon.py30
1 files changed, 26 insertions, 4 deletions
diff --git a/sugar/graphics/icon.py b/sugar/graphics/icon.py
index ce84839..823b4aa 100644
--- a/sugar/graphics/icon.py
+++ b/sugar/graphics/icon.py
@@ -128,7 +128,8 @@ class _BadgeInfo(object):
class _IconBuffer(object):
def __init__(self):
self._svg_loader = _get_svg_loader()
- self._surface = None
+ self._surface_cache = {}
+ self._cache_size = 1
self.icon_name = None
self.file_name = None
@@ -138,6 +139,10 @@ class _IconBuffer(object):
self.width = None
self.height = None
+ def _get_cache_key(self):
+ return (self.icon_name, self.file_name, self.fill_color,
+ self.stroke_color, self.badge_name, self.width, self.height)
+
def _load_svg(self, file_name):
entities = {}
if self.fill_color:
@@ -224,8 +229,12 @@ class _IconBuffer(object):
return info
def get_surface(self):
- if self._surface is not None:
- return self._surface
+ cache_key = self._get_cache_key()
+ if self._surface_cache.has_key(cache_key):
+ print cache_key
+ return self._surface_cache[cache_key]
+
+ print 'gah'
icon_info = self._get_icon_info()
if icon_info.file_name is None:
@@ -267,13 +276,26 @@ class _IconBuffer(object):
context.translate(badge_info.attach_x, badge_info.attach_y)
self._draw_badge(context, badge_info.size)
- self._surface = surface
+ if (len(self._surface_cache) == self._cache_size):
+ self._surface_cache.popitem()
+ self._surface_cache[cache_key] = surface
return surface
def invalidate(self):
self._surface = None
+ def get_cache_size(self):
+ return self._cache_size
+
+ def set_cache_size(self, cache_size):
+ while len(self._surface_cache) > cache_size:
+ print len(self._surface_cache)
+ self._surface_cache.popitem()
+ self._cache_size
+
+ cache_size = property(get_cache_size, set_cache_size)
+
class Icon(gtk.Image):
__gtype_name__ = 'SugarIcon'