Simple svg render buffering
This commit is contained in:
parent
3bcc3d0542
commit
6bf9c36e7f
@ -4,6 +4,7 @@ import gobject
|
|||||||
import gtk
|
import gtk
|
||||||
import goocanvas
|
import goocanvas
|
||||||
import rsvg
|
import rsvg
|
||||||
|
import cairo
|
||||||
|
|
||||||
from sugar.util import GObjectSingletonMeta
|
from sugar.util import GObjectSingletonMeta
|
||||||
from sugar.canvas.IconColor import IconColor
|
from sugar.canvas.IconColor import IconColor
|
||||||
@ -64,6 +65,9 @@ class IconView(goocanvas.ItemViewSimple, goocanvas.ItemView):
|
|||||||
self.canvas_view = canvas_view
|
self.canvas_view = canvas_view
|
||||||
self.item = item
|
self.item = item
|
||||||
|
|
||||||
|
self._buffer = None
|
||||||
|
self._buffer_scale = 0.0
|
||||||
|
|
||||||
item.connect('changed', goocanvas.item_view_simple_item_changed, self)
|
item.connect('changed', goocanvas.item_view_simple_item_changed, self)
|
||||||
|
|
||||||
def do_get_item_view_at(self, x, y, cr, is_pointer_event, parent_is_visible):
|
def do_get_item_view_at(self, x, y, cr, is_pointer_event, parent_is_visible):
|
||||||
@ -114,12 +118,37 @@ class IconView(goocanvas.ItemViewSimple, goocanvas.ItemView):
|
|||||||
|
|
||||||
return self.bounds
|
return self.bounds
|
||||||
|
|
||||||
|
def _get_buffer(self, cr, handle, scale):
|
||||||
|
if self._buffer and self._buffer_scale != scale:
|
||||||
|
del self._buffer
|
||||||
|
self._buffer = None
|
||||||
|
|
||||||
|
if self._buffer == None:
|
||||||
|
size = _ICON_SIZE * scale
|
||||||
|
surface = cr.get_target().create_similar(
|
||||||
|
cairo.CONTENT_COLOR_ALPHA, size, size)
|
||||||
|
|
||||||
|
ctx = cairo.Context(surface)
|
||||||
|
ctx.scale(scale, scale)
|
||||||
|
handle.render_cairo(ctx)
|
||||||
|
del ctx
|
||||||
|
|
||||||
|
self._buffer = surface
|
||||||
|
self._buffer_scale = scale
|
||||||
|
|
||||||
|
return self._buffer
|
||||||
|
|
||||||
def do_paint(self, cr, bounds, scale):
|
def do_paint(self, cr, bounds, scale):
|
||||||
|
scale_factor = float(self.item.size) / float(_ICON_SIZE)
|
||||||
|
if scale_factor == 0.0:
|
||||||
|
return
|
||||||
|
|
||||||
icon_name = self.item.icon_name
|
icon_name = self.item.icon_name
|
||||||
if icon_name == None:
|
if icon_name == None:
|
||||||
icon_name = 'stock-missing'
|
icon_name = 'stock-missing'
|
||||||
|
|
||||||
handle = IconView._cache.get_handle(icon_name, self.item.color)
|
handle = IconView._cache.get_handle(icon_name, self.item.color)
|
||||||
|
buf = self._get_buffer(cr, handle, scale_factor)
|
||||||
|
|
||||||
cr.save()
|
cr.save()
|
||||||
|
|
||||||
@ -129,11 +158,8 @@ class IconView(goocanvas.ItemViewSimple, goocanvas.ItemView):
|
|||||||
cr.transform(self.transform)
|
cr.transform(self.transform)
|
||||||
|
|
||||||
cr.translate(self.item.x, self.item.y)
|
cr.translate(self.item.x, self.item.y)
|
||||||
scale_factor = float(self.item.size) / float(_ICON_SIZE)
|
cr.set_source_surface(buf, 0.0, 0.0)
|
||||||
|
cr.paint()
|
||||||
if scale_factor != 0.0:
|
|
||||||
cr.scale(scale_factor, scale_factor)
|
|
||||||
handle.render_cairo(cr)
|
|
||||||
|
|
||||||
cr.restore()
|
cr.restore()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user