annotate nagslang/mutators.py @ 652:4a334fb55348

Merge
author David Sharpe <decoydavid@gmail.com>
date Sun, 08 Sep 2013 02:10:30 +0200
parents 0185d2b508c8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
1 '''Mutations to apply to images'''
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
2
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
3 import pygame
364
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
4 from pygame.transform import rotate, flip, scale
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
5
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
6
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
7 class Mutator(object):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
8 def __init__(self, func, *args):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
9 self._func = func
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
10 self._args = tuple(args)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
11
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
12 def __call__(self, image):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
13 return self._func(image, *self._args)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
14
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
15 def __hash__(self):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
16 return hash((self._func, self._args))
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
17
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
18 def __eq__(self, other):
31
c62ed518e5c8 Fix repor and add type-check to __eq__.
Simon Cross <hodgestar@gmail.com>
parents: 24
diff changeset
19 if not isinstance(other, Mutator):
c62ed518e5c8 Fix repor and add type-check to __eq__.
Simon Cross <hodgestar@gmail.com>
parents: 24
diff changeset
20 return NotImplemented
604
0185d2b508c8 Don't leak mutators (leading to leaked images)
Stefano Rivera <stefano@rivera.za.net>
parents: 555
diff changeset
21 return (self._func == other._func) and (self._args == other._args)
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
22
31
c62ed518e5c8 Fix repor and add type-check to __eq__.
Simon Cross <hodgestar@gmail.com>
parents: 24
diff changeset
23 def __repr__(self):
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
24 return '<%s %r>' % (self.__class__.__name__, self._args)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
25
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
26
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
27 class Colour(Mutator):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
28 '''Overlay a colour onto an image'''
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
29 def __init__(self, colour, blend=pygame.locals.BLEND_RGBA_MULT):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
30 super(Colour, self).__init__(Colour.colour, colour, blend)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
31
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
32 @classmethod
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
33 def colour(self, image, colour, blend):
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
34 image = image.copy()
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
35 overlay = pygame.surface.Surface(image.get_size(),
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
36 pygame.locals.SRCALPHA, image)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
37 overlay.fill(colour)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
38 image.blit(overlay, (0, 0), None, blend)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
39 return image
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
40
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
41
364
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
42 class ImageOverlay(Mutator):
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
43 '''Overlay another image onto an image'''
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
44 def __init__(self, image, offset=(0, 0), halfsize=True, blend=0):
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
45 super(ImageOverlay, self).__init__(
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
46 ImageOverlay.overlay, image, offset, halfsize, blend)
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
47
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
48 @classmethod
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
49 def overlay(self, image, overlay, offset, halfsize, blend):
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
50 image = image.copy()
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
51 if halfsize:
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
52 new_size = (overlay.get_width() / 2, overlay.get_height() / 2)
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
53 overlay = scale(overlay, new_size)
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
54 offset_x = image.get_width() / 2 - overlay.get_width() / 2 + offset[0]
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
55 offset_y = image.get_width() / 2 - overlay.get_width() / 2 + offset[1]
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
56 image.blit(overlay, (offset_x, offset_y), None, blend)
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
57 return image
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
58
72a91d64c088 Keycard doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 56
diff changeset
59
555
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
60 class ImageCentre(Mutator):
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
61 def __init__(self, size):
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
62 super(ImageCentre, self).__init__(ImageCentre.centre, size)
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
63
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
64 @classmethod
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
65 def centre(cls, image, size):
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
66 if image.get_size() == size:
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
67 return image
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
68 surf = pygame.surface.Surface(size, pygame.locals.SRCALPHA, image)
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
69 surf.blit(image, ((size[0] - image.get_width()) / 2,
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
70 (size[1] - image.get_height()) / 2))
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
71 return surf
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
72
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
73
519
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
74 def rotator(angle):
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
75 return Mutator(rotate, angle)
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
76
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
77
555
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
78 def scaler(size):
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
79 return Mutator(scale, size)
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
80
bf7960e49063 Inventory
Stefano Rivera <stefano@rivera.za.net>
parents: 519
diff changeset
81
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
82 # Identity mutator
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
83 NULL = Mutator(lambda x: x)
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
84
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
85 # Rotation
519
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
86 R90 = rotator(90)
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
87 R180 = rotator(180)
ddd86cb25945 Updated hangar.
Jeremy Thurgood <firxen@gmail.com>
parents: 364
diff changeset
88 R270 = rotator(-90)
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
89
56
b9430b4a48da Now with a werewolf
Stefano Rivera <stefano@rivera.za.net>
parents: 31
diff changeset
90 FLIP_H = Mutator(flip, True, False)
b9430b4a48da Now with a werewolf
Stefano Rivera <stefano@rivera.za.net>
parents: 31
diff changeset
91 FLIP_V = Mutator(flip, False, True)
b9430b4a48da Now with a werewolf
Stefano Rivera <stefano@rivera.za.net>
parents: 31
diff changeset
92
24
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
93 # Colour
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
94 RED = Colour((255, 0, 0))
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
95 GREEN = Colour((0, 255, 0))
50babb330261 Forgot to add mutators...
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
96 BLUE = Colour((0, 0, 255))