diff --git a/gui/image.cpp b/gui/image.cpp
index c684d1b..45d8636 100644
--- a/gui/image.cpp
+++ b/gui/image.cpp
@@ -27,71 +27,76 @@
 
 GUIImage::GUIImage(xml_node<>* node)
 {
-    xml_attribute<>* attr;
-    xml_node<>* child;
+	xml_attribute<>* attr;
+	xml_node<>* child;
 
-    mImage = NULL;
+	mImage = NULL;
 	mHighlightImage = NULL;
 	isHighlighted = false;
 
-    if (!node)
-        return;
+	if (!node)
+		return;
 
-    child = node->first_node("image");
-    if (child)
-    {
-        attr = child->first_attribute("resource");
-        if (attr)
-            mImage = PageManager::FindResource(attr->value());
+	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());
-    }
+		if (attr)
+			mHighlightImage = PageManager::FindResource(attr->value());
+	}
 
-    // Load the placement
-    LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
+	// Load the placement
+	LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
 
-    if (mImage && mImage->GetResource())
-    {
-        mRenderW = gr_get_width(mImage->GetResource());
-        mRenderH = gr_get_height(mImage->GetResource());
+	if (mImage && mImage->GetResource())
+	{
+		mRenderW = gr_get_width(mImage->GetResource());
+		mRenderH = gr_get_height(mImage->GetResource());
 
-        // Adjust for placement
-        if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
-        {
-            if (mPlacement == CENTER)
-                mRenderX -= (mRenderW / 2);
-            else
-                mRenderX -= mRenderW;
-        }
-        if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
-        {
-            if (mPlacement == CENTER)
-                mRenderY -= (mRenderH / 2);
-            else
-                mRenderY -= mRenderH;
-        }
-        SetPlacement(TOP_LEFT);
-    }
+		// Adjust for placement
+		if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
+		{
+			if (mPlacement == CENTER)
+				mRenderX -= (mRenderW / 2);
+			else
+				mRenderX -= mRenderW;
+		}
+		if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
+		{
+			if (mPlacement == CENTER)
+				mRenderY -= (mRenderH / 2);
+			else
+				mRenderY -= mRenderH;
+		}
+		SetPlacement(TOP_LEFT);
+	}
 
-    return;
+	return;
 }
 
 int GUIImage::Render(void)
 {
-    if (isHighlighted && mHighlightImage && mHighlightImage->GetResource()) {
+	if (isHighlighted && mHighlightImage && mHighlightImage->GetResource()) {
 		gr_blit(mHighlightImage->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
 		return 0;
-	} else if (!mImage || !mImage->GetResource())      return -1;
-    gr_blit(mImage->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
-    return 0;
+	}
+	else if (!mImage || !mImage->GetResource())
+		return -1;
+
+	gr_blit(mImage->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+	return 0;
 }
 
 int GUIImage::SetRenderPos(int x, int y, int w, int h)
 {
-    if (w || h)     return -1;
-    mRenderX = x;
-    mRenderY = y;
-    return 0;
+	if (w || h)
+		return -1;
+
+	mRenderX = x;
+	mRenderY = y;
+	return 0;
 }
 
