#!/usr/local/bin/cz --
use b

int r = 3

Main:
	getargs(int, r)
	space(800,480)
	rainbow_init()
	full_blend()
	gr_getc()
	anim_blend()
	gr_exit(0)

def full_blend():
	for(x, -w_2, w_2):
		for(y, -h_2, h_2):
			rainbow((x+y/4.0)*180.0/w_2)
			point(x, y)
	Paint()

def anim_blend():
	local(paint_handle_events, 0):
		num d = 0
		num cx = -w_2, cy = -h_2, cr2 = 10000
		num ox = Rand(-r-1, r+1)
		num oy = Rand(-r-1, r+1)
		repeat:
			bm_start()
			for(x, -w_2-r, w_2+r, r*2):
				for(y, -h_2-r, h_2+r, r*2):
					ox += Rand(-1, 1)
					ox *= 0.99
					oy += Rand(-1, 1)
					oy *= 0.99
					int x_ = x + ox
					int y_ = y + oy
					int dx = x_ - cx
					int dy = y_ - cy
					int d2 = dx*dx + dy*dy
					if d2 < cr2:
						if d2 < cr2/2:
							if d2 < cr2/4:
								rainbow(d2 / (cr2/4) * 360)
							 else:
								white()
						 else:
							black()
					 else:
						rainbow((x_+y_/4.0+d)*180.0/w_2)
					square_fill(x_, y_, r)
			d += 10
			cx += 5
			cy += 2.5
			Paint()
			bm("done")
			if gr_pollc() >= 0:
				break

# TODO mv to libb:

int gr_pollc()
	gr_getc_char = -1
	thunk old_handler = key_handler_default
	key_handler_default = thunk(gr_getc_handler)
	handle_events(0)
	key_handler_default = old_handler
	return gr_getc_char

def square_fill(x, y, r)
	square_fill_3(x, y, r)
square_fill_3(x, y, r):
	rect_fill(x-r, y-r, r*2, r*2)
