Document windows 7 permissions workaround
[tabakrolletjie.git] / tabakrolletjie / transforms.py
index 70ff036160618b51c2c5cd3651310172a23f6a36..8590c1bbd1ee61539921e9d906cfdf96f9fbb890 100644 (file)
@@ -2,6 +2,10 @@
 
 import pygame.surface
 
+import pygame.locals as pgl
+
+from .constants import COLOURS
+
 
 class Transform(object):
 
@@ -11,11 +15,22 @@ class Transform(object):
         for k in self.ARGS:
             setattr(self, k, kw.pop(k))
         assert not kw
-        self.hash = "%s: <%s>" % (
+        self._repr = "%s: <%s>" % (
             self.__class__.__name__,
             ", ".join("%s=%s" % (k, getattr(self, k)) for k in self.ARGS))
         return
 
+    def __repr__(self):
+        return self._repr
+
+    def __hash__(self):
+        return hash(self._repr)
+
+    def __eq__(self, other):
+        if not isinstance(other, Transform):
+            return NotImplemented
+        return self._repr == other._repr
+
     def apply(self, surface):
         raise NotImplementedError("Transforms should implement .apply")
 
@@ -38,3 +53,56 @@ class Overlay(Transform):
         over.fill(self.colour)
         surface.blit(over, (0, 0), None)
         return surface
+
+
+class Multiply(Transform):
+    """ Apply a colour by multiplying. """
+
+    ARGS = ["colour"]
+
+    def apply(self, surface):
+        mult = pygame.surface.Surface(surface.get_size())
+        mult = mult.convert_alpha()
+        mult.fill(self.colour)
+        surface.blit(mult, (0, 0), None, pgl.BLEND_RGBA_MULT)
+        return surface
+
+
+class Alpha(Transform):
+    """ Make translucent. """
+
+    ARGS = ["alpha"]
+
+    def apply(self, surface):
+        surface.fill((255, 255, 255, self.alpha), None, pgl.BLEND_RGBA_MULT)
+        return surface
+
+
+class ColourWedges(Transform):
+    """ Apply colours as wedges. """
+
+    ARGS = ["colours"]
+
+    def apply(self, surface):
+        size = surface.get_width()
+        assert size in (16, 32, 48, 64)
+        fitting_colours = [COLOURS[c] for c in self.colours]
+        ncolour = len(fitting_colours)
+        if ncolour > 3:
+            print "Multicoloured light should not have more than 3 colours"
+            ncolour = 3
+
+        if ncolour == 1:
+            multiply = Multiply(colour=fitting_colours[0])
+            return multiply.apply(surface)
+
+        colour_mult_image = pygame.surface.Surface((size, size))
+        from .loader import loader
+        for i in range(ncolour):
+            sector = loader.load_image(
+                str(size), "light_mask_%d_%d.png" % (ncolour, i + 1),
+                transform=Multiply(colour=fitting_colours[i]))
+            colour_mult_image.blit(sector, (0, 0), None, 0)
+
+        surface.blit(colour_mult_image, (0, 0), None, pgl.BLEND_RGBA_MULT)
+        return surface