#! /usr/bin/env python import cairo from math import pi import sys import time iter=250 #angle = 2 angle=0 xdp=-15 size = 12 if len(sys.argv) >= 2: size = float(sys.argv[1]) if len(sys.argv) >= 3: iter = int(sys.argv[2]) def mkthx(cr, mode): # Paint a thankyou centered at the current coordinates cr.save() cr.set_source_rgb(0,0,0) txt = "Thank You!" xb, yb, tw, th, xtr, ytr = cr.text_extents(txt) cr.move_to(-xtr/2, -ytr/2) if mode == 1: cr.show_text(txt) elif mode == 2: cr.text_path(txt) cr.fill() elif mode == 3: x,y=cr.get_current_point() cr.save() cr.identity_matrix() cr.move_to(x,y) cr.text_path(txt) p = cr.copy_path() cr.new_path() cr.restore() cr.append_path(p) cr.fill() cr.restore() class iterfactory: def __init__(self, surface, x, y, angle, xdp, ydp, scl, iterf, *args): self.surface,self.angle,self.xdp,self.ydp,self.scl=surface,angle,xdp,ydp,scl self.iterf = iterf self.args = args self.cr = cairo.Context(self.surface) self.cr.translate(x, y) self.cr.select_font_face("Serif") self.cr.set_font_size (size) self.cr.set_font_options(fopt) def iterate(self): self.iterf(self.cr, *self.args) self.cr.translate(self.xdp, self.ydp) self.cr.rotate(pi / 180 * self.angle) self.cr.scale(self.scl, self.scl) w, h = 800, 800 #surface = cairo.SVGSurface("thx.svg",w, h) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,w,h) cr = cairo.Context(surface) # Fill in the background cr.set_source_rgb(1,1,1) cr.paint() fopt = cairo.FontOptions() fopt.set_hint_metrics(cairo.HINT_METRICS_OFF) fopt.set_hint_style(cairo.HINT_STYLE_NONE) cr.select_font_face("Serif") cr.set_font_size (size) cr.set_font_options(fopt) xdp = cr.font_extents()[2] # (1 - scl**iter) / (1 - scl) = h / xdp # assume iter is infinity for now # 1 / (1 - scl) = h / xdp scl = 1. - xdp/h factories = [ iterfactory(surface, w/4, h, angle, 0, -xdp, scl, mkthx, 1), iterfactory(surface, 2*w/4, h, angle, 0, -xdp, scl, mkthx, 2), iterfactory(surface, 3*w/4, h, angle, 0, -xdp, scl, mkthx, 3), ] for f in factories: t = time.clock() for i in range(iter): f.iterate() print "Method %d took" % f.args, time.clock() - t surface.write_to_png("thx.png")