/***************************************************************************
*   Copyright (C) 2004 by Denis A. Birukov aka Messenger of death         *
*   riper@fromru.com                                                      *
*                                                                         *
*   This program 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 program 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 this program; if not, write to the                         *
*   Free Software Foundation, Inc.,                                       *
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
***************************************************************************/
#ifndef ME_C_VIDEOME_C_VIDEO_DRIVER_INTERFACE_H
#define ME_C_VIDEOME_C_VIDEO_DRIVER_INTERFACE_H
#include <me_defines.h>
#include <string>
#include <map>

namespace ME_n_Video
{
	class ME_c_Video_Surface;
	class ME_c_Video_Features;
	/**
	Представляет собой интерфейс, которые должны реализовывать все драйверы.
	 
	@author Denis A. Birukov aka Messenger of death 
	*/
	class ME_c_Video_Driver_Interface
	{
		public:
			virtual ~ME_c_Video_Driver_Interface() {}
			/**Создает поверхность с указанными размерами. Глубина цвета поверхности совпадает с глубиной цвета основной экранной поверхности.
			Возвращает имя поверхности. Предпочтительней использовать данную версию функции.
			Поверхность создается в группе по умолчанию
			*/
			virtual std::string _allocate_surface( Sint16 xs, Sint16 ys ) = 0;
			/**Создает поверхность с указанными размерами. Глубина цвета поверхности совпадает с глубиной цвета основной экранной поверхности.
			Возвращает имя поверхности. Предпочтительней использовать данную версию функции.
			Поверхность создается в группе по умолчанию
			*/
			virtual std::string _allocate_surface( double xs, double ys ) = 0;
			/**Удаляет выделенную поверхность
			*/
			virtual bool _free_surface( ME_c_Video_Surface *surf ) = 0;
			/**Удаляет выделенную поверхность
			*/
			virtual bool _free_surface( std::string name ) = 0;
			/**Удаляет выделенную поверхность
			*/
			virtual bool _free_surface( std::string group,std::string name ) = 0;
			/**Производит отображение одной поверхности на другую.
			Вслучае шибки бросается исключение, если rise_exception==true
			*/
			virtual bool _blit( ME_c_Video_Surface &from, Sint16 x, Sint16 y, bool rise_exception = true )=0;
			virtual bool _blit(  ME_c_Video_Surface &from, double x,double y, bool rise_exception = true )=0;
			/**Производит отображение одной поверхности на другую.
			Вслучае шибки бросается исключение, если rise_exception==true
			*/
			virtual bool _blit( const std::string &from, Sint16 x,  Sint16 y , bool rise_exception = true ) = 0;
			virtual bool _blit( const std::string &from, double x, double y , bool rise_exception = true ) = 0;
			/**Создание поверхности в текущей группе.
			Возвращает ссылку на поверхность.
			*/
			virtual ME_c_Video_Surface& _create_surface( Sint16 xs, Sint16 ys ) = 0;
			virtual ME_c_Video_Surface& _create_surface( double xs, double ys ) = 0;
			/**Создание поверхности в текущей группе с заданным именем.
			Если имя уже существует, то старая поверхность будет удалена, если rewrite==true
			Иначе будет выброшено исключение и возвращена ссылка на существующую поверхность.
			Возвращает ссылку на поверхность.
			*/
			virtual ME_c_Video_Surface& _create_surface( Sint16 xs, Sint16 ys, std::string name, bool rewrite , bool rise_exception ) = 0;
			virtual ME_c_Video_Surface& _create_surface( double xs, double ys, std::string name, bool rewrite , bool rise_exception ) = 0;
			/**Создание поверхности в указанной группе с заданным именем.
			Если имя уже существует, то старая поверхность будет удалена, если rewrite==true.
			Если указанная группа несуществует, то она будет создана
			Возвращает ссылку на поверхность.
			*/
			virtual ME_c_Video_Surface& _create_surface( Sint16 xs, Sint16 ys, std::string name, bool rewrite, std::string group_name, bool rise_exception = true ) = 0;
			virtual ME_c_Video_Surface& _create_surface( double xs, double ys, std::string name, bool rewrite, std::string group_name, bool rise_exception = true ) = 0;
			/**Добавляет поверхность в текущею группу. Имя дается случайно. возвращает имя.
			*/
			virtual std::string _insert_surface( ME_c_Video_Surface* surf ) = 0;
			/**Добавляет поверхность в текущею группу и дает ей указанное имя.
			Если имя уже существует и rewrite !=0 то будет вызвано исключение,(если rise_exception==true) а функция вернет ссылку на текущую поверхность с таким именем.
			Возвращает ссылку на поверхность.
			*/
			virtual ME_c_Video_Surface& _insert_surface( ME_c_Video_Surface* surf , std::string name, bool rewrite, bool rise_exception = true ) = 0;
			/**Добавляет поверхность в заданную группу и дает ей указанное имя.
			Если имя уже существует и rewrite !=0 то будет вызвано исключение(если rise_exception==true), а функция вернет ссылку на текущую поверхность с таким именем.
			Если указанная группа несуществует, то она будет создана.
			Возвращает ссылку на поверхность.
			*/
			virtual ME_c_Video_Surface& _insert_surface( ME_c_Video_Surface* surf , std::string name, bool rewrite, std::string grp, bool rise_exception = true ) = 0;
			/**Возвращает ссылку на поверхность. Поиск производится внутри текущей группы*/
			virtual ME_c_Video_Surface& operator[] ( std::string name ) = 0;
			/**Возвращает ссылку на поверхность в указанной группе с указанным именем.*/
			virtual ME_c_Video_Surface& _get_surface( std::string grp, std::string name ) = 0;
			/**
			Изменяет текущую группу.
			В случае если такая группа несуществует, будет выброшено исключение.
			*/
			virtual ME_c_Video_Driver_Interface& operator() ( std::string name ) = 0;
			/**Изменяет текущую группу*/
			virtual bool _set_group( std::string name ) = 0;
			/**Возвращает имя драйвера*/
			virtual const std::string _get_driver_name() = 0;
			/**Инициализация драйвера*/
			virtual bool _init() = 0;
			/**Деинициализация драйвера*/
			virtual void _deinit() = 0;
			/** Возвращает основную поверхность*/
			virtual ME_c_Video_Surface& _get_main_surface() = 0;
			/** Возвращает информацию о поддерживаемых возможностях*/
			virtual const ME_c_Video_Features& _get_features()=0;
			/** Производит отображение отрисованых элементов*/
			virtual void _draw()=0;
	};
	enum ME_VIDEO_ERRORS
	{
	    ME_VIDEO_SURFACE_EXIST = 1,
	    ME_VIDEO_NO_GROUP,
	    ME_VIDEO_NO_SURFACE,
	    ME_VIDEO_ERROR
	};

}

#endif
