diff options
Diffstat (limited to 'engines/sword25/gfx/graphicengine.h')
-rwxr-xr-x | engines/sword25/gfx/graphicengine.h | 370 |
1 files changed, 165 insertions, 205 deletions
diff --git a/engines/sword25/gfx/graphicengine.h b/engines/sword25/gfx/graphicengine.h index b6cd758a9e..836eacdba6 100755 --- a/engines/sword25/gfx/graphicengine.h +++ b/engines/sword25/gfx/graphicengine.h @@ -1,39 +1,37 @@ -// ----------------------------------------------------------------------------- -// This file is part of Broken Sword 2.5 -// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdörfer -// -// Broken Sword 2.5 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. -// -// Broken Sword 2.5 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 Broken Sword 2.5; if not, write to the Free Software -// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -// ----------------------------------------------------------------------------- - -/* - BS_GraphicEngine - ---------------- - Dies ist das Graphik-Engine Interface, dass alle Methoden und Klassen enthält, die eine - Graphik-Engine implementieren muss. - - Autor: Malte Thiesen -*/ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + * BS_GraphicEngine + * ---------------- + * This the graphics engine interface. + * + * Autor: Malte Thiesen + */ #ifndef SWORD25_GRAPHICENGINE_H #define SWORD25_GRAPHICENGINE_H // Includes -#include "sword25/kernel/memlog_off.h" -#include <vector> -#include "sword25/kernel/memlog_on.h" - #include "sword25/kernel/common.h" #include "sword25/kernel/bs_stdint.h" #include "sword25/kernel/resservice.h" @@ -42,6 +40,8 @@ #include "sword25/gfx/framecounter.h" #include "sword25/gfx/renderobjectptr.h" +namespace Sword25 { + class BS_Kernel; class BS_Image; class BS_Panel; @@ -62,54 +62,55 @@ typedef unsigned int BS_COLOR; Die bisher einzige Implementation ist BS_DDrawGfx. */ -class BS_GraphicEngine : public BS_ResourceService, public BS_Persistable -{ +class BS_GraphicEngine : public BS_ResourceService, public BS_Persistable { public: // Enums // ----- - // Farbformate + // Colour formats + // /** - @brief Die von der Engine benutzten Farbformate - */ - enum COLOR_FORMATS - { - /// Undefiniertes/unbekanntes Farbformat + * The colour format used by the engine + */ + enum COLOR_FORMATS { + /// Undefined/unknown colour format CF_UNKNOWN = 0, - /// 16 Bit Farbformat (5 Bit Rot, 5 Bit Grün, 5 Bit Blau) + /// 16-bit colour format (R5G5B5) CF_RGB15, - /// 16 Bit Farbformat (5 Bit Rot, 6 Bit Grün, 5 Bit Blau) + /// 16-bit colour format (R5G6R5) CF_RGB16, /** - Spezielles Alpha-Farbformat der Engine, welches besonders schnelles Darstellen unter Benutzung von MMX-Befehlen unterstützt.<br> - Die Pixel sind 16 Bit breit und haben das selbe Format wie #CF_RGB15. Zusätzlich besitzt jeder Pixel noch einen 8 Bit Alphawert.<br> - Es werden jeweils 4 Pixel und 4 Alphawerte zu einem 12 Byte großen Datenblock zusammengefasst.<br> - Dabei werden die Daten in folgender Reihenfolge abgelegt: - Alpha0 Alpha1 Alpha2 Alpha3 Pixel0 Pixel1 Pixel2 Pixel3 - Falls die Pixelanzahl einer Zeile nicht durch 4 teilbar ist, wird der letzte Pixelblock trotzdem komplett abgespeichert, die - nicht verwendeten Pixel- und Alphawerte können beliebige Werte haben. - */ + * Special alpha colour format of the engine, which supports very quick display using MMX instructions. + * The pixels are 16-bits wide and have the same format as #CF_RGB15. In addition, each pixel has an 8-bit + * alpha value. + * It summarises groupings of pixels pixels and four alpha values in a 12-byte data block. + * The data is stored in the following order: + * Alpha0 Alpha1 Alpha2 Alpha3 Pixel0 Pixel1 Pixel2 Pixel3 + * If the number of pixels in a line is not divisible by 4, then unused pixels and alpha values can have + * arbitrary values. + */ CF_RGB15_INTERLEAVED, /** - Spezielles Alpha-Farbformat der Engine, welches besonders schnelles Darstellen unter Benutzung von MMX-Befehlen unterstützt.<br> - Die Pixel sind 16 Bit breit und haben das selbe Format wie #CF_RGB16. Zusätzlich besitzt jeder Pixel noch einen 8 Bit Alphawert.<br> - Es werden jeweils 4 Pixel und 4 Alphawerte zu einem 12 Byte großen Datenblock zusammengefasst.<br> - Dabei werden die Daten in folgender Reihenfolge abgelegt: - Alpha0 Alpha1 Alpha2 Alpha3 Pixel0 Pixel1 Pixel2 Pixel3 - Falls die Pixelanzahl einer Zeile nicht durch 4 teilbar ist, wird der letzte Pixelblock trotzdem komplett abgespeichert, die - nicht verwendeten Pixel- und Alphawerte können beliebige Werte haben. - */ + * Special alpha colour format of the engine, which supports very quick display using MMX instructions. + * The pixels are 16-bits wide and have the same format as #CF_RGB16. In addition, each pixel has an 8-bit + * alpha value. + * It summarises groupings of pixels pixels and four alpha values in a 12-byte data block. + * The data is stored in the following order: + * Alpha0 Alpha1 Alpha2 Alpha3 Pixel0 Pixel1 Pixel2 Pixel3 + * If the number of pixels in a line is not divisible by 4, then unused pixels and alpha values can have + * arbitrary values. + */ CF_RGB16_INTERLEAVED, /** - 24 Bit Farbformat (8 Bit Rot, 8 Bit Grün, 8 Bit Blau) - */ + * 24-bit colour format (R8G8B8) + */ CF_RGB24, /** - 32 Bit Farbformat (8 Bit Alpha, 8 Bit Rot, 8 Bit Grün, 8 Bit Blau) (little endian) + * 32-bit colour format (A8R8G8B8) (little endian) */ CF_ARGB32, /** - 32 Bit Farbformat (8 Bit Alpha, 8 Bit Blau, 8 Bit Grün, 8 Bit Rot) (little endian) + 32-bit colour format (A8B8G8R8) (little endian) */ CF_ABGR32 }; @@ -118,109 +119,84 @@ public: // --------- /** - @brief Initialisiert die Graphikengine und setzt den Bildschirmmodus. - @param Width die Breite des Ausgabepuffers in Pixeln.<br>Der Standardwert ist 800. - @param Height die Höhe des Ausgabepuffers in Pixeln.<br>Der Standardwert ist 600. - @param BitDepth die Bittiefe des gewünschten Ausgabepuffers in Bit.<br>Der Standardwert ist 16. - @param BackbufferCount die Anzahl an Backbuffern die erzeugt werden soll.<br>Der Standardwert ist 2. - @param Windowed gibt an, ob die Engine im Fenstermodus laufen soll. Falls true angegeben wird, wird ein Fenster geöffnet in das - die Ausgaben gerendert werden. Ansonsten wird ein Vollbildmodus gesetzt der den Parametern das Ausgabepuffers - entspricht. - @return Gibt false zurück, falls die Initialisierung fehlgeschlagen ist. - @remark Der Fenstermodus sollte nur zu Debuggingzwecken benutzt werden und ist nicht dafür gedacht im endgültigen Produkt benutzt - zu werden. - @remark Diese Methode sollte direkt nach der Initialisierung aller Services aufgerufen werden. - */ + * Initialises the graphics engine and sets the screen mode. Returns true if initialisation failed. + * Notes: This method should be called immediately after the initialisation of all services. + * + * @param Height The height of the output buffer in pixels. The default value is 600 + * @param BitDepth The bit depth of the desired output buffer in bits. The default value is 16 + * @param BackbufferCount The number of back buffers to be created. The default value is 2 + * @param Windowed Indicates whether the engine is to run in windowed mode. + */ virtual bool Init(int Width = 800, int Height = 600, int BitDepth = 16, int BackbufferCount = 2, bool Windowed = false) = 0; - //@{ - /** @name Frame-Methoden */ /** - @brief Beginnt das Rendern eines neuen Frames. - @param UpdateAll gibt an, ob der Renderer im nächsten Frame alles neu zeichnen soll.<br> - Diese Funktion kann nützlich sein, wenn der Renderer mit Dirty-Rectangles arbeitet, der Benutzer aber gelegentlich - darauf angewiesen ist, dass der gesamte Bildschirminhalt neu gezeichnet werden soll.<br> - Der Standardwert ist false. - Diese Methode muss am Anfang das Main-Loops aufgerufen werden und vor dem Aufruf jeglicher Rendermethoden. - @return Gibt false zurück, falls ein Fehler aufgetreten ist. - @remark Implementationen dieser Methode müssen _UpdateLastFrameDuration() aufrufen. + * Begins rendering a new frame. + * Notes: This method must be called at the beginning of the main loop, before any rendering methods are used. + * Notes: Implementations of this method must call _UpdateLastFrameDuration() + * @param UpdateAll Specifies whether the renderer should redraw everything on the next frame. + * This feature can be useful if the renderer with Dirty Rectangles works, but sometimes the client may */ virtual bool StartFrame(bool UpdateAll = false) = 0; /** - @brief Beendet das Rendern des Frames und stellt diesen auf dem Bildschirm dar. - - Diese Methode muss am Ende des Main-Loops aufgerufen werden. Nach dem Aufruf dürfen keine weiteren Rendermethoden mehr aufgerufen - werden. Dafür muss erst wieder ein Aufruf von #StartFrame erfolgen. - @return Gibt false zurück, falls ein Fehler aufgetreten ist: + * Ends the rendering of a frame and draws it on the screen. + * + * This method must be at the end of the main loop. After this call, no further Render method may be called. + * This should only be called once for a given previous call to #StartFrame. */ virtual bool EndFrame() = 0; - //@} - - //@{ - /** @name Debug-Methoden */ + // Debug methods /** - @brief Zeichnet eine Line in den Framebuffer. - - Diese Methode muss zwischen StartFrame() und EndFrame() aufgerufen werden und ist nur für Debugzwecke gedacht. - Die Linie erscheint nur für einen Frame. Wenn die Linie dauerhaft zu sehen sein soll, muss sie jeden Frame neu - gezeichnet werden. - - @param Start der Startpunkt der Linie - @param End der Endpunkt der Linie - @param Color die Farbe der Linie. Der Standardwert ist BS_RGB(255, 255, 255) (Weiß). + * Draws a line in the frame buffer + * + * This method must be called between calls to StartFrame() and EndFrame(), and is intended only for debugging + * purposes. The line will only appear for a single frame. If the line is to be shown permanently, it must be + * called for every frame. + * @param Start The starting point of the line + * @param End The ending point of the line + * @param Color The colour of the line. The default is BS_RGB (255,255,255) (White) */ - virtual void DrawDebugLine(const BS_Vertex & Start, const BS_Vertex & End, unsigned int Color = BS_RGB(255, 255, 255)) = 0; + virtual void DrawDebugLine(const BS_Vertex &Start, const BS_Vertex &End, unsigned int Color = BS_RGB(255, 255, 255)) = 0; /** - @brief Erstellt einen Screenshot. - - Erstellt einen Screenshot vom aktuellen Framebuffer und schreibt ihn in eine Grafikdatei.<br> - Das verwendete Dateiformat ist PNG. - - @param Der Dateiname des Screenshots. - @return Gibt true zurück, wenn der Screenshot gespeichert werden konnte, ansonsten false. - @remark Diese Methode darf erst nach einem Aufruf von EndFrame() und vor dem nächsten Aufruf von StartFrame() aufgerufen werden. - */ + * Creates a screenshot of the current frame buffer and writes it to a graphic file in PNG format. + * Returns true if the screenshot was saved successfully. + * Notes: This method should only be called after a call to EndFrame(), and before the next call to StartFrame(). + * @param Filename The filename for the screenshot + */ bool SaveScreenshot(const std::string & Filename); /** - @Brief Erstellt einen kleinen Screenshot. - - Erstellt einen Screenshot mit den Maßen 200x125. Hierfür werden am oberen und unteren Bildschirmrand die Interfaceleisten abgeschnitten und - das Bild auf ein 16tel seiner Ursprungsgröße verkleinert. - - @param Der Dateiname des Screenshots. - @return Gibt true zurück, wenn der Screenshot gespeichert werden konnte, ansonsten false. - @remark Diese Methode darf erst nach einem Aufruf von EndFrame() und vor dem nächsten Aufruf von StartFrame() aufgerufen werden. - @remark Der Framebuffer muss eine Auflösung von 800x600 haben. - */ + * Creates a thumbnail with the dimensions of 200x125. This will not include the top and bottom of the screen.. + * the interface boards the the image as a 16th of it's original size. + * Notes: This method should only be called after a call to EndFrame(), and before the next call to StartFrame(). + * The frame buffer must have a resolution of 800x600. + * @param Filename The filename for the screenshot + */ bool SaveThumbnailScreenshot(const std::string & Filename); /** - @brief Liest den aktuellen Inhalt des Framebuffer aus. - @param Width enthält nach einem erfolgreichen Aufruf die Breite des Framebuffers. - @param Height enthält nach einem erfolgreichen Aufruf die Höhe des Framebuffers. - @param Data enthält nach einem erfolgreichen Aufruf den Inhalt des Framebuffers als 32-Bit Farbwerte. - @return Gibt true zurück, wenn der Aufruf erfolgreich war, ansonsten false. - @remark Diese Methode ist für das Erstellen von Screenshots gedacht. Sie muss also nicht sehr effizient sein. - @remark Diese Methode darf erst nach einem Aufruf von EndFrame() und vor dem nächsten Aufruf von StartFrame() aufgerufen werden. + * Reads the current contents of the frame buffer + * Notes: This method is for creating screenshots. It is not very optimised. It should only be called + * after a call to EndFrame(), and before the next call to StartFrame(). + * @param Width Returns the width of the frame buffer + * @param Height Returns the height of the frame buffer + * @param Data Returns the raw data of the frame buffer as an array of 32-bit colour values. */ virtual bool GetScreenshot(unsigned int & Width, unsigned int & Height, std::vector<unsigned int> & Data) = 0; - //@} virtual BS_RenderObjectPtr<BS_Panel> GetMainPanel() = 0; /** - @brief Gibt die Zeit (in Microsekunden) zurück die seit dem letzten Frame vergangen ist. - */ + * Specifies the time (in microseconds) since the last frame has passed + */ int GetLastFrameDurationMicro() { if (m_TimerActive) return m_LastFrameDuration; else return 0; } /** - @brief Gibt die Zeit (in Sekunden) zurück die seit dem letzten Frame vergangen ist. + * Specifies the time (in microseconds) the previous frame took */ float GetLastFrameDuration() { if (m_TimerActive) return static_cast<float>(m_LastFrameDuration) / 1000000.0f; else return 0; } @@ -228,85 +204,71 @@ public: void ResumeMainTimer() { m_TimerActive = true; } float GetSecondaryFrameDuration() { return static_cast<float>(m_LastFrameDuration) / 1000000.0f; } - //@{ - /** @name Accessor-Methoden */ + // Accessor methods /** - @brief Gibt die Breite des Ausgabepuffers in Pixeln zurück. - */ + * Returns the width of the output buffer in pixels + */ int GetDisplayWidth() { return m_Width; } /** - @brief Gibt die Höhe des Ausgabepuffers in Pixeln zurück. - */ + * Returns the height of the output buffer in pixels + */ int GetDisplayHeight() { return m_Height; } /** - @brief Gibt die Bounding-Box des Ausgabepuffers zurück. (0, 0, Width, Height) - */ + * Returns the bounding box of the output buffer: (0, 0, Width, Height) + */ BS_Rect& GetDisplayRect() { return m_ScreenRect; } /** - @brief Gibt die Bittiefe des Ausgabepuffers zurück. - */ + * Returns the bit depth of the output buffer + */ int GetBitDepth() { return m_BitDepth; } /** - @brief Legt fest ob der Framebufferwechsel mit dem vertikalen Strahlenrücklauf synchronisiert werden soll.<br> - Vsync ist standardmäßig eingeschaltet. - @param Vsync gibt an, ob der Framebufferwechsel mit dem vertikalen Strahlenrücklauf synchronisiert werden soll. - @remark Im Fenstermodus hat diese Einstellung keine Auswirkung. - */ + * Determines whether the frame buffer change is to be synchronised with Vsync. This is turned on by default. + * Notes: In windowed mode, this setting has no effect. + * @param Vsync Indicates whether the frame buffer changes are to be synchronised with Vsync. + */ virtual void SetVsync(bool Vsync) = 0; /** - @brief Gibt true zurück, wenn V-Sync an ist. - @remark Im Fenstermodus hat diese Einstellung keine Auswirkung. - */ + * Returns true if V-Sync is on. + * Notes: In windowed mode, this setting has no effect. + */ virtual bool GetVsync() const = 0; /** - @brief Gibt true zurück, falls die Engine im Fenstermodus läuft. - */ + * Returns true if the engine is running in Windowed mode. + */ bool IsWindowed() { return m_Windowed; } /** - @brief Füllt einen Rechteckigen Bereich des Framebuffers mit einer Farbe. - @param FillRectPtr Pointer auf ein BS_Rect, welches den Ausschnitt des Framebuffers spezifiziert, der gefüllt - werden soll oder 0, falls das gesamte Bild gefüllt werden soll.<br> - Der Standardwert ist 0. - @param Color der 32 Bit Farbwert mit dem der Bildbereich gefüllt werden soll.<br> - Der Standardwert ist BS_RGB(0, 0, 0) (Schwarz). - @return Gibt true zurück, wenn der Aufruf erfolgreich war, ansonsten false. - @remark Es ist möglich über die Methode transparente Rechtecke darzustellen, indem man eine Farbe mit einem - Alphawert ungleich 255 angibt. + * Fills a rectangular area of the frame buffer with a colour. + * Notes: It is possible to create transparent rectangles by passing a colour with an Alpha value of 255. + * @param FillRectPtr Pointer to a BS_Rect, which specifies the section of the frame buffer to be filled. + * If the rectangle falls partly off-screen, then it is automatically trimmed. + * If a NULL value is passed, then the entire image is to be filled. + * @param Color The 32-bit colour with which the area is to be filled. The default is BS_RGB(0, 0, 0) (black) @remark Falls das Rechteck nicht völlig innerhalb des Bildschirms ist, wird es automatisch zurechtgestutzt. - */ + */ virtual bool Fill(const BS_Rect * FillRectPtr = 0, unsigned int Color = BS_RGB(0, 0, 0)) = 0; - //@} - - //@{ - /** @name Debugging-Methoden */ + // Debugging Methods int GetFPSCount() const { return m_FPSCounter.GetFPS(); } int GetRepaintedPixels() const { return m_RepaintedPixels; } - //@} - - //@{ - /** @name Auskunfts-Methoden */ + // Access methods /** - @brief Gibt die Größe eines Pixeleintrages in Byte für ein bestimmtes Farbformat zurück - @param ColorFormat das gewünschte Farbformat. Der Parameter muss vom Typ COLOR_FORMATS sein. - @return Gibt die Größe eines Pixeleintrages in Byte des Farbsformates ColorFormat zurück.<br> - Falls das Farbformat unbekannt ist, wird -1 zurückgegeben. - */ - static int GetPixelSize(BS_GraphicEngine::COLOR_FORMATS ColorFormat) - { - switch (ColorFormat) - { + * Returns the size of a pixel entry in bytes for a particular colour format + * @param ColorFormat The desired colour format. The parameter must be of type COLOR_FORMATS + * @return Returns the size of a pixel in bytes. If the colour format is unknown, -1 is returned. + */ + static int GetPixelSize(BS_GraphicEngine::COLOR_FORMATS ColorFormat) { + switch (ColorFormat) { case BS_GraphicEngine::CF_RGB16: case BS_GraphicEngine::CF_RGB15: return 2; @@ -323,16 +285,14 @@ public: } /** - @brief Berechnet die Länge einer Bildzeile eines Bilder in Byte, abhängig vom Farbformat. - @param ColorFormat das Farbformat des Bildes. - @param Width die Länge einer Bildzeile in Pixel. - @return Gibt die Länge einer Bildzeile in Byte wieder.<br> - Falls das Farbformat unbekannt ist, wird -1 zurückgegeben. - */ - static int CalcPitch(BS_GraphicEngine::COLOR_FORMATS ColorFormat, int Width) - { - switch (ColorFormat) - { + * Calculates the length of an image line in bytes, depending on a given colour format. + * @param ColorFormat The colour format + * @param Width The width of the line in pixels + * @return Reflects the length of the line in bytes. If the colour format is + * unknown, -1 is returned + */ + static int CalcPitch(BS_GraphicEngine::COLOR_FORMATS ColorFormat, int Width) { + switch (ColorFormat){ case BS_GraphicEngine::CF_RGB16: case BS_GraphicEngine::CF_RGB15: return Width * 2; @@ -352,22 +312,20 @@ public: return -1; } - //@} - - // Persistenz Methoden + // Persistence Methods // ------------------- - virtual bool Persist(BS_OutputPersistenceBlock & Writer); - virtual bool Unpersist(BS_InputPersistenceBlock & Reader); + virtual bool Persist(BS_OutputPersistenceBlock &Writer); + virtual bool Unpersist(BS_InputPersistenceBlock &Reader); - static void ARGBColorToLuaColor(lua_State * L, unsigned int Color); - static unsigned int LuaColorToARGBColor(lua_State * L, int StackIndex); + static void ARGBColorToLuaColor(lua_State *L, unsigned int Color); + static unsigned int LuaColorToARGBColor(lua_State *L, int StackIndex); protected: - // Konstruktor + // Constructor // ----------- BS_GraphicEngine(BS_Kernel* pKernel); - // Display Variablen + // Display Variables // ----------------- int m_Width; int m_Height; @@ -375,27 +333,29 @@ protected: int m_BitDepth; bool m_Windowed; - // Debugging-Variablen + // Debugging Variables // ------------------- BS_Framecounter m_FPSCounter; unsigned int m_RepaintedPixels; /** - @brief Berechnet die Zeit die seit dem letzten Framebeginn vergangen ist. - */ + * Calculates the time since the last frame beginning has passed. + */ void UpdateLastFrameDuration(); private: bool RegisterScriptBindings(); - // LastFrameDuration-Variablen + // LastFrameDuration Variables // --------------------------- - uint64_t m_LastTimeStamp; + uint64 m_LastTimeStamp; unsigned int m_LastFrameDuration; bool m_TimerActive; - std::vector<unsigned int> m_FrameTimeSamples; + Common::Array<unsigned int> m_FrameTimeSamples; unsigned int m_FrameTimeSampleSlot; }; +} // End of namespace Sword25 + #endif |