Combinando Cairo com Pygame
Por JoaoBueno
A biblioteca Pygame é a que provê uma das maneiras mais simples de podermos trabalhar com imagens 2D em tela cheia. A biblioteca Cairo provê primitivas poderosas de desenho e permite efeitos de texto avançados, uso de degradês (gradientes de cores) com transparência e uma API bem mais completa para desenhar.
Combinar os duas no entanto, pode ser difícil para quem for tentar faze-lo pela primeira vez - então estou deixando um exemplo aqui. O desenho em Cairo e bem simples - um único "X" para manter o exemplo curto - mas esse X é desenhado com linhas anti-aliased desenahdas pelo Cairo, que não estão disponíveis no pygame.
O segredo do funcionamento está na obtenção dos dados "brutos" da imagem gerada pelo cairo, e seu uso para sobre-escrever os dados da superfície do Pygame - na função "commit"
# -*- coding: utf-8 -*-
import cairo
import pygame
SIZE = 640, 480
def init():
global surf, ctx, display
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, *SIZE)
ctx = cairo.Context(surf)
pygame.init()
display = pygame.display.set_mode(SIZE)
def draw_x(ctx, width=8.0, color=(1.0,0,0)):
ctx.set_line_width(width)
ctx.set_source_rgb(*color)
ctx.move_to(0,0)
ctx.line_to(SIZE[0],SIZE[1])
ctx.move_to(SIZE[0],0)
ctx.line_to(0, SIZE[1])
ctx.stroke()
def commit(pygame_surface, cairo_surface):
dest = pygame.surfarray.pixels2d(pygame_surface)
dest.data[:] = cairo_surface.get_data()
init()
draw_x(ctx)
commit(display, surf)
pygame.display.flip()
# Keeps the program running while <ESC> is not pressed
while not pygame.key.get_pressed()[pygame.K_ESCAPE]:
pygame.event.pump()
pygame.time.delay(30)


