Source code for inkyphat

from . import inky212x104
from . import fonts

try:
    from PIL import Image, ImageFont, ImageDraw
except ImportError:
    exit("This script requires the pillow module\nInstall with: sudo pip install pillow")


__version__ = '0.1.1'

WHITE = 0
BLACK = 1
RED = 2

WIDTH = 212
HEIGHT = 104

_image = Image.new('P', (WIDTH, HEIGHT))

_draw = ImageDraw.Draw(_image)

_panel = inky212x104.Inky212x104(resolution=(HEIGHT, WIDTH), h_flip=False, v_flip=True)

_panel.set_palette((inky212x104.WHITE, inky212x104.BLACK, inky212x104.RED))

# Export drawing methods into the module namespace
for method in ["arc", "bitmap", "chord", "draw", "ellipse", "fill", "font", "fontmode", "getfont", "im", "ink", "line", "mode", "palette", "pieslice", "point", "polygon", "rectangle", "shape", "text", "textsize"]:
    globals()[method] = getattr(_draw, method)

# Selectively export image methods into the module namespace
for method in ["paste", "putpixel", "getpixel"]:
    globals()[method] = getattr(_image, method)

def get_version():
    return _panel.inky_version

def set_partial_mode(x1,x2,y1,y2):
    _panel.set_partial_mode(y1,y2,x1,x2)

clear_partial_mode = _panel.clear_partial_mode

def clear():
    _image.paste(Image.new('P', (WIDTH, HEIGHT)))

[docs]def create_mask(source, mask=(WHITE, BLACK, RED)): """Create a transparency mask. Takes a paletized source image and converts it into a mask permitting all the colours supported by Inky pHAT (0, 1, 2) or an optional list of allowed colours. :param mask: Optional list of Inky pHAT colours to allow. """ # Create a new 1bpp (on/off) mask image mask_image = Image.new("1", source.size) w, h = source.size for x in range(w): for y in range(h): p = source.getpixel((x, y)) # Mask out just the inkyphat colours we want to show if p in mask: mask_image.putpixel((x, y), 255) return mask_image
[docs]def set_rotation(r): """Set rotation. :param r: Rotation in degrees, can be either 0 or 180 """ if r == 180: _panel.h_flip = True _panel.v_flip = False else: _panel.h_flip = False _panel.v_flip = True
[docs]def set_border(col): """Set panel border colour. :param col: Colour to set, should be one of WHITE, BLACK or RED. """ _panel.set_border(col)
[docs]def set_image(image, colswap=None): """Replace buffer with an image. The colswap argument can be either a dictionary of source (keys) and target (values), or a simple list where the target colour (0 = White, 1 = Black, 2 = Red) is the index. A colswap of [0, 1, 2], for example, will have no effect on a properly prepared image. A colswap of [1, 0, 2] would swap Black and White. This is equivalent to {0:1, 1:0, 2:2} :param image: A valid PIL image, or an image filename :param colswap: (optional) determine how colours should be swapped/mapped """ if isinstance(image, str): image = Image.open(image) if hasattr(image, 'getpixel'): if isinstance(colswap,list): w, h = image.size for x in range(w): for y in range(h): p = image.getpixel((x, y)) try: p = colswap.index(p) image.putpixel((x, y), p) except ValueError: continue if isinstance(colswap,dict): w, h = image.size for x in range(w): for y in range(h): p = image.getpixel((x, y)) if p in colswap.keys(): p = colswap[p] image.putpixel((x, y), p) _image.paste(image)
[docs]def get_image(): """Get the image buffer.""" return _image
[docs]def show(): """Display the current buffy on Inky pHAT.""" for y in range(WIDTH): for x in range(HEIGHT): _panel.set_pixel(x, y, _image.getpixel((y, x))) _panel.update()