Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / simulator / pgu-0.18 / pgu / gui / surface.py
diff --git a/research/transmission_spectroscopy/simulator/pgu-0.18/pgu/gui/surface.py b/research/transmission_spectroscopy/simulator/pgu-0.18/pgu/gui/surface.py
new file mode 100644 (file)
index 0000000..567ff02
--- /dev/null
@@ -0,0 +1,114 @@
+"""Funtions for manipulating pygame surfaces."""
+
+import pygame
+
+def subsurface(s,r):
+    """Return the subsurface of a surface, with some help, checks."""
+    r = pygame.Rect(r)
+    if r.x < 0 or r.y < 0:
+        raise Exception("rectangle out of bounds: surface=%dx%d, rect=%s" % (
+        s.get_width(),s.get_height(),r))
+    w,h = s.get_width(),s.get_height()
+    if r.right > w:
+        r.w -= r.right-w
+    if r.bottom > h:
+        r.h -= r.bottom-h
+    assert(r.w >= 0 and r.h >= 0)
+    return s.subsurface(r)
+
+class ProxySurface:
+    """
+    A surface-like object which smartly handle out-of-area blitting.
+    
+    Note that only one of parent and real_surface should be supplied.
+
+    Arguments:
+        parent -- a ProxySurface object
+        real_surface -- a pygame Surface object
+
+    Attributes:
+        mysubsurface -- a real and valid pygame.Surface object to be used 
+            for blitting.
+        x, y -- if the proxy surface is to the left or above the parent
+        offset -- an option which let you scroll the whole blitted content
+
+    """
+    def __init__(self, parent, rect, real_surface, offset=(0, 0)):
+        self.offset = offset
+        self.x = self.y = 0
+        if rect.x < 0: self.x = rect.x
+        if rect.y < 0: self.y = rect.y
+        self.real_surface = real_surface
+        if real_surface == None:
+            self.mysubsurface = parent.mysubsurface.subsurface(
+                parent.mysubsurface.get_rect().clip(rect))
+        else:
+            self.mysubsurface = real_surface.subsurface(
+                real_surface.get_rect().clip(rect))
+        rect.topleft = (0, 0)
+        self.rect = rect
+        
+    def blit(self, s, pos, rect=None):
+        if rect == None: rect = s.get_rect()
+        pos = (pos[0] + self.offset[0] + self.x, pos[1] + self.offset[1] + self.y)
+        self.mysubsurface.blit(s, pos, rect)
+        
+    def subsurface(self, rect): 
+        r = pygame.Rect(rect).move(self.offset[0] + self.x, 
+                                   self.offset[1] + self.y)
+        return ProxySurface(self, r, self.real_surface)
+
+    def fill(self, color, rect=None): 
+        if rect != None: self.mysubsurface.fill(color, rect)
+        else: self.mysubsurface.fill(color)
+    def get_rect(self): return self.rect
+    def get_width(self): return self.rect[2]
+    def get_height(self): return self.rect[3]
+    def get_abs_offset(): return self.rect[:2]
+    def get_abs_parent(): return self.mysubsurface.get_abs_parent()
+    def set_clip(self, rect=None): 
+        if rect == None: self.mysubsurface.set_clip()
+        else: 
+            rect = [rect[0] + self.offset[0] + self.x, rect[1] + self.offset[0] + self.y, rect[2], rect[3]]
+            self.mysubsurface.set_clip(rect)
+
+
+
+
+
+class xProxySurface:
+    """This class is obsolete and is scheduled to be removed."""
+
+    def __init__(self, parent, rect, real_surface, offset=(0, 0)):
+        self.offset = offset
+        self.x = self.y = 0
+        if rect[0] < 0: self.x = rect[0]
+        if rect[1] < 0: self.y = rect[1]
+        self.real_surface = real_surface
+        if real_surface == None:
+            self.mysubsurface = parent.mysubsurface.subsurface(parent.mysubsurface.get_rect().clip(rect))
+        else:
+            self.mysubsurface = real_surface.subsurface(real_surface.get_rect().clip(rect))
+        rect[0], rect[1] = 0, 0
+        self.rect = rect
+        
+    def blit(self, s, pos, rect=None):
+        if rect == None: rect = s.get_rect()
+        pos = (pos[0] + self.offset[0] + self.x, pos[1] + self.offset[1] + self.y)
+        self.mysubsurface.blit(s, pos, rect)
+        
+    def subsurface(self, rect): return ProxySurface(self, pygame.Rect(rect).move(self.offset[0] + self.x, self.offset[1] + self.y),self.real_surface)
+    def fill(self, color, rect=None): 
+        if rect != None: self.mysubsurface.fill(color, rect)
+        else: self.mysubsurface.fill(color)
+    def get_rect(self): return self.rect
+    def get_width(self): return self.rect[2]
+    def get_height(self): return self.rect[3]
+    def get_abs_offset(): return self.rect[:2]
+    def get_abs_parent(): return self.mysubsurface.get_abs_parent()
+    def set_clip(self, rect=None): 
+        if rect == None: self.mysubsurface.set_clip()
+        else: 
+            rect = [rect[0] + self.offset[0] + self.x, rect[1] + self.offset[0] + self.y, rect[2], rect[3]]
+            self.mysubsurface.set_clip(rect)
+

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