gui: make resources type safe

- add string, int, color and resource loading helpers
- use typed resource classes, and some cleanup in loading code
- remove abstract GetResource() to enforce type safe access
- add height and width query methods to resources and use them
- minor cleanup
- simplify LoadPlacement

Change-Id: I9b81785109a80b3806ad6b50cba4d893b87b0db1
diff --git a/gui/animation.cpp b/gui/animation.cpp
index 771e1c1..1e9a87d 100644
--- a/gui/animation.cpp
+++ b/gui/animation.cpp
@@ -43,9 +43,7 @@
 	child = node->first_node("resource");
 	if (child)
 	{
-		attr = child->first_attribute("name");
-		if (attr)
-			mAnimation = (AnimationResource*) PageManager::FindResource(attr->value());
+		mAnimation = LoadAttrAnimation(child, "name");
 	}
 
 	// Load the placement
@@ -77,8 +75,8 @@
 	// Fetch the render sizes
 	if (mAnimation && mAnimation->GetResource())
 	{
-		mRenderW = gr_get_width(mAnimation->GetResource());
-		mRenderH = gr_get_height(mAnimation->GetResource());
+		mRenderW = mAnimation->GetWidth();
+		mRenderH = mAnimation->GetHeight();
 
 		// Adjust for placement
 		if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
diff --git a/gui/button.cpp b/gui/button.cpp
index 943d719..6ea0bee 100644
--- a/gui/button.cpp
+++ b/gui/button.cpp
@@ -98,9 +98,7 @@
 	child = node->first_node("icon");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mButtonIcon = PageManager::FindResource(attr->value());
+		mButtonIcon = LoadAttrImage(child, "resource");
 	}
 
 	memset(&mHighlightColor, 0, sizeof(COLOR));
@@ -122,14 +120,13 @@
 		LoadPlacement(node->first_node("placement"), &x, &y, &w, &h, &TextPlacement);
 	}
 	SetRenderPos(x, y, w, h);
-	return;
 }
 
 GUIButton::~GUIButton()
 {
-	if (mButtonImg)	 	delete mButtonImg;
-	if (mButtonLabel)   delete mButtonLabel;
-	if (mAction)		delete mAction;
+	delete mButtonImg;
+	delete mButtonLabel;
+	delete mAction;
 }
 
 int GUIButton::Render(void)
@@ -221,12 +218,8 @@
 		mRenderH = h;
 	}
 
-	mIconW = 0;	 mIconH = 0;
-	if (mButtonIcon && mButtonIcon->GetResource())
-	{
-		mIconW = gr_get_width(mButtonIcon->GetResource());
-		mIconH = gr_get_height(mButtonIcon->GetResource());
-	}
+	mIconW = mButtonIcon->GetWidth();
+	mIconH = mButtonIcon->GetHeight();
 
 	mTextH = 0;
 	mTextW = 0;
diff --git a/gui/checkbox.cpp b/gui/checkbox.cpp
index fe5f557..f4900ba 100644
--- a/gui/checkbox.cpp
+++ b/gui/checkbox.cpp
@@ -48,12 +48,8 @@
 	child = node->first_node("image");
 	if (child)
 	{
-		attr = child->first_attribute("checked");
-		if (attr)
-			mChecked = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("unchecked");
-		if (attr)
-			mUnchecked = PageManager::FindResource(attr->value());
+		mChecked = LoadAttrImage(child, "checked");
+		mUnchecked = LoadAttrImage(child, "unchecked");
 	}
 
 	// Get the variable data
@@ -68,22 +64,17 @@
 			DataManager::SetValue(mVarName, attr->value());
 	}
 
-	mCheckW = 0;	mCheckH = 0;
-	if (mChecked && mChecked->GetResource())
+	mCheckW = mChecked->GetWidth();
+	mCheckH = mChecked->GetHeight();
+	if (mCheckW == 0)
 	{
-		mCheckW = gr_get_width(mChecked->GetResource());
-		mCheckH = gr_get_height(mChecked->GetResource());
-	}
-	else if (mUnchecked && mUnchecked->GetResource())
-	{
-		mCheckW = gr_get_width(mUnchecked->GetResource());
-		mCheckH = gr_get_height(mUnchecked->GetResource());
+		mCheckW = mUnchecked->GetWidth();
+		mCheckH = mUnchecked->GetHeight();
 	}
 
 	int x, y, w, h;
 	mLabel->GetRenderPos(x, y, w, h);
 	SetRenderPos(x, y, 0, 0);
-	return;
 }
 
 GUICheckbox::~GUICheckbox()
diff --git a/gui/console.cpp b/gui/console.cpp
index 9c780c0..bb70400 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -129,32 +129,15 @@
 		child = node->first_node("font");
 		if (child)
 		{
-			attr = child->first_attribute("resource");
-			if (attr)
-				mFont = PageManager::FindResource(attr->value());
+			mFont = LoadAttrFont(child, "resource");
 		}
 
 		child = node->first_node("color");
 		if (child)
 		{
-			attr = child->first_attribute("foreground");
-			if (attr)
-			{
-				std::string color = attr->value();
-				ConvertStrToColor(color, &mForegroundColor);
-			}
-			attr = child->first_attribute("background");
-			if (attr)
-			{
-				std::string color = attr->value();
-				ConvertStrToColor(color, &mBackgroundColor);
-			}
-			attr = child->first_attribute("scroll");
-			if (attr)
-			{
-				std::string color = attr->value();
-				ConvertStrToColor(color, &mScrollColor);
-			}
+			mForegroundColor = LoadAttrColor(child, "foreground", mForegroundColor);
+			mBackgroundColor = LoadAttrColor(child, "background", mBackgroundColor);
+			mScrollColor = LoadAttrColor(child, "scroll", mScrollColor);
 		}
 
 		// Load the placement
@@ -166,21 +149,19 @@
 			mSlideout = 1;
 			LoadPlacement(child, &mSlideoutX, &mSlideoutY);
 
-			attr = child->first_attribute("resource");
-			if (attr)   mSlideoutImage = PageManager::FindResource(attr->value());
+			mSlideoutImage = LoadAttrImage(child, "resource");
 
 			if (mSlideoutImage && mSlideoutImage->GetResource())
 			{
-				mSlideoutW = gr_get_width(mSlideoutImage->GetResource());
-				mSlideoutH = gr_get_height(mSlideoutImage->GetResource());
+				mSlideoutW = mSlideoutImage->GetWidth();
+				mSlideoutH = mSlideoutImage->GetHeight();
 			}
 		}
 	}
 
-	mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
+	mFontHeight = mFont->GetHeight();
 	SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
 	SetRenderPos(mConsoleX, mConsoleY);
-	return;
 }
 
 int GUIConsole::RenderSlideout(void)
diff --git a/gui/fileselector.cpp b/gui/fileselector.cpp
index 319b11b..5c287c3 100644
--- a/gui/fileselector.cpp
+++ b/gui/fileselector.cpp
@@ -40,7 +40,6 @@
 	xml_attribute<>* attr;
 	xml_node<>* child;
 
-	int mIconWidth = 0, mIconHeight = 0, mFolderIconHeight = 0, mFileIconHeight = 0, mFolderIconWidth = 0, mFileIconWidth = 0;
 	mFolderIcon = mFileIcon = NULL;
 	mShowFolders = mShowFiles = mShowNavFolders = 1;
 	mUpdate = 0;
@@ -109,29 +108,12 @@
 	// Get folder and file icons if present
 	child = node->first_node("icon");
 	if (child) {
-		attr = child->first_attribute("folder");
-		if (attr)
-			mFolderIcon = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("file");
-		if (attr)
-			mFileIcon = PageManager::FindResource(attr->value());
+		mFolderIcon = LoadAttrImage(child, "folder");
+		mFileIcon = LoadAttrImage(child, "file");
 	}
-	if (mFolderIcon && mFolderIcon->GetResource()) {
-		mFolderIconWidth = gr_get_width(mFolderIcon->GetResource());
-		mFolderIconHeight = gr_get_height(mFolderIcon->GetResource());
-		if (mFolderIconHeight > mIconHeight)
-			mIconHeight = mFolderIconHeight;
-		mIconWidth = mFolderIconWidth;
-	}
-	if (mFileIcon && mFileIcon->GetResource()) {
-		mFileIconWidth = gr_get_width(mFileIcon->GetResource());
-		mFileIconHeight = gr_get_height(mFileIcon->GetResource());
-		if (mFileIconHeight > mIconHeight)
-			mIconHeight = mFileIconHeight;
-		if (mFileIconWidth > mIconWidth)
-			mIconWidth = mFileIconWidth;
-	}
-	SetMaxIconSize(mIconWidth, mIconHeight);
+	int iconWidth = std::max(mFolderIcon->GetWidth(), mFileIcon->GetWidth());
+	int iconHeight = std::max(mFolderIcon->GetHeight(), mFileIcon->GetHeight());
+	SetMaxIconSize(iconWidth, iconHeight);
 
 	// Fetch the file/folder list
 	std::string value;
@@ -318,7 +300,7 @@
 	return folderSize + fileSize;
 }
 
-int GUIFileSelector::GetListItem(size_t item_index, Resource*& icon, std::string &text)
+int GUIFileSelector::GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
 {
 	size_t folderSize = mShowFolders ? mFolderList.size() : 0;
 	size_t fileSize = mShowFiles ? mFileList.size() : 0;
diff --git a/gui/image.cpp b/gui/image.cpp
index 2cf3b68..60b1cb9 100644
--- a/gui/image.cpp
+++ b/gui/image.cpp
@@ -40,12 +40,8 @@
 	child = node->first_node("image");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mImage = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("highlightresource");
-		if (attr)
-			mHighlightImage = PageManager::FindResource(attr->value());
+		mImage = LoadAttrImage(child, "resource");
+		mHighlightImage = LoadAttrImage(child, "highlightresource");
 	}
 
 	// Load the placement
@@ -53,8 +49,8 @@
 
 	if (mImage && mImage->GetResource())
 	{
-		mRenderW = gr_get_width(mImage->GetResource());
-		mRenderH = gr_get_height(mImage->GetResource());
+		mRenderW = mImage->GetWidth();
+		mRenderH = mImage->GetHeight();
 
 		// Adjust for placement
 		if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
@@ -73,8 +69,6 @@
 		}
 		SetPlacement(TOP_LEFT);
 	}
-
-	return;
 }
 
 int GUIImage::Render(void)
diff --git a/gui/input.cpp b/gui/input.cpp
index e893335..299034a 100644
--- a/gui/input.cpp
+++ b/gui/input.cpp
@@ -88,35 +88,21 @@
 	child = node->first_node("background");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mBackground = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("color");
-		if (attr)
-		{
-			std::string color = attr->value();
-			ConvertStrToColor(color, &mBackgroundColor);
-		}
+		mBackground = LoadAttrImage(child, "resource");
+		mBackgroundColor = LoadAttrColor(child, "color", mBackgroundColor);
 	}
 	if (mBackground && mBackground->GetResource())
 	{
-		mBackgroundW = gr_get_width(mBackground->GetResource());
-		mBackgroundH = gr_get_height(mBackground->GetResource());
+		mBackgroundW = mBackground->GetWidth();
+		mBackgroundH = mBackground->GetHeight();
 	}
 
 	// Load the cursor color
 	child = node->first_node("cursor");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mCursor = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("color");
-		if (attr)
-		{
-			std::string color = attr->value();
-			ConvertStrToColor(color, &mCursorColor);
-		}
+		mCursor = LoadAttrImage(child, "resource");
+		mCursorColor = LoadAttrColor(child, "color", mCursorColor);
 		attr = child->first_attribute("hasfocus");
 		if (attr)
 		{
@@ -132,15 +118,12 @@
 	}
 	DrawCursor = HasInputFocus;
 
-	// Load the font, and possibly override the color
+	// Load the font
 	child = node->first_node("font");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr) {
-			mFont = PageManager::FindResource(attr->value());
-			mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
-		}
+		mFont = LoadAttrFont(child, "resource");
+		mFontHeight = mFont->GetHeight();
 	}
 
 	child = node->first_node("text");
@@ -213,8 +196,8 @@
 
 GUIInput::~GUIInput()
 {
-	if (mInputText)	 	delete mInputText;
-	if (mAction)		delete mAction;
+	delete mInputText;
+	delete mAction;
 }
 
 int GUIInput::HandleTextLocation(int x)
diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp
index db968ae..5528be9 100644
--- a/gui/keyboard.cpp
+++ b/gui/keyboard.cpp
@@ -102,7 +102,7 @@
 		strcpy(resource, "resource1");
 		attr = child->first_attribute(resource);
 		while (attr && layoutindex < (MAX_KEYBOARD_LAYOUTS + 1)) {
-			keyboardImg[layoutindex - 1] = PageManager::FindResource(attr->value());
+			keyboardImg[layoutindex - 1] = LoadAttrImage(child, resource);
 
 			layoutindex++;
 			resource[8] = (char)(layoutindex + 48);
@@ -113,8 +113,8 @@
 	// Check the first image to get height and width
 	if (keyboardImg[0] && keyboardImg[0]->GetResource())
 	{
-		KeyboardWidth = gr_get_width(keyboardImg[0]->GetResource());
-		KeyboardHeight = gr_get_height(keyboardImg[0]->GetResource());
+		KeyboardWidth = keyboardImg[0]->GetWidth();
+		KeyboardHeight = keyboardImg[0]->GetHeight();
 	}
 
 	// Load all of the layout maps
diff --git a/gui/listbox.cpp b/gui/listbox.cpp
index 37ba958..7c7afa9 100644
--- a/gui/listbox.cpp
+++ b/gui/listbox.cpp
@@ -34,36 +34,17 @@
 	xml_attribute<>* attr;
 	xml_node<>* child;
 	mIconSelected = mIconUnselected = NULL;
-	int mSelectedIconWidth = 0, mSelectedIconHeight = 0, mUnselectedIconWidth = 0, mUnselectedIconHeight = 0, mIconWidth = 0, mIconHeight = 0;
 	mUpdate = 0;
 
 	// Get the icons, if any
 	child = node->first_node("icon");
 	if (child) {
-		attr = child->first_attribute("selected");
-		if (attr)
-			mIconSelected = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("unselected");
-		if (attr)
-			mIconUnselected = PageManager::FindResource(attr->value());
+		mIconSelected = LoadAttrImage(child, "selected");
+		mIconUnselected = LoadAttrImage(child, "unselected");
 	}
-	if (mIconSelected && mIconSelected->GetResource()) {
-		mSelectedIconWidth = gr_get_width(mIconSelected->GetResource());
-		mSelectedIconHeight = gr_get_height(mIconSelected->GetResource());
-		if (mSelectedIconHeight > mIconHeight)
-			mIconHeight = mSelectedIconHeight;
-		mIconWidth = mSelectedIconWidth;
-	}
-
-	if (mIconUnselected && mIconUnselected->GetResource()) {
-		mUnselectedIconWidth = gr_get_width(mIconUnselected->GetResource());
-		mUnselectedIconHeight = gr_get_height(mIconUnselected->GetResource());
-		if (mUnselectedIconHeight > mIconHeight)
-			mIconHeight = mUnselectedIconHeight;
-		if (mUnselectedIconWidth > mIconWidth)
-			mIconWidth = mUnselectedIconWidth;
-	}
-	SetMaxIconSize(mIconWidth, mIconHeight);
+	int iconWidth = std::max(mIconSelected->GetWidth(), mIconUnselected->GetWidth());
+	int iconHeight = std::max(mIconSelected->GetHeight(), mIconUnselected->GetHeight());
+	SetMaxIconSize(iconWidth, iconHeight);
 
 	// Handle the result variable
 	child = node->first_node("data");
@@ -160,7 +141,7 @@
 	return mList.size();
 }
 
-int GUIListBox::GetListItem(size_t item_index, Resource*& icon, std::string &text)
+int GUIListBox::GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
 {
 	text = mList.at(item_index).displayName;
 	if (mList.at(item_index).selected)
diff --git a/gui/mousecursor.cpp b/gui/mousecursor.cpp
index 1c22356..6255886 100644
--- a/gui/mousecursor.cpp
+++ b/gui/mousecursor.cpp
@@ -58,19 +58,12 @@
 	child = node->first_node("background");
 	if(child)
 	{
-		attr = child->first_attribute("color");
-		if(attr)
-			ConvertStrToColor(attr->value(), &m_color);
-
-		attr = child->first_attribute("resource");
-		if(attr)
+		m_color = LoadAttrColor(child, "color", m_color);
+		m_image = LoadAttrImage(child, "resource");
+		if(m_image)
 		{
-			m_image = PageManager::FindResource(attr->value());
-			if(m_image)
-			{
-				mRenderW = gr_get_width(m_image->GetResource());
-				mRenderH = gr_get_height(m_image->GetResource());
-			}
+			mRenderW = m_image->GetWidth();
+			mRenderH = m_image->GetHeight();
 		}
 	}
 
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 5eae919..537de20 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -211,13 +211,12 @@
 	std::string mLastValue;
 	COLOR mColor;
 	COLOR mHighlightColor;
-	Resource* mFont;
+	FontResource* mFont;
 	int mIsStatic;
 	int mVarChanged;
 	int mFontHeight;
 	unsigned maxWidth;
 	unsigned charSkip;
-	bool hasHighlightColor;
 
 protected:
 	std::string parseText(void);
@@ -242,8 +241,8 @@
 	bool isHighlighted;
 
 protected:
-	Resource* mImage;
-	Resource* mHighlightImage;
+	ImageResource* mImage;
+	ImageResource* mHighlightImage;
 };
 
 // GUIFill - Used for fill colors
@@ -402,8 +401,8 @@
 		request_show
 	};
 
-	Resource* mFont;
-	Resource* mSlideoutImage;
+	FontResource* mFont;
+	ImageResource* mSlideoutImage;
 	COLOR mForegroundColor;
 	COLOR mBackgroundColor;
 	COLOR mScrollColor;
@@ -453,7 +452,7 @@
 
 protected:
 	GUIImage* mButtonImg;
-	Resource* mButtonIcon;
+	ImageResource* mButtonIcon;
 	GUIText* mButtonLabel;
 	GUIAction* mAction;
 	int mTextX, mTextY, mTextW, mTextH;
@@ -491,8 +490,8 @@
 	virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
 
 protected:
-	Resource* mChecked;
-	Resource* mUnchecked;
+	ImageResource* mChecked;
+	ImageResource* mUnchecked;
 	GUIText* mLabel;
 	int mTextX, mTextY;
 	int mCheckX, mCheckY, mCheckW, mCheckH;
@@ -501,12 +500,6 @@
 	std::string mVarName;
 };
 
-struct ScrollListData {
-	Resource* displayResource;
-	std::string displayName;
-	int list_index;
-};
-
 class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
 {
 public:
@@ -541,7 +534,7 @@
 	// get number of items
 	virtual size_t GetItemCount() { return 0; }
 	// get data for one item
-	virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text)
+	virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
 		{ icon = NULL; text = ""; return -1; }
 	// an item was selected
 	virtual void NotifySelect(size_t item_selected) {}
@@ -568,7 +561,7 @@
 protected:
 	// Background
 	COLOR mBackgroundColor;
-	Resource* mBackground; // background image, if any, automatically centered
+	ImageResource* mBackground; // background image, if any, automatically centered
 	int mBackgroundW, mBackgroundH; // background width and height if using an image for the background
 
 	// Header
@@ -578,13 +571,13 @@
 	std::string mLastHeaderValue; // Header text after parsing variables
 	int mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
 	int mHeaderH; // actual header height including font, icon, padding, and separator heights
-	Resource* mHeaderIcon;
+	ImageResource* mHeaderIcon;
 	int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
 	int mHeaderSeparatorH; // Height of the separator between header and list items
 	COLOR mHeaderSeparatorColor; // color of the header separator
 
 	// Per-item layout
-	Resource* mFont;
+	FontResource* mFont;
 	COLOR mFontColor;
 	bool hasHighlightColor; // indicates if a hightlight color was set
 	bool hasFontHighlightColor; // indicates if the font hightlight color is set
@@ -633,7 +626,7 @@
 	virtual void SetPageFocus(int inFocus);
 
 	virtual size_t GetItemCount();
-	virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
+	virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text);
 	virtual void NotifySelect(size_t item_selected);
 
 protected:
@@ -664,8 +657,8 @@
 	int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
 	int mShowNavFolders; // indicates if the list should include the "up a level" item and allow you to traverse folders (nav folders are disabled for the restore list, for instance)
 	static int mSortOrder; // must be static because it is used by the static function fileSort
-	Resource* mFolderIcon;
-	Resource* mFileIcon;
+	ImageResource* mFolderIcon;
+	ImageResource* mFileIcon;
 	bool updateFileList;
 };
 
@@ -687,7 +680,7 @@
 	virtual void SetPageFocus(int inFocus);
 
 	virtual size_t GetItemCount();
-	virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
+	virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text);
 	virtual void NotifySelect(size_t item_selected);
 
 protected:
@@ -701,8 +694,8 @@
 	std::vector<ListData> mList;
 	std::string mVariable;
 	std::string currentValue;
-	Resource* mIconSelected;
-	Resource* mIconUnselected;
+	ImageResource* mIconSelected;
+	ImageResource* mIconUnselected;
 };
 
 class GUIPartitionList : public GUIScrollList
@@ -723,7 +716,7 @@
 	virtual void SetPageFocus(int inFocus);
 
 	virtual size_t GetItemCount();
-	virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
+	virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text);
 	virtual void NotifySelect(size_t item_selected);
 
 protected:
@@ -737,8 +730,8 @@
 	std::string selectedList;
 	std::string currentValue;
 	std::string mLastValue;
-	Resource* mIconSelected;
-	Resource* mIconUnselected;
+	ImageResource* mIconSelected;
+	ImageResource* mIconUnselected;
 	bool updateList;
 };
 
@@ -785,8 +778,8 @@
 	virtual int NotifyVarChange(const std::string& varName, const std::string& value);
 
 protected:
-	Resource* mEmptyBar;
-	Resource* mFullBar;
+	ImageResource* mEmptyBar;
+	ImageResource* mFullBar;
 	std::string mMinValVar;
 	std::string mMaxValVar;
 	std::string mCurValVar;
@@ -820,9 +813,9 @@
 
 protected:
 	GUIAction* sAction;
-	Resource* sSlider;
-	Resource* sSliderUsed;
-	Resource* sTouch;
+	ImageResource* sSlider;
+	ImageResource* sSliderUsed;
+	ImageResource* sTouch;
 	int sTouchW, sTouchH;
 	int sCurTouchX;
 	int sUpdate;
@@ -875,7 +868,7 @@
 		int revert_layout;
 	};
 
-	Resource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
+	ImageResource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
 	struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
 	struct capslock_tracking_struct caps_tracking[MAX_KEYBOARD_LAYOUTS];
 	bool mRendered;
@@ -924,9 +917,9 @@
 protected:
 	GUIText* mInputText;
 	GUIAction* mAction;
-	Resource* mBackground;
-	Resource* mCursor;
-	Resource* mFont;
+	ImageResource* mBackground;
+	ImageResource* mCursor;
+	FontResource* mFont;
 	std::string mText;
 	std::string mLastValue;
 	std::string mVariable;
@@ -1019,7 +1012,7 @@
 	float mValuePct;
 	std::string mMaxStr;
 	std::string mMinStr;
-	Resource *mFont;
+	FontResource *mFont;
 	GUIText* mLabel;
 	int mLabelW;
 	COLOR mTextColor;
@@ -1041,9 +1034,9 @@
 	bool mChangeOnDrag;
 	int mLineW;
 	bool mDragging;
-	Resource *mBackgroundImage;
-	Resource *mHandleImage;
-	Resource *mHandleHoverImage;
+	ImageResource *mBackgroundImage;
+	ImageResource *mHandleImage;
+	ImageResource *mHandleHoverImage;
 };
 
 class MouseCursor : public RenderObject
@@ -1067,11 +1060,20 @@
 	bool m_moved;
 	float m_speedMultiplier;
 	COLOR m_color;
-	Resource *m_image;
+	ImageResource *m_image;
 	bool m_present;
 };
 
 // Helper APIs
+std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
+int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
+int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
+int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
+COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
+FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
+ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
+AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
+
 bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
 
 #endif  // _OBJECTS_HEADER
diff --git a/gui/pages.cpp b/gui/pages.cpp
index 47e2edd..58e99e6 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -70,7 +70,7 @@
 	DataManager::GetValue(str, str);
 
 	// Look for some defaults
-	if (str == "black")			return 0;
+	if (str == "black")		return 0;
 	else if (str == "white")	{ color->red = color->green = color->blue = 255; return 0; }
 	else if (str == "red")		{ color->red = 255; return 0; }
 	else if (str == "green")	{ color->green = 255; return 0; }
@@ -103,52 +103,94 @@
 }
 
 // Helper APIs
+std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue)
+{
+	if (!element)
+		return defaultvalue;
+
+	xml_attribute<>* attr = element->first_attribute(attrname);
+	return attr ? attr->value() : defaultvalue;
+}
+
+int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue)
+{
+	string value = LoadAttrString(element, attrname);
+	// resolve variables
+	DataManager::GetValue(value, value);
+	return value.empty() ? defaultvalue : atoi(value.c_str());
+}
+
+int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue)
+{
+	return scale_theme_x(LoadAttrInt(element, attrname, defaultvalue));
+}
+
+int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue)
+{
+	return scale_theme_y(LoadAttrInt(element, attrname, defaultvalue));
+}
+
+COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue)
+{
+	string value = LoadAttrString(element, attrname);
+	// resolve variables
+	DataManager::GetValue(value, value);
+	COLOR ret = defaultvalue;
+	if (ConvertStrToColor(value, &ret) == 0)
+		return ret;
+	else
+		return defaultvalue;
+}
+
+FontResource* LoadAttrFont(xml_node<>* element, const char* attrname)
+{
+	std::string name = LoadAttrString(element, attrname, "");
+	if (name.empty())
+		return NULL;
+	else
+		return (FontResource*) PageManager::FindResource(name);
+	// TODO: make resource lookup type-safe
+}
+
+ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname)
+{
+	std::string name = LoadAttrString(element, attrname, "");
+	if (name.empty())
+		return NULL;
+	else
+		return (ImageResource*) PageManager::FindResource(name);
+	// TODO: make resource lookup type-safe
+}
+
+AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname)
+{
+	std::string name = LoadAttrString(element, attrname, "");
+	if (name.empty())
+		return NULL;
+	else
+		return (AnimationResource*) PageManager::FindResource(name);
+	// TODO: make resource lookup type-safe
+}
+
 bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h /* = NULL */, RenderObject::Placement* placement /* = NULL */)
 {
 	if (!node)
 		return false;
 
-	std::string value;
 	if (node->first_attribute("x"))
-	{
-		value = node->first_attribute("x")->value();
-		DataManager::GetValue(value, value);
-		*x = atol(value.c_str());
-		*x = scale_theme_x(*x);
-		*x += tw_x_offset;
-	}
+		*x = LoadAttrIntScaleX(node, "x") + tw_x_offset;
 
 	if (node->first_attribute("y"))
-	{
-		value = node->first_attribute("y")->value();
-		DataManager::GetValue(value, value);
-		*y = atol(value.c_str());
-		*y = scale_theme_y(*y);
-		*y += tw_y_offset;
-	}
+		*y = LoadAttrIntScaleY(node, "y") + tw_y_offset;
 
 	if (w && node->first_attribute("w"))
-	{
-		value = node->first_attribute("w")->value();
-		DataManager::GetValue(value, value);
-		*w = atol(value.c_str());
-		*w = scale_theme_x(*w);
-	}
+		*w = LoadAttrIntScaleX(node, "w");
 
 	if (h && node->first_attribute("h"))
-	{
-		value = node->first_attribute("h")->value();
-		DataManager::GetValue(value, value);
-		*h = atol(value.c_str());
-		*h = scale_theme_y(*h);
-	}
+		*h = LoadAttrIntScaleY(node, "h");
 
 	if (placement && node->first_attribute("placement"))
-	{
-		value = node->first_attribute("placement")->value();
-		DataManager::GetValue(value, value);
-		*placement = (RenderObject::Placement) atol(value.c_str());
-	}
+		*placement = (RenderObject::Placement) LoadAttrInt(node, "placement");
 
 	return true;
 }
diff --git a/gui/pages.hpp b/gui/pages.hpp
index b042c0d..31ccadb 100644
--- a/gui/pages.hpp
+++ b/gui/pages.hpp
@@ -17,12 +17,15 @@
 	TOUCH_REPEAT = 4
 };
 
-typedef struct {
+struct COLOR {
 	unsigned char red;
 	unsigned char green;
 	unsigned char blue;
 	unsigned char alpha;
-} COLOR;
+	COLOR() : red(0), green(0), blue(0), alpha(0) {}
+	COLOR(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255)
+		: red(r), green(g), blue(b), alpha(a) {}
+};
 
 // Utility Functions
 int ConvertStrToColor(std::string str, COLOR* color);
diff --git a/gui/partitionlist.cpp b/gui/partitionlist.cpp
index 97f6e4e..8facfe7 100644
--- a/gui/partitionlist.cpp
+++ b/gui/partitionlist.cpp
@@ -35,7 +35,6 @@
 	xml_attribute<>* attr;
 	xml_node<>* child;
 
-	int mIconWidth = 0, mIconHeight = 0, mSelectedIconHeight = 0, mSelectedIconWidth = 0, mUnselectedIconHeight = 0, mUnselectedIconWidth = 0;
 	mIconSelected = mIconUnselected = NULL;
 	mUpdate = 0;
 	updateList = false;
@@ -43,12 +42,8 @@
 	child = node->first_node("icon");
 	if (child)
 	{
-		attr = child->first_attribute("selected");
-		if (attr)
-			mIconSelected = PageManager::FindResource(attr->value());
-		attr = child->first_attribute("unselected");
-		if (attr)
-			mIconUnselected = PageManager::FindResource(attr->value());
+		mIconSelected = LoadAttrImage(child, "selected");
+		mIconUnselected = LoadAttrImage(child, "unselected");
 	}
 
 	// Handle the result variable
@@ -63,25 +58,9 @@
 			selectedList = attr->value();
 	}
 
-	if (mIconSelected && mIconSelected->GetResource())
-	{
-		mSelectedIconWidth = gr_get_width(mIconSelected->GetResource());
-		mSelectedIconHeight = gr_get_height(mIconSelected->GetResource());
-		if (mSelectedIconHeight > mIconHeight)
-			mIconHeight = mSelectedIconHeight;
-		mIconWidth = mSelectedIconWidth;
-	}
-
-	if (mIconUnselected && mIconUnselected->GetResource())
-	{
-		mUnselectedIconWidth = gr_get_width(mIconUnselected->GetResource());
-		mUnselectedIconHeight = gr_get_height(mIconUnselected->GetResource());
-		if (mUnselectedIconHeight > mIconHeight)
-			mIconHeight = mUnselectedIconHeight;
-		if (mUnselectedIconWidth > mIconWidth)
-			mIconWidth = mUnselectedIconWidth;
-	}
-	SetMaxIconSize(mIconWidth, mIconHeight);
+	int iconWidth = std::max(mIconSelected->GetWidth(), mIconUnselected->GetWidth());
+	int iconHeight = std::max(mIconSelected->GetHeight(), mIconUnselected->GetHeight());
+	SetMaxIconSize(iconWidth, iconHeight);
 
 	child = node->first_node("listtype");
 	if (child && (attr = child->first_attribute("name"))) {
@@ -218,7 +197,7 @@
 	return mList.size();
 }
 
-int GUIPartitionList::GetListItem(size_t item_index, Resource*& icon, std::string &text)
+int GUIPartitionList::GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
 {
 	text = mList.at(item_index).Display_Name;
 	if (mList.at(item_index).selected)
diff --git a/gui/progressbar.cpp b/gui/progressbar.cpp
index a4d1329..a49e0ab 100644
--- a/gui/progressbar.cpp
+++ b/gui/progressbar.cpp
@@ -45,13 +45,8 @@
 	child = node->first_node("resource");
 	if (child)
 	{
-		attr = child->first_attribute("empty");
-		if (attr)
-			mEmptyBar = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("full");
-		if (attr)
-			mFullBar = PageManager::FindResource(attr->value());
+		mEmptyBar = LoadAttrImage(child, "empty");
+		mFullBar = LoadAttrImage(child, "full");
 	}
 
 	// Load the placement
@@ -61,23 +56,13 @@
 	child = node->first_node("data");
 	if (child)
 	{
-		attr = child->first_attribute("min");
-		if (attr)   mMinValVar = attr->value();
-
-		attr = child->first_attribute("max");
-		if (attr)   mMaxValVar = attr->value();
-
-		attr = child->first_attribute("name");
-		if (attr)   mCurValVar = attr->value();
+		mMinValVar = LoadAttrString(child, "min");
+		mMaxValVar = LoadAttrString(child, "max");
+		mCurValVar = LoadAttrString(child, "name");
 	}
 
-	if (mEmptyBar && mEmptyBar->GetResource())
-	{
-		mRenderW = gr_get_width(mEmptyBar->GetResource());
-		mRenderH = gr_get_height(mEmptyBar->GetResource());
-	}
-
-	return;
+	mRenderW = mEmptyBar->GetWidth();
+	mRenderH = mEmptyBar->GetHeight();
 }
 
 int GUIProgressBar::Render(void)
diff --git a/gui/resources.cpp b/gui/resources.cpp
index d9f2741..e0016fc 100644
--- a/gui/resources.cpp
+++ b/gui/resources.cpp
@@ -314,7 +314,8 @@
 		{
 			LOGERR("Resource type (%s) not supported.\n", type.c_str());
 		}
-		if (res == NULL || res->GetResource() == NULL)
+
+		if (res == NULL || !res->loadedOK())
 		{
 			std::string res_name;
 			if (child->first_attribute("name"))
diff --git a/gui/resources.hpp b/gui/resources.hpp
index cc5e7b6..69d2427 100644
--- a/gui/resources.hpp
+++ b/gui/resources.hpp
@@ -17,8 +17,8 @@
 	virtual ~Resource() {}
 
 public:
-	virtual void* GetResource(void) = 0;
-	std::string GetName(void) { return mName; }
+	std::string GetName() { return mName; }
+	virtual bool loadedOK() = 0;
 
 private:
 	std::string mName;
@@ -44,7 +44,10 @@
 	virtual ~FontResource();
 
 public:
-	virtual void* GetResource(void) { return mFont; }
+	void* GetResource() { return this ? mFont : NULL; }
+	int GetHeight() { return gr_getMaxFontHeight(this ? mFont : NULL); }
+
+	virtual bool loadedOK() { return mFont != NULL; }
 
 protected:
 	void* mFont;
@@ -58,7 +61,11 @@
 	virtual ~ImageResource();
 
 public:
-	virtual void* GetResource(void) { return mSurface; }
+	gr_surface GetResource() { return this ? mSurface : NULL; }
+	int GetWidth() { return gr_get_width(this ? mSurface : NULL); }
+	int GetHeight() { return gr_get_height(this ? mSurface : NULL); }
+
+	virtual bool loadedOK() { return mSurface != NULL; }
 
 protected:
 	gr_surface mSurface;
@@ -71,9 +78,12 @@
 	virtual ~AnimationResource();
 
 public:
-	virtual void* GetResource(void) { return mSurfaces.empty() ? NULL : mSurfaces.at(0); }
-	virtual void* GetResource(int entry) { return mSurfaces.empty() ? NULL : mSurfaces.at(entry); }
-	virtual int GetResourceCount(void) { return mSurfaces.size(); }
+	gr_surface GetResource() { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(0); }
+	gr_surface GetResource(int entry) { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(entry); }
+	int GetWidth() { return gr_get_width(this ? GetResource() : NULL); }
+	int GetHeight() { return gr_get_height(this ? GetResource() : NULL); }
+	int GetResourceCount() { return mSurfaces.size(); }
+	virtual bool loadedOK() { return !mSurfaces.empty(); }
 
 protected:
 	std::vector<gr_surface> mSurfaces;
diff --git a/gui/scrolllist.cpp b/gui/scrolllist.cpp
index eb66de8..822fa76 100644
--- a/gui/scrolllist.cpp
+++ b/gui/scrolllist.cpp
@@ -41,7 +41,8 @@
 	firstDisplayedItem = mItemSpacing = mFontHeight = mSeparatorH = y_offset = scrollingSpeed = 0;
 	maxIconWidth = maxIconHeight =  mHeaderIconHeight = mHeaderIconWidth = 0;
 	mHeaderSeparatorH = mHeaderIsStatic = mHeaderH = actualItemHeight = 0;
-	mBackground = mFont = mHeaderIcon = NULL;
+	mBackground = mHeaderIcon = NULL;
+	mFont = NULL;
 	mBackgroundW = mBackgroundH = 0;
 	mFastScrollW = mFastScrollLineW = mFastScrollRectW = mFastScrollRectH = 0;
 	lastY = last2Y = fastScroll = 0;
@@ -63,9 +64,7 @@
 	child = node->first_node("header");
 	if (child)
 	{
-		attr = child->first_attribute("icon");
-		if (attr)
-			mHeaderIcon = PageManager::FindResource(attr->value());
+		mHeaderIcon = LoadAttrImage(child, "icon");
 
 		attr = child->first_attribute("background");
 		if (attr)
@@ -119,9 +118,7 @@
 	child = node->first_node("background");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mBackground = PageManager::FindResource(attr->value());
+		mBackground = LoadAttrImage(child, "resource");
 		attr = child->first_attribute("color");
 		if (attr)
 		{
@@ -140,9 +137,7 @@
 	child = node->first_node("font");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mFont = PageManager::FindResource(attr->value());
+		mFont = LoadAttrFont(child, "resource");
 
 		attr = child->first_attribute("color");
 		if (attr)
@@ -229,13 +224,13 @@
 	}
 
 	// Retrieve the line height
-	mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
+	mFontHeight = mFont->GetHeight();
 	mHeaderH = mFontHeight;
 
 	if (mHeaderIcon && mHeaderIcon->GetResource())
 	{
-		mHeaderIconWidth = gr_get_width(mHeaderIcon->GetResource());
-		mHeaderIconHeight = gr_get_height(mHeaderIcon->GetResource());
+		mHeaderIconWidth = mHeaderIcon->GetWidth();
+		mHeaderIconHeight = mHeaderIcon->GetHeight();
 		if (mHeaderIconHeight > mHeaderH)
 			mHeaderH = mHeaderIconHeight;
 		if (mHeaderIconWidth > maxIconWidth)
@@ -252,8 +247,8 @@
 
 	if (mBackground && mBackground->GetResource())
 	{
-		mBackgroundW = gr_get_width(mBackground->GetResource());
-		mBackgroundH = gr_get_height(mBackground->GetResource());
+		mBackgroundW = mBackground->GetWidth();
+		mBackgroundH = mBackground->GetHeight();
 	}
 }
 
@@ -349,7 +344,7 @@
 			break;
 
 		// get item data
-		Resource* icon;
+		ImageResource* icon;
 		std::string label;
 		if (GetListItem(itemindex, icon, label))
 			break;
@@ -373,8 +368,8 @@
 		}
 
 		if (icon && icon->GetResource()) {
-			int currentIconHeight = gr_get_height(icon->GetResource());
-			int currentIconWidth = gr_get_width(icon->GetResource());
+			int currentIconHeight = icon->GetHeight();
+			int currentIconWidth = icon->GetWidth();
 			int currentIconOffsetY = (int)((actualItemHeight - currentIconHeight) / 2);
 			int currentIconOffsetX = (maxIconWidth - currentIconWidth) / 2;
 			int rect_y = 0, image_y = (yPos + currentIconOffsetY);
@@ -405,11 +400,10 @@
 	// Now, we need the header (icon + text)
 	yPos = mRenderY;
 	{
-		Resource* headerIcon;
 		int mIconOffsetX = 0;
 
 		// render the icon if it exists
-		headerIcon = mHeaderIcon;
+		ImageResource* headerIcon = mHeaderIcon;
 		if (headerIcon && headerIcon->GetResource())
 		{
 			gr_blit(headerIcon->GetResource(), 0, 0, mHeaderIconWidth, mHeaderIconHeight, mRenderX + ((mHeaderIconWidth - maxIconWidth) / 2), (yPos + (int)((mHeaderH - mHeaderIconHeight) / 2)));
diff --git a/gui/slider.cpp b/gui/slider.cpp
index 98d2dde..c53dabc 100644
--- a/gui/slider.cpp
+++ b/gui/slider.cpp
@@ -47,31 +47,20 @@
 	child = node->first_node("resource");
 	if (child)
 	{
-		attr = child->first_attribute("base");
-		if (attr)
-			sSlider = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("used");
-		if (attr)
-			sSliderUsed = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("touch");
-		if (attr)
-			sTouch = PageManager::FindResource(attr->value());
+		sSlider = LoadAttrImage(child, "base");
+		sSliderUsed = LoadAttrImage(child, "used");
+		sTouch = LoadAttrImage(child, "touch");
 	}
 
 	// Load the placement
 	LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY);
 
-	if (sSlider && sSlider->GetResource())
-	{
-		mRenderW = gr_get_width(sSlider->GetResource());
-		mRenderH = gr_get_height(sSlider->GetResource());
-	}
+	mRenderW = sSlider->GetWidth();
+	mRenderH = sSlider->GetHeight();
 	if (sTouch && sTouch->GetResource())
 	{
-		sTouchW = gr_get_width(sTouch->GetResource());  // Width of the "touch image" that follows the touch (arrow)
-		sTouchH = gr_get_height(sTouch->GetResource()); // Height of the "touch image" that follows the touch (arrow)
+		sTouchW = sTouch->GetWidth();  // Width of the "touch image" that follows the touch (arrow)
+		sTouchH = sTouch->GetHeight(); // Height of the "touch image" that follows the touch (arrow)
 	}
 
 	//LOGINFO("mRenderW: %i mTouchW: %i\n", mRenderW, mTouchW);
diff --git a/gui/slidervalue.cpp b/gui/slidervalue.cpp
index 7c38e32..5be58dc 100644
--- a/gui/slidervalue.cpp
+++ b/gui/slidervalue.cpp
@@ -73,16 +73,8 @@
 	child = node->first_node("font");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mFont = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("color");
-		if (attr)
-		{
-			std::string color = attr->value();
-			ConvertStrToColor(color, &mTextColor);
-		}
+		mFont = LoadAttrFont(child, "resource");
+		mTextColor = LoadAttrColor(child, "color", mTextColor);
 	}
 
 	// Load the placement
@@ -103,17 +95,9 @@
 	child = node->first_node("resource");
 	if (child)
 	{
-		attr = child->first_attribute("background");
-		if(attr)
-			mBackgroundImage = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("handle");
-		if(attr)
-			mHandleImage = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("handlehover");
-		if(attr)
-			mHandleHoverImage = PageManager::FindResource(attr->value());
+		mBackgroundImage = LoadAttrImage(child, "background");
+		mHandleImage = LoadAttrImage(child, "handle");
+		mHandleHoverImage = LoadAttrImage(child, "handlehover");
 	}
 
 	child = node->first_node("data");
@@ -199,7 +183,7 @@
 		}
 	}
 
-	mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
+	mFontHeight = mFont->GetHeight();
 
 	if(mShowCurr)
 	{
@@ -277,8 +261,8 @@
 
 	if(mBackgroundImage && mBackgroundImage->GetResource())
 	{
-		mLineW = gr_get_width(mBackgroundImage->GetResource());
-		mLineH = gr_get_height(mBackgroundImage->GetResource());
+		mLineW = mBackgroundImage->GetWidth();
+		mLineH = mBackgroundImage->GetHeight();
 	}
 	else
 		mLineW = mRenderW - (mLinePadding * 2);
diff --git a/gui/text.cpp b/gui/text.cpp
index 29d7ad9..cc18b17 100644
--- a/gui/text.cpp
+++ b/gui/text.cpp
@@ -28,9 +28,6 @@
 GUIText::GUIText(xml_node<>* node)
 	: GUIObject(node)
 {
-	xml_attribute<>* attr;
-	xml_node<>* child;
-
 	mFont = NULL;
 	mIsStatic = 1;
 	mVarChanged = 0;
@@ -38,53 +35,21 @@
 	maxWidth = 0;
 	charSkip = 0;
 	isHighlighted = false;
-	hasHighlightColor = false;
 
 	if (!node)
 		return;
 
-	// Initialize color to solid black
-	memset(&mColor, 0, sizeof(COLOR));
-	mColor.alpha = 255;
-	memset(&mHighlightColor, 0, sizeof(COLOR));
-	mHighlightColor.alpha = 255;
-
-	attr = node->first_attribute("color");
-	if (attr)
-	{
-		std::string color = attr->value();
-		ConvertStrToColor(color, &mColor);
-	}
-	attr = node->first_attribute("highlightcolor");
-	if (attr)
-	{
-		std::string color = attr->value();
-		ConvertStrToColor(color, &mHighlightColor);
-		hasHighlightColor = true;
-	}
+	// Load colors
+	mColor = LoadAttrColor(node, "color", COLOR(0,0,0,255));
+	mHighlightColor = LoadAttrColor(node, "highlightcolor", mColor);
 
 	// Load the font, and possibly override the color
-	child = node->first_node("font");
+	xml_node<>* child = node->first_node("font");
 	if (child)
 	{
-		attr = child->first_attribute("resource");
-		if (attr)
-			mFont = PageManager::FindResource(attr->value());
-
-		attr = child->first_attribute("color");
-		if (attr)
-		{
-			std::string color = attr->value();
-			ConvertStrToColor(color, &mColor);
-		}
-
-		attr = child->first_attribute("highlightcolor");
-		if (attr)
-		{
-			std::string color = attr->value();
-			ConvertStrToColor(color, &mHighlightColor);
-			hasHighlightColor = true;
-		}
+		mFont = LoadAttrFont(child, "resource");
+		mColor = LoadAttrColor(child, "color", mColor);
+		mHighlightColor = LoadAttrColor(child, "highlightcolor", mColor);
 	}
 
 	// Load the placement
@@ -97,8 +62,7 @@
 	mLastValue = parseText();
 	if (mLastValue != mText)   mIsStatic = 0;
 
-	mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
-	return;
+	mFontHeight = mFont->GetHeight();
 }
 
 int GUIText::Render(void)
@@ -107,13 +71,11 @@
 		return 0;
 
 	void* fontResource = NULL;
-	string displayValue;
-
 	if (mFont)
 		fontResource = mFont->GetResource();
 
 	mLastValue = parseText();
-	displayValue = mLastValue;
+	string displayValue = mLastValue;
 
 	if (charSkip)
 		displayValue.erase(0, charSkip);
@@ -138,7 +100,7 @@
 			y -= mFontHeight;
 	}
 
-	if (hasHighlightColor && isHighlighted)
+	if (isHighlighted)
 		gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
 	else
 		gr_color(mColor.red, mColor.green, mColor.blue, mColor.alpha);