# HG changeset patch # User Neil Muller # Date 1378475608 -7200 # Node ID c4285f19894c6ac872347d5d263d5e201f90f73e # Parent f0e8970ab8044a909251c1194106fa42b7b87e87 Add a tiled renderer diff -r f0e8970ab804 -r c4285f19894c nagslang/render.py --- a/nagslang/render.py Fri Sep 06 15:18:40 2013 +0200 +++ b/nagslang/render.py Fri Sep 06 15:53:28 2013 +0200 @@ -1,9 +1,11 @@ import math import pygame +import pygame.locals as pgl import pymunk from nagslang.options import options +from nagslang.utils import tile_surface from nagslang.widgets.text import LabelWidget @@ -184,3 +186,32 @@ y += abs(display_offset[1]) self.widget.rect.topleft = (x, y) self.widget.draw(surface) + + +class TiledRenderer(Renderer): + """Tile the given image to fit the given outline + + Outline is assumed to be in pymunk coordinates""" + + def __init__(self, outline, tile_image): + self._tile_image = tile_image + self.outline = outline + self._tiled = None + + def _make_surface(self, surface): + if not self._tiled: + size = surface.get_size() + self._tiled = tile_surface(size, self._tile_image) + mask = pygame.surface.Surface(size, pgl.SRCALPHA) + mask.fill(pygame.color.Color(0, 0, 0, 0)) + pointlist = [pymunk.pygame_util.to_pygame(p, surface) + for p in self.outline] + pygame.draw.polygon(mask, pygame.color.THECOLORS['white'], + pointlist, 0) + self._tiled.blit(mask, (0, 0), special_flags=pgl.BLEND_RGBA_MULT) + return self._tiled + + def render(self, surface): + tiled = self._make_surface(surface) + surface.blit(tiled, (0, 0)) + super(TiledRenderer, self).render(surface)