/*************************************************
*                                                *
*  EasyBMP Cross-Platform Windows Bitmap Library * 
*                                                *
*  Author: Paul Macklin                          *
*   email: macklin01@users.sourceforge.net       *
* support: http://easybmp.sourceforge.net        *
*                                                *
*          file: EasyBMP_VariousBMPutilities.h   *
*    date added: 05-02-2005                      *
* date modified: 12-01-2006                      *
*       version: 1.06                            *
*                                                *
*   License: BSD (revised/modified)              *
* Copyright: 2005-6 by the EasyBMP Project       * 
*                                                *
* description: Defines BMP class                 *
*                                                *
*************************************************/

#ifndef _EasyBMP_BMP_h_
#define _EasyBMP_BMP_h_

#include <vector>

bool SafeFread( char* buffer, int size, int number, FILE* fp );
bool EasyBMPcheckDataSize( void );

class BMP
{private:

 int BitDepth;
 int Width;
 int Height;
 RGBApixel** Pixels;
 RGBApixel* Colors;
 int XPelsPerMeter;
 int YPelsPerMeter;

 ebmpBYTE* MetaData1;
 int SizeOfMetaData1;
 ebmpBYTE* MetaData2;
 int SizeOfMetaData2;
   
 bool Read32bitRow( ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Read24bitRow( ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Read8bitRow(  ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Read4bitRow(  ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Read1bitRow(  ebmpBYTE* Buffer, int BufferSize, int Row );
   
 bool Write32bitRow( ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Write24bitRow( ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Write8bitRow(  ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Write4bitRow(  ebmpBYTE* Buffer, int BufferSize, int Row );
 bool Write1bitRow(  ebmpBYTE* Buffer, int BufferSize, int Row );

 bool WriteLittleEndian(std::vector<unsigned char> &data, ebmpBYTE value);
 bool WriteLittleEndian(std::vector<unsigned char> &data, ebmpWORD value);
 bool WriteLittleEndian(std::vector<unsigned char> &data, ebmpDWORD value);
 
 ebmpBYTE FindClosestColor( RGBApixel& input );

 public: 

 int TellBitDepth( void );
 int TellWidth( void );
 int TellHeight( void );
 int TellNumberOfColors( void );
 void SetDPI( int HorizontalDPI, int VerticalDPI );
 int TellVerticalDPI( void );
 int TellHorizontalDPI( void );
  
 BMP();
 BMP( BMP& Input );
 ~BMP();
 RGBApixel* operator()(int i,int j);
 
 RGBApixel GetPixel( int i, int j ) const;
 bool SetPixel( int i, int j, RGBApixel NewPixel );
 
 bool CreateStandardColorTable( void );
 
 bool SetSize( int NewWidth, int NewHeight );
 bool SetBitDepth( int NewDepth );
 bool WriteToFile( const char* FileName );
 bool WriteToVector( std::vector<unsigned char> &data );
 bool ReadFromFile( const char* FileName );
 
 RGBApixel GetColor( int ColorNumber );
 bool SetColor( int ColorNumber, RGBApixel NewColor ); 
};

#endif
