aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gui/ThemeEngine.cpp59
-rw-r--r--gui/ThemeEngine.h24
2 files changed, 55 insertions, 28 deletions
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index abc419c428..6ae3524e99 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -33,7 +33,7 @@
#include "graphics/surface.h"
#include "graphics/colormasks.h"
-#include "graphics/imageman.h"
+#include "graphics/imagedec.h"
#include "graphics/cursorman.h"
#include "graphics/VectorRenderer.h"
@@ -72,6 +72,7 @@ ThemeEngine::ThemeEngine(Common::String fileName, GraphicsMode mode) :
_graphicsMode = mode;
_themeFileName = fileName;
+ _themeArchive = 0;
_initOk = false;
}
@@ -81,17 +82,10 @@ ThemeEngine::~ThemeEngine() {
delete _parser;
delete _themeEval;
delete[] _cursor;
-
- for (ImagesMap::iterator i = _bitmaps.begin(); i != _bitmaps.end(); ++i)
- ImageMan.unregisterSurface(i->_key);
-
- ImageMan.removeArchive(_themeFileName);
}
-
-
/**********************************************************
* Rendering mode management
*********************************************************/
@@ -192,10 +186,18 @@ void ThemeEngine::unloadTheme() {
_texts[i] = 0;
}
- for (ImagesMap::iterator i = _bitmaps.begin(); i != _bitmaps.end(); ++i)
- ImageMan.unregisterSurface(i->_key);
-
- ImageMan.removeArchive(_themeFileName);
+ // Release all graphics surfaces
+ for (ImagesMap::iterator i = _bitmaps.begin(); i != _bitmaps.end(); ++i) {
+ Graphics::Surface *surf = i->_value;
+ if (surf) {
+ surf->free();
+ delete surf;
+ }
+ }
+ _bitmaps.clear();
+
+ delete _themeArchive;
+ _themeArchive = 0;
_themeEval->reset();
_themeOk = false;
@@ -387,13 +389,27 @@ bool ThemeEngine::addFont(const Common::String &fontId, const Common::String &fi
}
bool ThemeEngine::addBitmap(const Common::String &filename) {
- if (_bitmaps.contains(filename))
- ImageMan.unregisterSurface(filename);
-
- ImageMan.registerSurface(filename, 0);
- _bitmaps[filename] = ImageMan.getSurface(filename);
+ // Release any existing surface with that name.
+ Graphics::Surface *surf = _bitmaps[filename];
+ if (surf) {
+ surf->free();
+ delete surf;
+ }
+
+ // Now try to load the bitmap via the ImageDecoder class.
+ surf = Graphics::ImageDecoder::loadFile(filename);
+ if (!surf && _themeArchive) {
+ Common::SeekableReadStream *stream = _themeArchive->openFile(filename);
+ if (stream) {
+ surf = Graphics::ImageDecoder::loadFile(*stream);
+ delete stream;
+ }
+ }
- return _bitmaps[filename] != 0;
+ // Store the surface into our hashmap (attention, may store NULL entries!)
+ _bitmaps[filename] = surf;
+
+ return surf != 0;
}
bool ThemeEngine::addDrawData(const Common::String &data, bool cached) {
@@ -423,7 +439,7 @@ bool ThemeEngine::loadTheme(const Common::String &fileName) {
bool tryAgain = false;
if (fileName != "builtin") {
- ImageMan.addArchive(fileName);
+ // Load the archive containing image and XML data
if (!loadThemeXML(fileName)) {
warning("Could not parse custom theme '%s'. Falling back to default theme", fileName.c_str());
tryAgain = true; // Fall back to default builtin theme
@@ -530,11 +546,14 @@ bool ThemeEngine::loadThemeXML(const Common::String &themeName) {
return false;
}
+ _themeArchive = archive;
+
// Loop over all STX files
for (Common::ArchiveMemberList::iterator i = members.begin(); i != members.end(); ++i) {
assert((*i)->getName().hasSuffix(".stx"));
if (_parser->loadStream((*i)->open()) == false) {
+ _themeArchive = 0;
delete archive;
warning("Failed to load STX file '%s'", (*i)->getDisplayName().c_str());
_parser->close();
@@ -542,6 +561,7 @@ bool ThemeEngine::loadThemeXML(const Common::String &themeName) {
}
if (_parser->parse() == false) {
+ _themeArchive = 0;
delete archive;
warning("Failed to parse STX file '%s'", (*i)->getDisplayName().c_str());
_parser->close();
@@ -551,7 +571,6 @@ bool ThemeEngine::loadThemeXML(const Common::String &themeName) {
_parser->close();
}
- delete archive;
assert(!_themeName.empty());
return true;
}
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index 4435848fb3..56a288f9d4 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -135,10 +135,12 @@ protected:
kTextDataMAX
};
- static const struct TextDataInfo {
+ struct TextDataInfo {
TextData id;
const char *name;
- } kTextDataDefaults[];
+ };
+
+ static const TextDataInfo kTextDataDefaults[];
public:
//! Vertical alignment of the text.
@@ -268,9 +270,8 @@ public:
void updateScreen();
- /**
- * FONT MANAGEMENT METHODS
- */
+ /** @name FONT MANAGEMENT METHODS */
+ //@{
TextData fontStyleToData(FontStyle font) const {
if (font == kFontStyleNormal)
@@ -286,10 +287,12 @@ public:
int getCharWidth(byte c, FontStyle font = kFontStyleBold) const;
+ //@}
+
+
+ /** @name WIDGET DRAWING METHODS */
+ //@{
- /**
- * WIDGET DRAWING METHODS
- */
void drawWidgetBackground(const Common::Rect &r, uint16 hints,
WidgetBackground background = kWidgetBackgroundPlain, WidgetStateInfo state = kStateEnabled);
@@ -326,6 +329,10 @@ public:
void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, WidgetStateInfo state = kStateEnabled);
+ //@}
+
+
+
/**
* Actual implementation of a Dirty Rect drawing routine.
* Dirty rectangles are queued on a list and are later merged/calculated
@@ -657,6 +664,7 @@ protected:
Common::String _themeName; //!< Name of the currently loaded theme
Common::String _themeFileName;
+ Common::Archive *_themeArchive;
/** Custom Cursor Management */
void setUpCursor();