All pastes #912010 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-02-21 01:52 UTC
rendered paste body
#! /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")