Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / simulator / pgu-0.18 / pgu / gui / surface.py
1 """Funtions for manipulating pygame surfaces."""
2
3 import pygame
4
5 def subsurface(s,r):
6     """Return the subsurface of a surface, with some help, checks."""
7     r = pygame.Rect(r)
8     if r.x < 0 or r.y < 0:
9         raise Exception("rectangle out of bounds: surface=%dx%d, rect=%s" % (
10         s.get_width(),s.get_height(),r))
11     w,h = s.get_width(),s.get_height()
12     if r.right > w:
13         r.w -= r.right-w
14     if r.bottom > h:
15         r.h -= r.bottom-h
16     assert(r.w >= 0 and r.h >= 0)
17     return s.subsurface(r)
18
19 class ProxySurface:
20     """
21     A surface-like object which smartly handle out-of-area blitting.
22     
23     Note that only one of parent and real_surface should be supplied.
24
25     Arguments:
26         parent -- a ProxySurface object
27         real_surface -- a pygame Surface object
28
29     Attributes:
30         mysubsurface -- a real and valid pygame.Surface object to be used 
31             for blitting.
32         x, y -- if the proxy surface is to the left or above the parent
33         offset -- an option which let you scroll the whole blitted content
34
35     """
36     def __init__(self, parent, rect, real_surface, offset=(0, 0)):
37         self.offset = offset
38         self.x = self.y = 0
39         if rect.x < 0: self.x = rect.x
40         if rect.y < 0: self.y = rect.y
41         self.real_surface = real_surface
42         if real_surface == None:
43             self.mysubsurface = parent.mysubsurface.subsurface(
44                 parent.mysubsurface.get_rect().clip(rect))
45         else:
46             self.mysubsurface = real_surface.subsurface(
47                 real_surface.get_rect().clip(rect))
48         rect.topleft = (0, 0)
49         self.rect = rect
50         
51     def blit(self, s, pos, rect=None):
52         if rect == None: rect = s.get_rect()
53         pos = (pos[0] + self.offset[0] + self.x, pos[1] + self.offset[1] + self.y)
54         self.mysubsurface.blit(s, pos, rect)
55         
56     def subsurface(self, rect): 
57         r = pygame.Rect(rect).move(self.offset[0] + self.x, 
58                                    self.offset[1] + self.y)
59         return ProxySurface(self, r, self.real_surface)
60
61     def fill(self, color, rect=None): 
62         if rect != None: self.mysubsurface.fill(color, rect)
63         else: self.mysubsurface.fill(color)
64     def get_rect(self): return self.rect
65     def get_width(self): return self.rect[2]
66     def get_height(self): return self.rect[3]
67     def get_abs_offset(): return self.rect[:2]
68     def get_abs_parent(): return self.mysubsurface.get_abs_parent()
69     def set_clip(self, rect=None): 
70         if rect == None: self.mysubsurface.set_clip()
71         else: 
72             rect = [rect[0] + self.offset[0] + self.x, rect[1] + self.offset[0] + self.y, rect[2], rect[3]]
73             self.mysubsurface.set_clip(rect)
74
75
76
77
78
79 class xProxySurface:
80     """This class is obsolete and is scheduled to be removed."""
81
82     def __init__(self, parent, rect, real_surface, offset=(0, 0)):
83         self.offset = offset
84         self.x = self.y = 0
85         if rect[0] < 0: self.x = rect[0]
86         if rect[1] < 0: self.y = rect[1]
87         self.real_surface = real_surface
88         if real_surface == None:
89             self.mysubsurface = parent.mysubsurface.subsurface(parent.mysubsurface.get_rect().clip(rect))
90         else:
91             self.mysubsurface = real_surface.subsurface(real_surface.get_rect().clip(rect))
92         rect[0], rect[1] = 0, 0
93         self.rect = rect
94         
95     def blit(self, s, pos, rect=None):
96         if rect == None: rect = s.get_rect()
97         pos = (pos[0] + self.offset[0] + self.x, pos[1] + self.offset[1] + self.y)
98         self.mysubsurface.blit(s, pos, rect)
99         
100     def subsurface(self, rect): return ProxySurface(self, pygame.Rect(rect).move(self.offset[0] + self.x, self.offset[1] + self.y),self.real_surface)
101     def fill(self, color, rect=None): 
102         if rect != None: self.mysubsurface.fill(color, rect)
103         else: self.mysubsurface.fill(color)
104     def get_rect(self): return self.rect
105     def get_width(self): return self.rect[2]
106     def get_height(self): return self.rect[3]
107     def get_abs_offset(): return self.rect[:2]
108     def get_abs_parent(): return self.mysubsurface.get_abs_parent()
109     def set_clip(self, rect=None): 
110         if rect == None: self.mysubsurface.set_clip()
111         else: 
112             rect = [rect[0] + self.offset[0] + self.x, rect[1] + self.offset[0] + self.y, rect[2], rect[3]]
113             self.mysubsurface.set_clip(rect)
114

UCC git Repository :: git.ucc.asn.au