/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#include "image/image.hh"
#include "loaders/load.hh"
#include "image_man.hh"
#include "string/string.hh"
#include "app/app.hh"
#include "g1_tint.hh"
#include "video/display.hh"

// this image is used if the correct image could not be loaded
static i4_image_class *default_image=0;
static int images_have_been_loaded=0;


g1_image_ref *g1_image_ref::first=0;

g1_image_ref::g1_image_ref(const char *filename)
{
  image_name=filename;
  next=first;
  first=this;
  im=0;
}

g1_image_ref::~g1_image_ref()
{
  if (first==this)
    first=first->next;
  else
  {
    g1_image_ref *f=first;
    while (f->next!=this)
      f=f->next;
    f->next=next;    
  }
}

void g1_image_ref::load()
{
  im=i4_load_image(image_name);
  if (!im)
  {
    i4_warning("could not load %s", image_name);
    im=default_image;
  }

}

void g1_image_ref::set_image(const char *filename)
{
  cleanup();

  image_name=filename;

  if (images_have_been_loaded)
  {
    im=i4_load_image(image_name);
    if (!im)
    {
      i4_warning("could not load %s", image_name);
      im=default_image;
    }
  }
}

void g1_image_ref::cleanup()
{
  if (im && im!=default_image)
  {
    delete im;
    im=0;
  }
 
}


void g1_load_images()
{
  i4_image_class *old_default_image=default_image;

  if (default_image)
    delete default_image;
  default_image=i4_load_image("bitmaps/default.tga");
  if (!default_image)
    i4_error("could not load default image bitmaps/default.tga");


  for (g1_image_ref *f=g1_image_ref::first; f; f=f->next)
  {
    f->cleanup();
    f->load();

  }

  images_have_been_loaded=1;
}


void g1_unload_images()
{
  for (g1_image_ref *f=g1_image_ref::first; f; f=f->next)
    f->cleanup();

  if (default_image)
  {
    delete default_image;
    default_image=0;
  }
  images_have_been_loaded=0;
}


g1_team_icon_ref::g1_team_icon_ref(const char *filename)
  : g1_image_ref(filename)
{
  for (int i=0; i>16)&0xff)*tr);
  int g=i4_f_to_i(((color>>8)&0xff)*tg);
  int b=i4_f_to_i(((color>>0)&0xff)*tb);

  return (r<<16)|(g<<8)|b;
}

void g1_team_icon_ref::load()
{
  g1_image_ref::load();

  
  const i4_pal *pal=i4_current_app->get_display()->get_palette();
  
  for (int i=0; iwidth(), h=im->height();
    i4_image_class *out=i4_create_image(w,h, pal);

    tr=g1_player_tint_data[i].r;
    tg=g1_player_tint_data[i].g;
    tb=g1_player_tint_data[i].b;

    for (int y=0; yget_pixel(x,y);
        out->put_pixel(x,y, tint_color(color));        
      }

    tinted_icons[i]=out;    
  }
}