summaryrefslogtreecommitdiffstats
path: root/gui/pages.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/pages.cpp')
-rw-r--r--gui/pages.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/gui/pages.cpp b/gui/pages.cpp
index 8fef7b4c8..47e2edde8 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -41,6 +41,7 @@ extern "C" {
#include "../minuitwrp/minui.h"
#include "../minzip/SysUtil.h"
#include "../minzip/Zip.h"
+#include "gui.h"
}
#include "rapidxml.hpp"
@@ -113,6 +114,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("x")->value();
DataManager::GetValue(value, value);
*x = atol(value.c_str());
+ *x = scale_theme_x(*x);
*x += tw_x_offset;
}
@@ -121,6 +123,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("y")->value();
DataManager::GetValue(value, value);
*y = atol(value.c_str());
+ *y = scale_theme_y(*y);
*y += tw_y_offset;
}
@@ -129,6 +132,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("w")->value();
DataManager::GetValue(value, value);
*w = atol(value.c_str());
+ *w = scale_theme_x(*w);
}
if (h && node->first_attribute("h"))
@@ -136,6 +140,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("h")->value();
DataManager::GetValue(value, value);
*h = atol(value.c_str());
+ *h = scale_theme_y(*h);
}
if (placement && node->first_attribute("placement"))
@@ -581,7 +586,58 @@ int PageSet::Load(ZipArchive* package)
if (!parent)
parent = mDoc.first_node("install");
+ set_scale_values(1, 1); // Reset any previous scaling values
+
// Now, let's parse the XML
+ LOGINFO("Checking resolution...\n");
+ child = parent->first_node("details");
+ if (child) {
+ xml_node<>* resolution = child->first_node("resolution");
+ if (resolution) {
+ xml_attribute<>* width_attr = resolution->first_attribute("width");
+ xml_attribute<>* height_attr = resolution->first_attribute("height");
+ xml_attribute<>* noscale_attr = resolution->first_attribute("noscaling");
+ if (width_attr && height_attr && !noscale_attr) {
+ int width = atoi(width_attr->value());
+ int height = atoi(height_attr->value());
+ int offx = 0, offy = 0;
+#ifdef TW_ROUND_SCREEN
+ xml_node<>* roundscreen = child->first_node("roundscreen");
+ if (roundscreen) {
+ LOGINFO("TW_ROUND_SCREEN := true, using round screen XML settings.\n");
+ xml_attribute<>* offx_attr = roundscreen->first_attribute("offset_x");
+ xml_attribute<>* offy_attr = roundscreen->first_attribute("offset_y");
+ if (offx_attr) {
+ offx = atoi(offx_attr->value());
+ }
+ if (offy_attr) {
+ offy = atoi(offy_attr->value());
+ }
+ }
+#endif
+ if (width != 0 && height != 0) {
+ float scale_w = ((float)gr_fb_width() - ((float)offx * 2.0)) / (float)width;
+ float scale_h = ((float)gr_fb_height() - ((float)offy * 2.0)) / (float)height;
+#ifdef TW_ROUND_SCREEN
+ float scale_off_w = (float)gr_fb_width() / (float)width;
+ float scale_off_h = (float)gr_fb_height() / (float)height;
+ tw_x_offset = offx * scale_off_w;
+ tw_y_offset = offy * scale_off_h;
+#endif
+ if (scale_w != 1 || scale_h != 1) {
+ LOGINFO("Scaling theme width %fx and height %fx, offsets x: %i y: %i\n", scale_w, scale_h, tw_x_offset, tw_y_offset);
+ set_scale_values(scale_w, scale_h);
+ }
+ }
+ } else {
+ LOGINFO("XML does not contain width and height, no scaling will be applied\n");
+ }
+ } else {
+ LOGINFO("XML contains no resolution tag, no scaling will be applied.\n");
+ }
+ } else {
+ LOGINFO("XML contains no details tag, no scaling will be applied.\n");
+ }
LOGINFO("Loading resources...\n");
child = parent->first_node("resources");
if (child)