diff options
author | Eugene Sandulenko | 2010-08-06 13:13:25 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2010-10-12 22:35:55 +0000 |
commit | 47904bc7b2992189bb554833f00a79ff0fea9fb8 (patch) | |
tree | 1cec51758c6741b970bd064fafee77607b9f884f /engines/sword25/gfx/image | |
parent | ca17def625154e5f758b797e4fc48c76b0566320 (diff) | |
download | scummvm-rg350-47904bc7b2992189bb554833f00a79ff0fea9fb8.tar.gz scummvm-rg350-47904bc7b2992189bb554833f00a79ff0fea9fb8.tar.bz2 scummvm-rg350-47904bc7b2992189bb554833f00a79ff0fea9fb8.zip |
SWORD25: Mass-astyle.
svn-id: r53222
Diffstat (limited to 'engines/sword25/gfx/image')
-rw-r--r-- | engines/sword25/gfx/image/b25sloader.cpp | 61 | ||||
-rw-r--r-- | engines/sword25/gfx/image/b25sloader.h | 20 | ||||
-rw-r--r-- | engines/sword25/gfx/image/image.h | 176 | ||||
-rw-r--r-- | engines/sword25/gfx/image/imageloader.cpp | 64 | ||||
-rw-r--r-- | engines/sword25/gfx/image/imageloader.h | 342 | ||||
-rw-r--r-- | engines/sword25/gfx/image/imageloader_ids.h | 17 | ||||
-rw-r--r-- | engines/sword25/gfx/image/pngloader.cpp | 187 | ||||
-rw-r--r-- | engines/sword25/gfx/image/pngloader.h | 44 | ||||
-rw-r--r-- | engines/sword25/gfx/image/vectorimage.cpp | 376 | ||||
-rw-r--r-- | engines/sword25/gfx/image/vectorimage.h | 169 | ||||
-rw-r--r-- | engines/sword25/gfx/image/vectorimagerenderer.cpp | 90 | ||||
-rw-r--r-- | engines/sword25/gfx/image/vectorimagerenderer.h | 19 |
12 files changed, 734 insertions, 831 deletions
diff --git a/engines/sword25/gfx/image/b25sloader.cpp b/engines/sword25/gfx/image/b25sloader.cpp index ea1e933edd..e45a4cddcb 100644 --- a/engines/sword25/gfx/image/b25sloader.cpp +++ b/engines/sword25/gfx/image/b25sloader.cpp @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -50,38 +50,33 @@ namespace Sword25 { // ----------------------------------------------------------------------------- -namespace -{ - unsigned int FindEmbeddedPNG(const char * FileDataPtr, unsigned int FileSize) - { - // Einen Stringstream mit dem Anfang der Datei intialisieren. 512 Byte sollten hierfür genügen. - istringstream StringStream(string(FileDataPtr, FileDataPtr + min(static_cast<unsigned int>(512), FileSize))); - - // Headerinformationen der Spielstandes einlesen. - string Marker, VersionID; - unsigned int CompressedGamedataSize, UncompressedGamedataSize; - StringStream >> Marker >> VersionID >> CompressedGamedataSize >> UncompressedGamedataSize; - if (!StringStream.good()) return 0; - - // Testen, ob wir tatsächlich einen Spielstand haben. - if (Marker == "BS25SAVEGAME") - { - // Offset zum PNG innerhalb des Spielstandes berechnen und zurückgeben. - return static_cast<unsigned int>(StringStream.tellg()) + CompressedGamedataSize + 1; - } - - return 0; +namespace { +unsigned int FindEmbeddedPNG(const char *FileDataPtr, unsigned int FileSize) { + // Einen Stringstream mit dem Anfang der Datei intialisieren. 512 Byte sollten hierfür genügen. + istringstream StringStream(string(FileDataPtr, FileDataPtr + min(static_cast<unsigned int>(512), FileSize))); + + // Headerinformationen der Spielstandes einlesen. + string Marker, VersionID; + unsigned int CompressedGamedataSize, UncompressedGamedataSize; + StringStream >> Marker >> VersionID >> CompressedGamedataSize >> UncompressedGamedataSize; + if (!StringStream.good()) return 0; + + // Testen, ob wir tatsächlich einen Spielstand haben. + if (Marker == "BS25SAVEGAME") { + // Offset zum PNG innerhalb des Spielstandes berechnen und zurückgeben. + return static_cast<unsigned int>(StringStream.tellg()) + CompressedGamedataSize + 1; } + + return 0; +} } // ----------------------------------------------------------------------------- -bool BS_B25SLoader::IsCorrectImageFormat(const char * FileDataPtr, unsigned int FileSize) -{ +bool BS_B25SLoader::IsCorrectImageFormat(const char *FileDataPtr, unsigned int FileSize) { // PNG innerhalb des Spielstandes finden und den Methodenaufruf zu BS_PNGLoader weiterreichen. unsigned int PNGOffset = FindEmbeddedPNG(FileDataPtr, FileSize); - if (PNGOffset > 0) - { + if (PNGOffset > 0) { return BS_PNGLoader::DoIsCorrectImageFormat(FileDataPtr + PNGOffset, FileSize - PNGOffset); } @@ -90,13 +85,11 @@ bool BS_B25SLoader::IsCorrectImageFormat(const char * FileDataPtr, unsigned int // ----------------------------------------------------------------------------- -bool BS_B25SLoader::DecodeImage(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, - int & Width, int & Height, int & Pitch) -{ +bool BS_B25SLoader::DecodeImage(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, + int &Width, int &Height, int &Pitch) { // PNG innerhalb des Spielstandes finden und den Methodenaufruf zu BS_PNGLoader weiterreichen. unsigned int PNGOffset = FindEmbeddedPNG(FileDataPtr, FileSize); - if (PNGOffset > 0) - { + if (PNGOffset > 0) { return BS_PNGLoader::DoDecodeImage(FileDataPtr + PNGOffset, FileSize - PNGOffset, ColorFormat, UncompressedDataPtr, Width, Height, Pitch); } @@ -105,12 +98,10 @@ bool BS_B25SLoader::DecodeImage(const char * FileDataPtr, unsigned int FileSize, // ----------------------------------------------------------------------------- -bool BS_B25SLoader::ImageProperties(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS & ColorFormat, int & Width, int & Height) -{ +bool BS_B25SLoader::ImageProperties(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height) { // PNG innerhalb des Spielstandes finden und den Methodenaufruf zu BS_PNGLoader weiterreichen. unsigned int PNGOffset = FindEmbeddedPNG(FileDataPtr, FileSize); - if (PNGOffset > 0) - { + if (PNGOffset > 0) { return BS_PNGLoader::DoImageProperties(FileDataPtr + PNGOffset, FileSize - PNGOffset, ColorFormat, Width, Height); } diff --git a/engines/sword25/gfx/image/b25sloader.h b/engines/sword25/gfx/image/b25sloader.h index be28b646c8..4a2cf3b841 100644 --- a/engines/sword25/gfx/image/b25sloader.h +++ b/engines/sword25/gfx/image/b25sloader.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -48,21 +48,19 @@ namespace Sword25 { // Klassendeklaration // ----------------------------------------------------------------------------- -class BS_B25SLoader : public BS_ImageLoader -{ +class BS_B25SLoader : public BS_ImageLoader { public: - static BS_ImageLoader * CreateInstance() - { - #include "sword25/kernel/memlog_off.h" + static BS_ImageLoader *CreateInstance() { +#include "sword25/kernel/memlog_off.h" return static_cast<BS_ImageLoader *>(new BS_B25SLoader()); - #include "sword25/kernel/memlog_on.h" +#include "sword25/kernel/memlog_on.h" } protected: - virtual bool IsCorrectImageFormat(const char * FileDataPtr, unsigned int FileSize); - virtual bool DecodeImage(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, - int & Width, int & Height, int & Pitch); - virtual bool ImageProperties(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS & ColorFormat, int & Width, int & Height); + virtual bool IsCorrectImageFormat(const char *FileDataPtr, unsigned int FileSize); + virtual bool DecodeImage(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, + int &Width, int &Height, int &Pitch); + virtual bool ImageProperties(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height); }; diff --git a/engines/sword25/gfx/image/image.h b/engines/sword25/gfx/image/image.h index 2f9d49f695..1489af97b3 100644 --- a/engines/sword25/gfx/image/image.h +++ b/engines/sword25/gfx/image/image.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -33,10 +33,10 @@ */ /* - BS_Image - -------- + BS_Image + -------- - Autor: Malte Thiesen + Autor: Malte Thiesen */ #ifndef SWORD25_IMAGE_H @@ -52,17 +52,15 @@ namespace Sword25 { -class BS_Image -{ +class BS_Image { public: virtual ~BS_Image() {}; // Enums /** - @brief Die möglichen Flippingparameter für die Blit-Methode. + @brief Die möglichen Flippingparameter für die Blit-Methode. */ - enum FLIP_FLAGS - { + enum FLIP_FLAGS { /// Das Bild wird nicht gespiegelt. FLIP_NONE = 0, /// Das Bild wird an der horizontalen Achse gespiegelt. @@ -74,22 +72,22 @@ public: /// Das Bild wird an der horizontalen und vertikalen Achse gespiegelt. FLIP_VH = FLIP_H | FLIP_V }; - + //@{ /** @name Accessor-Methoden */ /** - @brief Gibt die Breite des Bildes in Pixeln zurück + @brief Gibt die Breite des Bildes in Pixeln zurück */ virtual int GetWidth() const = 0; /** - @brief Gibt die Höhe des Bildes in Pixeln zurück + @brief Gibt die Höhe des Bildes in Pixeln zurück */ virtual int GetHeight() const = 0; /** - @brief Gibt das Farbformat des Bildes zurück + @brief Gibt das Farbformat des Bildes zurück */ virtual BS_GraphicEngine::COLOR_FORMATS GetColorFormat() const = 0; @@ -99,83 +97,83 @@ public: /** @name Render-Methoden */ /** - @brief Rendert das Bild in den Framebuffer. - @param pDest ein Pointer auf das Zielbild. In den meisten Fällen ist dies der Framebuffer. - @param PosX die Position auf der X-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br> - Der Standardwert ist 0. - @param PosY die Position auf der Y-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br> - Der Standardwert ist 0. - @param Flipping gibt an, wie das Bild gespiegelt werden soll.<br> - Der Standardwert ist BS_Image::FLIP_NONE (keine Spiegelung) - @param pSrcPartRect Pointer auf ein BS_Rect, welches den Ausschnitt des Quellbildes spezifiziert, der gerendert - werden soll oder NULL, falls das gesamte Bild gerendert werden soll.<br> - Dieser Ausschnitt bezieht sich auf das ungespiegelte und unskalierte Bild.<br> - Der Standardwert ist NULL. - @param Color ein ARGB Farbwert, der die Parameter für die Farbmodulation und fürs Alphablending festlegt.<br> - Die Alpha-Komponente der Farbe bestimmt den Alphablending Parameter (0 = keine Deckung, 255 = volle Deckung).<br> - Die Farbkomponenten geben die Farbe für die Farbmodulation an.<br> - Der Standardwert is BS_ARGB(255, 255, 255, 255) (volle Deckung, keine Farbmodulation). - Zum Erzeugen des Farbwertes können die Makros BS_RGB und BS_ARGB benutzt werden. - @param Width gibt die Ausgabebreite des Bildausschnittes an. - Falls diese von der Breite des Bildausschnittes abweicht wird - das Bild entsprechend Skaliert.<br> - Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br> - Der Standardwert ist -1. - @param Width gibt die Ausgabehöhe des Bildausschnittes an. - Falls diese von der Höhe des Bildauschnittes abweicht, wird - das Bild entsprechend Skaliert.<br> - Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br> - Der Standardwert ist -1. - @return Gibt false zurück, falls das Rendern fehlgeschlagen ist. - @remark Er werden nicht alle Blitting-Operationen von allen BS_Image-Klassen unterstützt.<br> - Mehr Informationen gibt es in der Klassenbeschreibung von BS_Image und durch folgende Methoden: - - IsBlitTarget() - - IsScalingAllowed() - - IsFillingAllowed() - - IsAlphaAllowed() - - IsColorModulationAllowed() - - IsSetContentAllowed() + @brief Rendert das Bild in den Framebuffer. + @param pDest ein Pointer auf das Zielbild. In den meisten Fällen ist dies der Framebuffer. + @param PosX die Position auf der X-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br> + Der Standardwert ist 0. + @param PosY die Position auf der Y-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br> + Der Standardwert ist 0. + @param Flipping gibt an, wie das Bild gespiegelt werden soll.<br> + Der Standardwert ist BS_Image::FLIP_NONE (keine Spiegelung) + @param pSrcPartRect Pointer auf ein BS_Rect, welches den Ausschnitt des Quellbildes spezifiziert, der gerendert + werden soll oder NULL, falls das gesamte Bild gerendert werden soll.<br> + Dieser Ausschnitt bezieht sich auf das ungespiegelte und unskalierte Bild.<br> + Der Standardwert ist NULL. + @param Color ein ARGB Farbwert, der die Parameter für die Farbmodulation und fürs Alphablending festlegt.<br> + Die Alpha-Komponente der Farbe bestimmt den Alphablending Parameter (0 = keine Deckung, 255 = volle Deckung).<br> + Die Farbkomponenten geben die Farbe für die Farbmodulation an.<br> + Der Standardwert is BS_ARGB(255, 255, 255, 255) (volle Deckung, keine Farbmodulation). + Zum Erzeugen des Farbwertes können die Makros BS_RGB und BS_ARGB benutzt werden. + @param Width gibt die Ausgabebreite des Bildausschnittes an. + Falls diese von der Breite des Bildausschnittes abweicht wird + das Bild entsprechend Skaliert.<br> + Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br> + Der Standardwert ist -1. + @param Width gibt die Ausgabehöhe des Bildausschnittes an. + Falls diese von der Höhe des Bildauschnittes abweicht, wird + das Bild entsprechend Skaliert.<br> + Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br> + Der Standardwert ist -1. + @return Gibt false zurück, falls das Rendern fehlgeschlagen ist. + @remark Er werden nicht alle Blitting-Operationen von allen BS_Image-Klassen unterstützt.<br> + Mehr Informationen gibt es in der Klassenbeschreibung von BS_Image und durch folgende Methoden: + - IsBlitTarget() + - IsScalingAllowed() + - IsFillingAllowed() + - IsAlphaAllowed() + - IsColorModulationAllowed() + - IsSetContentAllowed() */ - virtual bool Blit(int PosX = 0, int PosY = 0, - int Flipping = FLIP_NONE, - BS_Rect* pPartRect = NULL, - unsigned int Color = BS_ARGB(255, 255, 255, 255), - int Width = -1, int Height = -1) = 0; + virtual bool Blit(int PosX = 0, int PosY = 0, + int Flipping = FLIP_NONE, + BS_Rect *pPartRect = NULL, + unsigned int Color = BS_ARGB(255, 255, 255, 255), + int Width = -1, int Height = -1) = 0; /** - @brief Füllt einen Rechteckigen Bereich des Bildes mit einer Farbe. - @param pFillRect Pointer auf ein BS_Rect, welches den Ausschnitt des Bildes spezifiziert, der gefüllt - werden soll oder NULL, falls das gesamte Bild gefüllt werden soll.<br> - Der Standardwert ist NULL. - @param Color der 32 Bit Farbwert mit dem der Bildbereich gefüllt werden soll. - @remark Es ist möglich über die Methode transparente Rechtecke darzustellen, indem man eine Farbe mit einem Alphawert ungleich - 255 angibt. - @remark Unabhängig vom Farbformat des Bildes muss ein 32 Bit Farbwert angegeben werden. Zur Erzeugung, können die Makros - BS_RGB und BS_ARGB benutzt werden. - @remark Falls das Rechteck nicht völlig innerhalb des Bildschirms ist, wird es automatisch zurechtgestutzt. + @brief Füllt einen Rechteckigen Bereich des Bildes mit einer Farbe. + @param pFillRect Pointer auf ein BS_Rect, welches den Ausschnitt des Bildes spezifiziert, der gefüllt + werden soll oder NULL, falls das gesamte Bild gefüllt werden soll.<br> + Der Standardwert ist NULL. + @param Color der 32 Bit Farbwert mit dem der Bildbereich gefüllt werden soll. + @remark Es ist möglich über die Methode transparente Rechtecke darzustellen, indem man eine Farbe mit einem Alphawert ungleich + 255 angibt. + @remark Unabhängig vom Farbformat des Bildes muss ein 32 Bit Farbwert angegeben werden. Zur Erzeugung, können die Makros + BS_RGB und BS_ARGB benutzt werden. + @remark Falls das Rechteck nicht völlig innerhalb des Bildschirms ist, wird es automatisch zurechtgestutzt. */ - virtual bool Fill(const BS_Rect* pFillRect = 0, unsigned int Color = BS_RGB(0, 0, 0)) = 0; + virtual bool Fill(const BS_Rect *pFillRect = 0, unsigned int Color = BS_RGB(0, 0, 0)) = 0; /** - @brief Füllt den Inhalt des Bildes mit Pixeldaten. - @param Pixeldata ein Vector der die Pixeldaten enthält. Sie müssen in dem Farbformat des Bildes vorliegen und es müssen genügend Daten - vorhanden sein, um das ganze Bild zu füllen. - @param Offset der Offset in Byte im Pixeldata-Vector an dem sich der erste zu schreibende Pixel befindet.<br> - Der Standardwert ist 0. - @param Stride der Abstand in Byte zwischen dem Zeilenende und dem Beginn einer neuen Zeile im Pixeldata-Vector.<br> - Der Standardwert ist 0. - @return Gibt false zurück, falls der Aufruf fehlgeschlagen ist. - @remark Ein Aufruf dieser Methode ist nur erlaubt, wenn IsSetContentAllowed() true zurückgibt. + @brief Füllt den Inhalt des Bildes mit Pixeldaten. + @param Pixeldata ein Vector der die Pixeldaten enthält. Sie müssen in dem Farbformat des Bildes vorliegen und es müssen genügend Daten + vorhanden sein, um das ganze Bild zu füllen. + @param Offset der Offset in Byte im Pixeldata-Vector an dem sich der erste zu schreibende Pixel befindet.<br> + Der Standardwert ist 0. + @param Stride der Abstand in Byte zwischen dem Zeilenende und dem Beginn einer neuen Zeile im Pixeldata-Vector.<br> + Der Standardwert ist 0. + @return Gibt false zurück, falls der Aufruf fehlgeschlagen ist. + @remark Ein Aufruf dieser Methode ist nur erlaubt, wenn IsSetContentAllowed() true zurückgibt. */ virtual bool SetContent(const byte *Pixeldata, unsigned int Offset, unsigned int Stride) = 0; /** - @brief Liest einen Pixel des Bildes. - @param X die X-Koordinate des Pixels. - @param Y die Y-Koordinate des Pixels - @return Gibt den 32-Bit Farbwert des Pixels an der übergebenen Koordinate zurück. - @remark Diese Methode sollte auf keine Fall benutzt werden um größere Teile des Bildes zu lesen, da sie sehr langsam ist. Sie ist - eher dafür gedacht einzelne Pixel des Bildes auszulesen. + @brief Liest einen Pixel des Bildes. + @param X die X-Koordinate des Pixels. + @param Y die Y-Koordinate des Pixels + @return Gibt den 32-Bit Farbwert des Pixels an der übergebenen Koordinate zurück. + @remark Diese Methode sollte auf keine Fall benutzt werden um größere Teile des Bildes zu lesen, da sie sehr langsam ist. Sie ist + eher dafür gedacht einzelne Pixel des Bildes auszulesen. */ virtual unsigned int GetPixel(int X, int Y) = 0; @@ -183,39 +181,39 @@ public: /** @name Auskunfts-Methoden */ /** - @brief Überprüft, ob an dem BS_Image Blit() aufgerufen werden darf. - @return Gibt false zurück, falls ein Blit()-Aufruf an diesem Objekt nicht gestattet ist. + @brief Überprüft, ob an dem BS_Image Blit() aufgerufen werden darf. + @return Gibt false zurück, falls ein Blit()-Aufruf an diesem Objekt nicht gestattet ist. */ virtual bool IsBlitSource() const = 0; /** - @brief Überprüft, ob das BS_Image ein Zielbild für einen Blit-Aufruf sein kann. - @return Gibt false zurück, falls ein Blit-Aufruf mit diesem Objekt als Ziel nicht gestattet ist. + @brief Überprüft, ob das BS_Image ein Zielbild für einen Blit-Aufruf sein kann. + @return Gibt false zurück, falls ein Blit-Aufruf mit diesem Objekt als Ziel nicht gestattet ist. */ virtual bool IsBlitTarget() const = 0; /** - @brief Gibt true zurück, falls das BS_Image bei einem Aufruf von Blit() skaliert dargestellt werden kann. + @brief Gibt true zurück, falls das BS_Image bei einem Aufruf von Blit() skaliert dargestellt werden kann. */ virtual bool IsScalingAllowed() const = 0; /** - @brief Gibt true zurück, wenn das BS_Image mit einem Aufruf von Fill() gefüllt werden kann. + @brief Gibt true zurück, wenn das BS_Image mit einem Aufruf von Fill() gefüllt werden kann. */ virtual bool IsFillingAllowed() const = 0; /** - @brief Gibt true zurück, wenn das BS_Image bei einem Aufruf von Blit() mit einem Alphawert dargestellt werden kann. + @brief Gibt true zurück, wenn das BS_Image bei einem Aufruf von Blit() mit einem Alphawert dargestellt werden kann. */ virtual bool IsAlphaAllowed() const = 0; /** - @brief Gibt true zurück, wenn das BS_Image bei einem Aufruf von Blit() mit Farbmodulation dargestellt werden kann. + @brief Gibt true zurück, wenn das BS_Image bei einem Aufruf von Blit() mit Farbmodulation dargestellt werden kann. */ virtual bool IsColorModulationAllowed() const = 0; /** - @brief Gibt true zurück, wenn der Inhalt des BS_Image durch eine Aufruf von SetContent() ausgetauscht werden kann. + @brief Gibt true zurück, wenn der Inhalt des BS_Image durch eine Aufruf von SetContent() ausgetauscht werden kann. */ virtual bool IsSetContentAllowed() const = 0; diff --git a/engines/sword25/gfx/image/imageloader.cpp b/engines/sword25/gfx/image/imageloader.cpp index 1bf7508ee5..02eea59f56 100644 --- a/engines/sword25/gfx/image/imageloader.cpp +++ b/engines/sword25/gfx/image/imageloader.cpp @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -40,31 +40,29 @@ namespace Sword25 { #define BS_LOG_PREFIX "IMAGELOADER" // Statische Elemente der Klasse BS_ImageLoader intialisieren. -std::list<BS_ImageLoader*> BS_ImageLoader::_ImageLoaderList; +std::list<BS_ImageLoader *> BS_ImageLoader::_ImageLoaderList; bool BS_ImageLoader::_ImageLoaderListInitialized = false; // Lade Methode // ------------ -bool BS_ImageLoader::LoadImage(const char* pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS ColorFormat, - char*& pUncompressedData, - int& Width, int& Height, - int& Pitch) -{ +bool BS_ImageLoader::LoadImage(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS ColorFormat, + char*& pUncompressedData, + int &Width, int &Height, + int &Pitch) { // Falls die Liste der BS_ImageLoader noch nicht initialisiert wurde, wird dies getan. if (!_ImageLoaderListInitialized) _InitializeLoaderList(); // Passenden BS_ImageLoader finden und Bild dekodieren - BS_ImageLoader* pLoader = _FindSuitableImageLoader(pFileData, FileSize); - if (pLoader) - { + BS_ImageLoader *pLoader = _FindSuitableImageLoader(pFileData, FileSize); + if (pLoader) { return pLoader->DecodeImage(pFileData, FileSize, - ColorFormat, - pUncompressedData, - Width, Height, - Pitch); + ColorFormat, + pUncompressedData, + Width, Height, + Pitch); } return false; @@ -73,21 +71,19 @@ bool BS_ImageLoader::LoadImage(const char* pFileData, unsigned int FileSize, // Info Methode // ------------ -bool BS_ImageLoader::ExtractImageProperties(const char* pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS& ColorFormat, - int& Width, int& Height) -{ +bool BS_ImageLoader::ExtractImageProperties(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS &ColorFormat, + int &Width, int &Height) { // Falls die Liste der BS_ImageLoader noch nicht initialisiert wurde, wird dies getan. if (!_ImageLoaderListInitialized) _InitializeLoaderList(); // Passenden BS_ImageLoader finden und Bildeigenschaften auslesen. - BS_ImageLoader* pLoader = _FindSuitableImageLoader(pFileData, FileSize); - if (pLoader) - { + BS_ImageLoader *pLoader = _FindSuitableImageLoader(pFileData, FileSize); + if (pLoader) { return pLoader->ImageProperties(pFileData, FileSize, - ColorFormat, - Width, Height); + ColorFormat, + Width, Height); } return false; @@ -96,8 +92,7 @@ bool BS_ImageLoader::ExtractImageProperties(const char* pFileData, unsigned int // Verwaltungs Methoden // -------------------- -void BS_ImageLoader::_InitializeLoaderList() -{ +void BS_ImageLoader::_InitializeLoaderList() { // Von jedem BS_ImageLoader wird eine Instanz erzeugt, diese fügen sich selbständig in die BS_ImageLoader-Liste ein. for (int i = 0; i < BS_IMAGELOADER_COUNT; i++) BS_IMAGELOADER_IDS[i](); @@ -109,24 +104,19 @@ void BS_ImageLoader::_InitializeLoaderList() atexit(BS_ImageLoader::_DeinitializeLoaderList); } -void BS_ImageLoader::_DeinitializeLoaderList() -{ - while (!_ImageLoaderList.empty()) - { +void BS_ImageLoader::_DeinitializeLoaderList() { + while (!_ImageLoaderList.empty()) { delete _ImageLoaderList.back(); _ImageLoaderList.pop_back(); } } -BS_ImageLoader* BS_ImageLoader::_FindSuitableImageLoader(const char* pFileData, unsigned int FileSize) -{ +BS_ImageLoader *BS_ImageLoader::_FindSuitableImageLoader(const char *pFileData, unsigned int FileSize) { // Alle BS_ImageLoader-Objekte durchgehen, bis eins gefunden wurde, dass das Bild laden kann - std::list<BS_ImageLoader*>::iterator Iter = _ImageLoaderList.begin(); - for (; Iter != _ImageLoaderList.end(); ++Iter) - { + std::list<BS_ImageLoader *>::iterator Iter = _ImageLoaderList.begin(); + for (; Iter != _ImageLoaderList.end(); ++Iter) { // Falls ein geeigneter BS-ImageLoader gefunden wurde, wird er zurückgegeben. - if ((*Iter)->IsCorrectImageFormat(pFileData, FileSize)) - { + if ((*Iter)->IsCorrectImageFormat(pFileData, FileSize)) { return (*Iter); } } diff --git a/engines/sword25/gfx/image/imageloader.h b/engines/sword25/gfx/image/imageloader.h index 15c4e20606..204a56b144 100644 --- a/engines/sword25/gfx/image/imageloader.h +++ b/engines/sword25/gfx/image/imageloader.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -33,10 +33,10 @@ */ /* - BS_ImageLoader - -------------- + BS_ImageLoader + -------------- - Autor: Malte Thiesen + Autor: Malte Thiesen */ #ifndef SWORD25_IMAGELOADER_H @@ -55,90 +55,88 @@ namespace Sword25 { /** - @brief Über die statischen Methoden dieser Klasse werden alle unterstützten Bildformate geladen. - - Zum Laden von Bildern wird die #LoadImage-Methode benutzt. - - Außerdem stellt diese Klasse das Interface da, das alle Klassen implementieren müssen, die Bildformate einlesen.<br> - Zur Unterstützung eines neuen Bildformates muss folgendermaßen vorgegangen werden: - - Erzeugen einer neuen von #BS_ImageLoader abgeleiteten Klasse, die die Methoden #IsCorrectImageFormat und #DecodeImage impelementiert. - - Die Klasse muss eine statische Methode haben, die eine Instanz von ihr erzeugt und einen Pointer darauf zurückgibt. - - Diese Methode muss in der Liste in der Datei imageloader_ids.h eingetragen werden. - - Die Klasse muss JEDES Eingabebild seines Bildformates in die folgenden Farbformate konvertieren können: - - BS_GraphicEngine::CF_RGB16 - - BS_GraphicEngine::CF_RGB15 - - BS_GraphicEngine::CF_RGB16_INTERLEAVED - - BS_GraphicEngine::CF_RGB15_INTERLEAVED - - BS_GraphicEngine::CF_ARGB32 - - BS_GraphicEngine::CF_BGRA32 - - Zum Konvertieren der Bilddaten können die Hilfsmethoden dieser Klasse benutzt werden, die ARGB Bilddaten in alle benötigten - Farbformate konvertieren. + @brief Über die statischen Methoden dieser Klasse werden alle unterstützten Bildformate geladen. + + Zum Laden von Bildern wird die #LoadImage-Methode benutzt. + + Außerdem stellt diese Klasse das Interface da, das alle Klassen implementieren müssen, die Bildformate einlesen.<br> + Zur Unterstützung eines neuen Bildformates muss folgendermaßen vorgegangen werden: + - Erzeugen einer neuen von #BS_ImageLoader abgeleiteten Klasse, die die Methoden #IsCorrectImageFormat und #DecodeImage impelementiert. + - Die Klasse muss eine statische Methode haben, die eine Instanz von ihr erzeugt und einen Pointer darauf zurückgibt. + - Diese Methode muss in der Liste in der Datei imageloader_ids.h eingetragen werden. + - Die Klasse muss JEDES Eingabebild seines Bildformates in die folgenden Farbformate konvertieren können: + - BS_GraphicEngine::CF_RGB16 + - BS_GraphicEngine::CF_RGB15 + - BS_GraphicEngine::CF_RGB16_INTERLEAVED + - BS_GraphicEngine::CF_RGB15_INTERLEAVED + - BS_GraphicEngine::CF_ARGB32 + - BS_GraphicEngine::CF_BGRA32 + - Zum Konvertieren der Bilddaten können die Hilfsmethoden dieser Klasse benutzt werden, die ARGB Bilddaten in alle benötigten + Farbformate konvertieren. */ -class BS_ImageLoader -{ +class BS_ImageLoader { public: //@{ /** @name Lade Methoden */ /** - @brief Lädt eine Bilddatei. - - Diese Methode kann sämtliche unterstütztem Bildformate lesen. Die Methode erkennt selbstständing um welches Dateiformat es sich - bei der vorliegenden Datei handelt.<br> - Bisher wird nur PNG unterstützt. - - @param pFileData ein Pointer auf die Bilddaten. - @param FileSize die Größe der Bilddaten in Byte. - @param ColorFormat gibt das gewünschte Farbformat an, in das die Bilddaten konvertiert werden sollen.<br> - Folgende Farbformate werden unterstützt: - - BS_GraphicEngine::CF_RGB16 - - BS_GraphicEngine::CF_RGB15 - - BS_GraphicEngine::CF_RGB16_INTERLEAVED - - BS_GraphicEngine::CF_RGB15_INTERLEAVED - - BS_GraphicEngine::CF_ARGB32 - @param pUncompressedData nach erfolgreichen Laden zeigt dieser Pointer auf die enpackten und konvertierten Bilddaten. - @param Width gibt nach erfolgreichen Laden die Breite des geladenen Bildes an. - @param Height gibt nach erfolgreichen Laden die Höhe des geladenen Bildes an. - @param Pitch gibt nach erfolgreichen Laden die Länge einer Bildzeile in Byte an. - @return Gibt false zurück, falls das Laden fehlgeschlagen ist. - @remark Die Größe der Ausgabedaten in Bytes kann wie folgt berechnet werden: Pitch * Height. - @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. + @brief Lädt eine Bilddatei. + + Diese Methode kann sämtliche unterstütztem Bildformate lesen. Die Methode erkennt selbstständing um welches Dateiformat es sich + bei der vorliegenden Datei handelt.<br> + Bisher wird nur PNG unterstützt. + + @param pFileData ein Pointer auf die Bilddaten. + @param FileSize die Größe der Bilddaten in Byte. + @param ColorFormat gibt das gewünschte Farbformat an, in das die Bilddaten konvertiert werden sollen.<br> + Folgende Farbformate werden unterstützt: + - BS_GraphicEngine::CF_RGB16 + - BS_GraphicEngine::CF_RGB15 + - BS_GraphicEngine::CF_RGB16_INTERLEAVED + - BS_GraphicEngine::CF_RGB15_INTERLEAVED + - BS_GraphicEngine::CF_ARGB32 + @param pUncompressedData nach erfolgreichen Laden zeigt dieser Pointer auf die enpackten und konvertierten Bilddaten. + @param Width gibt nach erfolgreichen Laden die Breite des geladenen Bildes an. + @param Height gibt nach erfolgreichen Laden die Höhe des geladenen Bildes an. + @param Pitch gibt nach erfolgreichen Laden die Länge einer Bildzeile in Byte an. + @return Gibt false zurück, falls das Laden fehlgeschlagen ist. + @remark Die Größe der Ausgabedaten in Bytes kann wie folgt berechnet werden: Pitch * Height. + @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. */ - static bool LoadImage(const char* pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS ColorFormat, - char*& pUncompressedData, - int& Width, int& Height, - int& Pitch); + static bool LoadImage(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS ColorFormat, + char*& pUncompressedData, + int &Width, int &Height, + int &Pitch); /** - @brief Liest die Bildeigenschaften eines Bildes aus. - - @param pFileData ein Pointer auf die Bilddaten. - @param FileSize die Größe des Bilddaten in Byte. - @param ColorFormat enthält nach einem erfolgreichem Aufruf das Farbformat des Bildes. - @param Width enthält nach einem erfolgreichem Aufruf die Breite des Bildes in Pixeln. - @param Height enthält nach einem erfolgreichem Aufruf die Höhe des Bildes in Pixeln. - @return Gibt false zurück, wenn die Bildeigenschaften nicht ausgelesen werden konnten. - @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. + @brief Liest die Bildeigenschaften eines Bildes aus. + + @param pFileData ein Pointer auf die Bilddaten. + @param FileSize die Größe des Bilddaten in Byte. + @param ColorFormat enthält nach einem erfolgreichem Aufruf das Farbformat des Bildes. + @param Width enthält nach einem erfolgreichem Aufruf die Breite des Bildes in Pixeln. + @param Height enthält nach einem erfolgreichem Aufruf die Höhe des Bildes in Pixeln. + @return Gibt false zurück, wenn die Bildeigenschaften nicht ausgelesen werden konnten. + @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. */ - static bool ExtractImageProperties(const char* pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS& ColorFormat, - int& Width, int& Height); + static bool ExtractImageProperties(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS &ColorFormat, + int &Width, int &Height); //@} protected: // Protected Konstruktor, damit Instanzen dieser Klasse nur von BS_ImageLoader-Objekten erstellt werden können /** - @brief Der Standardkonstruktor. + @brief Der Standardkonstruktor. - Dieser Konstruktor registriert alle Instanzen von #BS_ImageLoader-Klassen in einer Liste.<br> - Diese Liste enthält jeweils eine Instanz jedes #BS_ImageLoader und wird benutzt um beliebige Bilddateien einem Loader zuzuordnen. - @remark Dieser Konstruktor ist protected damit nur #BS_ImageLoader-Objekte diese Klasse instanziieren können. + Dieser Konstruktor registriert alle Instanzen von #BS_ImageLoader-Klassen in einer Liste.<br> + Diese Liste enthält jeweils eine Instanz jedes #BS_ImageLoader und wird benutzt um beliebige Bilddateien einem Loader zuzuordnen. + @remark Dieser Konstruktor ist protected damit nur #BS_ImageLoader-Objekte diese Klasse instanziieren können. */ - BS_ImageLoader() - { + BS_ImageLoader() { // Klasse registrieren _ImageLoaderList.push_front(this); } @@ -147,54 +145,54 @@ protected: /** @name Abstrakte Methoden */ /** - @brief Gibt an, ob der #BS_ImageLoader ein Bild lesen kann. - @param pFileData ein Pointer auf die kompletten Daten des Bildes. - @param FileSize die Größe der Daten in Byte. - @return Gibt true zurück, wenn der #BS_ImageLoader das Bild lesen kann, ansonsten false. - @remark Diese Methode muss von allen BS_ImageLoader Klassen implementiert werden. + @brief Gibt an, ob der #BS_ImageLoader ein Bild lesen kann. + @param pFileData ein Pointer auf die kompletten Daten des Bildes. + @param FileSize die Größe der Daten in Byte. + @return Gibt true zurück, wenn der #BS_ImageLoader das Bild lesen kann, ansonsten false. + @remark Diese Methode muss von allen BS_ImageLoader Klassen implementiert werden. */ - virtual bool IsCorrectImageFormat(const char* pFileData, unsigned int FileSize) = 0; + virtual bool IsCorrectImageFormat(const char *pFileData, unsigned int FileSize) = 0; /** - @brief Lädt eine Bilddatei. - @param pFileData ein Pointer auf die Bilddaten. - @param FileSize die Größe der Bilddaten in Byte. - @param ColorFormat gibt das gewünschte Farbformat an, in das die Bilddaten konvertiert werden sollen.<br> - Folgende Farbformate werden unterstützt: - - BS_GraphicEngine::CF_RGB16 - - BS_GraphicEngine::CF_RGB15 - - BS_GraphicEngine::CF_RGB16_INTERLEAVED - - BS_GraphicEngine::CF_RGB15_INTERLEAVED - - BS_GraphicEngine::CF_ARGB32 - @param pUncompressedData nach erfolgreichen Laden zeigt dieser Pointer auf die enpackten und konvertierten Bilddaten. - @param Width gibt nach erfolgreichen Laden die Breite des geladenen Bildes an. - @param Height gibt nach erfolgreichen Laden die Höhe des geladenen Bildes an. - @param Pitch gibt nach erfolgreichen Laden die Länge einer Bildzeile in Byte an. - @return Gibt false zurück, falls das Laden fehlgeschlagen ist. - @remark Die Größe der Ausgabedaten in Bytes kann wie folgt berechnet werden: Pitch * Height. - @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. - @remark Diese Methode muss von allen BS_ImageLoader Klassen implementiert werden. + @brief Lädt eine Bilddatei. + @param pFileData ein Pointer auf die Bilddaten. + @param FileSize die Größe der Bilddaten in Byte. + @param ColorFormat gibt das gewünschte Farbformat an, in das die Bilddaten konvertiert werden sollen.<br> + Folgende Farbformate werden unterstützt: + - BS_GraphicEngine::CF_RGB16 + - BS_GraphicEngine::CF_RGB15 + - BS_GraphicEngine::CF_RGB16_INTERLEAVED + - BS_GraphicEngine::CF_RGB15_INTERLEAVED + - BS_GraphicEngine::CF_ARGB32 + @param pUncompressedData nach erfolgreichen Laden zeigt dieser Pointer auf die enpackten und konvertierten Bilddaten. + @param Width gibt nach erfolgreichen Laden die Breite des geladenen Bildes an. + @param Height gibt nach erfolgreichen Laden die Höhe des geladenen Bildes an. + @param Pitch gibt nach erfolgreichen Laden die Länge einer Bildzeile in Byte an. + @return Gibt false zurück, falls das Laden fehlgeschlagen ist. + @remark Die Größe der Ausgabedaten in Bytes kann wie folgt berechnet werden: Pitch * Height. + @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. + @remark Diese Methode muss von allen BS_ImageLoader Klassen implementiert werden. */ - virtual bool DecodeImage(const char* pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS ColorFormat, - char*& pUncompressedData, - int& Width, int& Height, - int& Pitch) = 0; + virtual bool DecodeImage(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS ColorFormat, + char*& pUncompressedData, + int &Width, int &Height, + int &Pitch) = 0; /** - @brief Liest die Bildeigenschaften aus. - @param pFileData ein Pointer auf die Bilddaten. - @param FileSize die Größe des Bilddaten in Byte. - @param ColorFormat enthält nach einem erfolgreichem Aufruf das Farbformat des Bildes. - @param Width enthält nach einem erfolgreichem Aufruf die Breite des Bildes in Pixeln. - @param Height enthält nach einem erfolgreichem Aufruf die Höhe des Bildes in Pixeln. - @return Gibt false zurück, wenn die Bildeigenschaften nicht ausgelesen werden konnten. - @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. - @remark Diese Methode muss von allen BS_ImageLoader Klassen implementiert werden. + @brief Liest die Bildeigenschaften aus. + @param pFileData ein Pointer auf die Bilddaten. + @param FileSize die Größe des Bilddaten in Byte. + @param ColorFormat enthält nach einem erfolgreichem Aufruf das Farbformat des Bildes. + @param Width enthält nach einem erfolgreichem Aufruf die Breite des Bildes in Pixeln. + @param Height enthält nach einem erfolgreichem Aufruf die Höhe des Bildes in Pixeln. + @return Gibt false zurück, wenn die Bildeigenschaften nicht ausgelesen werden konnten. + @remark Es darf nicht vergessen werden, die Ausgabedaten nach erfolgter Benutzung mit delete freizugeben. + @remark Diese Methode muss von allen BS_ImageLoader Klassen implementiert werden. */ - virtual bool ImageProperties(const char* pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS& ColorFormat, - int& Width, int& Height) = 0; + virtual bool ImageProperties(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS &ColorFormat, + int &Width, int &Height) = 0; //@} @@ -202,69 +200,62 @@ protected: /** @name Konvertierungsmethoden */ /** - @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB16 Farbformat. - @param pSrcData ein Pointer auf die Quelldaten. - @param pDestData ein Pointer auf den Zielpuffern. - @param Width die Anzahl der Pixel in der Bildzeile. - @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß ist.<br> - Es sind mindestens Width * 2 Byte notwendig. + @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB16 Farbformat. + @param pSrcData ein Pointer auf die Quelldaten. + @param pDestData ein Pointer auf den Zielpuffern. + @param Width die Anzahl der Pixel in der Bildzeile. + @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß ist.<br> + Es sind mindestens Width * 2 Byte notwendig. */ - static void RowARGB32ToRGB16(unsigned char* pSrcData, unsigned char* pDestData, unsigned int Width) - { - for (unsigned int i = 0; i < Width; i++) - { - ((uint16_t*)pDestData)[i] = ((pSrcData[2] >> 3) << 11) | ((pSrcData[1] >> 2) << 5) | (pSrcData[0] >> 3); + static void RowARGB32ToRGB16(unsigned char *pSrcData, unsigned char *pDestData, unsigned int Width) { + for (unsigned int i = 0; i < Width; i++) { + ((uint16_t *)pDestData)[i] = ((pSrcData[2] >> 3) << 11) | ((pSrcData[1] >> 2) << 5) | (pSrcData[0] >> 3); pSrcData += 4; } } - + /** - @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB15 Farbformat. - @param pSrcData ein Pointer auf die Quelldaten. - @param pDestData ein Pointer auf den Zielpuffern. - @param Width die Anzahl der Pixel in der Bildzeile. - @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß ist.<br> - Es sind mindestens Width * 2 Byte notwendig. + @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB15 Farbformat. + @param pSrcData ein Pointer auf die Quelldaten. + @param pDestData ein Pointer auf den Zielpuffern. + @param Width die Anzahl der Pixel in der Bildzeile. + @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß ist.<br> + Es sind mindestens Width * 2 Byte notwendig. */ - static void RowARGB32ToRGB15(unsigned char* pSrcData, unsigned char* pDestData, unsigned int Width) - { - for (unsigned int i = 0; i < Width; i++) - { - ((uint16_t*)pDestData)[i] = ((pSrcData[2] >> 3) << 10) | ((pSrcData[1] >> 3) << 5) | (pSrcData[0] >> 3); + static void RowARGB32ToRGB15(unsigned char *pSrcData, unsigned char *pDestData, unsigned int Width) { + for (unsigned int i = 0; i < Width; i++) { + ((uint16_t *)pDestData)[i] = ((pSrcData[2] >> 3) << 10) | ((pSrcData[1] >> 3) << 5) | (pSrcData[0] >> 3); pSrcData += 4; } } /** - @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB16_INTERLEAVED Farbformat. - @param pSrcData ein Pointer auf die Quelldaten. - @param pDestData ein Pointer auf den Zielpuffern. - @param Width die Anzahl der Pixel in der Bildzeile. - @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß sein muss.<br> - Es sind mindestens ((Width + 3) / 4) * 12 Byte notwendig. + @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB16_INTERLEAVED Farbformat. + @param pSrcData ein Pointer auf die Quelldaten. + @param pDestData ein Pointer auf den Zielpuffern. + @param Width die Anzahl der Pixel in der Bildzeile. + @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß sein muss.<br> + Es sind mindestens ((Width + 3) / 4) * 12 Byte notwendig. */ - static void RowARGB32ToRGB16_INTERLEAVED(unsigned char* pSrcData, unsigned char* pDestData, unsigned int Width) - { + static void RowARGB32ToRGB16_INTERLEAVED(unsigned char *pSrcData, unsigned char *pDestData, unsigned int Width) { // Die Pixelblöcke erstellen, dabei werden immer jeweils 4 Pixel zu einem Block zusammengefasst unsigned int BlockFillCount = 0; unsigned int AlphaBlock = 0; - for (unsigned int i = 0; i < Width; i++) - { + for (unsigned int i = 0; i < Width; i++) { // Alphawert in den Alphablock schreiben AlphaBlock = (AlphaBlock >> 8) | (pSrcData[BlockFillCount * 4 + 3] << 24); - + // Füllstand der Pixelblockes aktualisieren BlockFillCount++; // Sobald 4 Alphawerte gesammelt wurden, oder die Zeile zu Ende ist wird der Pixelblock in den Zielpuffer geschrieben - if (BlockFillCount == 4 || i == (Width - 1)) - { + if (BlockFillCount == 4 || i == (Width - 1)) { // Falls der AlphaBlock nicht ganz gefüllt ist muss geshiftet werden um sicherzustellen, dass die Alphawerte // "left aligned" sind. AlphaBlock >>= (4 - BlockFillCount) * 8; // Alphablock schreiben - *((unsigned int*)pDestData) = AlphaBlock; + *((unsigned int *)pDestData) = AlphaBlock; pDestData += 4; // Pixel konvertieren und schreiben @@ -283,35 +274,32 @@ protected: } /** - @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB15_INTERLEAVED Farbformat. - @param pSrcData ein Pointer auf die Quelldaten. - @param pDestData ein Pointer auf den Zielpuffern. - @param Width die Anzahl der Pixel in der Bildzeile. - @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß ist.<br> - Es sind mindestens (Width / 4 + Width % 4) * 3 Byte notwendig. + @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_RGB15_INTERLEAVED Farbformat. + @param pSrcData ein Pointer auf die Quelldaten. + @param pDestData ein Pointer auf den Zielpuffern. + @param Width die Anzahl der Pixel in der Bildzeile. + @remark Es gilt zu beachten, dass der Zielpuffer ausreichend groß ist.<br> + Es sind mindestens (Width / 4 + Width % 4) * 3 Byte notwendig. */ - static void RowARGB32ToRGB15_INTERLEAVED(unsigned char* pSrcData, unsigned char* pDestData, unsigned int Width) - { + static void RowARGB32ToRGB15_INTERLEAVED(unsigned char *pSrcData, unsigned char *pDestData, unsigned int Width) { // Die Pixelblöcke erstellen, dabei werden immer jeweils 4 Pixel zu einem Block zusammengefasst unsigned int BlockFillCount = 0; unsigned int AlphaBlock = 0; - for (unsigned int i = 0; i < Width; i++) - { + for (unsigned int i = 0; i < Width; i++) { // Alphawert in den Alphablock schreiben AlphaBlock = (AlphaBlock >> 8) | (pSrcData[BlockFillCount * 4 + 3] << 24); - + // Füllstand der Pixelblockes aktualisieren BlockFillCount++; // Sobald 4 Alphawerte gesammelt wurden, oder die Zeile zu Ende ist wird der Pixelblock in den Zielpuffer geschrieben - if (BlockFillCount == 4 || i == (Width - 1)) - { + if (BlockFillCount == 4 || i == (Width - 1)) { // Falls der AlphaBlock nicht ganz gefüllt ist muss geshiftet werden um sicherzustellen, dass die Alphawerte // "left aligned" sind. AlphaBlock >>= (4 - BlockFillCount) * 8; // Alphablock schreiben - *((unsigned int*)pDestData) = AlphaBlock; + *((unsigned int *)pDestData) = AlphaBlock; pDestData += 4; // Pixel konvertieren und schreiben @@ -330,15 +318,13 @@ protected: } /** - @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_BGRA32 Farbformat. - @param pSrcData ein Pointer auf die Quelldaten. - @param pDestData ein Pointer auf den Zielpuffern. - @param Width die Anzahl der Pixel in der Bildzeile. + @brief Konvertiert eine Bildzeile mit ARGB Pixeldaten in das BS_GraphicEngine::CF_BGRA32 Farbformat. + @param pSrcData ein Pointer auf die Quelldaten. + @param pDestData ein Pointer auf den Zielpuffern. + @param Width die Anzahl der Pixel in der Bildzeile. */ - static void RowARGB32ToABGR32(unsigned char* pSrcData, unsigned char* pDestData, unsigned int Width) - { - for (unsigned int i = 0; i < Width; ++i) - { + static void RowARGB32ToABGR32(unsigned char *pSrcData, unsigned char *pDestData, unsigned int Width) { + for (unsigned int i = 0; i < Width; ++i) { *pDestData++ = pSrcData[2]; *pDestData++ = pSrcData[1]; *pDestData++ = pSrcData[0]; @@ -351,25 +337,25 @@ protected: private: /** - @brief Erzeugt je eine Instanz aller BS_ImageLoader Klassen und fügt diese in eine interne Liste ein. Diese werden dann beim - Laden von Bildern benutzt. - @remark Die Klassen müssen in der Datei imageloader_ids.h eingetragen sein, damit sie an dieser Stelle berücksichtigt werden. + @brief Erzeugt je eine Instanz aller BS_ImageLoader Klassen und fügt diese in eine interne Liste ein. Diese werden dann beim + Laden von Bildern benutzt. + @remark Die Klassen müssen in der Datei imageloader_ids.h eingetragen sein, damit sie an dieser Stelle berücksichtigt werden. */ static void _InitializeLoaderList(); /** - @brief Zerstört alle Instanzen von BS_ImageLoader Klassen, die in dieser Klasse registriert sind. + @brief Zerstört alle Instanzen von BS_ImageLoader Klassen, die in dieser Klasse registriert sind. */ static void _DeinitializeLoaderList(); /** - @brief Sucht zu Bilddaten ein BS_ImageLoader Objekt, dass die Bilddaten dekodieren kann. - @return Gibt einen Pointer auf ein passendes BS_ImageLoader Objekt zurück, oder NULL, wenn kein passendes Objekt gefunden wurde. + @brief Sucht zu Bilddaten ein BS_ImageLoader Objekt, dass die Bilddaten dekodieren kann. + @return Gibt einen Pointer auf ein passendes BS_ImageLoader Objekt zurück, oder NULL, wenn kein passendes Objekt gefunden wurde. */ - static BS_ImageLoader* _FindSuitableImageLoader(const char* pFileData, unsigned int FileSize); + static BS_ImageLoader *_FindSuitableImageLoader(const char *pFileData, unsigned int FileSize); - static std::list<BS_ImageLoader*> _ImageLoaderList; // Die Liste aller BS_ImageLoader-Objekte - static bool _ImageLoaderListInitialized; // Gibt an, ob die Liste schon intialisiert wurde + static std::list<BS_ImageLoader *> _ImageLoaderList; // Die Liste aller BS_ImageLoader-Objekte + static bool _ImageLoaderListInitialized; // Gibt an, ob die Liste schon intialisiert wurde }; } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/imageloader_ids.h b/engines/sword25/gfx/image/imageloader_ids.h index 74c5c3429a..bde6293f50 100644 --- a/engines/sword25/gfx/image/imageloader_ids.h +++ b/engines/sword25/gfx/image/imageloader_ids.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -33,12 +33,12 @@ */ /* - imageloader_ids.h - ----------------- - In dieser Datei sind alle ImageLoader verzeichnet. - JEDER neuer ImageLoader muss hier eingetragen werden, ansonsten wird er beim Laden eines Bildes nicht berücksichtigt. + imageloader_ids.h + ----------------- + In dieser Datei sind alle ImageLoader verzeichnet. + JEDER neuer ImageLoader muss hier eingetragen werden, ansonsten wird er beim Laden eines Bildes nicht berücksichtigt. - Autor: Malte Thiesen + Autor: Malte Thiesen */ #include "sword25/gfx/image/imageloader.h" @@ -51,9 +51,8 @@ namespace Sword25 { // Die Tabelle enthält Pointer auf statische Member-Funktionen innerhalb der Klassen, die eine Instanz der Klasse // erzeugen -typedef BS_ImageLoader* (*BS_IMAGELOADER_NEW)(); -const BS_IMAGELOADER_NEW BS_IMAGELOADER_IDS[] = -{ +typedef BS_ImageLoader*(*BS_IMAGELOADER_NEW)(); +const BS_IMAGELOADER_NEW BS_IMAGELOADER_IDS[] = { BS_PNGLoader::CreateInstance, BS_B25SLoader::CreateInstance, }; diff --git a/engines/sword25/gfx/image/pngloader.cpp b/engines/sword25/gfx/image/pngloader.cpp index 693874314f..1c896a7675 100644 --- a/engines/sword25/gfx/image/pngloader.cpp +++ b/engines/sword25/gfx/image/pngloader.cpp @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -48,66 +48,58 @@ namespace Sword25 { // Konstruktor / Destruktor // ----------------------------------------------------------------------------- -BS_PNGLoader::BS_PNGLoader() -{ +BS_PNGLoader::BS_PNGLoader() { } // ----------------------------------------------------------------------------- // Laden // ----------------------------------------------------------------------------- -static void png_user_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - memcpy(data, (char*)png_ptr->io_ptr, length); - png_ptr->io_ptr = (void*)((png_size_t)png_ptr->io_ptr + length); +static void png_user_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { + memcpy(data, (char *)png_ptr->io_ptr, length); + png_ptr->io_ptr = (void *)((png_size_t)png_ptr->io_ptr + length); } // ----------------------------------------------------------------------------- -bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, - int & Width, int & Height, int & Pitch) -{ +bool BS_PNGLoader::DoDecodeImage(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, + int &Width, int &Height, int &Pitch) { png_structp png_ptr = NULL; png_infop info_ptr = NULL; - png_bytep RawDataBuffer = NULL; - png_bytep* pRowPtr = NULL; + png_bytep RawDataBuffer = NULL; + png_bytep *pRowPtr = NULL; - int BitDepth; - int ColorType; - int InterlaceType; - int i; + int BitDepth; + int ColorType; + int InterlaceType; + int i; // Zielfarbformat überprüfen if (ColorFormat != BS_GraphicEngine::CF_RGB16 && - ColorFormat != BS_GraphicEngine::CF_RGB15 && - ColorFormat != BS_GraphicEngine::CF_RGB16_INTERLEAVED && - ColorFormat != BS_GraphicEngine::CF_RGB15_INTERLEAVED && - ColorFormat != BS_GraphicEngine::CF_ARGB32 && - ColorFormat != BS_GraphicEngine::CF_ABGR32) - { + ColorFormat != BS_GraphicEngine::CF_RGB15 && + ColorFormat != BS_GraphicEngine::CF_RGB16_INTERLEAVED && + ColorFormat != BS_GraphicEngine::CF_RGB15_INTERLEAVED && + ColorFormat != BS_GraphicEngine::CF_ARGB32 && + ColorFormat != BS_GraphicEngine::CF_ABGR32) { BS_LOG_ERRORLN("Illegal or unsupported color format."); return false; } - try - { + try { // PNG Signatur überprüfen - if (!png_check_sig(reinterpret_cast<png_bytep>(const_cast<char *>(FileDataPtr)), 8)) - { + if (!png_check_sig(reinterpret_cast<png_bytep>(const_cast<char *>(FileDataPtr)), 8)) { throw(0); } // Die beiden PNG Strukturen erstellen png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) - { + if (!png_ptr) { BS_LOG_ERRORLN("Could not create libpng read struct."); throw(0); } info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { + if (!info_ptr) { BS_LOG_ERRORLN("Could not create libpng info struct."); throw(0); } @@ -116,13 +108,13 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize if (setjmp(png_jmpbuf(png_ptr))) throw(0); // Alternative Lesefunktion benutzen - png_set_read_fn(png_ptr, (void*)FileDataPtr, png_user_read_data); + png_set_read_fn(png_ptr, (void *)FileDataPtr, png_user_read_data); // PNG Header einlesen png_read_info(png_ptr, info_ptr); // PNG Informationen auslesen - png_get_IHDR(png_ptr, info_ptr, (unsigned long*)&Width, (unsigned long*)&Height, &BitDepth, &ColorType, &InterlaceType, NULL, NULL); + png_get_IHDR(png_ptr, info_ptr, (unsigned long *)&Width, (unsigned long *)&Height, &BitDepth, &ColorType, &InterlaceType, NULL, NULL); // Pitch des Ausgabebildes berechnen Pitch = BS_GraphicEngine::CalcPitch(ColorFormat, Width); @@ -130,8 +122,7 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize // Speicher für die endgültigen Bilddaten reservieren // Dieses geschieht vor dem reservieren von Speicher für temporäre Bilddaten um die Fragmentierung des Speichers gering zu halten UncompressedDataPtr = new char[Pitch * Height]; - if (!UncompressedDataPtr) - { + if (!UncompressedDataPtr) { BS_LOG_ERRORLN("Could not allocate memory for output image."); throw(0); } @@ -146,7 +137,7 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_expand(png_ptr); if (ColorType == PNG_COLOR_TYPE_GRAY || - ColorType == PNG_COLOR_TYPE_GRAY_ALPHA) + ColorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); png_set_bgr(png_ptr); @@ -156,62 +147,58 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize // Nachdem die Transformationen registriert wurden, werden die Bilddaten erneut eingelesen png_read_update_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, (unsigned long*)&Width, (unsigned long*)&Height, &BitDepth, &ColorType, NULL, NULL, NULL); + png_get_IHDR(png_ptr, info_ptr, (unsigned long *)&Width, (unsigned long *)&Height, &BitDepth, &ColorType, NULL, NULL, NULL); // PNGs ohne Interlacing werden Zeilenweise eingelesen - if (InterlaceType == PNG_INTERLACE_NONE) - { + if (InterlaceType == PNG_INTERLACE_NONE) { // Speicher für eine Bildzeile reservieren RawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr)]; - if (!RawDataBuffer) - { + if (!RawDataBuffer) { BS_LOG_ERRORLN("Could not allocate memory for row buffer."); throw(0); } // Bilddaten zeilenweise einlesen und in das gewünschte Zielformat konvertieren - for (i = 0; i < Height; i++) - { + for (i = 0; i < Height; i++) { // Zeile einlesen png_read_row(png_ptr, RawDataBuffer, NULL); // Zeile konvertieren - switch (ColorFormat) - { + switch (ColorFormat) { case BS_GraphicEngine::CF_RGB16: - RowARGB32ToRGB16((unsigned char*)RawDataBuffer, - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB16((unsigned char *)RawDataBuffer, + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_RGB15: - RowARGB32ToRGB15((unsigned char*)RawDataBuffer, - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB15((unsigned char *)RawDataBuffer, + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_RGB16_INTERLEAVED: - RowARGB32ToRGB16_INTERLEAVED((unsigned char*)RawDataBuffer, - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB16_INTERLEAVED((unsigned char *)RawDataBuffer, + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_RGB15_INTERLEAVED: - RowARGB32ToRGB15_INTERLEAVED((unsigned char*)RawDataBuffer, - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB15_INTERLEAVED((unsigned char *)RawDataBuffer, + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_ARGB32: memcpy(&UncompressedDataPtr[i * Pitch], - RawDataBuffer, - Pitch); + RawDataBuffer, + Pitch); break; case BS_GraphicEngine::CF_ABGR32: - RowARGB32ToABGR32((unsigned char*)RawDataBuffer, - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToABGR32((unsigned char *)RawDataBuffer, + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; default: @@ -220,20 +207,17 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize } } // PNGs mit Interlacing werden an einem Stück eingelesen - else - { + else { // Speicher für das komplette Bild reservieren RawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr) * Height]; - if (!RawDataBuffer) - { + if (!RawDataBuffer) { BS_LOG_ERRORLN("Could not allocate memory for raw image buffer."); throw(0); } // Speicher für die Rowpointer reservieren pRowPtr = new png_bytep[Height]; - if (!pRowPtr) - { + if (!pRowPtr) { BS_LOG_ERRORLN("Could not allocate memory for row pointers."); throw(0); } @@ -246,41 +230,40 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize png_read_image(png_ptr, pRowPtr); // Bilddaten zeilenweise in das gewünschte Ausgabeformat konvertieren - switch (ColorFormat) - { + switch (ColorFormat) { case BS_GraphicEngine::CF_RGB16: for (i = 0; i < Height; i++) - RowARGB32ToRGB16((unsigned char*)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB16((unsigned char *)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_RGB15: for (i = 0; i < Height; i++) - RowARGB32ToRGB15((unsigned char*)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB15((unsigned char *)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_RGB16_INTERLEAVED: for (i = 0; i < Height; i++) - RowARGB32ToRGB16_INTERLEAVED((unsigned char*)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB16_INTERLEAVED((unsigned char *)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_RGB15_INTERLEAVED: for (i = 0; i < Height; i++) - RowARGB32ToRGB15_INTERLEAVED((unsigned char*)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), - (unsigned char*)&UncompressedDataPtr[i * Pitch], - Width); + RowARGB32ToRGB15_INTERLEAVED((unsigned char *)(&RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)]), + (unsigned char *)&UncompressedDataPtr[i * Pitch], + Width); break; case BS_GraphicEngine::CF_ARGB32: for (i = 0; i < Height; i++) memcpy(&UncompressedDataPtr[i * Pitch], - &RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)], - Pitch); + &RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)], + Pitch); break; } } @@ -296,8 +279,7 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize delete[] RawDataBuffer; } - catch(int) - { + catch (int) { delete[] pRowPtr; delete[] RawDataBuffer; if (png_ptr) png_destroy_read_struct(&png_ptr, NULL, NULL); @@ -313,40 +295,35 @@ bool BS_PNGLoader::DoDecodeImage(const char * FileDataPtr, unsigned int FileSize // ----------------------------------------------------------------------------- -bool BS_PNGLoader::DecodeImage(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, - int & Width, int & Height, int & Pitch) -{ +bool BS_PNGLoader::DecodeImage(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, + int &Width, int &Height, int &Pitch) { return DoDecodeImage(FileDataPtr, FileSize, ColorFormat, UncompressedDataPtr, Width, Height, Pitch); } // ----------------------------------------------------------------------------- -bool BS_PNGLoader::DoImageProperties(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS & ColorFormat, int & Width, int & Height) -{ +bool BS_PNGLoader::DoImageProperties(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height) { // PNG Signatur überprüfen if (!DoIsCorrectImageFormat(FileDataPtr, FileSize)) return false; png_structp png_ptr = NULL; png_infop info_ptr = NULL; - try - { + try { // Die beiden PNG Strukturen erstellen png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) - { + if (!png_ptr) { BS_LOG_ERRORLN("Could not create libpng read struct."); throw(0); } info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { + if (!info_ptr) { BS_LOG_ERRORLN("Could not create libpng info struct."); throw(0); } // Alternative Lesefunktion benutzen - png_set_read_fn(png_ptr, (void*)FileDataPtr, png_user_read_data); + png_set_read_fn(png_ptr, (void *)FileDataPtr, png_user_read_data); // PNG Header einlesen png_read_info(png_ptr, info_ptr); @@ -354,7 +331,7 @@ bool BS_PNGLoader::DoImageProperties(const char * FileDataPtr, unsigned int File // PNG Informationen auslesen int BitDepth; int ColorType; - png_get_IHDR(png_ptr, info_ptr, (unsigned long*)&Width, (unsigned long*)&Height, &BitDepth, &ColorType, NULL, NULL, NULL); + png_get_IHDR(png_ptr, info_ptr, (unsigned long *)&Width, (unsigned long *)&Height, &BitDepth, &ColorType, NULL, NULL, NULL); // PNG-ColorType in BS ColorFormat konvertieren. if (ColorType & PNG_COLOR_MASK_ALPHA || png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) @@ -366,8 +343,7 @@ bool BS_PNGLoader::DoImageProperties(const char * FileDataPtr, unsigned int File png_destroy_read_struct(&png_ptr, &info_ptr, NULL); } - catch (int) - { + catch (int) { if (png_ptr) png_destroy_read_struct(&png_ptr, NULL, NULL); if (info_ptr) png_destroy_read_struct(NULL, &info_ptr, NULL); @@ -381,8 +357,7 @@ bool BS_PNGLoader::DoImageProperties(const char * FileDataPtr, unsigned int File // ----------------------------------------------------------------------------- -bool BS_PNGLoader::ImageProperties(const char* FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS & ColorFormat, int & Width, int & Height) -{ +bool BS_PNGLoader::ImageProperties(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height) { return DoImageProperties(FileDataPtr, FileSize, ColorFormat, Width, Height); } @@ -390,18 +365,16 @@ bool BS_PNGLoader::ImageProperties(const char* FileDataPtr, unsigned int FileSiz // Header überprüfen // ----------------------------------------------------------------------------- -bool BS_PNGLoader::DoIsCorrectImageFormat(const char * FileDataPtr, unsigned int FileSize) -{ +bool BS_PNGLoader::DoIsCorrectImageFormat(const char *FileDataPtr, unsigned int FileSize) { if (FileSize > 8) - return png_check_sig((unsigned char*)FileDataPtr, 8) ? true : false; + return png_check_sig((unsigned char *)FileDataPtr, 8) ? true : false; else return false; } // ----------------------------------------------------------------------------- -bool BS_PNGLoader::IsCorrectImageFormat(const char* FileDataPtr, unsigned int FileSize) -{ +bool BS_PNGLoader::IsCorrectImageFormat(const char *FileDataPtr, unsigned int FileSize) { return DoIsCorrectImageFormat(FileDataPtr, FileSize); } diff --git a/engines/sword25/gfx/image/pngloader.h b/engines/sword25/gfx/image/pngloader.h index a4ce28fbe5..85d12a7a94 100644 --- a/engines/sword25/gfx/image/pngloader.h +++ b/engines/sword25/gfx/image/pngloader.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -33,11 +33,11 @@ */ /* - BS_PNGLoader - ------------ - BS_ImageLoader-Klasse zum Laden von PNG-Dateien + BS_PNGLoader + ------------ + BS_ImageLoader-Klasse zum Laden von PNG-Dateien - Autor: Malte Thiesen + Autor: Malte Thiesen */ #ifndef SWORD25_PNGLOADER2_H @@ -50,32 +50,30 @@ namespace Sword25 { // Klassendefinition -class BS_PNGLoader : public BS_ImageLoader -{ +class BS_PNGLoader : public BS_ImageLoader { public: - static BS_ImageLoader* CreateInstance() - { - #include "sword25/kernel/memlog_off.h" - return (BS_ImageLoader*) new BS_PNGLoader(); - #include "sword25/kernel/memlog_on.h" + static BS_ImageLoader *CreateInstance() { +#include "sword25/kernel/memlog_off.h" + return (BS_ImageLoader *) new BS_PNGLoader(); +#include "sword25/kernel/memlog_on.h" } // Alle virtuellen Methoden von BS_ImageLoader sind hier als static-Methode implementiert, damit sie von BS_B25SLoader aufgerufen werden können. // Die virtuellen Methoden rufen diese Methoden auf. - static bool DoIsCorrectImageFormat(const char * FileDataPtr, unsigned int FileSize); - static bool DoDecodeImage(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, - int & Width, int & Height, int & Pitch); - static bool DoImageProperties(const char * FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS & ColorFormat, int & Width, int & Height); + static bool DoIsCorrectImageFormat(const char *FileDataPtr, unsigned int FileSize); + static bool DoDecodeImage(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS ColorFormat, char * & UncompressedDataPtr, + int &Width, int &Height, int &Pitch); + static bool DoImageProperties(const char *FileDataPtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height); protected: BS_PNGLoader(); - bool DecodeImage(const char * pFileData, unsigned int FileSize, - BS_GraphicEngine::COLOR_FORMATS ColorFormat, - char * & pUncompressedData, - int & Width, int & Height, - int & Pitch); - bool IsCorrectImageFormat(const char * FileDataPtr, unsigned int FileSize); - bool ImageProperties(const char * FileDatePtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS & ColorFormat, int & Width, int & Height); + bool DecodeImage(const char *pFileData, unsigned int FileSize, + BS_GraphicEngine::COLOR_FORMATS ColorFormat, + char * & pUncompressedData, + int &Width, int &Height, + int &Pitch); + bool IsCorrectImageFormat(const char *FileDataPtr, unsigned int FileSize); + bool ImageProperties(const char *FileDatePtr, unsigned int FileSize, BS_GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height); }; } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/vectorimage.cpp b/engines/sword25/gfx/image/vectorimage.cpp index 5c7a5231a8..a8c84ee6b3 100644 --- a/engines/sword25/gfx/image/vectorimage.cpp +++ b/engines/sword25/gfx/image/vectorimage.cpp @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -68,111 +68,94 @@ typedef int16_t s32; // Diese Klasse ist speziell dafür ausgestattet. // ----------------------------------------------------------------------------- -class BS_VectorImage::SWFBitStream -{ +class BS_VectorImage::SWFBitStream { public: - SWFBitStream(const unsigned char * pData, unsigned int DataSize) : - m_Pos(pData), m_End(pData + DataSize), m_WordMask(0) - {} - - inline u32 GetBits(unsigned int BitCount) - { - if (BitCount == 0 || BitCount > 32) - { - throw(runtime_error("SWFBitStream::GetBits() must read at least 1 and at most 32 bits at a time")); - } - - u32 value = 0; - while (BitCount) - { - if (m_WordMask == 0) FlushByte(); - - value <<= 1; - value |= ((m_Word & m_WordMask) != 0) ? 1 : 0; - m_WordMask >>= 1; - - --BitCount; - } - - return value; - } - - inline s32 GetSignedBits(unsigned int BitCount) - { - // Bits einlesen - u32 Temp = GetBits(BitCount); - - // Falls das Sign-Bit gesetzt ist, den Rest des Rückgabewertes mit 1-Bits auffüllen (Sign Extension) - if (Temp & 1 << (BitCount - 1)) - return (0xffffffff << BitCount) | Temp; - else - return Temp; - } - - inline u32 GetU32() - { - u32 Byte1 = GetU8(); - u32 Byte2 = GetU8(); - u32 Byte3 = GetU8(); - u32 Byte4 = GetU8(); - - return Byte1 | (Byte2 << 8) | (Byte3 << 16) | (Byte4 << 24); - } - - inline u16 GetU16() - { - u32 Byte1 = GetU8(); - u32 Byte2 = GetU8(); - - return Byte1 | (Byte2 << 8); - } - - inline u8 GetU8() - { - FlushByte(); - u8 Value = m_Word; - m_WordMask = 0; - FlushByte(); - - return Value; - } - - inline void FlushByte() - { - if (m_WordMask != 128) - { - if (m_Pos >= m_End) - { - throw(runtime_error("Attempted to read past end of file")); - } - else - { - m_Word = *m_Pos++; - m_WordMask = 128; - } - } - } - - inline void SkipBytes(unsigned int SkipLength) - { - FlushByte(); - if (m_Pos + SkipLength >= m_End) - { - throw(runtime_error("Attempted to read past end of file")); - } - else - { - m_Pos += SkipLength; - m_Word = *(m_Pos - 1); - } - } + SWFBitStream(const unsigned char *pData, unsigned int DataSize) : + m_Pos(pData), m_End(pData + DataSize), m_WordMask(0) + {} + + inline u32 GetBits(unsigned int BitCount) { + if (BitCount == 0 || BitCount > 32) { + throw(runtime_error("SWFBitStream::GetBits() must read at least 1 and at most 32 bits at a time")); + } + + u32 value = 0; + while (BitCount) { + if (m_WordMask == 0) FlushByte(); + + value <<= 1; + value |= ((m_Word & m_WordMask) != 0) ? 1 : 0; + m_WordMask >>= 1; + + --BitCount; + } + + return value; + } + + inline s32 GetSignedBits(unsigned int BitCount) { + // Bits einlesen + u32 Temp = GetBits(BitCount); + + // Falls das Sign-Bit gesetzt ist, den Rest des Rückgabewertes mit 1-Bits auffüllen (Sign Extension) + if (Temp & 1 << (BitCount - 1)) + return (0xffffffff << BitCount) | Temp; + else + return Temp; + } + + inline u32 GetU32() { + u32 Byte1 = GetU8(); + u32 Byte2 = GetU8(); + u32 Byte3 = GetU8(); + u32 Byte4 = GetU8(); + + return Byte1 | (Byte2 << 8) | (Byte3 << 16) | (Byte4 << 24); + } + + inline u16 GetU16() { + u32 Byte1 = GetU8(); + u32 Byte2 = GetU8(); + + return Byte1 | (Byte2 << 8); + } + + inline u8 GetU8() { + FlushByte(); + u8 Value = m_Word; + m_WordMask = 0; + FlushByte(); + + return Value; + } + + inline void FlushByte() { + if (m_WordMask != 128) { + if (m_Pos >= m_End) { + throw(runtime_error("Attempted to read past end of file")); + } else { + m_Word = *m_Pos++; + m_WordMask = 128; + } + } + } + + inline void SkipBytes(unsigned int SkipLength) { + FlushByte(); + if (m_Pos + SkipLength >= m_End) { + throw(runtime_error("Attempted to read past end of file")); + } else { + m_Pos += SkipLength; + m_Word = *(m_Pos - 1); + } + } private: - const unsigned char * m_Pos; - const unsigned char * m_End; + const unsigned char *m_Pos; + const unsigned char *m_End; - u8 m_Word; - unsigned int m_WordMask; + u8 m_Word; + unsigned int m_WordMask; }; @@ -180,69 +163,66 @@ private: // Konstanten und Hilfsfunktionen // ----------------------------------------------------------------------------- -namespace -{ - // ----------------------------------------------------------------------------- - // Konstanten - // ----------------------------------------------------------------------------- +namespace { +// ----------------------------------------------------------------------------- +// Konstanten +// ----------------------------------------------------------------------------- - const u32 MAX_ACCEPTED_FLASH_VERSION = 3; // Die höchste Flash-Dateiversion, die vom Lader akzeptiert wird +const u32 MAX_ACCEPTED_FLASH_VERSION = 3; // Die höchste Flash-Dateiversion, die vom Lader akzeptiert wird - // ----------------------------------------------------------------------------- - // Konvertiert SWF-Rechteckdaten in einem Bitstrom in BS_Rect-Objekte - // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Konvertiert SWF-Rechteckdaten in einem Bitstrom in BS_Rect-Objekte +// ----------------------------------------------------------------------------- - BS_Rect FlashRectToBSRect(BS_VectorImage::SWFBitStream & bs) - { - bs.FlushByte(); +BS_Rect FlashRectToBSRect(BS_VectorImage::SWFBitStream &bs) { + bs.FlushByte(); - // Feststellen mit wie vielen Bits die einzelnen Komponenten kodiert sind - u32 BitsPerValue = bs.GetBits(5); + // Feststellen mit wie vielen Bits die einzelnen Komponenten kodiert sind + u32 BitsPerValue = bs.GetBits(5); - // Die einzelnen Komponenten einlesen - s32 XMin = bs.GetSignedBits(BitsPerValue); - s32 XMax = bs.GetSignedBits(BitsPerValue); - s32 YMin = bs.GetSignedBits(BitsPerValue); - s32 YMax = bs.GetSignedBits(BitsPerValue); + // Die einzelnen Komponenten einlesen + s32 XMin = bs.GetSignedBits(BitsPerValue); + s32 XMax = bs.GetSignedBits(BitsPerValue); + s32 YMin = bs.GetSignedBits(BitsPerValue); + s32 YMax = bs.GetSignedBits(BitsPerValue); - return BS_Rect(XMin, YMin, XMax + 1, YMax + 1); - } + return BS_Rect(XMin, YMin, XMax + 1, YMax + 1); +} - // ----------------------------------------------------------------------------- - // Konvertiert SWF-Farben in AntiGrain Farben - // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Konvertiert SWF-Farben in AntiGrain Farben +// ----------------------------------------------------------------------------- - agg::rgba8 FlashColorToAGGRGBA8(unsigned int FlashColor) - { - agg::rgba8 ResultColor((FlashColor >> 16) & 0xff, (FlashColor >> 8) & 0xff, FlashColor & 0xff, FlashColor >> 24); - ResultColor.premultiply(); - return ResultColor; - } +agg::rgba8 FlashColorToAGGRGBA8(unsigned int FlashColor) { + agg::rgba8 ResultColor((FlashColor >> 16) & 0xff, (FlashColor >> 8) & 0xff, FlashColor & 0xff, FlashColor >> 24); + ResultColor.premultiply(); + return ResultColor; +} - // ----------------------------------------------------------------------------- - // Berechnet die Bounding-Box eines BS_VectorImageElement - // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Berechnet die Bounding-Box eines BS_VectorImageElement +// ----------------------------------------------------------------------------- + +struct CBBGetId { + CBBGetId(const BS_VectorImageElement &VectorImageElement_) : VectorImageElement(VectorImageElement_) {} + unsigned operator [](unsigned i) const { + return VectorImageElement.GetPathInfo(i).GetID(); + } + const BS_VectorImageElement &VectorImageElement; +}; - struct CBBGetId - { - CBBGetId(const BS_VectorImageElement & VectorImageElement_) : VectorImageElement(VectorImageElement_) {} - unsigned operator [] (unsigned i) const { return VectorImageElement.GetPathInfo(i).GetID(); } - const BS_VectorImageElement & VectorImageElement; - }; +BS_Rect CalculateBoundingBox(const BS_VectorImageElement &VectorImageElement) { + agg::path_storage Path = VectorImageElement.GetPaths(); + CBBGetId IdSource(VectorImageElement); - BS_Rect CalculateBoundingBox(const BS_VectorImageElement & VectorImageElement) - { - agg::path_storage Path = VectorImageElement.GetPaths(); - CBBGetId IdSource(VectorImageElement); + double x1, x2, y1, y2; + agg::bounding_rect(Path, IdSource, 0, VectorImageElement.GetPathCount(), &x1, &y1, &x2, &y2); - double x1, x2, y1, y2; - agg::bounding_rect(Path, IdSource, 0, VectorImageElement.GetPathCount(), &x1, &y1, &x2, &y2); - - return BS_Rect(static_cast<int>(x1), static_cast<int>(y1), static_cast<int>(x2) + 1, static_cast<int>(y2) + 1); - } + return BS_Rect(static_cast<int>(x1), static_cast<int>(y1), static_cast<int>(x2) + 1, static_cast<int>(y2) + 1); +} } @@ -250,41 +230,36 @@ namespace // Konstruktion // ----------------------------------------------------------------------------- -BS_VectorImage::BS_VectorImage(const unsigned char * pFileData, unsigned int FileSize, bool & Success) -{ +BS_VectorImage::BS_VectorImage(const unsigned char *pFileData, unsigned int FileSize, bool &Success) { Success = false; // Bitstream-Objekt erzeugen // Im Folgenden werden die Dateidaten aus diesem ausgelesen. SWFBitStream bs(pFileData, FileSize); - try - { + try { // SWF-Signatur überprüfen u32 Signature[3]; Signature[0] = bs.GetU8(); Signature[1] = bs.GetU8(); Signature[2] = bs.GetU8(); if (Signature[0] != 'F' || - Signature[1] != 'W' || - Signature[2] != 'S') - { + Signature[1] != 'W' || + Signature[2] != 'S') { BS_LOG_ERRORLN("File is not a valid SWF-file"); return; } // Versionsangabe überprüfen u32 Version = bs.GetU8(); - if (Version > MAX_ACCEPTED_FLASH_VERSION) - { + if (Version > MAX_ACCEPTED_FLASH_VERSION) { BS_LOG_ERRORLN("File is of version %d. Highest accepted version is %d.", Version, MAX_ACCEPTED_FLASH_VERSION); return; } // Dateigröße auslesen und mit der tatsächlichen Größe vergleichen u32 StoredFileSize = bs.GetU32(); - if (StoredFileSize != FileSize) - { + if (StoredFileSize != FileSize) { BS_LOG_ERRORLN("File is not a valid SWF-file"); return; } @@ -299,8 +274,7 @@ BS_VectorImage::BS_VectorImage(const unsigned char * pFileData, unsigned int Fil // Tags parsen // Da wir uns nur für das erste DefineShape-Tag interessieren bool KeepParsing = true; - while (KeepParsing) - { + while (KeepParsing) { // Tags beginnen immer an Bytegrenzen bs.FlushByte(); @@ -310,8 +284,7 @@ BS_VectorImage::BS_VectorImage(const unsigned char * pFileData, unsigned int Fil u32 TagLength = TagTypeAndLength & 0x3f; if (TagLength == 0x3f) TagLength = bs.GetU32(); - switch (TagType) - { + switch (TagType) { case 2: // DefineShape Success = ParseDefineShape(2, bs); @@ -330,8 +303,7 @@ BS_VectorImage::BS_VectorImage(const unsigned char * pFileData, unsigned int Fil } } - catch (runtime_error & e) - { + catch (runtime_error &e) { // Fehler loggen und Funktion verlassen // Success ist somit "false" und signalisiert dem Programmierer, dass die Konstruktion fehlgeschlagen ist. BS_LOG_ERRORLN("The following exception occured while parsing a SWF-file: %s", e.what()); @@ -345,8 +317,7 @@ BS_VectorImage::BS_VectorImage(const unsigned char * pFileData, unsigned int Fil // ----------------------------------------------------------------------------- -bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) -{ +bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream &bs) { u32 ShapeID = bs.GetU16(); // Bounding Box auslesen @@ -368,13 +339,11 @@ bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) // ------------------ bool EndOfShapeDiscovered = false; - while (!EndOfShapeDiscovered) - { + while (!EndOfShapeDiscovered) { u32 TypeFlag = bs.GetBits(1); // Non-Edge Record - if (TypeFlag == 0) - { + if (TypeFlag == 0) { // Feststellen welche Parameter gesetzt werden u32 StateNewStyles = bs.GetBits(1); u32 StateLineStyle = bs.GetBits(1); @@ -386,43 +355,37 @@ bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) if (!StateNewStyles && !StateLineStyle && !StateFillStyle0 && !StateFillStyle1 && !StateMoveTo) EndOfShapeDiscovered = true; // Parameter dekodieren - else - { + else { s32 MoveDeltaX = 0; s32 MoveDeltaY = 0; - if (StateMoveTo) - { + if (StateMoveTo) { u32 MoveToBits = bs.GetBits(5); MoveDeltaX = bs.GetSignedBits(MoveToBits); MoveDeltaY = bs.GetSignedBits(MoveToBits); } - if (StateFillStyle0) - { + if (StateFillStyle0) { if (NumFillBits > 0) FillStyle0 = bs.GetBits(NumFillBits); else FillStyle0 = 0; } - if (StateFillStyle1) - { + if (StateFillStyle1) { if (NumFillBits > 0) FillStyle1 = bs.GetBits(NumFillBits); else FillStyle1 = 0; } - if (StateLineStyle) - { + if (StateLineStyle) { if (NumLineBits) LineStyle = bs.GetBits(NumLineBits); else NumLineBits = 0; } - if (StateNewStyles) - { + if (StateNewStyles) { // An dieser Stelle werden in Flash die alten Style-Definitionen verworfen und mit den neuen überschrieben. // Es wird ein neues Element begonnen. m_Elements.resize(m_Elements.size() + 1); @@ -430,8 +393,7 @@ bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) } // Ein neuen Pfad erzeugen, es sei denn, es wurden nur neue Styles definiert - if (StateLineStyle || StateFillStyle0 || StateFillStyle1 || StateMoveTo) - { + if (StateLineStyle || StateFillStyle0 || StateFillStyle1 || StateMoveTo) { // Letzte Zeichenposition merken, beim Aufruf von start_new_path() wird die Zeichenpostionen auf 0, 0 zurückgesetzt double LastX = m_Elements.back().m_Paths.last_x(); double LastY = m_Elements.back().m_Paths.last_y(); @@ -449,14 +411,12 @@ bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) } } // Edge Record - else - { + else { u32 EdgeFlag = bs.GetBits(1); u32 NumBits = bs.GetBits(4) + 2; // Curved edge - if (EdgeFlag == 0) - { + if (EdgeFlag == 0) { s32 ControlDeltaX = bs.GetSignedBits(NumBits); s32 ControlDeltaY = bs.GetSignedBits(NumBits); s32 AnchorDeltaX = bs.GetSignedBits(NumBits); @@ -469,19 +429,15 @@ bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) m_Elements.back().m_Paths.curve3(ControlX, ControlY, AnchorX, AnchorY); } // Staight edge - else - { + else { s32 DeltaX = 0; s32 DeltaY = 0; u32 GeneralLineFlag = bs.GetBits(1); - if (GeneralLineFlag) - { + if (GeneralLineFlag) { DeltaX = bs.GetSignedBits(NumBits); DeltaY = bs.GetSignedBits(NumBits); - } - else - { + } else { u32 VertLineFlag = bs.GetBits(1); if (VertLineFlag) DeltaY = bs.GetSignedBits(NumBits); @@ -504,8 +460,7 @@ bool BS_VectorImage::ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs) // ----------------------------------------------------------------------------- -bool BS_VectorImage::ParseStyles(unsigned int ShapeType, SWFBitStream & bs, unsigned int & NumFillBits, unsigned int & NumLineBits) -{ +bool BS_VectorImage::ParseStyles(unsigned int ShapeType, SWFBitStream &bs, unsigned int &NumFillBits, unsigned int &NumLineBits) { bs.FlushByte(); // Fillstyles parsen @@ -518,15 +473,12 @@ bool BS_VectorImage::ParseStyles(unsigned int ShapeType, SWFBitStream & bs, unsi // Alle Fillstyles einlesen, falls ein Fillstyle mit Typ != 0 gefunden wird, wird das Parsen abgebrochen. // Es wird nur "solid fill" (Typ 0) unterstützt. m_Elements.back().m_FillStyles.reserve(FillStyleCount); - for (unsigned int i = 0; i < FillStyleCount; ++i) - { + for (unsigned int i = 0; i < FillStyleCount; ++i) { u8 Type = bs.GetU8(); u32 Color; - if (ShapeType == 3) - { + if (ShapeType == 3) { Color = (bs.GetU8() << 16) | (bs.GetU8() << 8) | bs.GetU8() | (bs.GetU8() << 24); - } - else + } else Color = bs.GetBits(24) | (0xff << 24); if (Type != 0) return false; @@ -542,8 +494,7 @@ bool BS_VectorImage::ParseStyles(unsigned int ShapeType, SWFBitStream & bs, unsi // Alle Linestyles einlesen m_Elements.back().m_LineStyles.reserve(LineStyleCount); - for (unsigned int i = 0; i < LineStyleCount; ++i) - { + for (unsigned int i = 0; i < LineStyleCount; ++i) { double Width = bs.GetU16(); u32 Color; if (ShapeType == 3) @@ -564,8 +515,7 @@ bool BS_VectorImage::ParseStyles(unsigned int ShapeType, SWFBitStream & bs, unsi // ----------------------------------------------------------------------------- -bool BS_VectorImage::Fill(const BS_Rect* pFillRect, unsigned int Color) -{ +bool BS_VectorImage::Fill(const BS_Rect *pFillRect, unsigned int Color) { BS_LOG_ERRORLN("Fill() is not supported."); return false; } @@ -573,16 +523,14 @@ bool BS_VectorImage::Fill(const BS_Rect* pFillRect, unsigned int Color) // ----------------------------------------------------------------------------- -unsigned int BS_VectorImage::GetPixel(int X, int Y) -{ +unsigned int BS_VectorImage::GetPixel(int X, int Y) { BS_LOG_ERRORLN("GetPixel() is not supported. Returning black."); return 0; } // ----------------------------------------------------------------------------- -bool BS_VectorImage::SetContent(const byte *Pixeldata, unsigned int Offset, unsigned int Stride) -{ +bool BS_VectorImage::SetContent(const byte *Pixeldata, unsigned int Offset, unsigned int Stride) { BS_LOG_ERRORLN("SetContent() is not supported."); return 0; } diff --git a/engines/sword25/gfx/image/vectorimage.h b/engines/sword25/gfx/image/vectorimage.h index 85685121f2..f791a36f03 100644 --- a/engines/sword25/gfx/image/vectorimage.h +++ b/engines/sword25/gfx/image/vectorimage.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -53,22 +53,29 @@ namespace Sword25 { class BS_VectorImage; /** - @brief Pfadinformationen zu BS_VectorImageElement Objekten + @brief Pfadinformationen zu BS_VectorImageElement Objekten - Jedes BS_VectorImageElement besteht aus Kantenzügen, oder auch Pfaden. Jeder dieser Pfad hat Eigenschaften, die in Objekten diesen Typs - gespeichert werden. + Jedes BS_VectorImageElement besteht aus Kantenzügen, oder auch Pfaden. Jeder dieser Pfad hat Eigenschaften, die in Objekten diesen Typs + gespeichert werden. */ -class BS_VectorPathInfo -{ +class BS_VectorPathInfo { public: BS_VectorPathInfo(unsigned int ID, unsigned int LineStyle, unsigned int FillStyle0, unsigned int FillStyle1) : - m_ID(ID), m_LineStyle(LineStyle), m_FillStyle0(FillStyle0), m_FillStyle1(FillStyle1) {}; + m_ID(ID), m_LineStyle(LineStyle), m_FillStyle0(FillStyle0), m_FillStyle1(FillStyle1) {}; - unsigned int GetID() const { return m_ID; } - unsigned int GetLineStyle() const { return m_LineStyle; } - unsigned int GetFillStyle0() const { return m_FillStyle0; } - unsigned int GetFillStyle1() const { return m_FillStyle1; } + unsigned int GetID() const { + return m_ID; + } + unsigned int GetLineStyle() const { + return m_LineStyle; + } + unsigned int GetFillStyle0() const { + return m_FillStyle0; + } + unsigned int GetFillStyle1() const { + return m_FillStyle1; + } private: unsigned int m_ID; @@ -79,106 +86,136 @@ private: /** - @brief Ein Element eines Vektorbild. Ein BS_VectorImage besteht aus diesen Elementen, die jeweils einen Teil der Graphik definieren. - Werden alle Elemente eines Vektorbildes übereinandergelegt, ergibt sich das komplette Bild. + @brief Ein Element eines Vektorbild. Ein BS_VectorImage besteht aus diesen Elementen, die jeweils einen Teil der Graphik definieren. + Werden alle Elemente eines Vektorbildes übereinandergelegt, ergibt sich das komplette Bild. */ -class BS_VectorImageElement -{ -friend BS_VectorImage; +class BS_VectorImageElement { + friend BS_VectorImage; public: - const agg::path_storage & GetPaths() const { return m_Paths; } - unsigned int GetPathCount() const { return m_PathInfos.size(); } - const BS_VectorPathInfo & GetPathInfo(unsigned int PathNr) const { BS_ASSERT(PathNr < GetPathCount()); return m_PathInfos[PathNr]; } + const agg::path_storage &GetPaths() const { + return m_Paths; + } + unsigned int GetPathCount() const { + return m_PathInfos.size(); + } + const BS_VectorPathInfo &GetPathInfo(unsigned int PathNr) const { + BS_ASSERT(PathNr < GetPathCount()); + return m_PathInfos[PathNr]; + } - double GetLineStyleWidth(unsigned int LineStyle) const - { + double GetLineStyleWidth(unsigned int LineStyle) const { BS_ASSERT(LineStyle < m_LineStyles.size()); return m_LineStyles[LineStyle].Width; } - unsigned int GetLineStyleCount() const { return m_LineStyles.size(); } + unsigned int GetLineStyleCount() const { + return m_LineStyles.size(); + } - const agg::rgba8 & GetLineStyleColor(unsigned int LineStyle) const - { + const agg::rgba8 &GetLineStyleColor(unsigned int LineStyle) const { BS_ASSERT(LineStyle < m_LineStyles.size()); return m_LineStyles[LineStyle].Color; } - unsigned int GetFillStyleCount() const { return m_FillStyles.size(); } + unsigned int GetFillStyleCount() const { + return m_FillStyles.size(); + } - const agg::rgba8 & GetFillStyleColor(unsigned int FillStyle) const - { + const agg::rgba8 &GetFillStyleColor(unsigned int FillStyle) const { BS_ASSERT(FillStyle < m_FillStyles.size()); return m_FillStyles[FillStyle]; } - const BS_Rect & GetBoundingBox() const { return m_BoundingBox; } + const BS_Rect &GetBoundingBox() const { + return m_BoundingBox; + } private: - struct LineStyleType - { - LineStyleType(double Width_, const agg::rgba8 & Color_) : Width(Width_), Color(Color_) {}; - double Width; - agg::rgba8 Color; + struct LineStyleType { + LineStyleType(double Width_, const agg::rgba8 &Color_) : Width(Width_), Color(Color_) {}; + double Width; + agg::rgba8 Color; }; - agg::path_storage m_Paths; - Common::Array<BS_VectorPathInfo> m_PathInfos; - Common::Array<LineStyleType> m_LineStyles; - Common::Array<agg::rgba8> m_FillStyles; - BS_Rect m_BoundingBox; + agg::path_storage m_Paths; + Common::Array<BS_VectorPathInfo> m_PathInfos; + Common::Array<LineStyleType> m_LineStyles; + Common::Array<agg::rgba8> m_FillStyles; + BS_Rect m_BoundingBox; }; /** - @brief Eine Vektorgraphik + @brief Eine Vektorgraphik - Objekte dieser Klasse enthalten die Informationen eines SWF-Shapes. + Objekte dieser Klasse enthalten die Informationen eines SWF-Shapes. */ -class BS_VectorImage : public BS_Image -{ +class BS_VectorImage : public BS_Image { public: - BS_VectorImage(const unsigned char * pFileData, unsigned int FileSize, bool & Success); + BS_VectorImage(const unsigned char *pFileData, unsigned int FileSize, bool &Success); - unsigned int GetElementCount() const { return m_Elements.size(); } - const BS_VectorImageElement & GetElement(unsigned int ElementNr) const - { + unsigned int GetElementCount() const { + return m_Elements.size(); + } + const BS_VectorImageElement &GetElement(unsigned int ElementNr) const { BS_ASSERT(ElementNr < m_Elements.size()); return m_Elements[ElementNr]; } - const BS_Rect & GetBoundingBox() const { return m_BoundingBox; } + const BS_Rect &GetBoundingBox() const { + return m_BoundingBox; + } // // Die abstrakten Methoden von BS_Image // - virtual int GetWidth() const { return m_BoundingBox.GetWidth(); } - virtual int GetHeight() const { return m_BoundingBox.GetHeight(); } - virtual BS_GraphicEngine::COLOR_FORMATS GetColorFormat() const { return BS_GraphicEngine::CF_ARGB32; } - virtual bool Fill(const BS_Rect* pFillRect = 0, unsigned int Color = BS_RGB(0, 0, 0)); + virtual int GetWidth() const { + return m_BoundingBox.GetWidth(); + } + virtual int GetHeight() const { + return m_BoundingBox.GetHeight(); + } + virtual BS_GraphicEngine::COLOR_FORMATS GetColorFormat() const { + return BS_GraphicEngine::CF_ARGB32; + } + virtual bool Fill(const BS_Rect *pFillRect = 0, unsigned int Color = BS_RGB(0, 0, 0)); virtual unsigned int GetPixel(int X, int Y); - virtual bool IsBlitSource() const { return true; } - virtual bool IsBlitTarget() const { return false; } - virtual bool IsScalingAllowed() const { return true; } - virtual bool IsFillingAllowed() const { return false; } - virtual bool IsAlphaAllowed() const { return true; } - virtual bool IsColorModulationAllowed() const { return true; } - virtual bool IsSetContentAllowed() const { return false; } + virtual bool IsBlitSource() const { + return true; + } + virtual bool IsBlitTarget() const { + return false; + } + virtual bool IsScalingAllowed() const { + return true; + } + virtual bool IsFillingAllowed() const { + return false; + } + virtual bool IsAlphaAllowed() const { + return true; + } + virtual bool IsColorModulationAllowed() const { + return true; + } + virtual bool IsSetContentAllowed() const { + return false; + } virtual bool SetContent(const byte *Pixeldata, unsigned int Offset, unsigned int Stride); virtual bool Blit(int PosX = 0, int PosY = 0, - int Flipping = FLIP_NONE, - BS_Rect* pPartRect = NULL, - unsigned int Color = BS_ARGB(255, 255, 255, 255), - int Width = -1, int Height = -1); + int Flipping = FLIP_NONE, + BS_Rect *pPartRect = NULL, + unsigned int Color = BS_ARGB(255, 255, 255, 255), + int Width = -1, int Height = -1); class SWFBitStream; private: - bool ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs); - bool ParseStyles(unsigned int ShapeType, SWFBitStream & bs, unsigned int & NumFillBits, unsigned int & NumLineBits); + bool ParseDefineShape(unsigned int ShapeType, SWFBitStream &bs); + bool ParseStyles(unsigned int ShapeType, SWFBitStream &bs, unsigned int &NumFillBits, unsigned int &NumLineBits); - Common::Array<BS_VectorImageElement> m_Elements; - BS_Rect m_BoundingBox; + Common::Array<BS_VectorImageElement> m_Elements; + BS_Rect m_BoundingBox; }; } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/vectorimagerenderer.cpp b/engines/sword25/gfx/image/vectorimagerenderer.cpp index fa776578e3..0c7f93c130 100644 --- a/engines/sword25/gfx/image/vectorimagerenderer.cpp +++ b/engines/sword25/gfx/image/vectorimagerenderer.cpp @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -49,10 +49,9 @@ namespace Sword25 { // CompoundShape // ----------------------------------------------------------------------------- -class CompoundShape -{ +class CompoundShape { public: - CompoundShape(const BS_VectorImageElement & VectorImageElement) : + CompoundShape(const BS_VectorImageElement &VectorImageElement) : m_ImageElement(VectorImageElement), m_Path(VectorImageElement.GetPaths()), m_Affine(), @@ -60,29 +59,28 @@ public: m_Trans(m_Curve, m_Affine) {} - unsigned operator [] (unsigned i) const - { + unsigned operator [](unsigned i) const { return m_ImageElement.GetPathInfo(i).GetID(); } - unsigned paths() const { return m_ImageElement.GetPathCount(); } + unsigned paths() const { + return m_ImageElement.GetPathCount(); + } - void rewind(unsigned path_id) - { + void rewind(unsigned path_id) { m_Trans.rewind(path_id); } - unsigned vertex(double* x, double* y) - { + unsigned vertex(double *x, double *y) { return m_Trans.vertex(x, y); } private: - const BS_VectorImageElement & m_ImageElement; - agg::path_storage m_Path; - agg::trans_affine m_Affine; - agg::conv_curve<agg::path_storage> m_Curve; - agg::conv_transform< agg::conv_curve<agg::path_storage> > m_Trans; + const BS_VectorImageElement &m_ImageElement; + agg::path_storage m_Path; + agg::trans_affine m_Affine; + agg::conv_curve<agg::path_storage> m_Curve; + agg::conv_transform< agg::conv_curve<agg::path_storage> > m_Trans; }; @@ -90,29 +88,25 @@ private: // StyleHandler // ----------------------------------------------------------------------------- -class StyleHandler -{ +class StyleHandler { public: - StyleHandler(const BS_VectorImageElement & VectorImageElement) : m_ImageElement(VectorImageElement) {} + StyleHandler(const BS_VectorImageElement &VectorImageElement) : m_ImageElement(VectorImageElement) {} - bool is_solid(unsigned int style) const - { + bool is_solid(unsigned int style) const { return true; } - const agg::rgba8 & color(unsigned style) const - { + const agg::rgba8 &color(unsigned style) const { return m_ImageElement.GetFillStyleColor(style); } - void generate_span(agg::rgba8 * span, int x, int y, unsigned len, unsigned style) - { + void generate_span(agg::rgba8 *span, int x, int y, unsigned len, unsigned style) { // Wird nicht benutzt return; } private: - const BS_VectorImageElement & m_ImageElement; + const BS_VectorImageElement &m_ImageElement; }; @@ -121,21 +115,19 @@ private: // ----------------------------------------------------------------------------- BS_VectorImageRenderer::BS_VectorImageRenderer() : - PixelFormat(rbuf) -{ + PixelFormat(rbuf) { } // ----------------------------------------------------------------------------- -bool BS_VectorImageRenderer::Render(const BS_VectorImage & VectorImage, - float ScaleFactorX, float ScaleFactorY, - unsigned int & Width, unsigned int & Height, - Common::Array<char> & ImageData, - float LineScaleFactor, - bool NoAlphaShapes) -{ +bool BS_VectorImageRenderer::Render(const BS_VectorImage &VectorImage, + float ScaleFactorX, float ScaleFactorY, + unsigned int &Width, unsigned int &Height, + Common::Array<char> & ImageData, + float LineScaleFactor, + bool NoAlphaShapes) { Width = static_cast<unsigned int>(VectorImage.GetWidth() * ScaleFactorX); Height = static_cast<unsigned int>(VectorImage.GetHeight() * ScaleFactorY); @@ -151,9 +143,8 @@ bool BS_VectorImageRenderer::Render(const BS_VectorImage & VectorImage, Scale = agg::trans_affine_translation(- VectorImage.GetBoundingBox().left, - VectorImage.GetBoundingBox().top); Scale *= agg::trans_affine_scaling(ScaleFactorX, ScaleFactorY); - for (unsigned int element = 0; element < VectorImage.GetElementCount(); ++element) - { - const BS_VectorImageElement & CurImageElement = VectorImage.GetElement(element); + for (unsigned int element = 0; element < VectorImage.GetElementCount(); ++element) { + const BS_VectorImageElement &CurImageElement = VectorImage.GetElement(element); CompoundShape ImageCompoundShape(CurImageElement); StyleHandler ImageStyleHandler(CurImageElement); @@ -164,19 +155,16 @@ bool BS_VectorImageRenderer::Render(const BS_VectorImage & VectorImage, //---------------------- CompoundRasterizer.clip_box(0, 0, Width, Height); CompoundRasterizer.reset(); - for(unsigned int i = 0; i < CurImageElement.GetPathCount(); ++i) - { + for (unsigned int i = 0; i < CurImageElement.GetPathCount(); ++i) { unsigned int FillStyle0 = CurImageElement.GetPathInfo(i).GetFillStyle0(); unsigned int FillStyle1 = CurImageElement.GetPathInfo(i).GetFillStyle1(); - if (NoAlphaShapes) - { + if (NoAlphaShapes) { if (FillStyle0 != 0 && CurImageElement.GetFillStyleColor(FillStyle0 - 1).a != 255) FillStyle0 = 0; if (FillStyle1 != 0 && CurImageElement.GetFillStyleColor(FillStyle1 - 1).a != 255) FillStyle1 = 0; } - if(FillStyle0 != 0 || FillStyle1 != 0) - { + if (FillStyle0 != 0 || FillStyle1 != 0) { CompoundRasterizer.styles(FillStyle0 - 1, FillStyle1 - 1); CompoundRasterizer.add_path(Shape, CurImageElement.GetPathInfo(i).GetID()); } @@ -189,13 +177,11 @@ bool BS_VectorImageRenderer::Render(const BS_VectorImage & VectorImage, Rasterizer.clip_box(0, 0, Width, Height); Stroke.line_join(agg::round_join); Stroke.line_cap(agg::round_cap); - for(unsigned int i = 0; i < CurImageElement.GetPathCount(); ++i) - { + for (unsigned int i = 0; i < CurImageElement.GetPathCount(); ++i) { Rasterizer.reset(); - + unsigned int CurrentLineStyle = CurImageElement.GetPathInfo(i).GetLineStyle(); - if (CurrentLineStyle != 0) - { + if (CurrentLineStyle != 0) { Stroke.width(ScaleFactorX * CurImageElement.GetLineStyleWidth(CurrentLineStyle - 1) * LineScaleFactor); Rasterizer.add_path(Stroke, CurImageElement.GetPathInfo(i).GetID()); ScanlineRenderer.color(CurImageElement.GetLineStyleColor(CurrentLineStyle - 1)); @@ -203,9 +189,9 @@ bool BS_VectorImageRenderer::Render(const BS_VectorImage & VectorImage, // Die SWF-Frames enthalten zum Teil Reste von grünen Linien, die wohl von Bernd als Umriss benutzt wurden. // Damit diese Reste nicht störend auffallen werden grüne Linien schlichtweg ignoriert. if (!(CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).a == 255 && - CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).r == 0 && - CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).g == 255 && - CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).b == 0)) + CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).r == 0 && + CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).g == 255 && + CurImageElement.GetLineStyleColor(CurrentLineStyle - 1).b == 0)) agg::render_scanlines(Rasterizer, Scanline, ScanlineRenderer); } } diff --git a/engines/sword25/gfx/image/vectorimagerenderer.h b/engines/sword25/gfx/image/vectorimagerenderer.h index 2712728b1f..ed073abb56 100644 --- a/engines/sword25/gfx/image/vectorimagerenderer.h +++ b/engines/sword25/gfx/image/vectorimagerenderer.h @@ -23,7 +23,7 @@ * */ -/* +/* * This code is based on Broken Sword 2.5 engine * * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer @@ -58,20 +58,19 @@ class BS_VectorImage; /** - @brief Rendert BS_VectorImage Objekte + @brief Rendert BS_VectorImage Objekte */ -class BS_VectorImageRenderer -{ +class BS_VectorImageRenderer { public: BS_VectorImageRenderer(); - bool Render(const BS_VectorImage & VectorImage, - float ScaleFactorX, float ScaleFactorY, - unsigned int & Width, unsigned int & Height, - Common::Array<char> & ImageData, - float LineScaleFactor = 1.0f, - bool NoAlphaShapes = false); + bool Render(const BS_VectorImage &VectorImage, + float ScaleFactorX, float ScaleFactorY, + unsigned int &Width, unsigned int &Height, + Common::Array<char> & ImageData, + float LineScaleFactor = 1.0f, + bool NoAlphaShapes = false); private: typedef agg::pixfmt_rgba32_pre PixelFormatType; |