593
|
1 """Transforms to apply to images when they're loaded."""
|
|
2
|
|
3 from pygame.transform import rotate
|
|
4 from pygame.locals import BLEND_RGBA_MULT, SRCALPHA
|
|
5 from pygame.surface import Surface
|
|
6
|
|
7
|
|
8 class Transform(object):
|
|
9
|
|
10 def __init__(self, func, *args):
|
|
11 self._func = func
|
|
12 self._args = args
|
|
13
|
|
14 def __call__(self, image):
|
|
15 return self._func(image, *self._args)
|
|
16
|
|
17 def __hash__(self):
|
|
18 return hash((id(self._func), self._args))
|
|
19
|
|
20 def __eq__(self, other):
|
|
21 return (self._func is other._func) and self._args == other._args
|
|
22
|
|
23 def __repr__(self):
|
|
24 return "<%s args=%r>" % (self.__class__.__name__, self._args)
|
|
25
|
|
26
|
|
27 # transform that does nothing
|
|
28 NULL = Transform(lambda x: x)
|
|
29
|
|
30 # base rotation transforms
|
|
31 R90 = Transform(rotate, 90)
|
|
32 R180 = Transform(rotate, 180)
|
|
33 R270 = Transform(rotate, -90)
|
|
34
|
|
35
|
|
36 # overlays
|
|
37 class Overlay(Transform):
|
|
38 """Overlay another image on top of the given one."""
|
|
39
|
|
40 def __init__(self, resources, image_name_fragments, blend=0):
|
|
41 super(Overlay, self).__init__(
|
|
42 self.overlay, resources, image_name_fragments, blend)
|
|
43
|
|
44 def overlay(self, image, resources, image_name_fragments, blend):
|
|
45 image = image.copy()
|
|
46 overlay = resources.load_image(image_name_fragments)
|
|
47 image.blit(overlay, (0, 0), None, blend)
|
|
48 return image
|
|
49
|
|
50
|
|
51 # colour overlays
|
|
52 class Colour(Transform):
|
|
53 """Overlay an image with a colour."""
|
|
54
|
|
55 def __init__(self, colour, blend=BLEND_RGBA_MULT):
|
|
56 super(Colour, self).__init__(self.colour, colour, blend)
|
|
57
|
|
58 def colour(self, image, colour, blend):
|
|
59 image = image.copy()
|
|
60 overlay = Surface(image.get_size(), SRCALPHA, image)
|
|
61 overlay.fill(colour)
|
|
62 image.blit(overlay, (0, 0), None, blend)
|
|
63 return image
|