jsuarez/tools/kiv.py (129 lines of code) (raw):
from pdb import set_trace as T
import numpy as np
import pygame
import kivy as kv
from kivy.app import App
from kivy.core.image import ImageData
from kivy.uix.widget import Widget
from kivy.core.image import Image
from kivy.graphics.texture import Texture
from kivy.graphics import Rectangle, Color
from kivy.config import Config
from kivy.clock import Clock
from enum import Enum
class Neon(Enum):
def rgb(h):
h = h.lstrip('#')
return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
RED = rgb('#ff0000')
ORANGE = rgb('#ff8000')
YELLOW = rgb('#ffff00')
GREEN = rgb('#00ff00')
MINT = rgb('#00ff80')
CYAN = rgb('#00ffff')
BLUE = rgb('#0000ff')
PURPLE = rgb('#8000ff')
MAGENTA = rgb('#ff00ff')
WHITE = rgb('#ffffff')
GRAY = rgb('#666666')
BLACK = rgb('#000000')
BLOOD = rgb('#bb0000')
BROWN = rgb('#7a3402')
GOLD = rgb('#eec600') #238 198
SILVER = rgb('#b8b8b8')
FUCHSIA = rgb('#ff0080')
SPRING = rgb('#80ff80')
SKY = rgb('#0080ff')
TERM = rgb('#41ff00')
def rand12():
ind = np.random.randint(0, 12)
return (
Neon.RED, Neon.ORANGE, Neon.YELLOW,
Neon.GREEN, Neon.MINT, Neon.CYAN,
Neon.BLUE, Neon.PURPLE, Neon.MAGENTA,
Neon.FUCHSIA, Neon.SPRING, Neon.SKY)[ind].value
def blit(canvas, data, pos):
data = data.tostring()
tex = Texture.create(size=sz, colorfmt="rgb")
tex.blit_buffer(data, bufferfmt="ubyte", colorfmt="rgb")
canvas.texture = tex
canvas.pos = pos
def makeTex():
#sz = (2048+256, 1024+256)
sz = (2880, 1800)
texture = Texture.create(size=sz, colorfmt="rgb")
arr = np.random.randint(0, 256, (sz[0], sz[1], 3)).astype(np.uint8)
data = arr.tostring()
texture.blit_buffer(data, bufferfmt="ubyte", colorfmt="rgb")
return texture
class Container(Widget):
def __init__(self, size, **kwargs):
super(Container, self).__init__(**kwargs)
self.size = size
self.W, self.H = size
with self.canvas:
self.screen = Rectangle(pos=(0, 0), size=size)
self.surf = pygame.Surface((self.W, self.H))
self.texture = Texture.create(size=size, colorfmt="rgb")
def reset(self):
self.fill((Color.BLACK))
if self.border > 0:
self.renderBorder()
def flip(self):
fast = True
if fast:
data = pygame.image.tostring(self.surf, 'RGB', False)
self.texture.blit_buffer(data, bufferfmt="ubyte", colorfmt="rgb")
else:
data = pygame.surfarray.array3d(self.surf)
data = data.transpose(1, 0, 2).tostring()
self.texture.blit_buffer(data, bufferfmt="ubyte", colorfmt="rgb")
self.screen.texture = self.texture
def renderBorder(self):
for coords in [
(0, 0, self.W, self.top),
(0, 0, self.left, self.H),
(0, self.bottom, self.W, self.H),
(self.right, 0, self.W, self.H)
]:
pygame.draw.rect(self.surf, Color.RED, coords)
def blit(self, container, pos, area=None, flags=0):
w, h = pos
pos = (w+self.border, h+self.border)
if type(container) == Surface:
self.canvas.blit(container, pos, area=area, special_flags=flags)
else:
self.canvas.blit(container.canvas, pos, area=area, special_flags=flags)
if self.border > 0:
self.renderBorder()
def fill(self, color):
self.surf.fill((color))
def rect(self, color, coords, lw=0):
pygame.draw.rect(self.surf, color, coords, lw)
def line(self, color, start, end, lw=1):
pygame.draw.line(self.surf, color, start, end, lw)
class Game(Container):
def __init__(self, size, **kwargs):
super(Game, self).__init__(size, **kwargs)
def update(self, t):
print(1/t)
sz = 32
n = 32
self.rect(Neon.GRAY.value, (0, 0, self.W, self.H))
for r in range(n):
for c in range(n):
if r not in (0, n-1):
if c not in (0, n-1):
continue
color = Neon.rand12()
rect = ((c+1)*sz, (r+1)*sz, sz, sz)
self.rect(color, rect)
self.flip()
class MyApp(App):
def build(self):
size = (2048+256, 1024+256)
self.title = 'hello'
#surf = pygame.Surface(size)
#surf.fill(Neon.RED.value)
game = Game(size)
game.update(1)
#Clock.schedule_interval(game.update, 1.0/.001)
return game
if __name__ == '__main__':
MyApp().run()