/**********************************************************************
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 "loaders/bmp_write.hh"
#include "image/image.hh"
#include "palette/pal.hh"
#include "file/file.hh"

inline void i4_32bpp_to_rgb(w32 color, w8 &r, w8 &g, w8 &b)
{
  r=(color>>16)&0xff;
  g=(color>>8)&0xff;
  b=color&0xff;
}

i4_bool i4_write_bmp(i4_image_class *im, i4_file_class *fp)
{
  const i4_pal *pal=im->get_pal();

  if (pal->source.pixel_depth==I4_8BIT)
  {
    w32 w=im->width();
    w32 h=im->height();
    w32 store_width=(w+3)&(~3);
    sw32 i;

    w8 buf[10];
    buf[0]='B';    buf[1]='M';

    if (fp->write(buf,2)!=2) return i4_F;
    fp->write_32(54 + 
                 4*256 +
                 store_width * h);

    fp->write_32(0);
    fp->write_32(54 + 256*4);

    fp->write_32(40);
    fp->write_32(w);
    fp->write_32(h);
    fp->write_16(1);
    fp->write_16(8);
    fp->write_32(0);
    fp->write_32(0);
    fp->write_32(320);
    fp->write_32(200);
    fp->write_32(256);
    fp->write_32(256);

    w32 *p=pal->source.lookup;
    for (i=0; i<256; i++)
    {
      w8 r,g,b;
      i4_32bpp_to_rgb(*p,r,g,b);
     
      buf[0]=b;
      buf[1]=g;
      buf[2]=r;
      buf[3]=0;

      fp->write(buf,4);
      p++;
    }
  
    buf[0]=0;
    buf[1]=0;
    buf[2]=0;
                 
    
    w8 *data=(w8 *)im->data;
    for (i=h; i; i--)
    {
      fp->write(data, w);
      data-=w;

      if (w!=store_width)
        fp->write(buf,w&3);
    }
    return i4_T;
  }
  else
    return i4_F;
}