Source code for usf.subpixel.subpixelsurface
import pygame
from math import floor
# Try to import Numpy, or Numeric
try:
import numpy as Numeric
BYTE = "u1"
DWORD = "u4"
except ImportError:
try:
import Numeric
except ImportError, e:
print "Requires NumPy or Numeric!"
raise e
BYTE = Numeric.UnsignedInt8
DWORD = Numeric.Int32
[docs]class SubPixelSurface(object):
def __init__(self, surface, x_level=3, y_level=None):
"""Creates a sub pixel surface object.
surface -- A PyGame surface
x_level -- Number of sub-pixel levels in x
y_level -- Number of sub-pixel levels in y (same as x if omited)
"""
self.x_level = x_level
self.y_level = y_level or x_level
w, h = surface.get_size()
ow, oh = w, h
w += 2
h += 2
surf_array_rgb = Numeric.zeros((w, h, 3), BYTE)
surf_array_rgb[1:ow+1:, 1:oh+1:, ::] = pygame.surfarray.array3d(surface)
surf_array_a = Numeric.zeros((w, h), BYTE)
surf_array_a[1:ow+1:, 1:oh+1:] = pygame.surfarray.array_alpha(surface)
surf_array_rgb[0, ::] = surf_array_rgb[1, ::]
surf_array_rgb[::, 0] = surf_array_rgb[::, 1]
surf_array_rgb[w-1, ::] = surf_array_rgb[w-2, ::]
surf_array_rgb[::, h - 1] = surf_array_rgb[::, h-2]
s = Numeric.zeros(surf_array_rgb.shape[:2]+(4,), DWORD)
s[::-1, ::, :3] = surf_array_rgb
s[::-1, ::, 3] = surf_array_a
x_steps = [float(n) / self.x_level for n in xrange(self.x_level)]
y_steps = [float(n) / self.y_level for n in xrange(self.y_level)]
self.surfaces = []
for frac_y in y_steps:
row = []
self.surfaces.append(row)
for frac_x in x_steps:
row.append( SubPixelSurface._generate(s, frac_x, frac_y) )
@staticmethod
def _generate(s, frac_x, frac_y):
frac_x, frac_y = frac_y, frac_x
frac_x = 1. - frac_x
sa = int( (1.-frac_x) * (1.-frac_y) * 255. )
sb = int( (1.-frac_x) * frac_y * 255. )
sc = int( frac_x * (1.-frac_y) * 255. )
sd = int( (frac_x * frac_y) * 255. )
a = s[ :-1:, :-1:] * sa
b = s[ 1::, :-1:] * sb
c = s[ :-1:, 1:: ] * sc
d = s[ 1::, 1:: ] * sd
a += b
a += c
a += d
a >>= 8
rgba_data = a.astype(BYTE).tostring()
pygame_surface = pygame.image.fromstring(rgba_data, a.shape[:2][::-1], "RGBA")
pygame_surface = pygame.transform.rotate(pygame_surface, 270)
return pygame_surface
[docs] def at(self, x, y):
"""Gets a sub-pixel surface for a given coordinate.
x -- X coordinate
y -- Y coordinate
"""
surf_x = int( (x - floor(x)) * self.x_level )
surf_y = int( (y - floor(y)) * self.y_level )
return self.surfaces[surf_y][surf_x]