/*=========================================================================

	FRAME.CPP

	Author:  Gary Liddon @ Fareham
	Created:
	Project:
	Purpose:

	Copyright (c) 1997 G R Liddon

===========================================================================*/

#ifndef __FRAME_HPP__
#define __FRAME_HPP__

/*----------------------------------------------------------------------
	Includes
	-------- */

/*	Std Lib
	------- */
#include <iostream>
#include <vector>

/*	Glib
	---- */
#include "gobject.hpp"
#include "gtypes.h"
#include "gstring.hpp"

/*	Local
	----- */
#include "pal.hpp"

/*----------------------------------------------------------------------
	Tyepdefs && Defines
	------------------- */

/*----------------------------------------------------------------------
	Structure defintions
	-------------------- */
class GLIB_API Rect : public GObject
{
public:
	Rect(Rect const & R)
		{ MakeCopy(R);}
	
	void operator=(Rect const & R)
		{ MakeCopy(R);}
		
	Rect(void);
	Rect(int nX,int nY,int nW,int nH)
		{
		X=nX;
		Y=nY;
		W=nW;
		H=nH;
		}

	/* Compare by volume */

	bool operator< (Rect const & R) const
		{
		return((W*H)<(R.W*R.H));
		}

	bool IsColiding(Rect const & NewRect) const;
	void ClipRect(Rect & RectToClip) const;
	int Area(void)	const {return(W*H);}
	
	operator int() const{return(W || H);}

	GLIB_API friend	std::ostream & operator<<(std::ostream & str,Rect const & Fr);

	int	X,Y;
	int	W,H;

protected:
	void MakeCopy(Rect const & R)
	{
		X=R.X;
		Y=R.Y;
		W=R.W;
		H=R.H;
	}
};

class GLIB_API Frame : public GObject
{
public:
	void	ReduceColours(int TargColours);
	void	Expand(int BorderWidth,bool DupeEdges);
	void	AddPixelSurround(int Col);

	void	MakeRGB(u8 * Dest);
	void	MakeRGBA(u8 * Dest,bool ZeroIsTrans=true);

	Frame(void);
	Frame(Frame const &);
	~Frame(void);

	void Plot(Frame & Dest,int X,int Y);
	void PlotTrans(Frame & Dest,int X,int Y,int TrCol=0);
	void PlotBox(Rect const & R,int Col);

	
	void operator=(Frame const &Fr){CopyFrame(Fr);}

	operator Rect() const{return(Rect(X,Y,Width,Height));}

	bool operator<(Frame const &Fr) const;
	bool operator==(Frame const &Fr) const;

	void SetFrame(u8 const * nBuffa,int W,int H,Palette const & NewPal);

	void ReduceSinglePixels(int Threshold);
	void SaveLbm(char const * Lbm);

	void ReduceSize(void);
	Rect FindBoundingRect(void);
	void Crop(Rect const & RetRect);

	bool Grab(Frame const & Fr,Rect const & RetRect);
	bool IsBlank(u8 BlankVal=0);

	u8 const * SeeData(void) const {return(Buffa);}
	int GetWidth(void) const {return(Width);}
	int GetHeight(void)const {return(Height);}
	int GetNumOfCols(void) const;

	bool DrawBox(Rect const & R,u8 Col);

	const Palette & GetPal(void) const {return(MyPal);}
	
	Palette & GetPal(void){return(MyPal);}

	void	SetPal(Palette const & NewPal){MyPal=NewPal;}
	void	Remap(Palette const & P);
	void 	LoadLbm(char const * Lbm);
	void	ReplaceColour(int ColNum,int RepNum);

	void	SetX(int nX)	{X=nX;}
	void	SetY(int nY)	{Y=nY;}

	int		GetX(void) const {return(X);}
	int		GetY(void) const {return(Y);}
	const char * GetName(void) const	{	return(Name);	}

	void	SetName(const char * NewName)	{	Name=NewName;	}
	void	ReducePal(void);
	void 	Clear(int Col);

	void	LoadBMP(char const * Lbm);

	void	FlipX(void);
	void	FlipY(void);

	void	Resize(int NewWidth,int NewHeight);
	u8		GetPixel(int PixX,int PixY)		{ return(Buffa[PixX+(PixY*Width)]);}

protected:
	void	CopyFrame(Frame const &);

	void	DumpStuff(void);
	void	InitFrame(void);

	Palette	MyPal;

	GString Name;

	u8 *	Buffa;
	int		Width;
	int		Height;
	int		X,Y;
};

/*---------------------------------------------------------------------- */

#endif	/* __FRAME_HPP__ */

/*===========================================================================
 end */