/*
	Copyright (C) 2006 yopyop
	Copyright (C) 2008-2012 DeSmuME team

	This file is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 2 of the License, or
	(at your option) any later version.

	This file is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with the this software.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef __GPU_OSD_
#define __GPU_OSD_

#include <stdarg.h>

#include "types.h"

#ifdef HAVE_LIBAGG
#include <stdlib.h>
#include <time.h>

#include "aggdraw.h"

#define OSD_MAX_LINES 4
#define OSD_TIMER_SECS 2


struct HudCoordinates{
	int x;
	int y;
	int xsize;
	int ysize;
	int storedx;
	int storedy;
	int clicked;
};

struct HudStruct
{
public:
	HudStruct()
	{
		resetTransient();
	}

	void resetTransient()
	{
		fps = 0;
		fps3d = 0;
		cpuload[0] = cpuload[1] = 0;
		cpuloopIterationCount = 0;
		memset(rtcString, 0, sizeof(rtcString));
		clicked = false;
	}

	HudCoordinates SavestateSlots;
	HudCoordinates FpsDisplay;
	HudCoordinates FrameCounter;
	HudCoordinates InputDisplay;
	HudCoordinates GraphicalInputDisplay;
	HudCoordinates LagFrameCounter;
	HudCoordinates Microphone;
	HudCoordinates RTCDisplay;
	HudCoordinates Dummy;

	HudCoordinates &hud(int i) { return ((HudCoordinates*)this)[i]; }
	void reset();
	void rescale(double oldScale, double newScale);

	int fps, fps3d, cpuload[2], cpuloopIterationCount;
	char rtcString[25];
	bool clicked;
};

void EditHud(s32 x, s32 y, HudStruct *hudstruct);
void HudClickRelease(HudStruct *hudstruct);

void DrawHUD();

extern HudStruct Hud;
extern bool HudEditorMode;

class OSDCLASS
{
private:
	u64		offset;
	u8		mode;
	
	u16		rotAngle;

	u16		lineText_x;
	u16		lineText_y;
	AggColor		lineText_color;
	u8		lastLineText;
	char	*lineText[OSD_MAX_LINES+1];
	time_t	lineTimer[OSD_MAX_LINES+1];
	AggColor lineColor[OSD_MAX_LINES+1];

	bool	needUpdate;

	bool	checkTimers();

public:
	char	name[7];		// for debuging
	bool    singleScreen;
	bool    swapScreens;
	double	scale;
#ifdef AGG2D_USE_VECTORFONTS
	bool	useVectorFonts;
#endif

	OSDCLASS(u8 core);
	~OSDCLASS();

	void	setOffset(u16 ofs);
	void	setRotate(u16 angle);
	void	update();
	void	clear();
	void	setListCoord(u16 x, u16 y);
	void	setLineColor(u8 r, u8 b, u8 g);
	void	addLine(const char* fmt);
	void	addLine(const char* fmt, va_list args);
	void	addFixed(u16 x, u16 y, const char *fmt, ...);
	void	border(bool enabled);
	
	void SaveHudEditor();
};

extern OSDCLASS	*osd;
#else /* HAVE_LIBAGG */
void DrawHUD();

class OSDCLASS {
public:
  OSDCLASS(u8 core);
  ~OSDCLASS();
  void    update();
  void    clear();
  void    setLineColor(u8 r, u8 b, u8 g);
  void    addLine(const char *fmt, ...);
		void SaveHudEditor() {}
};

extern OSDCLASS        *osd;
#endif
#endif
