#ifndef GAMETTF_INCLUDE_H
#define GAMETTF_INCLUDE_H

#ifdef ENABLE_TTF_EXTENSION

// autolink libreria
#ifdef ARM
    #ifdef _DEBUG
        #pragma comment( lib, "freetype_armD.lib" )
	#else
        #pragma comment( lib, "freetype_ARM.lib" )
	#endif
#else
    #ifdef _DEBUG
        #pragma comment( lib, "freetype214_D.lib" )
	#else
        #pragma comment( lib, "freetype214.lib" )
	#endif
#endif

//

#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H

#include "PFrogConsole.h"
#include "compression/LZArchive.h"
#include <PocketFrog/PocketFrog.h>

#define MAX_CACHE_CHAR 255
#define MAX_LINE_LINEBUFFER 8192
/* Handy routines for converting from fixed point */
#define FT_FLOOR(X)	((X & -64) / 64)
#define FT_CEIL(X)	(((X + 63) & -64) / 64)

using namespace Frog;

class GameTTF
{
private:
	FT_Library *library; /* pointer to library */
	FT_Face face; /* handle to face object */

	// face caricata o no
	bool _faceLoaded;

	// copia locale del buffer caricato
	unsigned char *mbuffer;

	// shader per l'alpha blending del testo
	struct CharBlender : public PixelShader 
	{
		unsigned char pixMapBlending;
		Pixel operator() (Pixel src, Pixel dest) const 
		{
			Pixel RB1 = dest & (RED_MASK | BLUE_MASK);
			Pixel G1  = dest & (GREEN_MASK );
			Pixel RB2 = src & (RED_MASK | BLUE_MASK);
			Pixel G2  = src & (GREEN_MASK );

			Pixel RB = RB1 + (((RB2-RB1) * (pixMapBlending>>3)) >> 5);
			Pixel G  = G1 + (((G2-G1)*(pixMapBlending>>2))>>6);

			RB &= (RED_MASK | BLUE_MASK);
			G  &= (GREEN_MASK);

			return RB | G;
		}
	};
	CharBlender charshader;

	// strutture usate per cachare i glyph del font corrente
	// (impostate nel setsize)
	struct Cacher {
		bool glyph_loaded;	// ho già caricato il glyph
		FT_Glyph glyph;	// glyph di quel carattere
#if 0
		int minx, miny, maxx;
#endif
		int maxy;
		int advance;	// di quanto spostarsi per poter disegnare il prox char
		FT_BitmapGlyph bit;	// la pixmap
	};
	// puntatore all'ultimo font cachato in setsize
	struct Cacher *CACHER;

	
	// colori da usare (Settati in setfont)
	Pixel forecolor;

	// ed ecco la struct che cacha la famiglia di fonts per size
	struct FamCacher {
		
		int width, height;
		
		struct Cacher CACHER[MAX_CACHE_CHAR];	// Caching dei caratteri
		
		// ultima volta che hai disegnato un font con questa famiglia
		// utilizzato per l'autoflush dei font inutilizzati
		unsigned long last_update;

		bool toBeDeleted;	// riempito in fase di flush o quando la famiglia expira

		struct FamCacher *next;
	};
	struct FamCacher *FAMCACHER;
	// puntatore all'ultima famiglia settata in setsize
	struct FamCacher *CURRFAMCACHE;

	// flusha una o tutte le famiglie di fonts(se int e height=-1, flusha tutto)
	void FlushCache(int cachedwidth, int cachedheight);

	// usata nella drawtext
	char textbuffer[MAX_LINE_LINEBUFFER];

	bool DrawChar(Display *display, int x, int y, char c);

public:
	GameTTF(FT_Library *library);
	~GameTTF(void);
	bool LoadFont(const TCHAR *datfile, const TCHAR *fontfile);
	bool SetSize(int width, int height, Pixel foreColor, Pixel backColor);
	unsigned long DrawTextEx(Display *display, int x, int y, char *pattern, ...);
	unsigned long DrawText(Display *display, int x, int y, char *textbuffer);
};

#endif

#endif
