Allow for X and Y offsets in GUI

These can be used to center a lower resolution theme onto a
higher resolution screen. May be useful for Nexus 9 unless or
until we decide to do a 1536x2048 theme or on devices like the
Moto 360 and LG G Watch R.

The build flags will only affect the stock theme. If a custom
theme wishes to apply an offset, it can be done by setting
tw_x_offset and / or tw_y_offset in the variables section of the
XML.

Change-Id: I2390769ed861b96a4a3bb8a0f06d9021ec91b6b9
diff --git a/gui/Android.mk b/gui/Android.mk
index b8a8de8..e75c521 100644
--- a/gui/Android.mk
+++ b/gui/Android.mk
@@ -56,6 +56,12 @@
 ifeq ($(TW_DISABLE_TTF), true)
     LOCAL_CFLAGS += -DTW_DISABLE_TTF
 endif
+ifneq ($(TW_X_OFFSET),)
+  LOCAL_CFLAGS += -DTW_X_OFFSET=$(TW_X_OFFSET)
+endif
+ifneq ($(TW_Y_OFFSET),)
+  LOCAL_CFLAGS += -DTW_Y_OFFSET=$(TW_Y_OFFSET)
+endif
 
 ifeq ($(DEVICE_RESOLUTION),)
   $(warning ********************************************************************************)
diff --git a/gui/devices/portrait/res/portrait.xml b/gui/devices/portrait/res/portrait.xml
index b732974..bb8e372 100644
--- a/gui/devices/portrait/res/portrait.xml
+++ b/gui/devices/portrait/res/portrait.xml
@@ -1041,7 +1041,7 @@
 			<object type="button">
 				<highlight color="%highlight_color%" />
 				<fill color="%button_fill_color%" />
-				<placement x="%col1_x%" y="%wipe_button_row1%" w="%button_fill_full_width%" h="%button_fill_half_height%" placement="5" />
+				<placement x="%col1_x%" y="%wipe_button_row1%" w="%button_fill_full_width%" h="%button_fill_half_height%" />
 				<font resource="font" color="%button_text_color%" />
 				<text>Repair or Change File System</text>
 				<actions>
@@ -1494,7 +1494,7 @@
 			<object type="button">
 				<highlight color="%highlight_color%" />
 				<fill color="%button_fill_color%" />
-				<placement x="%col1_x%" y="%row1_header_y%" w="%button_fill_full_width%" h="%button_fill_quarter_height%" placement="5" />
+				<placement x="%col1_x%" y="%row1_header_y%" w="%button_fill_full_width%" h="%button_fill_quarter_height%" />
 				<font resource="font" color="%button_text_color%" />
 				<text>Backup Name: %tw_backup_name%</text>
 				<actions>
diff --git a/gui/devices/watch/res/watch.xml b/gui/devices/watch/res/watch.xml
index 03effde..dc787b3 100644
--- a/gui/devices/watch/res/watch.xml
+++ b/gui/devices/watch/res/watch.xml
@@ -994,7 +994,7 @@
 			<object type="button">
 				<highlight color="%highlight_color%" />
 				<fill color="%button_fill_color%" />
-				<placement x="%col1_x%" y="%wipe_button_row1%" w="%button_fill_full_width%" h="%button_fill_half_height%" placement="5" />
+				<placement x="%col1_x%" y="%wipe_button_row1%" w="%button_fill_full_width%" h="%button_fill_half_height%" />
 				<font resource="font" color="%button_text_color%" />
 				<text>Repair or Change File System</text>
 				<actions>
@@ -1439,7 +1439,7 @@
 			<object type="button">
 				<highlight color="%highlight_color%" />
 				<fill color="%button_fill_color%" />
-				<placement x="%col1_x%" y="%row1_header_y%" w="%button_fill_full_width%" h="%button_fill_quarter_height%" placement="5" />
+				<placement x="%col1_x%" y="%row1_header_y%" w="%button_fill_full_width%" h="%button_fill_quarter_height%" />
 				<font resource="font" color="%button_text_color%" />
 				<text>Backup Name: %tw_backup_name%</text>
 				<actions>
diff --git a/gui/gui.cpp b/gui/gui.cpp
index d07c49f..db6e23f 100644
--- a/gui/gui.cpp
+++ b/gui/gui.cpp
@@ -106,7 +106,7 @@
 {
 	gr_color(0, 0, 0, 255);
 	gr_fill(0, 0, gr_fb_width(), gr_fb_height());
-	gr_blit(gCurtain, 0, 0, gr_get_width(gCurtain), gr_get_height(gCurtain), 0, 0);
+	gr_blit(gCurtain, 0, 0, gr_get_width(gCurtain), gr_get_height(gCurtain), TW_X_OFFSET, TW_Y_OFFSET);
 	gr_flip();
 }
 
diff --git a/gui/objects.hpp b/gui/objects.hpp
index a89f486..99b5855 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -35,6 +35,13 @@
 #include "pages.hpp"
 #include "../partitions.hpp"
 
+#ifndef TW_X_OFFSET
+#define TW_X_OFFSET 0
+#endif
+#ifndef TW_Y_OFFSET
+#define TW_Y_OFFSET 0
+#endif
+
 class RenderObject
 {
 public:
diff --git a/gui/pages.cpp b/gui/pages.cpp
index bea39e9..a1a6346 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -60,6 +60,9 @@
 MouseCursor *PageManager::mMouseCursor = NULL;
 HardwareKeyboard *PageManager::mHardwareKeyboard = NULL;
 
+int tw_x_offset = 0;
+int tw_y_offset = 0;
+
 // Helper routine to convert a string to a color declaration
 int ConvertStrToColor(std::string str, COLOR* color)
 {
@@ -115,6 +118,7 @@
 		value = node->first_attribute("x")->value();
 		DataManager::GetValue(value, value);
 		*x = atol(value.c_str());
+		*x += tw_x_offset;
 	}
 
 	if (node->first_attribute("y"))
@@ -122,6 +126,7 @@
 		value = node->first_attribute("y")->value();
 		DataManager::GetValue(value, value);
 		*y = atol(value.c_str());
+		*y += tw_y_offset;
 	}
 
 	if (w && node->first_attribute("w"))
@@ -785,6 +790,16 @@
 		persist = child->first_attribute("persist");
 		if(name && value)
 		{
+			if (strcmp(name->value(), "tw_x_offset") == 0) {
+				tw_x_offset = atoi(value->value());
+				child = child->next_sibling("variable");
+				continue;
+			}
+			if (strcmp(name->value(), "tw_y_offset") == 0) {
+				tw_y_offset = atoi(value->value());
+				child = child->next_sibling("variable");
+				continue;
+			}
 			p = persist ? atoi(persist->value()) : 0;
 			string temp = value->value();
 			string valstr = gui_parse_text(temp);
@@ -928,6 +943,8 @@
 	if (package.size() > 4 && package.substr(package.size() - 4) != ".zip")
 	{
 		LOGINFO("Load XML directly\n");
+		tw_x_offset = TW_X_OFFSET;
+		tw_y_offset = TW_Y_OFFSET;
 		// We can try to load the XML directly...
 		struct stat st;
 		if(stat(package.c_str(),&st) != 0)
@@ -948,6 +965,8 @@
 	else
 	{
 		LOGINFO("Loading zip theme\n");
+		tw_x_offset = 0;
+		tw_y_offset = 0;
 		if (!TWFunc::Path_Exists(package))
 			return -1;
 		if (sysMapFile(package.c_str(), &map) != 0) {