[Scummvm-cvs-logs] SF.net SVN: scummvm:[34983] scummvm/trunk

tanoku at users.sourceforge.net tanoku at users.sourceforge.net
Mon Nov 10 12:24:55 CET 2008


Revision: 34983
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34983&view=rev
Author:   tanoku
Date:     2008-11-10 11:24:55 +0000 (Mon, 10 Nov 2008)

Log Message:
-----------
Merged GUI::Theme and Gui::ThemeEngine into the same class, GUI::ThemeEngine.

Massive cleanup.

Modified Paths:
--------------
    scummvm/trunk/engines/dialogs.cpp
    scummvm/trunk/engines/kyra/kyra_lok.cpp
    scummvm/trunk/engines/parallaction/saveload.cpp
    scummvm/trunk/engines/scumm/dialogs.cpp
    scummvm/trunk/engines/sword1/control.cpp
    scummvm/trunk/graphics/VectorRenderer.h
    scummvm/trunk/graphics/VectorRendererSpec.cpp
    scummvm/trunk/graphics/VectorRendererSpec.h
    scummvm/trunk/gui/EditTextWidget.cpp
    scummvm/trunk/gui/ListWidget.cpp
    scummvm/trunk/gui/PopUpWidget.cpp
    scummvm/trunk/gui/ScrollBarWidget.cpp
    scummvm/trunk/gui/ThemeEngine.cpp
    scummvm/trunk/gui/ThemeEngine.h
    scummvm/trunk/gui/ThemeParser.cpp
    scummvm/trunk/gui/about.cpp
    scummvm/trunk/gui/browser.cpp
    scummvm/trunk/gui/console.cpp
    scummvm/trunk/gui/dialog.cpp
    scummvm/trunk/gui/dialog.h
    scummvm/trunk/gui/editable.cpp
    scummvm/trunk/gui/editable.h
    scummvm/trunk/gui/launcher.cpp
    scummvm/trunk/gui/module.mk
    scummvm/trunk/gui/newgui.cpp
    scummvm/trunk/gui/newgui.h
    scummvm/trunk/gui/themebrowser.cpp
    scummvm/trunk/gui/widget.cpp
    scummvm/trunk/gui/widget.h

Added Paths:
-----------
    scummvm/trunk/gui/ThemeData.cpp
    scummvm/trunk/gui/ThemeData.h

Removed Paths:
-------------
    scummvm/trunk/gui/theme.cpp
    scummvm/trunk/gui/theme.h

Modified: scummvm/trunk/engines/dialogs.cpp
===================================================================
--- scummvm/trunk/engines/dialogs.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/engines/dialogs.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -35,7 +35,7 @@
 #include "gui/newgui.h"
 #include "gui/launcher.h"
 #include "gui/ListWidget.h"
-#include "gui/theme.h"
+
 #include "gui/ThemeEval.h"
 
 #include "engines/dialogs.h"
@@ -76,14 +76,14 @@
 
 MainMenuDialog::MainMenuDialog(Engine *engine)
 	: GlobalDialog("GlobalMenu"), _engine(engine) {
-	_backgroundType = GUI::Theme::kDialogBackgroundSpecial;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundSpecial;
 
 #ifndef DISABLE_FANCY_THEMES
 	_logo = 0;
 	if (g_gui.xmlEval()->getVar("Globals.ShowGlobalMenuLogo", 0) == 1 && g_gui.theme()->supportsImages()) {
 		_logo = new GUI::GraphicsWidget(this, "GlobalMenu.Logo");
 		_logo->useThemeTransparency(true);
-		_logo->setGfx(g_gui.theme()->getImageSurface(GUI::Theme::kImageLogoSmall));
+		_logo->setGfx(g_gui.theme()->getImageSurface(GUI::ThemeEngine::kImageLogoSmall));
 	} else {
 		StaticTextWidget *title = new StaticTextWidget(this, "GlobalMenu.Title", "ScummVM");
 		title->setAlign(GUI::kTextAlignCenter);
@@ -217,7 +217,7 @@
 		if (!_logo)
 			_logo = new GUI::GraphicsWidget(this, "GlobalMenu.Logo");
 		_logo->useThemeTransparency(true);
-		_logo->setGfx(g_gui.theme()->getImageSurface(GUI::Theme::kImageLogoSmall));
+		_logo->setGfx(g_gui.theme()->getImageSurface(GUI::ThemeEngine::kImageLogoSmall));
 
 		GUI::StaticTextWidget *title = (StaticTextWidget *)findWidget("GlobalMenu.Title");
 		if (title) {

Modified: scummvm/trunk/engines/kyra/kyra_lok.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_lok.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/engines/kyra/kyra_lok.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -28,6 +28,7 @@
 #include "common/file.h"
 #include "common/system.h"
 #include "common/savefile.h"
+#include "common/config-manager.h"
 
 #include "gui/message.h"
 

Modified: scummvm/trunk/engines/parallaction/saveload.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/saveload.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/engines/parallaction/saveload.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -248,7 +248,7 @@
 	: Dialog("ScummSaveLoad"), _list(0), _chooseButton(0), _gfxWidget(0) {
 
 //	_drawingHints |= GUI::THEME_HINT_SPECIAL_COLOR;
-	_backgroundType = GUI::Theme::kDialogBackgroundSpecial;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundSpecial;
 
 	new GUI::StaticTextWidget(this, "ScummSaveLoad.Title", title);
 

Modified: scummvm/trunk/engines/scumm/dialogs.cpp
===================================================================
--- scummvm/trunk/engines/scumm/dialogs.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/engines/scumm/dialogs.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -36,7 +36,7 @@
 #endif
 
 #include "gui/about.h"
-#include "gui/theme.h"
+
 #include "gui/newgui.h"
 #include "gui/ListWidget.h"
 #include "gui/ThemeEval.h"
@@ -214,7 +214,7 @@
 #pragma mark -
 
 ScummDialog::ScummDialog(String name) : GUI::Dialog(name) {
-	_backgroundType = GUI::Theme::kDialogBackgroundSpecial;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundSpecial;
 }
 
 #pragma mark -
@@ -235,7 +235,7 @@
 SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode, ScummEngine *engine)
 	: Dialog("ScummSaveLoad"), _saveMode(saveMode), _list(0), _chooseButton(0), _gfxWidget(0), _vm(engine) {
 		
-	_backgroundType = GUI::Theme::kDialogBackgroundSpecial;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundSpecial;
 
 	new StaticTextWidget(this, "ScummSaveLoad.Title", title);
 
@@ -637,7 +637,7 @@
 	_title = new StaticTextWidget(this, "ScummHelp.Title", "");
 
 	_page = 1;
-	_backgroundType = GUI::Theme::kDialogBackgroundDefault;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundDefault;
 
 	_numPages = ScummHelp::numPages(_game.id);
 
@@ -851,7 +851,7 @@
 
 void ValueDisplayDialog::drawDialog() {
 	const int labelWidth = _w - 8 - _percentBarWidth;
-	g_gui.theme()->drawDialogBackground(Common::Rect(_x, _y, _x+_w, _y+_h), GUI::Theme::kDialogBackgroundDefault);
+	g_gui.theme()->drawDialogBackground(Common::Rect(_x, _y, _x+_w, _y+_h), GUI::ThemeEngine::kDialogBackgroundDefault);
 	g_gui.theme()->drawText(Common::Rect(_x+4, _y+4, _x+labelWidth+4,
 				_y+g_gui.theme()->getFontHeight()+4), _label);
 	g_gui.theme()->drawSlider(Common::Rect(_x+4+labelWidth, _y+4, _x+_w-4, _y+_h-4),

Modified: scummvm/trunk/engines/sword1/control.cpp
===================================================================
--- scummvm/trunk/engines/sword1/control.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/engines/sword1/control.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -29,6 +29,7 @@
 #include "common/savefile.h"
 #include "common/events.h"
 #include "common/system.h"
+#include "common/config-manager.h"
 
 #include "gui/message.h"
 

Modified: scummvm/trunk/graphics/VectorRenderer.h
===================================================================
--- scummvm/trunk/graphics/VectorRenderer.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/graphics/VectorRenderer.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -507,8 +507,8 @@
 	 * method.
 	 */
 	virtual void drawString(const Graphics::Font *font, const Common::String &text,
-	                        const Common::Rect &area, GUI::Theme::TextAlign alignH,
-	                        GUI::Theme::TextAlignVertical alignV, int deltax, bool useEllipsis) = 0;
+	                        const Common::Rect &area, GUI::ThemeEngine::TextAlign alignH,
+	                        GUI::ThemeEngine::TextAlignVertical alignV, int deltax, bool useEllipsis) = 0;
 
 	/**
 	 * Allows to temporarily enable/disable all shadows drawing.
@@ -549,7 +549,7 @@
 	 * Applies a whole-screen shading effect, used before opening a new dialog.
 	 * Currently supports screen dimmings and luminance (b&w).
 	 */
-	virtual void applyScreenShading(GUI::Theme::ShadingStyle) = 0;
+	virtual void applyScreenShading(GUI::ThemeEngine::ShadingStyle) = 0;
 
 protected:
 	Surface *_activeSurface; /**< Pointer to the surface currently being drawn */

Modified: scummvm/trunk/graphics/VectorRendererSpec.cpp
===================================================================
--- scummvm/trunk/graphics/VectorRendererSpec.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/graphics/VectorRendererSpec.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -354,7 +354,7 @@
 
 template <typename PixelType, typename PixelFormat>
 void VectorRendererSpec<PixelType, PixelFormat>::
-applyScreenShading(GUI::Theme::ShadingStyle shadingStyle) {
+applyScreenShading(GUI::ThemeEngine::ShadingStyle shadingStyle) {
 	int pixels = _activeSurface->w * _activeSurface->h;
 	PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(0, 0);
 	uint8 r, g, b;
@@ -365,7 +365,7 @@
 		(1 << PixelFormat::kRedShift) | 
 		(1 << PixelFormat::kBlueShift)) >> 1;
 	
-	if (shadingStyle == GUI::Theme::kShadingDim) {
+	if (shadingStyle == GUI::ThemeEngine::kShadingDim) {
 
 		int n = (pixels + 7) >> 3;
 		switch (pixels % 8) {
@@ -381,7 +381,7 @@
 				} while (--n > 0);
 		}
 
-	} else if (shadingStyle == GUI::Theme::kShadingLuminance) {
+	} else if (shadingStyle == GUI::ThemeEngine::kShadingLuminance) {
 		while (pixels--) {
 			colorToRGB<PixelFormat>(*ptr, r, g, b);
 			lum = (r >> 2) + (g >> 1) + (b >> 3);
@@ -449,16 +449,16 @@
 template <typename PixelType, typename PixelFormat>
 void VectorRendererSpec<PixelType, PixelFormat>::
 drawString(const Graphics::Font *font, const Common::String &text, const Common::Rect &area, 
-			GUI::Theme::TextAlign alignH, GUI::Theme::TextAlignVertical alignV, int deltax, bool ellipsis) {
+			GUI::ThemeEngine::TextAlign alignH, GUI::ThemeEngine::TextAlignVertical alignV, int deltax, bool ellipsis) {
 
 	int offset = area.top;
 	
 	if (font->getFontHeight() < area.height()) {
 		switch (alignV) {
-			case GUI::Theme::kTextAlignVCenter:
+			case GUI::ThemeEngine::kTextAlignVCenter:
 				offset = area.top + ((area.height() - font->getFontHeight()) >> 1);
 				break;
-			case GUI::Theme::kTextAlignVBottom:
+			case GUI::ThemeEngine::kTextAlignVBottom:
 				offset = area.bottom - font->getFontHeight();
 				break;
 			default:

Modified: scummvm/trunk/graphics/VectorRendererSpec.h
===================================================================
--- scummvm/trunk/graphics/VectorRendererSpec.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/graphics/VectorRendererSpec.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -68,8 +68,8 @@
 		drawBevelSquareAlg(x, y, w, h, bevel, _bevelColor, _fgColor, Base::_fillMode != kFillDisabled);
 	}
 	void drawString(const Graphics::Font *font, const Common::String &text, 
-					const Common::Rect &area, GUI::Theme::TextAlign alignH,
-					GUI::Theme::TextAlignVertical alignV, int deltax, bool elipsis);
+					const Common::Rect &area, GUI::ThemeEngine::TextAlign alignH,
+					GUI::ThemeEngine::TextAlignVertical alignV, int deltax, bool elipsis);
 
 	void setFgColor(uint8 r, uint8 g, uint8 b) { _fgColor = RGBToColor<PixelFormat>(r, g, b); }
 	void setBgColor(uint8 r, uint8 g, uint8 b) { _bgColor = RGBToColor<PixelFormat>(r, g, b); }
@@ -84,7 +84,7 @@
     void blitSubSurface(const Graphics::Surface *source, const Common::Rect &r);
     void blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r);
 	
-    void applyScreenShading(GUI::Theme::ShadingStyle shadingStyle);
+    void applyScreenShading(GUI::ThemeEngine::ShadingStyle shadingStyle);
 
 protected:
 

Modified: scummvm/trunk/gui/EditTextWidget.cpp
===================================================================
--- scummvm/trunk/gui/EditTextWidget.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/EditTextWidget.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -55,7 +55,7 @@
 	_leftPadding = g_gui.xmlEval()->getVar("Globals.EditTextWidget.Padding.Left", 0);
 	_rightPadding = g_gui.xmlEval()->getVar("Globals.EditTextWidget.Padding.Right", 0);
 
-	_font = (Theme::FontStyle)g_gui.xmlEval()->getVar("EditTextWidget.Font", Theme::kFontStyleNormal);
+	_font = (ThemeEngine::FontStyle)g_gui.xmlEval()->getVar("EditTextWidget.Font", ThemeEngine::kFontStyleNormal);
 
 	EditableWidget::reflowLayout();
 }
@@ -82,11 +82,11 @@
 
 
 void EditTextWidget::drawWidget() {
-	g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, Theme::kWidgetBackgroundEditText);
+	g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, ThemeEngine::kWidgetBackgroundEditText);
 
 	// Draw the text
 	adjustOffset();
-	g_gui.theme()->drawText(Common::Rect(_x+2+ _leftPadding,_y+2, _x+_leftPadding+getEditRect().width()+2, _y+_h-2), _editString, _state, Theme::kTextAlignLeft, false, -_editScrollOffset, false, _font);
+	g_gui.theme()->drawText(Common::Rect(_x+2+ _leftPadding,_y+2, _x+_leftPadding+getEditRect().width()+2, _y+_h-2), _editString, _state, ThemeEngine::kTextAlignLeft, false, -_editScrollOffset, false, _font);
 }
 
 Common::Rect EditTextWidget::getEditRect() const {

Modified: scummvm/trunk/gui/ListWidget.cpp
===================================================================
--- scummvm/trunk/gui/ListWidget.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/ListWidget.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -360,7 +360,7 @@
 	Common::String buffer;
 
 	// Draw a thin frame around the list.
-	g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, Theme::kWidgetBackgroundBorder);
+	g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorder);
 	const int scrollbarW = (_scrollBar && _scrollBar->isVisible()) ? _scrollBarWidth : 0;
 
 	// Draw the list items
@@ -375,7 +375,7 @@
 				inverted = true;
 			else
 				g_gui.theme()->drawWidgetBackground(Common::Rect(_x, y - 1, _x + _w - 1, y + fontHeight - 1), 
-													0, Theme::kWidgetBackgroundBorderSmall);
+													0, ThemeEngine::kWidgetBackgroundBorderSmall);
 		}
 
 		Common::Rect r(getEditRect());
@@ -387,7 +387,7 @@
 			sprintf(temp, "%2d. ", (pos + _numberingMode));
 			buffer = temp;
 			g_gui.theme()->drawText(Common::Rect(_x, y, _x + r.left + _leftPadding, y + fontHeight - 2), 
-									buffer, _state, Theme::kTextAlignLeft, inverted, _leftPadding);
+									buffer, _state, ThemeEngine::kTextAlignLeft, inverted, _leftPadding);
 			pad = 0;
 		}
 
@@ -398,7 +398,7 @@
 			adjustOffset();
 			width = _w - r.left - _hlRightPadding - _leftPadding - scrollbarW;
 			g_gui.theme()->drawText(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight-2), 
-									buffer, _state, Theme::kTextAlignLeft, inverted, pad);
+									buffer, _state, ThemeEngine::kTextAlignLeft, inverted, pad);
 		} else {
 			int maxWidth = _textWidth[i];
 			buffer = _list[pos];
@@ -411,7 +411,7 @@
 			if (width > maxWidth)
 				maxWidth = width;
 			g_gui.theme()->drawText(Common::Rect(_x + r.left, y, _x + r.left + maxWidth, y + fontHeight-2), 
-									buffer, _state, Theme::kTextAlignLeft, inverted, pad);
+									buffer, _state, ThemeEngine::kTextAlignLeft, inverted, pad);
 		}
 
 		_textWidth[i] = width;

Modified: scummvm/trunk/gui/PopUpWidget.cpp
===================================================================
--- scummvm/trunk/gui/PopUpWidget.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/PopUpWidget.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -344,8 +344,8 @@
 		// Draw a separator
 		g_gui.theme()->drawLineSeparator(Common::Rect(x, y, x+w, y+kLineHeight));
 	} else {
-		g_gui.theme()->drawText(Common::Rect(x+1, y+2, x+w, y+2+kLineHeight), name,	hilite ? Theme::kStateHighlight : Theme::kStateEnabled,
-								Theme::kTextAlignLeft, false, _leftPadding);
+		g_gui.theme()->drawText(Common::Rect(x+1, y+2, x+w, y+2+kLineHeight), name,	hilite ? ThemeEngine::kStateHighlight : ThemeEngine::kStateEnabled,
+								ThemeEngine::kTextAlignLeft, false, _leftPadding);
 	}
 }
 
@@ -425,7 +425,7 @@
 
 	// Draw the label, if any
 	if (_labelWidth > 0)
-		g_gui.theme()->drawText(Common::Rect(_x+2,_y+3,_x+2+_labelWidth, _y+3+g_gui.theme()->getFontHeight()), _label, _state, Theme::kTextAlignRight);
+		g_gui.theme()->drawText(Common::Rect(_x+2,_y+3,_x+2+_labelWidth, _y+3+g_gui.theme()->getFontHeight()), _label, _state, ThemeEngine::kTextAlignRight);
 
 	Common::String sel;
 	if (_selectedItem >= 0)

Modified: scummvm/trunk/gui/ScrollBarWidget.cpp
===================================================================
--- scummvm/trunk/gui/ScrollBarWidget.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/ScrollBarWidget.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -187,15 +187,15 @@
 	if (_draggingPart != kNoPart)
 		_part = _draggingPart;
 
-	Theme::ScrollbarState state = Theme::kScrollbarStateNo;
+	ThemeEngine::ScrollbarState state = ThemeEngine::kScrollbarStateNo;
 	if (_numEntries <= _entriesPerPage) {
-		state = Theme::kScrollbarStateSinglePage;
+		state = ThemeEngine::kScrollbarStateSinglePage;
 	} else if (_part == kUpArrowPart) {
-		state = Theme::kScrollbarStateUp;
+		state = ThemeEngine::kScrollbarStateUp;
 	} else if (_part == kDownArrowPart) {
-		state = Theme::kScrollbarStateDown;
+		state = ThemeEngine::kScrollbarStateDown;
 	} else if (_part == kSliderPart) {
-		state = Theme::kScrollbarStateSlider;
+		state = ThemeEngine::kScrollbarStateSlider;
 	}
 
 	g_gui.theme()->drawScrollbar(Common::Rect(_x, _y, _x+_w, _y+_h), _sliderPos, _sliderHeight, state, _state);

Added: scummvm/trunk/gui/ThemeData.cpp
===================================================================
--- scummvm/trunk/gui/ThemeData.cpp	                        (rev 0)
+++ scummvm/trunk/gui/ThemeData.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -0,0 +1,143 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/util.h"
+#include "common/system.h"
+
+#include "graphics/surface.h"
+#include "graphics/colormasks.h"
+#include "graphics/imageman.h"
+#include "graphics/cursorman.h"
+#include "graphics/VectorRenderer.h"
+
+#include "gui/ThemeEngine.h"
+#include "gui/ThemeData.h"
+
+namespace GUI {
+
+/**********************************************************
+ *	Data definitions for theme engine elements
+ *********************************************************/
+const ThemeEngine::DrawDataInfo ThemeEngine::kDrawDataDefaults[] = {
+	{kDDMainDialogBackground, 		"mainmenu_bg", 		true, 	kDDNone},
+	{kDDSpecialColorBackground, 	"special_bg", 		true, 	kDDNone},
+	{kDDPlainColorBackground, 		"plain_bg", 		true, 	kDDNone},
+	{kDDDefaultBackground, 			"default_bg", 		true, 	kDDNone},
+	{kDDTextSelectionBackground,	"text_selection", 	false, 	kDDNone},
+
+	{kDDWidgetBackgroundDefault,	"widget_default", 	true, 	kDDNone},
+	{kDDWidgetBackgroundSmall, 		"widget_small", 	true, 	kDDNone},
+	{kDDWidgetBackgroundEditText, 	"widget_textedit", 	true, 	kDDNone},
+	{kDDWidgetBackgroundSlider, 	"widget_slider", 	true, 	kDDNone},
+
+	{kDDButtonIdle, 				"button_idle", 		true, 	kDDWidgetBackgroundSlider},
+	{kDDButtonHover, 				"button_hover", 	false, 	kDDButtonIdle},
+	{kDDButtonDisabled, 			"button_disabled", 	true, 	kDDNone},
+
+	{kDDSliderFull, 				"slider_full", 		false, 	kDDNone},
+	{kDDSliderHover, 				"slider_hover", 	false, 	kDDNone},
+	{kDDSliderDisabled, 			"slider_disabled", 	true, 	kDDNone},
+
+	{kDDCheckboxDefault, 			"checkbox_default", 		true, 	kDDNone},
+	{kDDCheckboxDisabled, 			"checkbox_disabled",		true, 	kDDNone},
+	{kDDCheckboxSelected, 			"checkbox_selected",		false, 	kDDCheckboxDefault},
+
+	{kDDTabActive, 					"tab_active", 				false, 	kDDTabInactive},
+	{kDDTabInactive, 				"tab_inactive", 			true, 	kDDNone},
+	{kDDTabBackground, 				"tab_background", 			true, 	kDDNone},
+
+	{kDDScrollbarBase, 				"scrollbar_base", 			true, 	kDDNone},
+
+	{kDDScrollbarButtonIdle, 		"scrollbar_button_idle", 	true, 	kDDNone},
+	{kDDScrollbarButtonHover, 		"scrollbar_button_hover", 	false, 	kDDScrollbarButtonIdle},
+
+	{kDDScrollbarHandleIdle, 		"scrollbar_handle_idle", 	false, 	kDDNone},
+	{kDDScrollbarHandleHover, 		"scrollbar_handle_hover", 	false, 	kDDScrollbarBase},
+
+	{kDDPopUpIdle, 					"popup_idle", 	true, 	kDDNone},
+	{kDDPopUpHover, 				"popup_hover", 	false, 	kDDPopUpIdle},
+
+	{kDDCaret, 						"caret", 		false, 	kDDNone},
+	{kDDSeparator, 					"separator", 	true, 	kDDNone},
+};
+
+const ThemeEngine::TextDataInfo ThemeEngine::kTextDataDefaults[] = {
+	{kTextDataDefault, 		"text_default"},
+	{kTextDataHover, 		"text_hover"},
+	{kTextDataDisabled, 	"text_disabled"},
+	{kTextDataInverted, 	"text_inverted"},
+	{kTextDataButton, 		"text_button"},
+	{kTextDataButtonHover, 	"text_button_hover"},
+	{kTextDataNormalFont, 	"text_normal"}
+};
+
+
+/**********************************************************
+ *	ThemeItem functions for drawing queues.
+ *********************************************************/
+void ThemeItemDrawData::drawSelf(bool draw, bool restore) {
+
+	Common::Rect extendedRect = _area;
+	extendedRect.grow(_engine->kDirtyRectangleThreshold + _data->_backgroundOffset);
+
+	if (restore)
+		_engine->restoreBackground(extendedRect);
+
+	if (draw) {
+		Common::List<Graphics::DrawStep>::const_iterator step;
+		for (step = _data->_steps.begin(); step != _data->_steps.end(); ++step)
+			_engine->renderer()->drawStep(_area, *step, _dynamicData);
+	}
+
+	_engine->addDirtyRect(extendedRect);
+}
+
+void ThemeItemTextData::drawSelf(bool draw, bool restore) {
+	if (_restoreBg || restore)
+		_engine->restoreBackground(_area);
+
+	if (draw) {
+		_engine->renderer()->setFgColor(_data->_color.r, _data->_color.g, _data->_color.b);
+		_engine->renderer()->drawString(_data->_fontPtr, _text, _area, _alignH, _alignV, _deltax, _ellipsis);
+	}
+
+	_engine->addDirtyRect(_area);
+}
+
+void ThemeItemBitmap::drawSelf(bool draw, bool restore) {
+	if (restore)
+		_engine->restoreBackground(_area);
+
+	if (draw) {
+		if (_alpha)
+			_engine->renderer()->blitAlphaBitmap(_bitmap, _area);
+		else
+			_engine->renderer()->blitSubSurface(_bitmap, _area);
+	}
+
+	_engine->addDirtyRect(_area);
+}
+
+}
\ No newline at end of file


Property changes on: scummvm/trunk/gui/ThemeData.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Added: scummvm/trunk/gui/ThemeData.h
===================================================================
--- scummvm/trunk/gui/ThemeData.h	                        (rev 0)
+++ scummvm/trunk/gui/ThemeData.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -0,0 +1,130 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef GUI_THEME_DATA_H
+#define GUI_THEME_DATA_H
+
+
+namespace GUI {
+
+struct TextDrawData {
+	const Graphics::Font *_fontPtr;
+
+	struct {
+		uint8 r, g, b;
+	} _color;
+};
+
+struct WidgetDrawData {
+	/** List of all the steps needed to draw this widget */
+	Common::List<Graphics::DrawStep> _steps;
+
+	int _textDataId;
+	GUI::ThemeEngine::TextAlign _textAlignH;
+	GUI::ThemeEngine::TextAlignVertical _textAlignV;
+
+	/** Extra space that the widget occupies when it's drawn.
+	    E.g. when taking into account rounded corners, drop shadows, etc
+		Used when restoring the widget background */
+	uint16 _backgroundOffset;
+
+	/** Sets whether the widget is cached beforehand. */
+	bool _cached;
+	bool _buffer;
+
+	/** Texture where the cached widget is stored. */
+	Graphics::Surface *_surfaceCache;
+
+	~WidgetDrawData() {
+		_steps.clear();
+
+		if (_surfaceCache) {
+			_surfaceCache->free();
+			delete _surfaceCache;
+		}
+	}
+};
+
+class ThemeItem {
+
+public:
+	ThemeItem(ThemeEngine *engine, const Common::Rect &area) :
+		_engine(engine), _area(area) {}
+	virtual ~ThemeItem() {}
+
+	virtual void drawSelf(bool doDraw, bool doRestore) = 0;
+
+protected:
+	ThemeEngine *_engine;
+	Common::Rect _area;
+};
+
+class ThemeItemDrawData : public ThemeItem {
+public:
+	ThemeItemDrawData(ThemeEngine *engine, const WidgetDrawData *data, const Common::Rect &area, uint32 dynData) :
+		ThemeItem(engine, area), _dynamicData(dynData), _data(data) {}
+
+	void drawSelf(bool draw, bool restore);
+
+protected:
+	uint32 _dynamicData;
+	const WidgetDrawData *_data;
+};
+
+class ThemeItemTextData : public ThemeItem {
+public:
+	ThemeItemTextData(ThemeEngine *engine, const TextDrawData *data, const Common::Rect &area, const Common::String &text,
+		GUI::ThemeEngine::TextAlign alignH, GUI::ThemeEngine::TextAlignVertical alignV,
+		bool ellipsis, bool restoreBg, int deltaX) :
+		ThemeItem(engine, area), _data(data), _text(text), _alignH(alignH), _alignV(alignV),
+		_ellipsis(ellipsis), _restoreBg(restoreBg), _deltax(deltaX) {}
+
+	void drawSelf(bool draw, bool restore);
+
+protected:
+	const TextDrawData *_data;
+	Common::String _text;
+	GUI::ThemeEngine::TextAlign _alignH;
+	GUI::ThemeEngine::TextAlignVertical _alignV;
+	bool _ellipsis;
+	bool _restoreBg;
+	int _deltax;
+};
+
+class ThemeItemBitmap : public ThemeItem {
+public:
+	ThemeItemBitmap(ThemeEngine *engine, const Common::Rect &area, const Graphics::Surface *bitmap, bool alpha) :
+		ThemeItem(engine, area), _bitmap(bitmap), _alpha(alpha) {}
+
+	void drawSelf(bool draw, bool restore);
+
+protected:
+	const Graphics::Surface *_bitmap;
+	bool _alpha;
+};
+
+}
+
+#endif
\ No newline at end of file


Property changes on: scummvm/trunk/gui/ThemeData.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Modified: scummvm/trunk/gui/ThemeEngine.cpp
===================================================================
--- scummvm/trunk/gui/ThemeEngine.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/ThemeEngine.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -40,110 +40,60 @@
 #include "gui/ThemeEngine.h"
 #include "gui/ThemeEval.h"
 #include "gui/ThemeParser.h"
+#include "gui/ThemeData.h"
 
 #define GUI_ENABLE_BUILTIN_THEME
 
 namespace GUI {
 
-struct TextDrawData {
-	const Graphics::Font *_fontPtr;
+/**********************************************************
+ *	ThemeEngine class
+ *********************************************************/
+ThemeEngine::ThemeEngine(Common::String fileName, GraphicsMode mode) :
+	_system(0), _vectorRenderer(0), _screen(0), _backBuffer(0),
+	_buffering(false), _bytesPerPixel(0),  _graphicsMode(kGfxDisabled),
+	_font(0), _initOk(false), _themeOk(false), _enabled(false), _cursor(0),
+	_loadedThemeX(0), _loadedThemeY(0) {
+		
+	_system = g_system;
+	_parser = new ThemeParser(this);
+	_themeEval = new GUI::ThemeEval();
 
-	struct {
-		uint8 r, g, b;
-	} _color;
-};
+	_useCursor = false;
 
-struct WidgetDrawData {
-	/** List of all the steps needed to draw this widget */
-	Common::List<Graphics::DrawStep> _steps;
+	for (int i = 0; i < kDrawDataMAX; ++i) {
+		_widgets[i] = 0;
+	}
 
-	int _textDataId;
-	GUI::Theme::TextAlign _textAlignH;
-	GUI::Theme::TextAlignVertical _textAlignV;
-
-	/** Extra space that the widget occupies when it's drawn.
-	    E.g. when taking into account rounded corners, drop shadows, etc
-		Used when restoring the widget background */
-	uint16 _backgroundOffset;
-
-	/** Sets whether the widget is cached beforehand. */
-	bool _cached;
-	bool _buffer;
-
-	/** Texture where the cached widget is stored. */
-	Graphics::Surface *_surfaceCache;
-
-	~WidgetDrawData() {
-		_steps.clear();
-
-		if (_surfaceCache) {
-			_surfaceCache->free();
-			delete _surfaceCache;
-		}
+	for (int i = 0; i < kTextDataMAX; ++i) {
+		_texts[i] = 0;
 	}
-};
 
-class ThemeItem {
+	_graphicsMode = mode;
+	_themeFileName = fileName;
+	_initOk = false;
+}
 
-public:
-	ThemeItem(ThemeEngine *engine, const Common::Rect &area) :
-		_engine(engine), _area(area) {}
-	virtual ~ThemeItem() {}
+ThemeEngine::~ThemeEngine() {
+	freeRenderer();
+	freeScreen();
+	freeBackbuffer();
+	unloadTheme();
+	delete _parser;
+	delete _themeEval;
+	delete[] _cursor;
 
-	virtual void drawSelf(bool doDraw, bool doRestore) = 0;
+	for (ImagesMap::iterator i = _bitmaps.begin(); i != _bitmaps.end(); ++i)
+		ImageMan.unregisterSurface(i->_key);
+}
 
-protected:
-	ThemeEngine *_engine;
-	Common::Rect _area;
-};
 
-class ThemeItemDrawData : public ThemeItem {
-public:
-	ThemeItemDrawData(ThemeEngine *engine, const WidgetDrawData *data, const Common::Rect &area, uint32 dynData) :
-		ThemeItem(engine, area), _dynamicData(dynData), _data(data) {}
 
-	void drawSelf(bool draw, bool restore);
 
-protected:
-	uint32 _dynamicData;
-	const WidgetDrawData *_data;
-};
 
-class ThemeItemTextData : public ThemeItem {
-public:
-	ThemeItemTextData(ThemeEngine *engine, const TextDrawData *data, const Common::Rect &area, const Common::String &text,
-		GUI::Theme::TextAlign alignH, GUI::Theme::TextAlignVertical alignV,
-		bool ellipsis, bool restoreBg, int deltaX) :
-		ThemeItem(engine, area), _data(data), _text(text), _alignH(alignH), _alignV(alignV),
-		_ellipsis(ellipsis), _restoreBg(restoreBg), _deltax(deltaX) {}
-
-	void drawSelf(bool draw, bool restore);
-
-protected:
-	const TextDrawData *_data;
-	Common::String _text;
-	GUI::Theme::TextAlign _alignH;
-	GUI::Theme::TextAlignVertical _alignV;
-	bool _ellipsis;
-	bool _restoreBg;
-	int _deltax;
-};
-
-class ThemeItemBitmap : public ThemeItem {
-public:
-	ThemeItemBitmap(ThemeEngine *engine, const Common::Rect &area, const Graphics::Surface *bitmap, bool alpha) :
-		ThemeItem(engine, area), _bitmap(bitmap), _alpha(alpha) {}
-
-	void drawSelf(bool draw, bool restore);
-
-protected:
-	const Graphics::Surface *_bitmap;
-	bool _alpha;
-};
-
-
-
-
+/**********************************************************
+ *	Rendering mode management
+ *********************************************************/
 const ThemeEngine::Renderer ThemeEngine::_rendererModes[] = {
 	{ "Disabled GFX", "none", kGfxDisabled },
 	{ "Standard Renderer (16bpp)", "normal_16bpp", kGfxStandard16bit },
@@ -179,152 +129,11 @@
 	return findModeConfigName(kGfxDisabled);
 }
 
-/**********************************************************
- *	ThemeItem functions for drawing queues.
- *********************************************************/
-void ThemeItemDrawData::drawSelf(bool draw, bool restore) {
 
-	Common::Rect extendedRect = _area;
-	extendedRect.grow(_engine->kDirtyRectangleThreshold + _data->_backgroundOffset);
 
-	if (restore)
-		_engine->restoreBackground(extendedRect);
 
-	if (draw) {
-		Common::List<Graphics::DrawStep>::const_iterator step;
-		for (step = _data->_steps.begin(); step != _data->_steps.end(); ++step)
-			_engine->renderer()->drawStep(_area, *step, _dynamicData);
-	}
 
-	_engine->addDirtyRect(extendedRect);
-}
-
-void ThemeItemTextData::drawSelf(bool draw, bool restore) {
-	if (_restoreBg || restore)
-		_engine->restoreBackground(_area);
-
-	if (draw) {
-		_engine->renderer()->setFgColor(_data->_color.r, _data->_color.g, _data->_color.b);
-		_engine->renderer()->drawString(_data->_fontPtr, _text, _area, _alignH, _alignV, _deltax, _ellipsis);
-	}
-
-	_engine->addDirtyRect(_area);
-}
-
-void ThemeItemBitmap::drawSelf(bool draw, bool restore) {
-	if (restore)
-		_engine->restoreBackground(_area);
-
-	if (draw) {
-		if (_alpha)
-			_engine->renderer()->blitAlphaBitmap(_bitmap, _area);
-		else
-			_engine->renderer()->blitSubSurface(_bitmap, _area);
-	}
-
-	_engine->addDirtyRect(_area);
-}
-
-
-
 /**********************************************************
- *	Data definitions for theme engine elements
- *********************************************************/
-const ThemeEngine::DrawDataInfo ThemeEngine::kDrawDataDefaults[] = {
-	{kDDMainDialogBackground, "mainmenu_bg", true, kDDNone},
-	{kDDSpecialColorBackground, "special_bg", true, kDDNone},
-	{kDDPlainColorBackground, "plain_bg", true, kDDNone},
-	{kDDDefaultBackground, "default_bg", true, kDDNone},
-	{kDDTextSelectionBackground, "text_selection", false, kDDNone},
-
-	{kDDWidgetBackgroundDefault, "widget_default", true, kDDNone},
-	{kDDWidgetBackgroundSmall, "widget_small", true, kDDNone},
-	{kDDWidgetBackgroundEditText, "widget_textedit", true, kDDNone},
-	{kDDWidgetBackgroundSlider, "widget_slider", true, kDDNone},
-
-	{kDDButtonIdle, "button_idle", true, kDDWidgetBackgroundSlider},
-	{kDDButtonHover, "button_hover", false, kDDButtonIdle},
-	{kDDButtonDisabled, "button_disabled", true, kDDNone},
-
-	{kDDSliderFull, "slider_full", false, kDDNone},
-	{kDDSliderHover, "slider_hover", false, kDDNone},
-	{kDDSliderDisabled, "slider_disabled", true, kDDNone},
-
-	{kDDCheckboxDefault, "checkbox_default", true, kDDNone},
-	{kDDCheckboxDisabled, "checkbox_disabled", true, kDDNone},
-	{kDDCheckboxSelected, "checkbox_selected", false, kDDCheckboxDefault},
-
-	{kDDTabActive, "tab_active", false, kDDTabInactive},
-	{kDDTabInactive, "tab_inactive", true, kDDNone},
-	{kDDTabBackground, "tab_background", true, kDDNone},
-
-	{kDDScrollbarBase, "scrollbar_base", true, kDDNone},
-
-	{kDDScrollbarButtonIdle, "scrollbar_button_idle", true, kDDNone},
-	{kDDScrollbarButtonHover, "scrollbar_button_hover", false, kDDScrollbarButtonIdle},
-
-	{kDDScrollbarHandleIdle, "scrollbar_handle_idle", false, kDDNone},
-	{kDDScrollbarHandleHover, "scrollbar_handle_hover", false, kDDScrollbarBase},
-
-	{kDDPopUpIdle, "popup_idle", true, kDDNone},
-	{kDDPopUpHover, "popup_hover", false, kDDPopUpIdle},
-
-	{kDDCaret, "caret", false, kDDNone},
-	{kDDSeparator, "separator", true, kDDNone},
-};
-
-const ThemeEngine::TextDataInfo ThemeEngine::kTextDataDefaults[] = {
-	{kTextDataDefault, "text_default"},
-	{kTextDataHover, "text_hover"},
-	{kTextDataDisabled, "text_disabled"},
-	{kTextDataInverted, "text_inverted"},
-	{kTextDataButton, "text_button"},
-	{kTextDataButtonHover, "text_button_hover"},
-	{kTextDataNormalFont, "text_normal"}
-};
-
-
-/**********************************************************
- *	ThemeEngine class
- *********************************************************/
-ThemeEngine::ThemeEngine(Common::String fileName, GraphicsMode mode) :
-	_system(0), _vectorRenderer(0), _screen(0), _backBuffer(0),
-	_buffering(false), _bytesPerPixel(0),  _graphicsMode(kGfxDisabled),
-	_font(0), _initOk(false), _themeOk(false), _enabled(false), _cursor(0) {
-	_system = g_system;
-	_parser = new ThemeParser(this);
-	_themeEval = new GUI::ThemeEval();
-
-	_useCursor = false;
-
-	for (int i = 0; i < kDrawDataMAX; ++i) {
-		_widgets[i] = 0;
-	}
-
-	for (int i = 0; i < kTextDataMAX; ++i) {
-		_texts[i] = 0;
-	}
-
-	_graphicsMode = mode;
-	_themeFileName = fileName;
-	_initOk = false;
-}
-
-ThemeEngine::~ThemeEngine() {
-	freeRenderer();
-	freeScreen();
-	freeBackbuffer();
-	unloadTheme();
-	delete _parser;
-	delete _themeEval;
-	delete[] _cursor;
-
-	for (ImagesMap::iterator i = _bitmaps.begin(); i != _bitmaps.end(); ++i)
-		ImageMan.unregisterSurface(i->_key);
-}
-
-
-/**********************************************************
  *	Theme setup/initialization
  *********************************************************/
 bool ThemeEngine::init() {
@@ -515,9 +324,21 @@
 	_vectorRenderer->blitSurface(_backBuffer, r);
 }
 
+bool ThemeEngine::isThemeLoadingRequired() {
+	int x = g_system->getOverlayWidth(), y = g_system->getOverlayHeight();
 
+	if (_loadedThemeX == x && _loadedThemeY == y)
+		return false;
 
+	_loadedThemeX = x;
+	_loadedThemeY = y;
 
+	return true;
+}
+
+
+
+
 /**********************************************************
  *	Theme elements management
  *********************************************************/
@@ -677,8 +498,7 @@
 	if (!node.exists() || !node.isReadable())
 		return false;
 
-	// FIXME: Should this be initialized to something else than NULL?
-	Common::Archive *archive = NULL;
+	Common::Archive *archive = 0;
 
 	if (node.getName().hasSuffix(".zip") && !node.isDirectory()) {
 #ifdef USE_ZLIB
@@ -693,7 +513,9 @@
 
 #endif
 	} else if (node.isDirectory()) {
-		warning("Don't know how to open theme '%s'", themeName.c_str());
+
+// 		FIXME: This warning makes no sense whatsoever. Who added this?
+//		warning("Don't know how to open theme '%s'", themeName.c_str());
 		archive = new Common::FSDirectory(node);
 	}
 
@@ -701,8 +523,6 @@
 		return false;
 
 	Common::File themercFile;
-	// FIXME: Possibly dereferencing a NULL pointer here if the node's
-	// name doesn't have a ".zip" suffix and the node is not a directory.
 	themercFile.open("THEMERC", *archive);
 	if (!themercFile.isOpen()) {
 		delete archive;
@@ -1215,6 +1035,11 @@
 	return true;
 }
 
+
+/**********************************************************
+ *	Legacy GUI::Theme support functions
+ *********************************************************/
+
 const Graphics::Font *ThemeEngine::getFont(FontStyle font) const {
 	return _texts[fontStyleToData(font)]->_fontPtr;
 }
@@ -1236,4 +1061,148 @@
 }
 
 
+
+/**********************************************************
+ *	External data loading
+ *********************************************************/
+
+const Graphics::Font *ThemeEngine::loadFontFromArchive(const Common::String &filename) {
+	Common::Archive *arch = 0;
+	const Graphics::NewFont *font = 0;
+
+	if (getThemeFileName().hasSuffix(".zip")) {
+#ifdef USE_ZLIB
+		Common::ZipArchive *zip = new Common::ZipArchive(getThemeFileName());
+		if (!zip || !zip->isOpen())
+			return 0;
+
+		arch = zip;
+#else
+		return 0;
+#endif
+	} else {
+		Common::FSDirectory *dir = new Common::FSDirectory(getThemeFileName());
+		if (!dir || !dir->getFSNode().isDirectory())	
+			return 0;
+
+		arch = dir;
+	}
+
+	Common::SeekableReadStream *stream(arch->openFile(filename));
+	if (stream) {
+		font = Graphics::NewFont::loadFromCache(*stream);
+		delete stream;
+	}
+
+	delete arch;
+	return font;
+}
+
+const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
+	const Graphics::Font *font = 0;
+	Common::String cacheFilename = genCacheFilename(filename.c_str());
+	Common::File fontFile;
+
+	if (!cacheFilename.empty()) {
+		if (fontFile.open(cacheFilename))
+			font = Graphics::NewFont::loadFromCache(fontFile);
+
+		if (font)
+			return font;
+
+		if ((font = loadFontFromArchive(cacheFilename)))
+			return font;
+	}
+
+	// normal open
+	if (fontFile.open(filename)) {
+		font = Graphics::NewFont::loadFont(fontFile);
+	}
+
+	if (!font) {
+		font = loadFontFromArchive(filename);
+	}
+
+	if (font) {
+		if (!cacheFilename.empty()) {
+			if (!Graphics::NewFont::cacheFontData(*(const Graphics::NewFont*)font, cacheFilename)) {
+				warning("Couldn't create cache file for font '%s'", filename.c_str());
+			}
+		}
+	}
+
+	return font;
+}
+
+Common::String ThemeEngine::genCacheFilename(const char *filename) {
+	Common::String cacheName(filename);
+	for (int i = cacheName.size() - 1; i >= 0; --i) {
+		if (cacheName[i] == '.') {
+			while ((uint)i < cacheName.size() - 1) {
+				cacheName.deleteLastChar();
+			}
+
+			cacheName += "fcc";
+			return cacheName;
+		}
+	}
+
+	return "";
+}
+
+
+/**********************************************************
+ *	Static Theme XML functions
+ *********************************************************/
+
+bool ThemeEngine::themeConfigParseHeader(Common::String header, Common::String &themeName) {	
+	header.trim();
+
+	if (header.empty())
+		return false;
+
+	if (header[0] != '[' || header.lastChar() != ']')
+		return false;
+
+	header.deleteChar(0);
+	header.deleteLastChar();
+
+	Common::StringTokenizer tok(header, ":");
+
+	if (tok.nextToken() != SCUMMVM_THEME_VERSION_STR)
+		return false;
+
+	themeName = tok.nextToken();
+	Common::String author = tok.nextToken();
+
+	return tok.empty();
+}
+
+bool ThemeEngine::themeConfigUseable(const Common::FSNode &node, Common::String &themeName) {
+	Common::File stream;
+	bool foundHeader = false;
+
+	if (node.getName().hasSuffix(".zip") && !node.isDirectory()) {
+#ifdef USE_ZLIB
+		Common::ZipArchive zipArchive(node);
+		if (zipArchive.hasFile("THEMERC")) {
+			stream.open("THEMERC", zipArchive);
+		}
+#endif
+	} else if (node.isDirectory()) {			
+		Common::FSNode headerfile = node.getChild("THEMERC");
+		if (!headerfile.exists() || !headerfile.isReadable() || headerfile.isDirectory())
+			return false;
+		stream.open(headerfile);
+	}
+
+	if (stream.isOpen()) {
+		Common::String stxHeader = stream.readLine();
+		foundHeader = themeConfigParseHeader(stxHeader, themeName);
+	}
+
+	return foundHeader;
+}
+
+
 } // end of namespace GUI.

Modified: scummvm/trunk/gui/ThemeEngine.h
===================================================================
--- scummvm/trunk/gui/ThemeEngine.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/ThemeEngine.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -28,11 +28,11 @@
 
 #include "common/scummsys.h"
 #include "common/system.h"
-
+#include "common/fs.h"
 #include "graphics/surface.h"
 #include "graphics/fontman.h"
 
-#include "gui/theme.h"
+#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.3"
 
 namespace Graphics {
 struct DrawStep;
@@ -50,7 +50,7 @@
 class ThemeItem;
 class ThemeParser;
 
-class ThemeEngine : public Theme {
+class ThemeEngine {
 protected:
 	typedef Common::HashMap<Common::String, Graphics::Surface*> ImagesMap;
 
@@ -137,8 +137,80 @@
 		const char *name;
 	} kTextDataDefaults[];
 
+public:
+	//! Defined the align of the text
+	enum TextAlign {
+		kTextAlignLeft,		//!< Text should be aligned to the left
+		kTextAlignCenter,	//!< Text should be centered
+		kTextAlignRight		//!< Text should be aligned to the right
+	};
+	
+	//! Vertical alignment of the text.
+	enum TextAlignVertical {
+		kTextAlignVBottom,
+		kTextAlignVCenter,
+		kTextAlignVTop
+	};
 
-public:
+	//! Widget background type
+	enum WidgetBackground {
+		kWidgetBackgroundNo,			//!< No background at all
+		kWidgetBackgroundPlain,			//!< Simple background, this may not include borders
+		kWidgetBackgroundBorder,		//!< Same as kWidgetBackgroundPlain just with a border
+		kWidgetBackgroundBorderSmall,	//!< Same as kWidgetBackgroundPlain just with a small border
+		kWidgetBackgroundEditText,		//!< Background used for edit text fields
+		kWidgetBackgroundSlider			//!< Background used for sliders
+	};
+	
+	//! Dialog background type
+	enum DialogBackground {
+		kDialogBackgroundMain,
+		kDialogBackgroundSpecial,
+		kDialogBackgroundPlain,
+		kDialogBackgroundDefault
+	};
+
+	//! State of the widget to be drawn
+	enum State {
+		kStateDisabled,		//!< Indicates that the widget is disabled, that does NOT include that it is invisible
+		kStateEnabled,		//!< Indicates that the widget is enabled
+		kStateHighlight		//!< Indicates that the widget is highlighted by the user
+	};
+
+	typedef State WidgetStateInfo;
+
+	enum ScrollbarState {
+		kScrollbarStateNo,
+		kScrollbarStateUp,
+		kScrollbarStateDown,
+		kScrollbarStateSlider,
+		kScrollbarStateSinglePage
+	};
+
+	//! Font style selector
+	enum FontStyle {
+		kFontStyleBold = 0,			//!< A bold font. This is also the default font.
+		kFontStyleNormal = 1,		//!< A normal font.
+		kFontStyleItalic = 2,		//!< Italic styled font.
+		kFontStyleFixedNormal = 3,	//!< Fixed size font.
+		kFontStyleFixedBold = 4,	//!< Fixed size bold font.
+		kFontStyleFixedItalic = 5,	//!< Fixed size italic font.
+		kFontStyleMax
+	};
+
+	//! Function used to process areas other than the current dialog
+	enum ShadingStyle {
+		kShadingNone,		//!< No special post processing
+		kShadingDim,		//!< Dimming unused areas
+		kShadingLuminance	//!< Converting colors to luminance for unused areas
+	};
+	
+	//! Special image ids for images used in the GUI
+	enum kThemeImages {
+		kImageLogo = 0,		//!< ScummVM Logo used in the launcher
+		kImageLogoSmall		//!< ScummVM logo used in the GMM
+	};
+	
 	/** Graphics mode enumeration.
 	 *	Each item represents a set of BPP and Renderer modes for a given
 	 * surface.
@@ -148,7 +220,7 @@
 		kGfxStandard16bit,	/** 2BPP with the standard (aliased) renderer. */
 		kGfxAntialias16bit	/** 2BPP with the optimized AA renderer. */
 	};
-
+	
 	/** Constant value to expand dirty rectangles, to make sure they are fully copied */
 	static const int kDirtyRectangleThreshold = 1;
 
@@ -441,8 +513,6 @@
 	 */
 	bool isWidgetCached(DrawData type, const Common::Rect &r);
 
-public:
-
 	const Common::String &getThemeName() const { return _themeName; }
 	const Common::String &getThemeFileName() const { return _themeFileName; }
 	int getGraphicsMode() const { return _graphicsMode; }
@@ -549,19 +619,63 @@
 	void queueBitmap(const Graphics::Surface *bitmap, const Common::Rect &r, bool alpha);
 
 	/**
-	 *	DEBUG: Draws a white square around the given position and writes the given next to it.
+	 *	DEBUG: Draws a white square and writes some text next to it.
 	 */
 	void debugWidgetPosition(const char *name, const Common::Rect &r);
 
+public:
+	
+	/**
+	 *	LEGACY: Old GUI::Theme API
+	 */
+	
+	bool needThemeReload() { 
+		return ((_loadedThemeX != g_system->getOverlayWidth()) ||
+				(_loadedThemeY != g_system->getOverlayHeight())); 
+	}
 
 	const Graphics::Font *loadFont(const Common::String &filename);
 	const Graphics::Font *loadFontFromArchive(const Common::String &filename);
 	Common::String genCacheFilename(const char *filename);
+	
+	Graphics::TextAlignment convertAligment(TextAlign align) const {
+		switch (align) {
+		case kTextAlignLeft:
+			return Graphics::kTextAlignLeft;
+			break;
 
-public:
-	/**
-	 *	Default values from GUI::Theme
-	 */
+		case kTextAlignRight:
+			return Graphics::kTextAlignRight;
+			break;
+
+		default:
+			break;
+		};
+		return Graphics::kTextAlignCenter;
+	}
+
+	TextAlign convertAligment(Graphics::TextAlignment align) const {
+		switch (align) {
+		case Graphics::kTextAlignLeft:
+			return kTextAlignLeft;
+			break;
+
+		case Graphics::kTextAlignRight:
+			return kTextAlignRight;
+			break;
+
+		default:
+			break;
+		}
+		return kTextAlignCenter;
+	}
+
+
+	bool isThemeLoadingRequired();
+	
+	static bool themeConfigUseable(const Common::FSNode &node, Common::String &themeName);
+	static bool themeConfigParseHeader(Common::String header, Common::String &themeName);
+
 	int getTabSpacing() const { return 0; }
 	int getTabPadding() const { return 3; }
 
@@ -633,6 +747,7 @@
 	bool _needPaletteUpdates;
 	uint _cursorWidth, _cursorHeight;
 	byte _cursorPal[4*MAX_CURS_COLORS];
+	int _loadedThemeX, _loadedThemeY;
 };
 
 } // end of namespace GUI.

Modified: scummvm/trunk/gui/ThemeParser.cpp
===================================================================
--- scummvm/trunk/gui/ThemeParser.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/ThemeParser.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -177,23 +177,23 @@
 }
 
 bool ThemeParser::parserCallback_text(ParserNode *node) {		
-	GUI::Theme::TextAlign alignH;
-	GUI::Theme::TextAlignVertical alignV;
+	GUI::ThemeEngine::TextAlign alignH;
+	GUI::ThemeEngine::TextAlignVertical alignV;
 		
 	if (node->values["horizontal_align"] == "left")
-		alignH = GUI::Theme::kTextAlignLeft;
+		alignH = GUI::ThemeEngine::kTextAlignLeft;
 	else if (node->values["horizontal_align"] == "right")
-		alignH = GUI::Theme::kTextAlignRight;
+		alignH = GUI::ThemeEngine::kTextAlignRight;
 	else if (node->values["horizontal_align"] == "center")
-		alignH = GUI::Theme::kTextAlignCenter;
+		alignH = GUI::ThemeEngine::kTextAlignCenter;
 	else return parserError("Invalid value for text alignment.");
 	
 	if (node->values["vertical_align"] == "top")
-		alignV = GUI::Theme::kTextAlignVTop;
+		alignV = GUI::ThemeEngine::kTextAlignVTop;
 	else if (node->values["vertical_align"] == "center")
-		alignV = GUI::Theme::kTextAlignVCenter;
+		alignV = GUI::ThemeEngine::kTextAlignVCenter;
 	else if (node->values["vertical_align"] == "bottom")
-		alignV = GUI::Theme::kTextAlignVBottom;
+		alignV = GUI::ThemeEngine::kTextAlignVBottom;
 	else return parserError("Invalid value for text alignment.");
 	
 	if (!_theme->addTextData(getParentNode(node)->values["id"], node->values["font"], alignH, alignV))

Modified: scummvm/trunk/gui/about.cpp
===================================================================
--- scummvm/trunk/gui/about.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/about.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -218,29 +218,29 @@
 
 	for (int line = firstLine; line < lastLine; line++) {
 		const char *str = _lines[line].c_str();
-		Theme::TextAlign align = Theme::kTextAlignCenter;
-		Theme::WidgetStateInfo state = Theme::kStateEnabled;
+		ThemeEngine::TextAlign align = ThemeEngine::kTextAlignCenter;
+		ThemeEngine::WidgetStateInfo state = ThemeEngine::kStateEnabled;
 		while (str[0] == '\\') {
 			switch (str[1]) {
 			case 'C':
-				align = Theme::kTextAlignCenter;
+				align = ThemeEngine::kTextAlignCenter;
 				break;
 			case 'L':
-				align = Theme::kTextAlignLeft;
+				align = ThemeEngine::kTextAlignLeft;
 				break;
 			case 'R':
-				align = Theme::kTextAlignRight;
+				align = ThemeEngine::kTextAlignRight;
 				break;
 			case 'c':
 				switch (str[2]) {
 				case '0':
-					state = Theme::kStateEnabled;
+					state = ThemeEngine::kStateEnabled;
 					break;
 				case '1':
-					state = Theme::kStateHighlight;
+					state = ThemeEngine::kStateHighlight;
 					break;
 				case '2':
-					state = Theme::kStateDisabled;
+					state = ThemeEngine::kStateDisabled;
 					break;
 				case '3':
 					warning("Need state for color 3");
@@ -262,7 +262,7 @@
 			str += 2;
 		}
 		// Trim leading whitespaces if center mode is on
-		if (align == Theme::kTextAlignCenter)
+		if (align == ThemeEngine::kTextAlignCenter)
 			while (*str && *str == ' ')
 				str++;
 

Modified: scummvm/trunk/gui/browser.cpp
===================================================================
--- scummvm/trunk/gui/browser.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/browser.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -150,7 +150,7 @@
 	_fileList->setNumberingMode(kListNumberingOff);
 	_fileList->setEditable(false);
 
-	_backgroundType = GUI::Theme::kDialogBackgroundPlain;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain;
 
 	// Buttons
 	new ButtonWidget(this, "Browser.Up", "Go up", kGoUpCmd, 0);

Modified: scummvm/trunk/gui/console.cpp
===================================================================
--- scummvm/trunk/gui/console.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/console.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -170,7 +170,7 @@
 }
 
 void ConsoleDialog::drawDialog() {
-	g_gui.theme()->drawDialogBackground(Common::Rect(_x, _y, _x + _w, _y + _h), Theme::kDialogBackgroundPlain/*_backgroundType*/);
+	g_gui.theme()->drawDialogBackground(Common::Rect(_x, _y, _x + _w, _y + _h), ThemeEngine::kDialogBackgroundPlain/*_backgroundType*/);
 	// FIXME: for the old theme the frame around the console vanishes
 	// when any action is processed if we enable this
 	// _drawingHints &= ~THEME_HINT_FIRST_DRAW;

Modified: scummvm/trunk/gui/dialog.cpp
===================================================================
--- scummvm/trunk/gui/dialog.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/dialog.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -45,12 +45,12 @@
 Dialog::Dialog(int x, int y, int w, int h)
 	: GuiObject(x, y, w, h),
 	  _mouseWidget(0), _focusedWidget(0), _dragWidget(0), _visible(false), 
-	_backgroundType(GUI::Theme::kDialogBackgroundDefault) {}
+	_backgroundType(GUI::ThemeEngine::kDialogBackgroundDefault) {}
 
 Dialog::Dialog(const Common::String &name)
 	: GuiObject(name),
 	  _mouseWidget(0), _focusedWidget(0), _dragWidget(0), _visible(false),
-	_backgroundType(GUI::Theme::kDialogBackgroundDefault) {
+	_backgroundType(GUI::ThemeEngine::kDialogBackgroundDefault) {
 
 	// It may happen that we have 3x scaler in launcher (960xY) and then 640x480
 	// game will be forced to 1x. At this stage GUI will not be aware of

Modified: scummvm/trunk/gui/dialog.h
===================================================================
--- scummvm/trunk/gui/dialog.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/dialog.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -49,7 +49,7 @@
 	Widget  *_dragWidget;
 	bool	_visible;
 	
-	Theme::DialogBackground _backgroundType;
+	ThemeEngine::DialogBackground _backgroundType;
 
 private:
 	int		_result;

Modified: scummvm/trunk/gui/editable.cpp
===================================================================
--- scummvm/trunk/gui/editable.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/editable.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -47,7 +47,7 @@
 
 	_editScrollOffset = 0;
 
-	_font = Theme::kFontStyleBold;
+	_font = ThemeEngine::kFontStyleBold;
 }
 
 EditableWidget::~EditableWidget() {

Modified: scummvm/trunk/gui/editable.h
===================================================================
--- scummvm/trunk/gui/editable.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/editable.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -50,7 +50,7 @@
 
 	int			_editScrollOffset;
 
-	Theme::FontStyle  _font;
+	ThemeEngine::FontStyle  _font;
 
 public:
 	EditableWidget(GuiObject *boss, int x, int y, int w, int h);
@@ -79,7 +79,7 @@
 	bool adjustOffset();
 	void makeCaretVisible();
 
-	void setFontStyle(Theme::FontStyle font) { _font = font; }
+	void setFontStyle(ThemeEngine::FontStyle font) { _font = font; }
 
 	virtual bool tryInsertChar(byte c, int pos);
 };

Modified: scummvm/trunk/gui/launcher.cpp
===================================================================
--- scummvm/trunk/gui/launcher.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/launcher.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -477,7 +477,7 @@
 	: Dialog("ScummSaveLoad"), _delSupport(0), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0)  {
 	_delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false;
 
-	_backgroundType = Theme::kDialogBackgroundSpecial;
+	_backgroundType = ThemeEngine::kDialogBackgroundSpecial;
 
 	new StaticTextWidget(this, "ScummSaveLoad.Title", title);
 
@@ -794,7 +794,7 @@
 
 LauncherDialog::LauncherDialog()
 	: Dialog(0, 0, 320, 200) {
-	_backgroundType = GUI::Theme::kDialogBackgroundMain;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundMain;
 
 	const int screenW = g_system->getOverlayWidth();
 	const int screenH = g_system->getOverlayHeight();
@@ -807,7 +807,7 @@
 	if (g_gui.xmlEval()->getVar("Globals.ShowLauncherLogo") == 1 && g_gui.theme()->supportsImages()) {
 		_logo = new GraphicsWidget(this, "Launcher.Logo");
 		_logo->useThemeTransparency(true);
-		_logo->setGfx(g_gui.theme()->getImageSurface(Theme::kImageLogo));
+		_logo->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageLogo));
 
 		new StaticTextWidget(this, "Launcher.Version", gScummVMVersionDate);
 	} else
@@ -1257,7 +1257,7 @@
 		if (!_logo)
 			_logo = new GraphicsWidget(this, "Launcher.Logo");
 		_logo->useThemeTransparency(true);
-		_logo->setGfx(g_gui.theme()->getImageSurface(Theme::kImageLogo));
+		_logo->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageLogo));
 	} else {
 		StaticTextWidget *ver = (StaticTextWidget*)findWidget("Launcher.Version");
 		if (ver) {

Modified: scummvm/trunk/gui/module.mk
===================================================================
--- scummvm/trunk/gui/module.mk	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/module.mk	2008-11-10 11:24:55 UTC (rev 34983)
@@ -19,10 +19,10 @@
 	PopUpWidget.o \
 	ScrollBarWidget.o \
 	TabWidget.o \
-	theme.o \
 	themebrowser.o \
 	ThemeEngine.o \
 	ThemeEval.o \
+	ThemeData.o \
 	ThemeLayout.o \
 	ThemeParser.o \
 	widget.o

Modified: scummvm/trunk/gui/newgui.cpp
===================================================================
--- scummvm/trunk/gui/newgui.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/newgui.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -141,7 +141,7 @@
 			_theme->updateScreen();
 
 		case kRedrawOpenDialog:
-			_theme->openDialog(true, (Theme::ShadingStyle)xmlEval()->getVar("Dialog." + _dialogStack.top()->_name + ".Shading", 0));
+			_theme->openDialog(true, (ThemeEngine::ShadingStyle)xmlEval()->getVar("Dialog." + _dialogStack.top()->_name + ".Shading", 0));
 			_dialogStack.top()->drawDialog();
 			_theme->finishBuffering();
 			break;

Modified: scummvm/trunk/gui/newgui.h
===================================================================
--- scummvm/trunk/gui/newgui.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/newgui.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -30,7 +30,7 @@
 #include "common/stack.h"
 #include "common/str.h"
 #include "graphics/fontman.h"
-#include "gui/theme.h"
+
 #include "gui/widget.h"
 
 #include "gui/ThemeEngine.h"
@@ -83,10 +83,10 @@
 	
 	ThemeEval *xmlEval() { return _theme->getEvaluator(); }
 
-	const Graphics::Font &getFont(Theme::FontStyle style = Theme::kFontStyleBold) const { return *(_theme->getFont(style)); }
-	int getFontHeight(Theme::FontStyle style = Theme::kFontStyleBold) const { return _theme->getFontHeight(style); }
-	int getStringWidth(const Common::String &str, Theme::FontStyle style = Theme::kFontStyleBold) const { return _theme->getStringWidth(str, style); }
-	int getCharWidth(byte c, Theme::FontStyle style = Theme::kFontStyleBold) const { return _theme->getCharWidth(c, style); }
+	const Graphics::Font &getFont(ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return *(_theme->getFont(style)); }
+	int getFontHeight(ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return _theme->getFontHeight(style); }
+	int getStringWidth(const Common::String &str, ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return _theme->getStringWidth(str, style); }
+	int getCharWidth(byte c, ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return _theme->getCharWidth(c, style); }
 
 	WidgetSize getWidgetSize();
 

Deleted: scummvm/trunk/gui/theme.cpp
===================================================================
--- scummvm/trunk/gui/theme.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/theme.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -1,184 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#include "gui/theme.h"
-#include "common/file.h"
-#include "common/archive.h"
-#include "common/unzip.h"
-
-#include "gui/ThemeEngine.h"
-
-namespace GUI {
-
-Theme::Theme() : _loadedThemeX(0), _loadedThemeY(0) {}
-
-Theme::~Theme() {}
-
-const Graphics::Font *ThemeEngine::loadFontFromArchive(const Common::String &filename) {
-	Common::Archive *arch = 0;
-	const Graphics::NewFont *font = 0;
-
-	if (getThemeFileName().hasSuffix(".zip")) {
-#ifdef USE_ZLIB
-		Common::ZipArchive *zip = new Common::ZipArchive(getThemeFileName());
-		if (!zip || !zip->isOpen())
-			return 0;
-
-		arch = zip;
-#else
-		return 0;
-#endif
-	} else {
-		Common::FSDirectory *dir = new Common::FSDirectory(getThemeFileName());
-		if (!dir || !dir->getFSNode().isDirectory())	
-			return 0;
-
-		arch = dir;
-	}
-
-	Common::SeekableReadStream *stream(arch->openFile(filename));
-	if (stream) {
-		font = Graphics::NewFont::loadFromCache(*stream);
-		delete stream;
-	}
-
-	delete arch;
-	return font;
-}
-
-const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
-	const Graphics::Font *font = 0;
-	Common::String cacheFilename = genCacheFilename(filename.c_str());
-	Common::File fontFile;
-
-	if (!cacheFilename.empty()) {
-		if (fontFile.open(cacheFilename))
-			font = Graphics::NewFont::loadFromCache(fontFile);
-
-		if (font)
-			return font;
-
-		if ((font = loadFontFromArchive(cacheFilename)))
-			return font;
-	}
-
-	// normal open
-	if (fontFile.open(filename)) {
-		font = Graphics::NewFont::loadFont(fontFile);
-	}
-
-	if (!font) {
-		font = loadFontFromArchive(filename);
-	}
-
-	if (font) {
-		if (!cacheFilename.empty()) {
-			if (!Graphics::NewFont::cacheFontData(*(const Graphics::NewFont*)font, cacheFilename)) {
-				warning("Couldn't create cache file for font '%s'", filename.c_str());
-			}
-		}
-	}
-
-	return font;
-}
-
-Common::String ThemeEngine::genCacheFilename(const char *filename) {
-	Common::String cacheName(filename);
-	for (int i = cacheName.size() - 1; i >= 0; --i) {
-		if (cacheName[i] == '.') {
-			while ((uint)i < cacheName.size() - 1) {
-				cacheName.deleteLastChar();
-			}
-
-			cacheName += "fcc";
-			return cacheName;
-		}
-	}
-
-	return "";
-}
-
-bool Theme::isThemeLoadingRequired() {
-	int x = g_system->getOverlayWidth(), y = g_system->getOverlayHeight();
-
-	if (_loadedThemeX == x && _loadedThemeY == y)
-		return false;
-
-	_loadedThemeX = x;
-	_loadedThemeY = y;
-
-	return true;
-}
-
-bool Theme::themeConfigParseHeader(Common::String header, Common::String &themeName) {	
-	header.trim();
-	
-	if (header.empty())
-		return false;
-	
-	if (header[0] != '[' || header.lastChar() != ']')
-		return false;
-		
-	header.deleteChar(0);
-	header.deleteLastChar();
-	
-	Common::StringTokenizer tok(header, ":");
-	
-	if (tok.nextToken() != SCUMMVM_THEME_VERSION_STR)
-		return false;
-		
-	themeName = tok.nextToken();
-	Common::String author = tok.nextToken();
-
-	return tok.empty();
-}
-
-bool Theme::themeConfigUseable(const Common::FSNode &node, Common::String &themeName) {
-	Common::File stream;
-	bool foundHeader = false;
-		
-	if (node.getName().hasSuffix(".zip") && !node.isDirectory()) {
-#ifdef USE_ZLIB
-		Common::ZipArchive zipArchive(node);
-		if (zipArchive.hasFile("THEMERC")) {
-			stream.open("THEMERC", zipArchive);
-		}
-#endif
-	} else if (node.isDirectory()) {			
-		Common::FSNode headerfile = node.getChild("THEMERC");
-		if (!headerfile.exists() || !headerfile.isReadable() || headerfile.isDirectory())
-			return false;
-		stream.open(headerfile);
-	}
-	
-	if (stream.isOpen()) {
-		Common::String stxHeader = stream.readLine();
-		foundHeader = themeConfigParseHeader(stxHeader, themeName);
-	}
-
-	return foundHeader;
-}
-
-} // End of namespace GUI
-

Deleted: scummvm/trunk/gui/theme.h
===================================================================
--- scummvm/trunk/gui/theme.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/theme.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -1,348 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef GUI_THEME_H
-#define GUI_THEME_H
-
-#include "common/system.h"
-#include "common/rect.h"
-#include "common/str.h"
-#include "common/fs.h"
-#include "common/config-file.h"
-
-#include "graphics/surface.h"
-#include "graphics/fontman.h"
-
-#define THEME_VERSION 24
-#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.3"
-
-namespace GUI {
-
-class ThemeEval;
-
-/**
- * Our theme renderer class.
- *
- * It is used to draw the different widgets and
- * getting the layout of the widgets for different
- * resolutions.
- */
-class Theme {
-public:
-	Theme();
-
-	virtual ~Theme();
-
-	//! Defined the align of the text
-	enum TextAlign {
-		kTextAlignLeft,		//!< Text should be aligned to the left
-		kTextAlignCenter,	//!< Text should be centered
-		kTextAlignRight		//!< Text should be aligned to the right
-	};
-	
-	//! Vertical alignment of the text.
-	enum TextAlignVertical {
-		kTextAlignVBottom,
-		kTextAlignVCenter,
-		kTextAlignVTop
-	};
-
-	//! Widget background type
-	enum WidgetBackground {
-		kWidgetBackgroundNo,			//!< No background at all
-		kWidgetBackgroundPlain,			//!< Simple background, this may not include borders
-		kWidgetBackgroundBorder,		//!< Same as kWidgetBackgroundPlain just with a border
-		kWidgetBackgroundBorderSmall,	//!< Same as kWidgetBackgroundPlain just with a small border
-		kWidgetBackgroundEditText,		//!< Background used for edit text fields
-		kWidgetBackgroundSlider			//!< Background used for sliders
-	};
-	
-	//! Dialog background type
-	enum DialogBackground {
-		kDialogBackgroundMain,
-		kDialogBackgroundSpecial,
-		kDialogBackgroundPlain,
-		kDialogBackgroundDefault
-	};
-
-	//! State of the widget to be drawn
-	enum State {
-		kStateDisabled,		//!< Indicates that the widget is disabled, that does NOT include that it is invisible
-		kStateEnabled,		//!< Indicates that the widget is enabled
-		kStateHighlight		//!< Indicates that the widget is highlighted by the user
-	};
-
-	typedef State WidgetStateInfo;
-
-	enum ScrollbarState {
-		kScrollbarStateNo,
-		kScrollbarStateUp,
-		kScrollbarStateDown,
-		kScrollbarStateSlider,
-		kScrollbarStateSinglePage
-	};
-
-	//! Font style selector
-	enum FontStyle {
-		kFontStyleBold = 0,			//!< A bold font. This is also the default font.
-		kFontStyleNormal = 1,		//!< A normal font.
-		kFontStyleItalic = 2,		//!< Italic styled font.
-		kFontStyleFixedNormal = 3,	//!< Fixed size font.
-		kFontStyleFixedBold = 4,	//!< Fixed size bold font.
-		kFontStyleFixedItalic = 5,	//!< Fixed size italic font.
-		kFontStyleMax
-	};
-
-	//! Function used to process areas other than the current dialog
-	enum ShadingStyle {
-		kShadingNone,		//!< No special post processing
-		kShadingDim,		//!< Dimming unused areas
-		kShadingLuminance	//!< Converting colors to luminance for unused areas
-	};
-
-	/**
-	 * This initializes all the data needed by the theme renderer.
-	 * It should just be called *once*, when first using the renderer.
-	 *
-	 * Other functions of the renderer should just be used after
-	 * calling this function, else the result is undefined.
-	 *
-	 * If used again it should just be used after deinit,
-	 * if there is need to use the renderer again.
-	 *
-	 * @see deinit
-	 */
-//	virtual bool init() = 0;
-
-	/**
-	 * Unloads all data used by the theme renderer.
-	 */
-//	virtual void deinit() = 0;
-
-	/**
-	 * Updates the renderer to changes to resolution,
-	 * bit depth and other video related configuration.
-	 */
-//	virtual void refresh() = 0;
-
-	/**
-	 * Checks if the theme supplies its own cursor.
-	 *
-	 * @return true if using an own cursor
-	 */
-//	virtual bool ownCursor() const { return false; }
-
-	/**
-	 * Enables the theme renderer for use.
-	 *
-	 * This for examples displays the overlay, clears the
-	 * renderer's temporary screen buffers and does other
-	 * things to make the renderer for use.
-	 *
-	 * This will NOT back up the data on the overlay.
-	 * So if you've got data in the overlay save it before
-	 * calling this.
-	 *
-	 * Unlike init, this makes the renderer ready to draw
-	 * something to the screen. And of course it relies on the data
-	 * loaded by init.
-	 *
-	 * @see disable
-	 * @see init
-	 */
-//	virtual void enable() = 0;
-
-	/**
-	 * Disables the theme renderer.
-	 *
-	 * This for example hides the overlay and undoes
-	 * other things done by enable.
-	 *
-	 * Unlike uninit, this just makes the renderer unable
-	 * to do any screen drawing, but still keeps all data
-	 * loaded into memory.
-	 *
-	 * @see enable
-	 * @see uninit
-	 */
-//	virtual void disable() = 0;
-
-	/**
-	 * Tells the theme renderer that a new dialog is opened.
-	 *
-	 * This can be used for internal caching and marking
-	 * area of all but the not top dialog in a special way.
-	 *
-	 * TODO: This needs serious reworking, since at least for
-	 * normal usage, a dialog opened with openDialog should always
-	 * be the top dialog. Currently our themes have no good enough
-	 * implementation to handle a single open dialog though, so we
-	 * have to stay this way until we implement proper dialog
-	 * 'caching'/handling.
-	 *
-	 * @param topDialog	if true it indicates that this is the top dialog
-	 *
-	 * @see closeAllDialogs
-	 */
-//	virtual void openDialog(bool topDialog, ShadingStyle shading = kShadingNone) = 0;
-
-	/**
-	 * This indicates that all dialogs have been closed.
-	 *
-	 * @see openDialog
-	 */
-//	virtual void closeAllDialogs() = 0;
-
-	/**
-	 * Closes the topmost dialog, and redraws the screen
-	 * accordingly.
-	 *
-	 * TODO: Make this purely virtual by making ThemeClassic
-	 * and ThemeModern implement it too.
-	 *
-	 * @returns True if the dialog was sucessfully closed.
-	 *          If we weren't able to restore the screen after closing
-	 *          the dialog, we return false, which means we need to redraw
-	 *          the dialog stack from scratch.
-	 */
-//	virtual void startBuffering() = 0;
-//	virtual void finishBuffering() = 0;
-
-	/**
-	 * Clear the complete GUI screen.
-	 */
-//	virtual void clearAll() = 0;
-
-	/**
-	 * Update the GUI screen aka overlay.
-	 *
-	 * This does NOT call OSystem::updateScreen,
-	 * it just copies all (changed) data to the overlay.
-	 */
-//	virtual void updateScreen() = 0;
-
-/*
-	virtual const Graphics::Font *getFont(FontStyle font = kFontStyleBold) const = 0;
-	virtual int getFontHeight(FontStyle font = kFontStyleBold) const = 0;
-	virtual int getStringWidth(const Common::String &str, FontStyle font = kFontStyleBold) const = 0;
-	virtual int getCharWidth(byte c, FontStyle font = kFontStyleBold) const = 0;
-
-	virtual void drawDialogBackground(const Common::Rect &r, DialogBackground type, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state = kStateEnabled, TextAlign align = kTextAlignCenter, bool inverted = false, int deltax = 0, bool useEllipsis = true, FontStyle font = kFontStyleBold) = 0;
-	// this should ONLY be used by the debugger until we get a nicer solution
-	virtual void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, WidgetStateInfo state = kStateEnabled) = 0;
-
-	virtual void drawWidgetBackground(const Common::Rect &r, uint16 hints, WidgetBackground background = kWidgetBackgroundPlain, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state = kStateEnabled, uint16 hints = 0) = 0;
-	virtual void drawSurface(const Common::Rect &r, const Graphics::Surface &surface, WidgetStateInfo state = kStateEnabled, int alpha = 256, bool themeTrans = false) = 0;
-	virtual void drawSlider(const Common::Rect &r, int width, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawPopUpWidget(const Common::Rect &r, const Common::String &sel, int deltax, WidgetStateInfo state = kStateEnabled, TextAlign align = kTextAlignLeft) = 0;
-	virtual void drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state = kStateEnabled) = 0;
-	virtual void drawLineSeparator(const Common::Rect &r, WidgetStateInfo state = kStateEnabled) = 0;
-
-	virtual void restoreBackground(Common::Rect r, bool special = false) = 0;
-	virtual bool addDirtyRect(Common::Rect r, bool save = false, bool special = false) = 0;
-
-	virtual int getTabSpacing() const = 0;
-	virtual int getTabPadding() const = 0;
-*/
-	Graphics::TextAlignment convertAligment(TextAlign align) const {
-		switch (align) {
-		case kTextAlignLeft:
-			return Graphics::kTextAlignLeft;
-			break;
-
-		case kTextAlignRight:
-			return Graphics::kTextAlignRight;
-			break;
-
-		default:
-			break;
-		};
-		return Graphics::kTextAlignCenter;
-	}
-
-	TextAlign convertAligment(Graphics::TextAlignment align) const {
-		switch (align) {
-		case Graphics::kTextAlignLeft:
-			return kTextAlignLeft;
-			break;
-
-		case Graphics::kTextAlignRight:
-			return kTextAlignRight;
-			break;
-
-		default:
-			break;
-		}
-		return kTextAlignCenter;
-	}
-
-
-	bool isThemeLoadingRequired();
-//	virtual ThemeEval *getEvaluator() = 0;
-
-	static bool themeConfigUseable(const Common::FSNode &node, Common::String &themeName);
-	static bool themeConfigParseHeader(Common::String header, Common::String &themeName);
-
-//	virtual const Common::String &getThemeFileName() const = 0;
-//	virtual const Common::String &getThemeName() const = 0;
-//	virtual int getGraphicsMode() const = 0;
-
-	/**
-	 * Checks if the theme renderer supports drawing of images.
-	 *
-	 * @return true on support, else false
-	 */
-//	virtual bool supportsImages() const { return false; }
-
-	//! Special image ids for images used in the GUI
-	enum kThemeImages {
-		kImageLogo = 0,		//!< ScummVM Logo used in the launcher
-		kImageLogoSmall		//!< ScummVM logo used in the GMM
-	};
-
-	/**
-	 * Returns the given image.
-	 *
-	 * @param n	id of the image, see kThemeImages
-	 * @return 0 if no such image exists for the theme, else pointer to the image
-	 *
-	 * @see kThemeImages
-	 */
-//	virtual const Graphics::Surface *getImageSurface(const kThemeImages n) const { return 0; }
-
-public:
-	bool needThemeReload() { return ((_loadedThemeX != g_system->getOverlayWidth()) ||
-									 (_loadedThemeY != g_system->getOverlayHeight())); }
-
-private:
-	int _loadedThemeX, _loadedThemeY;
-};
-} // end of namespace GUI
-
-#endif // GUI_THEME_H

Modified: scummvm/trunk/gui/themebrowser.cpp
===================================================================
--- scummvm/trunk/gui/themebrowser.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/themebrowser.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -25,7 +25,8 @@
 #include "gui/themebrowser.h"
 #include "gui/ListWidget.h"
 #include "gui/widget.h"
-#include "gui/theme.h"
+#include "common/config-manager.h"
+
 #include "common/fs.h"
 
 #ifdef MACOSX
@@ -54,7 +55,7 @@
 	_fileList->setNumberingMode(kListNumberingOff);
 	_fileList->setEditable(false);
 
-	_backgroundType = GUI::Theme::kDialogBackgroundPlain;
+	_backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain;
 
 	// Buttons
 	new ButtonWidget(this, "Browser.Cancel", "Cancel", kCloseCmd, 0);
@@ -196,7 +197,7 @@
 		return false;
 #endif
 		
-	if (!Theme::themeConfigUseable(node, out.name))
+	if (!ThemeEngine::themeConfigUseable(node, out.name))
 		return false;
 
 	return true;

Modified: scummvm/trunk/gui/widget.cpp
===================================================================
--- scummvm/trunk/gui/widget.cpp	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/widget.cpp	2008-11-10 11:24:55 UTC (rev 34983)
@@ -34,13 +34,13 @@
 
 Widget::Widget(GuiObject *boss, int x, int y, int w, int h)
 	: GuiObject(x, y, w, h), _type(0), _boss(boss),
-	  _id(0), _flags(0), _hasFocus(false), _state(Theme::kStateEnabled) {
+	  _id(0), _flags(0), _hasFocus(false), _state(ThemeEngine::kStateEnabled) {
 	init();
 }
 
 Widget::Widget(GuiObject *boss, const Common::String &name)
 	: GuiObject(name), _type(0), _boss(boss),
-	  _id(0), _flags(0), _hasFocus(false), _state(Theme::kStateDisabled) {
+	  _id(0), _flags(0), _hasFocus(false), _state(ThemeEngine::kStateDisabled) {
 	init();
 }
 
@@ -74,11 +74,11 @@
 
 void Widget::updateState(int oldFlags, int newFlags) {
 	if (newFlags & WIDGET_ENABLED) {
-		_state = Theme::kStateEnabled;
+		_state = ThemeEngine::kStateEnabled;
 		if (newFlags & WIDGET_HILITED)
-			_state = Theme::kStateHighlight;
+			_state = ThemeEngine::kStateHighlight;
 	} else {
-		_state = Theme::kStateDisabled;
+		_state = ThemeEngine::kStateDisabled;
 	}
 }
 
@@ -96,7 +96,7 @@
 
 	// Draw border
 	if (_flags & WIDGET_BORDER) {
-		gui->theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, Theme::kWidgetBackgroundBorder);
+		gui->theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, ThemeEngine::kWidgetBackgroundBorder);
 		_x += 4;
 		_y += 4;
 		_w -= 8;
@@ -386,7 +386,7 @@
 }
 
 void ContainerWidget::drawWidget() {
-	g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, Theme::kWidgetBackgroundBorder);
+	g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorder);
 }
 
 } // End of namespace GUI

Modified: scummvm/trunk/gui/widget.h
===================================================================
--- scummvm/trunk/gui/widget.h	2008-11-10 10:40:08 UTC (rev 34982)
+++ scummvm/trunk/gui/widget.h	2008-11-10 11:24:55 UTC (rev 34983)
@@ -94,7 +94,7 @@
 	Widget		*_next;
 	uint16		_id;
 	bool		_hasFocus;
-	Theme::WidgetStateInfo _state;
+	ThemeEngine::WidgetStateInfo _state;
 
 private:
 	uint16		_flags;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list