[sulfur] improve CellRendererStars rendering speed dramatically

This commit is contained in:
Fabio Erculiani
2011-05-03 14:50:48 +02:00
parent 19440e96cf
commit fcacd42efa

View File

@@ -34,6 +34,7 @@ class CellRendererStars(gtk.GenericCellRenderer):
self.__gobject_init__()
self.value = -1
self.value_voted = 0.0
self.__cache = {}
def do_set_property(self, pspec, value):
setattr(self, pspec.name, value)
@@ -44,6 +45,9 @@ class CellRendererStars(gtk.GenericCellRenderer):
def on_render(self, window, widget, background_area, cell_area,
expose_area, flags):
if self.value == -1:
return
(x_offset, y_offset, width, height) = self.on_get_size(widget,
cell_area)
if isinstance(window, gtk.gdk.Window):
@@ -54,55 +58,73 @@ class CellRendererStars(gtk.GenericCellRenderer):
cell_area.x+x_offset,
cell_area.y+y_offset,
width, height)
if ((self.value > -1) and (self.value < 6)) or (self.value_voted > 0):
xt = widget.style.xthickness
empty = gtk.Image()
empty.set_from_file(const.empty_background)
try:
empty_buf = empty.get_pixbuf()
except ValueError:
return
xt = widget.style.xthickness
if self.value_voted:
star = gtk.Image()
star.set_from_file(const.star_selected_pixmap)
## caching
cache_id = self.value
int_part = int(cache_id) # truncate
float_part = cache_id - int_part
if float_part < 0.6:
cache_id = float(int_part) + 0.5
else:
cache_id = float(int_part) + 1.0
pixbuf = self.__cache.get((cache_id, self.value_voted))
if pixbuf is not None:
window.draw_pixbuf(None, pixbuf, 0, 0,
cell_area.x+x_offset+xt, cell_area.y+y_offset+xt, -1, -1)
return
empty = gtk.Image()
empty.set_from_file(const.empty_background)
try:
empty_buf = empty.get_pixbuf()
except ValueError:
return
if self.value_voted:
star = gtk.Image()
star.set_from_file(const.star_selected_pixmap)
else:
star = gtk.Image()
star.set_from_file(const.star_normal_pixmap)
star_empty = gtk.Image()
star_empty.set_from_file(const.star_empty_pixmap)
star_half = gtk.Image()
star_half.set_from_file(const.star_half_pixmap)
star_buf = star.get_pixbuf()
star_empty_buf = star_empty.get_pixbuf()
star_half_buf = star_half.get_pixbuf()
w, h = star_buf.get_width(), star_buf.get_height()
myval = self.value
if self.value_voted:
myval = self.value_voted
empty_buf = empty_buf.scale_simple(w*5, h+12, gtk.gdk.INTERP_BILINEAR)
myvals = [0, w, w*2, w*3, w*4]
cnt = 0
while myval > 0:
if (myval < 0.6):
star_half_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt],
6)
else:
star = gtk.Image()
star.set_from_file(const.star_normal_pixmap)
star_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt], 6)
myval -= 1
cnt += 1
star_empty = gtk.Image()
star_empty.set_from_file(const.star_empty_pixmap)
myval = 5 - cnt
while myval > 0:
star_empty_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt], 6)
myval -= 1
cnt += 1
star_half = gtk.Image()
star_half.set_from_file(const.star_half_pixmap)
star_buf = star.get_pixbuf()
star_empty_buf = star_empty.get_pixbuf()
star_half_buf = star_half.get_pixbuf()
w, h = star_buf.get_width(), star_buf.get_height()
myval = self.value
if self.value_voted:
myval = self.value_voted
empty_buf = empty_buf.scale_simple(w*5, h+12, gtk.gdk.INTERP_BILINEAR)
myvals = [0, w, w*2, w*3, w*4]
cnt = 0
while myval > 0:
if (myval < 0.6):
star_half_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt],
6)
else:
star_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt], 6)
myval -= 1
cnt += 1
myval = 5 - cnt
while myval > 0:
star_empty_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt], 6)
myval -= 1
cnt += 1
if empty_buf: window.draw_pixbuf(None, empty_buf, 0, 0,
if empty_buf:
self.__cache[(cache_id, self.value_voted)] = empty_buf
window.draw_pixbuf(None, empty_buf, 0, 0,
cell_area.x+x_offset+xt, cell_area.y+y_offset+xt, -1, -1)