#!/usr/bin/python from __future__ import division import gtk import gobject import cairo import sys import time from optparse import OptionParser min_period = 2.0; n_boxes = 10; size = 10; loops = 1000; # Used to do a 1-pixel GetImage for accurate timing cmap = gtk.gdk.screen_get_default().get_rgb_colormap() pbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1) def sync(drawable): pbuf.get_from_drawable(drawable, cmap, 0, 0, 0, 0, 1, 1) def draw(window): global loops cr = window.window.cairo_create() source = cr.get_target().create_similar(cairo.CONTENT_COLOR_ALPHA, width, height) source_cr = cairo.Context(source) source_cr.set_source_rgb(1, 0, 0) source_cr.paint() # Create a clip region with n_boxes separate rectangles for i in xrange(0, n_boxes): x = i * (size + 1) y = 0 cr.rectangle(x, y, size, size) cr.clip() cr.set_source_surface(source, 0, 0) cr.get_source().set_extend(cairo.EXTEND_REPEAT) cr.get_source().set_filter(cairo.FILTER_NEAREST) before = time.time() for i in xrange(0, loops): cr.paint() sync(window.window) after = time.time() if after - before < min_period: loops *= 2 return False box_count = loops * n_boxes box_rate = box_count / (after - before) pix_rate = box_rate * size * size print "Rate: %d boxes in %gs = %g boxes/s %g pix/sec" % (box_count, (after - before), box_rate, pix_rate) return False def on_expose(window, event): try: draw(window) except KeyboardInterrupt: gtk.main_quit() return False def on_key_press(widget, event): if event.keyval in (gtk.keysyms.Escape,): gtk.main_quit() return True window.queue_draw() return False def on_idle(): window.queue_draw() return True parser = OptionParser() parser.add_option("-s", "--size", type="int", help="size of boxes") parser.add_option("-n", "--n-boxes", type="int", help="number of boxes") parser.set_defaults(size=size, n_boxes=n_boxes) (options, args) = parser.parse_args() size = options.size n_boxes = options.n_boxes width = n_boxes * (size + 1) - 1 height = size window = gtk.Window() window.set_app_paintable(True) window.set_size_request(width, height) window.set_resizable(False) window.connect("expose-event", on_expose) window.connect("key-press-event", on_key_press) window.show() gobject.idle_add(on_idle) gtk.main()