#pragma once

#ifndef ske_H_INC
#define ske_H_INC

#include "modern_skinselector.h"
#include "modern_commonprototypes.h"

/* Definitions */
#define GetAValue(argb)((BYTE)((argb)>>24))

#define DEFAULTSKINSECTION  "ModernSkin"



#define MAX_BUFF_SIZE       255*400
#define MAXSN_BUFF_SIZE     255*1000

/* External variables */

/* Structs */

struct SKINOBJECTSLIST
{
	DWORD dwObjLPReserved;
	DWORD dwObjLPAlocated;
	TCHAR *szSkinPlace;
	LISTMODERNMASK	*pMaskList;
	SKINOBJECTDESCRIPTOR  *pObjects;
	SortedList *pTextList;
};

struct GLYPHIMAGE
{
	TCHAR  *szFileName;
	DWORD   dwLoadedTimes;
	HBITMAP hGlyph;
	BYTE    isSemiTransp;
};

typedef GLYPHIMAGE *LPGLYPHIMAGE;

struct CURRWNDIMAGEDATA
{
	HDC hImageDC;
	HDC hBackDC;
	HDC hScreenDC;
	HBITMAP hImageDIB, hImageOld;
	HBITMAP hBackDIB, hBackOld;
	BYTE * hImageDIBByte;
	BYTE * hBackDIBByte;
	int Width, Height;
};

struct EFFECTSSTACKITEM
{
	HDC hdc;
	BYTE EffectID;
	DWORD FirstColor;
	DWORD SecondColor;
};

#pragma pack(push, 1)
/* tga header */
struct tga_header_t
{
	BYTE id_lenght;          /* size of image id */
	BYTE colormap_type;      /* 1 is has a colormap */
	BYTE image_type;         /* compression type */

	short	cm_first_entry;       /* colormap origin */
	short	cm_length;            /* colormap length */
	BYTE cm_size;               /* colormap size */

	short	x_origin;             /* bottom left x coord origin */
	short	y_origin;             /* bottom left y coord origin */

	short	width;                /* picture width (in pixels) */
	short	height;               /* picture height (in pixels) */

	BYTE pixel_depth;        /* bits per pixel: 8, 16, 24 or 32 */
	BYTE image_descriptor;   /* 24 bits = 0x00; 32 bits = 0x80 */
};
#pragma pack(pop)

class IniParser
{
public:
	enum {
		FLAG_WITH_SETTINGS = 0,
		FLAG_ONLY_OBJECTS = 1,
	};

	enum { IT_UNKNOWN, IT_FILE, IT_RESOURCE };

	typedef HRESULT(*ParserCallback_t)(const char * szSection, const char * szKey, const char * szValue, IniParser * This);

	IniParser(TCHAR * szFileName, BYTE flags = FLAG_WITH_SETTINGS);
	IniParser(HINSTANCE hInst, const char *resourceName, const char *resourceType, BYTE flags = FLAG_ONLY_OBJECTS);
	~IniParser();

	bool CheckOK() { return _isValid; }
	HRESULT Parse(ParserCallback_t pLineCallBackProc, LPARAM lParam);

	static HRESULT WriteStrToDb(const char * szSection, const char * szKey, const char * szValue, IniParser * This);
	static int GetSkinFolder(IN const TCHAR * szFileName, OUT TCHAR * pszFolderName);

private:
	// common
	enum { MAX_LINE_LEN = 512 };
	int		 _eType;
	bool	_isValid;
	char *	_szSection;
	ParserCallback_t _pLineCallBackProc;
	BOOL   _SecCheck;
	int		_nLine;

	void _DoInit();
	BOOL _DoParseLine(char * szLine);

	// Processing File
	HRESULT _DoParseFile();
	FILE *	_hFile;

	// Processing resource
	void _LoadResourceIni(HINSTANCE hInst, const char *  resourceName, const char * resourceType);
	HRESULT _DoParseResource();
	const char * _RemoveTailings(const char * szLine, size_t& len);

	HGLOBAL _hGlobalRes;
	DWORD   _dwSizeOfRes;
	char *	_pPosition;

	BYTE _Flags;


};


int ske_UnloadSkin(SKINOBJECTSLIST * Skin);
int ske_AddDescriptorToSkinObjectList(SKINOBJECTDESCRIPTOR *lpDescr, SKINOBJECTSLIST* Skin);
INT_PTR ske_Service_DrawGlyph(WPARAM wParam, LPARAM lParam);



#endif