self.__draw (self.__offscreen)
self.__update_from_offscreen ()
- def __update_from_offscreen (self):
+ def __update_from_offscreen (self, rect = None):
if not self.props.visible:
return
self.__redraw ()
gc = gtk.gdk.GC (self.window)
- # FIXME: Accept a subregion here to speed up partial expose.
- self.window.draw_drawable (gc, self.__offscreen, 0, 0, 0, 0, -1, -1)
- self.__draw_position (self.window)
+ if rect is None:
+ self.window.draw_drawable (gc, self.__offscreen, 0, 0, 0, 0, -1, -1)
+ self.__draw_position (self.window)
+ else:
+ x, y, w, h = rect
+ self.window.draw_drawable (gc, self.__offscreen, x, y, x, y, w, h)
+ self.__draw_position (self.window, clip = rect)
def update (self, model):
else:
return False
- def __draw_position (self, drawable):
+ def __draw_position (self, drawable, clip = None):
if not self.__have_position ():
return
position1 = int (float (start_ts - first_ts) / step)
position2 = int (float (end_ts - first_ts) / step)
+ if clip:
+ clip_x, clip_y, clip_w, clip_h = clip
+ if clip_x + clip_w < position1 - 1 or clip_x > position2 + 1:
+ return
+
ctx = drawable.cairo_create ()
x, y, w, h = self.get_allocation ()
+ if clip:
+ ctx.rectangle (*clip)
+ ctx.clip ()
+
line_width = position2 - position1
if line_width <= 1:
ctx.set_source_rgb (1., 0., 0.)
def __handle_expose_event (self, self_, event):
if self.__offscreen:
- self.__update_from_offscreen ()
+ self.__update_from_offscreen (event.area)
else:
self.__redraw ()
return True