fast animation working

This commit is contained in:
2020-02-05 12:54:12 +01:00
parent 253fe5ba91
commit 34ffde98ee

View File

@@ -5,16 +5,16 @@ from PIL import Image, ImageColor
import argparse import argparse
import threading import threading
sizex = 800 sizex = 800
sizey = 600 sizey = 600
XSPLIT = 5 XSPLIT = 5
YSPLIT = 5 YSPLIT = 5
threads = [] threads = []
effectivex = sizex dirtybox = (0,0,sizex,sizey)
effectivey = sizey
old_framebuffer = Image.new("RGBA", (sizex, sizey), None) old_framebuffer = Image.new("RGBA", (sizex, sizey), None)
framebuffer = Image.new("RGBA", (sizex, sizey), (0,0,0,0)) framebuffer = Image.new("RGBA", (sizex, sizey), (0,0,0,0))
@@ -48,8 +48,9 @@ class DrawThread(threading.Thread):
global framebuffer global framebuffer
for x in range(xfrom,xto): for x in range(xfrom,xto):
for y in range(yfrom,yto): for y in range(yfrom,yto):
value = b"%02X%02X%02X%02X"%framebuffer.getpixel((x,y)) if framebuffer.getpixel((x,y))[3] != 0:
buf += b"PX %b %b %b\n"%(bytes(str(x), "ascii"),bytes(str(y+args.yoffset), "ascii"),value) value = b"%02X%02X%02X%02X"%framebuffer.getpixel((x,y))
buf += b"PX %d %d %b\n"%(x,y,value)
s.send(buf) s.send(buf)
while args.repeat: while args.repeat:
@@ -65,34 +66,41 @@ def draw():
threads = [] threads = []
chunkxsize = effectivex//XSPLIT dirtysizex = (dirtybox[2]-dirtybox[0])
chunkysize = effectivey//YSPLIT dirtysizey = (dirtybox[3]-dirtybox[1])
remainderx = effectivex % XSPLIT chunkxsize = dirtysizex//XSPLIT
remaindery = effectivey % YSPLIT chunkysize = dirtysizey//YSPLIT
remainderx = dirtysizex % XSPLIT
remaindery = dirtysizey % YSPLIT
offsetx = dirtybox[0]
offsety = dirtybox[1]
xchunks = [] xchunks = []
ychunks = [] ychunks = []
remainingx = effectivex
remainingy = effectivey
while remainingx > remainderx: allocatedx = 0
start = effectivex - remainingx
remainingx -= chunkxsize remainingx = (dirtybox[2]-dirtybox[0])
stop = effectivex - remainingx remainingy = (dirtybox[3]-dirtybox[0])
xchunks.append((start, stop))
for i in range(dirtysizex//chunkxsize):
start = offsetx + (i*chunkxsize)
stop = offsetx + ((i+1)*chunkxsize)
xchunks.append((start,stop))
if remainderx != 0: if remainderx != 0:
xchunks.append((effectivex-remainingx, effectivex)) xchunks.append(((offsetx+dirtysizex)-remainderx, offsetx+remainderx))
while remainingy > remaindery: for i in range(dirtysizey//chunkysize):
start = effectivey - remainingy start = offsety + (i*chunkysize)
remainingy -= chunkysize stop = offsety + ((i+1)*chunkysize)
stop = effectivey - remainingy ychunks.append((start,stop))
ychunks.append((start, stop))
if remaindery != 0: if remaindery != 0:
ychunks.append((effectivey-remainingy, effectivey)) ychunks.append(((offsety+dirtysizey)-remaindery, offsety+remaindery))
for xchunk in xchunks: for xchunk in xchunks:
for ychunk in ychunks: for ychunk in ychunks:
@@ -109,12 +117,16 @@ elif args.image:
coordinates = (0,0) coordinates = (0,0)
image = Image.open(str(args.image)) image = Image.open(str(args.image))
framebuffer.paste(image) framebuffer.paste(image)
if not args.animate: if args.animate:
effectivex = min(image.size[0], sizex) dirtybox = (*coordinates, min(image.size[0]+coordinates[0], sizex), min(image.size[1]+coordinates[1], sizey))
effectivey = min(image.size[1], sizey) else:
dirtybox = (0,0,min(image.size[0], sizex),min(image.size[1], sizey))
draw() draw()
while args.animate: while args.animate:
coordinates = (coordinates[0] + 5, coordinates[1] + 5) coordinates = (coordinates[0] + 5, coordinates[1] + 5)
if coordinates[0] >= sizex or coordinates[1] >= sizey:
break
dirtybox = (*coordinates, min(image.size[0]+coordinates[0], sizex), min(image.size[1]+coordinates[1], sizey))
framebuffer = Image.new("RGBA", (sizex, sizey), (0,0,0,0)) framebuffer = Image.new("RGBA", (sizex, sizey), (0,0,0,0))
framebuffer.paste(image, coordinates) framebuffer.paste(image, coordinates)
draw() draw()