#!/usr/bin/python3 import socket import PIL from PIL import Image, ImageColor import argparse import threading sizex = 800 sizey = 600 XSPLIT = 5 YSPLIT = 5 effectivex = sizex effectivey = sizey old_framebuffer = Image.new("RGBA", (sizex, sizey), None) framebuffer = Image.new("RGBA", (sizex, sizey), (0,0,0,0)) parser = argparse.ArgumentParser() mode = parser.add_mutually_exclusive_group(required=True) mode.add_argument("--color") mode.add_argument("--image") parser.add_argument("--host", default="fsi-hase.fsmi.uni-karlsruhe.de") parser.add_argument("--port", "-p", type=int, default="3141") parser.add_argument("--dumb", action="store_true") parser.add_argument("--yoffset", default=19, type=int) parser.add_argument("--repeat", action="store_true") args = parser.parse_args() class DrawThread(threading.Thread): def run(self): xfrom = self.args["xfrom"] yfrom = self.args["yfrom"] xto = self.args["xto"] yto = self.args["yto"] s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((args.host, args.port)) buf = bytearray() global framebuffer for x in range(xfrom,xto): for y in range(yfrom,yto): value = b"%02X%02X%02X%02X"%framebuffer.getpixel((x,y)) buf += b"PX %b %b %b\n"%(bytes(str(x), "ascii"),bytes(str(y+args.yoffset), "ascii"),value) s.send(buf) while args.repeat: s.send(buf) s.close() def draw_dumb(): for x in range(sizex): for y in range(sizey): value = "%02X%02X%02X%02X"%framebuffer.getpixel((x,y)) wf.write("PX {} {} {}\n".format(x,y+args.yoffset,value)) while args.repeat: for x in range(sizex): for y in range(sizey): value = "%02X%02X%02X%02X"%framebuffer.getpixel((x,y)) wf.write("PX {} {} {}\n".format(x,y+args.yoffset,value)) def draw(): buf = bytearray() global framebuffer, old_framebuffer if framebuffer == old_framebuffer: # nothing to draw return for x in range(effectivex): for y in range(effectivey): # if framebuffer.getpixel((x,y))[3] != 0 and framebuffer.getpixel((x,y)) != old_framebuffer.getpixel((x,y)): value = b"%02X%02X%02X%02X"%framebuffer.getpixel((x,y)) buf += b"PX %b %b %b\n"%(bytes(str(x), "ascii"),bytes(str(y+args.yoffset), "ascii"),value) s.send(buf) while args.repeat: s.send(buf) old_framebuffer = framebuffer if args.color: framebuffer.paste(ImageColor.getrgb(args.color), (0,0,sizex,sizey)) if args.dumb: draw_dumb() else: draw() elif args.image: image = Image.open(str(args.image)) framebuffer.paste(image) effectivex = min(image.size[0], sizex) effectivey = min(image.size[1], sizey) if args.dumb: draw_dumb() else: draw() wf.close() s.close()