#ifndef _NULLSOFT_WINAMP_ML_DEVICES_IMAGE_HEADER
#define _NULLSOFT_WINAMP_ML_DEVICES_IMAGE_HEADER

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#define IMAGE_FILTER_NORMAL		0x00000000
#define IMAGE_FILTER_GRAYSCALE	0x00010000
#define IMAGE_FILTER_BLEND		0x00020000
#define IMAGE_FILTER_MASK		0xFFFF0000


typedef struct ImageInfo
{
	unsigned int width;
	unsigned int height;
	const wchar_t *path;
} ImageInfo;


HBITMAP
Image_Load(const wchar_t *path,
		   unsigned int type, 
		   unsigned int flags,
		   int width,
		   int height);

HBITMAP
Image_LoadEx(HINSTANCE instance, 
		   const wchar_t *path,
		   unsigned int type, 
		   unsigned int flags,
		   int width,
		   int height);

HBITMAP 
Image_LoadSkinned(const wchar_t *path,
				  unsigned int type,
				  unsigned int flags, //ISF_XXX + IMAGE_FILTER_XXX
				  int width,
				  int height,
				  COLORREF backColor, 
				  COLORREF frontColor,
				  COLORREF blendColor); // only valid if IMAGE_FILTER_BLEND set

HBITMAP 
Image_LoadSkinnedEx(HINSTANCE instance, 
				  const wchar_t *path,
				  unsigned int type,
				  unsigned int flags, //ISF_XXX + IMAGE_FILTER_XXX
				  int width,
				  int height,
				  COLORREF backColor, 
				  COLORREF frontColor,
				  COLORREF blendColor); // only valid if IMAGE_FILTER_BLEND set

BOOL
Image_FilterEx(void *pixelData,
			   long width,
			   long height,
			   unsigned short bpp, 
			   unsigned int flags, 
			   COLORREF backColor, 
			   COLORREF frontColor, 
			   COLORREF blendColor);

BOOL
Image_Filter(HBITMAP bitmap, 
			 unsigned int flags, 
			 COLORREF backColor, 
			 COLORREF frontColor, 
			 COLORREF blendColor);

BOOL
Image_BlendEx(void *pixelData,
			  long width,
			  long height,
			  unsigned short bpp,
			  COLORREF blendColor);
BOOL
Image_Blend(HBITMAP bitmap,
			COLORREF blendColor);

HBITMAP
Image_DuplicateDib(HBITMAP source);

BOOL 
Image_ColorOver(HBITMAP hbmp, 
				const RECT *prcPart, 
				BOOL premult, 
				COLORREF rgb);

BOOL 
Image_ColorOverEx(unsigned char *pPixels, 
				  int bitmapCX, 
				  int bitmapCY, 
				  long x, 
				  long y, 
				  long cx, 
				  long cy, 
				  unsigned short bpp, 
				  BOOL premult, 
				  COLORREF rgb);

BOOL 
Image_Premultiply(HBITMAP hbmp, 
				  const RECT *prcPart);

BOOL 
Image_PremultiplyEx(unsigned char *pPixels, 
					int bitmapCX, 
					int bitmapCY, 
					long x, 
					long y, 
					long cx, 
					long cy, 
					unsigned short bpp);

BOOL 
Image_Demultiply(HBITMAP hbmp, 
				  const RECT *prcPart);

BOOL 
Image_DemultiplyEx(unsigned char *pPixels, 
					int bitmapCX, 
					int bitmapCY, 
					long x, 
					long y, 
					long cx, 
					long cy, 
					unsigned short bpp);

BOOL 
Image_Saturate(HBITMAP hbmp, 
			   const RECT *prcPart, 
			   int n, 
			   BOOL fScale);

BOOL 
Image_SaturateEx(unsigned char *pPixels, 
				 int bitmapCX, 
				 int bitmapCY, 
				 long x, 
				 long y, 
				 long cx, 
				 long cy, 
				 unsigned short bpp, 
				 int n, 
				 BOOL fScale);

BOOL 
Image_AdjustAlpha(HBITMAP hbmp, 
				  const RECT *prcPart, 
				  int n, 
				  BOOL fScale);

BOOL 
Image_AdjustAlphaEx(unsigned char *pPixels, 
					int bitmapCX, 
					int bitmapCY, 
					long x, 
					long y, 
					long cx, 
					long cy, 
					unsigned short bpp, 
					int n, 
					BOOL fScale);

BOOL 
Image_AdjustSaturationAlpha(HBITMAP hbmp, 
							const RECT *prcPart, 
							int nSaturation, 
							int nAlpha);

BOOL 
Image_AdjustSaturationAlphaEx(unsigned char *pPixels, 
							  int bitmapCX, 
							  int bitmapCY, 
							  long x, 
							  long y, 
							  long cx, 
							  long cy, 
							  unsigned short bpp, 
							  int nSaturation, 
							  int nAlpha);

BOOL
Image_FillBorder(HDC targetDC, 
				 const RECT *targetRect, 
				 HDC sourceDC, 
				 const RECT *sourceRect, 
				 BOOL fillCenter, 
				 BYTE alphaConstant);


const ImageInfo *
Image_GetBestFit(const ImageInfo *images, 
				 size_t count, 
				 unsigned int width, 
				 unsigned int height);

typedef enum AlphaBlendFlags
{
	AlphaBlend_Normal = 0,
	AlphaBlend_ScaleSource = (1 << 0),
	AlphaBlend_AlignLeft = (1 << 1),
	AlphaBlend_AlignRight = (1 << 2),
	AlphaBlend_AlignCenter = 0,
	AlphaBlend_AlignTop = (1 << 3),
	AlphaBlend_AlignBottom = (1 << 4),
	AlphaBlend_AlignVCenter = 0,
}AlphaBlendFlags;
DEFINE_ENUM_FLAG_OPERATORS(AlphaBlendFlags);

BOOL
Image_AlphaBlend(HDC targetDC, 
				 const RECT *targetRect,
				 HDC sourceDC, 
				 const RECT *sourceRect, 
				 BYTE sourceAlpha, 
				 HBITMAP sourceBitmap, 
				 const RECT *paintRect, 
				 AlphaBlendFlags flags, 
				 RECT *rectOut);

#endif //_NULLSOFT_WINAMP_ML_DEVICES_IMAGE_HEADER