Mercurial > fife-parpg
diff engine/core/video/renderbackend.h @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | 90005975cdbb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/video/renderbackend.h Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,144 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE 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., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef FIFE_VIDEO_RENDERBACKEND_H +#define FIFE_VIDEO_RENDERBACKEND_H + +// Standard C++ library includes +#include <string> + +// Platform specific includes +#include "util/base/fife_stdint.h" + +// 3rd party library includes +#include <SDL.h> +#include <SDL_video.h> + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "util/base/singleton.h" +#include "util/structures/point.h" +#include "util/structures/rect.h" + +#include "image.h" + +namespace FIFE { + + class Image; + + /** Abstract interface for all the renderbackends. */ + class RenderBackend: public AbstractImage, public DynamicSingleton<RenderBackend> { + public: + /** Constructor. + * @param name The name of the new renderbackend. + */ + RenderBackend(); + + /** Destructor. + */ + virtual ~RenderBackend(); + + /** The name of the renderbackend. + * @return The name of this renderbackend. + */ + virtual const std::string& getName() const = 0; + + /** Called when a new frame starts. + */ + virtual void startFrame() = 0; + + /** Called when a frame is finished and ready to be displayed. + */ + virtual void endFrame() = 0; + + /** Initializes the backend. + */ + virtual void init() = 0; + + /** Performs cleanup actions. + */ + virtual void deinit(); + + /** Creates the mainscreen (the display window). + * @param width Width of the window. + * @param height Height of the window. + * @param bitsPerPixel Bits per pixel, 0 means autodetect. + * @param fullscreen Use fullscreen mode? + * @return The new Screen Image + */ + virtual Image* createMainScreen(unsigned int width, unsigned int height, unsigned char bitsPerPixel, bool fullscreen) = 0; + + /** Creates an Image suitable for this renderbackend. + * @param data Pointer to the imagedata (needs to be in RGBA, 8 bits per channel). + * @param width Width of the image. + * @param height Height of the image. + * @return The new Image. + */ + virtual Image* createImage(const uint8_t* data, unsigned int width, unsigned int height) = 0; + + /** Helper function to create images from SDL_Surfaces. + * Takes ownership over the surface. + * @param surface The surface to convert. + * @return The new Image. + */ + virtual Image* createImage(SDL_Surface* surface) = 0; + + /** Returns a pointer to the main screen Image + * @return A pointer to the main screen Image, or 0 if no mainscreen exists. + */ + Image* getScreenImage() const { return m_screen; }; + + /** Creates a Screenshot and saves it to a file. + */ + void captureScreen(const std::string& filename); + + SDL_Surface* getSurface(); + unsigned int getWidth() const; + unsigned int getHeight() const; + unsigned int getScreenWidth() const { return getWidth(); } + unsigned int getScreenHeight() const { return getHeight(); } + const Rect& getArea(); + void getPixelRGBA(int x, int y, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); + void pushClipArea(const Rect& cliparea, bool clear=true); + void popClipArea(); + const Rect& getClipArea() const; + void setAlphaOptimizerEnabled(bool enabled); + bool isAlphaOptimizerEnabled(); + void saveImage(const std::string& filename); + + /** OpenGL image needs to be sliced into power of two sized chunks. + * You can adjust the size by calling this method. + * Size can be anything (reasonable), it is always changed to the next biggest power of two value + * @example values 50 -> 64, 340 -> 512 + */ + void setChunkingSize(unsigned int size); + unsigned int getChunkingSize(); + + protected: + Image* m_screen; + bool m_isalphaoptimized; + unsigned int m_chunkingsize; + }; +} + +#endif