1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
"""
"""
import pygame
def subsurface(s,r):
"""Return the subsurface of a surface, with some help, checks.
<pre>subsurface(s,r): return surface</pre>
"""
r = pygame.Rect(r)
if r.x < 0 or r.y < 0:
raise "gui.subsurface: %d %d %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
return s.subsurface(r)
class ProxySurface:
"""
A surface-like object which smartly handle out-of-area blitting.
<pre>ProxySurface(parent, rect, real_surface=None, offset=(0, 0))</pre>
<p>only one of parent and real_surface should be supplied (non None)</p>
<dl>
<dt>parent<dd>a ProxySurface object
<dt>real_surface<dd>a pygame Surface object
</dl>
<strong>Variables</strong>
<dl>
<dt>mysubsurface<dd>a real and valid pygame.Surface object to be used
for blitting.
<dt>x, y<dd>if the proxy surface is lefter or higher than the parent,
x, y hold the diffs.
<dt>offset<dd>an optional feature which let you scroll the whole blitted
content.
</dl>
"""
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)
class xProxySurface:
"""
A surface-like object which smartly handle out-of-area blitting.
<pre>ProxySurface(parent, rect, real_surface=None, offset=(0, 0))</pre>
<p>only one of parent and real_surface should be supplied (non None)</p>
<dl>
<dt>parent<dd>a ProxySurface object
<dt>real_surface<dd>a pygame Surface object
</dl>
<strong>Variables</strong>
<dl>
<dt>mysubsurface<dd>a real and valid pygame.Surface object to be used
for blitting.
<dt>x, y<dd>if the proxy surface is lefter or higher than the parent,
x, y hold the diffs.
<dt>offset<dd>an optional feature which let you scroll the whole blitted
content.
</dl>
"""
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)
|