#include <stdlib.h>
#include <sys/bios.h>
#include <sys/libwwc.h>

#define WIDTH 28
#define HEIGHT 18

void gr_pset_to_font(char * font, int x, int y, int c) {
  char b, bc;
  b = (0x80 >> x);
  bc = ~b;

  if (c&1) 
    font[y<<2] |= b;
  else 
    font[y<<2] &= bc;
  if (c&2)
    font[(y<<2)+1] |= b;
  else 
    font[(y<<2)+1] &= bc;
  if (c&4)
    font[(y<<2)+2] |= b;
  else 
    font[(y<<2)+2] &= bc;
  if (c&8)
    font[(y<<2)+3] |= b;
  else 
    font[(y<<2)+3] &= bc;
}

  
#define N_CHAR_FONTS 128
#define GR_FONTS_BASE 128
#define N_GR_FONTS 384
static int display[WIDTH*HEIGHT];
static int n_fonts_used;
static char gr_font[N_GR_FONTS][32];

void gr_putchar(int u, int v, int ch) {
  if (ch >= 0 && ch < N_CHAR_FONTS)
    display[u+v*WIDTH] = ch;
}

void gr_putstr(int u, int v, char s[]) {
  int i;
  i=0;
  while(s[i]) {
    gr_putchar(u+i, v, s[i]);
    i++;
  }
}

void gr_pset(int x, int y, int c) {
  int k, font_no;
  if (x<0 || x>=224 || y<0 || y>=144)
    return;
  k = (x>>3)+(y>>3)*WIDTH;
  font_no = display[k];
  if (font_no < GR_FONTS_BASE ||
      font_no >= GR_FONTS_BASE + N_GR_FONTS) {
    if (n_fonts_used >= N_GR_FONTS)
      return;
    display[k] = n_fonts_used + GR_FONTS_BASE;
    wwc_font_get_colordata(font_no, 1, gr_font[n_fonts_used]);
    n_fonts_used++;
  }
  gr_pset_to_font(gr_font[display[k]-GR_FONTS_BASE], x&7, y&7, c);
}

void gr_update() {
  wwc_font_set_colordata(GR_FONTS_BASE, n_fonts_used, gr_font);
  screen_set_char(SCREEN1, 0, 0, WIDTH, HEIGHT, display);
}

void gr_clear() {
  int i;

  for (i=0; i<WIDTH*HEIGHT; i++)
    display[i] = 0;
  n_fonts_used = 0;
}

void gr_init() {
  int i, j;
  static char monofont[8], font[32];

  display_control(0x01); /* SCREEN1 */
  wwc_set_color_mode(COLOR_MODE_16COLOR);
  for(i=0; i<8; i++) {
    wwc_palette_set_color(0, i,
			  ((i&4) ? 0x800:0) +
			  ((i&2) ? 0x80:0) +
			  ((i&1) ? 0x8:0));
    wwc_palette_set_color(0, i+8,
			  ((i&4) ? 0xf00:0) +
			  ((i&2) ? 0xf0:0) +
			  ((i&1) ? 0xf:0));
  }
  for(i=0; i<N_CHAR_FONTS; i++) {
    text_get_fontdata(i, monofont);
    for(j=0; j<32; j++)
      font[j] = monofont[j/4];
    wwc_font_set_colordata(i, 1, font);
  }
  n_fonts_used = 0;
}

