/***************************************************************************
*   Copyright (C) 2004 by 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_N_VIDEOME_C_OpenGL_VIDEO_SURFACE_H
#define ME_N_VIDEOME_C_OpenGL_VIDEO_SURFACE_H
#include "me_defines.h"
#include "me_c_video_surface.h"
#include <vector>
#include <map>
namespace OpenGL
{
#include <GL/gl.h>
}
namespace ME_n_Video
{

	/**
	Данный класс реализует функции ME_c_Video_Surface в драйвере OpenGL.
	 
	@author Denis A. Birukov aka Messenger of death 
	*/
	class ME_c_OpenGL_Video_Driver;
	struct ME_c_Video_Surface_Data
	{
		ME_c_Video_Surface_Data( Uint16 x, Uint16 y, Uint16 w, Uint16 h, Uint32 t ) {_x = x;_y = y;_w = w;_h = h;_tex_id_ = t;}
		Uint16 _x;
		Uint16 _y;
		Uint16 _w;
		Uint16 _h;
		Uint32 _tex_id_;
	};
	class ME_c_OpenGL_Video_Surface : public ME_c_Video_Surface
	{
		public:
			ME_c_OpenGL_Video_Surface();
			//			ME_c_OpenGL_Video_Surface(OpenGL::OpenGL_Surface* srf);
			virtual ~ME_c_OpenGL_Video_Surface();

			/** Возвращает количество байт на пиксель*/
			Sint8 _get_bpp() const;
			/** Возвращает ширину поверхности в пикселях*/
			Sint16 _get_width() const;
			/** Возвращает высоту поверхности в пикселях*/
			Sint16 _get_height() const;
			/** Возвращает длину строки поверхности*/
			Sint16 _get_line_size() const;
			/** Возвращает указатель на данные о поверхности.
			*/
			void* _get_surface_data();
			/** Возвращает указатель на данные о поверхности.
			*/
			void* operator ->();
			/** Возвращает маску данных красного канала*/
			Uint32 _get_Rmask() const;
			/** Возвращает маску данных синего канала*/
			Uint32 _get_Bmask() const;
			/** Возвращает маску данных зеленого канала*/
			Uint32 _get_Gmask() const;
			/** Возвращает маску данных альфа канала*/
			Uint32 _get_Amask() const;
			/** Производит коррекцию данных, в случае необзодимости, после вызова и изменения _get_surface_data*/
			void _update();
			/** Устанавливает или снимает обработку альфа канала для данной поверхности*/
			void _set_alpha_status(bool act);
			/** Возвращает признак обработки альфа канала поверхности*/
			bool _get_alpha_status();
			friend class ME_c_OpenGL_Video_Driver;
		private:
			/** Создает поверхность требуемого размера и типа*/
			bool _create_( Uint16 w, Uint16 h, OpenGL::GLenum format, OpenGL::GLenum type );
			/** Производит вывод поверхности*/
			void _blit_( double x, double y );
			/** Производит создание требуемого количества текстур*/
			void _split_texture_( Uint16 x, Uint16 y, Uint16 w, Uint16 h, Uint32 *mas, Uint8 len );
			/** Изменяет коэффициент масштабирования*/
			bool _set_scale(float x,float y);
			/** Изменяет угол поворота по осям x,y,z*/
			bool _set_rotation(float x,float y,float z);
		private:
			Uint8 *_surface_;
			Uint32 _Rmask_;
			Uint32 _Gmask_;
			Uint32 _Bmask_;
			Uint32 _Amask_;
			Uint8 _bpp_;
			Sint16 _w_;
			Sint16 _h_;
			bool _alpha_;
			float _scale_x_;
			float _scale_y_;
			float _rotation_[3];
			//			std::vector<Uint32> _tex_id_;
			std::vector<ME_c_Video_Surface_Data> _tex_;
			std::vector<Uint32> _list_id_;
			bool _need_update_;
			ME_c_OpenGL_Video_Driver *_drv_;
	};

}

#endif
