from casioplot import *

sgn = lambda n:(-1,1)[abs(n) == n]

def rec(name, base, defaut = None):
  try:
    return base[name]
  except:
    return defaut

def fill_auto(x,y,color,param):
  if param == "squared":
    if not ((x-y)%2):set_pixel(x,y,color)
  elif param == "full":
    set_pixel(x,y,color)
  elif param == "opaque":
    set_pixel(x,y,(248,255,248))

def circle(x_c, y_c, r, color = (0,0,0)):
  x, y, m = 0, r, 5-4*r
  while x <= y:
    a = 2*[x, y, -x, -y]
    b = [y, x, y, x, -y, -x, -y, -x]
    for i in range(8):
      set_pixel(a[i]+x_c, b[i]+y_c, color)
    
    if m > 0:
      y -= 1
      m -= 8*y
    x += 1
    m += 8*x+1 

def line(x1, y1, x2, y2, color=(0,0,0)):
  d = sorted([abs(x2-x1),abs(y2-y1)])
  if d != [abs(x2-x1),abs(y2-y1)]:
    s = [sgn(y2-y1),sgn(x2-x1)]
    coord = [y1, x1]
    x = 1
  else:
    s = [sgn(x2-x1),sgn(y2-y1)]
    coord = [x1, y1]
    x = 0
  set_pixel(x1,y1,color)
  
  cumul = d[1] >> 1
  for i in range(d[1]):
    coord[1] += s[1]
    cumul += d[0]
    if cumul > d[1]:
      cumul -= d[1]
      coord[0] += s[0]
    set_pixel(coord[x],coord[(x+1)%2],color)
  set_pixel(x2,y2,color)
    
def polygon(*coord, **kwargs):
  color = rec("color", kwargs, (0,0,0))
  fill = rec("fill", kwargs, None)
  x, y = list(), list()
  for i in range(len(coord)-1):
    x.append(coord[i][0])
    y.append(coord[i][1])
    line(coord[i][0],coord[i][1],coord[i+1][0],coord[i+1][1],color)
  x.append(coord[-1][0])
  y.append(coord[-1][1])
  line(coord[0][0],coord[0][1],coord[-1][0],coord[-1][1],color)
  if fill:
    for i in range(min(x)+1, max(x)):
      detect = 0
      for j in range(min(y),max(y)):
        if get_pixel(i,j) == color:detect += 1
        elif detect == 1:fill_auto(i,j,(color[0]+8,color[1]+8,color[2]+8),fill) 
        
def progress_bar(x,y,long,larg,prct,color = (0,255,0)):
  polygon((x,y),(x+long,y),(x+long,y+larg),(x,y+larg))
  line(x+2,y+larg+1,x+long+1,y+larg+1,(200,200,200))
  line(x+long+1,y+2,x+long+1,y+larg+1,(200,200,200))
  prct = int((long*prct)/100)-1
  if prct < 0:prct = 1
  for i in range(1,larg):
    line(1+x,y+i,x+prct,y+i,(color[0]-7*i,color[1]-7*i,color[2]-7*i))

def rectangle(x,y,long,larg,**kwargs):
  fill = rec("fill", kwargs, None)
  color = rec("color", kwargs, (0,0,0)) 
  polygon((x,y),(x+long,y),(x+long,y+larg),(x,y+larg),color = color)
  if fill:
    for i in range(1,long):
      for j in range(1,larg):
        fill_auto(i+x,j+y,color,fill)