/* fade.c */

#include <stdlib.h>
#include <string.h>

#include "DeskLib:KernelSWIs.h"

/* 15/16 is a suitable multiplier for a complete fade after 100 iterations */
#define fade_MULTIPLIER 15

fade_table fade_lookup;

void fade_init()
{
  int i;
  fade_rgb rgb;

  for (i = 0; i < 256; i++)
  {
    rgb.value = fade_byte_to_rgb(i);
    rgb.rgb.red = (rgb.rgb.red * fade_MULTIPLIER) >> 4;
    rgb.rgb.green = (rgb.rgb.green * fade_MULTIPLIER) >> 4;
    rgb.rgb.blue = (rgb.rgb.blue * fade_MULTIPLIER) >> 4;
    fade_lookup.value[i] = fade_rgb_to_byte(rgb);
  }
}

int fade_rgb_to_byte(fade_rgb rgb)
{
  int red,green,blue;
  int result;

  red = rgb.rgb.red >> 4;
  green = rgb.rgb.green >> 4;
  blue = rgb.rgb.blue >> 4;
  /* Bottom 2 bits of result are combination of r,g,b bottom 2 bits component */
  result = ((red & 3) + (green & 3) + (blue & 3)) / 3;
  /* Rest of red... */
  result |= (red & 4) | ((red & 8) << 1) |
  /* ...green */
            ((green & 12) << 3) |
  /* ...and blue */
            ((blue & 4) << 1) | ((blue & 8) << 4);
  return result;
}

int fade_byte_to_rgb(int byte)
{
  fade_rgb rgb;

  rgb.rgb.dummy = 0;
  rgb.rgb.red = (byte & 7) | ((byte & 16) >> 1);
  rgb.rgb.red |= (rgb.rgb.red << 4);
  rgb.rgb.green = (byte & 3) | ((byte & 96) >> 3);
  rgb.rgb.green |= (rgb.rgb.green << 4);
  rgb.rgb.blue = (byte & 3) | ((byte & 8) >> 1) | ((byte & 128) >> 4);
  rgb.rgb.blue |= (rgb.rgb.blue << 4);

  return rgb.value;
}

void fade_screen(void)
{
  int scrnsize;

  /* Copy currently displayed bank to hidden bank */
  OS_ReadModeVariable(-1,7,&scrnsize);
  memcpy(scrn_bank_base[(scrn_work_bank - 1) ^ 1],
  	 scrn_bank_base[scrn_work_bank - 1],scrnsize);
