#ifndef TEXTRENDERER_H
#define TEXTRENDERER_H
#include <string>
#include <map>
#include "video_int.h"
#ifdef Revision
#undef Revision
#endif
#define Revision "textrenderer.h $Revision: 1.5 $"
/**
 * Управление рендерерами текста
 * @author Denis A. Birukov aka Messenger of death
 * @date 14.05.2007
 */
class Text_Renderer;

/**
 * Функция производит создание рендерера текста
 * @param name Имя создаваемого загрузчика
 * @param driver Имя драйвера
 * @param replace если установлен в true, то в случае, если загрузчик с заданным именем уже существует, он будет удален.
 * @return true в случае успеха. false в случае неудачи. Причина неудачи может быть получена через _get_last_error() либо _get_error(); 
 * @author Denis A. Birukov aka Messenger of death
 * @date 14.05.2007
 */
extern "C" bool textrenderer_create ( std::string name, std::string driver, bool replace = false );

/**
 * Функция удаляет рендерер.
 * @param name Имя удаляемого рендерера
 * @return true в случае успеха. false в случае неудачи. Причина неудачи может быть получена через _get_last_error() либо _get_error()
 * @author Denis A. Birukov aka Messenger of death
 * @date 14.05.2007
 */
extern "C" bool textrenderer_remove ( std::string name );

/**
 * Загружает указанное изображение
 * @param renderer_name имя рендерера
 * @return false в случае ошибки, иначе true
 * @author Denis A. Birukov aka Messenger of death
 * @date 14.05.2007
 */
extern "C" Text_Renderer* textrenderer_get ( std::string renderer_name );

/**
 * Функция возвращает ссылку на текст предыдущей ошибки.
 * @return текст ошибки. Если ошибки небыло - строка будет пустой.
 * @author Messenger of death
 * @date 14.05.2007
 */
extern "C" std::string textrenderer_error();
/**
* Получение версии библиотеки
* @return строку, содержащую версию библиотеки
* @author Messenger of death
* @date 14.05.2007
*/
extern "C" std::string textrenderer_version();


class Text_Renderer
{
	public:
		virtual ~Text_Renderer() {};
		/**
		 * Инициализация рендерера. Вызывается автоматически при загрузке.
		 * @author Denis A. Biryukov
		 * @date 14.05.2007
		 */

		virtual bool _init() =0;
		/**
		 * Инициализация шрифта.
		 * @param alias алиас шрифта
		 * @param name Имя шрифта
		 * @return true в случае успешного завершения. Ошибка через _last_error
		 * @author Denis A. Biryukov
		 * @date 14.05.2007
		 */

		virtual bool init_font ( std::string alias, std::string name ) =0;
		/**
		 * Рендерит строку текста в поверхноть с указанным именем
		 * @param video_name имя видео устройства
		 * @param alias алиас шрифта
		 * @param text текст который надо отрендерить (utf-8)
		 * @param color цвет [RGBA]
		 * @param size размер шрифта (пиксели)
		 * @param surface_name имя поверхности в которую рендерить
		 * @param group_name имя группы в которой должна находиться поверхность
		 * @param overwrite перезаписать поверхность если она существует
		 * @return true в случае успешного завершения. Ошибка через _last_error
		 * @author Denis A. Biryukov
		 * @date 14.05.2007
		 */
		virtual bool render_text_line ( std::string video_name, std::string alias, std::string text, VideoColor color, int size, std::string surface_name, std::string group_name="", bool overwrite=false ) =0;
		
				/**
		 * Рендерит строку текста в поверхноть с указанным именем
		 * @param video_name имя видео устройства
		 * @param alias алиас шрифта
		 * @param text текст который надо отрендерить (unicode)
		 * @param color цвет [RGBA]
		 * @param size размер шрифта (пиксели)
		 * @param surface_name имя поверхности в которую рендерить
		 * @param group_name имя группы в которой должна находиться поверхность
		 * @param overwrite перезаписать поверхность если она существует
		 * @return true в случае успешного завершения. Ошибка через _last_error
		 * @author Denis A. Biryukov
		 * @date 14.05.2007
				 */
		virtual bool render_text_line(std::string video_name, std::string alias, const std::vector<int> &text, VideoColor color, int size, std::string surface_name, std::string group_name="", bool overwrite=false, int *origin=0)=0;
		virtual bool render_text_line_to_sprite ( std::string video_name, std::string alias, const std::vector<int> &text, VideoColor color, int size, std::string surface_name, std::string group_name, bool overwrite )=0;

		virtual std::string _get_error() =0;
		virtual std::string _get_version() =0;
		virtual std::string _get_driver_name() =0;
};


#endif
