changeset 349:c4285f19894c

Add a tiled renderer
author Neil Muller <drnlmuller@gmail.com>
date Fri, 06 Sep 2013 15:53:28 +0200
parents f0e8970ab804
children 4a665dc554b4
files nagslang/render.py
diffstat 1 files changed, 31 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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)